From dc53c9cbe68977e0892dcbfb023256d4055d1dd7 Mon Sep 17 00:00:00 2001 From: Pavan Madehalli Ranganath Date: Tue, 15 Dec 2020 08:42:03 -0800 Subject: [PATCH] Sync release branch with release-candidate for 202012.00 release (#2887) * Change metrics malloc to metrics specific macro (#2435) * Change pvPortMalloc to metrics specific macro * Use uncrustify 0.71.0_f instead of 0.66.1_f * Add dependency on BLE for MQTT demo wrapper (#2627) * Add CODEOWNERS (#2632) * Update CODEOWNERS * Fixed the BLE_Unit_MQTT_Serialize MTB Build Failure. (#2630) * Fixed the BLE_Unit_MQTT_Serialize MTB Build Failure. * Remove the file path to a proper place in the afr.mk file. * Move ble_mqtt_serialize under BLE supported section. * Fix demos on Marvell (#2633) Problem: Many demos were failing in Marvell board due to lack of memory in heap while establishing a TLS connection. Root Cause: Establishing a TLS connection requires a good amount of memory in the HEAP. The tasks created with xTaskCreate() function also allocates the memory for the stack in the heap. Marvell's heap(~73KB) was running out of space due to these allocations. Fix: Optimized the stack sizes for different tasks for the demo and verified the demos. * Update timeout for BLE demo and integration test. (#2634) * increase timeout for shadow ble demo and BLE integration tests * short circuit eWiFiFailure for pxIPConfig == NULL * add back - memset to zero * Prefix topic name with thing name for demo (#2646) (#2652) * Modify topic to include thing name * Update BLE demo and test configs (#2655) * Update demo config for BLE demos * Increase timeout to 5 seconds * Update ESP-IDF submodule to fix type conflict in i2c.h and spi.h (#2660) * Initialize the local variable to fix the BLE_Unit_MQTT_Serialize hang-up issue during run time. * Reduce Psoc64 board delay before the starting of the test code. * Test: Fix unit test not building (#2665) * Test: Fix unit test not building * Fix: indent * Test: remove dependency on coreMQTT for UT * Test: remve coreMQTT path from UT * Test: remove coreMQTT path from UT * Test: fix bool for usage * Test: Add back new line * Test: fix build failure * Add submodules and CMake configuration of HTTP, Defender and Jobs libraries (#2670) * Connection sharing demo changes from FreeRTOS (#2620) * Set process loop timeout to 0 so that other commands do not have to wait for a process loop that isn't doing anything. * Add an additional publisher task to show multiple tasks publishing simultaneously. * Clarify what is meant by "synchronous" and "asynchronous" publishes. * Fix possible race condition in task notification waits. * Move task notification wait loop to its own function. * The prvMQTTConnect function was doing more than just connecting, so it was split into more functions. * Minor name changes for clarity. * Add macros for AWS IoT metrics * Bump cryptography from 3.0 to 3.2 in /tools/ota_e2e_tests (#2644) Bumps [cryptography](https://github.com/pyca/cryptography) from 3.0 to 3.2. - [Release notes](https://github.com/pyca/cryptography/releases) - [Changelog](https://github.com/pyca/cryptography/blob/master/CHANGELOG.rst) - [Commits](https://github.com/pyca/cryptography/compare/3.0...3.2) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Test: Fix Unit tests * Test: Fix warnings * Test: Fix unit test * Test: Fix UT buffer overflow * Move Kernel submodule pointer. (#2689) * Fix MISRA error for transport secure socket (#2640) Fix the following MISRA errors in transport secure socket: - misra c 5.2 - misra c 10.4 - misra c 14.3 - misra c 15.7 * Update TCP submodule (#2692) * Update submodule pointer. (#2699) * Fix the Psoc64 MTB project BLE demo build failure. * afr.cmake: Add BUILD_CLONE_SUBMODULES option (#2639) This option is similar to the option under the same name already used in some submodules of the repository. If set to OFF, it skips automatic submodule update during building. This is useful for focused builds of particular targets, which use only a subset of submodules (which then need to be updated externally). In particular in continuous integration contexts, this can save build time/bandwidth. Signed-off-by: Paul Sokolovsky * AFR NimBLE: Add included services in `pxAddServiceBlob()` (#2662) * NimBLE AFR: Save full AFR service instead of only service pointers (#2653) * Update IDE project files for coreHTTP, Device Defender and Jobs libraries (#2702) * Change logging and fix in ble transport interface (#2718) * Change logging and fix in send() * Update unit tests * Create a macro for semaphore delay. (#2712) * Create a macro for semaphore delay. * Fix HTTP proofs failing due to change of http_parser location (#2724) * Fix memory leak in tearDown of integration tests (#2725) * Fix memory leak in shadow and integration tests * Check return status of SecureSocketsTransport_Disconnect * Improve metadata mechanism for submoduled libraries cmake files (#2732) ### Issue The existing CMake configurations of the submoduled libraries add their `*.cmake`/`CMakeLists.txt` files to the generated metadata by explicitly including them in the source list of demo/library modules definition. This causes when using the internal tool to auto-update the IDE project files for file additions/deletions in the codebase because the tool adds the CMake files (by utilizing the "sources" list from CMake configuration) to project files. Some IDE builds face build failures with presence of cmake files in the project files. ### Solution Introduce a new CMake function, `afr_module_cmake_files` to add module-specific CMake files to metadata. This function creates an internal CMake CACHE list variable per module of the form, `AFR_MODULE__CMAKE_FILES` if the new function is called by a CMake module. If the CMake module is _enabled_ (i.e. present in `AFR_MODULES_ENABLED`) within the CMake configuration (with `cmake .. -DVENDOR= ..` command), then the new module-specific cmake list (if created through the new function call) is inspected to add the registered cmake files to metadata. ### Verification I have verified that the new function adds the cmake files registered through the `afr_module_cmake_files` function to the `metadata/console/cmake_files.txt` file that is generated when using the `-DAFR_METADATA_MODE=1 flag in the `cmake ..` command * IDE Generator Run * Cypress64 project fix * Nordic project fix * Nuvoton project fix * Add demo for AWS IoT Jobs library (#2728) * IDE Generator Run * Update metadata configuration of Jobs demo * Cypress64 project update * Nuvoton project update * IDE Generator Run * Cypress project fix * Nuvoton project fix * Cypress project fix * Cypress project fix * Add a missing LICENSE file in jsmn library (#2737) * Update metadata configuration of Jobs demo (#2736) * Added transport_interface.h for unit test * Fixed CMock unit tests * Hygiene improvements to AWS IoT Jobs demo (#2742) * coreMQTT_integration Tests: Implement polling up to a count on the blocking function, MQTT_ProcessLoop. (#2749) * Implement waitForPacket to poll on blocking MQTT_ProcessLoop. * Update for PR comments. * undo change * Delete irrelevant comments. * Shim from HTTP V1 library to coreHTTP (Serializer only) (#2739) Provides backwards compatibility for the existing API by updating IotHttpsClient_AddHeader and IotHttpsClient_InitializeRequest to call HTTPClient_AddHeader and HTTPClient_InitializeRequestHeaders respectively. This is the first part of two. The next part will update IotHttpsClient_SendSync, IotHttpsClient_SendAsync, and IotHttpsClient_WriteRequestBody to call HTTPClient_Send. * Get integration tests passing after updating IotHttpsClient_InitializeRequest * Update aws_tests projects with IDE generator * Get tests passing with HTTPClient_AddHeader Shim * Remove CBMC for HTTP * Conditionally add http_parser based on FAMILY_NAME * Update project files for all other boards * Add coreHTTP to demo sources for cypress * Do not write Connection header in _sendHttpsHeaders * Changelog update for next release (#2752) * Changelog update for next release * lower heading level * Update TCP submodule pointer (#2756) * Disable logging for HTTP unit tests (#2757) This simply disables HTTP unit-test logs, which don't add much substance as errors are forced by these tests. This is done to fix an issue where boards stop printing test results from having to print too many logs. The same was also done for MQTT tests in an older commit. Note that integration tests for HTTP already do not log anything besides the test results. * coreMQTT_Integration test: Implement waiting on a publish packet, even one that is duplicate. (#2755) * Implement waiting on a publish packet, even one that is duplicate. - A duplicate publish from the broker will not invoke the event callback from MQTT ProcessLoop. If the evencallback is not invoked the usual boolean flags indicating that a packet was received cannot be set. This change updates waiting on a packet to input a boolean expression as a flag instead of a bool pointer. * Add retries for coreMQTT demos in case of a failure in a loop. (#2758) Co-authored-by: SarenaAWS <6563840+sarenameas@users.noreply.github.com> Co-authored-by: Archit Aggarwal * Add config for enabling Jobs demo (#2765) * Fix Shadow demo misalignment with MQTT demo helper. (#2764) * Fix Shadow demo misalignment with MQTT demo helper. * Apply suggestions from code review Co-authored-by: Archit Aggarwal * Fix metadata logic for adding Cmake files (#2766) This PR fixes 2 issues with creation of metadata for cmake files from the afr_module_cmake_files CMake function: 1. The generated metadata/console/cmake_files.txt file contains non-semi-colon separated list of cmake files added with afr_module_cmake_files. 2. Successive runs of metadata generation with cmake .. -DAFR_METADATA_MODE=1 ... results in duplicated entries of cmake files added through afr_module_cmake_files * Add S3 Download Demo From C-SDK (#2743) -Adding demo to demonstrate the use of pre-signed URLs to connect and download from a S3 bucket. Sends multiple GET requests synchronously to download a file in chunks using range headers. * Add demo files * Update project and config files * Add coreHTTP Integration Tests (#2763) Adding integration tests for the coreHTTP library: - Tests simple GET, HEAD, POST, and PUT requests, as well as a chunked streaming response and a line-feed only response. * Add S3 Upload Demo From C-SDK (#2745) - Adding demo to demonstrate the use of pre-signed URLs to connect and upload to a S3 bucket. * Add demo files * Add configs and update project files * Fix an issue in retry logic in coreMQTT mutual auth demo. (#2771) * Remove metadata of old HTTP and Device Defender libraries and demo modules (#2773) Remove visibtility of the old HTTP (at libraries/c_sdk/standard/https ) and old Defender ( at libraries/c_sdk/aws/defender ) libraries and their demos by removing the metadata configuration. This is done as their refactored library counterparts, coreHTTP and device_defender_for_aws will be shown on the FreeRTOS console. * Update logging to not print metadata in line breaks for WinSim ports (#2760) A newline was printed with metadata because it was configured to only clear the message buffer for LF rather than CRLF. In addition, the message number and tick count were always printed even though the log was on the same line. This is updated so that information is only logged with each CRLF. This follows changes from FreeRTOS/FreeRTOS#397. * Wait for the publish in Subscribe_Publish_With_Qos1 and Subscribe_Publish_With_Qos2 tests. (#2775) * Remove OTA E2E from public repo * Shim from HTTP V1 library to coreHTTP (HTTPClient_Send) (#2770) * Create shim for HTTPClient_Send * Remove task pool but has probs * Map network interface return value of 0 to -1 * Add docs for transportRecv, transportSend * Allocate request tasks * Create a separate task pool * Remove references to original task pool * Add extra config macros * Add static memory configurations * Push source file * Remove unused functions and macros * Update comment to be more precise * Update libraries/c_sdk/standard/https/src/iot_https_client.c Co-authored-by: SarenaAWS <6563840+sarenameas@users.noreply.github.com> * Update libraries/c_sdk/standard/https/src/iot_https_client.c Co-authored-by: SarenaAWS <6563840+sarenameas@users.noreply.github.com> * Update libraries/c_sdk/standard/https/src/private/iot_https_internal.h Co-authored-by: SarenaAWS <6563840+sarenameas@users.noreply.github.com> * Switch RECV and SEND ticks * Address PR comments * Fix logic for cleaning resources * Uncrustify * Update taskpool comments to say dispatch queue instead * Make the static declaration local to the function * Choose priority to match that of the task pool * Fix log message Co-authored-by: SarenaAWS <6563840+sarenameas@users.noreply.github.com> * Fix build failures of Device Shadow and Jobs demos from FreeRTOS console (#2777) * Fix Build Combination failures of Device Shadow and Jobs demo builds * Make mqtt_demo_helpers an INTERNAL module * Similar changes for AFR::http_demo_helpers module * Fix Device Shadow over BLE demo builds by updating cmake dependency * Remove hard-dependency on AFR::mqtt_demo_helpers missed in previous commit Co-authored-by: leegeth <51681119+leegeth@users.noreply.github.com> * Review comment Co-authored-by: leegeth <51681119+leegeth@users.noreply.github.com> * Fix CBMC MakefileLinux.json prerequisite symbol. This commit fixes the symbol used to represent the prerequisites of a Makefile target from $< to $^. The latter symbol expands to all of a target's prerequisites, not just the first one. This is needed to ensure that all object files get linked together. * Make CBMC patch.py look for touch file before patching. * Make CBMC Makefile.common check for external sat solver. * Make CBMC type header script use absolute paths. The type header script runs goto-instrument in a temporary directory, so the script must construct absolute paths to the inputs before changing directory to run the command. * Add litani submodule to build CBMC proofs concurrently. This commit adds Litani, hosted at https://github.com/awslabs/aws-build-accumulator Litani is a build tool for running proofs and generating reports. This commit is in preparation for converting the CBMC proofs to run using Litani, which will help with proof and CI maintenance. * Make CBMC proofs build concurrently with litani. * Add retries to device shadow demo if a demo iteration is failed. (#2776) * Submodule FreeRTOS/backoffAlgorithm and update demos and tests for new API (#2767) Replace the retry_utils library folder with submodule to the refactored library, now hosted, in FreeRTOS/backoffAlgorithm Update the demos and integration tests to use the refactored library API. Note: For the random number generator function provided to the refactored retry_utils library, the PKCS11 module has been used to so that if the board platform supports a True Random Number Generator, the back-off calculation can take advantage of that. * Revert bad check-in for configure.json (#2788) * hygiene: relocate afr_module_cmake_files function definition (#2787) * Add retries to coreHTTP demos if a failure happens. (#2778) * Add retries to Jobs demo if a failure occurs. (#2782) Co-authored-by: Archit Aggarwal * Add PKCS log defines for secure element boards. (#2789) * Adding HTTP Mutual Auth Demo from C-SDK (#2738) Adding demo to demonstrate use of the coreHTTP library using a mutually-authenticated network connection. Sends a simple message using a POST request and waits for a server response. * Adds demo files, vendor configs, and updates project files * Remove compilation warnings and clean only upon error (#2791) The queue was always deallocated even though everything was initialized successfully, so the status must be checked before cleanup. This also fixes any possible compilation warnings in MSVC. * Update FreeRTOS console text for Jobs and Device Shadow libraries (#2790) * Add struct tm by default * Cypress update (#2794) Add missing coreHTTP integration test sources in aws_test.mk and afr.mk, which were leading to build failures. * Update HTTP Shim stack sizes to resolve overflow (#2795) * Fix metadata issue of coreMQTT demo not getting enabled (#2798) * Fix metadata issue of coreMQTT demo not getting enabled * Update dependency on AFR::pkcs11_helpers to be conditional for MQTT demo wrapper module * Remove hard dependency on pkcs11_helpers for MQTT wrapper target * Run IDE Generator (#2800) * Add logging to include for OptigaX. (#2801) * Update HTTP shim stack sizes for TI & ST (#2802) Originally, default stack size of configMINIMAL_STACK_SIZE * 2 for HTTP shim dispatch task was insufficient for TI & ST, causing original HTTP demos to freeze. Therefore, we multiply by 4 instead, resulting in the following unused stack space: For ST: Stack unused: 89, total: 360, used: 271 For TI: Stack unused: 131, total: 360, used: 229 * Add AWS IoT compatible tests to the HTTP system tests. (#2784) - Remove unnecessary function call layer. - Add coreHTTP_Integration_AWS_IoT_Compatible to aws_test_runner.c and all boards. * Update demos and tests for backoffAlgorithm API change (#2796) The API of FreeRTOS/backoffAlgorithm library has changed to remove dependency on random number generator; instead require the caller to generate the random number and pass it to the BackoffAlgorithm_GetNextBackoff API for backoff period calculation. This PR updates the submodule pointer commit, and updates the demos and tests to use the simplied library API * Add defender demo (#2799) * Add a new defender demo and lwip metrics collector. * Add new defender demo option to config files. * Add LWIP bytes out metric suppoort on MT7697 board. * Update mt7697 project files for new defender demo. * Removed unused files. * Update MT7697 project file include path. * Clean up some unused configs. * Update H files header. * Remove duplicate core_mqtt_config.h file. * Clean up the demo config files. * Rename demo config file. * Update include header for the renamed demo config file. * Add standard header to remove the warning. * Update MT7697 project file for the file names change. * Change the Metric log-print from info level back to debug level. * Update and align demo return type with demo helper. * Formatting Comments. Co-authored-by: SarenaAWS <6563840+sarenameas@users.noreply.github.com> * Update comments Co-authored-by: SarenaAWS <6563840+sarenameas@users.noreply.github.com> * Update comments Co-authored-by: SarenaAWS <6563840+sarenameas@users.noreply.github.com> * Update demos/device_defender_for_aws/metrics_collector/lwip/metrics_collector.c Co-authored-by: SarenaAWS <6563840+sarenameas@users.noreply.github.com> * Update demos/device_defender_for_aws/metrics_collector/lwip/metrics_collector.c Co-authored-by: SarenaAWS <6563840+sarenameas@users.noreply.github.com> * Add missing parameters in function discriptions. * Update demos/device_defender_for_aws/metrics_collector/lwip/metrics_collector.h Co-authored-by: SarenaAWS <6563840+sarenameas@users.noreply.github.com> * Update demos/device_defender_for_aws/metrics_collector/lwip/metrics_collector.c Co-authored-by: SarenaAWS <6563840+sarenameas@users.noreply.github.com> * Update demos/device_defender_for_aws/metrics_collector/lwip/metrics_collector.c Co-authored-by: SarenaAWS <6563840+sarenameas@users.noreply.github.com> * Switch from iot_demo_logging.h to logging_stack.h. * Run uncrustify. * Remove forward datagrams from out packets metric. * Add lwip get UDP support. * Change the xTaskGetTickCount as the report ID. * Remove the lwip IP address dependency. * Fix IP address lwip dependency. * Rollabck the project files. * Add demo project CMakeLists metadata. * Replace log functions from iot_demo_logging.h * Add lisence * Fix Typos. * Add ProcessLoop helper function. * Make the lwip metrics netif port configurable. * Update demo config file. * Make Defender demo publish callback only process the incomming MQTT publish message. * Uncrustify * First updates to the demo Signed-off-by: Gaurav Aggarwal * Mediatek demo now works Signed-off-by: Gaurav Aggarwal * Update comments in CMakeLists.txt Signed-off-by: Gaurav Aggarwal * Add cypress changes Signed-off-by: Gaurav Aggarwal * Remove an unnecessary lwip define for using metric collect. * Add FreeRTOS+TCP port * Update winsim project config * Demo fixes * Add defender demo to windows project Signed-off-by: Gaurav Aggarwal * Add defender demo to platforms using FreeRTOS+TCP Added platforms are: - Espressif - Microchip - Marvell - Renesas - Xilinx Signed-off-by: Gaurav Aggarwal * Update winsim project using IDE generator Signed-off-by: Gaurav Aggarwal * Add retries * Fix formatting * Fix metrics_collector.h docs * Remove defender demo from espressif Signed-off-by: Gaurav Aggarwal * uncrustify * IDE generator changes Signed-off-by: Gaurav Aggarwal * Incorporate feedback * fix processloop issue * Incorportate feedback * Add mqtt strerror to mqtt helpers * fix format specifiers * Address feedback Co-authored-by: Ming Yue Co-authored-by: SarenaAWS <6563840+sarenameas@users.noreply.github.com> Co-authored-by: Gaurav Aggarwal * Add dependency on internal mqtt_demo_helpers module for device defender wrapper target (#2806) * Change shadow tests to use starfield certificate Signed-off-by: Gaurav Aggarwal * Fix build failure for connection sharing demo. (#2809) * Update HTTP shim stack sizes for Cypress64 (#2810) Originally, default stack size of configMINIMAL_STACK_SIZE * 2 for HTTP shim dispatch task was insufficient for Cypress64, causing original HTTP demos to freeze. Therefore, we multiply by 4 instead, resulting in the following unused stack space: Stack unused: 232, total: 520, used: 288. * README updates with memory estimates for MQTT Shim (#2748) * Remove old defender demo (#2812) Removes old defender library demo as we now have the new defender library demo. * updating cypress asset to submodules * Fix demo build for Nuvoton ethernet. (#2818) * Update HTTP Shim configs for Nuvoton & ST (#2816) Originally, default stack size of configMINIMAL_STACK_SIZE * 2 for HTTP shim dispatch task was insufficient for Nuvoton, causing original HTTP demos to freeze. Therefore, we multiply by 4 instead, resulting in the following unused stack space: Stack unused: 171, total: 400, used: 229 * Add memory estimates for HTTPS V1 compatibility layer (#2817) Provides code sizes for the HTTPS V1 compatibility layer in comparison to coreHTTP * Update Nuvoton ethernet project with device defender demo files. (#2819) * Update corePKCS11 and PKCS integration tests (#2814) * Move corePKCS11 submodule forward. * Add provisioning of RSA public key to test code. * Update functions using an API that changed in core_pkcs11.h * fixing typos * Fix build warnings in MQTT COmpatibility Layer. (#2821) * Add directions for using pre-signed URL script to main S3 demo files (#2807) Add references to pre-signed URL script to the top of main demo files for a better user experience. Also revert a transport timeout value change, add the retry note recently added to other demos, and some other minor comment updates. * Use Starfield Root CA cert (#2824) Update TI config file to use a self-signed root CA certificate. * Adding HTTP Multithreaded Download Demo from C-SDK (#2751) Adding demo to demonstrate the use of pre-signed URLs to connect and download from a S3 bucket. Sends multiple GET requests synchronously to download a file in chunks using range headers. Uses a separate thread to service HTTP tasks. * Strip NULL terminator from xFindObjectLabel calls using sizeof. (#2825) * Fix TLS connection caused by bad core_pki_utils.c change. (#2830) Move corePKCS11 module forward. * Remove old HTTPS demos (#2827) Removing 4 old HTTPS S3 demos. * FreeRTOS+TCP: Update Submodule Pointer (#2826) (#2831) * Update TCP submodule pointer * Update the submodule pointer of TCP to V2.3.2 * Update defender demos * Update Harness for vDHCPProcess * Nuvoton build issue fix (#2832) * Add stub metrics collector (#2823) (#2833) Since we only implement defender metrics collection on FreeRTOS+TCP or lwIP, this adds a stub metrics collector to allow the demo to be built and run on other platforms using stubbed metrics. * bump version to 202012.00 (#2839) * Update Cypress Metadata. * cypress: Do not create boot image when AFR_METADATA_MODE=1 * Omitt the error message of cannot find objcopy in METADATA_MODE. * Omitt error of cannot find cysecuretoos in METADATA_MODE. * formatting * Remove indent. * Reduce buffer sizes (#2844) * Move threading_alt.h to mbedtls_config folder. (#2841) * Move threading_alt.h to mbedtls_config folder. * Update include path. * Revert cypress asset updates (#2847) * Revert "Merge pull request #2840 from mingyue86010/release-candidate" This reverts commit 6c4180018a342277b73ebb6a1f374c65bd830dbe, reversing changes made to c8d2dabf957ea717c3851c8e3bce46d7057c5e47. * Revert "Merge pull request #2815 from shuopeng-deng/cypress-asset-submodule" This reverts commit 39f7b601c9c57fa931a004131a9205e941c9511a, reversing changes made to 80fd99392f0598d25329b17b6f01479b1764bfbd. * update library versions and checksum file (#2850) * update library versions and checksum file * fix secure sockets versioning * Update kernel submodule pointer to version 47338393f (#2849) (#2853) * Update kernel submodule pointer to version 47338393f * Fix CBMC patch. * update checksum, and projects (#2855) * Fix S3 multi threading demo failure on NXP (#2857) * Fix build combinations issues for defender demo (#2858) * Fix missing freertos_plus_tcp_utils This change brings the freertos_plus_tcp_utils module in when the device_defender_demo_dependencies module is selected for the FreeRTOS console. * Dedupe defender demo CMakeLists Moves the duplicated parts of the defender demo cmake configuration out of the metrics collector conditional blocks. * Remove explicit lwip dependency for metrics_collector ESP32 doesn't use 3rdparty::lwip, and the explicit dependency was not nessesary, so this change removes it from the configuration for lwip metrics collection. * Split freertos_plus_tcp_utils into seperate file Build combinations were failing when freertos_plus_tcp_utils was in the same cmake file as freertos_plus_tcp. This moves it to its own file with the file name same as the module in order to fix the build combinations issue. This also fixes the build failures on Marvell. * Run IDE generator * Fix BLE test failures (#2854) (#2856) * Update Cypress43/54 project files for new libraries/demos (#2865) Adding coreMQTT, coreHTTP, jobs, shadow, and defender libraries/demos to Cypress43 and Cypress54 project files, to update IDE folder structure (doesn't affect build). Also add missing coreHTTP sources to aws_demo.mk. * Update ESP-IDF submodule to fix issue with LWIP_TCPIP_CORE_LOCKING * Add comment about handling S3 request limits to S3 download demos (#2871) Adding a comment to the top of S3 download and multi-threaded download demo source code files, to explain how to handle S3 request limits. This is done to prevent users from treating this case as a bug. * Update FreeRTOS+TCP submodule pointer (#2869) * Add support for collecting metrics in demos connecting to AWS IoT (#2860) Add support for collecting metrics of OS, Kernel version and MQTT client version through demos that connect to AWS IoT. These metrics are OPTIONAL for users. These metrics help AWS IoT improve security and provide better technical support. * Changelog update for 202012.00 (#2862) * Changelog update for 202012.00 * update to latest submdules, update pkcs tests version and checksum (#2874) * Add files via upload (#2876) * Update HTTPS V1 Shim to work with new coreHTTP changes (#2878) Because coreHTTP requires a response to return successfully, the shim is updated to pass the smallest valid HTTP response so that HTTPClient_Send can return a successful status provided there are no errors from sending the request. * Revert "Add support for collecting metrics in demos connecting to AWS IoT (#2860)" (#2879) This reverts commit 498aa355dce6f215a01002d49956bfb415d59caf. * update library submodules (#2883) * add back ota e2e tests from previuous release (#2884) * update submodules and checksum file (#2886) Co-authored-by: Muneeb Ahmed <54290492+muneebahmed10@users.noreply.github.com> Co-authored-by: Archit Aggarwal Co-authored-by: Cobus van Eeden <35851496+cobusve@users.noreply.github.com> Co-authored-by: Ming Yue Co-authored-by: leegeth <51681119+leegeth@users.noreply.github.com> Co-authored-by: Ravishankar Bhagavandas Co-authored-by: David Chalco Co-authored-by: David Chalco <59750547+dachalco@users.noreply.github.com> Co-authored-by: Shubham Kulkarni <57181281+shubhamkulkarni97@users.noreply.github.com> Co-authored-by: alfred gedeon Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Joseph Julicher Co-authored-by: Carl Lundin <53273776+lundinc2@users.noreply.github.com> Co-authored-by: andysun2015 Co-authored-by: Aniruddha Kanhere <60444055+AniruddhaKanhere@users.noreply.github.com> Co-authored-by: Paul Sokolovsky Co-authored-by: Prasad Alatkar <43741073+prasad-alatkar@users.noreply.github.com> Co-authored-by: Oscar Michael Abrina Co-authored-by: Eric Yeh Co-authored-by: SarenaAWS <6563840+sarenameas@users.noreply.github.com> Co-authored-by: Sukhmani Minhas <50919130+sukhmanm@users.noreply.github.com> Co-authored-by: Mark R. Tuttle Co-authored-by: Archit Gupta <71798289+archigup@users.noreply.github.com> Co-authored-by: Gaurav Aggarwal Co-authored-by: Gaurav-Aggarwal-AWS <33462878+aggarg@users.noreply.github.com> Co-authored-by: Shuopeng Deng Co-authored-by: Shubham Kulkarni Co-authored-by: sbammi <36212270+sbammi@users.noreply.github.com> --- .gitmodules | 19 +- CHANGELOG.md | 75 + CMakeLists.txt | 4 +- checksums.json | 9728 ++++++++--------- .../gatt_server/aws_ble_gatt_server_demo.c | 2 +- demos/ble/mqtt_ble/mqtt_demo_ble_transport.c | 2 +- .../iot_ble_numericComparison.c | 2 +- .../shadow_ble/shadow_demo_ble_transport.c | 2 +- demos/cli/cli_uart_demo.c | 2 +- demos/common/http_demo_helpers/CMakeLists.txt | 23 + .../http_demo_helpers/http_demo_utils.c | 290 + .../http_demo_helpers/http_demo_utils.h | 125 + .../presigned_url_generator/README.md | 55 + .../presigned_urls_gen.py | 68 + demos/common/mqtt_demo_helpers/CMakeLists.txt | 23 + .../mqtt_demo_helpers/mqtt_demo_helpers.c} | 336 +- .../mqtt_demo_helpers/mqtt_demo_helpers.h} | 80 +- demos/common/pkcs11_helpers/CMakeLists.txt | 22 + demos/common/pkcs11_helpers/pkcs11_helpers.c | 103 + demos/common/pkcs11_helpers/pkcs11_helpers.h | 54 + demos/coreHTTP/CMakeLists.txt | 41 + demos/coreHTTP/http_demo_mutual_auth.c | 489 + demos/coreHTTP/http_demo_s3_download.c | 790 ++ .../http_demo_s3_download_multithreaded.c | 1104 ++ demos/coreHTTP/http_demo_s3_upload.c | 830 ++ demos/coreMQTT/CMakeLists.txt | 13 +- demos/coreMQTT/mqtt_demo_connection_sharing.c | 163 +- demos/coreMQTT/mqtt_demo_mutual_auth.c | 289 +- demos/defender/CMakeLists.txt | 17 - demos/defender/aws_iot_demo_defender.c | 357 - demos/demo_runner/aws_demo.c | 2 +- demos/demo_runner/aws_demo_network_addr.c | 2 +- demos/demo_runner/aws_demo_version.c | 2 +- demos/demo_runner/iot_demo_freertos.c | 2 +- demos/demo_runner/iot_demo_runner.c | 2 +- .../include/aws_dev_mode_key_provisioning.h | 2 +- .../src/aws_dev_mode_key_provisioning.c | 7 +- demos/device_defender_for_aws/CMakeLists.txt | 101 + demos/device_defender_for_aws/defender_demo.c | 694 ++ .../metrics_collector.h | 140 + .../freertos_plus_tcp/metrics_collector.c | 252 + .../lwip/metrics_collector.c | 292 + .../metrics_collector/lwip/netif_port.h | 47 + .../stub/metrics_collector.c | 202 + .../device_defender_for_aws/report_builder.c | 492 + .../device_defender_for_aws/report_builder.h | 80 + demos/device_shadow_for_aws/CMakeLists.txt | 25 +- .../device_shadow_for_aws/shadow_demo_main.c | 610 +- .../aws_greengrass_discovery_demo.c | 2 +- demos/https/CMakeLists.txt | 23 - demos/https/README.md | 46 - demos/https/iot_demo_https_common.c | 223 - demos/https/iot_demo_https_common.h | 95 - .../https/iot_demo_https_s3_download_async.c | 1273 --- demos/https/iot_demo_https_s3_download_sync.c | 571 - demos/https/iot_demo_https_s3_upload_async.c | 541 - demos/https/iot_demo_https_s3_upload_sync.c | 485 - demos/https/presigned_urls_gen.py | 38 - demos/include/aws_application_version.h | 2 +- demos/include/aws_ble_gatt_server_demo.h | 2 +- demos/include/aws_clientcredential.h | 2 +- demos/include/aws_clientcredential_keys.h | 2 +- demos/include/aws_demo.h | 2 +- demos/include/aws_iot_demo_network.h | 2 +- .../include/aws_ota_codesigner_certificate.h | 2 +- demos/include/aws_wifi_connect_task.h | 2 +- demos/include/iot_ble_numericComparison.h | 2 +- demos/include/iot_config_common.h | 2 +- demos/include/iot_demo_logging.h | 2 +- demos/include/iot_demo_runner.h | 33 +- demos/jobs_for_aws/CMakeLists.txt | 35 + demos/jobs_for_aws/jobs_demo.c | 901 ++ demos/network_manager/aws_iot_demo_network.c | 2 +- .../network_manager/aws_iot_network_manager.c | 2 +- .../iot_network_manager_private.h | 2 +- demos/ota/aws_iot_ota_update_demo.c | 2 +- demos/posix/aws_posix_demo.c | 2 +- demos/tcp/aws_tcp_echo_client_single_task.c | 2 +- demos/tcp/aws_tcp_echo_client_single_tasks.h | 2 +- .../wifi_provisioning/aws_wifi_connect_task.c | 2 +- .../FreeRTOS_Porting_Guide.pdf | Bin 2220085 -> 2186594 bytes .../FreeRTOS_Qualification_Guide.pdf | Bin 360967 -> 375690 bytes freertos_kernel | 2 +- libraries/3rdparty/CMakeLists.txt | 18 +- libraries/3rdparty/http_parser | 1 - libraries/3rdparty/jsmn/LICENSE | 20 + .../3rdparty/mbedtls_config/threading_alt.h | 49 + libraries/CMakeLists.txt | 25 + libraries/abstractions/backoff_algorithm | 1 + .../abstractions/backoff_algorithm.cmake | 38 + .../abstractions/common_io/include/iot_adc.h | 2 +- .../common_io/include/iot_battery.h | 2 +- .../common_io/include/iot_efuse.h | 2 +- .../common_io/include/iot_flash.h | 2 +- .../abstractions/common_io/include/iot_gpio.h | 2 +- .../abstractions/common_io/include/iot_hw.h | 2 +- .../abstractions/common_io/include/iot_i2c.h | 2 +- .../abstractions/common_io/include/iot_i2s.h | 2 +- .../common_io/include/iot_perfcounter.h | 2 +- .../common_io/include/iot_power.h | 2 +- .../abstractions/common_io/include/iot_pwm.h | 2 +- .../common_io/include/iot_reset.h | 2 +- .../abstractions/common_io/include/iot_rtc.h | 2 +- .../abstractions/common_io/include/iot_sdio.h | 2 +- .../abstractions/common_io/include/iot_spi.h | 2 +- .../common_io/include/iot_timer.h | 2 +- .../common_io/include/iot_tsensor.h | 2 +- .../abstractions/common_io/include/iot_uart.h | 2 +- .../common_io/include/iot_usb_device.h | 2 +- .../common_io/include/iot_usb_host.h | 2 +- .../common_io/include/iot_watchdog.h | 2 +- .../common_io/test/iot_test_common_io.c | 2 +- .../test/iot_test_common_io_internal.h | 2 +- .../common_io/test/test_iot_adc.c | 2 +- .../common_io/test/test_iot_battery.c | 2 +- .../common_io/test/test_iot_efuse.c | 2 +- .../common_io/test/test_iot_flash.c | 2 +- .../common_io/test/test_iot_gpio.c | 2 +- .../common_io/test/test_iot_i2c.c | 2 +- .../common_io/test/test_iot_i2s.c | 2 +- .../common_io/test/test_iot_perfcounter.c | 2 +- .../common_io/test/test_iot_power.c | 2 +- .../common_io/test/test_iot_pwm.c | 2 +- .../common_io/test/test_iot_reset.c | 2 +- .../common_io/test/test_iot_rtc.c | 2 +- .../common_io/test/test_iot_sdio.c | 2 +- .../common_io/test/test_iot_spi.c | 2 +- .../common_io/test/test_iot_timer.c | 22 +- .../common_io/test/test_iot_tsensor.c | 2 +- .../common_io/test/test_iot_uart.c | 2 +- .../common_io/test/test_iot_watchdog.c | 2 +- libraries/abstractions/pkcs11/CMakeLists.txt | 2 +- libraries/abstractions/pkcs11/corePKCS11 | 2 +- .../pkcs11/ecc608a/atca_cert_chain.c | 2 +- .../pkcs11/ecc608a/atca_cert_chain.h | 2 +- .../ecc608a/core_pkcs11_secure_element.c | 2 +- .../pkcs11/test/MBT_C_CloseSession.c | 2 +- .../pkcs11/test/MBT_C_DigestFinal.c | 2 +- .../pkcs11/test/MBT_C_DigestInit.c | 2 +- .../pkcs11/test/MBT_C_DigestUpdate.c | 2 +- .../abstractions/pkcs11/test/MBT_C_Finalize.c | 2 +- .../pkcs11/test/MBT_C_FindObjects.c | 2 +- .../pkcs11/test/MBT_C_FindObjectsFinal.c | 2 +- .../pkcs11/test/MBT_C_FindObjectsInit.c | 2 +- .../pkcs11/test/MBT_C_GenerateKeyPair.c | 2 +- .../pkcs11/test/MBT_C_GenerateRandom.c | 2 +- .../pkcs11/test/MBT_C_GetAttributeValue.c | 2 +- .../pkcs11/test/MBT_C_Initialize.c | 2 +- .../pkcs11/test/MBT_C_OpenSession.c | 2 +- .../abstractions/pkcs11/test/MBT_C_Sign.c | 2 +- .../abstractions/pkcs11/test/MBT_C_SignInit.c | 4 +- .../abstractions/pkcs11/test/MBT_C_Verify.c | 2 +- .../pkcs11/test/MBT_C_VerifyInit.c | 2 +- .../pkcs11/test/MBT_DigestMachine.c | 2 +- .../pkcs11/test/MBT_GenerationMachine.c | 2 +- .../pkcs11/test/MBT_ObjectMachine.c | 2 +- .../pkcs11/test/MBT_SessionMachine.c | 2 +- .../pkcs11/test/MBT_SignMachine.c | 2 +- .../pkcs11/test/MBT_VerifyMachine.c | 2 +- .../pkcs11/test/iot_test_pkcs11.c | 129 +- .../pkcs11/test/iot_test_pkcs11_globals.h | 3 +- .../posix/include/FreeRTOS_POSIX/time.h | 20 + .../abstractions/retry_utils/CMakeLists.txt | 20 - .../freertos/retry_utils_freertos.c | 154 - .../abstractions/retry_utils/retry_utils.h | 245 - .../secure_sockets/transport_secure_sockets.c | 2 +- .../secure_sockets/transport_secure_sockets.h | 1 + .../transport_interface_secure_sockets.cmake | 10 +- libraries/c_sdk/aws/defender/CMakeLists.txt | 7 - .../c_sdk/aws/defender/include/aws_defender.h | 2 +- .../aws/defender/include/aws_iot_defender.h | 2 +- .../aws/defender/src/aws_iot_defender_api.c | 2 +- .../defender/src/aws_iot_defender_collector.c | 2 +- .../aws/defender/src/aws_iot_defender_mqtt.c | 2 +- .../aws/defender/src/aws_iot_defender_v1.c | 2 +- .../src/private/aws_iot_defender_internal.h | 2 +- .../system/aws_iot_tests_defender_system.c | 2 +- .../test/unit/aws_iot_tests_defender_unit.c | 2 +- .../ble/include/iot_ble_mqtt_serialize.h | 5 + .../mqtt_ble/iot_ble_mqtt_transport.c | 76 +- .../ble/test/iot_mqtt_ble_system_test.c | 19 +- .../ble/test/iot_test_ble_mqtt_serialize.c | 9 +- .../utest/ble_mqtt_transport/CMakeLists.txt | 1 - libraries/c_sdk/standard/https/CMakeLists.txt | 17 +- libraries/c_sdk/standard/https/CODESIZE.md | 24 + libraries/c_sdk/standard/https/README.md | 30 + .../standard/https/include/iot_https_client.h | 2 +- .../standard/https/include/iot_https_utils.h | 2 +- .../https/include/types/iot_https_types.h | 2 +- .../standard/https/src/iot_https_client.c | 828 +- .../standard/https/src/iot_https_utils.c | 2 +- .../https/src/private/iot_https_internal.h | 105 +- .../https/test/access/iot_test_access_https.h | 2 +- .../access/iot_test_access_https_client.c | 2 +- .../test/system/iot_tests_https_system.c | 8 +- .../https/test/unit/iot_tests_https_async.c | 2 +- .../https/test/unit/iot_tests_https_client.c | 4 +- .../https/test/unit/iot_tests_https_common.c | 2 +- .../https/test/unit/iot_tests_https_common.h | 2 +- .../https/test/unit/iot_tests_https_sync.c | 2 +- .../https/test/unit/iot_tests_https_utils.c | 2 +- libraries/c_sdk/standard/mqtt/CODESIZE.md | 45 + libraries/c_sdk/standard/mqtt/README.md | 29 +- .../c_sdk/standard/mqtt/include/iot_mqtt.h | 2 +- .../standard/mqtt/include/iot_mqtt_agent.h | 2 +- .../include/iot_mqtt_agent_config_defaults.h | 2 +- .../mqtt/include/iot_mqtt_config_defaults.h | 2 +- .../standard/mqtt/include/iot_mqtt_lib.h | 2 +- .../mqtt/include/types/iot_mqtt_types.h | 2 +- .../c_sdk/standard/mqtt/src/iot_mqtt_agent.c | 2 +- .../c_sdk/standard/mqtt/src/iot_mqtt_api.c | 78 +- .../mqtt/src/iot_mqtt_context_connection.c | 2 +- .../src/iot_mqtt_managed_function_wrapper.c | 2 +- .../mqtt/src/iot_mqtt_mutex_wrapper.c | 2 +- .../standard/mqtt/src/iot_mqtt_network.c | 2 +- .../standard/mqtt/src/iot_mqtt_operation.c | 2 +- .../mqtt/src/iot_mqtt_publish_duplicates.c | 18 +- ...iot_mqtt_serializer_deserializer_wrapper.c | 2 +- .../mqtt/src/iot_mqtt_static_memory.c | 2 +- .../standard/mqtt/src/iot_mqtt_subscription.c | 252 +- .../src/iot_mqtt_subscription_container.c | 7 +- .../standard/mqtt/src/iot_mqtt_validate.c | 2 +- .../mqtt/src/private/iot_mqtt_internal.h | 2 +- .../mqtt/test/access/iot_test_access_mqtt.h | 6 +- .../test/access/iot_test_access_mqtt_api.c | 2 +- .../iot_test_access_mqtt_context_connection.c | 2 +- .../iot_test_access_mqtt_subscription.c | 18 +- .../standard/mqtt/test/iot_test_mqtt_agent.c | 2 +- .../mqtt/test/mock/iot_tests_mqtt_mock.c | 2 +- .../mqtt/test/mock/iot_tests_mqtt_mock.h | 2 +- .../mqtt/test/system/iot_tests_mqtt_system.c | 2 +- .../mqtt/test/unit/iot_tests_mqtt_api.c | 2 +- .../mqtt/test/unit/iot_tests_mqtt_metrics.c | 2 +- .../mqtt/test/unit/iot_tests_mqtt_receive.c | 2 +- .../test/unit/iot_tests_mqtt_subscription.c | 32 +- .../mqtt/test/unit/iot_tests_mqtt_validate.c | 2 +- libraries/coreHTTP | 1 + libraries/coreJSON | 2 +- libraries/coreMQTT | 2 +- libraries/core_http_demo_dependencies.cmake | 108 + libraries/core_json.cmake | 10 +- libraries/core_mqtt_demo_dependencies.cmake | 33 +- .../device_defender_demo_dependencies.cmake | 97 + libraries/device_defender_for_aws | 1 + .../device_shadow_demo_dependencies.cmake | 33 +- libraries/device_shadow_for_aws | 2 +- .../standard/crypto/include/iot_crypto.h | 2 +- .../standard/crypto/src/iot_crypto.c | 2 +- .../standard/crypto/test/iot_test_crypto.c | 2 +- .../include/FreeRTOS_POSIX_portable_default.h | 3 + .../freertos_plus/standard/freertos_plus_tcp | 2 +- .../standard/freertos_plus_tcp.cmake | 11 +- .../standard/freertos_plus_tcp_utils.cmake | 32 + .../standard/tls/include/iot_tls.h | 2 +- .../freertos_plus/standard/tls/src/iot_tls.c | 4 +- .../standard/tls/test/iot_test_tls.c | 2 +- .../standard/tls/test/iot_test_tls.h | 2 +- .../standard/utils/include/iot_system_init.h | 2 +- .../standard/utils/src/iot_system_init.c | 2 +- libraries/jobs_demo_dependencies.cmake | 82 + libraries/jobs_for_aws | 1 + libraries/logging/include/iot_logging_task.h | 2 +- libraries/logging/include/logging_levels.h | 2 +- libraries/logging/include/logging_stack.h | 3 +- libraries/logging/iot_logging.c | 2 +- .../iot_logging_task_dynamic_buffers.c | 2 +- .../mtb/aws_demos/.project | 5 - .../mtb/aws_demos/afr.mk | 50 +- .../mtb/aws_tests/afr.mk | 31 +- .../wicedstudio/aws_demos/.project | 289 +- .../wicedstudio/aws_tests/.project | 4 +- .../wicedstudio/aws_demos/.project | 289 +- .../wicedstudio/aws_tests/.project | 4 +- .../espressif/esp32/make/aws_demos/.project | 4 +- .../espressif/esp32/make/aws_tests/.project | 4 +- .../xmc4800_iotkit/dave4/aws_demos/.cproject | 15 +- .../xmc4800_iotkit/dave4/aws_demos/.project | 219 +- .../xmc4800_iotkit/dave4/aws_tests/.cproject | 14 +- .../xmc4800_iotkit/dave4/aws_tests/.project | 138 +- .../dave4/aws_demos/.cproject | 17 +- .../dave4/aws_demos/.project | 219 +- .../dave4/aws_tests/.cproject | 16 +- .../dave4/aws_tests/.project | 138 +- .../marvell/mw300_rd/make/aws_demos/.project | 4 +- .../marvell/mw300_rd/make/aws_tests/.project | 4 +- .../marvell/mw300_rd/make/aws_tests/build.mk | 2 - .../uvision/aws_demos/aws_demos.uvoptx | 56 +- .../uvision/aws_demos/aws_demos.uvprojx | 288 +- .../uvision/aws_tests/aws_tests.uvoptx | 34 +- .../uvision/aws_tests/aws_tests.uvprojx | 178 +- .../aws_demos/nbproject/configurations.xml | 182 +- .../aws_tests/nbproject/configurations.xml | 147 +- .../visual_studio/aws_demos/aws_demos.vcxproj | 62 +- .../aws_demos/aws_demos.vcxproj.filters | 199 +- .../visual_studio/aws_tests/aws_tests.vcxproj | 43 +- .../aws_tests/aws_tests.vcxproj.filters | 145 +- .../ses/aws_demos/aws_demos.emProject | 27 +- .../ses/aws_tests/aws_tests.emProject | 25 +- .../uvision/aws_demos/aws_demos.uvproj | 283 +- .../aws_demos_eth/aws_demos_eth.uvproj | 262 +- .../uvision/aws_tests/aws_tests.uvproj | 178 +- .../iar/aws_demos/aws_demos.ewp | 422 +- .../iar/aws_tests/aws_tests.ewp | 347 +- .../mcuxpresso/aws_demos/.cproject | 15 +- .../mcuxpresso/aws_demos/.project | 219 +- .../mcuxpresso/aws_tests/.cproject | 14 +- .../mcuxpresso/aws_tests/.project | 117 +- .../visual_studio/aws_demos/aws_demos.vcxproj | 62 +- .../aws_demos/aws_demos.vcxproj.filters | 199 +- .../visual_studio/aws_tests/aws_tests.vcxproj | 43 +- .../aws_tests/aws_tests.vcxproj.filters | 145 +- .../rx65n-rsk/e2studio/aws_demos/.cproject | 16 +- .../rx65n-rsk/e2studio/aws_demos/.project | 264 +- .../rx65n-rsk/e2studio/aws_tests/.cproject | 15 +- .../rx65n-rsk/e2studio/aws_tests/.project | 183 +- .../ac6/aws_demos/.cproject | 15 +- .../ac6/aws_demos/.project | 219 +- .../ac6/aws_tests/.cproject | 14 +- .../ac6/aws_tests/.project | 138 +- .../ccs/aws_tests/.ccsproject | 5 + .../cc3220_launchpad/ccs/aws_demos/.cproject | 15 +- .../cc3220_launchpad/ccs/aws_demos/.project | 219 +- .../cc3220_launchpad/ccs/aws_tests/.cproject | 14 +- .../cc3220_launchpad/ccs/aws_tests/.project | 138 +- .../iar/aws_demos/aws_demos.ewp | 314 +- .../iar/aws_tests/aws_tests.ewp | 215 +- .../xilinx/microzed/xsdk/aws_demos/.cproject | 16 +- .../xilinx/microzed/xsdk/aws_demos/.project | 264 +- .../xilinx/microzed/xsdk/aws_tests/.cproject | 15 +- .../xilinx/microzed/xsdk/aws_tests/.project | 183 +- tests/common/aws_test.c | 2 +- tests/common/aws_test_framework.c | 2 +- tests/common/aws_test_runner.c | 16 +- tests/common/iot_test_freertos.c | 2 +- tests/common/iot_tests_network.c | 2 +- tests/include/aws_application_version.h | 2 +- tests/include/aws_clientcredential.h | 2 +- tests/include/aws_clientcredential_keys.h | 2 +- tests/include/aws_test_framework.h | 2 +- tests/include/aws_test_runner.h | 2 +- tests/include/aws_test_tcp.h | 2 +- tests/include/aws_test_utils.h | 2 +- tests/include/aws_unity_config.h | 2 +- tests/include/iot_config_common.h | 2 +- tests/integration_test/CMakeLists.txt | 26 +- .../integration_test/core_http_system_test.c | 775 ++ .../integration_test/core_mqtt_system_test.c | 537 +- .../freertos_tcp_test_access_declare.h | 2 +- .../freertos_tcp_test_access_dns_define.h | 2 +- .../freertos_tcp_test_access_tcp_define.h | 2 +- tests/integration_test/shadow_system_test.c | 134 +- tests/integration_test/test_freertos_tcp.c | 2 +- tests/unit_test/linux/CMakeLists.txt | 1 + .../linux/config_files/FreeRTOSConfig.h | 2 +- .../config_files/aws_secure_sockets_config.h | 2 +- .../linux/config_files/aws_wifi_config.h | 2 +- .../linux/config_files/core_mqtt_config.h | 2 +- .../linux/config_files/core_pkcs11_config.h | 2 +- .../linux/config_files/iot_ble_config.h | 2 +- .../unit_test/linux/config_files/iot_config.h | 2 +- .../linux/config_files/iot_config_common.h | 2 +- .../linux/config_files/logging_levels.h | 2 +- .../linux/config_files/logging_stack.h | 2 +- .../linux/config_files/portableDefs.h | 2 +- .../unit_test/linux/config_files/portmacro.h | 2 +- tests/unit_test/linux/utils/iot_atomic.h | 2 +- tests/unit_test/linux/utils/task_control.c | 2 +- tests/unit_test/linux/utils/task_control.h | 2 +- tests/unit_test/linux/utils/wait_for_event.c | 2 +- tests/unit_test/linux/utils/wait_for_event.h | 2 +- tools/aws_config_quick_start/configure.json | 10 +- tools/cbmc/.gitignore | 2 + ...flow-assert-from-xQueueGenericCreate.patch | 20 - ...low-asserts-from-xQueueGenericCreate.patch | 13 + tools/cbmc/patches/patch.py | 2 +- tools/cbmc/proofs/CMakeLists.txt | 5 - .../DHCP/DHCPProcess/DHCPProcess_harness.c | 8 +- tools/cbmc/proofs/HTTP/CMakeLists.txt | 19 - .../IotHttpsClient_AddHeader/CMakeLists.txt | 27 - .../IotHttpsClient_AddHeader_harness.c | 57 - .../IotHttpsClient_AddHeader/Makefile.json | 40 - .../IotHttpsClient_Connect/CMakeLists.txt | 31 - .../IotHttpsClient_Connect_harness.c | 29 - .../HTTP/IotHttpsClient_Connect/Makefile.json | 43 - .../IotHttpsClient_Disconnect/CMakeLists.txt | 32 - .../IotHttpsClient_Disconnect_harness.c | 20 - .../IotHttpsClient_Disconnect/Makefile.json | 43 - .../CMakeLists.txt | 23 - ...IotHttpsClient_ReadContentLength_harness.c | 24 - .../Makefile.json | 35 - .../IotHttpsClient_ReadHeader/CMakeLists.txt | 29 - .../IotHttpsClient_ReadHeader_harness.c | 31 - .../IotHttpsClient_ReadHeader/Makefile.json | 46 - .../CMakeLists.txt | 23 - ...otHttpsClient_ReadResponseStatus_harness.c | 17 - .../Makefile.json | 35 - .../IotHttpsClient_SendSync/CMakeLists.txt | 32 - .../IotHttpsClient_SendSync_harness.c | 66 - .../IotHttpsClient_SendSync/Makefile.json | 42 - tools/cbmc/proofs/HTTP/global_state_HTTP.c | 442 - tools/cbmc/proofs/Makefile.template | 48 +- tools/cbmc/proofs/MakefileCommon.json | 3 - tools/cbmc/proofs/MakefileLinux.json | 2 +- tools/cbmc/proofs/make_common_makefile.py | 10 + tools/cbmc/proofs/make_type_header_files.py | 2 +- tools/cbmc/proofs/run-cbmc-proofs.py | 313 + tools/cmake/afr.cmake | 18 +- tools/cmake/afr_metadata.cmake | 8 + tools/cmake/afr_module.cmake | 14 + tools/litani | 1 + tools/ota_e2e_tests/poetry.lock | 152 +- .../WICED_SDK/apps/demo/aws_demo/aws_demo.mk | 33 +- .../WICED_SDK/apps/test/aws_test/aws_test.mk | 11 +- .../cypress/WICED_SDK/libraries/aws/aws.mk | 14 +- .../CY8CKIT_064S0S2_4343W/CMakeLists.txt | 4 + .../aws_demos/config_files/aws_demo_config.h | 10 +- .../aws_demos/config_files/core_http_config.h | 52 + .../aws_demos/config_files/defender_config.h | 50 + .../config_files/defender_demo_config.h | 107 + .../http_demo_mutual_auth_config.h | 131 + .../http_demo_s3_download_config.h | 137 + ...tp_demo_s3_download_multithreaded_config.h | 143 + .../config_files/http_demo_s3_upload_config.h | 140 + .../aws_demos/config_files/iot_config.h | 6 + .../aws_demos/config_files/jobs_demo_config.h | 138 + .../aws_demos/config_files/lwipopts.h | 33 +- .../aws_tests/application_code/main.c | 4 +- .../config_files/aws_test_runner_config.h | 42 +- .../aws_tests/config_files/core_http_config.h | 52 + .../aws_tests/config_files/defender_config.h | 50 + .../aws_tests/config_files/iot_config.h | 22 +- .../aws_demos/config_files/aws_demo_config.h | 11 +- .../aws_demos/config_files/core_http_config.h | 52 + .../aws_demos/config_files/defender_config.h | 50 + .../config_files/defender_demo_config.h | 107 + .../http_demo_mutual_auth_config.h | 131 + .../http_demo_s3_download_config.h | 137 + ...tp_demo_s3_download_multithreaded_config.h | 143 + .../config_files/http_demo_s3_upload_config.h | 140 + .../aws_demos/config_files/jobs_demo_config.h | 138 + .../aws_demos/config_files/lwipopts.h | 23 +- .../config_files/aws_test_runner_config.h | 2 + .../aws_tests/config_files/core_http_config.h | 52 + .../aws_tests/config_files/defender_config.h | 50 + .../aws_demos/config_files/aws_demo_config.h | 11 +- .../aws_demos/config_files/core_http_config.h | 52 + .../aws_demos/config_files/defender_config.h | 50 + .../config_files/defender_demo_config.h | 107 + .../http_demo_mutual_auth_config.h | 131 + .../http_demo_s3_download_config.h | 137 + ...tp_demo_s3_download_multithreaded_config.h | 143 + .../config_files/http_demo_s3_upload_config.h | 140 + .../aws_demos/config_files/jobs_demo_config.h | 138 + .../aws_demos/config_files/lwipopts.h | 22 +- .../config_files/aws_test_runner_config.h | 2 + .../aws_tests/config_files/core_http_config.h | 52 + .../aws_tests/config_files/defender_config.h | 50 + .../aws_demos/config_files/aws_demo_config.h | 12 +- .../aws_demos/config_files/core_http_config.h | 52 + .../aws_demos/config_files/defender_config.h | 50 + .../config_files/defender_demo_config.h | 107 + .../core_pkcs11_config.h | 23 + .../http_demo_mutual_auth_config.h | 131 + .../http_demo_s3_download_config.h | 137 + ...tp_demo_s3_download_multithreaded_config.h | 143 + .../config_files/http_demo_s3_upload_config.h | 140 + .../aws_demos/config_files/jobs_demo_config.h | 138 + .../aws_tests/config_files/aws_demo_config.h | 4 +- .../config_files/aws_test_runner_config.h | 14 +- .../aws_tests/config_files/core_http_config.h | 52 + .../aws_tests/config_files/defender_config.h | 50 + .../core_pkcs11_config.h | 23 + .../esp_http_server/CMakeLists.txt | 0 .../esp_http_server/component.mk | 0 .../esp32/components/nghttp/CMakeLists.txt | 1 + .../esp32/components/nghttp/component.mk | 2 + .../protocomm/CMakeLists.txt | 0 .../protocomm/component.mk | 0 .../wifi_provisioning/CMakeLists.txt | 0 .../wifi_provisioning/component.mk | 0 .../ble/nimble/iot_ble_hal_gatt_server.c | 67 +- vendors/espressif/esp-idf | 2 +- .../aws_demos/config_files/aws_demo_config.h | 11 +- .../aws_demos/config_files/core_http_config.h | 52 + .../config_files/core_pkcs11_config.h | 16 +- .../aws_demos/config_files/defender_config.h | 50 + .../config_files/defender_demo_config.h | 107 + .../http_demo_mutual_auth_config.h | 131 + .../http_demo_s3_download_config.h | 137 + ...tp_demo_s3_download_multithreaded_config.h | 143 + .../config_files/http_demo_s3_upload_config.h | 140 + .../aws_demos/config_files/jobs_demo_config.h | 138 + .../config_files/aws_test_runner_config.h | 54 +- .../aws_tests/config_files/core_http_config.h | 52 + .../aws_tests/config_files/defender_config.h | 50 + .../CMakeLists.txt | 1 + .../aws_demos/config_files/aws_demo_config.h | 11 +- .../aws_demos/config_files/core_http_config.h | 52 + .../config_files/core_pkcs11_config.h | 33 +- .../aws_demos/config_files/defender_config.h | 50 + .../config_files/defender_demo_config.h | 107 + .../http_demo_mutual_auth_config.h | 131 + .../http_demo_s3_download_config.h | 137 + ...tp_demo_s3_download_multithreaded_config.h | 143 + .../config_files/http_demo_s3_upload_config.h | 140 + .../aws_demos/config_files/jobs_demo_config.h | 138 + .../config_files/aws_test_runner_config.h | 54 +- .../aws_tests/config_files/core_http_config.h | 52 + .../config_files/core_pkcs11_config.h | 23 + .../aws_tests/config_files/defender_config.h | 50 + .../aws_demos/config_files/aws_demo_config.h | 11 +- .../aws_demos/config_files/core_http_config.h | 52 + .../aws_demos/config_files/defender_config.h | 50 + .../config_files/defender_demo_config.h | 107 + .../http_demo_mutual_auth_config.h | 131 + .../http_demo_s3_download_config.h | 137 + ...tp_demo_s3_download_multithreaded_config.h | 143 + .../config_files/http_demo_s3_upload_config.h | 140 + .../aws_demos/config_files/jobs_demo_config.h | 138 + .../config_files/aws_test_runner_config.h | 46 +- .../aws_tests/config_files/core_http_config.h | 52 + .../aws_tests/config_files/defender_config.h | 50 + .../boards/mt7697hx-dev-kit/CMakeLists.txt | 3 + .../aws_demos/application_code/main.c | 3 + .../aws_demos/config_files/aws_demo_config.h | 11 +- .../aws_demos/config_files/core_http_config.h | 52 + .../aws_demos/config_files/defender_config.h | 50 + .../config_files/defender_demo_config.h | 107 + .../http_demo_mutual_auth_config.h | 131 + .../http_demo_s3_download_config.h | 137 + ...tp_demo_s3_download_multithreaded_config.h | 143 + .../config_files/http_demo_s3_upload_config.h | 140 + .../aws_demos/config_files/jobs_demo_config.h | 138 + .../aws_demos/config_files/lwipopts.h | 16 + .../config_files/aws_test_runner_config.h | 46 +- .../aws_tests/config_files/core_http_config.h | 52 + .../aws_tests/config_files/defender_config.h | 50 + vendors/mediatek/lwip/src/netif/ethernetif.c | 7 + .../aws_demos/config_files/aws_demo_config.h | 11 +- .../aws_demos/config_files/core_http_config.h | 52 + .../aws_demos/config_files/defender_config.h | 50 + .../config_files/defender_demo_config.h | 107 + .../http_demo_mutual_auth_config.h | 131 + .../http_demo_s3_download_config.h | 137 + ...tp_demo_s3_download_multithreaded_config.h | 143 + .../config_files/http_demo_s3_upload_config.h | 140 + .../aws_demos/config_files/jobs_demo_config.h | 138 + .../config_files/aws_test_runner_config.h | 48 +- .../aws_tests/config_files/core_http_config.h | 52 + .../aws_tests/config_files/defender_config.h | 50 + .../config_files/core_http_config.h | 52 + .../config_files/jobs_demo_config.h | 138 + .../application_code/aws_demo_logging.c | 37 +- .../aws_demos/config_files/aws_demo_config.h | 7 +- .../aws_demos/config_files/core_http_config.h | 52 + .../config_files/core_pkcs11_config.h | 37 +- .../aws_demos/config_files/defender_config.h | 50 + .../config_files/defender_demo_config.h | 107 + .../http_demo_mutual_auth_config.h | 131 + .../http_demo_s3_download_config.h | 137 + ...tp_demo_s3_download_multithreaded_config.h | 143 + .../config_files/http_demo_s3_upload_config.h | 140 + .../aws_demos/config_files/jobs_demo_config.h | 138 + .../config_files/aws_test_runner_config.h | 2 + .../aws_tests/config_files/core_http_config.h | 52 + .../config_files/core_pkcs11_config.h | 29 +- .../aws_tests/config_files/defender_config.h | 50 + .../aws_demos/config_files/core_http_config.h | 52 + .../aws_demos/config_files/defender_config.h | 50 + .../aws_demos/config_files/jobs_demo_config.h | 138 + .../aws_tests/config_files/core_http_config.h | 52 + .../aws_tests/config_files/defender_config.h | 50 + .../aws_demos/config_files/aws_demo_config.h | 12 +- .../aws_demos/config_files/core_http_config.h | 52 + .../aws_demos/config_files/defender_config.h | 50 + .../config_files/defender_demo_config.h | 107 + .../http_demo_mutual_auth_config.h | 131 + .../http_demo_s3_download_config.h | 137 + ...tp_demo_s3_download_multithreaded_config.h | 143 + .../config_files/http_demo_s3_upload_config.h | 140 + .../aws_demos/config_files/iot_config.h | 6 + .../aws_demos/config_files/jobs_demo_config.h | 138 + .../config_files/aws_test_runner_config.h | 2 + .../aws_tests/config_files/core_http_config.h | 52 + .../aws_tests/config_files/defender_config.h | 50 + .../aws_tests/config_files/iot_config.h | 12 +- .../aws_demos/config_files/aws_demo_config.h | 11 +- .../aws_demos/config_files/core_http_config.h | 52 + .../aws_demos/config_files/defender_config.h | 50 + .../config_files/defender_demo_config.h | 107 + .../http_demo_mutual_auth_config.h | 131 + .../http_demo_s3_download_config.h | 137 + ...tp_demo_s3_download_multithreaded_config.h | 143 + .../config_files/http_demo_s3_upload_config.h | 140 + .../aws_demos/config_files/jobs_demo_config.h | 138 + .../config_files/aws_test_runner_config.h | 46 +- .../aws_tests/config_files/core_http_config.h | 52 + .../aws_tests/config_files/defender_config.h | 50 + .../application_code/aws_demo_logging.c | 37 +- .../aws_demos/config_files/aws_demo_config.h | 11 +- .../aws_demos/config_files/core_http_config.h | 52 + .../aws_demos/config_files/defender_config.h | 50 + .../config_files/defender_demo_config.h | 107 + .../http_demo_mutual_auth_config.h | 131 + .../http_demo_s3_download_config.h | 137 + ...tp_demo_s3_download_multithreaded_config.h | 143 + .../config_files/http_demo_s3_upload_config.h | 140 + .../aws_demos/config_files/jobs_demo_config.h | 138 + .../config_files/aws_test_runner_config.h | 2 + .../aws_tests/config_files/core_http_config.h | 52 + .../aws_tests/config_files/defender_config.h | 50 + .../windows/ports/pkcs11/core_pkcs11_pal.c | 8 +- .../aws_demos/config_files/aws_demo_config.h | 11 +- .../aws_demos/config_files/core_http_config.h | 52 + .../aws_demos/config_files/defender_config.h | 50 + .../config_files/defender_demo_config.h | 107 + .../http_demo_mutual_auth_config.h | 131 + .../http_demo_s3_download_config.h | 137 + ...tp_demo_s3_download_multithreaded_config.h | 143 + .../config_files/http_demo_s3_upload_config.h | 140 + .../aws_demos/config_files/jobs_demo_config.h | 138 + .../config_files/aws_test_runner_config.h | 34 +- .../aws_tests/config_files/core_http_config.h | 52 + .../aws_tests/config_files/defender_config.h | 50 + .../aws_demos/config_files/aws_demo_config.h | 11 +- .../aws_demos/config_files/core_http_config.h | 52 + .../aws_demos/config_files/defender_config.h | 50 + .../config_files/defender_demo_config.h | 107 + .../http_demo_mutual_auth_config.h | 131 + .../http_demo_s3_download_config.h | 137 + ...tp_demo_s3_download_multithreaded_config.h | 143 + .../config_files/http_demo_s3_upload_config.h | 140 + .../aws_demos/config_files/iot_config.h | 4 + .../aws_demos/config_files/jobs_demo_config.h | 138 + .../config_files/aws_test_runner_config.h | 2 + .../aws_tests/config_files/core_http_config.h | 52 + .../aws_tests/config_files/defender_config.h | 50 + .../aws_tests/config_files/iot_config.h | 9 +- .../aws_demos/config_files/aws_demo_config.h | 11 +- .../aws_demos/config_files/core_http_config.h | 52 + .../aws_demos/config_files/defender_config.h | 50 + .../config_files/defender_demo_config.h | 107 + .../http_demo_mutual_auth_config.h | 137 + .../http_demo_s3_download_config.h | 137 + ...tp_demo_s3_download_multithreaded_config.h | 143 + .../config_files/http_demo_s3_upload_config.h | 140 + .../aws_demos/config_files/iot_config.h | 4 + .../aws_demos/config_files/jobs_demo_config.h | 138 + .../config_files/aws_test_runner_config.h | 4 + .../aws_tests/config_files/core_http_config.h | 52 + .../aws_tests/config_files/defender_config.h | 50 + .../aws_tests/config_files/iot_config.h | 8 +- .../aws_demos/config_files/aws_demo_config.h | 11 +- .../aws_demos/config_files/core_http_config.h | 52 + .../aws_demos/config_files/defender_config.h | 50 + .../config_files/defender_demo_config.h | 107 + .../http_demo_mutual_auth_config.h | 131 + .../http_demo_s3_download_config.h | 137 + ...tp_demo_s3_download_multithreaded_config.h | 143 + .../config_files/http_demo_s3_upload_config.h | 140 + .../aws_demos/config_files/jobs_demo_config.h | 138 + .../config_files/aws_test_runner_config.h | 44 +- .../aws_tests/config_files/core_http_config.h | 52 + .../aws_tests/config_files/defender_config.h | 50 + .../aws_demos/config_files/aws_demo_config.h | 11 +- .../aws_demos/config_files/core_http_config.h | 52 + .../aws_demos/config_files/defender_config.h | 50 + .../config_files/defender_demo_config.h | 107 + .../http_demo_mutual_auth_config.h | 131 + .../http_demo_s3_download_config.h | 137 + ...tp_demo_s3_download_multithreaded_config.h | 143 + .../config_files/http_demo_s3_upload_config.h | 140 + .../aws_demos/config_files/jobs_demo_config.h | 138 + .../config_files/aws_test_runner_config.h | 44 +- .../aws_tests/config_files/core_http_config.h | 52 + .../aws_tests/config_files/defender_config.h | 50 + 676 files changed, 41152 insertions(+), 14875 deletions(-) create mode 100644 demos/common/http_demo_helpers/CMakeLists.txt create mode 100644 demos/common/http_demo_helpers/http_demo_utils.c create mode 100644 demos/common/http_demo_helpers/http_demo_utils.h create mode 100644 demos/common/http_demo_helpers/presigned_url_generator/README.md create mode 100644 demos/common/http_demo_helpers/presigned_url_generator/presigned_urls_gen.py create mode 100644 demos/common/mqtt_demo_helpers/CMakeLists.txt rename demos/{device_shadow_for_aws/shadow_demo_helpers.c => common/mqtt_demo_helpers/mqtt_demo_helpers.c} (74%) rename demos/{device_shadow_for_aws/shadow_demo_helpers.h => common/mqtt_demo_helpers/mqtt_demo_helpers.h} (60%) create mode 100644 demos/common/pkcs11_helpers/CMakeLists.txt create mode 100644 demos/common/pkcs11_helpers/pkcs11_helpers.c create mode 100644 demos/common/pkcs11_helpers/pkcs11_helpers.h create mode 100644 demos/coreHTTP/CMakeLists.txt create mode 100644 demos/coreHTTP/http_demo_mutual_auth.c create mode 100644 demos/coreHTTP/http_demo_s3_download.c create mode 100644 demos/coreHTTP/http_demo_s3_download_multithreaded.c create mode 100644 demos/coreHTTP/http_demo_s3_upload.c delete mode 100644 demos/defender/CMakeLists.txt delete mode 100644 demos/defender/aws_iot_demo_defender.c create mode 100644 demos/device_defender_for_aws/CMakeLists.txt create mode 100644 demos/device_defender_for_aws/defender_demo.c create mode 100644 demos/device_defender_for_aws/metrics_collector.h create mode 100644 demos/device_defender_for_aws/metrics_collector/freertos_plus_tcp/metrics_collector.c create mode 100644 demos/device_defender_for_aws/metrics_collector/lwip/metrics_collector.c create mode 100644 demos/device_defender_for_aws/metrics_collector/lwip/netif_port.h create mode 100644 demos/device_defender_for_aws/metrics_collector/stub/metrics_collector.c create mode 100644 demos/device_defender_for_aws/report_builder.c create mode 100644 demos/device_defender_for_aws/report_builder.h delete mode 100644 demos/https/CMakeLists.txt delete mode 100644 demos/https/README.md delete mode 100644 demos/https/iot_demo_https_common.c delete mode 100644 demos/https/iot_demo_https_common.h delete mode 100644 demos/https/iot_demo_https_s3_download_async.c delete mode 100644 demos/https/iot_demo_https_s3_download_sync.c delete mode 100755 demos/https/iot_demo_https_s3_upload_async.c delete mode 100644 demos/https/iot_demo_https_s3_upload_sync.c delete mode 100644 demos/https/presigned_urls_gen.py create mode 100644 demos/jobs_for_aws/CMakeLists.txt create mode 100755 demos/jobs_for_aws/jobs_demo.c delete mode 160000 libraries/3rdparty/http_parser create mode 100644 libraries/3rdparty/jsmn/LICENSE create mode 100644 libraries/3rdparty/mbedtls_config/threading_alt.h create mode 160000 libraries/abstractions/backoff_algorithm create mode 100644 libraries/abstractions/backoff_algorithm.cmake delete mode 100644 libraries/abstractions/retry_utils/CMakeLists.txt delete mode 100644 libraries/abstractions/retry_utils/freertos/retry_utils_freertos.c delete mode 100644 libraries/abstractions/retry_utils/retry_utils.h create mode 100644 libraries/c_sdk/standard/https/CODESIZE.md create mode 100644 libraries/c_sdk/standard/https/README.md create mode 100644 libraries/c_sdk/standard/mqtt/CODESIZE.md create mode 160000 libraries/coreHTTP create mode 100644 libraries/core_http_demo_dependencies.cmake create mode 100644 libraries/device_defender_demo_dependencies.cmake create mode 160000 libraries/device_defender_for_aws create mode 100644 libraries/freertos_plus/standard/freertos_plus_tcp_utils.cmake create mode 100644 libraries/jobs_demo_dependencies.cmake create mode 160000 libraries/jobs_for_aws create mode 100644 projects/ti/CC3220SF_LAUNCHXL/ccs/aws_tests/.ccsproject create mode 100644 tests/integration_test/core_http_system_test.c delete mode 100644 tools/cbmc/patches/0008-Remove-overflow-assert-from-xQueueGenericCreate.patch create mode 100644 tools/cbmc/patches/0009-Remove-overflow-asserts-from-xQueueGenericCreate.patch delete mode 100644 tools/cbmc/proofs/HTTP/CMakeLists.txt delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_AddHeader/CMakeLists.txt delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_AddHeader/IotHttpsClient_AddHeader_harness.c delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_AddHeader/Makefile.json delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_Connect/CMakeLists.txt delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_Connect/IotHttpsClient_Connect_harness.c delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_Connect/Makefile.json delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_Disconnect/CMakeLists.txt delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_Disconnect/IotHttpsClient_Disconnect_harness.c delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_Disconnect/Makefile.json delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_ReadContentLength/CMakeLists.txt delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_ReadContentLength/IotHttpsClient_ReadContentLength_harness.c delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_ReadContentLength/Makefile.json delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_ReadHeader/CMakeLists.txt delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_ReadHeader/IotHttpsClient_ReadHeader_harness.c delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_ReadHeader/Makefile.json delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_ReadResponseStatus/CMakeLists.txt delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_ReadResponseStatus/IotHttpsClient_ReadResponseStatus_harness.c delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_ReadResponseStatus/Makefile.json delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_SendSync/CMakeLists.txt delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_SendSync/IotHttpsClient_SendSync_harness.c delete mode 100644 tools/cbmc/proofs/HTTP/IotHttpsClient_SendSync/Makefile.json delete mode 100644 tools/cbmc/proofs/HTTP/global_state_HTTP.c create mode 100755 tools/cbmc/proofs/run-cbmc-proofs.py create mode 160000 tools/litani create mode 100644 vendors/cypress/boards/CY8CKIT_064S0S2_4343W/aws_demos/config_files/core_http_config.h create mode 100644 vendors/cypress/boards/CY8CKIT_064S0S2_4343W/aws_demos/config_files/defender_config.h create mode 100644 vendors/cypress/boards/CY8CKIT_064S0S2_4343W/aws_demos/config_files/defender_demo_config.h create mode 100644 vendors/cypress/boards/CY8CKIT_064S0S2_4343W/aws_demos/config_files/http_demo_mutual_auth_config.h create mode 100644 vendors/cypress/boards/CY8CKIT_064S0S2_4343W/aws_demos/config_files/http_demo_s3_download_config.h create mode 100644 vendors/cypress/boards/CY8CKIT_064S0S2_4343W/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h create mode 100644 vendors/cypress/boards/CY8CKIT_064S0S2_4343W/aws_demos/config_files/http_demo_s3_upload_config.h create mode 100755 vendors/cypress/boards/CY8CKIT_064S0S2_4343W/aws_demos/config_files/jobs_demo_config.h create mode 100644 vendors/cypress/boards/CY8CKIT_064S0S2_4343W/aws_tests/config_files/core_http_config.h create mode 100644 vendors/cypress/boards/CY8CKIT_064S0S2_4343W/aws_tests/config_files/defender_config.h create mode 100644 vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/core_http_config.h create mode 100644 vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/defender_config.h create mode 100644 vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/defender_demo_config.h create mode 100644 vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/http_demo_mutual_auth_config.h create mode 100644 vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/http_demo_s3_download_config.h create mode 100644 vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h create mode 100644 vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/http_demo_s3_upload_config.h create mode 100755 vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/jobs_demo_config.h create mode 100644 vendors/cypress/boards/CYW943907AEVAL1F/aws_tests/config_files/core_http_config.h create mode 100644 vendors/cypress/boards/CYW943907AEVAL1F/aws_tests/config_files/defender_config.h create mode 100644 vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/core_http_config.h create mode 100644 vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/defender_config.h create mode 100644 vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/defender_demo_config.h create mode 100644 vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/http_demo_mutual_auth_config.h create mode 100644 vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/http_demo_s3_download_config.h create mode 100644 vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h create mode 100644 vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/http_demo_s3_upload_config.h create mode 100755 vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/jobs_demo_config.h create mode 100644 vendors/cypress/boards/CYW954907AEVAL1F/aws_tests/config_files/core_http_config.h create mode 100644 vendors/cypress/boards/CYW954907AEVAL1F/aws_tests/config_files/defender_config.h create mode 100644 vendors/espressif/boards/esp32/aws_demos/config_files/core_http_config.h create mode 100644 vendors/espressif/boards/esp32/aws_demos/config_files/defender_config.h create mode 100644 vendors/espressif/boards/esp32/aws_demos/config_files/defender_demo_config.h create mode 100644 vendors/espressif/boards/esp32/aws_demos/config_files/http_demo_mutual_auth_config.h create mode 100644 vendors/espressif/boards/esp32/aws_demos/config_files/http_demo_s3_download_config.h create mode 100644 vendors/espressif/boards/esp32/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h create mode 100644 vendors/espressif/boards/esp32/aws_demos/config_files/http_demo_s3_upload_config.h create mode 100755 vendors/espressif/boards/esp32/aws_demos/config_files/jobs_demo_config.h create mode 100644 vendors/espressif/boards/esp32/aws_tests/config_files/core_http_config.h create mode 100644 vendors/espressif/boards/esp32/aws_tests/config_files/defender_config.h rename vendors/espressif/boards/esp32/components/{freertos_tcpip => }/esp_http_server/CMakeLists.txt (100%) rename vendors/espressif/boards/esp32/components/{freertos_tcpip => }/esp_http_server/component.mk (100%) create mode 100644 vendors/espressif/boards/esp32/components/nghttp/CMakeLists.txt create mode 100644 vendors/espressif/boards/esp32/components/nghttp/component.mk rename vendors/espressif/boards/esp32/components/{freertos_tcpip => }/protocomm/CMakeLists.txt (100%) rename vendors/espressif/boards/esp32/components/{freertos_tcpip => }/protocomm/component.mk (100%) rename vendors/espressif/boards/esp32/components/{freertos_tcpip => }/wifi_provisioning/CMakeLists.txt (100%) rename vendors/espressif/boards/esp32/components/{freertos_tcpip => }/wifi_provisioning/component.mk (100%) create mode 100644 vendors/infineon/boards/xmc4800_iotkit/aws_demos/config_files/core_http_config.h create mode 100644 vendors/infineon/boards/xmc4800_iotkit/aws_demos/config_files/defender_config.h create mode 100644 vendors/infineon/boards/xmc4800_iotkit/aws_demos/config_files/defender_demo_config.h create mode 100644 vendors/infineon/boards/xmc4800_iotkit/aws_demos/config_files/http_demo_mutual_auth_config.h create mode 100644 vendors/infineon/boards/xmc4800_iotkit/aws_demos/config_files/http_demo_s3_download_config.h create mode 100644 vendors/infineon/boards/xmc4800_iotkit/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h create mode 100644 vendors/infineon/boards/xmc4800_iotkit/aws_demos/config_files/http_demo_s3_upload_config.h create mode 100755 vendors/infineon/boards/xmc4800_iotkit/aws_demos/config_files/jobs_demo_config.h create mode 100644 vendors/infineon/boards/xmc4800_iotkit/aws_tests/config_files/core_http_config.h create mode 100644 vendors/infineon/boards/xmc4800_iotkit/aws_tests/config_files/defender_config.h create mode 100644 vendors/infineon/boards/xmc4800_plus_optiga_trust_x/aws_demos/config_files/core_http_config.h create mode 100644 vendors/infineon/boards/xmc4800_plus_optiga_trust_x/aws_demos/config_files/defender_config.h create mode 100644 vendors/infineon/boards/xmc4800_plus_optiga_trust_x/aws_demos/config_files/defender_demo_config.h create mode 100644 vendors/infineon/boards/xmc4800_plus_optiga_trust_x/aws_demos/config_files/http_demo_mutual_auth_config.h create mode 100644 vendors/infineon/boards/xmc4800_plus_optiga_trust_x/aws_demos/config_files/http_demo_s3_download_config.h create mode 100644 vendors/infineon/boards/xmc4800_plus_optiga_trust_x/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h create mode 100644 vendors/infineon/boards/xmc4800_plus_optiga_trust_x/aws_demos/config_files/http_demo_s3_upload_config.h create mode 100755 vendors/infineon/boards/xmc4800_plus_optiga_trust_x/aws_demos/config_files/jobs_demo_config.h create mode 100644 vendors/infineon/boards/xmc4800_plus_optiga_trust_x/aws_tests/config_files/core_http_config.h create mode 100644 vendors/infineon/boards/xmc4800_plus_optiga_trust_x/aws_tests/config_files/defender_config.h create mode 100644 vendors/marvell/boards/mw300_rd/aws_demos/config_files/core_http_config.h create mode 100644 vendors/marvell/boards/mw300_rd/aws_demos/config_files/defender_config.h create mode 100644 vendors/marvell/boards/mw300_rd/aws_demos/config_files/defender_demo_config.h create mode 100644 vendors/marvell/boards/mw300_rd/aws_demos/config_files/http_demo_mutual_auth_config.h create mode 100644 vendors/marvell/boards/mw300_rd/aws_demos/config_files/http_demo_s3_download_config.h create mode 100644 vendors/marvell/boards/mw300_rd/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h create mode 100644 vendors/marvell/boards/mw300_rd/aws_demos/config_files/http_demo_s3_upload_config.h create mode 100755 vendors/marvell/boards/mw300_rd/aws_demos/config_files/jobs_demo_config.h create mode 100644 vendors/marvell/boards/mw300_rd/aws_tests/config_files/core_http_config.h create mode 100644 vendors/marvell/boards/mw300_rd/aws_tests/config_files/defender_config.h create mode 100644 vendors/mediatek/boards/mt7697hx-dev-kit/aws_demos/config_files/core_http_config.h create mode 100644 vendors/mediatek/boards/mt7697hx-dev-kit/aws_demos/config_files/defender_config.h create mode 100644 vendors/mediatek/boards/mt7697hx-dev-kit/aws_demos/config_files/defender_demo_config.h create mode 100644 vendors/mediatek/boards/mt7697hx-dev-kit/aws_demos/config_files/http_demo_mutual_auth_config.h create mode 100644 vendors/mediatek/boards/mt7697hx-dev-kit/aws_demos/config_files/http_demo_s3_download_config.h create mode 100644 vendors/mediatek/boards/mt7697hx-dev-kit/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h create mode 100644 vendors/mediatek/boards/mt7697hx-dev-kit/aws_demos/config_files/http_demo_s3_upload_config.h create mode 100755 vendors/mediatek/boards/mt7697hx-dev-kit/aws_demos/config_files/jobs_demo_config.h create mode 100644 vendors/mediatek/boards/mt7697hx-dev-kit/aws_tests/config_files/core_http_config.h create mode 100644 vendors/mediatek/boards/mt7697hx-dev-kit/aws_tests/config_files/defender_config.h create mode 100644 vendors/microchip/boards/curiosity_pic32mzef/aws_demos/config_files/core_http_config.h create mode 100644 vendors/microchip/boards/curiosity_pic32mzef/aws_demos/config_files/defender_config.h create mode 100644 vendors/microchip/boards/curiosity_pic32mzef/aws_demos/config_files/defender_demo_config.h create mode 100644 vendors/microchip/boards/curiosity_pic32mzef/aws_demos/config_files/http_demo_mutual_auth_config.h create mode 100644 vendors/microchip/boards/curiosity_pic32mzef/aws_demos/config_files/http_demo_s3_download_config.h create mode 100644 vendors/microchip/boards/curiosity_pic32mzef/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h create mode 100644 vendors/microchip/boards/curiosity_pic32mzef/aws_demos/config_files/http_demo_s3_upload_config.h create mode 100755 vendors/microchip/boards/curiosity_pic32mzef/aws_demos/config_files/jobs_demo_config.h create mode 100644 vendors/microchip/boards/curiosity_pic32mzef/aws_tests/config_files/core_http_config.h create mode 100644 vendors/microchip/boards/curiosity_pic32mzef/aws_tests/config_files/defender_config.h create mode 100644 vendors/microchip/boards/curiosity_pic32mzef/bootloader/config_files/core_http_config.h create mode 100755 vendors/microchip/boards/curiosity_pic32mzef/bootloader/config_files/jobs_demo_config.h create mode 100644 vendors/microchip/boards/ecc608a_plus_winsim/aws_demos/config_files/core_http_config.h create mode 100644 vendors/microchip/boards/ecc608a_plus_winsim/aws_demos/config_files/defender_config.h create mode 100644 vendors/microchip/boards/ecc608a_plus_winsim/aws_demos/config_files/defender_demo_config.h create mode 100644 vendors/microchip/boards/ecc608a_plus_winsim/aws_demos/config_files/http_demo_mutual_auth_config.h create mode 100644 vendors/microchip/boards/ecc608a_plus_winsim/aws_demos/config_files/http_demo_s3_download_config.h create mode 100644 vendors/microchip/boards/ecc608a_plus_winsim/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h create mode 100644 vendors/microchip/boards/ecc608a_plus_winsim/aws_demos/config_files/http_demo_s3_upload_config.h create mode 100755 vendors/microchip/boards/ecc608a_plus_winsim/aws_demos/config_files/jobs_demo_config.h create mode 100644 vendors/microchip/boards/ecc608a_plus_winsim/aws_tests/config_files/core_http_config.h create mode 100644 vendors/microchip/boards/ecc608a_plus_winsim/aws_tests/config_files/defender_config.h create mode 100644 vendors/nordic/boards/nrf52840-dk/aws_demos/config_files/core_http_config.h create mode 100644 vendors/nordic/boards/nrf52840-dk/aws_demos/config_files/defender_config.h create mode 100755 vendors/nordic/boards/nrf52840-dk/aws_demos/config_files/jobs_demo_config.h create mode 100644 vendors/nordic/boards/nrf52840-dk/aws_tests/config_files/core_http_config.h create mode 100644 vendors/nordic/boards/nrf52840-dk/aws_tests/config_files/defender_config.h create mode 100644 vendors/nuvoton/boards/numaker_iot_m487_wifi/aws_demos/config_files/core_http_config.h create mode 100644 vendors/nuvoton/boards/numaker_iot_m487_wifi/aws_demos/config_files/defender_config.h create mode 100644 vendors/nuvoton/boards/numaker_iot_m487_wifi/aws_demos/config_files/defender_demo_config.h create mode 100644 vendors/nuvoton/boards/numaker_iot_m487_wifi/aws_demos/config_files/http_demo_mutual_auth_config.h create mode 100644 vendors/nuvoton/boards/numaker_iot_m487_wifi/aws_demos/config_files/http_demo_s3_download_config.h create mode 100644 vendors/nuvoton/boards/numaker_iot_m487_wifi/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h create mode 100644 vendors/nuvoton/boards/numaker_iot_m487_wifi/aws_demos/config_files/http_demo_s3_upload_config.h create mode 100755 vendors/nuvoton/boards/numaker_iot_m487_wifi/aws_demos/config_files/jobs_demo_config.h create mode 100644 vendors/nuvoton/boards/numaker_iot_m487_wifi/aws_tests/config_files/core_http_config.h create mode 100644 vendors/nuvoton/boards/numaker_iot_m487_wifi/aws_tests/config_files/defender_config.h create mode 100644 vendors/nxp/boards/lpc54018iotmodule/aws_demos/config_files/core_http_config.h create mode 100644 vendors/nxp/boards/lpc54018iotmodule/aws_demos/config_files/defender_config.h create mode 100644 vendors/nxp/boards/lpc54018iotmodule/aws_demos/config_files/defender_demo_config.h create mode 100644 vendors/nxp/boards/lpc54018iotmodule/aws_demos/config_files/http_demo_mutual_auth_config.h create mode 100644 vendors/nxp/boards/lpc54018iotmodule/aws_demos/config_files/http_demo_s3_download_config.h create mode 100644 vendors/nxp/boards/lpc54018iotmodule/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h create mode 100644 vendors/nxp/boards/lpc54018iotmodule/aws_demos/config_files/http_demo_s3_upload_config.h create mode 100755 vendors/nxp/boards/lpc54018iotmodule/aws_demos/config_files/jobs_demo_config.h create mode 100644 vendors/nxp/boards/lpc54018iotmodule/aws_tests/config_files/core_http_config.h create mode 100644 vendors/nxp/boards/lpc54018iotmodule/aws_tests/config_files/defender_config.h create mode 100644 vendors/pc/boards/windows/aws_demos/config_files/core_http_config.h create mode 100644 vendors/pc/boards/windows/aws_demos/config_files/defender_config.h create mode 100644 vendors/pc/boards/windows/aws_demos/config_files/defender_demo_config.h create mode 100644 vendors/pc/boards/windows/aws_demos/config_files/http_demo_mutual_auth_config.h create mode 100644 vendors/pc/boards/windows/aws_demos/config_files/http_demo_s3_download_config.h create mode 100644 vendors/pc/boards/windows/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h create mode 100644 vendors/pc/boards/windows/aws_demos/config_files/http_demo_s3_upload_config.h create mode 100755 vendors/pc/boards/windows/aws_demos/config_files/jobs_demo_config.h create mode 100644 vendors/pc/boards/windows/aws_tests/config_files/core_http_config.h create mode 100644 vendors/pc/boards/windows/aws_tests/config_files/defender_config.h create mode 100644 vendors/renesas/boards/rx65n-rsk/aws_demos/config_files/core_http_config.h create mode 100644 vendors/renesas/boards/rx65n-rsk/aws_demos/config_files/defender_config.h create mode 100644 vendors/renesas/boards/rx65n-rsk/aws_demos/config_files/defender_demo_config.h create mode 100644 vendors/renesas/boards/rx65n-rsk/aws_demos/config_files/http_demo_mutual_auth_config.h create mode 100644 vendors/renesas/boards/rx65n-rsk/aws_demos/config_files/http_demo_s3_download_config.h create mode 100644 vendors/renesas/boards/rx65n-rsk/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h create mode 100644 vendors/renesas/boards/rx65n-rsk/aws_demos/config_files/http_demo_s3_upload_config.h create mode 100755 vendors/renesas/boards/rx65n-rsk/aws_demos/config_files/jobs_demo_config.h create mode 100644 vendors/renesas/boards/rx65n-rsk/aws_tests/config_files/core_http_config.h create mode 100644 vendors/renesas/boards/rx65n-rsk/aws_tests/config_files/defender_config.h create mode 100644 vendors/st/boards/stm32l475_discovery/aws_demos/config_files/core_http_config.h create mode 100644 vendors/st/boards/stm32l475_discovery/aws_demos/config_files/defender_config.h create mode 100644 vendors/st/boards/stm32l475_discovery/aws_demos/config_files/defender_demo_config.h create mode 100644 vendors/st/boards/stm32l475_discovery/aws_demos/config_files/http_demo_mutual_auth_config.h create mode 100644 vendors/st/boards/stm32l475_discovery/aws_demos/config_files/http_demo_s3_download_config.h create mode 100644 vendors/st/boards/stm32l475_discovery/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h create mode 100644 vendors/st/boards/stm32l475_discovery/aws_demos/config_files/http_demo_s3_upload_config.h create mode 100755 vendors/st/boards/stm32l475_discovery/aws_demos/config_files/jobs_demo_config.h create mode 100644 vendors/st/boards/stm32l475_discovery/aws_tests/config_files/core_http_config.h create mode 100644 vendors/st/boards/stm32l475_discovery/aws_tests/config_files/defender_config.h create mode 100644 vendors/ti/boards/cc3220_launchpad/aws_demos/config_files/core_http_config.h create mode 100644 vendors/ti/boards/cc3220_launchpad/aws_demos/config_files/defender_config.h create mode 100644 vendors/ti/boards/cc3220_launchpad/aws_demos/config_files/defender_demo_config.h create mode 100644 vendors/ti/boards/cc3220_launchpad/aws_demos/config_files/http_demo_mutual_auth_config.h create mode 100644 vendors/ti/boards/cc3220_launchpad/aws_demos/config_files/http_demo_s3_download_config.h create mode 100644 vendors/ti/boards/cc3220_launchpad/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h create mode 100644 vendors/ti/boards/cc3220_launchpad/aws_demos/config_files/http_demo_s3_upload_config.h create mode 100755 vendors/ti/boards/cc3220_launchpad/aws_demos/config_files/jobs_demo_config.h create mode 100644 vendors/ti/boards/cc3220_launchpad/aws_tests/config_files/core_http_config.h create mode 100644 vendors/ti/boards/cc3220_launchpad/aws_tests/config_files/defender_config.h create mode 100644 vendors/vendor/boards/board/aws_demos/config_files/core_http_config.h create mode 100644 vendors/vendor/boards/board/aws_demos/config_files/defender_config.h create mode 100644 vendors/vendor/boards/board/aws_demos/config_files/defender_demo_config.h create mode 100644 vendors/vendor/boards/board/aws_demos/config_files/http_demo_mutual_auth_config.h create mode 100644 vendors/vendor/boards/board/aws_demos/config_files/http_demo_s3_download_config.h create mode 100644 vendors/vendor/boards/board/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h create mode 100644 vendors/vendor/boards/board/aws_demos/config_files/http_demo_s3_upload_config.h create mode 100755 vendors/vendor/boards/board/aws_demos/config_files/jobs_demo_config.h create mode 100644 vendors/vendor/boards/board/aws_tests/config_files/core_http_config.h create mode 100644 vendors/vendor/boards/board/aws_tests/config_files/defender_config.h create mode 100644 vendors/xilinx/boards/microzed/aws_demos/config_files/core_http_config.h create mode 100644 vendors/xilinx/boards/microzed/aws_demos/config_files/defender_config.h create mode 100644 vendors/xilinx/boards/microzed/aws_demos/config_files/defender_demo_config.h create mode 100644 vendors/xilinx/boards/microzed/aws_demos/config_files/http_demo_mutual_auth_config.h create mode 100644 vendors/xilinx/boards/microzed/aws_demos/config_files/http_demo_s3_download_config.h create mode 100644 vendors/xilinx/boards/microzed/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h create mode 100644 vendors/xilinx/boards/microzed/aws_demos/config_files/http_demo_s3_upload_config.h create mode 100755 vendors/xilinx/boards/microzed/aws_demos/config_files/jobs_demo_config.h create mode 100644 vendors/xilinx/boards/microzed/aws_tests/config_files/core_http_config.h create mode 100644 vendors/xilinx/boards/microzed/aws_tests/config_files/defender_config.h diff --git a/.gitmodules b/.gitmodules index 30c18d7b712..16e21e0708b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,3 @@ -[submodule "http-parser"] - path = libraries/3rdparty/http_parser - url = https://github.com/nodejs/http-parser.git - branch = v2.9.2 [submodule "unity"] path = libraries/3rdparty/unity url = https://github.com/ThrowTheSwitch/Unity.git @@ -45,3 +41,18 @@ [submodule "libraries/device_shadow_for_aws"] path = libraries/device_shadow_for_aws url = https://github.com/aws/device-shadow-for-aws-iot-embedded-sdk.git +[submodule "libraries/coreHTTP"] + path = libraries/coreHTTP + url = https://github.com/FreeRTOS/coreHTTP.git +[submodule "libraries/jobs_for_aws"] + path = libraries/jobs_for_aws + url = https://github.com/aws/jobs-for-aws-iot-embedded-sdk.git +[submodule "libraries/device_defender_for_aws"] + path = libraries/device_defender_for_aws + url = https://github.com/aws/device-defender-for-aws-iot-embedded-sdk.git +[submodule "libraries/abstractions/backoff_algorithm"] + path = libraries/abstractions/backoff_algorithm + url = https://github.com/FreeRTOS/backoffAlgorithm.git +[submodule "tools/litani"] + path = tools/litani + url = https://github.com/awslabs/aws-build-accumulator diff --git a/CHANGELOG.md b/CHANGELOG.md index 192fa89894e..3d4a15813d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,81 @@ # Change Log This repository contains the `FreeRTOS AWS Reference Integrations`, which are pre-integrated FreeRTOS projects that demonstrate connectivity with AWS IoT. The repository contains projects for many different microcontroller evaluation boards. +## 202012.00 December 2020 + +### New Features + +#### coreHTTP v2.0.0 + +- The coreHTTP (https://github.com/FreeRTOS/coreHTTP) library provides the ability to establish an HTTP connection with a server over a customer-implemented transport layer, which can either be a secure channel like a TLS session (mutually authenticated or server-only authentication) or a non-secure channel like a plaintext TCP connection. The HTTP connection can be used to make "GET" (include range requests), "PUT", "POST" and "HEAD" requests. The library provides a mechanism to register a customer-defined callback for receiving parsed header fields in an HTTP response. The library has been refactored for memory optimization, and is a client implementation of a subset of the HTTP/1.1 (https://tools.ietf.org/html/rfc2616) standard. +- See memory requirements for the latest release here (https://docs.aws.amazon.com/embedded-csdk/202011.00/lib-ref/libraries/standard/coreHTTP/docs/doxygen/output/html/index.html#http_memory_requirements). + +#### backoffAlgorithm v1.0.0 + +- The backoffAlgorithm (https://github.com/FreeRTOS/backoffAlgorithm) library is a utility library to calculate backoff period for network operation retries (like failed network connection with server) using an exponential backoff with jitter algorithm. This library uses the "Full Jitter" strategy for the exponential backoff with jitter algorithm. More information about the algorithm can be seen in the Exponential Backoff and Jitter (https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/) AWS blog. +- Exponential backoff with jitter is typically used when retrying a failed connection or network operation with the server. An exponential backoff with jitter helps to mitigate the request failures made to servers, that are caused due to network congestion or high load on the server, by spreading out retry requests across multiple devices. Besides, in an environment with poor connectivity, a client can get disconnected at any time. A backoff strategy helps the client to conserve battery by not repeatedly attempting reconnections when they are unlikely to succeed. +- The backoffAlgorithm library has no dependencies on libraries other than the standard C library. + +#### AWS IoT Device Defender v1.0.1 + +- The AWS IoT Device Defender (https://github.com/aws/device-defender-for-aws-iot-embedded-sdk) library enables you to interact with the AWS IoT Device Defender service to continuously monitor security metrics from devices for deviations from what you have defined as appropriate behavior for each device. If something doesn’t look right, AWS IoT Device Defender sends out an alert so you can take action to remediate the issue. More details about Device Defender can be found in AWS IoT Device Defender documentation (https://docs.aws.amazon.com/iot/latest/developerguide/device-defender.html). +- The AWS IoT Device Defender library has no dependencies on additional libraries other than the standard C library. It also doesn’t have any platform dependencies, such as threading or synchronization. It can be used with any MQTT library and any JSON library (see demos (https://github.com/aws/amazon-freertos/tree/master/demos/device_defender_for_aws) with coreMQTT and coreJSON). +- See memory requirements for the latest release here (https://docs.aws.amazon.com/embedded-csdk/202011.00/lib-ref/libraries/aws/device-defender-for-aws-iot-embedded-sdk/docs/doxygen/output/html/index.html#defender_memory_requirements). + +#### AWS IoT Jobs v1.0.0 + +- The AWS IoT Jobs (https://github.com/aws/jobs-for-aws-iot-embedded-sdk) library enables you to interact with the AWS IoT Jobs service which notifies one or more connected devices of a pending “Job”. A Job can be used to manage your fleet of devices, update firmware and security certificates on your devices, or perform administrative tasks such as restarting devices and performing diagnostics. For documentation of the service, please see the AWS IoT Developer Guide (https://docs.aws.amazon.com/iot/latest/developerguide/iot-jobs.html). Interactions with the Jobs service use the MQTT protocol. This library provides an API to compose and recognize the MQTT topic strings used by the Jobs service. +- The AWS IoT Jobs library has no dependencies on additional libraries other than the standard C library. It also doesn’t have any platform dependencies, such as threading or synchronization. It can be used with any MQTT library and any JSON library (see demos (https://github.com/aws/amazon-freertos/tree/master/demos/jobs_for_aws) with coreMQTT and coreJSON). +- See memory requirements for the latest release (https://docs.aws.amazon.com/embedded-csdk/202011.00/lib-ref/libraries/aws/jobs-for-aws-iot-embedded-sdk/docs/doxygen/output/html/index.html#jobs_memory_requirements)here (https://docs.aws.amazon.com/embedded-csdk/202011.00/lib-ref/libraries/aws/jobs-for-aws-iot-embedded-sdk/docs/doxygen/output/html/index.html#jobs_memory_requirements). + +#### HTTP Compatibility Layer v1.2.0 + +- The HTTP Compatibility Layer provides backwards compatibility from coreHTTP library to HTTPS V1.x.x APIs. In addition, the HTTP Compatibility Layer maintains the dependency of the network abstraction and linear containers from the HTTPS V1.x.x library. The task pool dependency is removed in order to allow the user to allocate tasks on the stack rather than exclusively on the heap. +- Configuration settings using C preprocessor constants, for the HTTP Compatibility Layer, are available in addition to the original configurations of the HTTPS V1.x.x library (https://docs.aws.amazon.com/freertos/latest/lib-ref/html2/https/https_config.html). They can be set with a #define in the config file (iot_config.h) or by using a compiler option such as -D in gcc. If a configuration setting is not defined, the HTTP Compatibility Layer will use a "sensible" default value (unless otherwise noted). Because they are compile-time constants, this HTTP Compatibility Layer must be rebuilt if a configuration setting is changed. + - IOT_HTTPS_DISPATCH_QUEUE_SIZE - The number of requests in the queue that are ready to be sent to the HTTP server. + - IOT_HTTPS_DISPATCH_TASK_COUNT - The number of tasks that are responsible for sending requests from the dispatch queue. + - IOT_HTTPS_DISPATCH_TASK_STACK_SIZE - The stack size of each dispatch task, sized appropriately for each board. + - IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY - If set to 1, the memory used by the dispatch task will be allocated statically by the library. Otherwise, memory will be allocated on the heap. + - IOT_HTTPS_DISPATCH_TASK_PRIORITY - The priority of each dispatch task. This priority is deliberately chosen to match the original taskpool's priority. Doing so prevents starvation of the network-receive task and tasks potentially used by other libraries. +- See memory requirements for the latest release (https://docs.aws.amazon.com/embedded-csdk/202011.00/lib-ref/libraries/aws/jobs-for-aws-iot-embedded-sdk/docs/doxygen/output/html/index.html#jobs_memory_requirements) here (https://github.com/aws/amazon-freertos/blob/master/libraries/c_sdk/standard/https/CODESIZE.md). + +### Updates + +#### FreeRTOS kernel V10.4.3 + +- Includes FreeRTOS kernel V10.4.3 +- Additional details can be found here: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/V10.4.3-kernel-only/History.txt + +#### FreeRTOS-Plus-TCP v2.3.2 + +- When a protocol error occurs during the SYN-phase of a TCP connection, a child socket will now be closed (calling FreeRTOS_closesocket() ), instead of being given the eCLOSE_WAIT status. A client socket, which calls connect() to establish a connection, will receive the eCLOSE_WAIT status, just like before. + +#### coreMQTT v1.1.0 + +- Update logs and format specifiers to use standard C types. +- Add dependence on stdbool.h +- Introduce two new configuration macros for setting the timeout for transport reads and sends. + +#### coreJSON v3.0.0 + +- Added an API function to iterate over a collection in a JSON document. + +#### corePKCS11 v3.0.0 + +- Updated xFindObjectWithLabelAndClass to include a size parameter to allow passing in the size of the label, in order to avoid calling strlen in the library code. +- Added CBMC memory proofs for all functions. +- Removed threading_alt.h from corePKCS11. +- Restructured third party folder in order to align with other core repositories. Folders located in “corePKCS11/3rdparty” are now in “corePKCS11/source/dependency/3rdparty”. +- Updated logs and format specifiers to use standard C types. + +#### AWS IoT Device Shadow v1.0.2 + +- Update logs and format specifiers to use standard C types. + +#### MQTT Compatibility Layer v2.3.1 + +- Fixes for compiler warnings by removing unused functions and variables. + ## 202011.00 November 2020 ### New Features diff --git a/CMakeLists.txt b/CMakeLists.txt index 7dfbe2a41a2..5d004fc2324 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,8 +6,8 @@ if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") endif() project(amazon-freertos) -set(PROJECT_VERSION "202011.00") -set(PROJECT_VERSION_MAJOR "202011") +set(PROJECT_VERSION "202012.00") +set(PROJECT_VERSION_MAJOR "202012") set(PROJECT_VERSION_MINOR "00") # Import global configurations. diff --git a/checksums.json b/checksums.json index b079368b976..f1b4b99eb9d 100644 --- a/checksums.json +++ b/checksums.json @@ -3,5115 +3,4639 @@ "optional_components": [ { "checksums": { - "freertos_kernel/portable/ARMClang/Use-the-GCC-ports.txt": "3c39fa98b62e8a40560cb283f011411ad850c9f521e8b635af7f81a37d5a13cc", - "freertos_kernel/portable/ARMv8M/ReadMe.txt": "f8ee247fe57cc51b810fdd571f04252213a1deb77ef87053afe7320b9fe3a069", - "freertos_kernel/portable/ARMv8M/copy_files.py": "8c8746488aa83b1e803b25ad786416b86d9895641b55f14745ca630488928e49", - "freertos_kernel/portable/ARMv8M/non_secure/ReadMe.txt": "5f7390107fc6c25c53594f63b82655ed2558bf34df857b9b94025141bd05e14d", - "freertos_kernel/portable/ARMv8M/non_secure/port.c": "07d2286023754e9ac344088a278e4694e221960309a177afa4f7c29d0afe5736", - "freertos_kernel/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c": "5b1e60a32388bd0e564a1fb4d6f2a62787511823fe88496d9cb2159c8b1794ed", - "freertos_kernel/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h": "6812b0f9fbf3ef18e80f3322fec6f34482488bd79d0654f8ca899da941129b02", - "freertos_kernel/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c": "dde49ced7de20b4d13d065ff4cb7161ac3ca4feca29486f4946a98bfab8d25dc", - "freertos_kernel/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h": "6812b0f9fbf3ef18e80f3322fec6f34482488bd79d0654f8ca899da941129b02", - "freertos_kernel/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c": "3b541eee7340b4b65241367b7437bd52787fb32869c848dde46959caff2bac26", - "freertos_kernel/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h": "c101e361220d8042cce538b894e2a07884135007bb7dea554759035c33c33a36", - "freertos_kernel/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c": "c048a5a6c1bb1829c843a4b8e48208772347c732f0ef3188ad2060b242c2ee44", - "freertos_kernel/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h": "c101e361220d8042cce538b894e2a07884135007bb7dea554759035c33c33a36", - "freertos_kernel/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s": "2ac3a2ce4b166a6143c46b202ec6a449c058a1fee503b58f9acd5e785c7606ce", - "freertos_kernel/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h": "dd9c3f9a38d432f13d9ed2cb33ade69ca823062ffa8d9128473f56faa4e41d98", - "freertos_kernel/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s": "a790b8ba5baf9252f3a17db84542170fcfff946cd7f01a0070845204fef1c8eb", - "freertos_kernel/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h": "88bf43629dc4fc00e41af1bcb6d7e06e4fbbf26f069b4d771b633d7ed52c1994", - "freertos_kernel/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s": "951e6f3a3ef09bb2bde77b6e3c20b78762939250daf9123cd00a8c3254a847d0", - "freertos_kernel/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h": "4b88d10017de817469888093b1a689ee6da7b33edb5e3006839b238a9bb88513", - "freertos_kernel/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s": "b7cf4bc30a7be99813aa9c3490f51f2c1df2a9e4f3dc050036238b2a9690765d", - "freertos_kernel/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h": "4b88d10017de817469888093b1a689ee6da7b33edb5e3006839b238a9bb88513", - "freertos_kernel/portable/ARMv8M/non_secure/portasm.h": "ca3ceed67f82e3d66da035078959714c43397abfd1e77d0fa4e8d30bd4f02da6", - "freertos_kernel/portable/ARMv8M/secure/ReadMe.txt": "f8ee247fe57cc51b810fdd571f04252213a1deb77ef87053afe7320b9fe3a069", - "freertos_kernel/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c": "e3d2c9965e634804294e8373039cfe49db78ae7cf431d074d363f603e3e5c0be", - "freertos_kernel/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c": "f3d402dc906f5a02c09ab8fa0e2b2b160c31c3648ecd5ddcf0e041b80fe2e1f5", - "freertos_kernel/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port.c": "48d5e08258bacc13c0a4679eb673be334c548a6aa433bbfb823fe2698093fa94", - "freertos_kernel/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s": "18683a26371509e9d65d1be3b3d8d29e39f48b1a78cbeae5c8e897bb628f1cca", - "freertos_kernel/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port.c": "48d5e08258bacc13c0a4679eb673be334c548a6aa433bbfb823fe2698093fa94", - "freertos_kernel/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s": "d1bce7b173f724a7b0e97ffb2841ce19b15d0469bd49bbf9109db735629f844b", - "freertos_kernel/portable/ARMv8M/secure/context/secure_context.c": "7943ce53070eca8060d91beaa5639cd707437ad212e48eacdcd4c5a0a2ab7248", - "freertos_kernel/portable/ARMv8M/secure/context/secure_context.h": "2bb41a95f1bd1643943b8e8fe85bc47faa2dabb53b85682925bf90cf26c47f9d", - "freertos_kernel/portable/ARMv8M/secure/heap/secure_heap.c": "54bcf2164dd0652183cf58d0e4eb1ff325e9f114dd7b008a51b983c672188ec3", - "freertos_kernel/portable/ARMv8M/secure/heap/secure_heap.h": "966d538a419dce23c7855870a02f91bf3adc018a108b791705b69a6cf08514e6", - "freertos_kernel/portable/ARMv8M/secure/init/secure_init.c": "4f1e26736d6b2e59c67b560565f691ebaf2d28cd241d0a385d3a981f9f3a42de", - "freertos_kernel/portable/ARMv8M/secure/init/secure_init.h": "ce593b2b690c85871375c156d059042445cc043777efd2802d31007ab87d210e", - "freertos_kernel/portable/ARMv8M/secure/macros/secure_port_macros.h": "e9a5753528ea62296e0633cc1121df015ab48e645ac04369722a56e608078ce9", - "freertos_kernel/portable/BCC/16BitDOS/Flsh186/port.c": "b2cfbc487383c458b8a4917c37411cc8c7bce4e0307f2a49ecfc87e074de0133", - "freertos_kernel/portable/BCC/16BitDOS/Flsh186/prtmacro.h": "1ba45ef4d18c234a06d6f2b39286ee004e9ab4dd0e4fd4891f2839818874a8df", - "freertos_kernel/portable/BCC/16BitDOS/PC/port.c": "ee835fe9d7d82c59d5726cefe2f1897627befc09262f0efc9cb894b2d6300251", - "freertos_kernel/portable/BCC/16BitDOS/PC/prtmacro.h": "5432a211a07bca76156f81dc8445e85aab850db7b2240f162da89dc0339a9e11", - "freertos_kernel/portable/BCC/16BitDOS/common/portasm.h": "b056e7426978e86513c25dc8af54a9263d63addb56a36a5112c72d0395eb0ac2", - "freertos_kernel/portable/BCC/16BitDOS/common/portcomn.c": "8e764f8a04b3758d80cee490fe824d258e6922780cda734842e86efb62b09de5", - "freertos_kernel/portable/CCS/ARM_CM3/port.c": "ca94d8c6999d1c536e4a923db87a0e1d11c948deaaf9cf6749380c0402ae58bb", - "freertos_kernel/portable/CCS/ARM_CM3/portasm.asm": "cc945829f9534cf7f638e871be787230875f0a8f8e802598654305cd87568454", - "freertos_kernel/portable/CCS/ARM_CM3/portmacro.h": "0c115bf1dda94954600a8164958744a5ff9f65b28ca14245f829e2e78ec2ab75", - "freertos_kernel/portable/CCS/ARM_CM4F/port.c": "f0792c3b574e8d28d73e2752c91d85b0c690798af7cccaf27e9c1a1522b2ec27", - "freertos_kernel/portable/CCS/ARM_CM4F/portasm.asm": "ebe51d4cc6fc0b950314e09c575f8016762f043c44f5cbfbd189b0e49b8c70c2", - "freertos_kernel/portable/CCS/ARM_CM4F/portmacro.h": "c86e7368f7badc18a61a8526aa335ed85478da46e40227a14827ef63617a6530", - "freertos_kernel/portable/CCS/ARM_Cortex-R4/port.c": "4ed5757b71717a7b6fcfc981d72a212e40d793647742ed950d6603c450e585eb", - "freertos_kernel/portable/CCS/ARM_Cortex-R4/portASM.asm": "e1cf3f1ff687d670c576373f7db6257135c96ba3f43253fa2852c2308302d251", - "freertos_kernel/portable/CCS/ARM_Cortex-R4/portmacro.h": "4cba98776c5fbe27c32d700a51c955a464a67d5a1453e7b12b40548e27500436", - "freertos_kernel/portable/CCS/MSP430X/data_model.h": "4379bf2ce155a0df68d20a76c7ba2e49a8263dbc7db6f3ea103026993c198df5", - "freertos_kernel/portable/CCS/MSP430X/port.c": "41ba85141315c5a1aca42bbd00a0a688baaa613c3d99e20d08b100c203504770", - "freertos_kernel/portable/CCS/MSP430X/portext.asm": "39f2e81ab2cb9f152e6714742d042e19df49a6b941b7d969cdcd150a45e324be", - "freertos_kernel/portable/CCS/MSP430X/portmacro.h": "5a86852caca3e3a84cecf73bd94e3751a63b4aa7494b241712e00476beccb1b9", - "freertos_kernel/portable/CodeWarrior/ColdFire_V1/port.c": "a816a3697688dbb8dc1b1f6afc2b88a83144ff00954838637f918d98b0d48f55", - "freertos_kernel/portable/CodeWarrior/ColdFire_V1/portasm.S": "925115791b26cf10238f8354780bd789be2614038f02d1d0fa18420723a892c5", - "freertos_kernel/portable/CodeWarrior/ColdFire_V1/portmacro.h": "cc89257508946c139be0c1999ccd9b372990ecc00af524bd31febde8785b07fe", - "freertos_kernel/portable/CodeWarrior/ColdFire_V2/port.c": "f29a985c10460f808e2d4c5af79764d16cffb3effd52156abf092bce2298c23e", - "freertos_kernel/portable/CodeWarrior/ColdFire_V2/portasm.S": "24de526c381e7e6674681ac94198db35ea77dc2d1bd1111828811a56349066e8", - "freertos_kernel/portable/CodeWarrior/ColdFire_V2/portmacro.h": "47b90ec02ecaa74b5d214c71ba26339a936036ba67886e0ec32b39cbc4029eb0", - "freertos_kernel/portable/CodeWarrior/HCS12/port.c": "e31bffd2634633f491ac01cd1a524c3e45fe3349bceb9ad317d38808e92c3fd9", - "freertos_kernel/portable/CodeWarrior/HCS12/portmacro.h": "115b2e6c897fc59784fdc31fa816c8645ce190c1516e7a51b2d933f9d0335628", - "freertos_kernel/portable/Common/mpu_wrappers.c": "079d6eaadef34584dd09a7ba69bab0ba3eaafb8d7949f83813f83adef4a56f64", - "freertos_kernel/portable/GCC/ARM7_AT91FR40008/port.c": "87b1ec4b83ea67895bf68b03d566b48705003144ba09e755f1ee7658e465acfa", - "freertos_kernel/portable/GCC/ARM7_AT91FR40008/portISR.c": "6a731ae7b664533ddeeb511a99777a09377d2ebeb68fdfd5182187a531bd6219", - "freertos_kernel/portable/GCC/ARM7_AT91FR40008/portmacro.h": "9ca675c58fb8cdd09fad52e9460dd7187080688de3e26365fc4b06b4f38139bf", - "freertos_kernel/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h": "f3a274db2d037202effc40451f7c6679ce51fd2959a2a69780d449470e8ebda4", - "freertos_kernel/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h": "cfa4b00ec025e4678791d72f66beeaf82df64a58b17447bef3ab0e2e418d4978", - "freertos_kernel/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c": "054a9c450cdddd0c60f7996d10e86ba2111f0ceb4fe6b612b25d6f7ddc11a5b7", - "freertos_kernel/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h": "4e2476e3b3e0d28bcdd7ecbabaef96808a47835d5070dea1b1104635724fe6ac", - "freertos_kernel/portable/GCC/ARM7_AT91SAM7S/port.c": "941abb185d12f9de02536949c9227619f2e2ee838273cb3de0e8df49a17a68a9", - "freertos_kernel/portable/GCC/ARM7_AT91SAM7S/portISR.c": "2b80170bf074f3eb53cd73bb41d3f945e37de1003314c330b11321d8a94545d1", - "freertos_kernel/portable/GCC/ARM7_AT91SAM7S/portmacro.h": "b4eef658470ce9057d7e4cf84eeacbec9a891d165a31b5517d965c97e97cfb95", - "freertos_kernel/portable/GCC/ARM7_LPC2000/port.c": "dcf77b08d9fbcc00a0be524c265b638e5a3c9c2a3d16ffc254eb00287472c340", - "freertos_kernel/portable/GCC/ARM7_LPC2000/portISR.c": "690e56d182931b9b950d67a5752a74a0d6ac91cf7b010d2e406d15aac6e32d3e", - "freertos_kernel/portable/GCC/ARM7_LPC2000/portmacro.h": "19521af3436b295ea47658e803d51fa67e0359dc87c7763d06a52ef8552cd60f", - "freertos_kernel/portable/GCC/ARM7_LPC23xx/port.c": "a0d49cd2c3028bc53cd35b3b662cc9cdf6aae2376968acf4253317cab643c8b8", - "freertos_kernel/portable/GCC/ARM7_LPC23xx/portISR.c": "899052dab47c7608279e136d94ab4ae3e3e57d4030ec5b6959b3476c327613a1", - "freertos_kernel/portable/GCC/ARM7_LPC23xx/portmacro.h": "514639b82d6cc059867c7a79e9f43d1859af774a9844c621f0352352932bed53", - "freertos_kernel/portable/GCC/ARM_CA53_64_BIT/port.c": "706c3da3cbabbddea8acf0cb3b905ddbc98d5807be0a7208b44a88ef06cd75b7", - "freertos_kernel/portable/GCC/ARM_CA53_64_BIT/portASM.S": "30fbb16f34e11505c92bebea3f5589d9247c7d1fdddf1799003a484497fbacfb", - "freertos_kernel/portable/GCC/ARM_CA53_64_BIT/portmacro.h": "504dbf2a15447b74247a9ca3b335d0e372e294e70dbf3242fb4a6ba74a5d350d", - "freertos_kernel/portable/GCC/ARM_CA9/port.c": "87ab054cefb36c8cb01c6d5166d75f51a0f33a700fb90c14f8f489e16f065303", - "freertos_kernel/portable/GCC/ARM_CA9/portASM.S": "871bd240456057a388bce802d5bafc7eb6b55c8f2ebde9cc5f0bc378dc1dfa9b", - "freertos_kernel/portable/GCC/ARM_CA9/portmacro.h": "73bb83ab8b3d2b19369d87eb8a69fb040cfb06113d3b180aa96510c3d57f810a", - "freertos_kernel/portable/GCC/ARM_CM0/port.c": "92995b0b3a40b264181bd9d3f930666c6a85f6b854764ddf00b7d0134f26ad00", - "freertos_kernel/portable/GCC/ARM_CM0/portmacro.h": "a3e56406be77b2c5d68143ba4e9d488d69b9f1ddfcb7c6f30edf078cb2789e40", - "freertos_kernel/portable/GCC/ARM_CM23/non_secure/port.c": "f564963bdb26c2733528e474ca0c1ef7547c1d700c92943d0248dbe58bc67a72", - "freertos_kernel/portable/GCC/ARM_CM23/non_secure/portasm.c": "5b1e60a32388bd0e564a1fb4d6f2a62787511823fe88496d9cb2159c8b1794ed", - "freertos_kernel/portable/GCC/ARM_CM23/non_secure/portasm.h": "ca3ceed67f82e3d66da035078959714c43397abfd1e77d0fa4e8d30bd4f02da6", - "freertos_kernel/portable/GCC/ARM_CM23/non_secure/portmacro.h": "6812b0f9fbf3ef18e80f3322fec6f34482488bd79d0654f8ca899da941129b02", - "freertos_kernel/portable/GCC/ARM_CM23/secure/secure_context.c": "7943ce53070eca8060d91beaa5639cd707437ad212e48eacdcd4c5a0a2ab7248", - "freertos_kernel/portable/GCC/ARM_CM23/secure/secure_context.h": "2bb41a95f1bd1643943b8e8fe85bc47faa2dabb53b85682925bf90cf26c47f9d", - "freertos_kernel/portable/GCC/ARM_CM23/secure/secure_context_port.c": "e3d2c9965e634804294e8373039cfe49db78ae7cf431d074d363f603e3e5c0be", - "freertos_kernel/portable/GCC/ARM_CM23/secure/secure_heap.c": "54bcf2164dd0652183cf58d0e4eb1ff325e9f114dd7b008a51b983c672188ec3", - "freertos_kernel/portable/GCC/ARM_CM23/secure/secure_heap.h": "966d538a419dce23c7855870a02f91bf3adc018a108b791705b69a6cf08514e6", - "freertos_kernel/portable/GCC/ARM_CM23/secure/secure_init.c": "4f1e26736d6b2e59c67b560565f691ebaf2d28cd241d0a385d3a981f9f3a42de", - "freertos_kernel/portable/GCC/ARM_CM23/secure/secure_init.h": "ce593b2b690c85871375c156d059042445cc043777efd2802d31007ab87d210e", - "freertos_kernel/portable/GCC/ARM_CM23/secure/secure_port_macros.h": "e9a5753528ea62296e0633cc1121df015ab48e645ac04369722a56e608078ce9", - "freertos_kernel/portable/GCC/ARM_CM23_NTZ/non_secure/port.c": "ba5cf2a45f113ca3b27f8f36abb8209af1cf5e33552ca8dfe076a2706bfdd337", - "freertos_kernel/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c": "dde49ced7de20b4d13d065ff4cb7161ac3ca4feca29486f4946a98bfab8d25dc", - "freertos_kernel/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h": "ca3ceed67f82e3d66da035078959714c43397abfd1e77d0fa4e8d30bd4f02da6", - "freertos_kernel/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h": "6812b0f9fbf3ef18e80f3322fec6f34482488bd79d0654f8ca899da941129b02", - "freertos_kernel/portable/GCC/ARM_CM3/port.c": "7793ef2ade8733e6df6ec4f227a70cdbcca9af96f9483fb5228ed2979d42d04e", - "freertos_kernel/portable/GCC/ARM_CM3/portmacro.h": "ece2256bfd7550a32defda90b122c00573e4ca13d82070f72336209643f20c67", - "freertos_kernel/portable/GCC/ARM_CM33/non_secure/port.c": "1d4463f72117cd8af6948cc3dab7c946d3f62d8d27c2d68047cfe2514314dd68", - "freertos_kernel/portable/GCC/ARM_CM33/non_secure/portasm.c": "3b541eee7340b4b65241367b7437bd52787fb32869c848dde46959caff2bac26", - "freertos_kernel/portable/GCC/ARM_CM33/non_secure/portasm.h": "ca3ceed67f82e3d66da035078959714c43397abfd1e77d0fa4e8d30bd4f02da6", - "freertos_kernel/portable/GCC/ARM_CM33/non_secure/portmacro.h": "c101e361220d8042cce538b894e2a07884135007bb7dea554759035c33c33a36", - "freertos_kernel/portable/GCC/ARM_CM33/secure/secure_context.c": "7943ce53070eca8060d91beaa5639cd707437ad212e48eacdcd4c5a0a2ab7248", - "freertos_kernel/portable/GCC/ARM_CM33/secure/secure_context.h": "2bb41a95f1bd1643943b8e8fe85bc47faa2dabb53b85682925bf90cf26c47f9d", - "freertos_kernel/portable/GCC/ARM_CM33/secure/secure_context_port.c": "f3d402dc906f5a02c09ab8fa0e2b2b160c31c3648ecd5ddcf0e041b80fe2e1f5", - "freertos_kernel/portable/GCC/ARM_CM33/secure/secure_heap.c": "54bcf2164dd0652183cf58d0e4eb1ff325e9f114dd7b008a51b983c672188ec3", - "freertos_kernel/portable/GCC/ARM_CM33/secure/secure_heap.h": "966d538a419dce23c7855870a02f91bf3adc018a108b791705b69a6cf08514e6", - "freertos_kernel/portable/GCC/ARM_CM33/secure/secure_init.c": "4f1e26736d6b2e59c67b560565f691ebaf2d28cd241d0a385d3a981f9f3a42de", - "freertos_kernel/portable/GCC/ARM_CM33/secure/secure_init.h": "ce593b2b690c85871375c156d059042445cc043777efd2802d31007ab87d210e", - "freertos_kernel/portable/GCC/ARM_CM33/secure/secure_port_macros.h": "e9a5753528ea62296e0633cc1121df015ab48e645ac04369722a56e608078ce9", - "freertos_kernel/portable/GCC/ARM_CM33_NTZ/non_secure/port.c": "cd70d2c5e5c9dcc619bafd40b514b1f31db74e0e2e414afdfba1f0bee677c7c9", - "freertos_kernel/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c": "c048a5a6c1bb1829c843a4b8e48208772347c732f0ef3188ad2060b242c2ee44", - "freertos_kernel/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h": "ca3ceed67f82e3d66da035078959714c43397abfd1e77d0fa4e8d30bd4f02da6", - "freertos_kernel/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h": "c101e361220d8042cce538b894e2a07884135007bb7dea554759035c33c33a36", - "freertos_kernel/portable/GCC/ARM_CM3_MPU/port.c": "25517474a4d5124042a7c6e435bf67f89eb4133febd89ae01f08c9b404e1f96d", - "freertos_kernel/portable/GCC/ARM_CM3_MPU/portmacro.h": "687608f08007b3373cd2efdc3567e778e04fadd459d23ab27fd6a1fc49d96bbe", - "freertos_kernel/portable/GCC/ARM_CM4F/port.c": "f2bc8c291a55d8357431cc7b5514e877e5243c1027586a51c2858b67ef7060f2", - "freertos_kernel/portable/GCC/ARM_CM4F/portmacro.h": "8089268eb59e36ab32c907c2b1d84833ee2a7655103dc06dd7fab48d421dd92f", - "freertos_kernel/portable/GCC/ARM_CM4_MPU/port.c": "11e55b5b0948d34b730094c5deae31467016453139414641ac063b43518c20a9", - "freertos_kernel/portable/GCC/ARM_CM4_MPU/portmacro.h": "85d77484deb8311b81195e2bfce33e66206aa59dd3e5a05e8260f4643c2042f7", - "freertos_kernel/portable/GCC/ARM_CM7/ReadMe.txt": "4061394a651eb7e4624abad4ec719148e153bd8eae666d0530319d83f9b39aa7", - "freertos_kernel/portable/GCC/ARM_CM7/r0p1/port.c": "c802960033bf8f34348ff6698a83fdc97c6e985b24cea092fc2301a275807e8c", - "freertos_kernel/portable/GCC/ARM_CM7/r0p1/portmacro.h": "7b11ca2bc021cf39c5ef0c55260886665b60d0615373ed1e37fb287c383a72da", - "freertos_kernel/portable/GCC/ARM_CR5/port.c": "c5a983a04a18945ecd2c7b0f53fbf9c66b41c71274c323a12dcb0678f5699844", - "freertos_kernel/portable/GCC/ARM_CR5/portASM.S": "6df2f65a2f3f9538564dacec4c0e3313a3917a13fb72d8a127b91de8af9d6483", - "freertos_kernel/portable/GCC/ARM_CR5/portmacro.h": "1d722786bea1c0fbcc9794069eb17cb069d6d184f4cb52635090fd80017a6eb8", - "freertos_kernel/portable/GCC/ARM_CRx_No_GIC/port.c": "d1be2fa20efb74189c920b98ecf3dcd858e6fa63a8aa40bc187df1b8e6ecb7d2", - "freertos_kernel/portable/GCC/ARM_CRx_No_GIC/portASM.S": "e8392c994282f0042bf9d16984151685ade74751db68a0b70b8fb4680061f9e6", - "freertos_kernel/portable/GCC/ARM_CRx_No_GIC/portmacro.h": "8c4ec3b81d4ba58014a1599e24cfb8dc729d67fbb670d2d2dd1c6f3a93133226", - "freertos_kernel/portable/GCC/ATMega323/port.c": "3633b3ed13d91c831b5333359689d2599bb02add609a7a7cb4e9adb12dffc2c0", - "freertos_kernel/portable/GCC/ATMega323/portmacro.h": "59c55d0c4c7d2dbbee266a2e17400fd55f9c01d9e91f277396f133b2ed5c4794", - "freertos_kernel/portable/GCC/AVR32_UC3/exception.S": "8f3d945d526ff31d6e4303bd6b2bb55c85e2c2498c08194f95740e516c2c433d", - "freertos_kernel/portable/GCC/AVR32_UC3/port.c": "450773207dcc4127572bc8715eb5bf208d6606721b05e211f80a8845045836e3", - "freertos_kernel/portable/GCC/AVR32_UC3/portmacro.h": "b17a1eeda12864e656a630dcce130968613df2a660bc2747ddcf0fcc0744f38c", - "freertos_kernel/portable/GCC/AVR_AVRDx/port.c": "07d94f52710c44e99ba596c494997eb5d2477114cc3e5cfc367b545b76cb8090", - "freertos_kernel/portable/GCC/AVR_AVRDx/porthardware.h": "3b64b4d72e6f95c048b6822a92ae00cb600ce9d9e32bc72abbe32889cf822028", - "freertos_kernel/portable/GCC/AVR_AVRDx/portmacro.h": "a3a174262c97fc02d9b36955f338068faa161fca93a0bdb4ee1b8fb02ba6ff8a", - "freertos_kernel/portable/GCC/AVR_Mega0/port.c": "8196169776ccb527151620c0c2d866ce2c6d17bea9b9804d7a9a14d6a0e4f984", - "freertos_kernel/portable/GCC/AVR_Mega0/porthardware.h": "d267a6b2518f4ba3dcf211a592cc293490fff1b85cc7168db75ffdde129c0510", - "freertos_kernel/portable/GCC/AVR_Mega0/portmacro.h": "6ef9c2fd0acd927ab81993f6c5d8c9ad8d39a091d146e67eebb1a057b48b954f", - "freertos_kernel/portable/GCC/CORTUS_APS3/port.c": "66d14f28e24596dc884754ea5a967555f7f67b2c7e2cfcd9e53c95153e24d3da", - "freertos_kernel/portable/GCC/CORTUS_APS3/portmacro.h": "ff856e0df26a2f2deb8f9486f3febfb2004326f44256f6fbdf12ab662aaef9b5", - "freertos_kernel/portable/GCC/ColdFire_V2/port.c": "3caeae4a7b7f7bde11d39d6be26661d21e96c3eb7bb663962dcb1afd68bd4fe8", - "freertos_kernel/portable/GCC/ColdFire_V2/portasm.S": "1259af92433a6ca95c565fd7267ce8702977abacd393bbb9830ebf685f96243a", - "freertos_kernel/portable/GCC/ColdFire_V2/portmacro.h": "fe11a9562b68666783b619a35221aeb98bf2bcc585341c5fb3c02dbabeacfceb", - "freertos_kernel/portable/GCC/H8S2329/port.c": "8accf58ec857aee1efa5b7c2aaf5df212211e386942a7e2c34d037ae4398d59e", - "freertos_kernel/portable/GCC/H8S2329/portmacro.h": "229c7bf7bd487cb4aec03e031387128d8e49e14ab69942537bdb24eb8ddb391c", - "freertos_kernel/portable/GCC/HCS12/port.c": "701207bd63a531c4d53791e622bd33124fdca56413900501f14f742c7b1f1de1", - "freertos_kernel/portable/GCC/HCS12/portmacro.h": "d6ec0a5204c5500a6755df01b955c762ea025b127cbf12b7c6f8db8549b320be", - "freertos_kernel/portable/GCC/IA32_flat/ISR_Support.h": "ed35d0e82bc123d378765da15d5d96ec9607fd8642a2041da3e737a44fdd5fb6", - "freertos_kernel/portable/GCC/IA32_flat/port.c": "37a2626f94c6ebad2201fe96c1c3fb0914e519640d5889e954f20bb9753b8e12", - "freertos_kernel/portable/GCC/IA32_flat/portASM.S": "fe8918b6d290fd2e121caa9b6a66800ee7219536c803a41373fd011cb1aef938", - "freertos_kernel/portable/GCC/IA32_flat/portmacro.h": "5fb1a258991e8069ef9d994ee090b429073019d83639e7a583bcb82820462fa0", - "freertos_kernel/portable/GCC/MCF5235/port.c": "c05e7609e30ce09e89fd372609361967ca7cf0a13140d48a6f3c21b4b79463c4", - "freertos_kernel/portable/GCC/MCF5235/portmacro.h": "69aa3ee2d7123a25dc0e3ad529bf5df24f5be379a7c7ad16ff454a84c93b4ee2", - "freertos_kernel/portable/GCC/MSP430F449/port.c": "82b855ae0086c13d57765d47140f42296ff85cf4a0715719f7a6ea66f9b6947b", - "freertos_kernel/portable/GCC/MSP430F449/portmacro.h": "e69a6c6c2afd9cbed3ece372500a10ec6fbe7ae548ae855dc0b6e7fa882ee761", - "freertos_kernel/portable/GCC/MicroBlaze/port.c": "8c2279ce114a258c70d90a51cc7911d3c1233bff4cd5f25c866ce4c141238d1c", - "freertos_kernel/portable/GCC/MicroBlaze/portasm.s": "cc1fed684ba895af0b9b1e0c9743fed11aba4b4e0251361c8aa0952b45bc8b16", - "freertos_kernel/portable/GCC/MicroBlaze/portmacro.h": "a7adc7103bf53929bc4644fc1e6100757b7956ea5e409a245acced5bd3cd2b44", - "freertos_kernel/portable/GCC/MicroBlazeV8/port.c": "cc439fbbc5457026f1f84a9163ecb9655ab1b70f10ea257628f3ed9f85efb2ba", - "freertos_kernel/portable/GCC/MicroBlazeV8/port_exceptions.c": "61a9a7af514b64eafacc3b4beff985c32aa1d49a6b4c94690d7b69b47aea1605", - "freertos_kernel/portable/GCC/MicroBlazeV8/portasm.S": "1e612a85ae641d4107ed95511726f596fc9d2f23ae0a935e95d8c8e06d80aa50", - "freertos_kernel/portable/GCC/MicroBlazeV8/portmacro.h": "760f4dd9ab64baa463fb0f791c748f4de113f17ec5211323c7ef7d378b15594c", - "freertos_kernel/portable/GCC/MicroBlazeV9/port.c": "847e157e8eed34c3504e3f3cdc3bddf573fde56d06aa4f5851d6767e5c872865", - "freertos_kernel/portable/GCC/MicroBlazeV9/port_exceptions.c": "61a9a7af514b64eafacc3b4beff985c32aa1d49a6b4c94690d7b69b47aea1605", - "freertos_kernel/portable/GCC/MicroBlazeV9/portasm.S": "1e612a85ae641d4107ed95511726f596fc9d2f23ae0a935e95d8c8e06d80aa50", - "freertos_kernel/portable/GCC/MicroBlazeV9/portmacro.h": "760f4dd9ab64baa463fb0f791c748f4de113f17ec5211323c7ef7d378b15594c", - "freertos_kernel/portable/GCC/NiosII/port.c": "5d3e1971e26541280605b2c4eb6b577a91743281b3c915f4aff7db3dee1042e0", - "freertos_kernel/portable/GCC/NiosII/port_asm.S": "3d423d27ff6cc155dccbc5db2ba8b487e3ef18e92d14f31079fffb05bbd73975", - "freertos_kernel/portable/GCC/NiosII/portmacro.h": "c0f9bfdaa9d6b66d93ef9a12eaf712e7a17fbc61d3eb7ee6308a7d1d2c8bdb53", - "freertos_kernel/portable/GCC/PPC405_Xilinx/FPU_Macros.h": "be22f1f109c3355301a03b0184c343458565cdec603d9b0e385229526a9ea96d", - "freertos_kernel/portable/GCC/PPC405_Xilinx/port.c": "74e6591ecc964fa38bcdfac4ae65a4fb0ef4462692dd230912c8f31cf9c61cf5", - "freertos_kernel/portable/GCC/PPC405_Xilinx/portasm.S": "c90ea7372c0492db6d559387e7f8b8a9caf406fcc6d9d48e54be0f60d0913bcb", - "freertos_kernel/portable/GCC/PPC405_Xilinx/portmacro.h": "3d899cf04983841336173955fcf5be87991020b914146d120a1d2c255d3bc1cf", - "freertos_kernel/portable/GCC/PPC440_Xilinx/FPU_Macros.h": "be22f1f109c3355301a03b0184c343458565cdec603d9b0e385229526a9ea96d", - "freertos_kernel/portable/GCC/PPC440_Xilinx/port.c": "ca2736bae9d328533c336005d5a02fa7688e2b3e4b9de72e1b4d59cc615bf2f5", - "freertos_kernel/portable/GCC/PPC440_Xilinx/portasm.S": "c90ea7372c0492db6d559387e7f8b8a9caf406fcc6d9d48e54be0f60d0913bcb", - "freertos_kernel/portable/GCC/PPC440_Xilinx/portmacro.h": "3d899cf04983841336173955fcf5be87991020b914146d120a1d2c255d3bc1cf", - "freertos_kernel/portable/GCC/RISC-V/Documentation.url": "03b58eac9262370ca618c78e81f36deca511ab3ff9142d719bae84afd9c9e865", - "freertos_kernel/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h": "292f0bfef370cd3de0ed168806631a4a2f09142b98c30eaf945f0d4a3aacdf36", - "freertos_kernel/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h": "9166936c60cfaa3100599d90749310a4c55c1917641dc871b7a04a605514b985", - "freertos_kernel/portable/GCC/RISC-V/chip_specific_extensions/readme.txt": "9df008f8587b6faaaa48ef37ce9e38f89639290d636c06f5eefb09848ac318d1", - "freertos_kernel/portable/GCC/RISC-V/port.c": "db01b279f64f194cecdae6e8c21623bc926207ef916e1ee5b9c6a256ef293496", - "freertos_kernel/portable/GCC/RISC-V/portASM.S": "478247b226cfc3b3810f1ff128f294f9d0d48d06171a7628b8924c2fbc1cbb4f", - "freertos_kernel/portable/GCC/RISC-V/portmacro.h": "15187808935bfd2b6f2b63acd6e032779fd076c8474f30899960ca7eb90dcd47", - "freertos_kernel/portable/GCC/RISC-V/readme.txt": "9df008f8587b6faaaa48ef37ce9e38f89639290d636c06f5eefb09848ac318d1", - "freertos_kernel/portable/GCC/RL78/isr_support.h": "e818dd39c7ac371ba27207a5d7115267d3495eaa7deddba83b64d5e694845a9a", - "freertos_kernel/portable/GCC/RL78/port.c": "2e6aa4036211a247dc567f3c84f68069079cc605ac47987152c32d86d828daee", - "freertos_kernel/portable/GCC/RL78/portasm.S": "a7860c1ea3b8bba936ff5dc813006790ce40a707d7f3b02d65da8e9d01e5a107", - "freertos_kernel/portable/GCC/RL78/portmacro.h": "b2fd1d923bd5f6fadf872e713f2a7317a1fb18c07fa66433dbe789135d011c8e", - "freertos_kernel/portable/GCC/RX100/port.c": "9f00968b7a99decf21d8485284edfb91d0e28d4860492fd9748f65b09e2e2aa7", - "freertos_kernel/portable/GCC/RX100/portmacro.h": "5ebba1ed254fea861323e76e30236e801f721f763a32fcb016da9abe648ceee6", - "freertos_kernel/portable/GCC/RX100/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", - "freertos_kernel/portable/GCC/RX200/port.c": "859c00c0a7bda428a57beaac7dcc57cf5fbb853c02e432314f03fd39dd6da469", - "freertos_kernel/portable/GCC/RX200/portmacro.h": "00bbc2b4b30d79c78a3af490a1b92e2461a36d731f220c571a5d172df3a3ce21", - "freertos_kernel/portable/GCC/RX600/port.c": "01e83cab090a3589102ee12c69476d7df6e84390e181a7d10c46eb22df4b933b", - "freertos_kernel/portable/GCC/RX600/portmacro.h": "c7d88615a1bab1813a82919523c40c8cdc0a3c09d24b0c150c28906e4a89764b", - "freertos_kernel/portable/GCC/RX600/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", - "freertos_kernel/portable/GCC/RX600v2/port.c": "2d71e306ff19e399a0c9e193aa88deba20b58bb979cca912d063d059cfaf9ef7", - "freertos_kernel/portable/GCC/RX600v2/portmacro.h": "c7d88615a1bab1813a82919523c40c8cdc0a3c09d24b0c150c28906e4a89764b", - "freertos_kernel/portable/GCC/RX600v2/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", - "freertos_kernel/portable/GCC/RX700v3_DPFPU/port.c": "192047efa55b4bcccec2c1ea7e90fa0070a364d1c6b1d460fd4a65dbe448eadc", - "freertos_kernel/portable/GCC/RX700v3_DPFPU/portmacro.h": "82872dc32a0515792a515fd27971e9802067d5246a3c35c73fd1bfc8d1e383cc", - "freertos_kernel/portable/GCC/RX700v3_DPFPU/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", - "freertos_kernel/portable/GCC/STR75x/port.c": "10fd21848d81708b08278eac3840e5bef537276355655d13e2c0cfc293b39033", - "freertos_kernel/portable/GCC/STR75x/portISR.c": "62121cc706a6b41a1bccb6d5119a215a8be9e00f40eb6284e8b0d2d45de3ab77", - "freertos_kernel/portable/GCC/STR75x/portmacro.h": "60d4a5d94734a5d12927313f2507894754bbe48afaf9963f338bffc9a22f1799", - "freertos_kernel/portable/GCC/TriCore_1782/port.c": "c12018e7a130c97579b05368204edd6f7d232ea893bbb35b875314c35f87d05e", - "freertos_kernel/portable/GCC/TriCore_1782/portmacro.h": "fc7b0aba6494df8964e2ebbb0665e84de15efc8645c43dfb797876ae9479c5e2", - "freertos_kernel/portable/GCC/TriCore_1782/porttrap.c": "6352e6e78bcb3fbf1dd58326a8b9edd9ca29115b2987479de0b20372bfb159e0", - "freertos_kernel/portable/IAR/78K0R/ISR_Support.h": "33345e9a3bf2865c1077405dbc5e7e077edc73c4c36ab2d4fc32934213968f3c", - "freertos_kernel/portable/IAR/78K0R/port.c": "62aa6abc54f531570867e9d1bd01f98ef90f618ba02d8b5dbb7a134c13791840", - "freertos_kernel/portable/IAR/78K0R/portasm.s26": "ce4664d1d019083eea4af873904e645d26556fd38a4b6f26bababe290b89e40e", - "freertos_kernel/portable/IAR/78K0R/portmacro.h": "2b0162d6b6c3f69a024de30a59866cdfe322234f7dd779cfb36481f0f504aa58", - "freertos_kernel/portable/IAR/ARM_CA5_No_GIC/port.c": "726672928f53c872f1fba4947df0479f3402988762198bccee138bb625fe0960", - "freertos_kernel/portable/IAR/ARM_CA5_No_GIC/portASM.h": "a2dd9f22eec784394599074373b3bba6c352fbdb3a342e9bda918bfccea29949", - "freertos_kernel/portable/IAR/ARM_CA5_No_GIC/portASM.s": "54f862fa94a6bb309b6d936d10cb5cd2e243b04a6d319d99a49df20fc7029e9c", - "freertos_kernel/portable/IAR/ARM_CA5_No_GIC/portmacro.h": "1020093c0f18a045c70e5e8424db89c03a10b5d68896c611e9923331c0c55412", - "freertos_kernel/portable/IAR/ARM_CA9/port.c": "23d2ae9d9e63646a24b9077c0b165b5a4cda8389eadd1a6f82652bb92317a85b", - "freertos_kernel/portable/IAR/ARM_CA9/portASM.h": "d7caea9baab3e4d7f1440079cf00f647f6546935aae390844057ea5262f19d93", - "freertos_kernel/portable/IAR/ARM_CA9/portASM.s": "d33a025a856cfea029b90bb647b678ce929a0d43e9d8d6576d9be391ef23cb67", - "freertos_kernel/portable/IAR/ARM_CA9/portmacro.h": "4f8d459715527913cae7898a9dcece73732d00bab37656b9236f087cdc3f8353", - "freertos_kernel/portable/IAR/ARM_CM0/port.c": "c8abf4493d3927d0c989e3937176a4ac2d3a9e34354d04f92ca6204ab3bfc115", - "freertos_kernel/portable/IAR/ARM_CM0/portasm.s": "18d3f190c5cb19c02df278cb640707947dc637102619f0211a63c9803e1dbb0f", - "freertos_kernel/portable/IAR/ARM_CM0/portmacro.h": "f14e707e0e2abd3bf9c320dfa272c7fcbebffd67ffd072f44aba7205917dc168", - "freertos_kernel/portable/IAR/ARM_CM23/non_secure/port.c": "1d4463f72117cd8af6948cc3dab7c946d3f62d8d27c2d68047cfe2514314dd68", - "freertos_kernel/portable/IAR/ARM_CM23/non_secure/portasm.h": "ca3ceed67f82e3d66da035078959714c43397abfd1e77d0fa4e8d30bd4f02da6", - "freertos_kernel/portable/IAR/ARM_CM23/non_secure/portasm.s": "2ac3a2ce4b166a6143c46b202ec6a449c058a1fee503b58f9acd5e785c7606ce", - "freertos_kernel/portable/IAR/ARM_CM23/non_secure/portmacro.h": "dd9c3f9a38d432f13d9ed2cb33ade69ca823062ffa8d9128473f56faa4e41d98", - "freertos_kernel/portable/IAR/ARM_CM23/secure/secure_context.c": "7943ce53070eca8060d91beaa5639cd707437ad212e48eacdcd4c5a0a2ab7248", - "freertos_kernel/portable/IAR/ARM_CM23/secure/secure_context.h": "2bb41a95f1bd1643943b8e8fe85bc47faa2dabb53b85682925bf90cf26c47f9d", - "freertos_kernel/portable/IAR/ARM_CM23/secure/secure_context_port.c": "48d5e08258bacc13c0a4679eb673be334c548a6aa433bbfb823fe2698093fa94", - "freertos_kernel/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s": "18683a26371509e9d65d1be3b3d8d29e39f48b1a78cbeae5c8e897bb628f1cca", - "freertos_kernel/portable/IAR/ARM_CM23/secure/secure_heap.c": "54bcf2164dd0652183cf58d0e4eb1ff325e9f114dd7b008a51b983c672188ec3", - "freertos_kernel/portable/IAR/ARM_CM23/secure/secure_heap.h": "966d538a419dce23c7855870a02f91bf3adc018a108b791705b69a6cf08514e6", - "freertos_kernel/portable/IAR/ARM_CM23/secure/secure_init.c": "4f1e26736d6b2e59c67b560565f691ebaf2d28cd241d0a385d3a981f9f3a42de", - "freertos_kernel/portable/IAR/ARM_CM23/secure/secure_init.h": "ce593b2b690c85871375c156d059042445cc043777efd2802d31007ab87d210e", - "freertos_kernel/portable/IAR/ARM_CM23/secure/secure_port_macros.h": "e9a5753528ea62296e0633cc1121df015ab48e645ac04369722a56e608078ce9", - "freertos_kernel/portable/IAR/ARM_CM23_NTZ/non_secure/port.c": "1d4463f72117cd8af6948cc3dab7c946d3f62d8d27c2d68047cfe2514314dd68", - "freertos_kernel/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h": "ca3ceed67f82e3d66da035078959714c43397abfd1e77d0fa4e8d30bd4f02da6", - "freertos_kernel/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s": "a790b8ba5baf9252f3a17db84542170fcfff946cd7f01a0070845204fef1c8eb", - "freertos_kernel/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h": "88bf43629dc4fc00e41af1bcb6d7e06e4fbbf26f069b4d771b633d7ed52c1994", - "freertos_kernel/portable/IAR/ARM_CM3/port.c": "e6003fa8f10e1a52594c0cac006326eb39045d4b60861324bab68213376b06ea", - "freertos_kernel/portable/IAR/ARM_CM3/portasm.s": "9b31b9b90b160e1a5972dcef0530ba4909b6ed2e2a086557e51ec510cc95f3e0", - "freertos_kernel/portable/IAR/ARM_CM3/portmacro.h": "de104b76cd55aefad35179a232737ea1eb3b0b810c1d286f984f6bc9d393a78e", - "freertos_kernel/portable/IAR/ARM_CM33/non_secure/port.c": "1d4463f72117cd8af6948cc3dab7c946d3f62d8d27c2d68047cfe2514314dd68", - "freertos_kernel/portable/IAR/ARM_CM33/non_secure/portasm.h": "ca3ceed67f82e3d66da035078959714c43397abfd1e77d0fa4e8d30bd4f02da6", - "freertos_kernel/portable/IAR/ARM_CM33/non_secure/portasm.s": "951e6f3a3ef09bb2bde77b6e3c20b78762939250daf9123cd00a8c3254a847d0", - "freertos_kernel/portable/IAR/ARM_CM33/non_secure/portmacro.h": "4b88d10017de817469888093b1a689ee6da7b33edb5e3006839b238a9bb88513", - "freertos_kernel/portable/IAR/ARM_CM33/secure/secure_context.c": "7943ce53070eca8060d91beaa5639cd707437ad212e48eacdcd4c5a0a2ab7248", - "freertos_kernel/portable/IAR/ARM_CM33/secure/secure_context.h": "2bb41a95f1bd1643943b8e8fe85bc47faa2dabb53b85682925bf90cf26c47f9d", - "freertos_kernel/portable/IAR/ARM_CM33/secure/secure_context_port.c": "48d5e08258bacc13c0a4679eb673be334c548a6aa433bbfb823fe2698093fa94", - "freertos_kernel/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s": "d1bce7b173f724a7b0e97ffb2841ce19b15d0469bd49bbf9109db735629f844b", - "freertos_kernel/portable/IAR/ARM_CM33/secure/secure_heap.c": "54bcf2164dd0652183cf58d0e4eb1ff325e9f114dd7b008a51b983c672188ec3", - "freertos_kernel/portable/IAR/ARM_CM33/secure/secure_heap.h": "966d538a419dce23c7855870a02f91bf3adc018a108b791705b69a6cf08514e6", - "freertos_kernel/portable/IAR/ARM_CM33/secure/secure_init.c": "4f1e26736d6b2e59c67b560565f691ebaf2d28cd241d0a385d3a981f9f3a42de", - "freertos_kernel/portable/IAR/ARM_CM33/secure/secure_init.h": "ce593b2b690c85871375c156d059042445cc043777efd2802d31007ab87d210e", - "freertos_kernel/portable/IAR/ARM_CM33/secure/secure_port_macros.h": "e9a5753528ea62296e0633cc1121df015ab48e645ac04369722a56e608078ce9", - "freertos_kernel/portable/IAR/ARM_CM33_NTZ/non_secure/port.c": "1d4463f72117cd8af6948cc3dab7c946d3f62d8d27c2d68047cfe2514314dd68", - "freertos_kernel/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h": "ca3ceed67f82e3d66da035078959714c43397abfd1e77d0fa4e8d30bd4f02da6", - "freertos_kernel/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s": "b7cf4bc30a7be99813aa9c3490f51f2c1df2a9e4f3dc050036238b2a9690765d", - "freertos_kernel/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h": "4b88d10017de817469888093b1a689ee6da7b33edb5e3006839b238a9bb88513", - "freertos_kernel/portable/IAR/ARM_CM4F/port.c": "eaebb3d1fea18d5b1412b0311d3142b7cbe5f3f0c378a0263de6dee19baca06b", - "freertos_kernel/portable/IAR/ARM_CM4F/portasm.s": "c2cb4c19b4b70451f49b3039fe216a8ff09852635feb7e5b6251553f26d3d5c1", - "freertos_kernel/portable/IAR/ARM_CM4F/portmacro.h": "70de7a35236baa99e3f9e44321b4921b5d9a09418e2bfcbe0d9404cfbbe29280", - "freertos_kernel/portable/IAR/ARM_CM4F_MPU/port.c": "97ebb798babf943181b8db9a4b104dc7e9c22bca75d8b3b86a08cce8c03b796a", - "freertos_kernel/portable/IAR/ARM_CM4F_MPU/portasm.s": "d45d83a6a2dd14e6eccf832d3248dabc6cf945190061a2533d5b2e2714d5f558", - "freertos_kernel/portable/IAR/ARM_CM4F_MPU/portmacro.h": "fdfbaabea3435ec9ed9cd578c87a49f9fa307c58c25933da76e5755eb6cf190b", - "freertos_kernel/portable/IAR/ARM_CM7/ReadMe.txt": "9991c375912b69f89d97fd3451459a4980f97787c6cb5c21d64e520bfb7c688e", - "freertos_kernel/portable/IAR/ARM_CM7/r0p1/port.c": "5728daa731db10de8b0f6514dd537d9cb6392656fefa964e90057e01a2577647", - "freertos_kernel/portable/IAR/ARM_CM7/r0p1/portasm.s": "dabfb6b88e5c4b263d681de025860c331eeb173624a4cd1227ee5e9c6f3f590c", - "freertos_kernel/portable/IAR/ARM_CM7/r0p1/portmacro.h": "14b90e50d8893160f9238bf704e299a0935a2e23535e9c79b8fd53a1375ecaf4", - "freertos_kernel/portable/IAR/ARM_CRx_No_GIC/port.c": "768989276d33283882c804bfc9d0b06fb2cd8847313ed94bf07f904930b1be0b", - "freertos_kernel/portable/IAR/ARM_CRx_No_GIC/portASM.s": "b451157f8867229eaeb4bd23ab1ea061845934716076ab5f94d2292942f05b45", - "freertos_kernel/portable/IAR/ARM_CRx_No_GIC/portmacro.h": "4b63939368c7256cf8f677c1f1e8f74a341ffc437b8462fe1178c015502f059b", - "freertos_kernel/portable/IAR/ATMega323/port.c": "a95ad2d5355f81cec2ea944e5889ce70840cee184a656661b14c2e2271d5f850", - "freertos_kernel/portable/IAR/ATMega323/portmacro.h": "8b6614db28af088dc13ff1f609f5a56f01277731e806971af71e841396ba10bb", - "freertos_kernel/portable/IAR/ATMega323/portmacro.s90": "deee80a4ee54773f471e821cc58d066e9fb9bf5cb8459cd167d3ba068dd7dadb", - "freertos_kernel/portable/IAR/AVR32_UC3/exception.s82": "b51ccec0ffabcfed5003f0c96a8124a2050c94a5d5dbfc0a0eb11e58d9ca0176", - "freertos_kernel/portable/IAR/AVR32_UC3/port.c": "2d84868e6d72b685867ce27266d4b4bbfbe60b1be263437913af6649bed57fac", - "freertos_kernel/portable/IAR/AVR32_UC3/portmacro.h": "6efe20b626bd3f3a91b8b15e3a681a9956206a5470deca80d8884c279d64aea9", - "freertos_kernel/portable/IAR/AVR32_UC3/read.c": "07b6384e325351be59fe01133c233180002e059fc4c084a2d8ece4f989c06aa8", - "freertos_kernel/portable/IAR/AVR32_UC3/write.c": "49735b1d2fa89c09f15859dcd26aa7e3899736df65a4f98770300de01243dacb", - "freertos_kernel/portable/IAR/AVR_AVRDx/port.c": "e46d2d4f471103e40a11a2ef2d5d17582ce09b541ed172612dc489fcc941be9c", - "freertos_kernel/portable/IAR/AVR_AVRDx/porthardware.h": "02a304f91a8b029872dc79719e33c9b6f6dde539ba3e7ef798804e9aa4a8ab25", - "freertos_kernel/portable/IAR/AVR_AVRDx/portmacro.h": "b98a8e8e5c1f26dc8652e3622337e8f37e10cadd4b56a8aca9fcb28b27b1c395", - "freertos_kernel/portable/IAR/AVR_AVRDx/portmacro.s90": "de80d5a92f39ce52191ebe8d187d6e6e7444c159ea3f94203d3cf5aab0f69997", - "freertos_kernel/portable/IAR/AVR_Mega0/port.c": "ce56eee46a0620c89203c1f575c1514efcbd8383e494384f3bde60beb7c7c158", - "freertos_kernel/portable/IAR/AVR_Mega0/porthardware.h": "2c2edbc3d4bc6a1d0b5c60df5c297d65fdd9053217795a423adf6bfc12803ed3", - "freertos_kernel/portable/IAR/AVR_Mega0/portmacro.h": "b98a8e8e5c1f26dc8652e3622337e8f37e10cadd4b56a8aca9fcb28b27b1c395", - "freertos_kernel/portable/IAR/AVR_Mega0/portmacro.s90": "f8e3444424ae3ec81cd0c32d4a866b85b3325d6cbf276e5543d766f756ed5760", - "freertos_kernel/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h": "8f3f98a3f183dd173a22541819cf794565f6bd35d4db4b664a8f35f05fbf6063", - "freertos_kernel/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h": "1544c69c8783880a35cee8ffa24e3e65e289f596c03d8b9f35a31a3eb7b025f1", - "freertos_kernel/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h": "ee7d97e30cfb971f74db814397bfef83f028e0c7e55c990438cfe33e6765c0dd", - "freertos_kernel/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h": "361996a9bed51f37cb9b0a2bda0e4544dc4e4cd44d75c5788e1074cfe17cd56e", - "freertos_kernel/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h": "f49159a259b685e876d394efb010eb1d06cb0346118715f054e252725d981702", - "freertos_kernel/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h": "2c6ca0cd41436c8c5ecaaa461084cd1675a7e24d58c6ace888927fca5e262bc9", - "freertos_kernel/portable/IAR/AtmelSAM7S64/ISR_Support.h": "d99b80f6ebd4c76b65f23aa195ca66dae1673b783fe0300cb387ec45287d376b", - "freertos_kernel/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h": "46d53b158ebe5cffa94bc80c9d6b0fafb1790bb741c5be562775f630bdb55dbe", - "freertos_kernel/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h": "a1068f757db5c02d2725a76f4e2ba8cd79aa288be3ed5fc2804f0cde9f4a0169", - "freertos_kernel/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h": "2c4e3aef15483db5c6ec459c275b8ed06eb14e484484f1215139dba779b10a11", - "freertos_kernel/portable/IAR/AtmelSAM7S64/port.c": "99052ac9aaf68b9b3ffe039061d1b04366b10260c842393029d5355e463aef62", - "freertos_kernel/portable/IAR/AtmelSAM7S64/portasm.s79": "8278559af1632a3f0278b2dbcaadaf9e81feb04b583ee7cfdb58510bcb3deba7", - "freertos_kernel/portable/IAR/AtmelSAM7S64/portmacro.h": "08b5d86a7d0241ea38b2a525530acdf189d4a560a4f22d14aa3121150e9a334f", - "freertos_kernel/portable/IAR/AtmelSAM9XE/ISR_Support.h": "85dc8f5d2615969b89ffbf48c42ae3dce8145742dd7d8d3e886f91e3863ce7cb", - "freertos_kernel/portable/IAR/AtmelSAM9XE/port.c": "523f23d549dbd12d9d95a3a9141f642ebb3c30c1e9f0d1eea2d3454fb96cd185", - "freertos_kernel/portable/IAR/AtmelSAM9XE/portasm.s79": "1cb65e6f59c63aefb1e030a9a564ce76b9237ba542c2559f6cfe69aeffd47d42", - "freertos_kernel/portable/IAR/AtmelSAM9XE/portmacro.h": "3a2ab8f7bdbd2dde627d622018ce4fedcf0a00cbecfde8e805f98c797941db8c", - "freertos_kernel/portable/IAR/LPC2000/ISR_Support.h": "d99b80f6ebd4c76b65f23aa195ca66dae1673b783fe0300cb387ec45287d376b", - "freertos_kernel/portable/IAR/LPC2000/port.c": "03436ed2f91f967659a47ce635b4757ef2cae905f847ad1c6c0f2cb674ea21f5", - "freertos_kernel/portable/IAR/LPC2000/portasm.s79": "8d7f386ee60796dfae0b4820e12fc493257298cffd09545242259857ab3eb047", - "freertos_kernel/portable/IAR/LPC2000/portmacro.h": "0ca0c313f993471fde5c189c5d14b53229236225359de7d2fcce273eb7086998", - "freertos_kernel/portable/IAR/MSP430/port.c": "ce506fea18eb69ec2b7aeb2018c9f9e2572cf9d9e7de71ca3189495c8d5062ab", - "freertos_kernel/portable/IAR/MSP430/portasm.h": "2dcb89141409c4b704d5696c999634ab1d9c9275657a23a24b313f1b94998315", - "freertos_kernel/portable/IAR/MSP430/portext.s43": "989907542d6cc5319a4e30058a7fd10b1894c9a5d28d3b070e9b0bf7361aa6a1", - "freertos_kernel/portable/IAR/MSP430/portmacro.h": "6667fc72c1142771149624d0ad28de36bd0ab20111e47ea4b0002443996d7d77", - "freertos_kernel/portable/IAR/MSP430X/data_model.h": "dae4840ca9a6c1a35c571e4152016f8bd0488096fffd721b88f87a15215047b8", - "freertos_kernel/portable/IAR/MSP430X/port.c": "aa0681bc6eb9096f27699150d917b9f91d9363290d06ab5a0aa781142cafc8f1", - "freertos_kernel/portable/IAR/MSP430X/portext.s43": "7a878fa5ffe44644a1fca8382d5125a38fd3bfcc69b1cd7c1a9fac5b156b8940", - "freertos_kernel/portable/IAR/MSP430X/portmacro.h": "a5607ce6d0ce3dc9cecd29740e22fa8086eeaa920b9a444dec7234ca5264cbd0", - "freertos_kernel/portable/IAR/RISC-V/Documentation.url": "03b58eac9262370ca618c78e81f36deca511ab3ff9142d719bae84afd9c9e865", - "freertos_kernel/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h": "8876576dcf8171bcf8ac2e364673465e5ab555ac7441919c36d05c71e74c08e4", - "freertos_kernel/portable/IAR/RISC-V/chip_specific_extensions/readme.txt": "9df008f8587b6faaaa48ef37ce9e38f89639290d636c06f5eefb09848ac318d1", - "freertos_kernel/portable/IAR/RISC-V/port.c": "4c7d0454b66ac0ec089bf216eb2b6e02338701c63e9c290c1f8d411d6d40c804", - "freertos_kernel/portable/IAR/RISC-V/portASM.s": "11b0afcf74e526a0bcaae944113b9d0d2829789dbfcd88b58b02f00be85f5173", - "freertos_kernel/portable/IAR/RISC-V/portmacro.h": "3422d85c46a7ffbda82c18208bbd8f73aa42b809f09da7ab0abeb8f0a1cd9c0b", - "freertos_kernel/portable/IAR/RISC-V/readme.txt": "9df008f8587b6faaaa48ef37ce9e38f89639290d636c06f5eefb09848ac318d1", - "freertos_kernel/portable/IAR/RL78/ISR_Support.h": "686a382d24eafbad53e2c86e88e171dedf9699be1dab65567714ee48d5b65e03", - "freertos_kernel/portable/IAR/RL78/port.c": "3854232d463981ad4b868268ef92944e9624f2734d247fd8349b381d5283cb35", - "freertos_kernel/portable/IAR/RL78/portasm.s87": "ba24bafe0c1e7b577fb689fc515ea458a58a6c859f9ad7f4f66687424e482c59", - "freertos_kernel/portable/IAR/RL78/portmacro.h": "a4262356906010cafea76b28f375ad50807aaaf98aaf95e720945e30d34a5649", - "freertos_kernel/portable/IAR/RX100/port.c": "0f2005eb07d4cfae2920968af7ed04670458684919ac5c38c8ee6a522f79bdc8", - "freertos_kernel/portable/IAR/RX100/port_asm.s": "05dcc7163343676007d0cfaf2217f2822f5236020bc0f5f2d0d8f64efc94f78c", - "freertos_kernel/portable/IAR/RX100/portmacro.h": "38ab0cad591fc435d1a87acfa9d9bdb5227420b05e3e081b6a534271679e4a57", - "freertos_kernel/portable/IAR/RX100/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", - "freertos_kernel/portable/IAR/RX600/port.c": "345a724795a1fb4d0c9501f26625e7395a6d16b06ec6c2447e4a80a249da2ab8", - "freertos_kernel/portable/IAR/RX600/port_asm.s": "bf9ec5e263f0aa633f1cc931f926cf5c89584131fbb987e28b46b8e83423747e", - "freertos_kernel/portable/IAR/RX600/portmacro.h": "2ab9cd26880065ac60ea34569d7866524b488649e3f0ee4c5cb1fdb2a83bb223", - "freertos_kernel/portable/IAR/RX600/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", - "freertos_kernel/portable/IAR/RX700v3_DPFPU/port.c": "467226e1bda60648d6e5bad20fc9ed2931b4d2e9ee6b154727d9cde38c6546a1", - "freertos_kernel/portable/IAR/RX700v3_DPFPU/portmacro.h": "9d179bbc3f1ab63b11b787a312115cc9177d3d62635e5b241ab0f41d95c82bf5", - "freertos_kernel/portable/IAR/RX700v3_DPFPU/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", - "freertos_kernel/portable/IAR/RXv2/port.c": "66b01c394e607e1c395e13c75484454c523717b23922ef7e9cdd6aea43ff278a", - "freertos_kernel/portable/IAR/RXv2/port_asm.s": "596ecc677d1c35857bcb98a468288df8d4f71b8fe7f07d99470034fd3a7e4477", - "freertos_kernel/portable/IAR/RXv2/portmacro.h": "7ffd0c08913be18e6fe9a442fd1ac5ba24565024b2508b9f3eb82d15bf16f933", - "freertos_kernel/portable/IAR/RXv2/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", - "freertos_kernel/portable/IAR/STR71x/ISR_Support.h": "d99b80f6ebd4c76b65f23aa195ca66dae1673b783fe0300cb387ec45287d376b", - "freertos_kernel/portable/IAR/STR71x/port.c": "c1703de710a603adad57a6380d9cf6ad964de099177f3408fa7f03e91f6e0b0a", - "freertos_kernel/portable/IAR/STR71x/portasm.s79": "2fca10aaf1bd08bc6a28d8c1714bc16e175b5e37d9bab228c3692b564516c37b", - "freertos_kernel/portable/IAR/STR71x/portmacro.h": "5cb67a3ada195735f6a5eb6e5c0ce80504e639dcc2cbbdd8fc96eaff2ccb704e", - "freertos_kernel/portable/IAR/STR75x/ISR_Support.h": "d99b80f6ebd4c76b65f23aa195ca66dae1673b783fe0300cb387ec45287d376b", - "freertos_kernel/portable/IAR/STR75x/port.c": "81edf61298c27a9cf2d848dccf10e0e488a42c6dfc065e7b15e3be5b588e2b9c", - "freertos_kernel/portable/IAR/STR75x/portasm.s79": "bec53b22e5ead048953280827ef3f3dd35ffa554402f0eae7a587bd891716c1e", - "freertos_kernel/portable/IAR/STR75x/portmacro.h": "caa40117399ab78429b696d683eab04bea4aa4a7b02bf2b7bc2aded8c38ab1e6", - "freertos_kernel/portable/IAR/STR91x/ISR_Support.h": "87c92bb698699dec561005dd09ef3d3e305cfdea1e24a258e7a5e40ed4c555be", - "freertos_kernel/portable/IAR/STR91x/port.c": "3b294716334eb80b3641d5079b100895599bddc4dffaeb6ee95bed071aa8791f", - "freertos_kernel/portable/IAR/STR91x/portasm.s79": "3ad9dcc9263ebb9205fcdd1033687527e87933b1830d072c572fe3a9c7379219", - "freertos_kernel/portable/IAR/STR91x/portmacro.h": "84bd0186307934a828b45e0454ab6a26b518bebf569eadc921e9f3dca113ebea", - "freertos_kernel/portable/IAR/V850ES/ISR_Support.h": "ed379d0f4f75462764dd96930bddf387764efb508403539da97846883006f6c1", - "freertos_kernel/portable/IAR/V850ES/port.c": "94055bcb67382470f2a5bf059132b6bbf1a25309fdf97c7f65485587b19fa5c6", - "freertos_kernel/portable/IAR/V850ES/portasm.s85": "6c9afe1e953b16fc389713c28e55fb56d6420b8e201d9407eaf45364b18d3352", - "freertos_kernel/portable/IAR/V850ES/portasm_Fx3.s85": "0c1fb3ac164cfe6d12a6df1a4d7e70b7c81491d4c358b4e511274d9e9f2b5b60", - "freertos_kernel/portable/IAR/V850ES/portasm_Hx2.s85": "af3102f3eb8dd0a4f54eb57a2b593201c4ac62cb218623ec4060f93050ff46c4", - "freertos_kernel/portable/IAR/V850ES/portmacro.h": "69ed29ab45b528a1cb25de4fa06927d84b5448047fdc091378535e553043ebcd", - "freertos_kernel/portable/Keil/See-also-the-RVDS-directory.txt": "d872e8e4176213ea84ebc76d8fb621c31b4ca116fd0a51258813e804fe110ca4", - "freertos_kernel/portable/MPLAB/PIC18F/port.c": "12d2b354f309b315dd075acd358fb88d01529eb9ae0f9d9d7cd0b12874b86deb", - "freertos_kernel/portable/MPLAB/PIC18F/portmacro.h": "fd76391a30ada8b580037b9d23f50b0cb4f15bef462b0eca8fa4f959e9c77f4a", - "freertos_kernel/portable/MPLAB/PIC18F/stdio.h": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "freertos_kernel/portable/MPLAB/PIC24_dsPIC/port.c": "9d35b32f2ae14d4c0374b83b1240effdd2389ad433d45f7906bb4ee7cec8968a", - "freertos_kernel/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S": "76eee6615d4a33cd04e7f8cf77131c00abac59e74d2baf943e962eb55990fea7", - "freertos_kernel/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S": "04391195d2dfb8ab4242a5ec1e567209d2236ac26d5ddc69b3642bdb1d4dd9f8", - "freertos_kernel/portable/MPLAB/PIC24_dsPIC/portmacro.h": "3b922fd9deb66b0a0cc9a318f28b99008ef9b01fb67735a2112d844be544ec12", - "freertos_kernel/portable/MPLAB/PIC32MEC14xx/ISR_Support.h": "1cee96104f7b956215bb5ad76a7f9b8e51ff558135de2f18b8d092eb7fcbd4b5", - "freertos_kernel/portable/MPLAB/PIC32MEC14xx/port.c": "0e3b4a9fd8b9403a24221f6c9f9ac0feb012f32eac3a1353108eef128d1353b9", - "freertos_kernel/portable/MPLAB/PIC32MEC14xx/port_asm.S": "45cb1460e25498aa5c00f6e6c2a6b44b387b41ed1bb03da6dccb9c0d083880bb", - "freertos_kernel/portable/MPLAB/PIC32MEC14xx/portmacro.h": "11da275f715eec577187497dbc85dfedcb3089c2dc890f161bed4f1cba486616", - "freertos_kernel/portable/MPLAB/PIC32MX/ISR_Support.h": "3a6c9eb9f7b48ed3f959a325ce9ff3c1ed4b619025e2216df785d33a7441463b", - "freertos_kernel/portable/MPLAB/PIC32MX/port.c": "27d5ab4932397536b9e535bf4bd43204cfa26f4b8b28709692c4d0650e39c14b", - "freertos_kernel/portable/MPLAB/PIC32MX/port_asm.S": "6a5ca6ec2230a48af19f6f391ef3efe0b14199a66b0affc6adf8e7c2436800a7", - "freertos_kernel/portable/MPLAB/PIC32MX/portmacro.h": "d69744def6b3e80ea3bb47a4097be1c8f1d43d4a5d3711d4a607df07885c6791", - "freertos_kernel/portable/MPLAB/PIC32MZ/ISR_Support.h": "5e96ec9df6807594d0beb6d0eebbcd5056b15270d21cb3693fcbe68616e67051", - "freertos_kernel/portable/MPLAB/PIC32MZ/port.c": "7d0cb6e8b05eefa790f04ff8096cf0197390080e3a33b54df36acede4085105b", - "freertos_kernel/portable/MPLAB/PIC32MZ/port_asm.S": "c4ac38a3441364e8b86f670c4afed94da87dd8364f349e3b2bcff6f57800950b", - "freertos_kernel/portable/MPLAB/PIC32MZ/portmacro.h": "18d2bc2c5f87743d729f34a6a5472af4f66bf2b3ca482474855e1d4678dc001a", - "freertos_kernel/portable/MSVC-MingW/port.c": "a8d561a9cffeeb8535276e1da2d6a6ec9493c4bdbc25bd1ce5b88ba8da0f3253", - "freertos_kernel/portable/MSVC-MingW/portmacro.h": "49372304c17a2fbffabeb29230cc45002e219e4379ee342012e3492fa739e4bb", - "freertos_kernel/portable/MemMang/ReadMe.url": "c44abcb1837584d65d00768bde7c1471dbf3fe316275ccbb6922998c6f11ddc9", - "freertos_kernel/portable/MemMang/heap_1.c": "54536cceea4248cf740f2afdcd2e210072b6974f2c1270e398011da01015eff3", - "freertos_kernel/portable/MemMang/heap_2.c": "334c329b09c83c1fad63ebf34ffa0e27d15a6479acd603c0987f34db81304fdb", - "freertos_kernel/portable/MemMang/heap_3.c": "5fd7f17083bc740103b9a63c6627b41c5f9e6fafa8e5e352209099ab5fdee471", - "freertos_kernel/portable/MemMang/heap_4.c": "f467e45a7754d75815233de0860d94cbc4bae1eef5fa8aeea3671d130f306317", - "freertos_kernel/portable/MemMang/heap_5.c": "05f766f108cbad95f563ecb67d489dc97db45cdaa96417819beb3dee95953d4f", - "freertos_kernel/portable/MikroC/ARM_CM4F/port.c": "1a9786b270ae8b3d2f31f1be267ecdde0ccac23e9968e6aa5e7e130ef97b80e0", - "freertos_kernel/portable/MikroC/ARM_CM4F/portmacro.h": "f8b30e9e1bc2cdafc896dbcf2fc85dfc31c22db6867906007b94333d049acc6c", - "freertos_kernel/portable/Paradigm/Tern_EE/large_untested/port.c": "357cef45230ab30a60f5c4120f21c54a12a89c183f0523c61873d5ff7f515492", - "freertos_kernel/portable/Paradigm/Tern_EE/large_untested/portasm.h": "bd3304c8e34bb12b76e4809facd1f3c3a9b7eb4d8ffd18571d12a4d17df2ce80", - "freertos_kernel/portable/Paradigm/Tern_EE/large_untested/portmacro.h": "08c7cb621544bf4e766adc78790a2236c1a4de15937d9c4be60be8b4b457f4aa", - "freertos_kernel/portable/Paradigm/Tern_EE/small/port.c": "1ed0288c4e94a45bf34cc2842e340133307744cf03cef563f9922f610e896955", - "freertos_kernel/portable/Paradigm/Tern_EE/small/portasm.h": "a641909e0eb02e2fa520f5a59f15df7abe2fbb1eff92cdab3db0d876080d5cd5", - "freertos_kernel/portable/Paradigm/Tern_EE/small/portmacro.h": "08e6efe80ce4404f236ba9aa29ac5b9b305a3ffd5423be554c223111d4891e0f", - "freertos_kernel/portable/RVDS/ARM7_LPC21xx/port.c": "000d916886087c22931548c208467d8895fbbfcf99052eb9101d0ead34ff552a", - "freertos_kernel/portable/RVDS/ARM7_LPC21xx/portASM.s": "edcbad1a57df64a8b3966800050a33d06717cf796032923f0226bfdbb373a887", - "freertos_kernel/portable/RVDS/ARM7_LPC21xx/portmacro.h": "717d850f08874d392d713f98824f507d7292cd60f8fec19d970a45a605a57cf5", - "freertos_kernel/portable/RVDS/ARM7_LPC21xx/portmacro.inc": "4f23a44436612dc46202ca741eae31eca67d275db4a6e468a042e0ab62c7bb0f", - "freertos_kernel/portable/RVDS/ARM_CA9/port.c": "3ac80344c4fa0f8bdae4c2ab911d50a656461b35578f0e1ed705deea101978ce", - "freertos_kernel/portable/RVDS/ARM_CA9/portASM.s": "8c97c0e43b91e5de88dc23c0b23653775f74a9fb6d8447d8856982ff4994d1cd", - "freertos_kernel/portable/RVDS/ARM_CA9/portmacro.h": "aaf9d9677dbd7ca99a426263347f1899f0036215bccf2a9974c6daffcc29d450", - "freertos_kernel/portable/RVDS/ARM_CA9/portmacro.inc": "2a72dd28deca5c41c6c60dcb2b4745676a89a6312d30d5f454180143861cb2df", - "freertos_kernel/portable/RVDS/ARM_CM0/port.c": "77c5823b4e1dd0c769cfd8aa13416db15dfb2caaa298771ca0f68b02ee17e134", - "freertos_kernel/portable/RVDS/ARM_CM0/portmacro.h": "7942820385b379dc0b7c9cb0a400d2a9f556c34fdfd5c85853766bab2ef640ba", - "freertos_kernel/portable/RVDS/ARM_CM3/port.c": "c5fb69b9f96902135af3a495a1207691b79027fc197df368a7830ee261144381", - "freertos_kernel/portable/RVDS/ARM_CM3/portmacro.h": "29fd98a939493579d53c8c43cb34a0237bb6d881b8a89b8fd099dcadf76d9f80", - "freertos_kernel/portable/RVDS/ARM_CM4F/port.c": "73965e16d5a2cfa3016668d928d4e0c7ba9400ccac19386fa970ed6c8dd23d87", - "freertos_kernel/portable/RVDS/ARM_CM4F/portmacro.h": "3480aa7356c18bf046ab818536ae2598cc2843f372c74ac865cfc689cab01fd6", - "freertos_kernel/portable/RVDS/ARM_CM4_MPU/port.c": "7e80a8e3ec8d3663d4328e5229097538462bc815fdc180628f6c3c79d7cda273", - "freertos_kernel/portable/RVDS/ARM_CM4_MPU/portmacro.h": "e2ca8e4429f2f297b01b08c918d0fb2f22721f98d9f7b24601d78cab3586b190", - "freertos_kernel/portable/RVDS/ARM_CM7/ReadMe.txt": "713e476f526189b6e505b019c8053cfb6c49d3e921ba7345d59413bd0c35815f", - "freertos_kernel/portable/RVDS/ARM_CM7/r0p1/port.c": "0e73531a5582e8606e792cf0bed7473b73391c054fd18238fcffd1828dfa5771", - "freertos_kernel/portable/RVDS/ARM_CM7/r0p1/portmacro.h": "012e87f3c58b5dda618594ea295ae1f0ae85e638cc3596821d8da26e5644638a", - "freertos_kernel/portable/Renesas/RX100/port.c": "35164a232ccca30b5f8c3d42f6632c89d50d5849ed967297f37fd2d32aa2fcf5", - "freertos_kernel/portable/Renesas/RX100/port_asm.src": "24139832eb5b234e3b04feb67116e67c1e9d9432fca0628a46fa8d068e46a58b", - "freertos_kernel/portable/Renesas/RX100/portmacro.h": "8970e293f3baf5622c385dac9b31199d74c17cb7226f2f88c61ece56cc31fd0d", - "freertos_kernel/portable/Renesas/RX100/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", - "freertos_kernel/portable/Renesas/RX200/port.c": "631bf7e9fc4302a519e4daca8cdffd5be0b0f50f5c55a19592d4e8075873c7f1", - "freertos_kernel/portable/Renesas/RX200/port_asm.src": "24139832eb5b234e3b04feb67116e67c1e9d9432fca0628a46fa8d068e46a58b", - "freertos_kernel/portable/Renesas/RX200/portmacro.h": "1030dd1b97f02e1a0b29f1cabeca189d5a528ddcff68ba2b19dc4d6d73c38e00", - "freertos_kernel/portable/Renesas/RX200/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", - "freertos_kernel/portable/Renesas/RX600/port.c": "4286656748fa319083217d88882e2f8ff700cb4885e03037bff84d2120f429b6", - "freertos_kernel/portable/Renesas/RX600/port_asm.src": "24139832eb5b234e3b04feb67116e67c1e9d9432fca0628a46fa8d068e46a58b", - "freertos_kernel/portable/Renesas/RX600/portmacro.h": "d556b336f9967991f9f578aea527297a06566f38787dac134a191e7ebe2213dd", - "freertos_kernel/portable/Renesas/RX600/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", - "freertos_kernel/portable/Renesas/RX600v2/port.c": "871474ea64f23c1122785cea65c0db6923b4042e5070bbba653b31c926942579", - "freertos_kernel/portable/Renesas/RX600v2/port_asm.src": "659d86327e4f0eb619ee359e7fc2573bec3efd985182359d336f27e1ff3898f1", - "freertos_kernel/portable/Renesas/RX600v2/portmacro.h": "d1c1a804975d417644403a4567b7200ab91760e49c37e343779ead0ada25606c", - "freertos_kernel/portable/Renesas/RX600v2/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", - "freertos_kernel/portable/Renesas/RX700v3_DPFPU/port.c": "47370d9fb0ea28bcb8ebd237376bc6b3b970100151746dd81bcf658ef02abd63", - "freertos_kernel/portable/Renesas/RX700v3_DPFPU/port_asm.src": "659d86327e4f0eb619ee359e7fc2573bec3efd985182359d336f27e1ff3898f1", - "freertos_kernel/portable/Renesas/RX700v3_DPFPU/portmacro.h": "8fb33d40cc920fd4293adc8cb5dffe0d23abb2600179bdc1e5b7b7e47b471902", - "freertos_kernel/portable/Renesas/RX700v3_DPFPU/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", - "freertos_kernel/portable/Renesas/SH2A_FPU/ISR_Support.inc": "79dbf7cc2c1081dce55646f1c0b872cb43a323c755d62245229d23fe616ff69e", - "freertos_kernel/portable/Renesas/SH2A_FPU/port.c": "9d92450836b0dc6450510b938cf5c7daf20667004389d037cdf064742f59bc70", - "freertos_kernel/portable/Renesas/SH2A_FPU/portasm.src": "c71f4a4ffc142800e467288c7e77760a2a54e12d267e4379e1ae55278c3e1223", - "freertos_kernel/portable/Renesas/SH2A_FPU/portmacro.h": "a4daddd97828d321cde3f362d8bf1d47e5aea4f926cf4cb1dd901ef3ab9590db", - "freertos_kernel/portable/Rowley/ARM7/readme.txt": "84a1379723e3ca3cb47a540622ed62e9900410ce65ea0584ce22426cbaf6745b", - "freertos_kernel/portable/Rowley/MSP430F449/port.c": "2af1ba1ec72b6582fa7d840d8e6e396fe3ec26049cd2fb90423723b96f8efa7f", - "freertos_kernel/portable/Rowley/MSP430F449/portasm.h": "51f3b0a04cd0c2766f005ed0145fc10e5dd83601a0d96c40553e980130a99f23", - "freertos_kernel/portable/Rowley/MSP430F449/portext.asm": "1c210e51fce8084e80c8f0efe1bb10925186ee222de226aeaa345c83d50a57fe", - "freertos_kernel/portable/Rowley/MSP430F449/portmacro.h": "fc377a281a6612fce58d122cf765d5531c13d0828c7f58918cefce066bd4a2b4", - "freertos_kernel/portable/SDCC/Cygnal/port.c": "b5f82aa391383ecdfc26c368871396ca4389969d0d29d435e8c94a9f326ef3ac", - "freertos_kernel/portable/SDCC/Cygnal/portmacro.h": "5309324b979c3c4436bc1079fcd8af18ba54c784cfbb2474ed415079645a60ff", - "freertos_kernel/portable/Softune/MB91460/__STD_LIB_sbrk.c": "92debca0c186966aaef800acd2a8f7cfdbddff1dca9eedc32fa28ecb473780ba", - "freertos_kernel/portable/Softune/MB91460/port.c": "cfc47c67c9d21431844f6744c9f5ea5fad97e1279b99473ec58e5676de7f9a9d", - "freertos_kernel/portable/Softune/MB91460/portmacro.h": "38d864faddb5ca5a6ec0f2816e9e95b0d4b3a93d73f6783ca7216b2c4c314d7b", - "freertos_kernel/portable/Softune/MB96340/__STD_LIB_sbrk.c": "70c748e9ded5a641b171124480225a336bb8b043c94bc13dc38e7574e59ad324", - "freertos_kernel/portable/Softune/MB96340/port.c": "d95febc65d4d325032bf5a5663be1d4da700086039c3b498ad8dbe77911c45bc", - "freertos_kernel/portable/Softune/MB96340/portmacro.h": "5b5b289631b86a732fc398219079ca25de11a3bd59697ee9b3297f0897db98df", - "freertos_kernel/portable/Tasking/ARM_CM4F/port.c": "e43bb64d51aa6e759091ef8af913eb7ff44a7bc81d96c8b937b9f2b32a454d12", - "freertos_kernel/portable/Tasking/ARM_CM4F/port_asm.asm": "a6786348a2bd721a6900f50f747a3dc43379972c3dd7828c1a5c0a91b2af19ee", - "freertos_kernel/portable/Tasking/ARM_CM4F/portmacro.h": "abc3d7fded2c07b7f797e6cdd4b2cdb382e040f87de87a1d9d8d143316e9f1d5", - "freertos_kernel/portable/ThirdParty/CDK/T-HEAD_CK802/port.c": "c40c3e54391a3fdb2902aa21eff8b77cbf46658a3917a968d0d912a914daa5d3", - "freertos_kernel/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S": "6db273fb79cfb3b9fa6bf69b15c72b2e462047a4ebdc70e08af5e62296c13f48", - "freertos_kernel/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h": "5b94cbc518978e9cd356fb95c9cd5ade37c1ff307f0621146473d2e69ed8f6ff", - "freertos_kernel/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c": "8b0ef852cb7bff2c95aa91209a09797e3b4c332bf2786cde63ce1a1283d3c6f8", - "freertos_kernel/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h": "f03bf54223ba7ebb1a4f7cbf8821b6c919e12ba50cd1c029624bd0bea8dbc70b", - "freertos_kernel/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s": "079b763c328307f0e0dd376e62f8df22667788050faf126682fe63782f54e336", - "freertos_kernel/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c": "786005ed937789d473588f3e68fe288f584afb33e15f599ca61a7232f84ea281", - "freertos_kernel/portable/ThirdParty/GCC/ARC_EM_HS/port.c": "d3bed4c2dadd9db69c968ba21208c0378d3f5b85140b7541c0d3ac670a4ccf4a", - "freertos_kernel/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h": "8edd8802176739de4c8ac8f7a8674502c9dcf3c9625cb3a24a20050920bf5de7", - "freertos_kernel/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c": "8b0ef852cb7bff2c95aa91209a09797e3b4c332bf2786cde63ce1a1283d3c6f8", - "freertos_kernel/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h": "f03bf54223ba7ebb1a4f7cbf8821b6c919e12ba50cd1c029624bd0bea8dbc70b", - "freertos_kernel/portable/ThirdParty/GCC/ARC_v1/arc_support.s": "8d00960eacfd0786b2ebf57382ea9e114ca214556bc21c53902f6ae8cb9b3365", - "freertos_kernel/portable/ThirdParty/GCC/ARC_v1/port.c": "d9cb238df48449c57b84b3e4dca15f55230c413a31ff61b7f130d76e5b1b9a2b", - "freertos_kernel/portable/ThirdParty/GCC/ARC_v1/portmacro.h": "9775d5d8d152c06dc63d606cddaa8178ff11d1260d507b101fc2d666e0882977", - "freertos_kernel/portable/ThirdParty/GCC/ARM_CM33_TFM/README.md": "5ef03f6137a0d76ea2eaf353bc1bba01d226f7b6c83138ffd6f26b45baecdf9e", - "freertos_kernel/portable/ThirdParty/GCC/ARM_CM33_TFM/os_wrapper_freertos.c": "c982e5b278797178f627213a52d0f8ee1ede312d26fc78d7721e684f3044fa51", - "freertos_kernel/portable/ThirdParty/GCC/ATmega/port.c": "77d786428254f8f82993acb36eb7269eb2b9bbed73364ab7236b541d2d56f73e", - "freertos_kernel/portable/ThirdParty/GCC/ATmega/portmacro.h": "f576b2cc25ce38764fae3d923fe13c130e163c1098e341d0d834a815c181dead", - "freertos_kernel/portable/ThirdParty/GCC/ATmega/readme.md": "f219267f64c4cb262bc08de164d801509d27bccb7e77881a1fe18ab4ae289c3a", - "freertos_kernel/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url": "79fbc2c019622ca13d55d76c41d600a1bf52d31bc5348597dfc0164957520939", - "freertos_kernel/portable/ThirdParty/GCC/Posix/port.c": "e00385440fbc53ce1e673ec803623a5c7a74c49117f7bf6425a59971690a0e05", - "freertos_kernel/portable/ThirdParty/GCC/Posix/portmacro.h": "5e22d659a7c9dd9974e3523de14b5606be319dd26c58b0920473fbb7541bfe00", - "freertos_kernel/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c": "1ddfc0eb3b6428a2e247f97427ecf0685be8d2a88c55d9cf02f59f8b2d38bcbb", - "freertos_kernel/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h": "b60bc7226d152b654e5aa3644c99cb46943288ff268e12d84a9d7f1fe147815a", - "freertos_kernel/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt": "84f2893ac61214ea73c695911a13b27bda63a7e6d58e0bf90587bd369d214d17", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c": "04439bc16c9e004f0bc9d194741d5fec816e2dd1f5e1c4c3963538921eea5dff", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h": "dcfdac565c63234879de523170b862604850cc0336ca7c6cb5430945f40fdb8b", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h": "b7004272e01e10c7a34f845fef5a6fcb680f8af2e2b7f5fd4cccf85f361a5793", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h": "ca9a563740926f8e7f4c9416d839fb2b01850969860f4ed46b6c18c88b6b99fd", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h": "bb279022f7498d5a34e71198ffc8c7df5ef1b5a02a47b4bfee77e07679376035", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h": "691ecd4526fd59eb13b6ab5636b429d1e85bc93de21ec3aba0094c92d57a2786", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h": "d9b8a4388d73a8b91fe6b37436c5ce8e9e1846c17391dcfbda1791ce2ca69ff7", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h": "445c8a982fd4234143da61ca0c7a622bbf5929d76fc1e971398c8ecaba4bc3f7", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/port.c": "71e33de0f0680e1ffcae2a62d7d20112466a4b37b3ccb8b8aa31ae127b3cb221", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S": "23286f7351106a181324a918a57f560373e2b5f0bb7fa3e101db0a50ae6eb7bb", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h": "5cbf3188e197f82a93f456c0f75e4aba54b6312e0f9dd510c2f4323839ca25f7", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h": "c1e451823cc388152f0d034e9ca3103eb106d6e763fa27d0d2156aabc8cd81f0", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S": "b9d8c64d04b26831a1d15d73647d14f8cd37a3132200c3442ddbcd78692addf9", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c": "ddc16959787fdd6487855103a5f1fc6cf0f606b14bc7a2baad99c210afbaf21b", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_intr.c": "c8bfbc77c9ba4f7e952578a103874ccd8b5b33ddd87af11d6bb2222dfd7e244d", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_intr_asm.S": "c8e9e144c40182f486f1a02057d37fe6619f710812a6b7e53c6881ad592eb96f", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S": "f20aa8a42bdcbec471278a2e8a26592997e4b04965668694d504e073c08f1bb8", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c": "171fc98a4981b0f468560b5cc81affe92589c087ff76745576577820b99840aa", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S": "c5abcdff7fda5b3c50cbcae88d3acb7eacf2f3fb6da1699d4cc4655494449347", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S": "47ca2b6631fdc803e338d80c4b7e13d80e0ca50b9918cecbc06e44098c0338c3", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/FreeRTOS-openocd.c": "04439bc16c9e004f0bc9d194741d5fec816e2dd1f5e1c4c3963538921eea5dff", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/portbenchmark.h": "dcfdac565c63234879de523170b862604850cc0336ca7c6cb5430945f40fdb8b", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/portmacro.h": "11729a32654ea53404566903477acdf073a439efe637d93997241e15a40ccc88", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_api.h": "ca9a563740926f8e7f4c9416d839fb2b01850969860f4ed46b6c18c88b6b99fd", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_config.h": "bb279022f7498d5a34e71198ffc8c7df5ef1b5a02a47b4bfee77e07679376035", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_context.h": "691ecd4526fd59eb13b6ab5636b429d1e85bc93de21ec3aba0094c92d57a2786", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_rtos.h": "d9b8a4388d73a8b91fe6b37436c5ce8e9e1846c17391dcfbda1791ce2ca69ff7", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_timer.h": "445c8a982fd4234143da61ca0c7a622bbf5929d76fc1e971398c8ecaba4bc3f7", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/port.c": "168dfdc0132b95b0b126db4da5d8a6223bf4065be6b6da203079f349ecc22a34", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/portasm.S": "e18c0feda7daa2a5abb31ff41180b9fd6fe57918743f1f0dfb2a0a99b255432a", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/portmux_impl.h": "5cbf3188e197f82a93f456c0f75e4aba54b6312e0f9dd510c2f4323839ca25f7", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/portmux_impl.inc.h": "c1e451823cc388152f0d034e9ca3103eb106d6e763fa27d0d2156aabc8cd81f0", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_context.S": "b9d8c64d04b26831a1d15d73647d14f8cd37a3132200c3442ddbcd78692addf9", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_init.c": "a2bef365b2bb4f0ca8ca6cbe869b6f729b764f8f94e63c5dee3daf6d6cfbee96", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_intr.c": "86322a1638250a182a10f31982e940c5c375d2e956b3f0e2638981bac4069479", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_intr_asm.S": "c8e9e144c40182f486f1a02057d37fe6619f710812a6b7e53c6881ad592eb96f", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_loadstore_handler.S": "f20aa8a42bdcbec471278a2e8a26592997e4b04965668694d504e073c08f1bb8", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_overlay_os_hook.c": "171fc98a4981b0f468560b5cc81affe92589c087ff76745576577820b99840aa", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_vector_defaults.S": "d3f4e09fc2db0ffee54eecbc1c63132fe291a0841a9e390acd3440e453d1e9c0", - "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_vectors.S": "f314d7f21b6e1986a5b6dea85a24a9dc3d57178c81618e6b438c726617195bed", - "freertos_kernel/portable/ThirdParty/XCC/Xtensa/Makefile": "62018ea2713263c1d80b4e67812100e057e014b5d87d4d539131e37d1e6f9d06", - "freertos_kernel/portable/ThirdParty/XCC/Xtensa/port.c": "322f55c5a37bd4b8382b3715309a7973d7d3eff44715d147ce33575fa0e81f68", - "freertos_kernel/portable/ThirdParty/XCC/Xtensa/portasm.S": "898cf46ea426e0b0218b3045b28a0783990208fa100eb43b2adab0880f7d9853", - "freertos_kernel/portable/ThirdParty/XCC/Xtensa/portbenchmark.h": "69400a05d9c47211fc10781f5967c55e4d6476d6df940204b2fbbd455bceefee", - "freertos_kernel/portable/ThirdParty/XCC/Xtensa/portclib.c": "4209f60ed2909c3e41485981d6be308c8a3c31145d4a9f2a99cbae187cf95f0b", - "freertos_kernel/portable/ThirdParty/XCC/Xtensa/portmacro.h": "25f22e1999911c656deb9a76b0c9ac8400ff47002915f0cf7d569323963422e8", - "freertos_kernel/portable/ThirdParty/XCC/Xtensa/porttrace.h": "9c9097ff31d12b4dc627df17576ac8187bda6b6a20c2df7eac75c4b36159a908", - "freertos_kernel/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt": "051e57e3bce362384d01200b41bafe895b933be0c7686534e623405853374fae", - "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_api.h": "b0de2bf6b2a24b19353189bca391df89b8a53f455dde46c97ea7685f76d61e23", - "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_config.h": "caa8552f8beac3ffd619e99d0d11cd3d9baa67356d18693dda2df95a15c62cf4", - "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_context.S": "90a79a5187cf5b7249e7fea665bd8a14d9d3f010c7357b13a74118f44eab3409", - "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_context.h": "dec667e4afa0f7d80cff7fa803a70947328a86fec6c3bedc590edbe433367328", - "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_init.c": "bab8cb718be58ec77896514063706c0d92530962becd7217dd2fb168b0dc1a06", - "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c": "bc1b4d1487e472294f54aa5274f056d9fa37a68ce155973c63e4e4cf6849b156", - "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S": "fa4fc88cb8fa69aa16eec52c809e28504e58f675498ed7fa1117f4bc928c3c86", - "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c": "562662e7df519a1408ce68fb295223fa66fa871d72e124dc620b1bc987e0f858", - "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h": "b578b18489c7519a0286d9497cded9dc49e4c6e9d98a3b59593dd627e7aeed5c", - "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h": "5380b8b46d8b03ef5c54d74727190d908fe1732b306adb91dfd3befb5934135e", - "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S": "bf8719c48506db41ab1385046ab78b23477656b3eba0135e203df8779e4c3555", - "freertos_kernel/portable/WizC/PIC18/Drivers/Tick/Tick.c": "86637b723f4b27377696175138f99da993daad689d2f99d9cd72330f476f4ec5", - "freertos_kernel/portable/WizC/PIC18/Drivers/Tick/isrTick.c": "41c9a92b628beea55f28004fccce7c6ac6f717bae67eb36177443277fe5df3ea", - "freertos_kernel/portable/WizC/PIC18/Install.bat": "38cc1f0ec2d0af3ae1c7bb4b12d137914114cc8e278b9f8a32deb4c463f9834b", - "freertos_kernel/portable/WizC/PIC18/addFreeRTOS.h": "9122bc1aabbd8f0b1179f5dfc451932d35ec288d404fd83576ddb714b946ad2c", - "freertos_kernel/portable/WizC/PIC18/port.c": "0318283026e1678a08e07cade52166a5284a4e8f18eb7e9994e5a39b6945323c", - "freertos_kernel/portable/WizC/PIC18/portmacro.h": "c8b9fd5c4572bb927dc174ca8cc324c6a43543c8599750a13bf1eb45057a8ef2", - "freertos_kernel/portable/oWatcom/16BitDOS/Flsh186/port.c": "6af37bc7e28f228f0c643a688b357dad5060c79bab0e2c0fd62e2873bc5b26fc", - "freertos_kernel/portable/oWatcom/16BitDOS/Flsh186/portmacro.h": "5422ae6957a88d59c79dc3aef13cf76413fd3b49c183e76830cbfd8018657dff", - "freertos_kernel/portable/oWatcom/16BitDOS/PC/port.c": "f8ba6c5a14b0755e9b629f11cfd0f338f328e8b99fcff1497a723462bd6c9e2b", - "freertos_kernel/portable/oWatcom/16BitDOS/PC/portmacro.h": "78c1b85b627ffdb66f549808e211caaea334726ec05e26faf4a763383ec2bb01", - "freertos_kernel/portable/oWatcom/16BitDOS/common/portasm.h": "1f6bb8f4a1855b22791bf1ba58b916cff671f365b8071a6708d5f65e04590b1d", - "freertos_kernel/portable/oWatcom/16BitDOS/common/portcomn.c": "0720d9d6be73c5607344533700c65a9cdaf8b1f5001037355ef5b732ece59bb9", + "freertos_kernel/portable/ARMClang/Use-the-GCC-ports.txt": "3c39fa98b62e8a40560cb283f011411ad850c9f521e8b635af7f81a37d5a13cc", + "freertos_kernel/portable/ARMv8M/ReadMe.txt": "f8ee247fe57cc51b810fdd571f04252213a1deb77ef87053afe7320b9fe3a069", + "freertos_kernel/portable/ARMv8M/copy_files.py": "09de5ce44f1996326cab4ddae531eb125fd80dd857af5a8e03b9e73ff9b05a53", + "freertos_kernel/portable/ARMv8M/non_secure/ReadMe.txt": "5f7390107fc6c25c53594f63b82655ed2558bf34df857b9b94025141bd05e14d", + "freertos_kernel/portable/ARMv8M/non_secure/port.c": "9254d35345746f17ae47766e793c77d9594edc6243579b7d8157a93a0910c9d0", + "freertos_kernel/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c": "53da47570f50f8b45d26b7a35997975022c8dfa852185a3b4ff3358e6c11c371", + "freertos_kernel/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h": "ddb6a7ed46eb95b466ddddb0534b638f9cae3831e907a3bbc248a9bb66e28d30", + "freertos_kernel/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c": "859a06c4c21607959a1faabd7fe0148cc7e0cb624bdc05dac9eaacb8476db125", + "freertos_kernel/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h": "ddb6a7ed46eb95b466ddddb0534b638f9cae3831e907a3bbc248a9bb66e28d30", + "freertos_kernel/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c": "91baafcd1489f9a5bf3ddb182d22e950fc376ae5c217680ce537520dbd604ea8", + "freertos_kernel/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h": "cc8b860d88403def6e05e30867056ed1ac0a993e4129c94733dd1fd767a7dd19", + "freertos_kernel/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c": "c1beb1d1e88c3859adfd6d13e2b0dc478abc144924caef37a63d6b674aa77ae8", + "freertos_kernel/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h": "cc8b860d88403def6e05e30867056ed1ac0a993e4129c94733dd1fd767a7dd19", + "freertos_kernel/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s": "05b44efce09dcf8b9bc78d0a8e4223a1aaf1477585e1eb9c202d8deb06db903b", + "freertos_kernel/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h": "ecf7789333d2eae4dffa36cadd312dddcaed2db135ab0ed60f80064bf75e35a2", + "freertos_kernel/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s": "99e2d5762155e1d4f4ea426ca32c8daaa3135606345b69ec67cabefbdba0597a", + "freertos_kernel/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h": "2aedeeb50a4c2e57278cc5e85fa80ac1afb4d00fd6f34449f94822808a7bb96d", + "freertos_kernel/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s": "1559d8a1be13c51a6af0e94fce8f960c286bb22ef7ad21202d627aff03f4473f", + "freertos_kernel/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h": "0d0cdb539f5c681aa83f5a78e2395fa776a3f48e312a404f134efb903f88cbd2", + "freertos_kernel/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s": "42ca7bcd0f3f0119ee957ffd69b8fd5f4f97eff8b94aeb4ac9454468f88dd481", + "freertos_kernel/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h": "0d0cdb539f5c681aa83f5a78e2395fa776a3f48e312a404f134efb903f88cbd2", + "freertos_kernel/portable/ARMv8M/non_secure/portasm.h": "eb63e885f48f5d45b649ead271bfce54c81d82fd42e0355072375e5af6d16c0c", + "freertos_kernel/portable/ARMv8M/secure/ReadMe.txt": "f8ee247fe57cc51b810fdd571f04252213a1deb77ef87053afe7320b9fe3a069", + "freertos_kernel/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c": "d38a8f3b8983613ac00ee0e506ec881c35b028ecf2512662cf3a09fbee8ab524", + "freertos_kernel/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c": "8dcf437f45daf7524eecabf60a13816c4bdf14f43a9dfe4215203c61fd5edaa7", + "freertos_kernel/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port.c": "c713b3a7c72b12ae6c6c0dea892d6ffeba6db514e8e2dd7d52404273d9262934", + "freertos_kernel/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s": "f465c2aca32ba9fc79850599422baa1b78a86e8cb182099e8f73298c835fef8e", + "freertos_kernel/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port.c": "c713b3a7c72b12ae6c6c0dea892d6ffeba6db514e8e2dd7d52404273d9262934", + "freertos_kernel/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s": "b3a7ea032cbc07f0cef45c2dceb9643c3c6c25cf15689fb0509a31b2a6ee2d84", + "freertos_kernel/portable/ARMv8M/secure/context/secure_context.c": "ca7338fa111e73eccf63059be2907542c788a3aa83365bdb94e207e1a0461116", + "freertos_kernel/portable/ARMv8M/secure/context/secure_context.h": "2ce8be6ad0b523eb28b43eec91aba7213434c2393ac6b2192b1c5fbf9b43c2ac", + "freertos_kernel/portable/ARMv8M/secure/heap/secure_heap.c": "15519a6878bec08878c8348e04cd271a3a520c031581663176fc0744369a0c9b", + "freertos_kernel/portable/ARMv8M/secure/heap/secure_heap.h": "97405b4c849d2b049989debb1f8fc57e9667736290a8afbffe29e633de6c27fe", + "freertos_kernel/portable/ARMv8M/secure/init/secure_init.c": "a5974925bf9d6a3e6c95f13133266fc96acdd0cd9b8bc2e4be58187f06f71160", + "freertos_kernel/portable/ARMv8M/secure/init/secure_init.h": "ed955f1e93779ad64b03873c63b45feec9fb145fcb0bcb8fa0869748f6f96744", + "freertos_kernel/portable/ARMv8M/secure/macros/secure_port_macros.h": "4b3d4543b6abb076c4a07da977eef326bf5b8c205142861c5e8c2ddb2d5f511f", + "freertos_kernel/portable/BCC/16BitDOS/Flsh186/port.c": "134f034c055259d1f68b39d2e68fa9da4a4eee10769698a03f2cd17f4688a25c", + "freertos_kernel/portable/BCC/16BitDOS/Flsh186/prtmacro.h": "d8a6e99b42b2ceef170f704c8e353fa0f2fe02d0b23ec06ccd1d5e6b6d9f6ae4", + "freertos_kernel/portable/BCC/16BitDOS/PC/port.c": "f606e0fa1a0d7c9f1b17b1aebf2ed3ddfa2c6600506cb0d548aae51d94f80db0", + "freertos_kernel/portable/BCC/16BitDOS/PC/prtmacro.h": "0a41ae6fdd4f3d8f0484d3a49c8bbff72816a2909d5349adf45c0a6a711817d6", + "freertos_kernel/portable/BCC/16BitDOS/common/portasm.h": "b614399210a24ec52b92a8814a546356fd602ad394919eeb5942e0ed5f8fe0a2", + "freertos_kernel/portable/BCC/16BitDOS/common/portcomn.c": "7aa2e611bd124742d6ab7d64e129652ed024f115a7c80b7854adda396967d699", + "freertos_kernel/portable/CCS/ARM_CM3/port.c": "e3299b3d1a7782618a2eaa5df04a123d4568f84cf25634fe0d014970e17468cf", + "freertos_kernel/portable/CCS/ARM_CM3/portasm.asm": "f9bba2b1cd5dc846b38cde1bdd5457e3c3ab102d4e89aa1e745133a4df3726a3", + "freertos_kernel/portable/CCS/ARM_CM3/portmacro.h": "96b0ef81209f69aeac54f12565ecda858bb663e516b4e378c0a0a6395488f65a", + "freertos_kernel/portable/CCS/ARM_CM4F/port.c": "c6155b913e0677392179fff5b898ec9acef2fc02dd3b925b211c9a7f2b65d4ab", + "freertos_kernel/portable/CCS/ARM_CM4F/portasm.asm": "d15f6288c9d80b2f76c4bc4575026c296f5296f6a50612ecc3a51ef3972ff683", + "freertos_kernel/portable/CCS/ARM_CM4F/portmacro.h": "bdac5e0002707af8b7820e7c4d0fb2f16027ac7ab53a266e0400ecc0a01638c3", + "freertos_kernel/portable/CCS/ARM_Cortex-R4/port.c": "1a3187606562fe7c34f125c0c8ad5e0df6a368f86f2fbdc745e0679f6c9d32b2", + "freertos_kernel/portable/CCS/ARM_Cortex-R4/portASM.asm": "a845348f24b019b01ce9390d358c91339988828b583398c940785e2d5bcdb777", + "freertos_kernel/portable/CCS/ARM_Cortex-R4/portmacro.h": "1a14c0a55baebd5dde05a8de9b8ee8876c4907f723795b836862e0138197c16e", + "freertos_kernel/portable/CCS/MSP430X/data_model.h": "349494ad579806942d82fb0b909aa0cde4f0ae998a57ee994bcd2bac3dcb8e93", + "freertos_kernel/portable/CCS/MSP430X/port.c": "33b4c07d761dc0c511848b6d7f4aad7c4be5808cd8892e53a8b277ac7ff4ee34", + "freertos_kernel/portable/CCS/MSP430X/portext.asm": "a540fa52834eca1f8badb903f9eef39b67970d9f409e71104fa5bdebca9c0e44", + "freertos_kernel/portable/CCS/MSP430X/portmacro.h": "486df65918c7f50ce3bebee0b6807225fdae77b2f4d9071ed39ed3102759c66a", + "freertos_kernel/portable/CodeWarrior/ColdFire_V1/port.c": "0c89f62e61f7f4456d80c6214efc617030c9ddc3f67eb35352ef050f7d3f7b5d", + "freertos_kernel/portable/CodeWarrior/ColdFire_V1/portasm.S": "0f51f8dc89ee69cf89018bf471cef4f6aee56d08fc4081d2f59315f810ec4b81", + "freertos_kernel/portable/CodeWarrior/ColdFire_V1/portmacro.h": "59a5ede0fd79c9fdef3290637097893704acc81ec3d7db96261e3382be3a4791", + "freertos_kernel/portable/CodeWarrior/ColdFire_V2/port.c": "192ae95e9d8dfed6d17e362904160e69b7745cc984ce3eb23dd743a376fb4aa9", + "freertos_kernel/portable/CodeWarrior/ColdFire_V2/portasm.S": "b7ad8bda3903e7091f69958016f7db13050c6055006df0a912a6f3799e0d5033", + "freertos_kernel/portable/CodeWarrior/ColdFire_V2/portmacro.h": "b473815c9f96b05afb83383db211d926e816db092a00473e0829a3353f6d9af3", + "freertos_kernel/portable/CodeWarrior/HCS12/port.c": "513fc16c267a24141adb8249778341666602525ea390c0c82ef392cc84229a9b", + "freertos_kernel/portable/CodeWarrior/HCS12/portmacro.h": "f77a65503e98ca5534a813d270a73664ffb523b85272810bd7d1c49ed9a29ce2", + "freertos_kernel/portable/Common/mpu_wrappers.c": "8d565e54fea7142f4e1016be0d30feca581ace2f5a023c97c71cf617cfe1b0be", + "freertos_kernel/portable/GCC/ARM7_AT91FR40008/port.c": "fdcc5b6b9b7bdc2c7909fb92ca1b6af8146e1c4441eca32e257db585cb6f57c3", + "freertos_kernel/portable/GCC/ARM7_AT91FR40008/portISR.c": "26b331cb3243008df0d289cb60e1e3c4910f9ae71cc80162fec8d1d22871b8f9", + "freertos_kernel/portable/GCC/ARM7_AT91FR40008/portmacro.h": "8d0681762c2fc98bf7fb7859d547f3b1291421d09e90be9b4cf28e8e2b847852", + "freertos_kernel/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h": "f3a274db2d037202effc40451f7c6679ce51fd2959a2a69780d449470e8ebda4", + "freertos_kernel/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h": "cfa4b00ec025e4678791d72f66beeaf82df64a58b17447bef3ab0e2e418d4978", + "freertos_kernel/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c": "054a9c450cdddd0c60f7996d10e86ba2111f0ceb4fe6b612b25d6f7ddc11a5b7", + "freertos_kernel/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h": "4e2476e3b3e0d28bcdd7ecbabaef96808a47835d5070dea1b1104635724fe6ac", + "freertos_kernel/portable/GCC/ARM7_AT91SAM7S/port.c": "7dfaf49394cb3514be2a3b0ba2dba65651976701b183fb6fef52dae6e9785c88", + "freertos_kernel/portable/GCC/ARM7_AT91SAM7S/portISR.c": "8c8fc571f6a602cd87559259b4ebaa8f1901169306d9e363a4593a5ee022f34a", + "freertos_kernel/portable/GCC/ARM7_AT91SAM7S/portmacro.h": "db665ca13ff6c874acfa06a9c7973cf18ed1c814b688e8b47e77f241aace91a5", + "freertos_kernel/portable/GCC/ARM7_LPC2000/port.c": "9e0881db0570eaf4b1ccef4ba985f922cf91d6e262a4d1dc3fba5f025606976a", + "freertos_kernel/portable/GCC/ARM7_LPC2000/portISR.c": "2742d0a79cfc60b83c6dbdf035f374e804a5cb5336564cbe385b20a6460cf7f2", + "freertos_kernel/portable/GCC/ARM7_LPC2000/portmacro.h": "ee7190ae11c036eb94aa2c9879100076385576dc707029f925c92f93d9964f5f", + "freertos_kernel/portable/GCC/ARM7_LPC23xx/port.c": "9770750b95861361f302b0d888612cb0b7aad7da8401474ceb8ed2d0355d0f6b", + "freertos_kernel/portable/GCC/ARM7_LPC23xx/portISR.c": "341c6699ddbf041c88cee6e81b4b17135fbba34573c969f22d37ce030a3ac68e", + "freertos_kernel/portable/GCC/ARM7_LPC23xx/portmacro.h": "e77935a4c141bb323a0456718453357c4df0933be3114b4c14f508c92b8e90d3", + "freertos_kernel/portable/GCC/ARM_CA53_64_BIT/port.c": "b62b2791059727ad3f774c83092479f8a680b076f1389fc9992ab1d9c5e56274", + "freertos_kernel/portable/GCC/ARM_CA53_64_BIT/portASM.S": "9689feb34adbb119bc3605c8f52b82fefc1278a12209d00f8012d520a224630c", + "freertos_kernel/portable/GCC/ARM_CA53_64_BIT/portmacro.h": "4929d7a55018ea9310dc5b148e0c129d36d3777c3e93fb851314a6cddd4fe88f", + "freertos_kernel/portable/GCC/ARM_CA9/port.c": "4531766976f80a4ccbc86cf0c4b2bc7520c6e42f73d7057628e80ce90bf377d8", + "freertos_kernel/portable/GCC/ARM_CA9/portASM.S": "f2f8f2fcb0240c29e342bd0d92d9fc439730c270343934aba6c0bdb6b6acb61c", + "freertos_kernel/portable/GCC/ARM_CA9/portmacro.h": "b3f6003d9e1978072e78c8b771d45832abc592665fb7dff34cc8bc3968c7d50b", + "freertos_kernel/portable/GCC/ARM_CM0/port.c": "805f6ae5eccc15787d9569b7e62de2bf97288a02baeff063ff9c27bc4d2a20b8", + "freertos_kernel/portable/GCC/ARM_CM0/portmacro.h": "41e68243d464f7b0ad900fec300519ea820041e2a4cebddb5cb42e291fdf60bd", + "freertos_kernel/portable/GCC/ARM_CM23/non_secure/port.c": "9254d35345746f17ae47766e793c77d9594edc6243579b7d8157a93a0910c9d0", + "freertos_kernel/portable/GCC/ARM_CM23/non_secure/portasm.c": "53da47570f50f8b45d26b7a35997975022c8dfa852185a3b4ff3358e6c11c371", + "freertos_kernel/portable/GCC/ARM_CM23/non_secure/portasm.h": "eb63e885f48f5d45b649ead271bfce54c81d82fd42e0355072375e5af6d16c0c", + "freertos_kernel/portable/GCC/ARM_CM23/non_secure/portmacro.h": "ddb6a7ed46eb95b466ddddb0534b638f9cae3831e907a3bbc248a9bb66e28d30", + "freertos_kernel/portable/GCC/ARM_CM23/secure/secure_context.c": "ca7338fa111e73eccf63059be2907542c788a3aa83365bdb94e207e1a0461116", + "freertos_kernel/portable/GCC/ARM_CM23/secure/secure_context.h": "2ce8be6ad0b523eb28b43eec91aba7213434c2393ac6b2192b1c5fbf9b43c2ac", + "freertos_kernel/portable/GCC/ARM_CM23/secure/secure_context_port.c": "d38a8f3b8983613ac00ee0e506ec881c35b028ecf2512662cf3a09fbee8ab524", + "freertos_kernel/portable/GCC/ARM_CM23/secure/secure_heap.c": "15519a6878bec08878c8348e04cd271a3a520c031581663176fc0744369a0c9b", + "freertos_kernel/portable/GCC/ARM_CM23/secure/secure_heap.h": "97405b4c849d2b049989debb1f8fc57e9667736290a8afbffe29e633de6c27fe", + "freertos_kernel/portable/GCC/ARM_CM23/secure/secure_init.c": "a5974925bf9d6a3e6c95f13133266fc96acdd0cd9b8bc2e4be58187f06f71160", + "freertos_kernel/portable/GCC/ARM_CM23/secure/secure_init.h": "ed955f1e93779ad64b03873c63b45feec9fb145fcb0bcb8fa0869748f6f96744", + "freertos_kernel/portable/GCC/ARM_CM23/secure/secure_port_macros.h": "4b3d4543b6abb076c4a07da977eef326bf5b8c205142861c5e8c2ddb2d5f511f", + "freertos_kernel/portable/GCC/ARM_CM23_NTZ/non_secure/port.c": "9254d35345746f17ae47766e793c77d9594edc6243579b7d8157a93a0910c9d0", + "freertos_kernel/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c": "859a06c4c21607959a1faabd7fe0148cc7e0cb624bdc05dac9eaacb8476db125", + "freertos_kernel/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h": "eb63e885f48f5d45b649ead271bfce54c81d82fd42e0355072375e5af6d16c0c", + "freertos_kernel/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h": "ddb6a7ed46eb95b466ddddb0534b638f9cae3831e907a3bbc248a9bb66e28d30", + "freertos_kernel/portable/GCC/ARM_CM3/port.c": "3eb252945ac532ddb85e73ff6ff371fe957dd43845787bb4bea350e6dcab6089", + "freertos_kernel/portable/GCC/ARM_CM3/portmacro.h": "2a29494e0b8c237cfe853d4a2e7a9b2a86cd05fc20a2be1ba46184c663477c9d", + "freertos_kernel/portable/GCC/ARM_CM33/non_secure/port.c": "9254d35345746f17ae47766e793c77d9594edc6243579b7d8157a93a0910c9d0", + "freertos_kernel/portable/GCC/ARM_CM33/non_secure/portasm.c": "91baafcd1489f9a5bf3ddb182d22e950fc376ae5c217680ce537520dbd604ea8", + "freertos_kernel/portable/GCC/ARM_CM33/non_secure/portasm.h": "eb63e885f48f5d45b649ead271bfce54c81d82fd42e0355072375e5af6d16c0c", + "freertos_kernel/portable/GCC/ARM_CM33/non_secure/portmacro.h": "cc8b860d88403def6e05e30867056ed1ac0a993e4129c94733dd1fd767a7dd19", + "freertos_kernel/portable/GCC/ARM_CM33/secure/secure_context.c": "ca7338fa111e73eccf63059be2907542c788a3aa83365bdb94e207e1a0461116", + "freertos_kernel/portable/GCC/ARM_CM33/secure/secure_context.h": "2ce8be6ad0b523eb28b43eec91aba7213434c2393ac6b2192b1c5fbf9b43c2ac", + "freertos_kernel/portable/GCC/ARM_CM33/secure/secure_context_port.c": "8dcf437f45daf7524eecabf60a13816c4bdf14f43a9dfe4215203c61fd5edaa7", + "freertos_kernel/portable/GCC/ARM_CM33/secure/secure_heap.c": "15519a6878bec08878c8348e04cd271a3a520c031581663176fc0744369a0c9b", + "freertos_kernel/portable/GCC/ARM_CM33/secure/secure_heap.h": "97405b4c849d2b049989debb1f8fc57e9667736290a8afbffe29e633de6c27fe", + "freertos_kernel/portable/GCC/ARM_CM33/secure/secure_init.c": "a5974925bf9d6a3e6c95f13133266fc96acdd0cd9b8bc2e4be58187f06f71160", + "freertos_kernel/portable/GCC/ARM_CM33/secure/secure_init.h": "ed955f1e93779ad64b03873c63b45feec9fb145fcb0bcb8fa0869748f6f96744", + "freertos_kernel/portable/GCC/ARM_CM33/secure/secure_port_macros.h": "4b3d4543b6abb076c4a07da977eef326bf5b8c205142861c5e8c2ddb2d5f511f", + "freertos_kernel/portable/GCC/ARM_CM33_NTZ/non_secure/port.c": "9254d35345746f17ae47766e793c77d9594edc6243579b7d8157a93a0910c9d0", + "freertos_kernel/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c": "c1beb1d1e88c3859adfd6d13e2b0dc478abc144924caef37a63d6b674aa77ae8", + "freertos_kernel/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h": "eb63e885f48f5d45b649ead271bfce54c81d82fd42e0355072375e5af6d16c0c", + "freertos_kernel/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h": "cc8b860d88403def6e05e30867056ed1ac0a993e4129c94733dd1fd767a7dd19", + "freertos_kernel/portable/GCC/ARM_CM3_MPU/port.c": "14f2ed29b3c658c566191c5ee995c4ecdcb4c74a5fac996fc2f97a98be456858", + "freertos_kernel/portable/GCC/ARM_CM3_MPU/portmacro.h": "b5f990b832b5407dda4952cc6ac33b105ba2bcd29cc3ee322fca5fea3ab0104f", + "freertos_kernel/portable/GCC/ARM_CM4F/port.c": "057f2e1d6abd50188f1f8d001ff0337deb60d6cec9a6f86999b1f1a88eea447a", + "freertos_kernel/portable/GCC/ARM_CM4F/portmacro.h": "f1f1a07b0345074533318e69678421c938bbb864de750c01017ec3a252ee853f", + "freertos_kernel/portable/GCC/ARM_CM4_MPU/port.c": "a0338a4aadad31eb91a536e89c1abe150e03aa1b966dd2595e7ef3712d0bfb77", + "freertos_kernel/portable/GCC/ARM_CM4_MPU/portmacro.h": "435b4b56ed7640cbea4719affc66e5b446d6d54a0e64b9ec1b731d527d437f54", + "freertos_kernel/portable/GCC/ARM_CM7/ReadMe.txt": "4061394a651eb7e4624abad4ec719148e153bd8eae666d0530319d83f9b39aa7", + "freertos_kernel/portable/GCC/ARM_CM7/r0p1/port.c": "9f22ac414d370340b2f8014989ade1f7e4dc1da10b25b544e30de1414917993b", + "freertos_kernel/portable/GCC/ARM_CM7/r0p1/portmacro.h": "fa291ede5ede1c8f7a70412c0ff1e40cae2aec1a5efba38b1d2d81e76b168508", + "freertos_kernel/portable/GCC/ARM_CR5/port.c": "b53d5efe6ecdef6fc4a0c9eaf6f66c45053fa1d9210495580c21c1f17b462de9", + "freertos_kernel/portable/GCC/ARM_CR5/portASM.S": "24373bfd9349d20b94b8e050cd4a66acbfaaf157eaf200089a586a1f90be80ab", + "freertos_kernel/portable/GCC/ARM_CR5/portmacro.h": "c904fd0410b6c5ee0af155b8530041d56c198dc1511e3ee897fcea1c78e0cb58", + "freertos_kernel/portable/GCC/ARM_CRx_No_GIC/port.c": "9c62f8a08abbb11a878ecf934093f9edd98c721f05c60512a75926ca71c6f4b4", + "freertos_kernel/portable/GCC/ARM_CRx_No_GIC/portASM.S": "cc809e9a9aebfaff4a9b8e30f2ef5f9371ce4a1cc5d6e701bac584c6c1b82ad7", + "freertos_kernel/portable/GCC/ARM_CRx_No_GIC/portmacro.h": "cb7bcd78648505473048f21966cea33e8bb923904c19175b4ab82ac740a8973a", + "freertos_kernel/portable/GCC/ATMega323/port.c": "1079ff281e0bc22670aec7f46fe004beaae679d8ffd44dfd2f50a15fec6c677d", + "freertos_kernel/portable/GCC/ATMega323/portmacro.h": "dfd23076fc989fa1afa01c10c085fa72150b518a7c2c6cd382ef1332eda9122e", + "freertos_kernel/portable/GCC/AVR32_UC3/exception.S": "8f3d945d526ff31d6e4303bd6b2bb55c85e2c2498c08194f95740e516c2c433d", + "freertos_kernel/portable/GCC/AVR32_UC3/port.c": "6a8fb77834ae5a4732a51da3013e5f78b5cf85fab469278b2e9a5c933530fb3b", + "freertos_kernel/portable/GCC/AVR32_UC3/portmacro.h": "296f3ab0d72fb275c2ca11c6506d1ad323213d3d3ca5a9caf0fbb6fe4bc016bc", + "freertos_kernel/portable/GCC/AVR_AVRDx/port.c": "782632583ad4a3a4a8a1a52c0284703a1644249c3aa4d4ec2a15ce72e68d2fe6", + "freertos_kernel/portable/GCC/AVR_AVRDx/porthardware.h": "3b64b4d72e6f95c048b6822a92ae00cb600ce9d9e32bc72abbe32889cf822028", + "freertos_kernel/portable/GCC/AVR_AVRDx/portmacro.h": "7691e593f41573d86568ca0a8c0860c527b1de51f2c5b15c9738e2cc28ac623c", + "freertos_kernel/portable/GCC/AVR_Mega0/port.c": "219956cb72450f417332d070bbfa20f3ce45e56c6a06f329887e03b293112f82", + "freertos_kernel/portable/GCC/AVR_Mega0/porthardware.h": "d267a6b2518f4ba3dcf211a592cc293490fff1b85cc7168db75ffdde129c0510", + "freertos_kernel/portable/GCC/AVR_Mega0/portmacro.h": "66747480f4f3c3077612ec5828ef1be5c6826081a6802d7d22098b06a56b0289", + "freertos_kernel/portable/GCC/CORTUS_APS3/port.c": "a70ec824dc632ead2396a41e7dafd0b2a8b3ac387cad1941754e2559c58b2ce6", + "freertos_kernel/portable/GCC/CORTUS_APS3/portmacro.h": "4bfa1c21e7dde156eacfdbb5d441d4de82b33f4f541e7b0e1e0a1922f0900007", + "freertos_kernel/portable/GCC/ColdFire_V2/port.c": "2518bcc1c5539052565a7ea22fbf2c856658afb7bb952dff0e9a7df5c5875bf8", + "freertos_kernel/portable/GCC/ColdFire_V2/portasm.S": "5149a5ba7a2ab179f79d4a46fb767aeae4b9aceef6ceca70e18381412f1ec705", + "freertos_kernel/portable/GCC/ColdFire_V2/portmacro.h": "f1941b9d877019c0689d70c992c4105e8b9db5ce24f52dc29d8dfe117b1b1431", + "freertos_kernel/portable/GCC/H8S2329/port.c": "c84ad89fdb43a1580417060b452f75ee0f7720b7a1acd29c0db6eb7d71b34d46", + "freertos_kernel/portable/GCC/H8S2329/portmacro.h": "d92a290ab90896c2a83f4b93d175631284630ac93a9a89eb2d83878462c741ca", + "freertos_kernel/portable/GCC/HCS12/port.c": "a7d9e4bdbc95e3c53707a3d4d0bda79c56d962b65e617491f12deeb7ce76d427", + "freertos_kernel/portable/GCC/HCS12/portmacro.h": "1398b281344d83637014836a45743d5b030ca6524b34a283652a5a9e7cc1cf0f", + "freertos_kernel/portable/GCC/IA32_flat/ISR_Support.h": "c862f470b1a5a66e2d9a5f89ee5d1e41c37281d86e8b1db61e54cf208afa9ced", + "freertos_kernel/portable/GCC/IA32_flat/port.c": "fe9d01965578754f6813715485755fa8ff307addd97bdf0592a1b28d8e91572a", + "freertos_kernel/portable/GCC/IA32_flat/portASM.S": "a31f94401a6c1d90047500cfd2d191172727af3eca825e82880301db64afa953", + "freertos_kernel/portable/GCC/IA32_flat/portmacro.h": "0da3639ad46d6cdf01d1bed3ff58cb1d960a8b9b67ed1b66b471458abb806463", + "freertos_kernel/portable/GCC/MCF5235/port.c": "c05e7609e30ce09e89fd372609361967ca7cf0a13140d48a6f3c21b4b79463c4", + "freertos_kernel/portable/GCC/MCF5235/portmacro.h": "69aa3ee2d7123a25dc0e3ad529bf5df24f5be379a7c7ad16ff454a84c93b4ee2", + "freertos_kernel/portable/GCC/MSP430F449/port.c": "3e9cddb8e1fe03cd49ed46662f7775fae1e1366469f5734b071b107e6a8a14c5", + "freertos_kernel/portable/GCC/MSP430F449/portmacro.h": "d0c21f91f3cb0aa4cb7182a3482baad5e86821261b668df7210ffb4bbc75bf7d", + "freertos_kernel/portable/GCC/MicroBlaze/port.c": "ab8d58a9aa7f97788c76c9e5d116cf4c6b10583a94ddae2de322edd9429acabe", + "freertos_kernel/portable/GCC/MicroBlaze/portasm.s": "be8c3729ce41a1f85bfb5d7733b5d3cd270cb342f89de4b24ac75da16dc8f3f7", + "freertos_kernel/portable/GCC/MicroBlaze/portmacro.h": "95320776eec571a83688724fb5f8270df4ea5eb5c8d099c5cd3e71b29723445c", + "freertos_kernel/portable/GCC/MicroBlazeV8/port.c": "df3ec3641eb0083b872cfe0d7dc7e272bdaa933ff959da7cef72d3930ea442dc", + "freertos_kernel/portable/GCC/MicroBlazeV8/port_exceptions.c": "efb92d1f5836cff3f20b894f04d4ef102a07f8330677f225932242a21863c30b", + "freertos_kernel/portable/GCC/MicroBlazeV8/portasm.S": "c62ab0e7050d8636d5e390bba3307322331d0b9b9c27b44303860e5172bf2d72", + "freertos_kernel/portable/GCC/MicroBlazeV8/portmacro.h": "169f3581a718ae4ecce02a4dd475c7f032b83c018831e461ed7bca30c0515119", + "freertos_kernel/portable/GCC/MicroBlazeV9/port.c": "1b6f8cbd89c030cd3678d132168ff64e1d4ba4a44e10cebdf9570b4febc4d037", + "freertos_kernel/portable/GCC/MicroBlazeV9/port_exceptions.c": "efb92d1f5836cff3f20b894f04d4ef102a07f8330677f225932242a21863c30b", + "freertos_kernel/portable/GCC/MicroBlazeV9/portasm.S": "c62ab0e7050d8636d5e390bba3307322331d0b9b9c27b44303860e5172bf2d72", + "freertos_kernel/portable/GCC/MicroBlazeV9/portmacro.h": "169f3581a718ae4ecce02a4dd475c7f032b83c018831e461ed7bca30c0515119", + "freertos_kernel/portable/GCC/NiosII/port.c": "ea3ca4821f1dca55aa659dba2b63f9fca4de08d7e344322feef8b5d586e01c0d", + "freertos_kernel/portable/GCC/NiosII/port_asm.S": "a4f47e2f7d20b79274c43a1e312d189459d9fc98d55478aa0d47a8a21b58b247", + "freertos_kernel/portable/GCC/NiosII/portmacro.h": "9ce152893ad1845097c01f4a2cd8a0f9b967891e212efa5d783ad1e2b85390af", + "freertos_kernel/portable/GCC/PPC405_Xilinx/FPU_Macros.h": "663bd22588b69a380ea4c6a6b3134229b38a7c718b8c3c107b3b6f4b3bac71b7", + "freertos_kernel/portable/GCC/PPC405_Xilinx/port.c": "1e3bcfc61ced3009a81882a412e5b6bc6662eda2bfa8e78b417c38959c3442d3", + "freertos_kernel/portable/GCC/PPC405_Xilinx/portasm.S": "44b28d81c73c782bb7cbc03f826bd886a196081abb292b9cf6a7969e02add68c", + "freertos_kernel/portable/GCC/PPC405_Xilinx/portmacro.h": "04fc50d27d9e81bd98ad399e6bfd1b59ca27824afb285b3d7fddf3e9f528aff0", + "freertos_kernel/portable/GCC/PPC440_Xilinx/FPU_Macros.h": "663bd22588b69a380ea4c6a6b3134229b38a7c718b8c3c107b3b6f4b3bac71b7", + "freertos_kernel/portable/GCC/PPC440_Xilinx/port.c": "5b5ee01e9183d29e3bd8aa00d5a96533d60da6d8d9f20f499a97e4cae19d4528", + "freertos_kernel/portable/GCC/PPC440_Xilinx/portasm.S": "44b28d81c73c782bb7cbc03f826bd886a196081abb292b9cf6a7969e02add68c", + "freertos_kernel/portable/GCC/PPC440_Xilinx/portmacro.h": "04fc50d27d9e81bd98ad399e6bfd1b59ca27824afb285b3d7fddf3e9f528aff0", + "freertos_kernel/portable/GCC/RISC-V/Documentation.url": "03b58eac9262370ca618c78e81f36deca511ab3ff9142d719bae84afd9c9e865", + "freertos_kernel/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h": "547cf38fd46e6b036860cd4e1c733cefafee91022e77dad2b34cdc2dbbe03c64", + "freertos_kernel/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h": "8e0502a75ec1d25669a0a0e9e955f4522e53773282b41ca68355aed58e4574b8", + "freertos_kernel/portable/GCC/RISC-V/chip_specific_extensions/readme.txt": "9df008f8587b6faaaa48ef37ce9e38f89639290d636c06f5eefb09848ac318d1", + "freertos_kernel/portable/GCC/RISC-V/port.c": "7246d147706001999968d014a36c0d0fd2894bfb21512b668ae91af60a78ca2e", + "freertos_kernel/portable/GCC/RISC-V/portASM.S": "4dd985e3e1b68890fe06c6c9edf8bd5cae853fadcdc2bc18e2c94a418692ad5e", + "freertos_kernel/portable/GCC/RISC-V/portmacro.h": "cced653f2a223b5d705f3973a66d6e43d420ea28389369e78a378f0a2893a2ba", + "freertos_kernel/portable/GCC/RISC-V/readme.txt": "9df008f8587b6faaaa48ef37ce9e38f89639290d636c06f5eefb09848ac318d1", + "freertos_kernel/portable/GCC/RL78/isr_support.h": "ea1329df2360210274ab1d2e92d92f437c3f891a735f8ac21c66fcfb210c56e4", + "freertos_kernel/portable/GCC/RL78/port.c": "88681a7183c76ab8c8d0bc4e5497d64bc2a560bb4cd1499058ea700150e09ebf", + "freertos_kernel/portable/GCC/RL78/portasm.S": "fcbb7d9951ca0fec1aa2e5e8e9e87e54eb89f4ef55e261eefaaa3b1873959570", + "freertos_kernel/portable/GCC/RL78/portmacro.h": "47537e01d6b360fdd2da59aa9d2dc11d5a8a3091a40bdb26724f0090106b4d1a", + "freertos_kernel/portable/GCC/RX100/port.c": "89789084faa0afe64481c92594f26888db2fbb281cff53ba6b0538cee1144bde", + "freertos_kernel/portable/GCC/RX100/portmacro.h": "739b9b5650ed293f35270afa4a15c7379b5c962bff1b4f131cc97a3fcbc46de6", + "freertos_kernel/portable/GCC/RX100/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", + "freertos_kernel/portable/GCC/RX200/port.c": "d4d63479be41c24b3c453e71d29f1caac3f42ec1b0de4f15470d1fea33d6cf6a", + "freertos_kernel/portable/GCC/RX200/portmacro.h": "fe9c886b2c63cb6bdcbfd00207cc18dacd59435f95a3e56c3638260be1956f1d", + "freertos_kernel/portable/GCC/RX600/port.c": "2b8a969a480033f49bdbea734e955ac4cade7a1bed04af06ed90093355e3abd7", + "freertos_kernel/portable/GCC/RX600/portmacro.h": "7c20830e3fa18f69b5193d759cf254360ca2c9ce84f3e01eefae9da643c39e12", + "freertos_kernel/portable/GCC/RX600/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", + "freertos_kernel/portable/GCC/RX600v2/port.c": "fded6df2a8362893090d427b14f7acbead0e8deb4f268828299c9acc9fc0aab3", + "freertos_kernel/portable/GCC/RX600v2/portmacro.h": "7c20830e3fa18f69b5193d759cf254360ca2c9ce84f3e01eefae9da643c39e12", + "freertos_kernel/portable/GCC/RX600v2/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", + "freertos_kernel/portable/GCC/RX700v3_DPFPU/port.c": "89ffd8ac4f9d0528b96dfbf5ba057f68996d8b34af7e21b7e728bce545baafb4", + "freertos_kernel/portable/GCC/RX700v3_DPFPU/portmacro.h": "8a8eece97eba36688e497b2104b034f851cd60d4b5689f79d36baae273a34265", + "freertos_kernel/portable/GCC/RX700v3_DPFPU/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", + "freertos_kernel/portable/GCC/STR75x/port.c": "2a42d65c944433c256a9e0366092b0df052fddd40d35d3067b105b627f2b5cf3", + "freertos_kernel/portable/GCC/STR75x/portISR.c": "dec4fe09c32fc03d014f8868934874018f43c99bf6977a22f3ba973e24ce4532", + "freertos_kernel/portable/GCC/STR75x/portmacro.h": "7f6c4f054889e8310f5263b3c2ff7c0ad7a0b98cbdc4ee3b290a68f8437b71b3", + "freertos_kernel/portable/GCC/TriCore_1782/port.c": "a6198bcbe394eb0943aad0d1c59c373bf3223e0fcc8acc8c1d376551f5406260", + "freertos_kernel/portable/GCC/TriCore_1782/portmacro.h": "f731dfb32c867d302493c9e18ea49a590ba7f0ba2496a376961b79f130ece0e1", + "freertos_kernel/portable/GCC/TriCore_1782/porttrap.c": "e6df9eb9c6dce84a50ffbb37cac26337bab08415facd76ceead1c643727a6316", + "freertos_kernel/portable/IAR/78K0R/ISR_Support.h": "49c4fa21cb6bb8f7cc1b92a914cf97dc302e652ea38a60ce99f362aea6bbc913", + "freertos_kernel/portable/IAR/78K0R/port.c": "dddf260ccba67c1d0e34b3dc8d5a045b270086acd5bf663f3c50b3d607a54021", + "freertos_kernel/portable/IAR/78K0R/portasm.s26": "18401f53bc6514ede283dac8b2ce91e0b8523fd4f67a93f7b69dcc6958bc5e1c", + "freertos_kernel/portable/IAR/78K0R/portmacro.h": "b5995e64de5d88ec3e62b54fdf6f5b84d8f3defc648959c7708c8896f97c3b88", + "freertos_kernel/portable/IAR/ARM_CA5_No_GIC/port.c": "6a5e26065161b051259b2cd1d81f1f2d914d1e8e338618b802080802b02dfd7c", + "freertos_kernel/portable/IAR/ARM_CA5_No_GIC/portASM.h": "d92f9da4a2f5d9f3d8977995683ef97797ca3444805273ac3884a55cf6b223df", + "freertos_kernel/portable/IAR/ARM_CA5_No_GIC/portASM.s": "789aeb05b0f0a0007b51e5d8aed838968a2d70cb4a82f7adc82c9c8f3fe7dffe", + "freertos_kernel/portable/IAR/ARM_CA5_No_GIC/portmacro.h": "3ffdb387d178093088ee0e50c2b839c61c583beec8a3a1fb34ed59b771330759", + "freertos_kernel/portable/IAR/ARM_CA9/port.c": "3555f85dd7e442789e3b75fb93ae44877ea9060356614050144de5dc88ae6240", + "freertos_kernel/portable/IAR/ARM_CA9/portASM.h": "ab5873837e5f5e52dff3f35fb1a2982a3bbf84d0743cab22ea89f45af054f648", + "freertos_kernel/portable/IAR/ARM_CA9/portASM.s": "bbfc5a61d6c94560591ca69717dcabf770f3da9f8d1c21b3b81b0a44d8a2e3a5", + "freertos_kernel/portable/IAR/ARM_CA9/portmacro.h": "fde5514437f5de407ed792b5ab6f6de91d2d343005ef20d252a72deeb29c660d", + "freertos_kernel/portable/IAR/ARM_CM0/port.c": "44a338445d511022fca618e4802c8dc9d7ab799873beb795ff4d17f81c8fae2d", + "freertos_kernel/portable/IAR/ARM_CM0/portasm.s": "e92b1aee884b8d1ce3aeaf56c520fa6b1a5cd5b4f4a6e76d55332b034f5056fe", + "freertos_kernel/portable/IAR/ARM_CM0/portmacro.h": "d9f513c0764293112dd601064de6d4c3cd1b5997603b0f67a6ca1f47e14dad61", + "freertos_kernel/portable/IAR/ARM_CM23/non_secure/port.c": "9254d35345746f17ae47766e793c77d9594edc6243579b7d8157a93a0910c9d0", + "freertos_kernel/portable/IAR/ARM_CM23/non_secure/portasm.h": "eb63e885f48f5d45b649ead271bfce54c81d82fd42e0355072375e5af6d16c0c", + "freertos_kernel/portable/IAR/ARM_CM23/non_secure/portasm.s": "05b44efce09dcf8b9bc78d0a8e4223a1aaf1477585e1eb9c202d8deb06db903b", + "freertos_kernel/portable/IAR/ARM_CM23/non_secure/portmacro.h": "ecf7789333d2eae4dffa36cadd312dddcaed2db135ab0ed60f80064bf75e35a2", + "freertos_kernel/portable/IAR/ARM_CM23/secure/secure_context.c": "ca7338fa111e73eccf63059be2907542c788a3aa83365bdb94e207e1a0461116", + "freertos_kernel/portable/IAR/ARM_CM23/secure/secure_context.h": "2ce8be6ad0b523eb28b43eec91aba7213434c2393ac6b2192b1c5fbf9b43c2ac", + "freertos_kernel/portable/IAR/ARM_CM23/secure/secure_context_port.c": "c713b3a7c72b12ae6c6c0dea892d6ffeba6db514e8e2dd7d52404273d9262934", + "freertos_kernel/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s": "f465c2aca32ba9fc79850599422baa1b78a86e8cb182099e8f73298c835fef8e", + "freertos_kernel/portable/IAR/ARM_CM23/secure/secure_heap.c": "15519a6878bec08878c8348e04cd271a3a520c031581663176fc0744369a0c9b", + "freertos_kernel/portable/IAR/ARM_CM23/secure/secure_heap.h": "97405b4c849d2b049989debb1f8fc57e9667736290a8afbffe29e633de6c27fe", + "freertos_kernel/portable/IAR/ARM_CM23/secure/secure_init.c": "a5974925bf9d6a3e6c95f13133266fc96acdd0cd9b8bc2e4be58187f06f71160", + "freertos_kernel/portable/IAR/ARM_CM23/secure/secure_init.h": "ed955f1e93779ad64b03873c63b45feec9fb145fcb0bcb8fa0869748f6f96744", + "freertos_kernel/portable/IAR/ARM_CM23/secure/secure_port_macros.h": "4b3d4543b6abb076c4a07da977eef326bf5b8c205142861c5e8c2ddb2d5f511f", + "freertos_kernel/portable/IAR/ARM_CM23_NTZ/non_secure/port.c": "9254d35345746f17ae47766e793c77d9594edc6243579b7d8157a93a0910c9d0", + "freertos_kernel/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h": "eb63e885f48f5d45b649ead271bfce54c81d82fd42e0355072375e5af6d16c0c", + "freertos_kernel/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s": "99e2d5762155e1d4f4ea426ca32c8daaa3135606345b69ec67cabefbdba0597a", + "freertos_kernel/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h": "2aedeeb50a4c2e57278cc5e85fa80ac1afb4d00fd6f34449f94822808a7bb96d", + "freertos_kernel/portable/IAR/ARM_CM3/port.c": "ab3ca84d8c3596865978d15835e5764268c33eaed9b860441c8a7b32d7b7757f", + "freertos_kernel/portable/IAR/ARM_CM3/portasm.s": "c55ce3368add7bb5027b1c05e4e781b811217f6680e05100fcb2a57e579a543c", + "freertos_kernel/portable/IAR/ARM_CM3/portmacro.h": "91a78cffde945daf74cea1f21c96638e4e35c5a36ea0049e161afc4b62a104c7", + "freertos_kernel/portable/IAR/ARM_CM33/non_secure/port.c": "9254d35345746f17ae47766e793c77d9594edc6243579b7d8157a93a0910c9d0", + "freertos_kernel/portable/IAR/ARM_CM33/non_secure/portasm.h": "eb63e885f48f5d45b649ead271bfce54c81d82fd42e0355072375e5af6d16c0c", + "freertos_kernel/portable/IAR/ARM_CM33/non_secure/portasm.s": "1559d8a1be13c51a6af0e94fce8f960c286bb22ef7ad21202d627aff03f4473f", + "freertos_kernel/portable/IAR/ARM_CM33/non_secure/portmacro.h": "0d0cdb539f5c681aa83f5a78e2395fa776a3f48e312a404f134efb903f88cbd2", + "freertos_kernel/portable/IAR/ARM_CM33/secure/secure_context.c": "ca7338fa111e73eccf63059be2907542c788a3aa83365bdb94e207e1a0461116", + "freertos_kernel/portable/IAR/ARM_CM33/secure/secure_context.h": "2ce8be6ad0b523eb28b43eec91aba7213434c2393ac6b2192b1c5fbf9b43c2ac", + "freertos_kernel/portable/IAR/ARM_CM33/secure/secure_context_port.c": "c713b3a7c72b12ae6c6c0dea892d6ffeba6db514e8e2dd7d52404273d9262934", + "freertos_kernel/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s": "b3a7ea032cbc07f0cef45c2dceb9643c3c6c25cf15689fb0509a31b2a6ee2d84", + "freertos_kernel/portable/IAR/ARM_CM33/secure/secure_heap.c": "15519a6878bec08878c8348e04cd271a3a520c031581663176fc0744369a0c9b", + "freertos_kernel/portable/IAR/ARM_CM33/secure/secure_heap.h": "97405b4c849d2b049989debb1f8fc57e9667736290a8afbffe29e633de6c27fe", + "freertos_kernel/portable/IAR/ARM_CM33/secure/secure_init.c": "a5974925bf9d6a3e6c95f13133266fc96acdd0cd9b8bc2e4be58187f06f71160", + "freertos_kernel/portable/IAR/ARM_CM33/secure/secure_init.h": "ed955f1e93779ad64b03873c63b45feec9fb145fcb0bcb8fa0869748f6f96744", + "freertos_kernel/portable/IAR/ARM_CM33/secure/secure_port_macros.h": "4b3d4543b6abb076c4a07da977eef326bf5b8c205142861c5e8c2ddb2d5f511f", + "freertos_kernel/portable/IAR/ARM_CM33_NTZ/non_secure/port.c": "9254d35345746f17ae47766e793c77d9594edc6243579b7d8157a93a0910c9d0", + "freertos_kernel/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h": "eb63e885f48f5d45b649ead271bfce54c81d82fd42e0355072375e5af6d16c0c", + "freertos_kernel/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s": "42ca7bcd0f3f0119ee957ffd69b8fd5f4f97eff8b94aeb4ac9454468f88dd481", + "freertos_kernel/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h": "0d0cdb539f5c681aa83f5a78e2395fa776a3f48e312a404f134efb903f88cbd2", + "freertos_kernel/portable/IAR/ARM_CM4F/port.c": "58b89174a266658ca133f94d5c2bed8de67b57ef8e7d3317a972d675941bdf51", + "freertos_kernel/portable/IAR/ARM_CM4F/portasm.s": "9ea6203a65789bfb3c2498782ffa15de6ed958d4690f0aea976900c60e2cbbd0", + "freertos_kernel/portable/IAR/ARM_CM4F/portmacro.h": "c3bec472b026fc62b86399462e26c1ef3ba46861d4c16460ddb80e583758c26e", + "freertos_kernel/portable/IAR/ARM_CM4F_MPU/port.c": "058c0b23102494dbe584f6e2f3b0f99dea814f44a28c0e04e3f4ccfdae3792b0", + "freertos_kernel/portable/IAR/ARM_CM4F_MPU/portasm.s": "66cebd2925938fc66130dda373b1f4d20edfc87abfbe6ed82273d1b62e7b190c", + "freertos_kernel/portable/IAR/ARM_CM4F_MPU/portmacro.h": "63dc9ffc2bc7b8a5dac4ecf5260da45639c260fb91b65a61742bd4a496008324", + "freertos_kernel/portable/IAR/ARM_CM7/ReadMe.txt": "9991c375912b69f89d97fd3451459a4980f97787c6cb5c21d64e520bfb7c688e", + "freertos_kernel/portable/IAR/ARM_CM7/r0p1/port.c": "fa48cc7c3ef3162f8fad0e69157dc7e87bfc975af01374f9d7e7e2b6e9f241a2", + "freertos_kernel/portable/IAR/ARM_CM7/r0p1/portasm.s": "497e1e18e63810d9eb8920335ea034031267d9a5860e9ca0bdd394fa65521c48", + "freertos_kernel/portable/IAR/ARM_CM7/r0p1/portmacro.h": "394f8cf9701b3c0e8dacfdd3d1c069dea214e9c009a5331f96c21bc48dd4c3c5", + "freertos_kernel/portable/IAR/ARM_CRx_No_GIC/port.c": "3cb0e101d2cee2f5072e1d352e19896b1b139bcf455130f7cd778a57b72f895f", + "freertos_kernel/portable/IAR/ARM_CRx_No_GIC/portASM.s": "c19388cd0e6b4e20c4f35176e5f6905b0d2d712ec5ce55f83762e12261fc9260", + "freertos_kernel/portable/IAR/ARM_CRx_No_GIC/portmacro.h": "5550db9f1b5f9f55c08ab53aaf8b4a5788fcd3c6b8a4280cf0753afc5f0a21e3", + "freertos_kernel/portable/IAR/ATMega323/port.c": "f0eb947e65001716aba9e9bbd9f1038806cf204533c03881f2527b3050356697", + "freertos_kernel/portable/IAR/ATMega323/portmacro.h": "fbdf5ebbb79bdd704a76dd251a8ded037edc8d639ec871300709c45b49f60053", + "freertos_kernel/portable/IAR/ATMega323/portmacro.s90": "0827ce04165aea404a125460e334ed80f4929fdbf57453c4cdedf725435942bb", + "freertos_kernel/portable/IAR/AVR32_UC3/exception.s82": "b51ccec0ffabcfed5003f0c96a8124a2050c94a5d5dbfc0a0eb11e58d9ca0176", + "freertos_kernel/portable/IAR/AVR32_UC3/port.c": "42356698b922d2f0fd1fdbb39e39e5c1b86bafaa332dfed90407e71494614aab", + "freertos_kernel/portable/IAR/AVR32_UC3/portmacro.h": "4c1e556d050bbbd667ac0ce936964e57afc0e0476c142c227af109fb75d19e56", + "freertos_kernel/portable/IAR/AVR32_UC3/read.c": "07b6384e325351be59fe01133c233180002e059fc4c084a2d8ece4f989c06aa8", + "freertos_kernel/portable/IAR/AVR32_UC3/write.c": "49735b1d2fa89c09f15859dcd26aa7e3899736df65a4f98770300de01243dacb", + "freertos_kernel/portable/IAR/AVR_AVRDx/port.c": "845c13e95199e0735f7ee2e44570f0ddb7f397861c9dcd065ad5b8f5430483ef", + "freertos_kernel/portable/IAR/AVR_AVRDx/porthardware.h": "02a304f91a8b029872dc79719e33c9b6f6dde539ba3e7ef798804e9aa4a8ab25", + "freertos_kernel/portable/IAR/AVR_AVRDx/portmacro.h": "d29af5ea7336cb7665ba3b4799f988c57f20dad2f2c757930ac7d012bab9d356", + "freertos_kernel/portable/IAR/AVR_AVRDx/portmacro.s90": "8356cb427a2df08c7cc8ce59417e5a959f4ffd7bb8328fc8d6e0b82c71158900", + "freertos_kernel/portable/IAR/AVR_Mega0/port.c": "5b94af6f8ea91259048a7acd4ae78d548a3954506abb73065ca8387c94393380", + "freertos_kernel/portable/IAR/AVR_Mega0/porthardware.h": "2c2edbc3d4bc6a1d0b5c60df5c297d65fdd9053217795a423adf6bfc12803ed3", + "freertos_kernel/portable/IAR/AVR_Mega0/portmacro.h": "d29af5ea7336cb7665ba3b4799f988c57f20dad2f2c757930ac7d012bab9d356", + "freertos_kernel/portable/IAR/AVR_Mega0/portmacro.s90": "319f42d18038b2e6b9f76807d812b964a7089ef4a4bb689fb45cadc1cd9707dd", + "freertos_kernel/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h": "8f3f98a3f183dd173a22541819cf794565f6bd35d4db4b664a8f35f05fbf6063", + "freertos_kernel/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h": "1544c69c8783880a35cee8ffa24e3e65e289f596c03d8b9f35a31a3eb7b025f1", + "freertos_kernel/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h": "ee7d97e30cfb971f74db814397bfef83f028e0c7e55c990438cfe33e6765c0dd", + "freertos_kernel/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h": "361996a9bed51f37cb9b0a2bda0e4544dc4e4cd44d75c5788e1074cfe17cd56e", + "freertos_kernel/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h": "f49159a259b685e876d394efb010eb1d06cb0346118715f054e252725d981702", + "freertos_kernel/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h": "2c6ca0cd41436c8c5ecaaa461084cd1675a7e24d58c6ace888927fca5e262bc9", + "freertos_kernel/portable/IAR/AtmelSAM7S64/ISR_Support.h": "add4c3b80e0922e4ca573e712311ca9e7a47ce93ef3ff6bc5251ba67894cb4b6", + "freertos_kernel/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h": "46d53b158ebe5cffa94bc80c9d6b0fafb1790bb741c5be562775f630bdb55dbe", + "freertos_kernel/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h": "a1068f757db5c02d2725a76f4e2ba8cd79aa288be3ed5fc2804f0cde9f4a0169", + "freertos_kernel/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h": "2c4e3aef15483db5c6ec459c275b8ed06eb14e484484f1215139dba779b10a11", + "freertos_kernel/portable/IAR/AtmelSAM7S64/port.c": "358fb4b0b2c2629fe8476e7cda2b1d796cf4eebc21e8098b88d15c592cf72422", + "freertos_kernel/portable/IAR/AtmelSAM7S64/portasm.s79": "de60896a04d8ca00ada31fcc3496eee2bd5e08e254ec261a6a9a5164942b82b8", + "freertos_kernel/portable/IAR/AtmelSAM7S64/portmacro.h": "950091c804f35743f9009bf4e82dcf2cb9812d537fd17dfa80984864100a7940", + "freertos_kernel/portable/IAR/AtmelSAM9XE/ISR_Support.h": "85dc8f5d2615969b89ffbf48c42ae3dce8145742dd7d8d3e886f91e3863ce7cb", + "freertos_kernel/portable/IAR/AtmelSAM9XE/port.c": "a9cf6f6d87a6d4df0afad8239c8f8cabc0361dd73f5abc47ce3fd0410c401f26", + "freertos_kernel/portable/IAR/AtmelSAM9XE/portasm.s79": "1cb65e6f59c63aefb1e030a9a564ce76b9237ba542c2559f6cfe69aeffd47d42", + "freertos_kernel/portable/IAR/AtmelSAM9XE/portmacro.h": "be214f5b9102c1e5b042075b11529769665c8078a3ca472a066b059b15760110", + "freertos_kernel/portable/IAR/LPC2000/ISR_Support.h": "add4c3b80e0922e4ca573e712311ca9e7a47ce93ef3ff6bc5251ba67894cb4b6", + "freertos_kernel/portable/IAR/LPC2000/port.c": "1f37f95032aaa5362205938fa0dd615e06ae51b62a8945bf2c17a8714a513d02", + "freertos_kernel/portable/IAR/LPC2000/portasm.s79": "61cbaa6c7bf636d698d014de1c70adb2caa488843184918557ee88fd1b1ef738", + "freertos_kernel/portable/IAR/LPC2000/portmacro.h": "c2e50768defe621f05d3ea1f4e92457f325bd52e969f3c442ae26c14f15d8689", + "freertos_kernel/portable/IAR/MSP430/port.c": "989a17561d6880e7f32fb829ab631a0d2c81b7d07739b42b445a0bad17218e6d", + "freertos_kernel/portable/IAR/MSP430/portasm.h": "d7dc1118a347859ad24cf928e57c024827d603c5a0af43a171502058f5c04f0b", + "freertos_kernel/portable/IAR/MSP430/portext.s43": "03e035bf8143bb3b7cb80d363a53b344dc528ef2a615429d12ea8b6385fa92ed", + "freertos_kernel/portable/IAR/MSP430/portmacro.h": "1f5e395c30da4e5755e60dcc5fe002a1b6dcc0515438405ec20dc23b4e990ae3", + "freertos_kernel/portable/IAR/MSP430X/data_model.h": "93ba6d2b721e3ff7867fbbf95827c04832c2a128aabca0ab36d0944c994c48e0", + "freertos_kernel/portable/IAR/MSP430X/port.c": "ae82c9f9cc6fba7c08230e239b964253b925aae0b41ac3b680b0a6ee143e6300", + "freertos_kernel/portable/IAR/MSP430X/portext.s43": "9dd2c5e57642e79679ccb5254f846ea815c01fc4570c63e7266e0acf202602df", + "freertos_kernel/portable/IAR/MSP430X/portmacro.h": "9c02699a8d2280703df0f1f424b2d0729a0c9386e9d2ecab2187eabdb6658cbf", + "freertos_kernel/portable/IAR/RISC-V/Documentation.url": "03b58eac9262370ca618c78e81f36deca511ab3ff9142d719bae84afd9c9e865", + "freertos_kernel/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h": "2ee09f9af6419a1aa2a3bdd270f54a1123a1ae1a211d9d73ed8300995c19bea8", + "freertos_kernel/portable/IAR/RISC-V/chip_specific_extensions/readme.txt": "9df008f8587b6faaaa48ef37ce9e38f89639290d636c06f5eefb09848ac318d1", + "freertos_kernel/portable/IAR/RISC-V/port.c": "66b2aaa1439abca011d4597851c356b36b34d86c42dff72af2ae08a23158417f", + "freertos_kernel/portable/IAR/RISC-V/portASM.s": "d7e7e5a5ab45ac277bdcbdb7f1b320208a4cc032a8d652247678e6f55ccc175b", + "freertos_kernel/portable/IAR/RISC-V/portmacro.h": "a8a89b0c110601e158f6e6f3f17ac2222cad3f9429360cff304058946a9f3da9", + "freertos_kernel/portable/IAR/RISC-V/readme.txt": "9df008f8587b6faaaa48ef37ce9e38f89639290d636c06f5eefb09848ac318d1", + "freertos_kernel/portable/IAR/RL78/ISR_Support.h": "e008f96483eb3d83104b1cfff05373f8dea88cfde36ca6d546a8736043efaf54", + "freertos_kernel/portable/IAR/RL78/port.c": "5f0c1551c45b548844e622c660bbbff06b1cbef7bb3136197db8c896e8c4a9be", + "freertos_kernel/portable/IAR/RL78/portasm.s87": "8794a885bed97a12facf098530c518830f727b09a109891b1eca86471806071d", + "freertos_kernel/portable/IAR/RL78/portmacro.h": "7148b2e24fb081cdf6c47044a887c639628349ff77f43b9326d44701d5fa2b04", + "freertos_kernel/portable/IAR/RX100/port.c": "f20a403caf13a3920ab8a56d2c2cdcc0719bd42916638ccd720de1af124ff61f", + "freertos_kernel/portable/IAR/RX100/port_asm.s": "9771fba1048b00c1f546427d18457bedecb6bcf4e9b87161fc82e4a00ad7d832", + "freertos_kernel/portable/IAR/RX100/portmacro.h": "62da25ed1615c747a20b2de2f6b36da049a3415309365ae9e243fe07ed0499ab", + "freertos_kernel/portable/IAR/RX100/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", + "freertos_kernel/portable/IAR/RX600/port.c": "bcf665fe9aeadcdd6ec28606f5982bf9d68c48835ecb6c29532d56055793ff9b", + "freertos_kernel/portable/IAR/RX600/port_asm.s": "8869f2e43d1c9351894ab7940db9f7bf347de1e8ae7397c66c2db20df73e8f1e", + "freertos_kernel/portable/IAR/RX600/portmacro.h": "276b27f599b6a926a9ebc2224f09b6f9662d86ce8cd0d50967b07951e96740f6", + "freertos_kernel/portable/IAR/RX600/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", + "freertos_kernel/portable/IAR/RX700v3_DPFPU/port.c": "e6ece452249a334b7e60ab7c4ab2486782dbebd153943b1146d97453b19dbc09", + "freertos_kernel/portable/IAR/RX700v3_DPFPU/portmacro.h": "eb17d2bd787cf1658ea3a3e59086e69f32cc102220b484145a73f0f91749f6e2", + "freertos_kernel/portable/IAR/RX700v3_DPFPU/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", + "freertos_kernel/portable/IAR/RXv2/port.c": "0638d6d85e5a71d2d475ea33bbd2c19d994a88cac0aa0afd479ea028bf7044b9", + "freertos_kernel/portable/IAR/RXv2/port_asm.s": "1755cdaf7f77322637473a4330c2c68d4ddb4f646c3f626e93f91d36790bd6ad", + "freertos_kernel/portable/IAR/RXv2/portmacro.h": "6a587f64626a6d115b65cdece034a43a4a17aa576062ba47e87d7b0eb9cd2704", + "freertos_kernel/portable/IAR/RXv2/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", + "freertos_kernel/portable/IAR/STR71x/ISR_Support.h": "add4c3b80e0922e4ca573e712311ca9e7a47ce93ef3ff6bc5251ba67894cb4b6", + "freertos_kernel/portable/IAR/STR71x/port.c": "8cb9a0fdd4bd1a6957300777a2f95431cd921004b03f34991c05edf59a272268", + "freertos_kernel/portable/IAR/STR71x/portasm.s79": "01ac09e0bccc05614f73d1d98d3f39a817fdde08ba1ba5fcab50e7e3f1caca0a", + "freertos_kernel/portable/IAR/STR71x/portmacro.h": "481a38d4329d3424db62230c44d822c161eb07425c3703788c811822882bd2e3", + "freertos_kernel/portable/IAR/STR75x/ISR_Support.h": "add4c3b80e0922e4ca573e712311ca9e7a47ce93ef3ff6bc5251ba67894cb4b6", + "freertos_kernel/portable/IAR/STR75x/port.c": "2f4b0911cfbee7aaabb57bb6c430b0d448f68997db9c3befbabf9fc66f6823de", + "freertos_kernel/portable/IAR/STR75x/portasm.s79": "a4da47642e9a8fdf34091f1fadab85a4257063873982886389ba97fef2d841d1", + "freertos_kernel/portable/IAR/STR75x/portmacro.h": "9cee353805475007f6230c5a0cfa3ca2381d23d07763750b5783e4a2ab543d66", + "freertos_kernel/portable/IAR/STR91x/ISR_Support.h": "8881773e0bc4fcd3ee841be5c73bc93ec28585848b2e05183d576deae228f285", + "freertos_kernel/portable/IAR/STR91x/port.c": "2cbc370d6fba697e758e0b7a923e25b76a8f0ebf6a26f9225338de94c717ede5", + "freertos_kernel/portable/IAR/STR91x/portasm.s79": "7933ceeaeb21063f50f571621108741c5d497514474b83e0d8349228a9e4ff27", + "freertos_kernel/portable/IAR/STR91x/portmacro.h": "dae23d9be190af232de3db2b0b02136fe7c68fdbbbde37a56bb8ab81e91852a8", + "freertos_kernel/portable/IAR/V850ES/ISR_Support.h": "ed05648fad710f756aed5d67eb1ea074339f3fe3e27eeb2629814c16cbcf8b7f", + "freertos_kernel/portable/IAR/V850ES/port.c": "3d916bc4fd1179346d020d6932d0b5a2745d6e8c2fd5b841f9d29da17a5e96ce", + "freertos_kernel/portable/IAR/V850ES/portasm.s85": "6279eb11a42af766f4f6ea8846a8172b1b46f7cf7e6b018e1affd05c393cb9cf", + "freertos_kernel/portable/IAR/V850ES/portasm_Fx3.s85": "47b395d22e8269ed79bdf80f352838fd911430517ab947c7ff39046776144fdf", + "freertos_kernel/portable/IAR/V850ES/portasm_Hx2.s85": "cb18f8b4b1da5469613c9979fa258fd4083f0a500623481acafa10dec2e3c509", + "freertos_kernel/portable/IAR/V850ES/portmacro.h": "f85a898944430b45724e284b7e689966284f994401a2cbf55ec406d70815a9fa", + "freertos_kernel/portable/Keil/See-also-the-RVDS-directory.txt": "d872e8e4176213ea84ebc76d8fb621c31b4ca116fd0a51258813e804fe110ca4", + "freertos_kernel/portable/MPLAB/PIC18F/port.c": "491002fc37e9801b0014d3ff772abf445e4cc2508eccef630d2e42160f582ce1", + "freertos_kernel/portable/MPLAB/PIC18F/portmacro.h": "c278df8a3a0bf2cd1cc70ac0790ffe62f7f4c2e06a1d38822caaa932d41010ac", + "freertos_kernel/portable/MPLAB/PIC18F/stdio.h": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "freertos_kernel/portable/MPLAB/PIC24_dsPIC/port.c": "2bdd28da57d2fa6999fa2f59c8f21f5ea62f36583c1d40324d2dcf9494897326", + "freertos_kernel/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S": "2bd05a5dcf3d277007bc4ee1e97802b5c24f3a4fbc7803730da895fabff58ed6", + "freertos_kernel/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S": "974250f6b45968976372e54511bd6535f16a2a7285bf86e22e63b9ad8c838a26", + "freertos_kernel/portable/MPLAB/PIC24_dsPIC/portmacro.h": "21e4ed57b6eaeb970873889e7394f67a94b67bdc9c7b02807da80fbe91e06dfc", + "freertos_kernel/portable/MPLAB/PIC32MEC14xx/ISR_Support.h": "766c40397d453ed8971ed89557d84274d097d8b685a354f563ed1b47dbea6e2b", + "freertos_kernel/portable/MPLAB/PIC32MEC14xx/port.c": "e7b4b4b9aa471ae2468fba83d8b5392ef21543e27c5a3f7a0b8a2d53fd6d8952", + "freertos_kernel/portable/MPLAB/PIC32MEC14xx/port_asm.S": "464c91c49dbf9dd66cd6d08b83e2dcd0681261a0ab0f279e1cd514d4659cd4ad", + "freertos_kernel/portable/MPLAB/PIC32MEC14xx/portmacro.h": "fa2717c38d51c630c4e5f3db51b309ba16092c37fe64975fdc94297770f95511", + "freertos_kernel/portable/MPLAB/PIC32MX/ISR_Support.h": "fe19583bc3d3dbb0361eb27fa4420e227146417e0104f00f176a281c3dc8290f", + "freertos_kernel/portable/MPLAB/PIC32MX/port.c": "99de2064584b2716062b690b05109af4cd209f109a03f70a7f4a2fbfb02cd413", + "freertos_kernel/portable/MPLAB/PIC32MX/port_asm.S": "4f722672dd8f7bc2fd98d6d5eb4bfd70e1425c61ddae35453661d647a1267c3d", + "freertos_kernel/portable/MPLAB/PIC32MX/portmacro.h": "bea1af28d2086922b16228cb994935cc661694471b963556be96acd422b5850b", + "freertos_kernel/portable/MPLAB/PIC32MZ/ISR_Support.h": "6849aa04c3c7346b06876487841f2bb8ccb79e5da3ccb17ba32202706fdf62a5", + "freertos_kernel/portable/MPLAB/PIC32MZ/port.c": "86c3c01593b7c72fed03c708ec37a949cf01c8ac12b16c9481bfbae5eed5af38", + "freertos_kernel/portable/MPLAB/PIC32MZ/port_asm.S": "a3459454016cdd169083799218837402368a732351ad1b3ce7c367d995c92ac8", + "freertos_kernel/portable/MPLAB/PIC32MZ/portmacro.h": "638ff0815b6c32bb344224c3da01ae6edb43be67a60ccd1140bb0d28d52227d5", + "freertos_kernel/portable/MSVC-MingW/port.c": "806397b20853428c47d0803c56a633d929654a79802a225fad8457225661604c", + "freertos_kernel/portable/MSVC-MingW/portmacro.h": "f5b415ea227339d70f3651bbad18bfa5ce9d88afbbdcfe42a3526373bb485889", + "freertos_kernel/portable/MemMang/ReadMe.url": "c44abcb1837584d65d00768bde7c1471dbf3fe316275ccbb6922998c6f11ddc9", + "freertos_kernel/portable/MemMang/heap_1.c": "6e8a3fa2316ac964a3df68dbee80bd5df0c72af2d36d884ff7e420abeb05cf16", + "freertos_kernel/portable/MemMang/heap_2.c": "9b1757a23e930354b711303356fb89964a75c62199719c40bc2abcec5bf71349", + "freertos_kernel/portable/MemMang/heap_3.c": "7ea069f198d4c417465803d78a7acaeb142cb900d8ba15ec05ff2eb8809ec8d4", + "freertos_kernel/portable/MemMang/heap_4.c": "fbffb85f8f74fd2f57492e513b9abee0836e89390b0acccd5fcb45a0a0c08fa9", + "freertos_kernel/portable/MemMang/heap_5.c": "56dbe256ddffbb7c4d23c2fa716714017fc0eceab691f5fafdbc8988932d1c6a", + "freertos_kernel/portable/MikroC/ARM_CM4F/port.c": "077d8d71c6e0a15bd819bc1f9568a3dac45aab5171eef05b54ccfc9524fd57d3", + "freertos_kernel/portable/MikroC/ARM_CM4F/portmacro.h": "cc813c61b853b5db5d5371cb661c9ee5292e3f4ed1b01bb6b4b15587d772f31d", + "freertos_kernel/portable/Paradigm/Tern_EE/large_untested/port.c": "4aec8b8c47cacfcbc0ef943cd116ca3dbdd1e68ed83ce4ffbe90309294da9585", + "freertos_kernel/portable/Paradigm/Tern_EE/large_untested/portasm.h": "c37b5bc133887bb6467df3ad74610ed84b519466104e6a37bc0fb8eda2f5b457", + "freertos_kernel/portable/Paradigm/Tern_EE/large_untested/portmacro.h": "e208c41815c5387956e0ad2e1eca6f3d65faef53b15db562e120555aadace691", + "freertos_kernel/portable/Paradigm/Tern_EE/small/port.c": "a8d64a685c51bc0f877abcdf70425a0bf66b1a3b9a34f86d217d0b6492547f58", + "freertos_kernel/portable/Paradigm/Tern_EE/small/portasm.h": "bfc0be9a564b5e27fcb98f83cd0840bfae9cd57c9c895bafafc0a20d6d742561", + "freertos_kernel/portable/Paradigm/Tern_EE/small/portmacro.h": "0c8cf2ad450334282f8d98b56293fe1a0bfd959d466770a6c6572210433dd33d", + "freertos_kernel/portable/RVDS/ARM7_LPC21xx/port.c": "2c0dde68b8adc93c5d115d4ef5e1212260c3fb860735913e668f106c5127808d", + "freertos_kernel/portable/RVDS/ARM7_LPC21xx/portASM.s": "15900a3578fbc52bd1e6ff3423004a67146aca83e9271b2633f7d3455e21ed3c", + "freertos_kernel/portable/RVDS/ARM7_LPC21xx/portmacro.h": "39ccdd5e4e07c7d0f499fd341d2e0b34ba79af20a867053ae50241b9af7ddf84", + "freertos_kernel/portable/RVDS/ARM7_LPC21xx/portmacro.inc": "ff4e33fb48e1b6f3068644ce8c529abcbfaaadf87164bff6d88d794a219e9baf", + "freertos_kernel/portable/RVDS/ARM_CA9/port.c": "f44cc391da616b1bc5f01346d9f99ad37af0d78be50e33bac50a14a0748971b8", + "freertos_kernel/portable/RVDS/ARM_CA9/portASM.s": "302bc8f0fd647e42fa472c173f91cb58238ef1c6b8b9924578b89765fb49a202", + "freertos_kernel/portable/RVDS/ARM_CA9/portmacro.h": "b4d45e0be784fc52455c7bb0223e57b03f188220a8ed946e7e65c01116a47ba0", + "freertos_kernel/portable/RVDS/ARM_CA9/portmacro.inc": "9dba275f7c5eefd1e69bb63d048f42c9391027782fbe2fd440e719ebcf9b3cc2", + "freertos_kernel/portable/RVDS/ARM_CM0/port.c": "e44da16e24f70754ee46d27982456c7668c19c86471331e10a0eb75aca36bf25", + "freertos_kernel/portable/RVDS/ARM_CM0/portmacro.h": "0a2f9a3e6177e25d4ad45205fa2a45beff73c8a15e604ec2c093733eea14edaf", + "freertos_kernel/portable/RVDS/ARM_CM3/port.c": "ccf8fe8dc8d34cc838a13a30ced0ba62c11baf36200d08178deb31f85f7a94bf", + "freertos_kernel/portable/RVDS/ARM_CM3/portmacro.h": "0f8ea70dcefb51d933d7ee67dfbf4a57fea6fe597bc5e923a5ad63f99f8d1bc1", + "freertos_kernel/portable/RVDS/ARM_CM4F/port.c": "cb8fccbec5d87a9fdf9d55cd81cfe851e6848e44e54fb86c085cd842670f9c2d", + "freertos_kernel/portable/RVDS/ARM_CM4F/portmacro.h": "c6dcd3614d43ffdf80b803f8d5bef04e14ce9f5b12731a7b15fdf79837b858a8", + "freertos_kernel/portable/RVDS/ARM_CM4_MPU/port.c": "a2250862d16684b9957aef343b9b93fbae0fc135cdebc4cba765f6398a8a12b9", + "freertos_kernel/portable/RVDS/ARM_CM4_MPU/portmacro.h": "2f92ec48c9db3f6d00e41997eaedb34e19dbfecdd6b140509638e07145781b27", + "freertos_kernel/portable/RVDS/ARM_CM7/ReadMe.txt": "713e476f526189b6e505b019c8053cfb6c49d3e921ba7345d59413bd0c35815f", + "freertos_kernel/portable/RVDS/ARM_CM7/r0p1/port.c": "3a442338cdf026594c6a10abf49b013c70143819fe0b5e5fe7d724370b871d3f", + "freertos_kernel/portable/RVDS/ARM_CM7/r0p1/portmacro.h": "56c8f8aba8345bf20aefe61817f3a078ab063d01de8b109050197797fdccb37c", + "freertos_kernel/portable/Renesas/RX100/port.c": "83e6a8dfef7edf9258ee43f472412af0995cfcd926d128b9c3da5038d3bcbda8", + "freertos_kernel/portable/Renesas/RX100/port_asm.src": "1bc123bc8a9c21dee027439e124d51a9d0a2e8de1d8908e10db8975ffd81b223", + "freertos_kernel/portable/Renesas/RX100/portmacro.h": "376f88542e8b09b4ee82f9d6c5a6259a58f101d72b5dfa98297a56918273692a", + "freertos_kernel/portable/Renesas/RX100/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", + "freertos_kernel/portable/Renesas/RX200/port.c": "e4ea5f4dd562bb0708353d43bb4cddc5f3746833dbc9be8aa4c87ddb7157d8c3", + "freertos_kernel/portable/Renesas/RX200/port_asm.src": "1bc123bc8a9c21dee027439e124d51a9d0a2e8de1d8908e10db8975ffd81b223", + "freertos_kernel/portable/Renesas/RX200/portmacro.h": "68d7c64cb25337a9751e8b49eda3c0a7ec249238b250900bd50b13a1ca46626a", + "freertos_kernel/portable/Renesas/RX200/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", + "freertos_kernel/portable/Renesas/RX600/port.c": "4e00da3fc7958dadd89e8b21d92b3a7eb2f8d45b56de8248fb18e08ea0c8a426", + "freertos_kernel/portable/Renesas/RX600/port_asm.src": "1bc123bc8a9c21dee027439e124d51a9d0a2e8de1d8908e10db8975ffd81b223", + "freertos_kernel/portable/Renesas/RX600/portmacro.h": "8fe1670362bf1e6bcf83a61c70496e3c77e37f369bc26c5e5cc7f937b159b767", + "freertos_kernel/portable/Renesas/RX600/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", + "freertos_kernel/portable/Renesas/RX600v2/port.c": "f5cb4f40f01e3f2ab3435b46df2b60122681010de6b7f804352e612540f82bae", + "freertos_kernel/portable/Renesas/RX600v2/port_asm.src": "6cec79c3c7f8c776dc544a0f3ccc0bb2aee0c53c1c56a3254e3322372bd1ca7d", + "freertos_kernel/portable/Renesas/RX600v2/portmacro.h": "0fb064ecb09e784f4707b7977a5c1e96249472234d69c30fbafc506b0da8c96c", + "freertos_kernel/portable/Renesas/RX600v2/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", + "freertos_kernel/portable/Renesas/RX700v3_DPFPU/port.c": "ba5bfe651ea80c98e95016e028736259ebba2e8fc9b0705a74be5945a68e263a", + "freertos_kernel/portable/Renesas/RX700v3_DPFPU/port_asm.src": "6cec79c3c7f8c776dc544a0f3ccc0bb2aee0c53c1c56a3254e3322372bd1ca7d", + "freertos_kernel/portable/Renesas/RX700v3_DPFPU/portmacro.h": "f0fe4f391223c5ea3b38acadb8adae025d0cf79032d5cc05a5ed12bc0b6d2076", + "freertos_kernel/portable/Renesas/RX700v3_DPFPU/readme.txt": "d6ea169fd33ff4a4795bbcce927793fbe9177e1788af89cc6a705d64a7106e8b", + "freertos_kernel/portable/Renesas/SH2A_FPU/ISR_Support.inc": "048a871fbf88a965ee51e742532fadecbff657d865fdfdaba142c69910513e94", + "freertos_kernel/portable/Renesas/SH2A_FPU/port.c": "11a3997f49ba5c95d416c80b1c67fa8f6fed810a31e00af500b9ff90ea119c45", + "freertos_kernel/portable/Renesas/SH2A_FPU/portasm.src": "02eafbd8e6aa9f4ef38b5211fb5a9348463faffe79a2c9549d2aaf7a292b16ce", + "freertos_kernel/portable/Renesas/SH2A_FPU/portmacro.h": "ffa4c3800e8c2a06496eb5d077ac0ba5b4911a71eae435716e59dbb6e5b4a431", + "freertos_kernel/portable/Rowley/ARM7/readme.txt": "84a1379723e3ca3cb47a540622ed62e9900410ce65ea0584ce22426cbaf6745b", + "freertos_kernel/portable/Rowley/MSP430F449/port.c": "021a4732bea5d55b68078ef9814275da7141752e37382f307223119e26f8282c", + "freertos_kernel/portable/Rowley/MSP430F449/portasm.h": "3344acd67fac5e8cc9f686e904788fe33c9ea37c996f0b867f3938568aa84e57", + "freertos_kernel/portable/Rowley/MSP430F449/portext.asm": "a4a33905c370eb247a53034b67dc756ce94c10764c1c9a3e40ffe2018ad798ad", + "freertos_kernel/portable/Rowley/MSP430F449/portmacro.h": "ebe69afe0b854a46b7790f886feb4d6d47a171a7b7105e5f17ac237f7f04e497", + "freertos_kernel/portable/SDCC/Cygnal/port.c": "a9626e4a1defca32bf9bc6b3bb5325b100f82379b35b15be2d8609db191af259", + "freertos_kernel/portable/SDCC/Cygnal/portmacro.h": "ee89c6de1ef5c5bf6921c77459573fbd6be3a07a8a4dae8f02dc2394e595ed31", + "freertos_kernel/portable/Softune/MB91460/__STD_LIB_sbrk.c": "92debca0c186966aaef800acd2a8f7cfdbddff1dca9eedc32fa28ecb473780ba", + "freertos_kernel/portable/Softune/MB91460/port.c": "e92751bcfd883fcfdcaff47045bf8c40fe6da2f4319049ca9ee067f798899bd7", + "freertos_kernel/portable/Softune/MB91460/portmacro.h": "7921ebc2f459c0441f8c6f073443a672529ee8e1134d216d38eb91c3fe43f9eb", + "freertos_kernel/portable/Softune/MB96340/__STD_LIB_sbrk.c": "70c748e9ded5a641b171124480225a336bb8b043c94bc13dc38e7574e59ad324", + "freertos_kernel/portable/Softune/MB96340/port.c": "f4f45dfdc3195309a9dad120093a61bf0452b374587104b776e9d42b0865a9e8", + "freertos_kernel/portable/Softune/MB96340/portmacro.h": "19aad7f7a8377b1e7467b53c688f1bb84ee30dbe6d697d3854d08ab906785dc6", + "freertos_kernel/portable/Tasking/ARM_CM4F/port.c": "171332de6d8fbf8a277129869460ca5a8879389f815e1d7ab2692f7370051c1d", + "freertos_kernel/portable/Tasking/ARM_CM4F/port_asm.asm": "8424f07f8caa1137772fcc6dd6045dffe846777c236b3c6fc21d230187de0a50", + "freertos_kernel/portable/Tasking/ARM_CM4F/portmacro.h": "62039eef1f2db61bf3bc54f2aecd72b88364e923a9844d28118cd32d1c9ecdac", + "freertos_kernel/portable/ThirdParty/CDK/T-HEAD_CK802/port.c": "c40c3e54391a3fdb2902aa21eff8b77cbf46658a3917a968d0d912a914daa5d3", + "freertos_kernel/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S": "6db273fb79cfb3b9fa6bf69b15c72b2e462047a4ebdc70e08af5e62296c13f48", + "freertos_kernel/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h": "5b94cbc518978e9cd356fb95c9cd5ade37c1ff307f0621146473d2e69ed8f6ff", + "freertos_kernel/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c": "514db0072d69bdb2bdb69ccf7f6468069b18744adac8ede36ac996142473bf60", + "freertos_kernel/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h": "7d0aeda3ff36d41f5cf9cfe5ef0c1a0b94e35876bee15b19e4b2998c64261776", + "freertos_kernel/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s": "6bdde99b3e9ad896b74f5c9ee2ff29bfa66aa41a6267926d149ca0941d9c6343", + "freertos_kernel/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c": "33c3e48ebfc051f9d8704b560448766d48886e7a4da6271e6860f643f64b7c3a", + "freertos_kernel/portable/ThirdParty/GCC/ARC_EM_HS/port.c": "348d3a6737d428d31eb3c48faea9f9d5323601e533d9e209c7cd87042de2c5fb", + "freertos_kernel/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h": "bc28b0cf17e2bf45629ec786cd03c7d03fc714e3427ba4c03111a4b7ee22cc2f", + "freertos_kernel/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c": "514db0072d69bdb2bdb69ccf7f6468069b18744adac8ede36ac996142473bf60", + "freertos_kernel/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h": "7d0aeda3ff36d41f5cf9cfe5ef0c1a0b94e35876bee15b19e4b2998c64261776", + "freertos_kernel/portable/ThirdParty/GCC/ARC_v1/arc_support.s": "9efd05da2a30fee6314761283cfa0fade930038577371adfcc6d156f46d3a036", + "freertos_kernel/portable/ThirdParty/GCC/ARC_v1/port.c": "9eb2d28534fe8650b659e964742a0c41289121b0a580d1ce0bbd1005b7d5cc5f", + "freertos_kernel/portable/ThirdParty/GCC/ARC_v1/portmacro.h": "340f2ebd074cc64dd4c7afd7b775bf123840d3b58714c3b7c7805b1312b42d93", + "freertos_kernel/portable/ThirdParty/GCC/ARM_CM33_TFM/README.md": "5ef03f6137a0d76ea2eaf353bc1bba01d226f7b6c83138ffd6f26b45baecdf9e", + "freertos_kernel/portable/ThirdParty/GCC/ARM_CM33_TFM/os_wrapper_freertos.c": "c982e5b278797178f627213a52d0f8ee1ede312d26fc78d7721e684f3044fa51", + "freertos_kernel/portable/ThirdParty/GCC/ATmega/port.c": "fdb1dfcef9aeec51e9a7ab1511d7c36686bb306a3311aceaeca83a166d8dc05b", + "freertos_kernel/portable/ThirdParty/GCC/ATmega/portmacro.h": "23fa1599ec51e8df67629495fc787d2c77623479a47d860c16baf409a8c5fcd5", + "freertos_kernel/portable/ThirdParty/GCC/ATmega/readme.md": "f219267f64c4cb262bc08de164d801509d27bccb7e77881a1fe18ab4ae289c3a", + "freertos_kernel/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url": "79fbc2c019622ca13d55d76c41d600a1bf52d31bc5348597dfc0164957520939", + "freertos_kernel/portable/ThirdParty/GCC/Posix/port.c": "8de47ed3c654e2a87e189a389e22cb763d0eb6de880a48a50928823eca56de60", + "freertos_kernel/portable/ThirdParty/GCC/Posix/portmacro.h": "a7013de63af5cfe2aea4864a7b9b734e91e7f0390c36803a1a3020a8a75d22fe", + "freertos_kernel/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c": "1ddfc0eb3b6428a2e247f97427ecf0685be8d2a88c55d9cf02f59f8b2d38bcbb", + "freertos_kernel/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h": "b60bc7226d152b654e5aa3644c99cb46943288ff268e12d84a9d7f1fe147815a", + "freertos_kernel/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt": "84f2893ac61214ea73c695911a13b27bda63a7e6d58e0bf90587bd369d214d17", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c": "04439bc16c9e004f0bc9d194741d5fec816e2dd1f5e1c4c3963538921eea5dff", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h": "dcfdac565c63234879de523170b862604850cc0336ca7c6cb5430945f40fdb8b", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h": "b7004272e01e10c7a34f845fef5a6fcb680f8af2e2b7f5fd4cccf85f361a5793", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h": "ca9a563740926f8e7f4c9416d839fb2b01850969860f4ed46b6c18c88b6b99fd", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h": "bb279022f7498d5a34e71198ffc8c7df5ef1b5a02a47b4bfee77e07679376035", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h": "691ecd4526fd59eb13b6ab5636b429d1e85bc93de21ec3aba0094c92d57a2786", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h": "d9b8a4388d73a8b91fe6b37436c5ce8e9e1846c17391dcfbda1791ce2ca69ff7", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h": "445c8a982fd4234143da61ca0c7a622bbf5929d76fc1e971398c8ecaba4bc3f7", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/port.c": "71e33de0f0680e1ffcae2a62d7d20112466a4b37b3ccb8b8aa31ae127b3cb221", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S": "23286f7351106a181324a918a57f560373e2b5f0bb7fa3e101db0a50ae6eb7bb", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h": "5cbf3188e197f82a93f456c0f75e4aba54b6312e0f9dd510c2f4323839ca25f7", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h": "c1e451823cc388152f0d034e9ca3103eb106d6e763fa27d0d2156aabc8cd81f0", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S": "b9d8c64d04b26831a1d15d73647d14f8cd37a3132200c3442ddbcd78692addf9", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c": "ddc16959787fdd6487855103a5f1fc6cf0f606b14bc7a2baad99c210afbaf21b", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_intr.c": "c8bfbc77c9ba4f7e952578a103874ccd8b5b33ddd87af11d6bb2222dfd7e244d", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_intr_asm.S": "c8e9e144c40182f486f1a02057d37fe6619f710812a6b7e53c6881ad592eb96f", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S": "f20aa8a42bdcbec471278a2e8a26592997e4b04965668694d504e073c08f1bb8", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c": "171fc98a4981b0f468560b5cc81affe92589c087ff76745576577820b99840aa", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S": "c5abcdff7fda5b3c50cbcae88d3acb7eacf2f3fb6da1699d4cc4655494449347", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S": "47ca2b6631fdc803e338d80c4b7e13d80e0ca50b9918cecbc06e44098c0338c3", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/FreeRTOS-openocd.c": "04439bc16c9e004f0bc9d194741d5fec816e2dd1f5e1c4c3963538921eea5dff", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/portbenchmark.h": "dcfdac565c63234879de523170b862604850cc0336ca7c6cb5430945f40fdb8b", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/portmacro.h": "11729a32654ea53404566903477acdf073a439efe637d93997241e15a40ccc88", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_api.h": "ca9a563740926f8e7f4c9416d839fb2b01850969860f4ed46b6c18c88b6b99fd", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_config.h": "bb279022f7498d5a34e71198ffc8c7df5ef1b5a02a47b4bfee77e07679376035", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_context.h": "691ecd4526fd59eb13b6ab5636b429d1e85bc93de21ec3aba0094c92d57a2786", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_rtos.h": "d9b8a4388d73a8b91fe6b37436c5ce8e9e1846c17391dcfbda1791ce2ca69ff7", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_timer.h": "445c8a982fd4234143da61ca0c7a622bbf5929d76fc1e971398c8ecaba4bc3f7", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/port.c": "168dfdc0132b95b0b126db4da5d8a6223bf4065be6b6da203079f349ecc22a34", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/portasm.S": "e18c0feda7daa2a5abb31ff41180b9fd6fe57918743f1f0dfb2a0a99b255432a", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/portmux_impl.h": "5cbf3188e197f82a93f456c0f75e4aba54b6312e0f9dd510c2f4323839ca25f7", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/portmux_impl.inc.h": "c1e451823cc388152f0d034e9ca3103eb106d6e763fa27d0d2156aabc8cd81f0", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_context.S": "b9d8c64d04b26831a1d15d73647d14f8cd37a3132200c3442ddbcd78692addf9", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_init.c": "a2bef365b2bb4f0ca8ca6cbe869b6f729b764f8f94e63c5dee3daf6d6cfbee96", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_intr.c": "86322a1638250a182a10f31982e940c5c375d2e956b3f0e2638981bac4069479", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_intr_asm.S": "c8e9e144c40182f486f1a02057d37fe6619f710812a6b7e53c6881ad592eb96f", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_loadstore_handler.S": "f20aa8a42bdcbec471278a2e8a26592997e4b04965668694d504e073c08f1bb8", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_overlay_os_hook.c": "171fc98a4981b0f468560b5cc81affe92589c087ff76745576577820b99840aa", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_vector_defaults.S": "d3f4e09fc2db0ffee54eecbc1c63132fe291a0841a9e390acd3440e453d1e9c0", + "freertos_kernel/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_vectors.S": "f314d7f21b6e1986a5b6dea85a24a9dc3d57178c81618e6b438c726617195bed", + "freertos_kernel/portable/ThirdParty/XCC/Xtensa/Makefile": "62018ea2713263c1d80b4e67812100e057e014b5d87d4d539131e37d1e6f9d06", + "freertos_kernel/portable/ThirdParty/XCC/Xtensa/port.c": "6b570a2250aaa914b6e79626e257d3c32baea3eeb95f229c8d30c99c2c42e488", + "freertos_kernel/portable/ThirdParty/XCC/Xtensa/portasm.S": "898cf46ea426e0b0218b3045b28a0783990208fa100eb43b2adab0880f7d9853", + "freertos_kernel/portable/ThirdParty/XCC/Xtensa/portbenchmark.h": "69400a05d9c47211fc10781f5967c55e4d6476d6df940204b2fbbd455bceefee", + "freertos_kernel/portable/ThirdParty/XCC/Xtensa/portclib.c": "4209f60ed2909c3e41485981d6be308c8a3c31145d4a9f2a99cbae187cf95f0b", + "freertos_kernel/portable/ThirdParty/XCC/Xtensa/portmacro.h": "f7872eecdc8ab83a6fc10c8d3613b1995d6362141791175757c65e08e2f5fe1e", + "freertos_kernel/portable/ThirdParty/XCC/Xtensa/porttrace.h": "9c9097ff31d12b4dc627df17576ac8187bda6b6a20c2df7eac75c4b36159a908", + "freertos_kernel/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt": "051e57e3bce362384d01200b41bafe895b933be0c7686534e623405853374fae", + "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_api.h": "b0de2bf6b2a24b19353189bca391df89b8a53f455dde46c97ea7685f76d61e23", + "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_config.h": "caa8552f8beac3ffd619e99d0d11cd3d9baa67356d18693dda2df95a15c62cf4", + "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_context.S": "90a79a5187cf5b7249e7fea665bd8a14d9d3f010c7357b13a74118f44eab3409", + "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_context.h": "dec667e4afa0f7d80cff7fa803a70947328a86fec6c3bedc590edbe433367328", + "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_init.c": "bab8cb718be58ec77896514063706c0d92530962becd7217dd2fb168b0dc1a06", + "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c": "bc1b4d1487e472294f54aa5274f056d9fa37a68ce155973c63e4e4cf6849b156", + "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S": "fa4fc88cb8fa69aa16eec52c809e28504e58f675498ed7fa1117f4bc928c3c86", + "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c": "562662e7df519a1408ce68fb295223fa66fa871d72e124dc620b1bc987e0f858", + "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h": "b578b18489c7519a0286d9497cded9dc49e4c6e9d98a3b59593dd627e7aeed5c", + "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h": "5380b8b46d8b03ef5c54d74727190d908fe1732b306adb91dfd3befb5934135e", + "freertos_kernel/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S": "bf8719c48506db41ab1385046ab78b23477656b3eba0135e203df8779e4c3555", + "freertos_kernel/portable/WizC/PIC18/Drivers/Tick/Tick.c": "026a596ebdaebb0bf9d3a66f9a70f80ae60a90758330f82df8aae4be1de82a5c", + "freertos_kernel/portable/WizC/PIC18/Drivers/Tick/isrTick.c": "6fe71f48ecc05bc823a306181c18c8e3e27ecf63fd6279c52d59e5c2065041f7", + "freertos_kernel/portable/WizC/PIC18/Install.bat": "38cc1f0ec2d0af3ae1c7bb4b12d137914114cc8e278b9f8a32deb4c463f9834b", + "freertos_kernel/portable/WizC/PIC18/addFreeRTOS.h": "30313e6d6194453d22a294ddaa15ef28c7ada2419f00dee1b2785fe833743d34", + "freertos_kernel/portable/WizC/PIC18/port.c": "286159abf90fdd253dd6ebe8edd5050c07e097cbf26d4cd1175ecd8294fe22bc", + "freertos_kernel/portable/WizC/PIC18/portmacro.h": "8d2783c3893d5dc15ebf25650d1562b41a2e2167114b93da3ed9e1111cc7c4b7", + "freertos_kernel/portable/oWatcom/16BitDOS/Flsh186/port.c": "0518429e9028599b7a703d8113a166cf13725686375cae43546715c6620a3c81", + "freertos_kernel/portable/oWatcom/16BitDOS/Flsh186/portmacro.h": "7e9f410c73b9f4faae2c46edf91650f66c1bfa075b10d1143cb4351b69f4dfb1", + "freertos_kernel/portable/oWatcom/16BitDOS/PC/port.c": "80eff294e3d0502206151b82936c59e80a18c2a07699e101bce964224deee490", + "freertos_kernel/portable/oWatcom/16BitDOS/PC/portmacro.h": "9680d012c3646bb3ac060b3a652b3a72f8d2f526464f0add3b4a6b704e09b4db", + "freertos_kernel/portable/oWatcom/16BitDOS/common/portasm.h": "f8694b255ade04e05ce286eada59a6cd2e1ec7a48b971c2c31b22f6c5581625d", + "freertos_kernel/portable/oWatcom/16BitDOS/common/portcomn.c": "d10a2e5f6f4377bfaf30403e15acf5a24bf80755a3a280657793fa239bd71aae", "freertos_kernel/portable/readme.txt": "e8738d9630ac5218f576a6bd51b64052966e26d87b61c4673eef963767f43048" - }, + }, "location": "freertos_kernel/portable" } - ], + ], "required_files": { - "demos/CMakeLists.txt": "e1a11a664dc54b5a09d340094e09b36ef47f3b49200f22a527676a77ac3ad167", - "demos/README.md": "e1cca6698cc63794a4f8d02a181e880abffdf436fc1f6ca264d32fee6522a809", - "demos/ble/README.md": "7afc1253b4286497f499cbf32cb9c683d9487bb6251eba37c0d8a77a54dd6780", - "demos/ble/gatt_server/CMakeLists.txt": "152eeb517a01301fbea83c736f0271fe9b632dceb2157038ac08bdbddce93dee", - "demos/ble/gatt_server/aws_ble_gatt_server_demo.c": "e2a609607ae8c79f32a49ed73ac336e7a839aab7ddc567ef1352f636a5175dfa", - "demos/ble/mqtt_ble/CMakeLists.txt": "4f90e24641015772c80219a4d1ef4597c38cc7abd89ce36d737f02a6d879076b", - "demos/ble/mqtt_ble/mqtt_demo_ble_transport.c": "ab620a734d5edde9b5bab23d6bc6e5bd1b61cbaca68248826d4833ae16c25e4c", - "demos/ble/numeric_comparison/CMakeLists.txt": "35998f0a565000bb3158f0c63164aad7685dd4d6d7dcc4b2782f6b9af64c5589", - "demos/ble/numeric_comparison/iot_ble_numericComparison.c": "b7dab338b69058ec780c7ff56b0856be0c6023aa244f603651328f6c5211c03f", - "demos/ble/shadow_ble/CMakeLists.txt": "ef375f456597e61b844287be7ae3c6498fd0d66e30df1623de3db05a59f944d1", - "demos/ble/shadow_ble/shadow_demo_ble_transport.c": "e6416b0b6a0679e27669873cd5a0e7f5b3f33c5bdbf484587894eed4be17da1c", - "demos/cli/CMakeLists.txt": "39a38609feffe4b42f70c14aaefa2a04df3be45aed9cfb32c7621e2aa64becde", - "demos/cli/README.md": "03c46cacf4eb8ab860f1a337454c36c45d75d560a2852ac8d3132fb1bce0e222", - "demos/cli/cli_uart_demo.c": "0327cb0583dc562f71ccd3f54af2c6da085952e5656a53c1a2c9f2f2d208960b", - "demos/coreMQTT/CMakeLists.txt": "f9f2741f9f7f4c4d90c2b842aa0d6f79987b282d4630c64f909396e9b502de2c", - "demos/coreMQTT/mqtt_demo_connection_sharing.c": "840f43642dea234fa6209e0f547ba7c7d8dfefe8206456b50d03826d34124441", - "demos/coreMQTT/mqtt_demo_mutual_auth.c": "93914b9d3ce72bfcff3dfa49bbbfa3bc4b1a683d76d863983b41af1ded6fa53d", - "demos/defender/CMakeLists.txt": "b3f4010fd23f131d054f5167aba38f466bc360b351e16ba2add61be2451d5357", - "demos/defender/aws_iot_demo_defender.c": "52a6bc764c600945cfff17028ced469605146e574d22655044d65c25cff4defa", - "demos/demo_runner/aws_demo.c": "a3b07e2ce3a49e2479a49cda2284d4b57729a25425d6056fed61d29e1f107d86", - "demos/demo_runner/aws_demo_network_addr.c": "a0e5f2c4ec43ec26eed8862e512518dcf7db1a96dc8e93bdb3043a9818e26232", - "demos/demo_runner/aws_demo_version.c": "ac90c8d8b97312db96c0c181adda62493da688da6ad43d92648192e122a2e184", - "demos/demo_runner/iot_demo_freertos.c": "2288b0d8c8cc761b38365dc16b39fbdbc89d63f5a6065f9e1c64899c352372ac", - "demos/demo_runner/iot_demo_runner.c": "3ce4a1cbfb49cd48422f37a89ad5d82470792f7dde38e6016299af93dd03ead2", - "demos/dev_mode_key_provisioning/CMakeLists.txt": "9f72c9c400638e5125b2a40fa70a783bb5f29196a673f3221c39d54f2a69222c", - "demos/dev_mode_key_provisioning/README.md": "ac9cdb2605b93dd736045006af72e9504fd3fa98bf968ae9d413ecfcb45fe3e3", - "demos/dev_mode_key_provisioning/include/aws_dev_mode_key_provisioning.h": "079763fcc863252808a888af5f98f001d06483ec4ddc7d6bb2b1a8b7bdd0fe57", - "demos/dev_mode_key_provisioning/src/aws_dev_mode_key_provisioning.c": "baa153ca7487377fe36c6ce1a60144420549e42908454cf6cec8afa5c27ea293", - "demos/device_shadow_for_aws/CMakeLists.txt": "e404d8259a1ad94404d14b4a8f55d4f67707ec342d82c1848b44cb43d4db3ba7", - "demos/device_shadow_for_aws/shadow_demo_helpers.c": "241b0c8d4bcd923a83fc804668f7358a59562e001349087770ef939ee8f78f6b", - "demos/device_shadow_for_aws/shadow_demo_helpers.h": "85af530c5502e3bac44b0c78b0678fb61a13ac38274918ef87c9ef20d1ab0767", - "demos/device_shadow_for_aws/shadow_demo_main.c": "b69d3c269a2505f2728777fde7f90b3649ac368c3c702811df7473338efe74ba", - "demos/directories.txt": "f830aa514024f3db8fa561be02901f07f46e4277b5c2f788e1224e5d0b12ad10", - "demos/greengrass_connectivity/CMakeLists.txt": "384633cdeea4ef23a740409dd969d7d426ec4539c2430f627c11181fc8a0ccc1", - "demos/greengrass_connectivity/README.md": "f698c41b63b8404fefaa80f41f5888fe99ae107fee5843ee56de7422a993d252", - "demos/greengrass_connectivity/aws_greengrass_discovery_demo.c": "17e0e128b80f1700c154ef8950e6542fa32a694b807dc2e222cb6f69558eb4bd", - "demos/https/CMakeLists.txt": "2aa4d11c37faa8d86897dd8a4403fb9982c91674491e693cf0256f8958aa20ed", - "demos/https/README.md": "8a6e9a40781b23892063f3cc347ae0f019589fb26a3e61bdbf2a1887ab5b54b2", - "demos/https/iot_demo_https_common.c": "148f69647db2682a17f9c64cfdf11811cf32581cba02979766681c939bc700d7", - "demos/https/iot_demo_https_common.h": "5f52600b639f626679c3fdc9233a0529e57faadbc76d73235e67a11804d63d29", - "demos/https/iot_demo_https_s3_download_async.c": "f1c77bac71bf0ccbafd72c59bbfded79151802a4b0efa7a535ccb773e3952310", - "demos/https/iot_demo_https_s3_download_sync.c": "ebbe88d338ae8fee90201dedad4270cd2ea52f86a06c4ad2c87c126bd3fbb44b", - "demos/https/iot_demo_https_s3_upload_async.c": "22723d1d86daf9ccb462eae933489273787c0061fd7c77251ee32a23d17c035a", - "demos/https/iot_demo_https_s3_upload_sync.c": "56de76659944f9cf8259fdeb31b569d609be8dc7723776fbc8ef3f4d0cc6f85c", - "demos/https/presigned_urls_gen.py": "7df741ff279df79dc8b44ada50c1736f0b14119752875db47812390b342e0fae", - "demos/include/aws_application_version.h": "7238b599867ee1f37fde3d8d8eb254529841e1e0f3e76f77a5d119023c39d77b", - "demos/include/aws_ble_gatt_server_demo.h": "3c220709c44bc0c9a6760af0f0a2c23f90a87a6624fdb8dc14b233800c604401", - "demos/include/aws_clientcredential.h": "f8bd45820b938329df1beef5ef70b043575df566ca87d208f17285550ec92c5b", - "demos/include/aws_clientcredential_keys.h": "120c7bc6ac30819f02381ee298b3c6dfe9f07878cac2a49642e6fb9ad74837e4", - "demos/include/aws_demo.h": "f3b856f28e3f82867abcfcfcbb4cd7cf74dbea47b5858fddb9f08cf22ffa5468", - "demos/include/aws_iot_demo_network.h": "5c13143d6b54f69e0ffd2867f83457cfbbba2c38e64f7367dfca185802189563", - "demos/include/aws_ota_codesigner_certificate.h": "16906143a64341c1615a57a7e617f8fec2287fd814092324005e3cc73d44be93", - "demos/include/aws_wifi_connect_task.h": "89ffc96084438fe75bc5b15a71ed79fa672e6a8e13a7c35d0793d41860cc9f11", - "demos/include/iot_ble_numericComparison.h": "fde6a2b673c62e4117752cbfac454b9b56856aacfc50b85a38380d55778297b7", - "demos/include/iot_config_common.h": "512acdefb6d3975bbdf0a8d107044af7326a64b6004c52802f2558a5422c36dd", - "demos/include/iot_demo_logging.h": "b6609bd75506b4227730a0ac77c6632162c48fe37dcfb7b7c44e5ca124c6e322", - "demos/include/iot_demo_runner.h": "abebde33c41b901c9b73bc73d877016b115461951a4c1bc4da333fe95c8b9d8b", - "demos/network_manager/aws_iot_demo_network.c": "1aa99906d14e3d226f9e4999392dee429e4fdf0632234e7d97f77375d69216c0", - "demos/network_manager/aws_iot_network_manager.c": "b5f6cb531f4e298afebc33addf7addc4dc44b456811fd331528f27cca9f3557d", - "demos/network_manager/iot_network_manager_private.h": "805841f41e3f2868162c5cde0ccaa52f6c3581c5c82e4d4488d719a4fc28924c", - "demos/ota/CMakeLists.txt": "97eb17c125e3b60bcebf1d5230cbd9da2ffe11d245ba642dd128c8c52965e89b", - "demos/ota/aws_iot_ota_update_demo.c": "5bb65ac3e2c40a3d18140eeab11233491e4e0ffd94a100c63bce3a8f1bde2012", - "demos/posix/CMakeLists.txt": "2ebbf9aac42e713a1b851c61fa9307be255528911ab3067e62064257a5ba6dc0", - "demos/posix/aws_posix_demo.c": "ef40251daf4d2123b1a9ac2c02d9deb2b3690f38bf5fbd7538231da6a68b8fe3", - "demos/tcp/CMakeLists.txt": "99e72686738645dc71be2b6f87ff5ed5e7ac320c3a2073e8be9598c5bd9110e4", - "demos/tcp/aws_tcp_echo_client_single_task.c": "8324894526a831a092cc08555af5e133e9df67525f7c7c70e81523993839f791", - "demos/tcp/aws_tcp_echo_client_single_tasks.h": "e9d899a96c10e49cd1a28df66cc8b9fc9c2a12db5942de1bfbbd8ff6e1758709", - "demos/wifi_provisioning/CMakeLists.txt": "daf58d954ac6f1bcdba29c56cdf51d79af41b17279a93f5602465363008b156b", - "demos/wifi_provisioning/README.md": "8cf1fa67aa68ff85ed13aa8aef5316af2c31b6552c2044f2e618a0c0472a6e3a", - "demos/wifi_provisioning/aws_wifi_connect_task.c": "3c50288b9f334210e0c44c29da36ac15b3a0eb6a49e5f9d8ebd1d3c528a3408a", - "freertos_kernel/GitHub-FreeRTOS-Kernel-Home.url": "29a615679aaf977693b52195bbbd531b884a82f3170e532c79c88faa026839c6", - "freertos_kernel/History.txt": "3e24a378f7e039b05fb0c9a7c52b61a3929cb5a6e0c2acfa9c993eeb30f7af16", - "freertos_kernel/LICENSE.md": "508a77d2e7b51d98adeed32648ad124b7b30241a8e70b2e72c99f92d8e5874d1", - "freertos_kernel/Quick_Start_Guide.url": "367a817538b81e233c897edfaeb14a4650fecd2e090a0d4d285f057d2466390f", - "freertos_kernel/README.md": "5cbdd937c3cb7128a4663a80e6107ce75bb941dff635ec4ad436fcee6ac8094b", - "freertos_kernel/croutine.c": "ad7ec113a490076fe62b688257e27b30a500f0738c3c2984bc60425e02f00694", - "freertos_kernel/event_groups.c": "9e8af735c1502d7eadc69b3f0c77b095410bd628d1fb27a2b347122056882aad", - "freertos_kernel/include/FreeRTOS.h": "4ee5a895b0143a6d995497452f1a7c7fc1828151f6c0b19fed7a2054f4af0de0", - "freertos_kernel/include/StackMacros.h": "4b0c603af5971d0dc90b3449adc5e090293484b0edd7e90dde0aa9c56b060949", - "freertos_kernel/include/atomic.h": "7b627530107df3dc17efc845e5e63e920efa581adb56e3f36e53837319f88906", - "freertos_kernel/include/croutine.h": "681e9d3b54cf99eb77ecf809034b6a04b7e8d00a0f5a27409b129549c3e3a5e5", - "freertos_kernel/include/deprecated_definitions.h": "2ca05c478a903dfbd79d1229871994e2459cf67d4d5d3854254a3a5d622780a1", - "freertos_kernel/include/event_groups.h": "9b95cac84d003f12e82e97cc8d5616d88a2bb8724848c7d9f18ca852097a2b1a", - "freertos_kernel/include/list.h": "bfbaa359e018b8c21c9cb710e09d2674653c0b67d14ab0f301590a6d79f212d6", - "freertos_kernel/include/message_buffer.h": "076449d6a0bf5d5d63aeb9700e2cb6635ec69ee3a4d33fc0de6def534b222783", - "freertos_kernel/include/mpu_prototypes.h": "843220c8b133daacafb6f5daceb2127831a189353dd9111a2b1c8687e1386af6", - "freertos_kernel/include/mpu_wrappers.h": "d2b47890d8b286b00698cc64c803b26537382408def236e16e373cc5b90da48b", - "freertos_kernel/include/portable.h": "b71fc2ccbc10e0585188e887792c132b2991bd9493212d797ecde3d1d8922cd6", - "freertos_kernel/include/projdefs.h": "2cdf8610198e10342add28aab387de4055f643b2f89169b4faadf9553d292df3", - "freertos_kernel/include/queue.h": "5dbac622e7dcce903e7eaeaf7cd87ecb288c63a0f68db6c4eb4e7e563639f7e6", - "freertos_kernel/include/semphr.h": "bbf07f34de41367aa6ff8586294a6106171c6664d49a06fc0d09c6b73e57b39a", - "freertos_kernel/include/stack_macros.h": "eb79efaf46576c2be56f477939857e6ae52d78e92f83958e14b40e946ee5c051", - "freertos_kernel/include/stdint.readme": "337d3b5bde204f72bae8d27acbdd314fbfd3ab996c04b7297cbdc1e11d603f0a", - "freertos_kernel/include/stream_buffer.h": "f1c8e22f45abe9399b85f7ac2e5b09551fbaccd1255d14a2c3363ead28624608", - "freertos_kernel/include/task.h": "493d0d3bd70f8dafd917e99b279a81d43281523f5aa92d95872df7596351f481", - "freertos_kernel/include/timers.h": "c49b4724af6ad2600611b38f4f314f8347799e7517483cfc5b53e95f02bd8f63", - "freertos_kernel/list.c": "11c561910c1f4cff67fb911abf610e7bde778b4332cad2d0c1dfd08ebeb97a24", - "freertos_kernel/queue.c": "dcbee5df000e67ad8e065d0031b077eafe4ddb8385e0a6aa065d8e27e91478e0", - "freertos_kernel/stream_buffer.c": "006048fd490221987456092c181f187e7fb1aa1b411946f6d02eb3f187861bda", - "freertos_kernel/tasks.c": "26d396a9384e462638ffa1208ab6c2d8d25e6dccc54cd4f4c44fb5cb9ac0cb7f", - "freertos_kernel/timers.c": "6ad8c4fee9fb46bc5109df5a74b1f752f35f01a05a1273785fb8284fdccf67d6", - "libraries/3rdparty/CMakeLists.txt": "ba87b46ee4601ec3d49e605feae7b45555a4a7485516e8c2a71cfbc07ddb3485", - "libraries/3rdparty/CMock/Gemfile": "4694d0e0e82570ff1a0dfa45307e3fa6706738c9e7e387a89788f8da589d4bac", - "libraries/3rdparty/CMock/LICENSE.txt": "a228c2871b9a779a6542a49470c5b567f2806dddcbcf90af861bb4d39291626c", - "libraries/3rdparty/CMock/README.md": "7e5eda88c3a355bad26c706daa6350186c89fe1db148697192be99fcb38aa142", - "libraries/3rdparty/CMock/config/production_environment.rb": "f349586d2ebd6d949653f283e0d634776f5c669990b1dfc3fe2c009a401ff3a4", - "libraries/3rdparty/CMock/config/test_environment.rb": "e3e267cc37e6473ae3bd4e47326d0374762930ff101b82cc1b9c2fd607d77456", - "libraries/3rdparty/CMock/docs/CMock_Summary.md": "52b9bbc61b36b9e89e67556390d577e438d3bc503cc4bb13cfc0758d7d602c91", - "libraries/3rdparty/CMock/docs/ThrowTheSwitchCodingStandard.md": "a1838b8c9e20ac3c15bf96742b716b6621c0607c9273ae0f92a6769e3aa45f41", - "libraries/3rdparty/CMock/examples/make_example/Makefile": "4180bf84b4a71086dcdd9e5f622c63be705981f8e98e311d7ecceb44940c3ea8", - "libraries/3rdparty/CMock/examples/make_example/src/foo.c": "0bec016ce8f7d6033049664c12cfcc5c0099e638fc6395e753b4d36ea2808d72", - "libraries/3rdparty/CMock/examples/make_example/src/foo.h": "e987f3bf49f430e2a9cb70bdd7105f8945e028d1598f361b30fe87a0585d97a3", - "libraries/3rdparty/CMock/examples/make_example/src/main.c": "23c00ca8f9cd5d89107f26d0804e1a2a6f8840941462ddd616f0fa33da7dd0c1", - "libraries/3rdparty/CMock/examples/make_example/test/test_foo.c": "6d2fe8d7ece7f0f8426fe684896c8bf76d15ea35e56add62d59558b47ee32347", - "libraries/3rdparty/CMock/examples/make_example/test/test_main.c": "73baf6160697615a9af98a184479a28e92d42fb82c0f310efea1b105910a3b0b", - "libraries/3rdparty/CMock/examples/temp_sensor/gcc.yml": "5c5d558eba12c2c31432472acf7e90559bbd351632f4cb80c3ee621e4e65969a", - "libraries/3rdparty/CMock/examples/temp_sensor/iar_v4.yml": "f5722f968d75bbe9af61c0ad0f01b6b98afa1a08185526ae49ba121bac937ce7", - "libraries/3rdparty/CMock/examples/temp_sensor/iar_v5.yml": "bcf8ab60e79e586b628e8c0aff5c50011dd3db2695468b2ca6b8c25d3783e506", - "libraries/3rdparty/CMock/examples/temp_sensor/rakefile.rb": "2d74c10170bd68d2d064b6504893a9a5e73f878a2a699979fe8fccd1a70535f1", - "libraries/3rdparty/CMock/examples/temp_sensor/rakefile_helper.rb": "98100d1e2fb44baa2ec47f7ac61d1190438e42e4fc9994f6b9590c952e1a7336", - "libraries/3rdparty/CMock/examples/temp_sensor/src/AT91SAM7X256.h": "284e49294ecd18da7c0b4abbf825cf8edb0f68884d334167c1f755b8528b34f8", - "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcConductor.c": "b14eb5f4196976d82c9501184c0496ac5c071ca9a993ddab0779faea95810f44", - "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcConductor.h": "961bcc853beb286a6ed95ccaf1b48337e1e36b8e543ebb60ce9a56b80238d8e9", - "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcHardware.c": "e9aabd8f076c0d1738d6ea6294c0e16f15643ba19483b1ba6eee861f02cbb9e7", - "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcHardware.h": "af2841747b2659b183891c9c4c00a2b7c065b51a8b958c35d4a6be8564326e10", - "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcHardwareConfigurator.c": "06b303aab471c751073c25170c8b4bc5f52cd89eb52a29a0db32946975bafa6f", - "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcHardwareConfigurator.h": "2ac7b673358582f4df15beb5956cb9f66b8c56882ddb1f8508314d96459aebf7", - "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcModel.c": "885c0a3df693def8de467cc9d9cbb503ba795ffe379d65de02409f8fca2fe360", - "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcModel.h": "3ea12eb954305556617507aa8983f26fe0cb7afb7c8afc71341056e6d8ca23dd", - "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcTemperatureSensor.c": "301cb0b59970bc21f85b068d103732e4dcb55cdbb74536a242a2c45ea8151610", - "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcTemperatureSensor.h": "2fddbdb25206928f3c016ef362174caaf735d683da8e246f8d01f191d3926b73", - "libraries/3rdparty/CMock/examples/temp_sensor/src/Executor.c": "0cdf97b9afa1e7f2da8580b93a19fc536ad83ff4ff5ad1e42013e795af5db025", - "libraries/3rdparty/CMock/examples/temp_sensor/src/Executor.h": "11a373abf8479822f68c5ba2c244c922df6366047531c7953b1a257833075a7f", - "libraries/3rdparty/CMock/examples/temp_sensor/src/IntrinsicsWrapper.c": "95796f352948558443ea6000f9b1237d5b961d2275d12d7b4d33c6d05a4b90d6", - "libraries/3rdparty/CMock/examples/temp_sensor/src/IntrinsicsWrapper.h": "89354ee37181c2effe24d952bd3e4c7f44f7e02f8a85fe08debc64b4fdef3a4d", - "libraries/3rdparty/CMock/examples/temp_sensor/src/Main.c": "23b5e3b20efbe81415f4a8c21a47c767d6560e05e59b1a6b0220e5e4ae2503d4", - "libraries/3rdparty/CMock/examples/temp_sensor/src/Main.h": "6cbfb303c81f28a5e0b5cbb1fc44a860310af5f9c83fd5391b81c61ea4c6203f", - "libraries/3rdparty/CMock/examples/temp_sensor/src/Model.c": "8d62e7a6d628d609ffcda11085b09ee0f8fe18a1c527d8fcad54810a879cb705", - "libraries/3rdparty/CMock/examples/temp_sensor/src/Model.h": "409578c18146e8a728d4a0da93ed34d65880fc96dac39c2786a442e6ff47bb31", - "libraries/3rdparty/CMock/examples/temp_sensor/src/ModelConfig.h": "118773cc1bbaf51497b9e56fb3a65de4479944973565283223241e73abb34fed", - "libraries/3rdparty/CMock/examples/temp_sensor/src/TaskScheduler.c": "ccfda6443fa3c524f00d5810dfa48fa23e12608cf8e6dde46e5bf10293de717c", - "libraries/3rdparty/CMock/examples/temp_sensor/src/TaskScheduler.h": "b6e6f8c61bdd97ee32efe3a5b130c68379978ac126dc9695681de1a4393b0e14", - "libraries/3rdparty/CMock/examples/temp_sensor/src/TemperatureCalculator.c": "8ffc3c06a3449fd560275736c5cc3202137f00d0513e651304c836fd78128a56", - "libraries/3rdparty/CMock/examples/temp_sensor/src/TemperatureCalculator.h": "bfee490f7a59b6eedcd357c99cbff6be20b33b4aa96d54789aa420f69f3ceb33", - "libraries/3rdparty/CMock/examples/temp_sensor/src/TemperatureFilter.c": "fb6997e829daeefe1fa89a5febeb8aab8c9a9adfafb5739f60f786c69b57a3ea", - "libraries/3rdparty/CMock/examples/temp_sensor/src/TemperatureFilter.h": "0731c950b85d436e651737cca0ecff430edea68d62599e27167e7c5a2a57d983", - "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerConductor.c": "b10f5485f4a884019257dcd143dddfda528af77b1f8b005a40b2443020ef67a5", - "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerConductor.h": "53deff5a2ce521b48c69e1d85641e2c7da7d0bdbd1de48f622cc1a7df5efd177", - "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerConfigurator.c": "145397008f450ec09b8bd010b02430c3becddc92a7fcbe31c06a5baf99e32105", - "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerConfigurator.h": "55e7e6f42f76dc2c9c60137be3b4a4bfd3e9e96e4ce41c2300221bcf8fab24b9", - "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerHardware.c": "5085266579205f2be126cc0e5f34c443469a3e5da53efd0fa2d95a7653a98803", - "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerHardware.h": "abddafeeb43ee8cdc31389263b8826f3ccf6a20573ca4702dfeb537b00a04104", - "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerInterruptConfigurator.c": "596665665389de910b1dbd15c292f141a8e64a2c4a0164a7959121bed2467645", - "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerInterruptConfigurator.h": "5a7adb509ada4640fdccf739be3de8abb470b41bcddb9a9834e9b238a9fabd02", - "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerInterruptHandler.c": "7fab66be3e4d5c430a1dfddee56559ba55ab4cd0d448c583637072e9dc9f10da", - "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerInterruptHandler.h": "5cc7ecbd35069059f0fb2d516f8b63929e0a4d0fa00e53b593f0827d5f637d29", - "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerModel.c": "315b80af627d601b85c203ad389f455d5a010806ea113fc410c9bb5566cb7966", - "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerModel.h": "8946208aac57141bc8078bae72461ce1b0afcf9509eb7c9dd52d7643bf3c99da", - "libraries/3rdparty/CMock/examples/temp_sensor/src/Types.h": "342e458d2f13f4b2f42ac03133f005635bd4002ae446f5aa5006c73f4160a3d3", - "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartBaudRateRegisterCalculator.c": "a0a5c91867bd150cff7d8d1a25e5e3355a780421715afa1b9b7ea747612b8fd3", - "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartBaudRateRegisterCalculator.h": "cfe9a2cd19135f1c1058748f6c82be18331e35a7796a8801103458b2c36912e7", - "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartConductor.c": "3536b396eddfd8d605ac050c18fd150764031ed873e18362fb0ebc34d9d7dc3c", - "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartConductor.h": "58ce401a82e272c72f0d9cc81310a103d6bebd9565d8ba783d8a99a014a17aad", - "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartConfigurator.c": "d4805a5c993e1c0227442f926bd9a28dd1d8af59fdb93c35fa707e14d77baf09", - "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartConfigurator.h": "95eeabe4b7a99b54cf49531930b0a4be7fe812420c53dc1b730dec7f08e2d1c0", - "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartHardware.c": "97db4fe3c762e48593838b8ff9ba20e08ce02ceb39bffa592b8691d850ecfe0f", - "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartHardware.h": "99fa878f31c0b2f5d91cc7646ef25823c38a5c78a747a780d4c25754f448af0e", - "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartModel.c": "36d389273df8ac7d3b28a3490a511c1be2c117d73d9f7a26dd7d34af5c6cd5a7", - "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartModel.h": "c367f4aab51341ba2dd1780bad6b7cf59c344009505695b608b734b4711592b3", - "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartPutChar.c": "2b2aab187d2b818ab28750a0676298205a7f7938ebffa440aaff99f3bc37002c", - "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartPutChar.h": "557610200557eb94f1a7f5d7a1a7d26bd0827f5e2b06749353dfa4fae73d4439", - "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartTransmitBufferStatus.c": "7924adbc923cd9eb3bcea5877defbacb3ec16a03de29e7327ff064304a914505", - "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartTransmitBufferStatus.h": "955b1a7e0f4de642f8bb6083b8fa8c3f4d75bdc4c378794aac6dde049410d42f", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestAdcConductor.c": "9d22203689e18bdb6daf3a8aee7d17438028deb1d924731a0597c13743616d88", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestAdcHardware.c": "b3b05e87ac62d463ef489eb2e8aca41d2b6829ef8edaab27622c9c4889a59dba", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestAdcHardwareConfigurator.c": "58333e4681ca8a34e98b11129deebc653e44e3587b03b6b7f523a80ace169225", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestAdcModel.c": "dcf55240bd2ce74f8e3bcc28a98ed8037d51375ade9ebb1d61e882b41e11a9b6", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestAdcTemperatureSensor.c": "f5178bbb8605872e09608baff9b049cc826afa278bc1a125389255e786131f8f", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestExecutor.c": "db1bc8f44e9183b2a7909c0c0b8fac6b25b37d4aee0f47c9ab181500cf384ac9", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestMain.c": "67944d7590384483ecb8b1c06cdc9426e4c78bdfa99886f4d24f9d07e2aa84c0", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestModel.c": "1720d2acf16537a03ff8b6e800f04c46312c9f17985d856f3cb3f64309a869f0", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestTaskScheduler.c": "4efcd2cc31f7c3737f8a0143faf05f370466cb7acf75f0d15f7d661f9303472c", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestTemperatureCalculator.c": "f0b725debcc365c16a055371f3f48534d3f30bac75804cc9c5838850a8bb91c9", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestTemperatureFilter.c": "ffc624388daa2322ce339cff9445abf37cd2372534db356f57821b9e49874761", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestTimerConductor.c": "7d2d58e797a65e44698e30cdb79cac7e94fb96c8e95623c3ab8f9ec0f9078809", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestTimerConfigurator.c": "51748b3199379ebd5797c4da7bdefed444aed398ae36508c098c3f00a2a4416c", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestTimerHardware.c": "7ab489c8cdf7d8d0421482a1a6ef7b1f8663e38453a140e9a5550d1c67844170", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestTimerInterruptConfigurator.c": "7f8eb3100b9091d2996c8f75459659e8ae0c5a75f0d5ee08e3649b17f3394cce", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestTimerInterruptHandler.c": "0000e221012abd79eaf668188923275b7e7e12ef297b15b2165e35440c0f1eac", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestTimerModel.c": "cee4214bb0cf367910562488f448014bc802274d2894bc87ad9fa49098a99add", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestUsartBaudRateRegisterCalculator.c": "729c0d4162bd09ac4514e2de1f70e1b0b4fb05ee125dcfb91314aa40986e8235", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestUsartConductor.c": "ab351f7a74ba445200ccf3d851122fb86531e8511d8cbbbfd1d70b9ccd4a93a4", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestUsartConfigurator.c": "719758e045571b2c532007e37cfe9939eddcc850e069481524f5d4b17d9d399e", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestUsartHardware.c": "c29fa69264fd62d7a466a95de9c927e94119b366ecb1d333be47c60de6183fa1", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestUsartModel.c": "5ab9a684792f271e587d4e861de5c3dc90439dcc4670d7a06da8bd078161a2df", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestUsartPutChar.c": "cde5d54b2acf09a6caf86e360c9a2fd40fb6ccdc8fcfe78d4b10ca7c34d95e9e", - "libraries/3rdparty/CMock/examples/temp_sensor/test/TestUsartTransmitBufferStatus.c": "d66b41fefa7200f926652c67cc3797b6143b321e7be5eefb099caaa4cfe2af37", - "libraries/3rdparty/CMock/lib/cmock.rb": "2db133af7e8c2782b955c5727fe806149e29e1f6f6c24f0edb06bf0e8fb990ce", - "libraries/3rdparty/CMock/lib/cmock_config.rb": "d1f169fd7570f897c7025f90b69a3b563a0053013c6bf9701dce79c66fd8b0c7", - "libraries/3rdparty/CMock/lib/cmock_file_writer.rb": "00952d06256e5c4f15d12798124d1924cdd9ddc0767f8849bd4fdd5da27a0796", - "libraries/3rdparty/CMock/lib/cmock_generator.rb": "efcad21dc935182dfaad8798b5311c73457e6ec7289990d60273ccf8b49f9e88", - "libraries/3rdparty/CMock/lib/cmock_generator_plugin_array.rb": "cf79e99a143bbffa19513c552427758151dbf5bc4498872d55240a301cf81e62", - "libraries/3rdparty/CMock/lib/cmock_generator_plugin_callback.rb": "af43da2e2327b72cc5c4acf54f2acaa851e050dd0fdc295328b04f0daad5e738", - "libraries/3rdparty/CMock/lib/cmock_generator_plugin_cexception.rb": "7ea5018ce83d734f587e16754f09508d98a6d7ee9e35ae4d77f795c64d817091", - "libraries/3rdparty/CMock/lib/cmock_generator_plugin_expect.rb": "24e589d18c6adf83d9efb6fb466aaa6936566ac8f3c8fddbdd4031c015013be9", - "libraries/3rdparty/CMock/lib/cmock_generator_plugin_expect_any_args.rb": "8156d254e07315f04e7ae692bc6e90fa0f3418122e4048fe888ca2a08a5e2506", - "libraries/3rdparty/CMock/lib/cmock_generator_plugin_ignore.rb": "040a49d79fa8a39a215105b5e1333ace4e858d84db305e7d2addd71fbbfa3645", - "libraries/3rdparty/CMock/lib/cmock_generator_plugin_ignore_arg.rb": "85bb085311132867f962969f4757346b950497bf1ef0fc6bf856b30fa76d879d", - "libraries/3rdparty/CMock/lib/cmock_generator_plugin_return_thru_ptr.rb": "1de81b18418f28c42c3cece2cdac389f0ca106bb6aff0cd148e60e3666017161", - "libraries/3rdparty/CMock/lib/cmock_generator_utils.rb": "ab582b61a17547a861f2623c13a22b2db5c985bbb2d280b4036978f490550ecf", - "libraries/3rdparty/CMock/lib/cmock_header_parser.rb": "88e194b0f99b8ed412840d564d89e8f9f87f6b81e81998e64f37e512e39e4eac", - "libraries/3rdparty/CMock/lib/cmock_plugin_manager.rb": "ea1f967c58ad0b7c4d5770f73a1c8a0e2b2c3316222007ce47975ea12037ab1e", - "libraries/3rdparty/CMock/lib/cmock_unityhelper_parser.rb": "9c345fb34efc38ee37787cf6d33b161a10e819b18e1f8f88ab855a58b1bda1eb", - "libraries/3rdparty/CMock/meson.build": "f476d259cf456982649c5dba0c88070257da77a71316eb3403002a7d50139239", - "libraries/3rdparty/CMock/scripts/create_makefile.rb": "c03914eea03a12c2086ab042e5ea60f3375ae2742b32fb98812493e8ca015d77", - "libraries/3rdparty/CMock/scripts/create_mock.rb": "995d1551fc08f789e8d036ac378014ab1fbce43aebd4d84e18d7c66585571f65", - "libraries/3rdparty/CMock/scripts/create_runner.rb": "7fe06ce7115cc57a07a2dfac985dc29ffffbefdd94ef57e560b78d22a0628c23", - "libraries/3rdparty/CMock/scripts/test_summary.rb": "345e9fb68e4b3c49c36022a7e17d0b704ce1dc0a9adfde7bd0281084c6db4bee", - "libraries/3rdparty/CMock/src/cmock.c": "5bdc4ba9861d73b950646a3f5ce6ed15e7cdbe67a17c3c625316979236ab1e49", - "libraries/3rdparty/CMock/src/cmock.h": "1e80437b68da381104b8f6df528fa5a136917a35e45ff0eaac117f2a22ae8fea", - "libraries/3rdparty/CMock/src/cmock_internals.h": "4df4b62d2b13a0b6541d986100b9ec6b261b882741834ef2ab0d51a0afa34e00", - "libraries/3rdparty/CMock/src/meson.build": "a04202d0f04fadfb7a766d041f92fbe0b858d5b2c7e1aab03c7538d77ee2b823", - "libraries/3rdparty/CMock/test/c/TestCMockC.c": "7beed4e807a064045a2f00bb149af817483fc70331aedfaa0d2934d3b94f993f", - "libraries/3rdparty/CMock/test/c/TestCMockC.yml": "7457da36df8102d71c336ca384702879161097ff542380bed78cb5446984ae4c", - "libraries/3rdparty/CMock/test/c/TestCMockCDynamic.c": "eeaac501c9e65e166ebd11b90c5275c67597e81e6c9c3156faf006751023495b", - "libraries/3rdparty/CMock/test/c/TestCMockCDynamic.yml": "4755d85389465ac56733780ec7da93965dccf5eba935195acbbb7de251c6048a", - "libraries/3rdparty/CMock/test/c/TestCMockCDynamic_Runner.c": "ba26744cbf8c4f1ea7de6ca7254700bf1e16ae57682270dc4d94393ccd501588", - "libraries/3rdparty/CMock/test/c/TestCMockC_Runner.c": "465d91fe9d981509a92267d0471fbb3e412a88b6f7d50437fe91e47ef6d69e8f", - "libraries/3rdparty/CMock/test/iar/iar_v4/Resource/SAM7_FLASH.mac": "8ac360d36256589216b144c525d510af24457ef763becd14b137f63e953cc17d", - "libraries/3rdparty/CMock/test/iar/iar_v4/Resource/SAM7_RAM.mac": "df15f8e476e1ca1b8d3141cfe0c801881939e70cefca237a98d804742cccdcfe", - "libraries/3rdparty/CMock/test/iar/iar_v4/Resource/SAM7_SIM.mac": "6177e42e1a0a493976fb4d196b65cb1257e045db281ad48569b4b9ee6d9f37bc", - "libraries/3rdparty/CMock/test/iar/iar_v4/Resource/at91SAM7X256_FLASH.xcl": "8594f9522b6ae41e96ab7b848dd7e4024876f7882d95f60a8bb6577ffd154605", - "libraries/3rdparty/CMock/test/iar/iar_v4/Resource/at91SAM7X256_RAM.xcl": "713104cf6bf984663d5227b3ea6fe1d045413630b5a71404b2a2a7156346ae9b", - "libraries/3rdparty/CMock/test/iar/iar_v4/Resource/ioat91sam7x256.ddf": "f23d06dcacffa6d544f4a560a4692bdaba7b918b488b810db928b418a4bbfd88", - "libraries/3rdparty/CMock/test/iar/iar_v4/cmock_demo.dep": "5157f2a91a7169b63aa30424a220053a8983194e6145d14f3a39bfa2e63175ac", - "libraries/3rdparty/CMock/test/iar/iar_v4/cmock_demo.ewd": "176d8abee2d57ee30575952da2aa2bfa4dc851b908e44df728b6a4a2c222fd8c", - "libraries/3rdparty/CMock/test/iar/iar_v4/cmock_demo.ewp": "ffacbcc9ee4b092f01af22ee7bdcd34bff44043cd3c903ff9530912b0d4eaf0a", - "libraries/3rdparty/CMock/test/iar/iar_v4/cmock_demo.eww": "7b5fe1867f77d1c6a09c591e3c4705a20ec0102a10e5049aa3fdb1989596e23b", - "libraries/3rdparty/CMock/test/iar/iar_v4/incIAR/AT91SAM7X-EK.h": "41b4cd1cbc547b10818daf44adeb335a7dcd6846b229195c156be0be9b1cc056", - "libraries/3rdparty/CMock/test/iar/iar_v4/incIAR/AT91SAM7X256.inc": "5f7c307376baf65d6ae5e16bb23b7d9374b713c7a8bd963240418dd026f5cd79", - "libraries/3rdparty/CMock/test/iar/iar_v4/incIAR/AT91SAM7X256.rdf": "f7a13e637d12010564f884cb25ca152909f5cf056fbd87b8f837e6e999305411", - "libraries/3rdparty/CMock/test/iar/iar_v4/incIAR/AT91SAM7X256.tcl": "959dfe614a39ca1c47aa5e42d10979bb939c4c0464cc01f3d395a17baa2759f8", - "libraries/3rdparty/CMock/test/iar/iar_v4/incIAR/AT91SAM7X256_inc.h": "cf75fa42dbdac6d2e055ee6a1b4be6c3fda982bca36832167dbb3338c2529ea0", - "libraries/3rdparty/CMock/test/iar/iar_v4/incIAR/ioat91sam7x256.h": "df4353041f1daef07fff13afedf5c82b6502ec3f27af4b7943a409dbf27bcdc4", - "libraries/3rdparty/CMock/test/iar/iar_v4/incIAR/lib_AT91SAM7X256.h": "d500574f73b3e2c0e026d600f9949f680270aa9e78c82b0250276c75edbd79b1", - "libraries/3rdparty/CMock/test/iar/iar_v4/settings/cmock_demo.cspy.bat": "0b95a0e1455c0947578eb48f8e77dc4303c672208d92a29883061115dfd4740a", - "libraries/3rdparty/CMock/test/iar/iar_v4/settings/cmock_demo.dbgdt": "16333ca6fc95ee3c09e1d65fb546fd714e1039a2d83a7ab88d5113f7b92e89de", - "libraries/3rdparty/CMock/test/iar/iar_v4/settings/cmock_demo.dni": "36b4ad5d2c76a305040b922a7b27d4d36f68e3ffaa13ca327db77b7f82280e6b", - "libraries/3rdparty/CMock/test/iar/iar_v4/settings/cmock_demo.wsdt": "1502e8d1c367c132f62906a92a931ced79057ef818fdc502900ab6fa092681a7", - "libraries/3rdparty/CMock/test/iar/iar_v4/srcIAR/Cstartup.s79": "73b3a3034252453843ce316daae1cc691d8289a6943105718c04e5864b384110", - "libraries/3rdparty/CMock/test/iar/iar_v4/srcIAR/Cstartup_SAM7.c": "15857d19064c45c733ffc3c3de66b9f987bdd44b8e1d29b3ae17a355faaa3472", - "libraries/3rdparty/CMock/test/iar/iar_v5/Resource/SAM7_FLASH.mac": "8ac360d36256589216b144c525d510af24457ef763becd14b137f63e953cc17d", - "libraries/3rdparty/CMock/test/iar/iar_v5/Resource/SAM7_RAM.mac": "df15f8e476e1ca1b8d3141cfe0c801881939e70cefca237a98d804742cccdcfe", - "libraries/3rdparty/CMock/test/iar/iar_v5/Resource/SAM7_SIM.mac": "6177e42e1a0a493976fb4d196b65cb1257e045db281ad48569b4b9ee6d9f37bc", - "libraries/3rdparty/CMock/test/iar/iar_v5/Resource/at91SAM7X256_FLASH.icf": "d37f75919b1793bac86891e7fa9a9142ae83de351d5ef169af909ce770ae6d01", - "libraries/3rdparty/CMock/test/iar/iar_v5/Resource/at91SAM7X256_RAM.icf": "170c34f5e702138b2b20cb696a482886936cdad8eaddb18c6c84abc5facf0a17", - "libraries/3rdparty/CMock/test/iar/iar_v5/cmock_demo.dep": "0a869be5fc1a6ba0991c5012d8d4bf21ecdaf35ce23ff2207bbe35fc72b7acc2", - "libraries/3rdparty/CMock/test/iar/iar_v5/cmock_demo.ewd": "5ebda13f0da843a1a4343bdb77c728d72ffcf8356a48eb6e3d5527428f6a1ba4", - "libraries/3rdparty/CMock/test/iar/iar_v5/cmock_demo.ewp": "019d8fe92e6206e06b9fc46938e2ac19d9b8d9e27186f4ed05bc9f1f4ffca31b", - "libraries/3rdparty/CMock/test/iar/iar_v5/cmock_demo.eww": "252dbeae342d9ad0c34d7f4a622dec74a5f400c08ad931771dc418dcc8aea7c3", - "libraries/3rdparty/CMock/test/iar/iar_v5/incIAR/AT91SAM7X-EK.h": "41b4cd1cbc547b10818daf44adeb335a7dcd6846b229195c156be0be9b1cc056", - "libraries/3rdparty/CMock/test/iar/iar_v5/incIAR/AT91SAM7X256_inc.h": "7fbf38b71f042bd3130dd7a0cc6e55130eae320e4fe705e078e5f9144c6e03b1", - "libraries/3rdparty/CMock/test/iar/iar_v5/incIAR/lib_AT91SAM7X256.h": "405c0c979b5c39e520624e0b5da725690c69f220d5985c6129b1be0bde3ff4a1", - "libraries/3rdparty/CMock/test/iar/iar_v5/incIAR/project.h": "431c8cdd8373916c97b6555fd0df183b4eed8799fe61397c5b9458d71e194edf", - "libraries/3rdparty/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.cspy.bat": "2e1acdf2e55863b5e33588ee350d4ea8325a79aef8f143a1d1e4dc9a20894ebe", - "libraries/3rdparty/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.dbgdt": "1967e4e174ca97638a540915477a6cbc829cf2d19bb4ad6046ebb43cef922619", - "libraries/3rdparty/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.dni": "e7db4742adcbe78483a5a2bd0510ef338a2ddddcca3b4587d493c54fec22a722", - "libraries/3rdparty/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.wsdt": "bfd819154f05571882a5c70fa8e47aaf4a6be521b9ce321b086ecc8b3fad2fe9", - "libraries/3rdparty/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X_FLASH_Debug.jlink": "94a14185b32946b9295be7a4230afb5f71ddf87bff3e9f279ce4d82feabe98f9", - "libraries/3rdparty/CMock/test/iar/iar_v5/settings/cmock_demo.cspy.bat": "98d3f600ca83fc5e0e141e27f17c92b52b28997445a64d7f63cb4312f490a580", - "libraries/3rdparty/CMock/test/iar/iar_v5/settings/cmock_demo.dbgdt": "942572f2cb503a36b9e633642c54e72dc8bc929a41a9430fe62837ea3eb837c0", - "libraries/3rdparty/CMock/test/iar/iar_v5/settings/cmock_demo.dni": "35f715df5935f7b03aae4126e33e296bd36df32f86aa00d425a09e65ce1fb66c", - "libraries/3rdparty/CMock/test/iar/iar_v5/settings/cmock_demo.wsdt": "b5f6a167aa78028b09a439565dede111bf8119403c9f290367163356008807f5", - "libraries/3rdparty/CMock/test/iar/iar_v5/settings/cmock_demo_Binary.jlink": "94a14185b32946b9295be7a4230afb5f71ddf87bff3e9f279ce4d82feabe98f9", - "libraries/3rdparty/CMock/test/iar/iar_v5/settings/cmock_demo_FLASH_Debug.jlink": "94a14185b32946b9295be7a4230afb5f71ddf87bff3e9f279ce4d82feabe98f9", - "libraries/3rdparty/CMock/test/iar/iar_v5/settings/cmock_demo_RAM_Debug.jlink": "94a14185b32946b9295be7a4230afb5f71ddf87bff3e9f279ce4d82feabe98f9", - "libraries/3rdparty/CMock/test/iar/iar_v5/srcIAR/Cstartup.s": "f01a69400b4d52ad0202134d4d1eb2b2afb8b5b90f19cab527ef2c63354725a6", - "libraries/3rdparty/CMock/test/iar/iar_v5/srcIAR/Cstartup_SAM7.c": "ffffb70bb3424fb7537c766bfa1d0831154bbc455b10a7085ddfe6e5a51cd8e3", - "libraries/3rdparty/CMock/test/rakefile": "4076929f99d8fea975aa2311bf348a806c440e1e25d6eb38b0eb16af7bfccb7a", - "libraries/3rdparty/CMock/test/rakefile_helper.rb": "b9196d105d59f0794a18f7cefadde56bd791e8a5180be7aeba0a183137d380fd", - "libraries/3rdparty/CMock/test/system/systest_generator.rb": "f0dfa97acb5355b013f632459d91d8f8ceb0bff07e78a2b62c0f8955aa9fda77", - "libraries/3rdparty/CMock/test/system/test_compilation/callingconv.h": "f0d451838c94b20cb9df40827b1667e82719adf34bc7f848ce1ab330a95f5ece", - "libraries/3rdparty/CMock/test/system/test_compilation/config.yml": "55da291e818f575aaec65bfd678b9bc92badc2775bd012ea465d124bb03f6874", - "libraries/3rdparty/CMock/test/system/test_compilation/const.h": "452666930532c934d30c06081a1207422064421e2111ef3d774f60801c8d0298", - "libraries/3rdparty/CMock/test/system/test_compilation/inline.h": "faae36b96040414ffbbd8c9cd0ddcf1d918b5431ad81c12e391fe8b283ae915f", - "libraries/3rdparty/CMock/test/system/test_compilation/osek.h": "6283a1ba1ce53af3c73e246ec073497aec8d5da7e573f8474a45e1ccaf72730c", - "libraries/3rdparty/CMock/test/system/test_compilation/parsing.h": "f6f31c9b303aaf2948ed48cd6e8dcc0d7cef5bacc91b5746b11d432701911bd4", - "libraries/3rdparty/CMock/test/system/test_interactions/all_plugins_but_other_limits.yml": "23512e99944a08a4517037fddc6f13451118a23a19327270e7f0cde0a882643e", - "libraries/3rdparty/CMock/test/system/test_interactions/all_plugins_coexist.yml": "2fa3f85fa5bcfd432d7e82be741d3e4bce969182d3b3c4335ab2bac494a8b3e2", - "libraries/3rdparty/CMock/test/system/test_interactions/array_and_pointer_handling.yml": "afd7b725c51a0268b2fe582416b59e303c611a86af8359627a10483ccf4ac3dc", - "libraries/3rdparty/CMock/test/system/test_interactions/basic_expect_and_return.yml": "188b82892feac0f148d9b8d1edf9929e4145d8adb7ffc0b2752be3dfe5c620d8", - "libraries/3rdparty/CMock/test/system/test_interactions/const_primitives_handling.yml": "2610282b06d4b05f3f7e9b22254278648a29dcf1808f8206ac92d183ed7c7ebd", - "libraries/3rdparty/CMock/test/system/test_interactions/doesnt_leave_details_behind.yml": "5d39bdb3fb162c3664ed180754c6b8042c12ad7e29ccc65b42c312ccfeed322a", - "libraries/3rdparty/CMock/test/system/test_interactions/enforce_strict_ordering.yml": "85f9cc7ce2eb22b0da825ca8d6e38a05bffb69dab0e66c0e516753b74fcfe10b", - "libraries/3rdparty/CMock/test/system/test_interactions/expect_and_return_custom_types.yml": "361e10a02795595bf45c64b2026d9342fff1e4d0308fb5202413bffb84bd3b10", - "libraries/3rdparty/CMock/test/system/test_interactions/expect_and_return_treat_as.yml": "6601ab58a7b0719e26124b40d3aed2272a032f4ff3ae45da241b0b39bdf03ce9", - "libraries/3rdparty/CMock/test/system/test_interactions/expect_and_throw.yml": "18eb54309f69744598138a5b3f8ef4b898bbc3fb46b1a42306016d6ed566c1d3", - "libraries/3rdparty/CMock/test/system/test_interactions/expect_any_args.yml": "1348aa720acf85e117c6c23353f205b3438eac30baee86efeacbdc04f2645d27", - "libraries/3rdparty/CMock/test/system/test_interactions/fancy_pointer_handling.yml": "a3033a4e31bcfbf66126059476d9fdc7bdaa197a8b6568a382c93e373110abb4", - "libraries/3rdparty/CMock/test/system/test_interactions/function_pointer_handling.yml": "85c81773cf1dcf80dc84ccb433d8442aabde1b8635292819315287e828b93f63", - "libraries/3rdparty/CMock/test/system/test_interactions/ignore_and_return.yml": "4300c43c2e59a39111809e3e4571484e45146344a20d706a2c0c8618159fa2ad", - "libraries/3rdparty/CMock/test/system/test_interactions/ignore_strict_mock_calling.yml": "08c69a141af52960e0e9043d717ff5df442f7889edcd145898c0cade3fcc3e72", - "libraries/3rdparty/CMock/test/system/test_interactions/newer_standards_stuff1.yml": "f2073b808f4cc2d918612ff1c910fbc4a8ead998b12fcbc7608d430fe71d8eb9", - "libraries/3rdparty/CMock/test/system/test_interactions/nonstandard_parsed_stuff_1.yml": "23db82fdbc1643ed58a58c20a4154e75b8559509a3f827fb43e9c5965103e4f6", - "libraries/3rdparty/CMock/test/system/test_interactions/nonstandard_parsed_stuff_2.yml": "f51bae36303d532e357105195369615ab17560234efb1f0141973c2794ac0693", - "libraries/3rdparty/CMock/test/system/test_interactions/out_of_memory.yml": "4b4509e9c368fdec539be90daa164185175849afcf39c2d0a9c4d9ff9e423191", - "libraries/3rdparty/CMock/test/system/test_interactions/parsing_challenges.yml": "6f9a0d35489a6e6435211923ea43349e17cb68fc9652cb98511be8f74a78a079", - "libraries/3rdparty/CMock/test/system/test_interactions/return_thru_ptr_and_expect_any_args.yml": "64915233c5cb94bdff20cf89f650de58f278a214417bacf52129b67d67208cc0", - "libraries/3rdparty/CMock/test/system/test_interactions/return_thru_ptr_ignore_arg.yml": "cde16df22f47d782043ce85063cd7d53dcb3473eebd25631bbd18d7d87c38db0", - "libraries/3rdparty/CMock/test/system/test_interactions/struct_union_enum_expect_and_return.yml": "c926cca48cce1932fd57dc871187073cf3e35d12569369695a18a4a6fb7be3f8", - "libraries/3rdparty/CMock/test/system/test_interactions/struct_union_enum_expect_and_return_with_plugins.yml": "29f087a7f1217b3724517523dbf122bfe07277505549c465b1821df926b75c6e", - "libraries/3rdparty/CMock/test/system/test_interactions/stubs_with_callbacks.yml": "5e2cf62796105fa958e9528d3a30cff3a83c4f9d23385ab75a5939841647c486", - "libraries/3rdparty/CMock/test/system/test_interactions/unity_64bit_support.yml": "91a78d7f1216c1c18388116c169d2da0994351e61155fa6bb622bf16b635838e", - "libraries/3rdparty/CMock/test/system/test_interactions/unity_ignores.yml": "f6e9193481c9f0a5c5ab50833fea66da7bc34977b35a176fd613130ec883bf92", - "libraries/3rdparty/CMock/test/system/test_interactions/unity_void_pointer_compare.yml": "b92f86081c7771eca83efad7e38e071ee5bf8ce2e1a410df7d7af9c392486e6e", - "libraries/3rdparty/CMock/test/targets/clang_strict.yml": "4d477d7d7c1ffe0ce9175b89d4812119c7a0a79e924290e59c3dbd46b0975de3", - "libraries/3rdparty/CMock/test/targets/gcc.yml": "f012ab43326a37713fb72f33c0e03771fbbf4347e549de6cfdb476cda0ad9118", - "libraries/3rdparty/CMock/test/targets/gcc_64.yml": "0c0df186d99f01666f0d8145289179d86298c3671cdd7083c5e3c4a41625d5d2", - "libraries/3rdparty/CMock/test/targets/gcc_tiny.yml": "c9b57fd070a3e98fc3c237c9b3b99b31d0cf01cc0565b81812f57f68ca340714", - "libraries/3rdparty/CMock/test/targets/iar_arm_v4.yml": "fe0f205df28d23f4a940c1efce9e74ddd227427eaa55a70a283d8ff0722e45f4", - "libraries/3rdparty/CMock/test/targets/iar_arm_v5.yml": "7649d656896a709b2124b232bbe2d4911ae141617ccdd947e1f1541f23615bed", - "libraries/3rdparty/CMock/test/test_helper.rb": "7561fd77c8b7c6ec581d2e946db129893dd842d813801bd5ff6dfb42eb98cb19", - "libraries/3rdparty/CMock/test/unit/cmock_config_test.rb": "25ba1146b5fdf8ceca1c3fe385dd4a20f6e51a5a8b5ba83c8dbc935d9fa570ad", - "libraries/3rdparty/CMock/test/unit/cmock_config_test.yml": "2b1460d832657fe5f69b70b92a7bcd40edd42346aea4bab20043ffecd43719e4", - "libraries/3rdparty/CMock/test/unit/cmock_file_writer_test.rb": "88cf580634a0907f12b8068f1deefe7e90a14b0111d55da6d413f3827347b9d6", - "libraries/3rdparty/CMock/test/unit/cmock_generator_main_test.rb": "dececdef4bbc98f3fc6aaf40f10c3af850b03ac6e3fa627bd6e7350a96a41075", - "libraries/3rdparty/CMock/test/unit/cmock_generator_plugin_array_test.rb": "560f97841377b5ae6704cd4363e0d21c8883abcb7f5d2907608e6c0aa68c3518", - "libraries/3rdparty/CMock/test/unit/cmock_generator_plugin_callback_test.rb": "4d941ccc21ba7c3963697ae1266e24d565c887bc536fa639edb42dd58c287aa2", - "libraries/3rdparty/CMock/test/unit/cmock_generator_plugin_cexception_test.rb": "4a4bdfa48a17829dd1c3d58cfd4da6769bfde6bd592b55afc2685d24a667fec1", - "libraries/3rdparty/CMock/test/unit/cmock_generator_plugin_expect_a_test.rb": "a9e543df7153bb147b90a94b09b7a54182d8f3f54effb9cff15a0fd58aae4937", - "libraries/3rdparty/CMock/test/unit/cmock_generator_plugin_expect_any_args_test.rb": "56c461cd0c0dbd14dfe0eaaf55989077c04067e70c13e561e27634d027da90ae", - "libraries/3rdparty/CMock/test/unit/cmock_generator_plugin_expect_b_test.rb": "6c4179cb40ae3cc3d7565d8fac5d0396854000fe435b64d85b5efda87e49ecef", - "libraries/3rdparty/CMock/test/unit/cmock_generator_plugin_ignore_arg_test.rb": "c433e1db36e15ec882c9b555b7de2901d6f5e316887b2224d71f72e0a841b855", - "libraries/3rdparty/CMock/test/unit/cmock_generator_plugin_ignore_test.rb": "163ba76164e27a44b773a41bf99a898e29b4532f79c157f8994dd4e354dd1265", - "libraries/3rdparty/CMock/test/unit/cmock_generator_plugin_return_thru_ptr_test.rb": "62a488259440c6b8ae34ad9265bc2c9b2741498d0d0ed7f408ecb39935aa989b", - "libraries/3rdparty/CMock/test/unit/cmock_generator_utils_test.rb": "5cfb64fde1d437bbb70c35745a9c95ad5f1093eee2017b3db77b096526b0eedf", - "libraries/3rdparty/CMock/test/unit/cmock_header_parser_test.rb": "7c8e84c06144ae72ae3c5c70c148f3557c81440e4a3662283a0b77f120051197", - "libraries/3rdparty/CMock/test/unit/cmock_plugin_manager_test.rb": "510fe651508db42d428539b63fbf2aa5c2601ac4b5f1fe0d5d756ba4f03f08e5", - "libraries/3rdparty/CMock/test/unit/cmock_unityhelper_parser_test.rb": "e77b10af099223b17e9c524d0e6520a8d90ef878f9326d8729a3d0cab437d172", - "libraries/3rdparty/CMock/vendor/behaviors/Manifest.txt": "f6def0d4d599a6d17c7b0a6e5cc65824ba9312a85c4d9640f9f40f3a65fe6e39", - "libraries/3rdparty/CMock/vendor/behaviors/Rakefile": "be9b1156744f3cf65e64c075ae5385313ce59e5ac4178ed8c63371bc817d214f", - "libraries/3rdparty/CMock/vendor/behaviors/lib/behaviors.rb": "c818cb720cce5d3da2b1a1e09601f2329f8889cccfdaf4e7ad7482d2524609d0", - "libraries/3rdparty/CMock/vendor/behaviors/lib/behaviors/reporttask.rb": "6abac47d73976e719ef3b2e47ffde7e048a08044e807b8d5b3eca7ab18c3acd8", - "libraries/3rdparty/CMock/vendor/behaviors/test/behaviors_tasks_test.rb": "04ef3a3e45cd62bc102267a2919240a9a021438e0dafccf2d817234104426ba9", - "libraries/3rdparty/CMock/vendor/behaviors/test/behaviors_test.rb": "4240fa9b7f31dcff3c5509827ebed298d2c388f55b8701221874300e815d76e0", - "libraries/3rdparty/CMock/vendor/behaviors/test/tasks_test/Rakefile": "0c9e136971e8aeb54404b4827de1b85cabb5512a8aaf8f36929e052339144638", - "libraries/3rdparty/CMock/vendor/behaviors/test/tasks_test/lib/user.rb": "b5527ab1ec2cde94b51b84e785840a076ceb4df87f8c71a52eb9119a1785f1d5", - "libraries/3rdparty/CMock/vendor/behaviors/test/tasks_test/test/user_test.rb": "e12e02edcc9868ad43634427fef9873e7e6a03a6144d59ed302d1f40beab18d6", - "libraries/3rdparty/CMock/vendor/c_exception/Gemfile": "cb78daa14792e77465dd161b635ba85f7a143bf30e003cd8fb16b01b7a166f6d", - "libraries/3rdparty/CMock/vendor/c_exception/Gemfile.lock": "15f6fce88a07c7d1c88ca17351debad274a78337fe6149e84c1d098ba5afd8a1", - "libraries/3rdparty/CMock/vendor/c_exception/LICENSE.txt": "4a7d2fd8c1a6b383df443b91d716cca25809e901fdc2f473026c17f00a02bb5d", - "libraries/3rdparty/CMock/vendor/c_exception/README.md": "9420da200b2d36c4948268b25f82cac4a71d66c5e4ede3012d714d2ce30d230f", - "libraries/3rdparty/CMock/vendor/c_exception/docs/CException.md": "70fb5bb5fd31b2f2a3414f67dc55544af51afd2a16c00a50db2ca74f1c55df6b", - "libraries/3rdparty/CMock/vendor/c_exception/docs/ThrowTheSwitchCodingStandard.md": "a1838b8c9e20ac3c15bf96742b716b6621c0607c9273ae0f92a6769e3aa45f41", - "libraries/3rdparty/CMock/vendor/c_exception/lib/CException.c": "02ded3b989fe1828ba78ede51a3b8f0624fd886da7d714deab3919938a8e205e", - "libraries/3rdparty/CMock/vendor/c_exception/lib/CException.h": "7feecde43aa33b8c2d22cc49fb51cf7cf8e1af04d8ec3be80d469d3e19cb7a33", - "libraries/3rdparty/CMock/vendor/c_exception/project.yml": "a40754c9266fa0905e42dd4dfd67e8248a26714d7f9bcd46a9dd2f5f497fc1bb", - "libraries/3rdparty/CMock/vendor/c_exception/test/TestException.c": "08979f5df6d14e827a261103543f70d0ede73d801ec3b343058f812600f01d4d", - "libraries/3rdparty/CMock/vendor/c_exception/test/support/CExceptionConfig.h": "f3f9e263f9dc8779684e0171241597d583888f971b0c224e92c02665eca8bc98", - "libraries/3rdparty/CMock/vendor/unity/CMakeLists.txt": "7028a7282b2e5703e9222c7608a8d3e6ff5ee901b911614d8f993eb3006a4f54", - "libraries/3rdparty/CMock/vendor/unity/LICENSE.txt": "3ed9b51da86f52c729c96cc99fdde6444b2297c788a9cf4ad1d3649dc34c4985", - "libraries/3rdparty/CMock/vendor/unity/README.md": "0a81a08645acbaf71afff965d0c7474a6a31af9d46cc156b78f7e35687802322", - "libraries/3rdparty/CMock/vendor/unity/auto/colour_prompt.rb": "2f879fa491913d5c32312353c2df6288fbdae11d78f43264078eab4c561f6c34", - "libraries/3rdparty/CMock/vendor/unity/auto/colour_reporter.rb": "2e6fbc6a1718d1f755378a934526a5b4fe11ef045302ac1e1c251e927477d697", - "libraries/3rdparty/CMock/vendor/unity/auto/generate_config.yml": "85c5702a168e366148e8ec89df416eae888278a526c79459162c0f37641a02fe", - "libraries/3rdparty/CMock/vendor/unity/auto/generate_module.rb": "ee6d57c2470555f987fd3cdc368ac193458366653dca363f088ba1ccb43a0c87", - "libraries/3rdparty/CMock/vendor/unity/auto/generate_test_runner.rb": "11edb8f93baa042ff543cb8c1d06c7f87672cc172318c13f9c2d675dfd0bc7e6", - "libraries/3rdparty/CMock/vendor/unity/auto/parse_output.rb": "ad1910bfff4d778f1fc53c111588238ee003809eb60717fde6dce7cf854879c6", - "libraries/3rdparty/CMock/vendor/unity/auto/run_test.erb": "d281f5070bc3627e69b515be4d5be243d2d96ec84857deb84ae8c97fd6e4e6ef", - "libraries/3rdparty/CMock/vendor/unity/auto/stylize_as_junit.rb": "fd0c45171391cbd0bc63cd5d4499e89eb51d087cf9c6c5ac2d4127e3d56bd9eb", - "libraries/3rdparty/CMock/vendor/unity/auto/test_file_filter.rb": "a69a44fccafbb504635163793799aa59809035951d7f258547d64d4145131a60", - "libraries/3rdparty/CMock/vendor/unity/auto/type_sanitizer.rb": "ecc5677ac9820f343aca50893463602fca940c24daf07a4784b4e9e0801c3f4b", - "libraries/3rdparty/CMock/vendor/unity/auto/unity_test_summary.py": "e46350b7132f04a7bb339d47bcef11ae0cb9e74c2050d0d75697b33c253c2895", - "libraries/3rdparty/CMock/vendor/unity/auto/unity_test_summary.rb": "721818505aab3199a712e4d6f964c84b07720f84a8fcf504349b586f05e8cd2b", - "libraries/3rdparty/CMock/vendor/unity/auto/unity_to_junit.py": "0743f26b5ae67af204981293337f9cc9a8cb46c90aaa3f46f31fd9658ab65990", - "libraries/3rdparty/CMock/vendor/unity/docs/ThrowTheSwitchCodingStandard.md": "f0f000eb1fc32b3a6684da894ed816d09ba077ad85e65e44f1f7998da47ef178", - "libraries/3rdparty/CMock/vendor/unity/docs/UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf": "28e8687d90c111ee8c249a7748495a0bfe00a3f35231b026ac73eed01d32eb34", - "libraries/3rdparty/CMock/vendor/unity/docs/UnityAssertionsReference.md": "6024576af0c49ffdec47ae174d22314848a175052d9b7f89fc82794757eecb93", - "libraries/3rdparty/CMock/vendor/unity/docs/UnityConfigurationGuide.md": "493d4860d561e583d992367df0f0efba226961c1dba8fd2bb4d2889a7308224d", - "libraries/3rdparty/CMock/vendor/unity/docs/UnityGettingStartedGuide.md": "54193aa975c291e62682c65fe088b7f960bedf4b58e2ce63e2dc1696a8ca3f6f", - "libraries/3rdparty/CMock/vendor/unity/docs/UnityHelperScriptsGuide.md": "f8b89d36c0b901265fd3366f0a93045218c03adf501c240a5570bc68e22ceaac", - "libraries/3rdparty/CMock/vendor/unity/examples/example_1/makefile": "a6b1cba50764fa8f18ef16dd11f4f1e7cd90e614d14bfe7dc22239245751cb6a", - "libraries/3rdparty/CMock/vendor/unity/examples/example_1/readme.txt": "4d72d51f1a385cd4aeb594e4485ca2439d5b86247523cd2d2b89acc2173d8a24", - "libraries/3rdparty/CMock/vendor/unity/examples/example_1/src/ProductionCode.c": "9d6b0ae761f7dfc008d6547031ff92de63976f5621b6feef2a29614cec51b357", - "libraries/3rdparty/CMock/vendor/unity/examples/example_1/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", - "libraries/3rdparty/CMock/vendor/unity/examples/example_1/src/ProductionCode2.c": "c2cc0a76cb2ea145d3861bd9ccc467ac45ad3e8230d5075ed174ce3a5cd50a76", - "libraries/3rdparty/CMock/vendor/unity/examples/example_1/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", - "libraries/3rdparty/CMock/vendor/unity/examples/example_1/test/TestProductionCode.c": "33e4b165d437c376f2393da59be0b22a3a458ebbe94cc2b340159b71f2d8bb74", - "libraries/3rdparty/CMock/vendor/unity/examples/example_1/test/TestProductionCode2.c": "11387f2ecdc97ee3344c0df42123e73cae899702b348d5597e09e9760db267aa", - "libraries/3rdparty/CMock/vendor/unity/examples/example_1/test/test_runners/TestProductionCode2_Runner.c": "2c84d6b954a6810a7c509dc861ee0c18a562dd23a5dd7747ea524f0c1467d9a4", - "libraries/3rdparty/CMock/vendor/unity/examples/example_1/test/test_runners/TestProductionCode_Runner.c": "b6ec7bb984eddea80c178ecb30f6f772325a745ff9812a5e3f41f236c43e19e0", - "libraries/3rdparty/CMock/vendor/unity/examples/example_2/makefile": "da2bf7ebba3456dec77ef500884654fdcffeb514ecbb84dc9cf930821ec2e9ec", - "libraries/3rdparty/CMock/vendor/unity/examples/example_2/readme.txt": "a03bf4ac2d294a037189b42f7bf8fdff0bf50524857e3f8933eba76085f22f04", - "libraries/3rdparty/CMock/vendor/unity/examples/example_2/src/ProductionCode.c": "75136eec7a43d0dbe980dea19ec46f6e16c0da92093686e59f6143d8ae8b5bb7", - "libraries/3rdparty/CMock/vendor/unity/examples/example_2/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", - "libraries/3rdparty/CMock/vendor/unity/examples/example_2/src/ProductionCode2.c": "a929e7ef393ec5ccc53e3f885d663a1c8fbe5cc5f72a0fcad5c0d2f6cbc8b210", - "libraries/3rdparty/CMock/vendor/unity/examples/example_2/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", - "libraries/3rdparty/CMock/vendor/unity/examples/example_2/test/TestProductionCode.c": "7db7b7d9e7216fdc0814ff8bbecc37f40e573006207b47cfd8954469ebc9b502", - "libraries/3rdparty/CMock/vendor/unity/examples/example_2/test/TestProductionCode2.c": "332f23e940a9676504c84dc92d1a6cf72cd9204afe7f664c16b58ee7dbff312d", - "libraries/3rdparty/CMock/vendor/unity/examples/example_2/test/test_runners/TestProductionCode2_Runner.c": "14aef95de310f1e1381feaaf256ea94d0905a538311b5e3fdc944f927e75b287", - "libraries/3rdparty/CMock/vendor/unity/examples/example_2/test/test_runners/TestProductionCode_Runner.c": "a782491bcd8dd857b26a62df58e8671f1cb7641d6c0fe7f7853c079732ccd8e9", - "libraries/3rdparty/CMock/vendor/unity/examples/example_2/test/test_runners/all_tests.c": "fe5c0418201d70dc696b0db6acf60b2ea0069d74fa94fb96d7169b8752e00d17", - "libraries/3rdparty/CMock/vendor/unity/examples/example_3/helper/UnityHelper.c": "091c2466d25deffd8958332ad03d393ca1ec1b1f6150c16626d57d5901eb1b21", - "libraries/3rdparty/CMock/vendor/unity/examples/example_3/helper/UnityHelper.h": "a95bb6d3704c51637bb0855787236b41229e3836601ba97e88768f95779f3d4d", - "libraries/3rdparty/CMock/vendor/unity/examples/example_3/rakefile.rb": "7b3b7d271caeb7af887b08986c9922ec331c8515d654ffb3e200833aa9be809f", - "libraries/3rdparty/CMock/vendor/unity/examples/example_3/rakefile_helper.rb": "bfc4aca33ed7bf68ffebf686790ec0c9e7a7bd23527147e81c10f4fd2dc38be0", - "libraries/3rdparty/CMock/vendor/unity/examples/example_3/readme.txt": "2af5e731fb1db0ddf5c739f0b08fb2724e4acc7efb7ee0a02fe474a3e69d284a", - "libraries/3rdparty/CMock/vendor/unity/examples/example_3/src/ProductionCode.c": "75136eec7a43d0dbe980dea19ec46f6e16c0da92093686e59f6143d8ae8b5bb7", - "libraries/3rdparty/CMock/vendor/unity/examples/example_3/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", - "libraries/3rdparty/CMock/vendor/unity/examples/example_3/src/ProductionCode2.c": "a929e7ef393ec5ccc53e3f885d663a1c8fbe5cc5f72a0fcad5c0d2f6cbc8b210", - "libraries/3rdparty/CMock/vendor/unity/examples/example_3/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", - "libraries/3rdparty/CMock/vendor/unity/examples/example_3/target_gcc_32.yml": "2e61fc6bc7930929985f1ea1ec5d0019fe1d133c01555c86b01b20145fb6aaa4", - "libraries/3rdparty/CMock/vendor/unity/examples/example_3/test/TestProductionCode.c": "b0e815e2285b1730d7dcd24b400d15b4efccfe5e4776d96248a2165c2f0caec6", - "libraries/3rdparty/CMock/vendor/unity/examples/example_3/test/TestProductionCode2.c": "895f437abd40bd461fd86a3b8ed6bc02c5c283fc3926aafe53b473e477fa0a5a", - "libraries/3rdparty/CMock/vendor/unity/examples/example_4/meson.build": "673e6c3c44d3e9933df54d13f27d1b90526ec2c990709aabc0e62a40fb20bf86", - "libraries/3rdparty/CMock/vendor/unity/examples/example_4/readme.txt": "d16faba668694cacde12746c58ec512de301218543217a9644e4e269bee8ab0c", - "libraries/3rdparty/CMock/vendor/unity/examples/example_4/src/ProductionCode.c": "9d6b0ae761f7dfc008d6547031ff92de63976f5621b6feef2a29614cec51b357", - "libraries/3rdparty/CMock/vendor/unity/examples/example_4/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", - "libraries/3rdparty/CMock/vendor/unity/examples/example_4/src/ProductionCode2.c": "c2cc0a76cb2ea145d3861bd9ccc467ac45ad3e8230d5075ed174ce3a5cd50a76", - "libraries/3rdparty/CMock/vendor/unity/examples/example_4/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", - "libraries/3rdparty/CMock/vendor/unity/examples/example_4/src/meson.build": "61880caad3c43396a16c5b6bd5a856480c55c129bf1fc282b874a99c87ab6af0", - "libraries/3rdparty/CMock/vendor/unity/examples/example_4/subprojects/unity.wrap": "59d1f20c0ada120ee62ef1baf30be51ebaaf40d30b16e4da014f9d58023b7a8a", - "libraries/3rdparty/CMock/vendor/unity/examples/example_4/test/TestProductionCode.c": "f3a8fa16e599d6aa7a0c9cf604ea1d42ff5466244372e00543fc3b2e116f0d41", - "libraries/3rdparty/CMock/vendor/unity/examples/example_4/test/TestProductionCode2.c": "26c0ee5fabc061cfd32ae891ab16f4b985f306dfea1a939d00e89a3c1ae6f25e", - "libraries/3rdparty/CMock/vendor/unity/examples/example_4/test/meson.build": "0e5be2e9c4406bf144f41b04c56ab62872b5e1c60c47c1ec81679b3b65a6236a", - "libraries/3rdparty/CMock/vendor/unity/examples/example_4/test/test_runners/TestProductionCode2_Runner.c": "2c84d6b954a6810a7c509dc861ee0c18a562dd23a5dd7747ea524f0c1467d9a4", - "libraries/3rdparty/CMock/vendor/unity/examples/example_4/test/test_runners/TestProductionCode_Runner.c": "b6ec7bb984eddea80c178ecb30f6f772325a745ff9812a5e3f41f236c43e19e0", - "libraries/3rdparty/CMock/vendor/unity/examples/example_4/test/test_runners/meson.build": "a3552bd0a1d0ddd01dc5a70effa8582b1f1bf07b706cea47da4b512b040b06e2", - "libraries/3rdparty/CMock/vendor/unity/examples/unity_config.h": "a7038b3cd217dc3d9534ce8d4d58c842912ee63ac35718d4917a605635eb941b", - "libraries/3rdparty/CMock/vendor/unity/extras/eclipse/error_parsers.txt": "67e309b5e803a22ba22c347aa5123cbbe73edcbfe9950aa0fd74576a4add1a12", - "libraries/3rdparty/CMock/vendor/unity/extras/fixture/rakefile.rb": "7392cb66dfa0de3c644934adf64f4e03ff0a2a2128fd10f9df5600e9a991d764", - "libraries/3rdparty/CMock/vendor/unity/extras/fixture/rakefile_helper.rb": "8ff10722c9808c465e02b83f062d24ad47371cb09be32965d2ec455742b5e3f7", - "libraries/3rdparty/CMock/vendor/unity/extras/fixture/readme.md": "6a2e59367724a64ae4fcda3de28158006c72a0d4b30b9abeac15ba415fe9f145", - "libraries/3rdparty/CMock/vendor/unity/extras/fixture/src/unity_fixture.c": "c0ccd5532ff2f73c15eef21533d6bf292b2b6173bb6133e2308ab24c222ea8dc", - "libraries/3rdparty/CMock/vendor/unity/extras/fixture/src/unity_fixture.h": "73854da3d615a041ab114be64bb98debfa8b186ac9741682f3de4cabc153100b", - "libraries/3rdparty/CMock/vendor/unity/extras/fixture/src/unity_fixture_internals.h": "adf665b853438b5e35ffc72e6d0f1bd404a09188fbd4fc7c64c2eb30b25781ea", - "libraries/3rdparty/CMock/vendor/unity/extras/fixture/test/Makefile": "f61e0e71da2aa1e38d4ba244178ef7ddd976447bc57332e17ac62319e1765ee3", - "libraries/3rdparty/CMock/vendor/unity/extras/fixture/test/main/AllTests.c": "b90030dde0bdea78a78df99e177bba1aa6a162a21527027920e01abbe991e8f5", - "libraries/3rdparty/CMock/vendor/unity/extras/fixture/test/template_fixture_tests.c": "3ca4c500397fc3dd7370b419e7d4f7abb3a8b05deacaf72a4e2ccb396669003a", - "libraries/3rdparty/CMock/vendor/unity/extras/fixture/test/unity_fixture_Test.c": "6edfe13bd81264856f4bbe3d421ab40f1f47529e0a57f7b95b1b13155d51db24", - "libraries/3rdparty/CMock/vendor/unity/extras/fixture/test/unity_fixture_TestRunner.c": "cabed04e1b026bd8ae2b47f54e8777899c3564cae952e62fc59965d2117a3215", - "libraries/3rdparty/CMock/vendor/unity/extras/memory/rakefile.rb": "9f53e177b9066458d30e94c31e8ef8bb6f66b2eba7c86137d20ebbdab8e42787", - "libraries/3rdparty/CMock/vendor/unity/extras/memory/rakefile_helper.rb": "bf752945bdbc26c9d9bb4acfbe3bd4210c6d1e7b811af755024b9000f0edf035", - "libraries/3rdparty/CMock/vendor/unity/extras/memory/readme.md": "5cc935c39537f3a403a80b82c1ba24d6ba895275927a6b5db8362e233438a97a", - "libraries/3rdparty/CMock/vendor/unity/extras/memory/src/unity_memory.c": "7bc202de8e950466f713b2c3918beb824a10d33cd7df43058dd4676573fc2645", - "libraries/3rdparty/CMock/vendor/unity/extras/memory/src/unity_memory.h": "85ea1b5fa55bd59f03901fad4272a938a33696d9f0821d085ba6fc5463fb391b", - "libraries/3rdparty/CMock/vendor/unity/extras/memory/test/Makefile": "4530559b0cf8de81a35d3e5901aa3b5bdfb523cba3458bac37e1beebedde0e63", - "libraries/3rdparty/CMock/vendor/unity/extras/memory/test/unity_memory_Test.c": "64e492cafc7da28265299706ee3c663db66edf3c5556cb27f06039d1876f63d8", - "libraries/3rdparty/CMock/vendor/unity/extras/memory/test/unity_memory_TestRunner.c": "8265bf36612d73d5286303a4259b444e7e86ed011551c3be9f43be6a1804a781", - "libraries/3rdparty/CMock/vendor/unity/extras/memory/test/unity_output_Spy.c": "c18d6d3034a751915b3deb137b098eee14498a06b4f7bf8a8a59ffe4d260d4a7", - "libraries/3rdparty/CMock/vendor/unity/extras/memory/test/unity_output_Spy.h": "20f9beac9acaf917cbf2011fbae1e5b919c6876646ca48e02379b72a12f7f971", - "libraries/3rdparty/CMock/vendor/unity/meson.build": "96c3a2e5f3817783e7ed0a6fead1bdbd6e486d89da020a9071a4fd57efd809f3", - "libraries/3rdparty/CMock/vendor/unity/src/CMakeLists.txt": "d142a855d72394a3b5bbac8ec8162d64fa4705bd546ec2c95f82d19de862d8ec", - "libraries/3rdparty/CMock/vendor/unity/src/meson.build": "8323ce6255874c200d74a2dc6057c099b056084a59f679733ecdbec89d465ac7", - "libraries/3rdparty/CMock/vendor/unity/src/unity.c": "0fe7ab63c9ccde2a797a84d2f458a9981583e9c5ae702a3b4a1d521e97eee210", - "libraries/3rdparty/CMock/vendor/unity/src/unity.h": "cc15d99a35b6488fd3434bd60db51b99cc22fd98975991d3ec247eb31ff98cb5", - "libraries/3rdparty/CMock/vendor/unity/src/unity_internals.h": "90657c9162b5e5f8381806639a0071958bb9b3d42622ebef1a0857c9caf0ca9a", - "libraries/3rdparty/CMock/vendor/unity/test/Makefile": "7c04243c305b1edf102bde8b209a192d93ee7e4442b9a46c232e8ff20c5c522e", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_cmd.c": "832ec9c8c30fd374adea6620dd38c19c689047bdad0513984066e525eefc0723", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_def.c": "246d3d9bc73ccef28f7a70b8748d95cd31eb85b9874e6972d30be1f74000fb8c", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_head1.c": "ed31f2c63e4bb7ba015a5388429b34287ecefa098551e55ae5864b883c3cdad4", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_head1.h": "fc279a298e45f70a559d05132ae888973c8f5aad913c0b2d6d8425ccbde5c998", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_cmd.c": "b826f44458088555058b6c3b9c7ef15c2a5528c8efe01034d0f1debee06a739e", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_def.c": "1016f1162a3ea3be49dffd824e529493d2845860d1139cb44cc32f0fe0a0701f", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_head1.c": "cb7b253cefa315d7b4edaa386bffb63a728f3b33c869bf55ecfcd53d1e47eaaf", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_head1.h": "9cb779d98b40e5dfcf70db57f7d3deae6310cac80547140c972ecde585f56c18", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_new1.c": "4e5d73972dce4276dc688016eeb310e93ef96ea7beee0e6839092f0459798856", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_new2.c": "74418cfefe544ac366a043972648c31742b2a4652155507c93a1a2a38471a5eb", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_param.c": "6a8edda1c9b5a56d38e705d2d0341232ca9a55f1fb7383171475cb972c9b6c18", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_run1.c": "4e5d73972dce4276dc688016eeb310e93ef96ea7beee0e6839092f0459798856", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_run2.c": "74418cfefe544ac366a043972648c31742b2a4652155507c93a1a2a38471a5eb", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_yaml.c": "763d37bc5a5edc7566bf6625dd38878aed8cc94a5cec8f6e23aee16e30bdaad6", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_new1.c": "983abee21894ba9fb5d667a69b046558867f9f16eaf546d259671f54dd4be626", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_new2.c": "9726bdaec7a5c8e99b4e6bbfc41b91c8687665bbafdb617be4514eadc30b023c", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_param.c": "7ab6834f8376908625b9999a4c5dad32ad65c8f3fd852e78b6d9c3bc871fc639", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_run1.c": "983abee21894ba9fb5d667a69b046558867f9f16eaf546d259671f54dd4be626", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_run2.c": "9726bdaec7a5c8e99b4e6bbfc41b91c8687665bbafdb617be4514eadc30b023c", - "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_yaml.c": "17714f87e28c7723608fdc832189965482404e3540e3f3ec55afa7f07054e0a7", - "libraries/3rdparty/CMock/vendor/unity/test/rakefile": "5dc9eb1c3ba23e040a3b413d613f252ab2b475ed741fa3690ecbce765e339156", - "libraries/3rdparty/CMock/vendor/unity/test/rakefile_helper.rb": "b3cfef74c49503599d02c4ca75a7fe72622b97c2ac217ebc853a9d545b419405", - "libraries/3rdparty/CMock/vendor/unity/test/spec/generate_module_existing_file_spec.rb": "41d0b6bf8255f97e4fbf6c4f5fb2dcc61d846d2ddaf2cad763c1f500b8a68727", - "libraries/3rdparty/CMock/vendor/unity/test/targets/ansi.yml": "371ad9aaf2dc447000f8d575b3c6372444cc318e890bb968e331a9d990d8aebe", - "libraries/3rdparty/CMock/vendor/unity/test/targets/clang_file.yml": "afbb70db8cc433aca8e6ea3d04d2f5142cc8bd1a8f6e421006038c9601222d32", - "libraries/3rdparty/CMock/vendor/unity/test/targets/clang_strict.yml": "336cc5344beccd0c3a6c83227b764c8945193b464600ba56ade14c3c44c98b27", - "libraries/3rdparty/CMock/vendor/unity/test/targets/gcc_32.yml": "734debdb4392b83942cdccfb31ca724a43b923617a8b45d86bf6a1fefa86a7e6", - "libraries/3rdparty/CMock/vendor/unity/test/targets/gcc_64.yml": "530851623a24956399add9f0c0fe18719eb6dc428c1bec03ae6b255a9d0ae972", - "libraries/3rdparty/CMock/vendor/unity/test/targets/gcc_auto_limits.yml": "fbd96dc8a94c4de70dae87ff378312b3ee07cb8219d6290af17d36e3b34d0f6e", - "libraries/3rdparty/CMock/vendor/unity/test/targets/gcc_auto_stdint.yml": "c9ec9f61987603d059d4509f4befe0744f5fa99a137d95be359ddd2c71443281", - "libraries/3rdparty/CMock/vendor/unity/test/targets/gcc_manual_math.yml": "3bd8b0d4eb9fa693f4cf74fdaf61e31183b85351c4e957577bc8497cdc8f15a0", - "libraries/3rdparty/CMock/vendor/unity/test/targets/hitech_picc18.yml": "7b2a4ea56f3125fd75bb7d8e9baf1f26706b206f98c6f88e4d4b4091361fc546", - "libraries/3rdparty/CMock/vendor/unity/test/targets/iar_arm_v4.yml": "3df93ad02fd4e1cc17d28a63f824881eee4f73e1db54e43ff36909dd2f5eabaf", - "libraries/3rdparty/CMock/vendor/unity/test/targets/iar_arm_v5.yml": "bb6f961bbf3cf2c4651a33bf415818726b4d609c05cb9fdeabe6dc7a94d47e6b", - "libraries/3rdparty/CMock/vendor/unity/test/targets/iar_arm_v5_3.yml": "bb6f961bbf3cf2c4651a33bf415818726b4d609c05cb9fdeabe6dc7a94d47e6b", - "libraries/3rdparty/CMock/vendor/unity/test/targets/iar_armcortex_LM3S9B92_v5_4.yml": "8835f98e84e75b920fb9e27c0ebcc9c11f14bff768b382441099a01cbf7a129d", - "libraries/3rdparty/CMock/vendor/unity/test/targets/iar_cortexm3_v5.yml": "70ba518b050162526cf5cfd3cdc90a00a6aad0d0ef65558612d384c855513d52", - "libraries/3rdparty/CMock/vendor/unity/test/targets/iar_msp430.yml": "527ef25ba8d5056a8b44fce38302895a1a8ed342331edeed69db067b831c8e7b", - "libraries/3rdparty/CMock/vendor/unity/test/targets/iar_sh2a_v6.yml": "b99162afd271d76014220cabda53ff3951aae6595b198520eba36ef095e57746", - "libraries/3rdparty/CMock/vendor/unity/test/testdata/CException.h": "1d815018f2b5c5973982e9e13c9534bb5cd96e6deea5b1f29b531233f476e843", - "libraries/3rdparty/CMock/vendor/unity/test/testdata/Defs.h": "9c7988c8f87c13251880be27117c9cd5d7078990bef9d34200a342cf26911bd7", - "libraries/3rdparty/CMock/vendor/unity/test/testdata/cmock.h": "ae873ab649d7ea46f2e23ee13cbac383c527d5935bc40b31dced6969fb4d235d", - "libraries/3rdparty/CMock/vendor/unity/test/testdata/mockMock.h": "bbf1b3aaddf02a21cdb52b7b58d2f74927d586d013ca923e25eb93b121bdcf47", - "libraries/3rdparty/CMock/vendor/unity/test/testdata/testRunnerGenerator.c": "721d2a8bef4daf1d4a61e30f8bf8bf1d263377c9f763f9129218d638ddac65d8", - "libraries/3rdparty/CMock/vendor/unity/test/testdata/testRunnerGeneratorSmall.c": "f32a9a46a78102474346c7516bdb0401fabef9ee8616d033237a4bc658e3357a", - "libraries/3rdparty/CMock/vendor/unity/test/testdata/testRunnerGeneratorWithMocks.c": "ea6887c98c35906e04e492cc06618294fef70f0bbbc9ca0cf1dd2ac3c14fe72d", - "libraries/3rdparty/CMock/vendor/unity/test/tests/test_generate_test_runner.rb": "841d599bc5addfc2f89c425031428c67ea7d32d09eee0fb9ce86bac6b12f8bf6", - "libraries/3rdparty/CMock/vendor/unity/test/tests/testparameterized.c": "76ea3bd9cd68cb88a0a3a5098b37f4669e382065f9f372ca9510c525609176a7", - "libraries/3rdparty/CMock/vendor/unity/test/tests/testunity.c": "26709a643b37d7a93310ceace6589cbdc3506638e83e411a77bcdbbb3dce3316", - "libraries/3rdparty/http_parser/AUTHORS": "d1a15fcf0453796ee31e900dd5edff35ae86fb6ae4375c2afda8bde0f6fd2f03", - "libraries/3rdparty/http_parser/LICENSE-MIT": "79e6ba8b687cb54786207342b9b6fcee0ac10218453ed9009b84d949b2233cc0", - "libraries/3rdparty/http_parser/Makefile": "b8290bcb23cbf9d139863d3f11be53597f49cc88bc9ee0deb07d50f3955d2af5", - "libraries/3rdparty/http_parser/README.md": "ced31a1d4f05a548195205f35330c1915953b5f9c91d9b78eb27432ba6906a83", - "libraries/3rdparty/http_parser/bench.c": "e64bfe50494d661794e515aad502f0154e888fbf6458fb8a18252ad0b5667c84", - "libraries/3rdparty/http_parser/contrib/parsertrace.c": "e3d5f53fa3f6b26bf1cefc359eeadec35beaf61c6db863d2338cbac278d3a5ee", - "libraries/3rdparty/http_parser/contrib/url_parser.c": "ecc24f95707866de11b4b6588cbd0bb0728b1def6e95387cedbef98a73a0acf2", - "libraries/3rdparty/http_parser/http_parser.c": "66acdda5c3704b85073fb49566dcca4ce6aa6054636fed2ea4246554d8851bc6", - "libraries/3rdparty/http_parser/http_parser.gyp": "ca7cc55cc2a81c5a5b3795171e3a953e5c7b10ec2923ec1560e60f914ca18ece", - "libraries/3rdparty/http_parser/http_parser.h": "2dfe487f6ee48b3e5e0a88efc775c092840eee94fdc107bceeaaad84fadff418", - "libraries/3rdparty/http_parser/test.c": "7da1cc958549fb257a2685661bf2d14468350104127a205b85a198d3d6488f1f", - "libraries/3rdparty/jsmn/jsmn.c": "f91533b8c65ffe13d3389f18e6f74a09aec61c23bc44318f40135bc004b075fa", - "libraries/3rdparty/jsmn/jsmn.h": "f24904f8e9df0be61cd26430851f026ebbf7d85a4c856ef2c975e85f1cb304b7", - "libraries/3rdparty/lwip/BUILDING": "0a1c749c1f6f5f0ec6ad414cb7e591269519ae43246877fe509f1a5829e36e35", - "libraries/3rdparty/lwip/CHANGELOG": "20b9468a181659c87502589c5af5d47799f981971485d17d51fc0137d09c4c9f", - "libraries/3rdparty/lwip/CMakeLists.txt": "af867862797d65753179f66d3e8ee9cc3aa0cb75d29569cdc907614761ce89b6", - "libraries/3rdparty/lwip/COPYING": "8fb15ebdb19eb669e1d37fcd8e57a44c477fcc0e93a9ab0d181760965f94d5ed", - "libraries/3rdparty/lwip/FEATURES": "39a76615b5fc94b8fcc9236969f17b5b0589de89cf16dab88d0352e2a03fe196", - "libraries/3rdparty/lwip/FILES": "8cab124b0bfd686958adeb1e36e7f485b2c0411b75fecb28590cfd8c98bf00c6", - "libraries/3rdparty/lwip/README": "4df2502ceaad651baeab18f8a0a42600abf6958a42eb2a9bb9a8a00c6bf7a9cd", - "libraries/3rdparty/lwip/UPGRADING": "26796743baf56c6076c44a09785927bb123af20a5e86343f1dd4c1dfd083be0e", - "libraries/3rdparty/lwip/contrib/Coverity/coverity.c": "3eb4a92d33ab70f452c03348ce3b633fe218fe805886faccdcd95797eef5232e", - "libraries/3rdparty/lwip/contrib/Filelists.cmake": "590fc51ddb0af575d8c022ee8188df8e8651944f88bbd424c94f2ab11c508c8a", - "libraries/3rdparty/lwip/contrib/Filelists.mk": "ea49ada77ac4343f92ff36c199427cd40d1f5a04f84f19ff1b50d0cec65f096a", - "libraries/3rdparty/lwip/contrib/addons/ipv6_static_routing/README": "975561ddbdb26be17bbdc2d12fb6caffd82c215985f2a09463c366bf155321be", - "libraries/3rdparty/lwip/contrib/addons/ipv6_static_routing/ip6_route_table.c": "afa0fb5045d1b6fec69e158b6d5a04853061be9cd141e42e86e491bcb4762872", - "libraries/3rdparty/lwip/contrib/addons/ipv6_static_routing/ip6_route_table.h": "902a7b7cdbf0d232b8df1456fb4809cbeb36db0263c52ddbe3758a9682faa667", - "libraries/3rdparty/lwip/contrib/addons/netconn/external_resolve/dnssd.c": "94e43cfeea372e722b89f6856bbed669482141e27b654a1ae07e8017b426ff90", - "libraries/3rdparty/lwip/contrib/addons/netconn/external_resolve/dnssd.h": "c083f26803984773cbcf71ca83c2a6ab55abced7160ab7a29c4541c2c965e9d7", - "libraries/3rdparty/lwip/contrib/addons/tcp_isn/tcp_isn.c": "1cad9712add2b8b460f5d8da6fa811b86fdd3a565ccad0c589e8b7a50c5261c1", - "libraries/3rdparty/lwip/contrib/addons/tcp_isn/tcp_isn.h": "5593cb63e92665c4fc5380d84525990db565112d85f5c5b0118a1c09f678d5b9", - "libraries/3rdparty/lwip/contrib/addons/tcp_md5/README": "151eaff01b88ed8664e270dacdde434881e8c8040ea37b7f091340084a955a0d", - "libraries/3rdparty/lwip/contrib/addons/tcp_md5/tcp_md5.c": "f9e0f2d1e421eb97c869821cfb698d6728a318dda51433291e7efcfe9419e818", - "libraries/3rdparty/lwip/contrib/addons/tcp_md5/tcp_md5.h": "33a7897465b0a58309742912a55cb983d624cfe4824389072dbfdd6ad674867c", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/CCodeGeneration.csproj": "08be7ff6c6932c2a9cfe6e97557d4ef843dcaa9ca10facde33b1cea1e3a9ea9b", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/CFile.cs": "71f885b98cd0ba2ca6632ceb547d85b4a29763dcfd67771395722a6e665f91ed", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/CGenerator.cs": "f5b6aaea1ed850d8aac63b3617fad4fd6114638ea86e54da306d7d36b6bd8dce", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/Code.cs": "bb4c67f7b00d77ecf82e63989ded1f89df66ef351866a4de5ef3bdd05651bed2", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/CodeContainerBase.cs": "ee8281ce892530b2597441004f99409f1602a7ddd711d6d23582ac47b3f5500b", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/CodeElement.cs": "7c813f6a24fdc8cace9d659028c7580965a5731dc5248f5ad94308d0994916a2", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/Comment.cs": "c0d3e30a6e66a522f03e5c5eafaf7767104fa11b11b1db636c20ae207e80ab69", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/EmptyLine.cs": "ce23bfc251324526950e1b499cb7e1ba0e51bdcc43da9c311c6da9bc39a3e5ab", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/Function.cs": "2a86f450b1a3e7c228892508466d19fba7815fb7a4fbff9164f0899bb0f43c7d", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/FunctionDeclaration.cs": "81af456dd2a181184a5f4765087a69231cb1c41c968e560544bf6a3a072e126a", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/IfThenElse.cs": "33a6b618fd5adf44c4603493d479ef5bb0c0fc4528ce9788ade96eade936050e", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_If.cs": "a93397190469c79e4a1ab6f7ca86be5fa34a63bf622545211d6d2670c329f17d", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_Ifdef.cs": "dcc2ec42684fdf33941c422580ba4fb672eaf72af4ee22768720ba939b23c586", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_Include.cs": "4e6f18a41be22b75ebe01ce73c61fc00148fe9af1d23bd024ae9e7cf70a93e68", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_Macro.cs": "b10ee1a33ab13c70f22474718512ed554482f2e87617d6fe5ab99eaf8691b9d1", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/PlainText.cs": "9f6230df9d06345f6c76c2d2aeb7631ad91085f5fec03721d2c0724709bc026e", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/Properties/AssemblyInfo.cs": "37599227bf85cd5fbf21d695c5d5b4156c08e968310270bdb69ccadeeb890c27", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/Switch.cs": "89a17fcd8638ba1939e90d654ebea0fb289116f32cdf85e7b6c1bf96ca4b984e", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/VariableDeclaration.cs": "0908049f20bace0fedf39854620aff86d39039c8c7f2da2859ae00f755496699", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/VariablePrototype.cs": "362858ef52f27562968f2d07cb7f6ca7c1a5e04eb2a96eae866fc192ea168fd9", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/VariableType.cs": "4155b469af638550ff8226eaa71b9d43160c2be9515e227e2954ff73a2235a5d", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipMibCompiler.sln": "0fb1b4c5838afaf26e2084aa358551c07aa60eee8293beeb5c5777be7db074dc", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipMibCompiler/LwipMibCompiler.csproj": "3e1ccbbc10ba31bf28e61e9f08916457cf249a6f55084d8a965d3a2b0b9b72f1", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipMibCompiler/Program.cs": "510a7695e81c42d2d38c25a6ce0519b450b1806d864ae47095d5c9b8fe6efbef", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipMibCompiler/Properties/AssemblyInfo.cs": "1b81fead7f0f8ce1324c33244a2b4881de5e868fa7c44680f4bdd416aefe1eb2", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipMibCompiler/app.config": "49f0226c179b7f7a5d1f4b7a2d01bcc6752e80944fd96927b60d773bd77075dd", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/IRestriction.cs": "4ce9b1841c83203f4f32135c8731879ddf51f26253a62282b7ceb2bfa1d08e46", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmp.cs": "fe3911d9575cea5567a1d2f8c00c304e87988a2e389bf3da2c568d3ace89ebae", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmpCodeGeneration.csproj": "bb073c52d2b1b424b17632fe5e0d94716f971361dcecf6deeb12af777880703b", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/MibCFile.cs": "b7a8974e02597d285fc730f944cfb4583f6c48b5d8f36e70fb06abdf799063c8", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/MibHeaderFile.cs": "3b13376b6ac40784485d23b1ef3bdda5f9143210a69ea100079a385efcc8d7ab", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/Properties/AssemblyInfo.cs": "154b6c0382a258ab328b6799a8bc55acef5defc114e0651e39e0926c544fda78", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpMib.cs": "be5945d415c3f484ba3679f73446c5e0a1949ee156d095e5c543ed1b6842273c", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpNode.cs": "817531e1d8cc234d96bdd7a3598fb8d1840ab2ba75b61c96cd13c9757fb00819", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarAggregationNode.cs": "ea220467112678069cad418a7c7d984d2da9cfc4bf0dd8b6e00cfd3aa3083e2b", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarArrayNode.cs": "a81138b14b2a06425e000d2a4b2e83c183d2c1b39530fa415ac8172279218c3b", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNode.cs": "e5564a84d5cb1fa1eacc5551141b76ac737b82a1cae9ba79e40bf359c443fb46", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeBits.cs": "a273a64f770443e0b26d53aed1a380f831bf3e1938396b570d691908338dfa2f", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeCounter64.cs": "6b061892e424c4e8237adae632676993faa567d3bdb3b59f0d43024d75c4934e", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeInt.cs": "e2c9c697e09e1b85dd6b4e21af10588c72cfceb495656f5089c3002dd279e5c0", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeObjectIdentifier.cs": "adcca7908d7ee6374f08ab6106abf52c1d55810f7266fe7d12eece011e46e76e", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeOctetString.cs": "5a3879a0d44aba0e26400d53fee40ac0fd42a51a0f32440e248a220a09b511a9", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeTruthValue.cs": "d092cae1b5eeb4c662868c178e1491adb832932b0cdcb627d6fa21cb56679c96", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeUint.cs": "716fcc054c0048615e0a9cbde400106c87e0f55dcda3f9f0f62f727f3c5bcdef", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTableNode.cs": "aae98581aa5205e4742febb20536670ac45537eda5e48c553d879f074508417f", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTreeNode.cs": "c2892b28d3c9fab25bab2d713c7fbb3b9c716d94561cbf84cd979f98fadbc798", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/FormMain.Designer.cs": "900f7135ced78b538ac59b43ce85f0fef6dbab6144d1c98b9e05ea5e64cb4de3", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/FormMain.cs": "60ae71b9f5ca42038a790f33eb0c31616a32f24148d86a653fea286d958b2b51", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/FormMain.resx": "b8ae1de569c06e8da5f0c1cbec88a9232382ba51b8558563353e4d648dd990b2", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/MibViewer.csproj": "2c2755db20fbe372e0b8a58dbc24039a8b0de9b03b4a3f7ba9800bd104acc405", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/Program.cs": "582d27447362b96d1bac405154d4a137a1eb729234e4c55ab0920823135fc97a", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/Properties/AssemblyInfo.cs": "dd2295c56779339b5a04082f5f5acfb428e67a4cc30a48fb0ab5596c2e3adc63", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/Properties/Resources.Designer.cs": "10f36528404675f98ca302c8d2f47d4cd914e3cbb1287bdd9c670ca930deed5b", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/Properties/Resources.resx": "4e124f5a7694ffe813c60601b1b73c53e47536b1f1c0e798d4d55bfc2ca3774f", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/Properties/Settings.Designer.cs": "f18a13fee4b93e15bdcc288ca2b102ad916618abbf6c0b8ef22d8078138cd913", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/Properties/Settings.settings": "baba99193fc1787141063b135424b476ff4151beb833883fcb594631f17c0147", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/app.config": "49f0226c179b7f7a5d1f4b7a2d01bcc6752e80944fd96927b60d773bd77075dd", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA-ADDRESS-FAMILY-NUMBERS-MIB": "74aecf2da295c9929c1c20935d48dab929c4c48b4ec70dd84ea054207b001045", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA-CHARSET-MIB": "171318805f951e9468683bea1fe7bea37491488a917030a51dffc5eba02b7908", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-ITU-ALARM-TC-MIB": "2171d34e8d8e742424f0c6adbc60b163b1dae5928a8d9e9eb8ea504995d694e9", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-LANGUAGE-MIB": "d0ae6af35e45722a22c7069523ff589eff0f050b539dcf47b855c3cfc9b1dc13", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-MALLOC-MIB": "5ce4b4857e936ca970478b2ef5ff2354ea1bd1baab511983fb3666cd9ae03133", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-MAU-MIB": "e28c569d8fe395a5cb3177a5df2adfeb8c57e84c4a9462e7dddd4e42902132e7", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-PRINTER-MIB": "954427ef5c22b525cec3ff2550b994afecdd84769b4f232871af0ff38effa559", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-RTPROTO-MIB": "c1906c8a2a42b3f2cb6eab0dbb14608c59661bd02998dcc0a28fe4ac0797868e", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA/IANATn3270eTC-MIB": "007a32634e83244600ff3a9cf5d891732126550f06257f5d2fec700cdcd4589c", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA/IANAifType-MIB": "511af70e38b199868babf6a1dbb64347daa3a76801a10227098775525179b7a1", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IF-MIB": "6377ddb359e4e16cecdc2a8fa95b7f32dc571f8670b22e2f8aaa243b5637d5c6", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/INET-ADDRESS-MIB": "db97536a82d2dc39daae4879a54095d5caa30761698f29231576046f8a51239d", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IP-MIB": "14ac0dbb9254e4b8007f6f8d50b3f9faba0e20857cf5ab6c68ec71c804f76dd8", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/RFC-1212": "86b7136171cd3efd16909125a99a4892fd7d859d671391588b8e30fc0b942cd1", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/RFC-1215": "c96ea7bc5b2b05c361f69ce4dd637a7d8d5b97d60b4b7694539998a1a1c2ef57", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/RFC1065-SMI": "8094e15c0e24740830291d0203fbbb62b9c7fc47c3efed6a0cc10030609f11bc", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/RFC1155-SMI": "4e4c178793aa234504fde442ad527bc66ffface448b35f12e062e73c47d0f3a4", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/RFC1158-MIB": "5b437e2b5ad18d3db7c336446cd5c1fb1906ce21ff8967150e99c28e33fdde3d", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/RFC1213-MIB": "e9fef1a36e6c4200853a3e908bb0c991b2f8c5302dceff2b069a6597ce9215bc", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-CONF": "b96bd8fceb39587f126eb30248eaf4b9769a5e35714f1ee21ecc478d80272dda", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-MIB": "7fb972a35dae3e6bbcb9228b707a8eee3582719c8d11c4fcbd4c621fbc63e40c", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-SMI": "bdf7c016a12095cc429d8ef631178b940e2d27dd762ecc8ab601db74bfbe927e", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-TC": "0fbdb5e54efa9b5f5ee5ef19fd2106a2217927f00477d53d6ba9df16a632bd05", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-TM": "d2d09410594400a287eea430466962d83d656cf609e5d31392ad898a44435c7f", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/TCP-MIB": "e26faa91ce7d356cb6d83aa5a9daa47ed38e8ed94ef7208bf8b3cc6fca016554", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/UDP-MIB": "c8de41eba6600414b492e0a513b99c37da4b0e20469fe35d5e8425e5bce0a47e", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/DisplayHint.cs": "b3f24f6953819d1db3db200899770988434b02e372d2d2a563edfbc3dad19978", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/AgentCapabilities.cs": "1eab4cc1c092d0339a6872ac3454fd1d8e0dcc1c5782f7b91c64262a6f12afc2", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/EntityBase.cs": "321a1ec630fb65757109fee736396b9245a80a7f5dd151fa0328dbdba6332854", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/IEntity.cs": "7232dbdc007bb45a8f8dea614ddff1c1e8494ef746bdd52b07ab64bba71e9fac", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleCompliance.cs": "628c0b0d90b1328bac86823b95ce078510409f2286d513ae6cded76d5d5d71a0", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleIdentity.cs": "5d7342d3905740369d09d0d18a9ed9fa06dd59014bcf08dce25ccfce7ffcaea4", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationGroup.cs": "39ffcd81f7ba9802fdb05a486b2396683fe60e3227b9e5e2e8066f4513ed122e", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationType.cs": "6ef1826c956e893376038a8a743b7e78c75a06e9d069e7e4255db53c768862e3", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectGroup.cs": "6574a6e4056f9fbed518f584a0d0f9ecb2631eed9224ba52e40bcab318e0bfdc", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectIdentity.cs": "904638f353d6488e2a1fbddb5a6c3bd76a874f17108efb212c0832e46af1a5a7", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectType.cs": "c3b54e130db6ea88d1c304fae1bb9cd79b30746ec5904775673c878cb18ffd14", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/OidValueAssignment.cs": "7ce81e1289eef3ec2d4fbaa2cf84fc5d1d55355e31fc4cda4924598c55c55470", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Exports.cs": "5ed3a5d9fabe8cde938ecf6c9ad77a26136e239eef3e6fede4043e9633ba3fbd", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IDeclaration.cs": "06c6f371bb6ec960f4d48ba24d75f65e827c705ff34779a42bae288b59e88e8a", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IElement.cs": "f106b41766d2bbd43213758c9ad45515dd55261e398773635a2d5f0a12eb9659", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ITypeReferrer.cs": "64f67129913339054225d6423596537033890a9b6b7ef8e547770a6007c1540a", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Imports.cs": "f125d095d6f80c60b9d329e22241b133bdfaf67a9abb50dfa47d2f0d99527007", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ImportsFrom.cs": "9d509b7cd576c3e0a9c7215d6f254bfe77af6e1aa5077985fecfd1c84fc8cd19", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/TrapType.cs": "61db3f0a2c75f61bf8e7bc05f1b4c43b3ea638c0de8112f795b19c66aedf20bf", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BaseType.cs": "93a432e574ebe2b418ac219c257243ca93444c965cc3bd98cdc15a680e00a872", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BitsType.cs": "cb2280707ace8c7cf1ace5f3479bdf6ff7bd0f530401d7346167984ff5c7a4ab", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Choice.cs": "8293714e9114900371790ed8d466c44ed9421752f9d13d70a92332232d35b982", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ITypeAssignment.cs": "110095915035ff4da95e82631a1b9720c8aec98220954d2ad977f2d713f75b78", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IntegerType.cs": "b82a91052415366bf55db02e07285e70d94c57e2338b469342969a7b3ddda7df", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IpAddressType.cs": "6b84597c58cf981694d096a158dfe0f7f6378d9b491b39e8c368f4cc850af07a", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Macro.cs": "922993e939e435a0c8c7169382368084988fe5efb0b766a62df66a603fab95ba", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ObjectIdentifierType.cs": "1cc6cbbf4a55e5d1c50ef7d31d6b65c0ead2544e19438433461785cf039299fb", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OctetStringType.cs": "1d87f07140c978e6161cd3f5f6ec332330eb680401298ecef87698140b36cb73", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OpaqueType.cs": "98d2a78598d798b1f30734ff5ac38906fe3f8b694732bae8a99f5c4caf6e75eb", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Sequence.cs": "dd213d0b822a7b42f486f9da1c5b5558ef1894cd0d62e1779555b1a3a94fe6e6", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/SequenceOf.cs": "bd61d745bb1cf6ffc690fd367cb8917bed82e6a10ed5410ef973b9e3758e495c", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TextualConvention.cs": "21259663b0c38aea4a5d15bdcea4ea67cd247c92d5bbc17372de9e0e323f3905", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TypeAssignment.cs": "4ceec51fd4ea8c19d7d4302812c66153abb7bfe4ae7619d40ebe897043f8de67", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/UnsignedType.cs": "b87b9fd790d32d9b228b71701af968bd623f5681f7e776e79abd8ed49289f7b9", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/IModule.cs": "a0111c3a29ce0a798caebf7176d52bccdce4d5a2c6df0c0bfab59ed161275544", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ISymbolEnumerator.cs": "ea45429a2f94a10369a2dc4ba4ac803d3b8d081b11c23eca1c1eab497faf2d7f", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Lexer.cs": "f9a8718339d55a167c4642c86e685856eec852f3e01a4aee032481c8f1576b94", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MaxAccess.cs": "f794a432573645b44938cda3894399ffe67da8d5e647e47abf80c83ebcd726d5", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibDocument.cs": "2e3ecbb52164913350151f012a8e1df822cfc6ff3262913a303237c122f65bb3", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibException.cs": "38b6f9de34b2495000f23d2cf5240575a1aa192f812a27dc645fa7ab341383b6", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibModule.cs": "8ed64591aecdbc369c0d37a1e237a2f5137ed293429b0a53ad57c16d20089f39", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibResolver.cs": "3302296c58b993cc345eb5dcaf4154d9bc9b1247e2aa5da8f0cca9ca074a36f4", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs": "26365eeb22893f16fd20e73bb3c9046fe55b4707360c3f2859d97e28ff20aa2d", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTreeNode.cs": "5f172090c3f0454b2d6f85545d582c1e55ed44eb28b96e94b893bf621462da6a", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTypesResolver.cs": "b5820e2bd4396a16573c8ddcf0310c2e5f3505b489abecc161297d0a4759b10e", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ObjectIdentifier.cs": "d1fc1048bb47d156f837fc7a7046a5b6b115d52c3b06118b6a35430f7323f6cd", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Status.cs": "18275342fc0e42915146fbe80dae09e61db3301815091d3b0f56a69dde833cdc", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Symbol.cs": "a22cc72e0518f5b8ac985a25103fccf3973de0c266a654481b47f74c89725ee5", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/SymbolList.cs": "900c1076b5a930244ab96f8794c4f24d6b99898b4bcfd7182f8e0ca7ce8451ba", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ValueMap.cs": "65fb378b6d830ff07891ace8a744eab54aa1dc32450a8d06460ab0e4c6006585", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ValueRange.cs": "5933376fec0fbc309baed04b3e79f2fa7ca11f9f02b53564faacc39ed17c9b3d", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Properties/AssemblyInfo.cs": "fb2f6e53df317f25617e2f6c24b30d02e2b70c434aec88989f468b12870ac013", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Properties/Resources.Designer.cs": "fb1e10e6b121eb4b14c98c1ddf28b1071584e7977dcd0970747ee5fd30180b45", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Properties/Resources.resx": "cbe7a23cf57abea4beca57ac456d81e11a2967d92ecffbceb7e3d7eda012789c", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/SharpSnmpLib.Mib.csproj": "4427bc8ded4f2509d31bd2ff00db32393cd300399efddcf7131c244b72b8d89a", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/license.txt": "ef1f7505cfdff240e72602bc50ef1cdba37c681c84611cdf30e4371320c70942", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/sharpsnmplib.snk": "0421beb05de86fc121b4e64eb3d0e6f698299bd7e80ea4d5f6fc0c630b61b7f6", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/example/compile_udp_mib.cmd": "5533bbcdce1d5ade93f05145cb2e6bd6b915fd36e06586c55da3e159a2f31fd2", - "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/example/compile_udp_mib.sh": "7496cdd8391196eaee063595dfb9a0d258c954825a748014556f93b53790458c", - "libraries/3rdparty/lwip/contrib/apps/chargen/README": "09b2017bcb4b99b712e3d803e76745afcadf1b3255361999129d0118c0a7cd2e", - "libraries/3rdparty/lwip/contrib/apps/chargen/chargen.c": "07444ca66879f803a304276f2e3cbd8d5863f7a705c91a741f9a84030f514238", - "libraries/3rdparty/lwip/contrib/apps/chargen/chargen.h": "265a136e0d8ba43970e3010640e31d62ea2a8df48711b3382d961fc134dda1df", - "libraries/3rdparty/lwip/contrib/apps/httpserver/README": "b2f76ca884fe0b4f59a2fb5f6c4debe03cc1fd0d5139a7bc9121b104dd83d3f5", - "libraries/3rdparty/lwip/contrib/apps/httpserver/httpserver-netconn.c": "4c83cb2c47044d9505b3295b2b0f2c5f5211e62f92327c6924d5e2c178bf1b60", - "libraries/3rdparty/lwip/contrib/apps/httpserver/httpserver-netconn.h": "b4d31cb3f85b7d671e1830b05e8e25858dc96300e94a92f04f4535bb7ac0ffdc", - "libraries/3rdparty/lwip/contrib/apps/netio/netio.c": "60e802a9ad9bdf747d1965e3a2e3cd465b0093d979b9c5a8f0ef50d4cedd06a9", - "libraries/3rdparty/lwip/contrib/apps/netio/netio.h": "74ae01b5361c9d2a448c32a5630d5dd24237aee743c5b0c9417befb29f0c8baf", - "libraries/3rdparty/lwip/contrib/apps/ping/ping.c": "f61accaf3c98435d9a00b2ffbaff14cb7d87229800a160316399b8addbf0fa39", - "libraries/3rdparty/lwip/contrib/apps/ping/ping.h": "b8738e6e4bc51b3f4dbdc6fd1671ac8af6f08243ac4f583518f86d7f63942cf4", - "libraries/3rdparty/lwip/contrib/apps/rtp/rtp.c": "2a902722a62af0e6b9dd6477ec24bec33b0cb26b0a3d9dace3698df93e5f197d", - "libraries/3rdparty/lwip/contrib/apps/rtp/rtp.h": "2e885934e7e92fda70db21ef7ab9995ad66d9d7a363aa8ebafb94b9c087550fc", - "libraries/3rdparty/lwip/contrib/apps/rtp/rtpdata.h": "ebb17e7bd13ec5d1a56e0ae1e17b481533028b6370446e72e9695ef3f0cd987f", - "libraries/3rdparty/lwip/contrib/apps/shell/shell.c": "a2246c5a6daeaca2fae2a325841c4bbab5ddde88d86b7d81f14bc110bbc7fc99", - "libraries/3rdparty/lwip/contrib/apps/shell/shell.h": "79f1ab8a52f397b0e20f7971848be468880d6a1c746ba9172b955d918cefb990", - "libraries/3rdparty/lwip/contrib/apps/socket_examples/socket_examples.c": "da28597bbdb0d157bbfc54025294cef76e3d5118a28e0e2ce3c87e6977cc2131", - "libraries/3rdparty/lwip/contrib/apps/socket_examples/socket_examples.h": "8b14fa347e738b6460ab249a439962072007c3d12008f0678aeacc5e65ddbe1e", - "libraries/3rdparty/lwip/contrib/apps/tcpecho/tcpecho.c": "99c3940d34eec794507448f52cafdb9704e952c8e4f5cfd172cacc60a0cf5591", - "libraries/3rdparty/lwip/contrib/apps/tcpecho/tcpecho.h": "443f85d08d310618d91b3d8b6e8205d74bf937ff08179457be6c8185a7bd0fe2", - "libraries/3rdparty/lwip/contrib/apps/tcpecho_raw/tcpecho_raw.c": "25364252e960ac1a32fb87da3b1005bdf5180991dd55a6dac783c4a99c07da09", - "libraries/3rdparty/lwip/contrib/apps/tcpecho_raw/tcpecho_raw.h": "544e404db6e6f2648e214c0ebe7c3a53c8361d1056d3b8270f9b858b5a2da7aa", - "libraries/3rdparty/lwip/contrib/apps/udpecho/udpecho.c": "af56f1b2b0627348fa1fe7b4a3ff0e2f3af9b363d04ae84ae689889764aa7072", - "libraries/3rdparty/lwip/contrib/apps/udpecho/udpecho.h": "541163b86e464dcbd1407fb9534b3ab65e94ad142d68b7cb20ad5bc0bf185c26", - "libraries/3rdparty/lwip/contrib/apps/udpecho_raw/udpecho_raw.c": "892368020c5e2cb57f27d995b0c9f661a7bf9ae91f9dfd9756bcf31f67e4c395", - "libraries/3rdparty/lwip/contrib/apps/udpecho_raw/udpecho_raw.h": "01bdd71bec8cf505abcf47ed0904893d29c301914aa6a16587e81bb34f562a93", - "libraries/3rdparty/lwip/contrib/examples/ethernetif/ethernetif.c": "2c5c2f73a3b18593d62d6657d697cf89b8fb99290b58c5dd345f8e6b6e01da06", - "libraries/3rdparty/lwip/contrib/examples/example_app/default_netif.h": "665f2be9a25016ba51d66f3358cf00f5e7237e66958e053947ea3566dfae5df0", - "libraries/3rdparty/lwip/contrib/examples/example_app/lwipcfg.h.example": "c348378390aab1d69f62711907c939a712cbb7b8221bd678f24b5511a3a73080", - "libraries/3rdparty/lwip/contrib/examples/example_app/lwipcfg.h.travis": "32d3301fbf2edf774262247a3d35cb6f524b2439a99cfb9d2f6b73240989890f", - "libraries/3rdparty/lwip/contrib/examples/example_app/lwipopts.h": "069714ec7c67b92600b430ef4256556396ed7cd7f9afd77959615b57ab27cd5e", - "libraries/3rdparty/lwip/contrib/examples/example_app/lwippools.h": "e4c0a1c8a6ae920a4f228397ccb6f57e59273a712f36881f73575a4176465e63", - "libraries/3rdparty/lwip/contrib/examples/example_app/ppp_settings.h": "aa1d53e47fd9010de46b31ea844f1797a762703ff72bc209b7ff378bc86275b7", - "libraries/3rdparty/lwip/contrib/examples/example_app/test.c": "ed602b6a250d834336a4016065a00766918ae4e7c43f72c7435f39466969ca0b", - "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_default.h": "f9b773c5befe36171b2206d4768abdebb443051bb67216a56bd85064ce279131", - "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_dualstack.h": "ab97d0142ee95361976f70a0736cf4bbcff5f29b67b38f8f5c192aa2f9814f68", - "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_ipv4only.h": "6536e85472a2fe6add8203c782bcb699c9b13640d407c3e61caa3e3aafe76979", - "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_ipv6only.h": "fc73ac500fce4b0f824f0826b9644dec856d629ed33b67272464d10f8b5918a6", - "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_no_tcp_dualstack.h": "c7ccfbb7c1bf3c7c2936cc07f3d0907dede5854c4b360cf35518df2de1638f44", - "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_no_tcp_ipv4only.h": "b90fe348deda454521f8483b983e90e1a1b56fd99c280b23136cb2f0c6b01065", - "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_no_tcp_ipv6only.h": "7694d824d5e09b3f0540437c329ea66fbdd2b0d2242097b420563f0a0f79bb77", - "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_no_udp_dualstack.h": "e7e5605fdf155743f3a3b028dea20d75172dd5ff8804cc8f5532cdc7d6a4e108", - "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_no_udp_ipv4only.h": "f42856c44980f6bc22fab73a93dcab9b1296d394eba9050d1892e6df4ff0b332", - "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_no_udp_ipv6only.h": "dfb09369b0301ebf8e9ef70835c993c2035dfddbc652f97df71d723ec94a2e9d", - "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_none.h": "f7458f019ade1e717f25bafc95dba6dd01650f5fc1d9c1ca78d9187247c67cd7", - "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_nosys_dual.h": "e6ea4019b9a6befd66881c6b1c0e1ef866718735144bf500f133c4be13b60495", - "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_nosys_ipv4.h": "a7f185d5efd1bdbc086b2566c0707ec8878e690a151f81aeeafd2f12fea65c7f", - "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_nosys_ipv6.h": "760417b8349d2cf80b008ae946be9997eeb8b87b265e149772409c7e2b6080a9", - "libraries/3rdparty/lwip/contrib/examples/httpd/cgi_example/cgi_example.c": "7e96c5dfcb11e3fccd5f09a4b2a082ffdf0c28e1acbae0ed05aa375d4d89c935", - "libraries/3rdparty/lwip/contrib/examples/httpd/cgi_example/cgi_example.h": "4de91340505d6a16af89efb369a19dd78a1c70b6e68281b2282034dce3996820", - "libraries/3rdparty/lwip/contrib/examples/httpd/examples_fs/404.html": "093f7768e78b045d8bee613880ada36c5af27e738ce906e5ab35bde33ad2c55b", - "libraries/3rdparty/lwip/contrib/examples/httpd/examples_fs/img/sics.gif": "3b4eb378fdefac1e7dd6dbb6c84db20e1512463457626f5d991bf7c1ccb7cf63", - "libraries/3rdparty/lwip/contrib/examples/httpd/examples_fs/index.html": "d34254865305f1f175294b4b1591f1f4a54145c28937f4e3fcb7f771d0a5e9a7", - "libraries/3rdparty/lwip/contrib/examples/httpd/examples_fs/login.html": "ceb987842f3e0b0390951f2b163ab6158f9b56851a29a85e1fe41198bc2d11a5", - "libraries/3rdparty/lwip/contrib/examples/httpd/examples_fs/loginfail.html": "f327434741033801152fbc8957e5205346ff40fc5423aad1a9eedee764488338", - "libraries/3rdparty/lwip/contrib/examples/httpd/examples_fs/session.html": "d2a447b85ccfd0665801c84e50481284e99222aa2e375cd32a119e36eead8678", - "libraries/3rdparty/lwip/contrib/examples/httpd/examples_fs/ssi.shtml": "66af689acda23a61b558e3b0a474637dc93642abd09ff7f8259cae1d82d2c714", - "libraries/3rdparty/lwip/contrib/examples/httpd/examples_fsdata.c": "d232e6c54e0d953562b7a3f10e1be77c29f464480d53f392c19089e29c6cd949", - "libraries/3rdparty/lwip/contrib/examples/httpd/fs_example/fs_example.c": "83c272e37c215b5066f50acfde4b3ef82f7bceeddbe9af42af8ec15f450fa7b8", - "libraries/3rdparty/lwip/contrib/examples/httpd/fs_example/fs_example.h": "d6a5c86ee4a7cfab6b2c264fe46513c3b4198c569257313b7015107051bccbb0", - "libraries/3rdparty/lwip/contrib/examples/httpd/genfiles_example/genfiles_example.c": "6f64d995dab998ff93bc99eea4732f0f7a6cbd0bb298a6e287e710afb756d1c2", - "libraries/3rdparty/lwip/contrib/examples/httpd/genfiles_example/genfiles_example.h": "95f91a4c206c61a087602b6b6467c7843bc16ecaa1519e7a89a7af4a0680d85b", - "libraries/3rdparty/lwip/contrib/examples/httpd/https_example/https_example.c": "e5162ea135194df8c7f568150d1c4e27fe2c1bfc7b8d313267c7c3ab7e3e3b1e", - "libraries/3rdparty/lwip/contrib/examples/httpd/https_example/https_example.h": "c33fa5640d3a57b08d24438f689a9926a3a4f9dad638087ffb2ebdf486e664f9", - "libraries/3rdparty/lwip/contrib/examples/httpd/post_example/post_example.c": "afeca9d71f2d4c38c440e33cabc755d074dc6fae6acb620a15d153b69b860b22", - "libraries/3rdparty/lwip/contrib/examples/httpd/ssi_example/ssi_example.c": "43c3a9b2eee6862cbf664b02be787904fe271b9d8072c463c6f37fce8494aba6", - "libraries/3rdparty/lwip/contrib/examples/httpd/ssi_example/ssi_example.h": "24f5a96c12ebd03cbe57cd51361b03b16fde215ddd71fc6e84b9f9d715db6d0e", - "libraries/3rdparty/lwip/contrib/examples/lwiperf/lwiperf_example.c": "0c0573f71a0054d39259dc183c70e9cf13334da0c96e42d747c414813da4179b", - "libraries/3rdparty/lwip/contrib/examples/lwiperf/lwiperf_example.h": "bae2a72cd8ea69bb9edbec916aac623fdcb9014fa526cf5782892362e9a782e7", - "libraries/3rdparty/lwip/contrib/examples/mdns/mdns_example.c": "3dc0334bcf02df4985acc01295e18d8cf5e06323d563b893ab03dbb3b7f94370", - "libraries/3rdparty/lwip/contrib/examples/mdns/mdns_example.h": "81dbc1fabad8400e8656187d3d95b38f24dbbdf09615cc23cc57d5c7c7f9b209", - "libraries/3rdparty/lwip/contrib/examples/mqtt/mqtt_example.c": "1ba382439e356525964a554d073e98e504542799a539ed0c51d21955fc174c30", - "libraries/3rdparty/lwip/contrib/examples/mqtt/mqtt_example.h": "879c0f1adc062e7aef8ad74f5878db45caf215e37605009b95b09addfa428579", - "libraries/3rdparty/lwip/contrib/examples/ppp/pppos_example.c": "f6fff7881756a568b8dcd14d00ea31da6fdb1053e387c284ea62f990dde26c70", - "libraries/3rdparty/lwip/contrib/examples/ppp/pppos_example.h": "420338e076895dcde27c1a82c9f49859a9fff9f2de6b9bec67205e340a0ed02f", - "libraries/3rdparty/lwip/contrib/examples/snmp/snmp_example.c": "212d5b982d925546218bba71f345dc276206eed4e5e79dc248bfbf86a05a49ca", - "libraries/3rdparty/lwip/contrib/examples/snmp/snmp_example.h": "0d4b04fc829cfbdfd70f814465ab078fa0681d8b2e66930ff6c8aace057057fd", - "libraries/3rdparty/lwip/contrib/examples/snmp/snmp_private_mib/lwip_prvmib.c": "b6fa62af506a8f289fd3f497b2330e10df2c1292d8b6943399d418926eca7184", - "libraries/3rdparty/lwip/contrib/examples/snmp/snmp_private_mib/private_mib.h": "82f435e21bd31c391eb98ba54bf3fe7302765f8a0ce878f3d08ee72888d0ffa1", - "libraries/3rdparty/lwip/contrib/examples/snmp/snmp_v3/snmpv3_dummy.c": "a244ad2d8b4edc25a535532edf149515e0c4432a0297d97a569e4e4ae4d92c1e", - "libraries/3rdparty/lwip/contrib/examples/snmp/snmp_v3/snmpv3_dummy.h": "b9141ab62dba28d06fc60871142a1ba76ea587ff52ac80f6a6d35be22e040217", - "libraries/3rdparty/lwip/contrib/examples/sntp/sntp_example.c": "3e9ed5205335be228a68138724c76ea1edb5352bdc7fb0431676abd45d868522", - "libraries/3rdparty/lwip/contrib/examples/sntp/sntp_example.h": "c2f0cd2b9b4b66eb66768106b1f1044150fa2a1492aa41c28c455084f2a82fcb", - "libraries/3rdparty/lwip/contrib/examples/tftp/tftp_example.c": "d3f03976207e246c2fc805b7af8f5e2ce8747b9f47ef9418898058b33304491e", - "libraries/3rdparty/lwip/contrib/examples/tftp/tftp_example.h": "b31f68d059a53a7706b52d70e20581d0357233a279fd252c8f1addaf5cb01b73", - "libraries/3rdparty/lwip/contrib/ports/CMakeCommon.cmake": "6239bc22cac63209eda9dc963dda2ef6521a31810643557679a30c46a5cbe18f", - "libraries/3rdparty/lwip/contrib/ports/Common.allports.mk": "b5403e85c25cde53176ec5d07a51cca9126a740e86ec8edcc3b280a5d916d52b", - "libraries/3rdparty/lwip/contrib/ports/freertos/include/arch/sys_arch.h": "4ad62d7eb8ac49482dff4423084c16136eaaa6bdc866624f327a9cdaf8253386", - "libraries/3rdparty/lwip/contrib/ports/freertos/sys_arch.c": "3b2d57360324ae1bf4d05ee9f665e8e79ba013dece0bb5ecae1e39ef53092b03", - "libraries/3rdparty/lwip/contrib/ports/unix/Common.mk": "23ceba07dccc4216ab2e24e5551c3174e0a4218927e4dede5e230ad035c76062", - "libraries/3rdparty/lwip/contrib/ports/unix/Filelists.cmake": "e3da6dbc6e546de190efce5b72ff406136760574b9867581815271ca47cbf87b", - "libraries/3rdparty/lwip/contrib/ports/unix/README": "46e93c0e43a42fc501971d55a0c30a9bd3aebb717b981542453ee0304a161e2f", - "libraries/3rdparty/lwip/contrib/ports/unix/check/CMakeLists.txt": "02cd198908ae4acb2f59d69e96e085f5a03cdf828bbeef0f1f00aa36c0e1ea25", - "libraries/3rdparty/lwip/contrib/ports/unix/check/Makefile": "0d499df19f471bed11318952826ba93fb05a9b8ac3b2c8d3d6b2f4122466dca2", - "libraries/3rdparty/lwip/contrib/ports/unix/check/README": "2ea7ec20655072c5ddf35c19d979f9d0f3499ba088aef7f9c2567c7b839293f5", - "libraries/3rdparty/lwip/contrib/ports/unix/check/config.h": "def89e5147dc4085b7e87e02db5e09325a22299c579c693ab160cb7a9382c0f1", - "libraries/3rdparty/lwip/contrib/ports/unix/example_app/CMakeLists.txt": "553a751a9ba61905aa44f30562e3a1afe4b4b86c6f360ea6abf6cdbe439137f9", - "libraries/3rdparty/lwip/contrib/ports/unix/example_app/Makefile": "d41510732b8f316b57e5955f018658e0fe3c672852e21b5a88b99b20ac1efdad", - "libraries/3rdparty/lwip/contrib/ports/unix/example_app/default_netif.c": "c468c28efc19869aa507e7d7d650cecbc6c6bae84ed5b3dd5946fde49e8ba254", - "libraries/3rdparty/lwip/contrib/ports/unix/example_app/iteropts.sh": "7b79dccb7238618d1c4b13c4ecb02a04dc520c5db546bcd65a5a5c1892b884ca", - "libraries/3rdparty/lwip/contrib/ports/unix/lib/CMakeLists.txt": "abdea1102dc51c0177a5df9bfa0a6f44723241290f7605be8699a78221af10f7", - "libraries/3rdparty/lwip/contrib/ports/unix/lib/README": "3a98da8c3a5c024565725a6153a500b5bbc779d6a6aec147c24efe733469d224", - "libraries/3rdparty/lwip/contrib/ports/unix/lib/lwipopts.h": "a00b9de59e0433344838928892b2e121d1633fb7dac660dd0e27dc00f05e9cb5", - "libraries/3rdparty/lwip/contrib/ports/unix/port/include/arch/cc.h": "87ca52825c775a18d1a8f5d6c2d747dd6739ca1784b39e34952d3151379722cb", - "libraries/3rdparty/lwip/contrib/ports/unix/port/include/arch/perf.h": "9c170fada00f4f1c98762aab95a0ce2a28399e7ddc0177515fb35cb41763ac31", - "libraries/3rdparty/lwip/contrib/ports/unix/port/include/arch/sys_arch.h": "e9e06bafa5d614223b2b1a90908abffae3234b715aa904e9cb41d10f099d36df", - "libraries/3rdparty/lwip/contrib/ports/unix/port/include/netif/fifo.h": "6019f26220b706579656977a469f76b252b55ffd80bc7a1f0c9196e75dd81e79", - "libraries/3rdparty/lwip/contrib/ports/unix/port/include/netif/list.h": "6543fd9607041979170f8f5a94ee4033562048d5614dd472eec590c9145c782b", - "libraries/3rdparty/lwip/contrib/ports/unix/port/include/netif/pcapif.h": "60a0a33bc0237a4cb5c153385946c07f3904cfab9c0e5c0eb00400d3f0f24be0", - "libraries/3rdparty/lwip/contrib/ports/unix/port/include/netif/sio.h": "ddea825927d4fdf7c8d3eed5773013d36fef11f395025cce7420366c5831e8ee", - "libraries/3rdparty/lwip/contrib/ports/unix/port/include/netif/tapif.h": "d238b3d91165a00e1b3bf7757d073a4e4dcc4865f8188ae380ae3bd26de87152", - "libraries/3rdparty/lwip/contrib/ports/unix/port/netif/fifo.c": "784d147f4b67617dd04f66ac368cd6173d7d4e4e811980da465eee3af5223747", - "libraries/3rdparty/lwip/contrib/ports/unix/port/netif/list.c": "f13548f5dd67df2f9a26a1e693866c0679ac7489ee4d4c0f690890e31dfc554a", - "libraries/3rdparty/lwip/contrib/ports/unix/port/netif/pcapif.c": "8b1f7ff5d8b50de16284ec4ea5d41519da45d1b6ce47c53aa2541e7d59cfefee", - "libraries/3rdparty/lwip/contrib/ports/unix/port/netif/sio.c": "b712bb07d7675ae0b46d4a41ab2e25e9b08a025e037da4da6dd771a2ec04144f", - "libraries/3rdparty/lwip/contrib/ports/unix/port/netif/tapif.c": "1063ad29acfd2791724906ae027d4ad2c631ab05a7b45d112bac861f231e0fc9", - "libraries/3rdparty/lwip/contrib/ports/unix/port/perf.c": "53aa582030c38f3ce657545165a08c96d79fa0f4a51713347afc455a2e6d7b6b", - "libraries/3rdparty/lwip/contrib/ports/unix/port/sys_arch.c": "69ea0f747767e9882c295b89361c9591548be0e0ccd56e12d008163b78153570", - "libraries/3rdparty/lwip/contrib/ports/unix/setup-tapif": "ebc504a3c9ea4066927984556b7cf877e86991379d30c97f650330f7fa8d736a", - "libraries/3rdparty/lwip/contrib/ports/win32/Common.mk": "125f92a764ea01ab3a7b930146a530d9e5397c3c09584468334213968ba087c5", - "libraries/3rdparty/lwip/contrib/ports/win32/Filelists.cmake": "ec2eef7b170a1131530b6a0a31e43cd90caac4886010f0c744ca5de671479ac1", - "libraries/3rdparty/lwip/contrib/ports/win32/check/check_stdint.h": "6dfd316c7768ca286bc36dbd5c26a870cbdaae81c95ed41955af0ffc777a1d00", - "libraries/3rdparty/lwip/contrib/ports/win32/check/config.h": "6508f04b8d148dba8c30e805bd9204519e9ca540d71342df3531f6f62722c6a5", - "libraries/3rdparty/lwip/contrib/ports/win32/check/stdbool.h": "fc341d8b377004ef43ceb4c032c3028578dd24be7280be0f4b0da16abc213d55", - "libraries/3rdparty/lwip/contrib/ports/win32/check/sys/time.h": "5af2327d51ef0e3fcf6b1baedf94650ebd02f532d3535a63dc71cc23b23976af", - "libraries/3rdparty/lwip/contrib/ports/win32/check/time.c": "deabd310fc35ff3e2522b9576d7831d4b5289ab8a35b01a36bf8a2462fa64c6d", - "libraries/3rdparty/lwip/contrib/ports/win32/check/unistd.h": "44c5982f2057234bb630714bf4b72b77baed93a8d34ae4b490055d9ee4bf593c", - "libraries/3rdparty/lwip/contrib/ports/win32/example_app/CMakeLists.txt": "c9f74e74a6e2830a68215138c0aa42b8f3d84117210ed0545b253bef5a1bc15e", - "libraries/3rdparty/lwip/contrib/ports/win32/example_app/Makefile": "ff08d73a3ec755ee05d58d01e2bf3384e595e0543649f6160ced2feea62e552f", - "libraries/3rdparty/lwip/contrib/ports/win32/example_app/default_netif.c": "30d0de74b2668a58825c3a67249292fc655965041111705f99a77bb8c46a4621", - "libraries/3rdparty/lwip/contrib/ports/win32/include/arch/bpstruct.h": "2bc6a0eedb9cb3cfd0a593deaf06d52fd4359275ac9f136ba6e94a7da19048f1", - "libraries/3rdparty/lwip/contrib/ports/win32/include/arch/cc.h": "b54d6c7ee3d893acb7fe2f8426f15d487d4146415be8e4514aed2b159d3a079d", - "libraries/3rdparty/lwip/contrib/ports/win32/include/arch/epstruct.h": "962c890c81ed4c2467086be787b5daa10023eac09a6d9953f25c28e7e2346f19", - "libraries/3rdparty/lwip/contrib/ports/win32/include/arch/perf.h": "8854a0e22cb2b980f95c92fafd1f0f5293ca4621f841e86fec0112aebedf6c02", - "libraries/3rdparty/lwip/contrib/ports/win32/include/arch/sys_arch.h": "77320f24c243a19ea97c45ecfc2a1bfec9e1d4a23353a8fbdf546d87cd1809fa", - "libraries/3rdparty/lwip/contrib/ports/win32/msvc/build_coverity.cmd": "b6a430ac998b4abebc9bb4b0303cb50c285050c9d4f582c8a9f4bc87da373c53", - "libraries/3rdparty/lwip/contrib/ports/win32/msvc/libcheck.vcxproj": "5456fd66266a384bbc9f720f37db626aa3ee69fdf7fd1d593877e44fc7abb3ff", - "libraries/3rdparty/lwip/contrib/ports/win32/msvc/libcheck.vcxproj.filters": "3419e9d81bf7020fd0bb2d5ef83afcfa62fa6841a9dfa88cf747744bba0c93aa", - "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwIP.vcxproj": "8e804d504676855f987aa14dae40ce3bbe7d40f0147a70e6d23ea1e3c85483cb", - "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwIP.vcxproj.filters": "44c772b1f2f6e3a972f18c3ae8b201c21b86c1c96f4f2521eb1943d050b61556", - "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwIP_Test.sln": "bdbe2d92dcb53276477d49bbcc97bc37cb6bf4ba8cc04c9fe726f89991d66643", - "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwIP_Test.vcxproj": "c15807dac7ae4523a5bbdd89e018e56a5557c97dc8850fd251080df4a42c7e4e", - "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwIP_Test.vcxproj.filters": "436cd664d2cff5d2bfe183014612080c5db31baf391f48abaedbc2c1a2a3778b", - "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwIP_pcapif.vcxproj": "71dd4e10a28aedc4a94374dfcc111479eb592a3689a35b660c694a63016b268d", - "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwIP_pcapif.vcxproj.filters": "da07818456b7c0200576013510cc1b1572946446eea7e8b4b36c6fa95d7c04ed", - "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwIP_unittests.sln": "eae7eb889df8e3c82fdacc84de7e25854f23bbe4659f255381399423415aae71", - "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwip_unittests.vcxproj": "404a46e5f20505743126a197616c21601a6dbc9b75c028cf6b26fb94a7a59226", - "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwip_unittests.vcxproj.filters": "68aafaf14d827a55daebf4d1dfe5524ae0cacfa1a74196ba41b9c29421ba4ba2", - "libraries/3rdparty/lwip/contrib/ports/win32/msvc/makefsdata.vcxproj": "a48080a571420e1a5d80287ee48e36a4a76d72e2b7edc221c5edc75331822d56", - "libraries/3rdparty/lwip/contrib/ports/win32/msvc/makefsdata.vcxproj.filters": "607321cc4880ab4f3abf764cc0c5ff68ab4aa70ac493ddf9182ba7658b064db9", - "libraries/3rdparty/lwip/contrib/ports/win32/pcapif.c": "29e053329bff40164faec9b7f7a8c241ea3f2d98e29c2591550a315b6581ef08", - "libraries/3rdparty/lwip/contrib/ports/win32/pcapif.h": "a19fe4f3aa7928d00c2c2800a8fd4ed85a3cb33db8dcf01d3243683c43817d10", - "libraries/3rdparty/lwip/contrib/ports/win32/pcapif_helper.c": "68e2456c98f67ae98a4001c20c2f8ed2dd55427d48087bf13ef88c00fcf07ac7", - "libraries/3rdparty/lwip/contrib/ports/win32/pcapif_helper.h": "2c5693fba9a2db77704cfa4a062675e2bddb6844f8187c28c4a93dc95d362752", - "libraries/3rdparty/lwip/contrib/ports/win32/readme.txt": "829c6e4c86389fb33116d765531ef74b7514569c4c87b613ed5bde5940d9352a", - "libraries/3rdparty/lwip/contrib/ports/win32/sio.c": "305985ed399195d0e7e3a8813bbedb112f9f6cf523f484610fb7b6ad093cb6bb", - "libraries/3rdparty/lwip/contrib/ports/win32/sys_arch.c": "1ffc55af07e4293c35a206d9af3c0269e005f733c9a0d6fc1c45da08767c9ebd", - "libraries/3rdparty/lwip/doc/FILES": "7e411f98dd0b535f78f1cc4ca81bbd596ce704a233c24933c247d11eb4a07662", - "libraries/3rdparty/lwip/doc/NO_SYS_SampleCode.c": "0dc59b5572d2d9576f74ffe0f62791e055839e948ea174ec75ae617742c5b6e6", - "libraries/3rdparty/lwip/doc/ZeroCopyRx.c": "cbabf596cfa079b493582ec1431d9885c68bb2adf5c2cb897730d7ed03ce852a", - "libraries/3rdparty/lwip/doc/contrib.txt": "7a032f6f39a904b822791001f7091fc759bdae67659b39424d46382293450220", - "libraries/3rdparty/lwip/doc/doxygen/generate.bat": "edc28fe50dc150fe0ddba1369f05511a5437a4b873233d75677a9930dbf580be", - "libraries/3rdparty/lwip/doc/doxygen/generate.sh": "d5134949019de866042b12d7855892036790036b5f12a3d53ea477babc3e8a7b", - "libraries/3rdparty/lwip/doc/doxygen/lwip.Doxyfile": "448e81969aeb8c95163560a9ada25965df9e508afd3ac15f1220bd1ee48e0f95", - "libraries/3rdparty/lwip/doc/doxygen/lwip.Doxyfile.cmake.in": "c08e8f9b8c60bd528a5ed3162708e4e3cf052c7497417602ba2fb36426e587ef", - "libraries/3rdparty/lwip/doc/doxygen/main_page.h": "5520224df4911884cd57757dc146e4c1289365e1b4c24c4fa6755392188c3371", - "libraries/3rdparty/lwip/doc/doxygen/output/index.html": "65219746dcce33cff1833a9629610bcce0ce9aa100ec5d54fc808d143f54ba2c", - "libraries/3rdparty/lwip/doc/mdns.txt": "230cf15e5613c676dc7035bf1b61d9294a92e2ff31419904dfacab7dc93ac7c3", - "libraries/3rdparty/lwip/doc/mqtt_client.txt": "af683b0d30f5896ae89cf003962e39cd3dac04e8b4802ae39e9cb143d345b357", - "libraries/3rdparty/lwip/doc/ppp.txt": "a7b55cc1c17b4177bc43bd0769ad5a0a795046c4ef5717fd63655229eb9100ea", - "libraries/3rdparty/lwip/doc/savannah.txt": "f895abd236a811a976d182b36e2c18cfb657078df74b50d2f98cfadd35ad192b", - "libraries/3rdparty/lwip/src/FILES": "05faeb3c86d87e76ba9366ea01db86c00977e5d811c57c6dde081ca9ec6fec2e", - "libraries/3rdparty/lwip/src/Filelists.cmake": "b1bedb02aeb601f36ed5b3dbc20606d9697db4427167cce788936b4233871512", - "libraries/3rdparty/lwip/src/Filelists.mk": "a750091212a64e856461256dc27fd749f7851780bf70ca3b67751afe36f2699e", - "libraries/3rdparty/lwip/src/api/api_lib.c": "c39b73d197e840ab1648710530595ad1fbf234872d89b327b2bc259b74252e69", - "libraries/3rdparty/lwip/src/api/api_msg.c": "cc903062accd85a9f5ff849e9d059e1cdc06d536109ef0ed1fb31e53fdb7908f", - "libraries/3rdparty/lwip/src/api/err.c": "5dd20e93a89f5cf4492e6cc3de49a5b6de6a9b15136963cef2a08a5e411a1f15", - "libraries/3rdparty/lwip/src/api/if_api.c": "eb6c944f66d0daf48306b308c5dff528b167f1284edbfbd87930c48d2deeba7b", - "libraries/3rdparty/lwip/src/api/netbuf.c": "07170f98220de0017468b552e59f16d184d32ebc502dfc819ca2e7e4deb56a1a", - "libraries/3rdparty/lwip/src/api/netdb.c": "6f0211709009d8562fee260ebdb958f12693eb490d3ef8837b0e8dba6d4a1095", - "libraries/3rdparty/lwip/src/api/netifapi.c": "d8426d620c4556c1f8cfc68aba0e91c8e7bbe214a13fb877f364041f9bf8ec34", - "libraries/3rdparty/lwip/src/api/sockets.c": "1b861f167324ad671ba3548cf55caecb01e355eae4eef3e6e58a6f6346d83235", - "libraries/3rdparty/lwip/src/api/tcpip.c": "826705504f016884a70c903b86c988335dfae963556664688ddfc1191d9e416b", - "libraries/3rdparty/lwip/src/apps/altcp_tls/altcp_tls_mbedtls.c": "1ec063ce024bc31ce247906a2d6e89a9c6e6c4c65a0960a0f7094c08615a8335", - "libraries/3rdparty/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_mem.c": "45a0cd3bb15895dfdbfc5723d31e268549a89b1b730666e13f0f9ecdafbde9a8", - "libraries/3rdparty/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_mem.h": "e145466f175096ce419c0e6e267353b3f8af174c0135a1485305ee79c71ac9ab", - "libraries/3rdparty/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_structs.h": "51238ee0fdc56828904a777ace9864f907790c1bfa29be847b146b6b58f55fb8", - "libraries/3rdparty/lwip/src/apps/http/altcp_proxyconnect.c": "e9fe1a344f0faa9814ccd8a17b8cd69cc7be90a74fba6d8643045eb6198acdb6", - "libraries/3rdparty/lwip/src/apps/http/fs.c": "91cee1c0dd66b171e7459ab2d5d3d89483d13f9fb5d5fa77acba80bd68cd8534", - "libraries/3rdparty/lwip/src/apps/http/fs/404.html": "093f7768e78b045d8bee613880ada36c5af27e738ce906e5ab35bde33ad2c55b", - "libraries/3rdparty/lwip/src/apps/http/fs/img/sics.gif": "3b4eb378fdefac1e7dd6dbb6c84db20e1512463457626f5d991bf7c1ccb7cf63", - "libraries/3rdparty/lwip/src/apps/http/fs/index.html": "d34254865305f1f175294b4b1591f1f4a54145c28937f4e3fcb7f771d0a5e9a7", - "libraries/3rdparty/lwip/src/apps/http/fsdata.c": "71eeb2b3435f2d46200bdd64fbea09301ea56f41ee64660740d893a2621ad192", - "libraries/3rdparty/lwip/src/apps/http/fsdata.h": "44df92ed526d0d6b1c374fdd97a96b3f5eb188c7d1084e32fcf420a8a23e3d0f", - "libraries/3rdparty/lwip/src/apps/http/http_client.c": "767525ee96ebfe467e3cf71a1e947d9e2e15f8ec4bbad5c2a353c2f31da418b5", - "libraries/3rdparty/lwip/src/apps/http/httpd.c": "0c83baecd0a5418decdc8577bd719f8bceff3b6a2475bf52af800e54e0dd0583", - "libraries/3rdparty/lwip/src/apps/http/httpd_structs.h": "392cc349b27b067284a51bf767e0685ca4ec8787485d10f2740128364660e4a0", - "libraries/3rdparty/lwip/src/apps/http/makefsdata/makefsdata": "660649c3cd0b5fa548baba63db7c8218aa13269825d3cdec0d4ad577d1338b20", - "libraries/3rdparty/lwip/src/apps/http/makefsdata/makefsdata.c": "1c1bb5c514ebff1e8da8d24967fa00ddde1be219298e67e4a77e399c21f25c53", - "libraries/3rdparty/lwip/src/apps/http/makefsdata/readme.txt": "033f3db7c66384b1da4c0f3251b6f7e21342655a9a3996edbc0fe87d37296838", - "libraries/3rdparty/lwip/src/apps/http/makefsdata/tinydir.h": "0d1716fa784db3441d241ddec4f75c2dbfe5d6aaea2f091eec7fe070c18d443c", - "libraries/3rdparty/lwip/src/apps/lwiperf/lwiperf.c": "e13887dfc67f0bf9034531165d635979833785aa6d1e4aaf983fc819df1499c6", - "libraries/3rdparty/lwip/src/apps/mdns/mdns.c": "c48c2cac0c08afe239f1e716db48b9c77287a0228a7fb69cfbf55ec823cccd7b", - "libraries/3rdparty/lwip/src/apps/mdns/mdns_domain.c": "fd8663f64e25bb9367451a39ac6c6d8b216d25f5e6c6087d541ec2d64dc21685", - "libraries/3rdparty/lwip/src/apps/mdns/mdns_out.c": "64069a359a63fa144462c5579f275ef3a6e338de3b52a13008429c2d12a7f28d", - "libraries/3rdparty/lwip/src/apps/mqtt/mqtt.c": "a99dfb19dc99160dfb19e6be8a43d4ffdce01a6279dbf88ffc047becc2c77e52", - "libraries/3rdparty/lwip/src/apps/netbiosns/netbiosns.c": "49c51ffdfc4e410761ecf3fe7eb3e0139f1a655a25c069d1b2d2afbdc7860e2a", - "libraries/3rdparty/lwip/src/apps/smtp/smtp.c": "9d4043f779d2f594423298c8408b02fc187640ff7f0fe5e902f53a61b76d2120", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_asn1.c": "d8bab135914260bc8cb3810be04bb17dd6dc58abfb46a063cd2930f5dfcb9a92", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_asn1.h": "87bc7b07c8c510b17134ab05a22ee675c9c48450169dc99e600be2f331a27f54", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_core.c": "e5677cad8ef17bdc5b38a134756accc1821fe079a1cd8e83283f08b3d4b52080", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_core_priv.h": "e486ddc80307a3399c3547855adc05c9ff9040b0b9be237c0af232db6bd00abb", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_mib2.c": "1695042f8e26a8c2a830c6c7df35ef7b084fb184b84638e56eef46c4faa3386f", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_mib2_icmp.c": "1072cf5d410a39b540ecd09554e98b264488a26f90628f67ccdc9368d3b5a179", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_mib2_interfaces.c": "4998987c9ba42a8808b317dc4a67dd8dd761371d358f3ad4a43fd704b6cbb330", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_mib2_ip.c": "e4121927b1b42e2f8ecd6ff4b72449a9ce2fb6750ffaeb63598b719920ea3406", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_mib2_snmp.c": "bb5d3ced0dbd9b11cef0bc337791cd2cc4c06f7562e1d4b351e0043388a5c816", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_mib2_system.c": "e4454c37018aa43bf95368dd5abbb0a18306be4639d79af0c4e2247697483b36", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_mib2_tcp.c": "31829ddc6f5ad49e1f4c5b4bee0c51911a3fbbfba2553fb601e30ff4a7d0c5f1", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_mib2_udp.c": "490f18bce9e02d6350b978adbc882323d7ab43100c0072656dab15fb18033318", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_msg.c": "23d3488c435784fc9ec9bb196da4e0dfb2ecce4a8c28a0358273571e417d12a6", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_msg.h": "1ddd054f74cea2c6c595b22228461578114d381fe82f86c96c9cf85cf5dc8dee", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_netconn.c": "2c44422bf05bbbd8aa7705d0fd408f7e9afd8e1a67b366af403e34257e9c42e6", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_pbuf_stream.c": "9d2dc736dc4d30db370f4f0e0d02ab78b57c240cecda6b77796017ff56bdcb20", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_pbuf_stream.h": "22630a24db7edbcaf482b7975765e7df0860f141e9bd9c48083e00af0b7eeba7", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_raw.c": "2c5eedb6d972f6313575f837d0e9c33e129fcc43498d180eef6c80c8c4a85c73", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_scalar.c": "065919819cd402d35c925e80f7732c70872d78faf69f77964e6b75c26be7563d", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_snmpv2_framework.c": "9e0e7a9bee3cd1e55da9398f16e47f5e83395e8979221f0d64809f06c1230994", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_snmpv2_usm.c": "b1825260c0a4b860d33a258f4d6eec789876c62a167bdf63b67d0edcc6c0c5c3", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_table.c": "72546d138df585ada6fb1d854b65f7d54d81e98bed5dcdeab79c8c043704e116", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_threadsync.c": "8acbd0cab2bc51e0c8afe971ad1f670a6766217f9bd3b72a712adbcd7848809a", - "libraries/3rdparty/lwip/src/apps/snmp/snmp_traps.c": "de7a680466a50fe625bae6bc37f051c3b2a01c0a21b3bb907966838c34e778a0", - "libraries/3rdparty/lwip/src/apps/snmp/snmpv3.c": "9dec4ef75e29632234089a5593cbd27f9dea972f0829f07bd15c84a14f947ba7", - "libraries/3rdparty/lwip/src/apps/snmp/snmpv3_mbedtls.c": "7dace5c3961dbdbf6b2085c4403e83aa6666d0ba1a8d0c70709873af5c6609f3", - "libraries/3rdparty/lwip/src/apps/snmp/snmpv3_priv.h": "f7027abe4f437bbd639ec6703cc9549ce6f0881cee0e44c461de686feef02d2b", - "libraries/3rdparty/lwip/src/apps/sntp/sntp.c": "5130700b19c4ef61a578c5c19ceb3b18e81f7b1349d0511577552789dd8116ed", - "libraries/3rdparty/lwip/src/apps/tftp/tftp.c": "1bc301146ca1b3824b0d2e56ea75753df2201777d653e6b2ce3d6e93461e9765", - "libraries/3rdparty/lwip/src/core/altcp.c": "3c6653588772a62efdd11ceeffa760847f95d8ec98889c7551e9a1eb8326f8cd", - "libraries/3rdparty/lwip/src/core/altcp_alloc.c": "90db26c801a4a6466e188e8b5a6b8d2aac2e6f39b4ceeb0f825e7b35ae1786c7", - "libraries/3rdparty/lwip/src/core/altcp_tcp.c": "786830cd6edb63dc0c18a34db6e539058ca499f74fa9020d0808df7f07d232cc", - "libraries/3rdparty/lwip/src/core/def.c": "43723472fe2eacb50102403d7410f3c99c1dba7a37406a761c6a384e3a231ebc", - "libraries/3rdparty/lwip/src/core/dns.c": "94db6c8cd89d6f99189eb19817bf69959a5b2dee25bd0cb5d7bb5250901ed799", - "libraries/3rdparty/lwip/src/core/inet_chksum.c": "9f73e859881dd5f24ed5fbb5099bb041aa7d93dacbc7b28e3ae23c0cad5dcc92", - "libraries/3rdparty/lwip/src/core/init.c": "4b9d5a1d04e5937b49d98e23908821e09ca6308f6e8e4cde384adc22e72a4ec1", - "libraries/3rdparty/lwip/src/core/ip.c": "82d0fc6b45c6d1af88bdece3229fc9821274263c261369de4f81b8d6c80751e7", - "libraries/3rdparty/lwip/src/core/ipv4/acd.c": "c793e2cf2ea9a1c4a6bcc0e2b4ec05766c7fe0c153d1bd19b25d6a56b711ac40", - "libraries/3rdparty/lwip/src/core/ipv4/autoip.c": "225b55a6533ec9cf741be0bfcfa947da7ef7dd20b9fd6597bdcb40d7d0ae668f", - "libraries/3rdparty/lwip/src/core/ipv4/dhcp.c": "6841841a9d11133387f9d879aabbdc2c710b5a22e5604526d4ced605845e4d10", - "libraries/3rdparty/lwip/src/core/ipv4/etharp.c": "b391a21bd5d7b69a185c20ad220d52fcd3b4ca7b5452f69089a9258780ce86ac", - "libraries/3rdparty/lwip/src/core/ipv4/icmp.c": "3072098d2bdcc364a1ff79493c5bb6c26470226d3dea98c6a8bb15269a3df0ec", - "libraries/3rdparty/lwip/src/core/ipv4/igmp.c": "7e541cb6884e4cd1605e7edc8652596b7edbafb5430487720fe4eae2ee3bc1a4", - "libraries/3rdparty/lwip/src/core/ipv4/ip4.c": "b22c7f868b3c19c3e187260cf47cfe06d254191f3c2c051f0e934151e5d86e70", - "libraries/3rdparty/lwip/src/core/ipv4/ip4_addr.c": "44d5dabfeda2558860fe831107040148f111b20bf372dfedaa370086e0aa588f", - "libraries/3rdparty/lwip/src/core/ipv4/ip4_frag.c": "dd03b42a7d02f00a1c9fafa8c83548a8b2aab19dfaa136451120ad10d964b68b", - "libraries/3rdparty/lwip/src/core/ipv6/dhcp6.c": "1bd204acd3d3ea0c01ffc0476c6aa4cf3fda7b862561ab4c31ec4b185fc3d0ba", - "libraries/3rdparty/lwip/src/core/ipv6/ethip6.c": "548b460688f824015b5b30401cf907828f1dc088a8442d8ee43e4049c1e1401d", - "libraries/3rdparty/lwip/src/core/ipv6/icmp6.c": "59fac03d674da3806b091bc2b285d8276378e3f9ff6ab2cc0c2cbe3241d5e350", - "libraries/3rdparty/lwip/src/core/ipv6/inet6.c": "3f7676e46413586fc3d07438b51c0dcd46bb3ba24644892362cf47f84fc15390", - "libraries/3rdparty/lwip/src/core/ipv6/ip6.c": "2496b4b1f5a5bdcf158141c10a216ec11c3ef0bdc7b01c82eb59cc7c08d6be84", - "libraries/3rdparty/lwip/src/core/ipv6/ip6_addr.c": "fb4be0a5b3b048bc4b9ad1b4a18ff18f56c80c0337bd4a88fcca5f029872f46c", - "libraries/3rdparty/lwip/src/core/ipv6/ip6_frag.c": "762b56b9e8f5cfa47129b74189ee9dcca53f4fa6a8e3c801896fa017185a7653", - "libraries/3rdparty/lwip/src/core/ipv6/mld6.c": "14a863d902369370ba5c66777e6241f6f8a5be5c54892dd8904fdc6daa4491cc", - "libraries/3rdparty/lwip/src/core/ipv6/nd6.c": "ee4f3c86ccd433d502bd405b6dd8d82cb8cd3e38ec49361e980ab95b3371af2d", - "libraries/3rdparty/lwip/src/core/mem.c": "b15257ccf032eca75ab4bc885cd26181120efcc9503912e5505c025f40af20b4", - "libraries/3rdparty/lwip/src/core/memp.c": "91ca3a00487d61849324ae571ac9ede550a879365c557aba38667ace122b6c00", - "libraries/3rdparty/lwip/src/core/netif.c": "f3cdece0a08a768949dcc756c4556d4ce495fd5ed9e571704834996471191642", - "libraries/3rdparty/lwip/src/core/pbuf.c": "1a73a2dba7a2a39571c1a55918eec3a1437568002f96bd59d3d8c85e5c4d7542", - "libraries/3rdparty/lwip/src/core/raw.c": "59a74c74b9ad47da73b1d1f5d64729f6a74d55194022f914e9fbc0acdad922c5", - "libraries/3rdparty/lwip/src/core/stats.c": "a18b76cde437213ca9f00137bdb61adb00f6f931fe28c40c81f811a5e674caea", - "libraries/3rdparty/lwip/src/core/sys.c": "86e336dedec36e042aadaebe93c8be944675210841ccabf180200e82c91b0f8d", - "libraries/3rdparty/lwip/src/core/tcp.c": "1a3629a48a20e647cb795bfe78914d7179d7336bc5148bec69c5d50c2e98cb60", - "libraries/3rdparty/lwip/src/core/tcp_in.c": "66ce1fb10e6d63c2e2db8b1d39149ecc9a20a27fcea53b6d88672d24b8eb86ba", - "libraries/3rdparty/lwip/src/core/tcp_out.c": "f18c88265cbefe20123ecaa30afcb423559805793e8f4a911e50adbd06d6e411", - "libraries/3rdparty/lwip/src/core/timeouts.c": "930bcfaf5b12b97f975fca7b8c2f7ab999cffa37f7c840ea91b340aa4ef62115", - "libraries/3rdparty/lwip/src/core/udp.c": "8e9a31ae52ca28eadb76c131a84d9a84443badcf38eb1dec52473ff5cc578f49", - "libraries/3rdparty/lwip/src/include/compat/posix/arpa/inet.h": "8b3edc25121de40cd1c3338d5d68be93091f0713ee8a23eba9789f14d41e0f6d", - "libraries/3rdparty/lwip/src/include/compat/posix/net/if.h": "b1cc52bb828e7cc23f070269a60a6ea33f3fd828190b0248f4cd589f06fcab6e", - "libraries/3rdparty/lwip/src/include/compat/posix/netdb.h": "ec3cb99596ef6bf11b39870541bf6607a7cff6011cfef99bf5d53f2abed05948", - "libraries/3rdparty/lwip/src/include/compat/posix/sys/socket.h": "8b3edc25121de40cd1c3338d5d68be93091f0713ee8a23eba9789f14d41e0f6d", - "libraries/3rdparty/lwip/src/include/compat/stdc/errno.h": "9fdac7c52c9fe0cfdf50f96eae29c5f341a9afde5a56166d21500c656a8a0728", - "libraries/3rdparty/lwip/src/include/lwip/acd.h": "234774b46c5e5dd152d2374aa6e570201a71662c0b0a940eae1e96f5321f6355", - "libraries/3rdparty/lwip/src/include/lwip/altcp.h": "03f1df1b3e703b4717a272d272ed32b8f0949ca1dd2f1e3f91fdc9d9ff4fc8f6", - "libraries/3rdparty/lwip/src/include/lwip/altcp_tcp.h": "e6b325b516d9e2af49b3187e01cd324066ef2c6508a2d9c06016fc0570148d43", - "libraries/3rdparty/lwip/src/include/lwip/altcp_tls.h": "be69627d2d3809dbb791e89cd551f13b8d0ebfbdfa9ffc3d74a00bf3b9f81ce2", - "libraries/3rdparty/lwip/src/include/lwip/api.h": "39a93870e9151ab0a4a70c007c931cf3b642b0704eee43aa662aba9cb9d14f4a", - "libraries/3rdparty/lwip/src/include/lwip/apps/FILES": "1baacff539b72c79be4fb5491be4963f0103557286405b3b4b4dd3396bdb0196", - "libraries/3rdparty/lwip/src/include/lwip/apps/altcp_proxyconnect.h": "c4b47d012ce46a6aa25d4038ecfe0844b0f3cdfe40e6234d622de298aa48ab13", - "libraries/3rdparty/lwip/src/include/lwip/apps/altcp_tls_mbedtls_opts.h": "7fb4fef6a302f23316bad885be4d108a9227377c00948df5be82c9a49fefb0b9", - "libraries/3rdparty/lwip/src/include/lwip/apps/fs.h": "e99ffa827fe8179b4c14c43e352aa88eb635eacf4c8ae40d227211bffd72f927", - "libraries/3rdparty/lwip/src/include/lwip/apps/http_client.h": "54c304f5f3264f555af454f0e14a7ea8610d7cdf4d1424bb79dd7f5159838bbe", - "libraries/3rdparty/lwip/src/include/lwip/apps/httpd.h": "4a5c1213fe0fd2082a8aed3084f4d282b8c51c3c464d140306cdce0f21c30b9e", - "libraries/3rdparty/lwip/src/include/lwip/apps/httpd_opts.h": "597f594dfe74f60b54f94956e18881ba80001c2717e7a96a73bac41344bbc7fa", - "libraries/3rdparty/lwip/src/include/lwip/apps/lwiperf.h": "ac35572131e102c96feffba4bf2788b841f0d162cde1af3d9b7914e11540b9b9", - "libraries/3rdparty/lwip/src/include/lwip/apps/mdns.h": "f0727b65bc6d136e5bee1c5ac52aeaeebdbe2f79a555d73ec19fe541eca93583", - "libraries/3rdparty/lwip/src/include/lwip/apps/mdns_domain.h": "6fd124cb463e07bf6ee81aa816db0cc86204c739f57e98be2f31691fea9bc456", - "libraries/3rdparty/lwip/src/include/lwip/apps/mdns_opts.h": "fc2060b24e899671a57343e83e2f116a179e64bfe3b83555c01929d7f4eeef37", - "libraries/3rdparty/lwip/src/include/lwip/apps/mdns_out.h": "2bff804ddd536e3b1daa97d6322a5279aac56288851de1f277c9c131f16dc365", - "libraries/3rdparty/lwip/src/include/lwip/apps/mdns_priv.h": "6c7fc358681e2ab448e045651157acf898bcfca72ab28646c375881d2c2971e4", - "libraries/3rdparty/lwip/src/include/lwip/apps/mqtt.h": "2fa1c2440833a82f07a5a362616833372f09a9006c7b099e813a48f12631599c", - "libraries/3rdparty/lwip/src/include/lwip/apps/mqtt_opts.h": "b8bb920a04472488f3fa1371cbb9c934bfead7cc8ba7f06316da4bdb2e354feb", - "libraries/3rdparty/lwip/src/include/lwip/apps/mqtt_priv.h": "e4903b34c12c941650045977e2629d41b1ca8407e48dc28d9ba36382825bb2d9", - "libraries/3rdparty/lwip/src/include/lwip/apps/netbiosns.h": "438a8e5cb80794959e0ebb0989a8d0615dc8d2d737fa97c231b10d4040e8f715", - "libraries/3rdparty/lwip/src/include/lwip/apps/netbiosns_opts.h": "c4dcff3906dc65cbe88d4fd6488f24a4eb1659d11fc7ec8cf7eef7eb3599b82c", - "libraries/3rdparty/lwip/src/include/lwip/apps/smtp.h": "61d670c0c914cc4d39f6c9e4661a1ac5e2b3cdfc45bb972b35cbf7ad3ea3d569", - "libraries/3rdparty/lwip/src/include/lwip/apps/smtp_opts.h": "6f3e0517c42b198078615074a72d8d158304264c8fa56a1dea79636bdd1898be", - "libraries/3rdparty/lwip/src/include/lwip/apps/snmp.h": "ae5a3b816e4920b0cbb4f79bd7b82a1dbc21378c834f15709db32282dccf898f", - "libraries/3rdparty/lwip/src/include/lwip/apps/snmp_core.h": "226888829e92f37f5e34e04f8472c2bc00f16817f41253288b7746eb1afeeb7a", - "libraries/3rdparty/lwip/src/include/lwip/apps/snmp_mib2.h": "dbc21ede7c6c4ac282b845aaf40961993a94b3ddb80a85e8aea66c9f6c5cae03", - "libraries/3rdparty/lwip/src/include/lwip/apps/snmp_opts.h": "fcd7d37a9418f6b25fc367ad1252c193a62915099b5bbc9f6693f0526d915bd4", - "libraries/3rdparty/lwip/src/include/lwip/apps/snmp_scalar.h": "f88ed96f2010bb383af723c50f8e0b93a9a5d566599ef0f35c11102124805c09", - "libraries/3rdparty/lwip/src/include/lwip/apps/snmp_snmpv2_framework.h": "8397074e6d74aceb6430e077537eff4330f6c712d00647a13f2832093a7f9eeb", - "libraries/3rdparty/lwip/src/include/lwip/apps/snmp_snmpv2_usm.h": "ddd777bac19a3f0c6823854f121e52e1c16a9f788540e1f172920b45a01713bc", - "libraries/3rdparty/lwip/src/include/lwip/apps/snmp_table.h": "1d0ef0508b2a00f55e6a90c27d484e526a2db5cde41c13b2aafcc6f2c8d7e25b", - "libraries/3rdparty/lwip/src/include/lwip/apps/snmp_threadsync.h": "cca3712f8a796bc481ca8be54c61407f5be5661acc10c95234ba4c31ef6a4996", - "libraries/3rdparty/lwip/src/include/lwip/apps/snmpv3.h": "7d1be4c7469ae8108d3657433f965c8884e66475178fee2a474fbbf01aee3fe0", - "libraries/3rdparty/lwip/src/include/lwip/apps/sntp.h": "c7b56e4653387585d4d5073c1917f93114027ccae13ef842880441477b471653", - "libraries/3rdparty/lwip/src/include/lwip/apps/sntp_opts.h": "e19e34bbe7f97d3f626b5975d1182771683cec15957b3415d4d674ef9489ada8", - "libraries/3rdparty/lwip/src/include/lwip/apps/tftp_client.h": "afe8265f9b7c7746c5bf86b5a739e1eae6c064c7af7e116959a7b52c66064ed3", - "libraries/3rdparty/lwip/src/include/lwip/apps/tftp_common.h": "76b2fb20cbe1212c6e691e9216ced22cc959f602ce76e0fed06dd3c474fb6f31", - "libraries/3rdparty/lwip/src/include/lwip/apps/tftp_opts.h": "185e13e074f0ca14271e187fe15fbe8411de355d55ec6cd4fbb5b271776f8479", - "libraries/3rdparty/lwip/src/include/lwip/apps/tftp_server.h": "627e19deb28320005781f9052d090aa6fc7d5785ccb0a4315c50beee4180d0c8", - "libraries/3rdparty/lwip/src/include/lwip/arch.h": "eaeacbe7eedb71d3d72ebd50075a3d8658c98a6e3d896626e77fb77bd489a89f", - "libraries/3rdparty/lwip/src/include/lwip/autoip.h": "754d9d41176e55a09124b09fa19fa3bac9b60332fd2d80e05bc03670d8fd2e0a", - "libraries/3rdparty/lwip/src/include/lwip/debug.h": "23a140dd9efdf8ddb8fa3e97697f09670d8d23ea2f1b58f1b45ca639e0f6f515", - "libraries/3rdparty/lwip/src/include/lwip/def.h": "cc272d004c7273c8919ece52759c3142f9a74d0560f15790b698b927020af383", - "libraries/3rdparty/lwip/src/include/lwip/dhcp.h": "f7e032cfb3cd931b73205069fc4cd42ff9429fe9a4f6c5175e1dcd4e89a07209", - "libraries/3rdparty/lwip/src/include/lwip/dhcp6.h": "dbac3f610e3e76547691af73a667bd5fd6564a7fbfa5ac382ef77604938d4afa", - "libraries/3rdparty/lwip/src/include/lwip/dns.h": "962c462c90afd41ed010b961f539c11b2baba3e8a6bfe584f331a5e4d43c1b05", - "libraries/3rdparty/lwip/src/include/lwip/err.h": "af26b573fc5c6a31877fdcde35e15382ac0c8b01f35af3f5a4429f9cf5dd323d", - "libraries/3rdparty/lwip/src/include/lwip/errno.h": "79dc6e03887ccf301e01a5129d1a732e21fb05308a8e38f04ada44e0928c075a", - "libraries/3rdparty/lwip/src/include/lwip/etharp.h": "bd50bec728d92dbd790a1504e52f42e4e1bdd018380c2b116f0dd8d3ed44e3f9", - "libraries/3rdparty/lwip/src/include/lwip/ethip6.h": "7a7e744ae373a720261be3651adaa0f35ff00ebb1bcf38e5330e371ddfd162b7", - "libraries/3rdparty/lwip/src/include/lwip/icmp.h": "84f63c9fbc6f6d66ef437f834279c25c20bfa78834eb0ee347c70377f7f8d8c8", - "libraries/3rdparty/lwip/src/include/lwip/icmp6.h": "f790cd444ecbe2e605b2f1a1deab3e6e9662ba6e87fd47b401912c5a118ee836", - "libraries/3rdparty/lwip/src/include/lwip/if_api.h": "6f6945cccbf0721180ddc7ff589d9f7b47f825ce62ae8b3cf6c186f5d2750822", - "libraries/3rdparty/lwip/src/include/lwip/igmp.h": "abf5ff1e19ec61690b6e8d55c8ee11afd1556b77c8b0fc452d5eb490810cc27f", - "libraries/3rdparty/lwip/src/include/lwip/inet.h": "2b8eb02e6708f3725d8c09967d316940ce82fc5e05042b9ce42e2d0530fe17c3", - "libraries/3rdparty/lwip/src/include/lwip/inet_chksum.h": "df6720f78e47afde2315d6a9dee1bb5b26f76692ce3e040c574409493435c933", - "libraries/3rdparty/lwip/src/include/lwip/init.h": "0696eeb90c80b8e1e47c03a90de54f25a116c0a93a2c0e6118ad68d427eb365e", - "libraries/3rdparty/lwip/src/include/lwip/init.h.cmake.in": "38df819f1ae753f240e9adb27398c14d6cf3e2e9065547a8ceb7694a9d132216", - "libraries/3rdparty/lwip/src/include/lwip/ip.h": "8b27813c2810b0564585ec06b1e1124f7dca28436c64125df15d496b1bf5627e", - "libraries/3rdparty/lwip/src/include/lwip/ip4.h": "188a62765c765fb07cda26a695f17c9c1674c0da7539c71e4d8f79b3f6f6ba21", - "libraries/3rdparty/lwip/src/include/lwip/ip4_addr.h": "373faa87a644cedd25874acfbaeea0349b34448fc2dafa5d0853d945e46a6fe8", - "libraries/3rdparty/lwip/src/include/lwip/ip4_frag.h": "8b0bb67655cba6da8cddc360e655c711553ad35e6306dbae618637e80be9911c", - "libraries/3rdparty/lwip/src/include/lwip/ip6.h": "7681c2948f700aa565c387ca20654f7322991ca15de7fd4e8f342a8ce44abe57", - "libraries/3rdparty/lwip/src/include/lwip/ip6_addr.h": "1dbc5e8ddd4c379303d4a3416f628063f0814814d365cc20dad5d89e0baa4070", - "libraries/3rdparty/lwip/src/include/lwip/ip6_frag.h": "3ab1bdb9220a3c87c8187fb26b1150cd03c4401b0a0c6db2ea4a22674141dd3b", - "libraries/3rdparty/lwip/src/include/lwip/ip6_zone.h": "951a5aeae08562dfc4a3bcc72de9952ac0045126a1cef9eedf9c6881ecb91a03", - "libraries/3rdparty/lwip/src/include/lwip/ip_addr.h": "9c309963b0679348d102e23665ced46740dda427dc23916d6f0434dd6170ae0b", - "libraries/3rdparty/lwip/src/include/lwip/mem.h": "416f961f338a0cba460494ebfe2527b7cc1fc5c18f489711e66af7dd76b7a223", - "libraries/3rdparty/lwip/src/include/lwip/memp.h": "79dfd019219330cf08deb1360483eb7d1da7a1a7a304034ef65ad52feefba1ef", - "libraries/3rdparty/lwip/src/include/lwip/mld6.h": "026348d23012aa1c2210ae53f2a5ddf3a273cf004ef597a1861266a01d4ca86e", - "libraries/3rdparty/lwip/src/include/lwip/nd6.h": "79fa57b4bded6763d38f5e4fa56aa2fac8117bf76ffc69869e05357af88951d6", - "libraries/3rdparty/lwip/src/include/lwip/netbuf.h": "1aa92014d8919c5073b5123c92881e00b0c507ca485667ccdebbf31afa214ff3", - "libraries/3rdparty/lwip/src/include/lwip/netdb.h": "582518497fefd57cd1d227947965c71b1dc16846add471af0fddfbb461c7aca0", - "libraries/3rdparty/lwip/src/include/lwip/netif.h": "cf6f1092f7c2748ae5aac89952e3a88903d43efecd040c9b479ba633386bf971", - "libraries/3rdparty/lwip/src/include/lwip/netifapi.h": "2c087eac81246ac74e3ba2c3922de0612890587f0cca7c1360f379a57ab45518", - "libraries/3rdparty/lwip/src/include/lwip/opt.h": "e411d94f8f45ea91aafec5e6ecfa198ad579e704de5a9e553e17f9a161584fd1", - "libraries/3rdparty/lwip/src/include/lwip/pbuf.h": "a4c632569405474706546d58f4ff044abab958e3fbc9d479f637066022f37d7a", - "libraries/3rdparty/lwip/src/include/lwip/priv/altcp_priv.h": "8b1c271129eea8f8d125ee8e653e143d5099683c2fddb9bc64524fcfdadcabd1", - "libraries/3rdparty/lwip/src/include/lwip/priv/api_msg.h": "e2458063868f0813bc26f41709bbf78d994760e72667b646b88f15e16e235f48", - "libraries/3rdparty/lwip/src/include/lwip/priv/mem_priv.h": "c90c9b64c8ea95c05d5b8b10d706acb53b6cc124166e8dd85b397698679f7920", - "libraries/3rdparty/lwip/src/include/lwip/priv/memp_priv.h": "37aff2894bbe25f1888e43b96be80f4c1a43a24867c0fc9aceb4093328682937", - "libraries/3rdparty/lwip/src/include/lwip/priv/memp_std.h": "86cdf1d80f2716a07011dc763e5fa614cd2b555382cb7d6750176116def67a0f", - "libraries/3rdparty/lwip/src/include/lwip/priv/nd6_priv.h": "0cd4756c17109d6d01c07ef35cbc527954a1cd926065432a715578590b8dfddb", - "libraries/3rdparty/lwip/src/include/lwip/priv/raw_priv.h": "0b2b019a55fab8eed89d668f13402778835117fe472464046472cd04b93c2bb2", - "libraries/3rdparty/lwip/src/include/lwip/priv/sockets_priv.h": "2efcf39c42b1a7055628461915d42521a4df3cb285b6f5635a5c6a961aff4f93", - "libraries/3rdparty/lwip/src/include/lwip/priv/tcp_priv.h": "547929dbf334d846444094ecb363680bf90320b198ac1e49027fda4049c07233", - "libraries/3rdparty/lwip/src/include/lwip/priv/tcpip_priv.h": "13fb2e7159ebcafc4ddda4961a9d70b2f8182f9e201aa990cb9148d8897bf598", - "libraries/3rdparty/lwip/src/include/lwip/prot/acd.h": "25ef5a9bfe37edbe5fbaed0a985c2ac0b4e928cd90b69941b46c533e7765cf7b", - "libraries/3rdparty/lwip/src/include/lwip/prot/autoip.h": "a0b78c818f6642e68c1d9c0b5c3ad12fc6595b66ac5ae41724c52decc6de760c", - "libraries/3rdparty/lwip/src/include/lwip/prot/dhcp.h": "bc74edb6abff7b5182e04e2e588292401ecba3875bb6673156b026a5c391dbc4", - "libraries/3rdparty/lwip/src/include/lwip/prot/dhcp6.h": "72c645a6153694229ca535f044af2d1520ebc7860baa98121747218a08c2b74b", - "libraries/3rdparty/lwip/src/include/lwip/prot/dns.h": "34049c0f7f489aaec12d0589dc51ecfb24408dba422f605d8deb207c44d02b8f", - "libraries/3rdparty/lwip/src/include/lwip/prot/etharp.h": "55164c0d047f1279982fef9681491c8811f8482976aff7fab9b63a9a589ded76", - "libraries/3rdparty/lwip/src/include/lwip/prot/ethernet.h": "42fbc05a563d3ad242663b7d82601bbae6c6d9c16a6da5b35b51a02799206303", - "libraries/3rdparty/lwip/src/include/lwip/prot/iana.h": "745c2d70a5d4839e3df5a34f7e37b83bcc7fe58f39eba1d2f5e238242d74c878", - "libraries/3rdparty/lwip/src/include/lwip/prot/icmp.h": "931d46a3e775efcd6076263e23eb564b612913b7c11f7b5d009e94fefeb20f28", - "libraries/3rdparty/lwip/src/include/lwip/prot/icmp6.h": "8d3bcb5d37b0ad3f73102ed2ab3c2b52a42492508d012d41d5b2233827232fdd", - "libraries/3rdparty/lwip/src/include/lwip/prot/ieee.h": "ec85a505aba178178743b34429f463a41ac43d3750d63901c7e1273dcd0a2ba6", - "libraries/3rdparty/lwip/src/include/lwip/prot/igmp.h": "9adb3a0b03feff302b057020aa860fd958f6ef4528225014c104bd4175ebdff7", - "libraries/3rdparty/lwip/src/include/lwip/prot/ip.h": "eb5371e5ac58467253d813bc58726e317f91abadb10336497de0d64645ec01cd", - "libraries/3rdparty/lwip/src/include/lwip/prot/ip4.h": "033570c0b7657f5475959f7b74d9e23c6f8e81498495d5b23d8c2eeb0640d7a7", - "libraries/3rdparty/lwip/src/include/lwip/prot/ip6.h": "c0514e97f153f2e5cf514e6f1f4350fd2cbcb7073ebc05495b436c638bd32109", - "libraries/3rdparty/lwip/src/include/lwip/prot/mld6.h": "9601cee67b48c4b7cadb75caf3d83c05f5409d367341af70af7e7e4f46f173f8", - "libraries/3rdparty/lwip/src/include/lwip/prot/nd6.h": "50cff239fdb433defe12f7e35c4f2964e42ad7bfeab15d3b274a59142c4d558e", - "libraries/3rdparty/lwip/src/include/lwip/prot/tcp.h": "db67bb5ea0517a8cd9e30ebf655743f69ce05e77ca6e4a113e8c60e69bd7c48a", - "libraries/3rdparty/lwip/src/include/lwip/prot/udp.h": "b56daa8ff1e8e52cdd4f720297f07af2a96feea254db86768e20e157d7ce2784", - "libraries/3rdparty/lwip/src/include/lwip/raw.h": "e9efc60e31f2ff39a98b1367968ac724fc91ecdc115a74fc44813b761f02caf7", - "libraries/3rdparty/lwip/src/include/lwip/sio.h": "b6555ae90164d0b66e2772ec3444ebba0133927e4f47b512b570819b66912ce3", - "libraries/3rdparty/lwip/src/include/lwip/snmp.h": "1f90da65829c29545e9562ce5355d1799ea36cd901ed8ea9faa8e1ef3d7c2ece", - "libraries/3rdparty/lwip/src/include/lwip/sockets.h": "7962d403d886cc9342ca66f4696bcada1bf2ee4c49e1cf7196f8525710368cf2", - "libraries/3rdparty/lwip/src/include/lwip/stats.h": "295e3f2f9be188c05a90c2bb7e57a250a07e5ca7c54bdd31a50309da82cc5874", - "libraries/3rdparty/lwip/src/include/lwip/sys.h": "8ae6002810cddab1b112cbe886f331f5019c8bd43d98446f644621ef907f9f60", - "libraries/3rdparty/lwip/src/include/lwip/tcp.h": "eb514477b21ed78dd4d527f4aea3bed5585200e285b85c666689b9c43b77a89a", - "libraries/3rdparty/lwip/src/include/lwip/tcpbase.h": "cf4b048f3bc228ab364cde15eb6be5eca961fab09036c699c2c4b1437ab90aff", - "libraries/3rdparty/lwip/src/include/lwip/tcpip.h": "c772dbff8e46a86ffa65ec62e5b304e75525b6bcfef94917fb7de1045449f603", - "libraries/3rdparty/lwip/src/include/lwip/timeouts.h": "a383b43e3ba021d06ff3791d223db46cb3385e8dcdfcec0221ef2a006243c022", - "libraries/3rdparty/lwip/src/include/lwip/udp.h": "f9783bca6b68b10c229185559e0ae7e79bb793e1d6c244c7b26408516187f1f8", - "libraries/3rdparty/lwip/src/include/netif/bridgeif.h": "39d409d880187e2a7b372ddae2b1cfc004b88a0dd786dbe9070945420b8e42c8", - "libraries/3rdparty/lwip/src/include/netif/bridgeif_opts.h": "bc6e5f0677c621a5a8adb315e1cdb06210e1391efea6d308684103fd38edfe66", - "libraries/3rdparty/lwip/src/include/netif/etharp.h": "2e1ab81eced65420cdee5940d2e547cae7b0fa70088f452692363676ecfc66dc", - "libraries/3rdparty/lwip/src/include/netif/ethernet.h": "1dd88263e583593e47f7c891680d67838287160551b8c06562c9feca1ddee443", - "libraries/3rdparty/lwip/src/include/netif/ieee802154.h": "02f21d8b3e143fa77d8fa3f0d3db9ac1683507436ab441a61d5012ddb6037699", - "libraries/3rdparty/lwip/src/include/netif/lowpan6.h": "538ac2429cedf9193b6538998f3ba5bdd003fbf0840fd03b46d4ad5bcfaa4c20", - "libraries/3rdparty/lwip/src/include/netif/lowpan6_ble.h": "5c40e2a9640810cebaa8a0e501913cae093368da21f1226e9476b078f34f247f", - "libraries/3rdparty/lwip/src/include/netif/lowpan6_common.h": "eed0a8f45ea6e62ba4238d6bc139a1bef5fe625ec7527b52856fbf885c12f8ba", - "libraries/3rdparty/lwip/src/include/netif/lowpan6_opts.h": "fc57628292ff0ccece9770a9c101b992f350c55088af2bb364246fbcf6f3f024", - "libraries/3rdparty/lwip/src/include/netif/ppp/ccp.h": "b6e681ffe6855a6772c6d0a9077f144676c30db0c9ec0ea461e816f7647d6d43", - "libraries/3rdparty/lwip/src/include/netif/ppp/chap-md5.h": "f67cd93664262575ded862c17bac7c1003e2eb690224b89ba2b0cdd221c2f725", - "libraries/3rdparty/lwip/src/include/netif/ppp/chap-new.h": "f7bfb4e194fedcd1e6d499320826ecca7f14add5170c8fb7d4832b8e831bc2ac", - "libraries/3rdparty/lwip/src/include/netif/ppp/chap_ms.h": "77316bd6366248a0d0715e19e231667c1564f3ef081dc3ba839cd673a5d4984e", - "libraries/3rdparty/lwip/src/include/netif/ppp/eap.h": "42589e98b4ff8470c0e9a1cecc45fa30e79e2c1c3452fc46e2a88b6ac617dfe8", - "libraries/3rdparty/lwip/src/include/netif/ppp/ecp.h": "4936fccc29a900ced5b67906f97f192ea634642b6a003605dc1cb40d65d011f6", - "libraries/3rdparty/lwip/src/include/netif/ppp/eui64.h": "fc79081c31fd7333b0e2b3cf61c870727a3b066d82482c894b02c81cdbf464c7", - "libraries/3rdparty/lwip/src/include/netif/ppp/fsm.h": "8751104f5cdeb3ace720744016431ee2d704983e8a94de7add0830e63dfdef0e", - "libraries/3rdparty/lwip/src/include/netif/ppp/ipcp.h": "60bb47d15951954c865393be49b64f6daecc966f7146aeee187530a111d9008a", - "libraries/3rdparty/lwip/src/include/netif/ppp/ipv6cp.h": "69de1cc233f9ec05312a6cd4d5b558d91d04e39626ad6f9e0fbc4ee61a5709d0", - "libraries/3rdparty/lwip/src/include/netif/ppp/lcp.h": "0278457347c50aeaa4636124d0265fb8064511f461de2b3ff7fa51e3dacb0345", - "libraries/3rdparty/lwip/src/include/netif/ppp/magic.h": "b19a254f135449982830685df31b948e0d5c7e44ac5875efc8d1a3ef20a3aff7", - "libraries/3rdparty/lwip/src/include/netif/ppp/mppe.h": "8dd28c994f67ca45b11586ecc195fabedd5d51efa0bd99872336d82886477c9f", - "libraries/3rdparty/lwip/src/include/netif/ppp/polarssl/arc4.h": "970bc9075bf7aef36f4a225ba8a3dcb89c16a1948016f3521ca4a7609b7ba284", - "libraries/3rdparty/lwip/src/include/netif/ppp/polarssl/des.h": "f0a3ea812ead16f7d8fba08115429b5bd7deed1d9ffc6dddf66ec44b1d95ef0a", - "libraries/3rdparty/lwip/src/include/netif/ppp/polarssl/md4.h": "d1982ff627c1176d03c60fa8ae307af09626a2655e08525a146019276edb9058", - "libraries/3rdparty/lwip/src/include/netif/ppp/polarssl/md5.h": "1962ff0d88f8a7efbb6c8592eb13154129cfc7012c8cc22be7981df35e3c8ba4", - "libraries/3rdparty/lwip/src/include/netif/ppp/polarssl/sha1.h": "2951ad6ae5b5797112ae1899cd814536c445334bf59cbd91bf5414db0613980d", - "libraries/3rdparty/lwip/src/include/netif/ppp/ppp.h": "58175d5f9fda4d88bdaab4f1da12da692dd9e732ee0c51d94319b3461edd01c2", - "libraries/3rdparty/lwip/src/include/netif/ppp/ppp_impl.h": "9a216f46049edfb333551cb4e7213ad537b0570c3211f0029b32bcd0c39cf62e", - "libraries/3rdparty/lwip/src/include/netif/ppp/ppp_opts.h": "ea99faa10a07d3e414696465ca06ba420c585cb9a683e20e8f3f24f80e03fe5c", - "libraries/3rdparty/lwip/src/include/netif/ppp/pppapi.h": "f1520293792605ad0f0c78c93a5907d478affbebea8d6be1b0f8a8bdc9c4b427", - "libraries/3rdparty/lwip/src/include/netif/ppp/pppcrypt.h": "954943c6c1286c707c0f1182428eb514dc8cf87a704a4e8f26a926553f260d58", - "libraries/3rdparty/lwip/src/include/netif/ppp/pppdebug.h": "fab025981023c13721fac50978c5416ce2c9a0f40db200ef78ce4cd36d3b9b63", - "libraries/3rdparty/lwip/src/include/netif/ppp/pppoe.h": "fb57591c5679950f4af58b17427271aa3554b9f8e49cc59d913f79de0bf07363", - "libraries/3rdparty/lwip/src/include/netif/ppp/pppol2tp.h": "ae9a819aaf816ae4ff25c35bddaf7c10654a54b95451b247fd5d2824229d3cf7", - "libraries/3rdparty/lwip/src/include/netif/ppp/pppos.h": "c225fffa8f85bc170992cef05d8d7350c86d2b3ae3d55951d71e35c9fcc2390d", - "libraries/3rdparty/lwip/src/include/netif/ppp/upap.h": "7cf555545ed20e7d7897ed935c6333e77d629b1862e4e2136df87ebebfcb3907", - "libraries/3rdparty/lwip/src/include/netif/ppp/vj.h": "d6c9da89224974d8486dfa0082ecca0d487715df65a37088db55e7e51c745a14", - "libraries/3rdparty/lwip/src/include/netif/slipif.h": "f58cc6842251be4358904b2475021fc2da592de3756fbb358b615b0173efd791", - "libraries/3rdparty/lwip/src/include/netif/zepif.h": "7b3a4c9094483c14eb3c4da651874aca325e3927fde02eb28e226040deef4714", - "libraries/3rdparty/lwip/src/netif/FILES": "10564ef1c25f4ca37518cc705b3cb27b206cfea82db6a9601ad416aeffe560dd", - "libraries/3rdparty/lwip/src/netif/bridgeif.c": "863a91f68fad44e603ead49d9398b1ffe3137588324c762fcb332c0e47ba85c9", - "libraries/3rdparty/lwip/src/netif/bridgeif_fdb.c": "dcbd424f88425943409f2aa54a93fa09afa19473444d005a6bdbe3aad85503f5", - "libraries/3rdparty/lwip/src/netif/ethernet.c": "e1c1b7ceabe5ab707e6cea7565384fad597c1035ff17883a8a8ff443473f89d3", - "libraries/3rdparty/lwip/src/netif/lowpan6.c": "895c236b64b09f113ee6b5b1513df69005a4405d8fa403df9c31b73080912cca", - "libraries/3rdparty/lwip/src/netif/lowpan6_ble.c": "813e98990f440b14ea66282d1b490447812b66268ecda7097a265a6ec78f5ef5", - "libraries/3rdparty/lwip/src/netif/lowpan6_common.c": "94372df9235c9fe1b08778c3c31234181e27d16e60e7e542d7005181108a7fe6", - "libraries/3rdparty/lwip/src/netif/ppp/PPPD_FOLLOWUP": "d4e0485a2936de3201dca8dc10068534fff399f8eadbd31684f36babc4b094b7", - "libraries/3rdparty/lwip/src/netif/ppp/auth.c": "fe2afed36bdba441463e4e5211395614e9d7685eb1760d5d84137baf58a42dc7", - "libraries/3rdparty/lwip/src/netif/ppp/ccp.c": "88165e63b1a7b6c56f4e952544a2375c6033ac4c2e0ec4779d145322d951ee94", - "libraries/3rdparty/lwip/src/netif/ppp/chap-md5.c": "9f099cddf6fa7931b962fda6dc1d1df5eecf8c94881eda29a63d1abafe317ec2", - "libraries/3rdparty/lwip/src/netif/ppp/chap-new.c": "658070df33b3242b150efce6059a9998c15f5f9192ae06b4cd5e7cffa55384a8", - "libraries/3rdparty/lwip/src/netif/ppp/chap_ms.c": "d3940e2add91c8a721b32f1e04bbc88add012d7146dda03744608f31ba6666ec", - "libraries/3rdparty/lwip/src/netif/ppp/demand.c": "b07dc6e971fffe70cd73f4ff6733655989e34dbee3fc6c2dfa164fadb6578975", - "libraries/3rdparty/lwip/src/netif/ppp/eap.c": "74d26511e05f8b39b4b5fa04722da2bb620e661ec630a5c8d7cc433b5bef702a", - "libraries/3rdparty/lwip/src/netif/ppp/ecp.c": "b6736696754a289ea5464f7386d05790365b873c0ed0123692bebc4ebb18e6eb", - "libraries/3rdparty/lwip/src/netif/ppp/eui64.c": "531be9bfa9c33e0abc4452b976ca4ab60f8f0ecc92d9af91121551250810cd4b", - "libraries/3rdparty/lwip/src/netif/ppp/fsm.c": "fe71b4b142a07c13ef69ff3e344ee3508b44c0471a62c47ec6ec585f250fc940", - "libraries/3rdparty/lwip/src/netif/ppp/ipcp.c": "9ea7ec074416030a39589392d62adc451ab2c78c61c506cec7674436f085fa90", - "libraries/3rdparty/lwip/src/netif/ppp/ipv6cp.c": "707b3687113f9e8fdf4230a1a750be60aa05deb081e0ece81317cd49b718831f", - "libraries/3rdparty/lwip/src/netif/ppp/lcp.c": "dc39acf562d7df70fb1eac8d7f8218dfb9d592498638325e9fcd4d206f97eb06", - "libraries/3rdparty/lwip/src/netif/ppp/magic.c": "aad196f6945d3b80b158b5011d4eb216a3e1766b73abcd9c19728bb8b8e3e3bb", - "libraries/3rdparty/lwip/src/netif/ppp/mppe.c": "f209f08e59f0e9ed5d4b736a7534e6c0df726b2d14cac07dee311017fa2a0a41", - "libraries/3rdparty/lwip/src/netif/ppp/multilink.c": "78920d813d0b638e287e5f15527886cfd53d5ea9a61cb6b325b6f8b3841e4bc5", - "libraries/3rdparty/lwip/src/netif/ppp/polarssl/README": "242dd0f7c45dd7fafc37e2caa4b1e0609e1cd9a61512d7772d58c41f7a7e7c95", - "libraries/3rdparty/lwip/src/netif/ppp/polarssl/arc4.c": "7d844ec4f6e88a788e17419d4525a07611851fe793e0bb52c7e24a1db5d2d6df", - "libraries/3rdparty/lwip/src/netif/ppp/polarssl/des.c": "4b2c48659036ad89adb2d08a2b54dc30fba73759a6a5ce810e9c794f7b4aacf4", - "libraries/3rdparty/lwip/src/netif/ppp/polarssl/md4.c": "9110b56e9b926edf560933b76d1bb1ca7e9532134773ddcb04bbd57db646e209", - "libraries/3rdparty/lwip/src/netif/ppp/polarssl/md5.c": "9bd07f764f9104538474c69838de131538f0a500952b8b24f32b758e23d91b4d", - "libraries/3rdparty/lwip/src/netif/ppp/polarssl/sha1.c": "844114b4c45f689aaef64df2bf8b445e6dcea9c52bb4cb485c18d0fb68e04d5b", - "libraries/3rdparty/lwip/src/netif/ppp/ppp.c": "c585c38d73eb2a2c27905acbc553acfad2d267e95e921f34295d2c344da677f4", - "libraries/3rdparty/lwip/src/netif/ppp/pppapi.c": "269bade48fe467119d59b3c33f8f42423c1b162d9e4cdb4c4da36bd87bcbd246", - "libraries/3rdparty/lwip/src/netif/ppp/pppcrypt.c": "02b12e7626078be9591237fe84ae000514a2cfd6f0653c890b7b75ce20cada8b", - "libraries/3rdparty/lwip/src/netif/ppp/pppoe.c": "7d658e3a24ed904c9ad9d393eb890f31326ae1fe8411ad7a036a0550e635fdbe", - "libraries/3rdparty/lwip/src/netif/ppp/pppol2tp.c": "18e83285eedf633c840db6a55077ce2cc902f19ab143c323c659c85ad25b8695", - "libraries/3rdparty/lwip/src/netif/ppp/pppos.c": "aff653829d77edb3e2ee197f1e4b3ff5e392e2f8e81a09a366576ab77a627e0d", - "libraries/3rdparty/lwip/src/netif/ppp/upap.c": "6944042740a916f6375d57437803e65839efbc901ebbb6cddc42c0a22c1eb33e", - "libraries/3rdparty/lwip/src/netif/ppp/utils.c": "fbc12cf311073c72d872ad5b382133c69144100b720c222e5331031ab30b6cec", - "libraries/3rdparty/lwip/src/netif/ppp/vj.c": "f70c1ac07ddaacf59f6b7ad28b1b657d645c5357ad8c4a7c449157d186fabefa", - "libraries/3rdparty/lwip/src/netif/slipif.c": "6e33b2aa2794b9baf67e8776b2c6e61b5e92725ee679067a71494dcb00071f34", - "libraries/3rdparty/lwip/src/netif/zepif.c": "374cbd2d942ed680a66bf6f36080ba2e7313bcd037a3380d6a7a53dfa3d75099", - "libraries/3rdparty/lwip/test/fuzz/Makefile": "0276ff5837ca4fe0178786ff2b1e1ec1c1ded76116c1800be97102c55780b3e2", - "libraries/3rdparty/lwip/test/fuzz/README": "e0aa244211046d73ed11c7150a8429b020f7ca958f4f45e61bdeb41c27663d2c", - "libraries/3rdparty/lwip/test/fuzz/config.h": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "libraries/3rdparty/lwip/test/fuzz/fuzz.c": "743d5ae304d1fa2f1e93fc858e2f97c8e822c266a236cc104b9dbb567fe1c98b", - "libraries/3rdparty/lwip/test/fuzz/inputs/arp/arp_req.bin": "90136462593149d9a7367a3ff8224baed060c562464aed70fd73a3a2eb56e054", - "libraries/3rdparty/lwip/test/fuzz/inputs/icmp/icmp_ping.bin": "8b136902714d3318066a465c6bbb659fb53290ffde7b4e44ce91cb51f8457cf3", - "libraries/3rdparty/lwip/test/fuzz/inputs/ipv6/neighbor_solicitation.bin": "2c4c8e93785f654e678a9309d7f8f142df493b5d923fc1d9770da99143e7166f", - "libraries/3rdparty/lwip/test/fuzz/inputs/ipv6/router_adv.bin": "efe0fa3a120d28ef1f8242fbf6e32722f072922cdf323268c7563c6f553192f1", - "libraries/3rdparty/lwip/test/fuzz/inputs/tcp/tcp_syn.bin": "f45051b6f9215e7c539982b1f3ada384c5d87da7f98aabc891c4aa069cc8fc73", - "libraries/3rdparty/lwip/test/fuzz/inputs/udp/udp_port_5000.bin": "1f061bca04aed291a4cc2212f925804c59fa1f0a4057931ae1b909b5723e27d7", - "libraries/3rdparty/lwip/test/fuzz/lwipopts.h": "f172aa424517abfffe32d789948126d4af82c588e7528d3f81a118ba32f4e103", - "libraries/3rdparty/lwip/test/fuzz/output_to_pcap.sh": "3ada800dd24ae2cf4cb41f0065aca8a78c29c6ae21271129ad8fe8fcf7f9dd25", - "libraries/3rdparty/lwip/test/sockets/sockets_stresstest.c": "a4f9ef34fa16d6afc0055ea68aeb9224ca2d0702adac56ec3dc0523544e4cb0a", - "libraries/3rdparty/lwip/test/sockets/sockets_stresstest.h": "b0f0b91e41ad2f86fbb0c889d9d0d38d6a3bd258d2dd5e0a3c5ac8a1ab7ac024", - "libraries/3rdparty/lwip/test/unit/Filelists.cmake": "3320870eff853e33d137578eb6fbae190e4e45b0fcef6f67ca30a881f569c00c", - "libraries/3rdparty/lwip/test/unit/Filelists.mk": "161801b0b6cf9decd2b2715e8d52e4697c6e969bb2e0cc95020eb233817429d4", - "libraries/3rdparty/lwip/test/unit/api/test_sockets.c": "57c81dfc3d13443232a95eeb4bbf7c8015b420e2e234e3448cfa747d798540a9", - "libraries/3rdparty/lwip/test/unit/api/test_sockets.h": "a9d4ea42dfdd6b976481eb6924b07f296b07c664ddf001b279609c7ffdf4e753", - "libraries/3rdparty/lwip/test/unit/arch/sys_arch.c": "b2e5944a75afb79466b993bccb2b554889ee9a1a48c0117749972199fca548e6", - "libraries/3rdparty/lwip/test/unit/arch/sys_arch.h": "8620ba7c2497f07926dd9b829753027ed477029e101a2c36079e506442b9e033", - "libraries/3rdparty/lwip/test/unit/core/test_def.c": "9df928c75ce8055b16642f53435a8cbcde5821916a3012e66caab98f305b9ebd", - "libraries/3rdparty/lwip/test/unit/core/test_def.h": "60e5dd455f893eaa2365fd2c5ad01d7adfcbd6ae4459a975a9abcb1e54746db4", - "libraries/3rdparty/lwip/test/unit/core/test_mem.c": "6f3e9d6a5c2e79b87d49bf17b068ce9f9965adb17be74355e25ac843b5f0ca1d", - "libraries/3rdparty/lwip/test/unit/core/test_mem.h": "54e2e3a94257fdfdbb31dbd686aff96032976894f9002188c3817f14d2ca1d00", - "libraries/3rdparty/lwip/test/unit/core/test_netif.c": "034ce07a28143aa81f6472f5ef8b22bab2d1dc3b358c8b831104a67ac1306593", - "libraries/3rdparty/lwip/test/unit/core/test_netif.h": "66ea5e6b4b2d405fa9492f044eb84e5043c399919b8b6b06d712e7ef5750e791", - "libraries/3rdparty/lwip/test/unit/core/test_pbuf.c": "7b3da0e82a0b44414c30e65a5c976ae58f57cbb01c7c7011fe1af3298e7543d9", - "libraries/3rdparty/lwip/test/unit/core/test_pbuf.h": "5eb3d4655112e690f0f1ccf1f7e7dcdde85a87d28fc903a1d89c8df14e738e73", - "libraries/3rdparty/lwip/test/unit/core/test_timers.c": "ab9cb9ebb9c1fbe4970a11453dfa1f29bd5fd90dc93b8561135713eff9394424", - "libraries/3rdparty/lwip/test/unit/core/test_timers.h": "56be4e53bb381b3fa2b9a28c57bbdfcdec04de3b441636b6688345198a42d48c", - "libraries/3rdparty/lwip/test/unit/dhcp/test_dhcp.c": "bed979fae13fc0698800b0b31d40c549175d60911aabc676793b85774421d022", - "libraries/3rdparty/lwip/test/unit/dhcp/test_dhcp.h": "8a2dac3d647bb143830666306cd87761c32f2ff033e11a58faff86a8e9a09a41", - "libraries/3rdparty/lwip/test/unit/etharp/test_etharp.c": "6b03c7393a9fae73ea757dc979cebea892c6367385a6eeb460f55085802d9b0f", - "libraries/3rdparty/lwip/test/unit/etharp/test_etharp.h": "b146eedd105d24070de6c9c42520120922cec7ed31e1b7c93305b471b9f9dcd8", - "libraries/3rdparty/lwip/test/unit/ip4/test_ip4.c": "f71eafadc1ebd8bfd90c5bec2cec9b423c838933e35212ddc25574935284269c", - "libraries/3rdparty/lwip/test/unit/ip4/test_ip4.h": "7638fa112bc0b0557aa87f5877b86d60c08a6675e456c834d67a579e9d8b372a", - "libraries/3rdparty/lwip/test/unit/ip6/test_ip6.c": "7f8add480419442841f8de72abe1346a2810d7e13cb0fea777b48154e3ccb6f9", - "libraries/3rdparty/lwip/test/unit/ip6/test_ip6.h": "1f4d745b8767e8f376e7b54a5b732e8ab4a19c1327b9484f25989159eb0a7320", - "libraries/3rdparty/lwip/test/unit/lwip_check.h": "9891cac2ce125e4e9e9459fcb9508bb58c6d0bed1caefabb188745230b9d4dd6", - "libraries/3rdparty/lwip/test/unit/lwip_unittests.c": "34718e3db1c2787ff462b5b64795c08b3d2d5f196f2ace46b041718ccecaca4b", - "libraries/3rdparty/lwip/test/unit/lwipopts.h": "143de1b8d885467b9690cc0756433b1a5b91150267922c997dc61492ed7a213c", - "libraries/3rdparty/lwip/test/unit/mdns/test_mdns.c": "ba2188e3d21678d88453e29a6c3324bb41f8aff218cb75283ad8673c702e4448", - "libraries/3rdparty/lwip/test/unit/mdns/test_mdns.h": "4226b64bfb4d48147cfa72df6dde6be9bd4a8e5e6a8e9aac8969840bdb9f87a9", - "libraries/3rdparty/lwip/test/unit/mqtt/test_mqtt.c": "491b11cfe15ec6a201d335cb0c07e70775793adcfb8d5966e1272dce389453ab", - "libraries/3rdparty/lwip/test/unit/mqtt/test_mqtt.h": "30cfa02308c9535517042384f8d15a0024760fd953d232e6562c99c8270fde92", - "libraries/3rdparty/lwip/test/unit/tcp/tcp_helper.c": "ad57ad66ed726f3aba92dc745b97fc5bca83ded304a4b3b2e41d22ab1bca9b21", - "libraries/3rdparty/lwip/test/unit/tcp/tcp_helper.h": "11f779ec9985e65d1048d4dfed44e3ea322aab50d720ac428be4d515e2850f52", - "libraries/3rdparty/lwip/test/unit/tcp/test_tcp.c": "486e68152c03aa0470e3a9c650e7a683cef328721d402b5af5c8f72cbd019b16", - "libraries/3rdparty/lwip/test/unit/tcp/test_tcp.h": "831ecc56ea4f5d6a4af9ae1e38fececcce696a51557c4a88618ca935fdac9690", - "libraries/3rdparty/lwip/test/unit/tcp/test_tcp_oos.c": "eed061425068f48f097378a46a36e1a10a9371e0bc0dba9de3880b15803e82c4", - "libraries/3rdparty/lwip/test/unit/tcp/test_tcp_oos.h": "219807f25b0116f12b3c852c8ad5d00c52b2920a220555a3388880b3a20220fa", - "libraries/3rdparty/lwip/test/unit/udp/test_udp.c": "8a34d49579c87b0aad6b0c5251ddec2d4e9d28c05cb3c437c9a6a74be4e9b403", - "libraries/3rdparty/lwip/test/unit/udp/test_udp.h": "6d311b4a541280aa4573fd0483556d9f3b05c20907a0b297d1e3a6de1f945563", - "libraries/3rdparty/lwip/travis.sh": "79cc9d98bd2beb37dee0b43fdb4c480d81c2b87f9968382a95fcd44217f4ba83", - "libraries/3rdparty/lwip_osal/include/arch/cc.h": "54bd7fbdc6d58a07710d31dcdbb3374b7fe49bb746e8d2a56515e98597a5200e", - "libraries/3rdparty/lwip_osal/include/arch/perf.h": "ee864fcb154cf5c938ebb77583ce7bdf69e56fa29c79098831815d022a2617ec", - "libraries/3rdparty/lwip_osal/include/arch/sys_arch.h": "b2798f66afa193bb065e73333b7cdeffc4ff7e37fa97a0cc6b9436fcc99defcd", - "libraries/3rdparty/lwip_osal/include/lwipopts_freertos.h": "7956aec019f851740b7ffbf7f365da2c075f112791d04cb1268ff6af5091a5ab", - "libraries/3rdparty/lwip_osal/src/sys_arch.c": "a133503424469c4dca161d79b668573983874ce87d1e26e563d49baac59dfd64", - "libraries/3rdparty/mbedtls/CMakeLists.txt": "dee4be32fde393a778af301f0408e52b5170678d6e41f02d5c0ee3627dbd5fd2", - "libraries/3rdparty/mbedtls/CONTRIBUTING.md": "2c1db90523cdc83b6a997fc9ba031db30da38fff2f0ee71923eb1a19d0470778", - "libraries/3rdparty/mbedtls/ChangeLog": "2e522b69da00e32c6b352bfe769e029a759d22e30358a1181d56ab5ce55bd909", - "libraries/3rdparty/mbedtls/ChangeLog.d/00README.md": "b53130f5c90c487805fd17066c312c6635e3bb75b4bcc8fe2f58924e01953ae2", - "libraries/3rdparty/mbedtls/DartConfiguration.tcl": "8e988a7b3b90bfb02dae6e8b584f4ec4d2cfb08d567e06de50ba576170925442", - "libraries/3rdparty/mbedtls/LICENSE": "93ffdf17d6585eada49caa2429d21d192f8a7894e57e00c7432953cf07bae44a", - "libraries/3rdparty/mbedtls/Makefile": "49cbae34739c746bfe88ae74195dba13d4dc61f4989cccb80248d759bb3d92fd", - "libraries/3rdparty/mbedtls/README.md": "91779fd2c549520291afe07d3d76ca9f87d597399039a50885c1c5270c20bd59", - "libraries/3rdparty/mbedtls/apache-2.0.txt": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", - "libraries/3rdparty/mbedtls/configs/README.txt": "689a82e35eca542b4a7ae6954d39ab41830edd8b7d6fea29990bba40a2b97a9a", - "libraries/3rdparty/mbedtls/configs/config-ccm-psk-tls1_2.h": "17cd4f272bf4e642509190b26d4f05a7e6b779a4c7925ef3ce5dde2584085d22", - "libraries/3rdparty/mbedtls/configs/config-mini-tls1_1.h": "195a84aaf9df7e7b1d0c637bcaab59e1ef3f415e9f6cf7529dfa24b7a8841643", - "libraries/3rdparty/mbedtls/configs/config-no-entropy.h": "796c70839805147b6d558704d2bdd63715aeb81e7bb028411ad443620f9dbf50", - "libraries/3rdparty/mbedtls/configs/config-suite-b.h": "4e08827ff19a0320623db6452dd216027d121b6d736e7ca56768fdeb34fb77cf", - "libraries/3rdparty/mbedtls/configs/config-thread.h": "6006363562eb48d203eace4ef6f081d8062d1372bc7d4044690365c121c14c5e", - "libraries/3rdparty/mbedtls/dco.txt": "53a0a460f8eccb279580aa16013c5f98936eba73554d267632f5ea83d8e890b1", - "libraries/3rdparty/mbedtls/doxygen/input/doc_encdec.h": "dc7ce45660ff78bc0df0649cee3933746b20aff0cccc03adfc087c2ad607bdea", - "libraries/3rdparty/mbedtls/doxygen/input/doc_hashing.h": "d8e1c36434ef523226b3accc24789f28832ef2fb14c39542b0e4d832199d8751", - "libraries/3rdparty/mbedtls/doxygen/input/doc_mainpage.h": "308d2c0d3a7c886b9e1eeb3eda428873b9b38316ce7f8d64e80969eae240fa9b", - "libraries/3rdparty/mbedtls/doxygen/input/doc_rng.h": "73604d2736b96ba379c5137c71f6ed8d48990f1b62f1cf39a4efb6e3949b115b", - "libraries/3rdparty/mbedtls/doxygen/input/doc_ssltls.h": "954bd3c8ee0e02162b703bac98b8762d6f4f6c32722f2394b9c590aff07ac563", - "libraries/3rdparty/mbedtls/doxygen/input/doc_tcpip.h": "62c48fc7bd84be5fa7b4afb3143cdf0a505e7bafb7eded854bc463c7adcab139", - "libraries/3rdparty/mbedtls/doxygen/input/doc_x509.h": "208b9e370322f5d0bd86931a80727df00e531ac07e6b2cbaac4219c3cc294074", - "libraries/3rdparty/mbedtls/doxygen/mbedtls.doxyfile": "b280ec7299d796f58e5fbaab268d43bde848896d6384172067984b1723c1b3f4", - "libraries/3rdparty/mbedtls/gpl-2.0.txt": "8177f97513213526df2cf6184d8ff986c675afb514d4e68a404010521b880643", - "libraries/3rdparty/mbedtls/include/CMakeLists.txt": "8b33005b219df3410d10c8354b6f2032559669a7e1ae0dc2e2e768d7d8c6ca34", - "libraries/3rdparty/mbedtls/include/mbedtls/aes.h": "afe879a45b4777dc048cfd031a7cdb23dbff6f4d3fa33bd95b36e7308a5cbad5", - "libraries/3rdparty/mbedtls/include/mbedtls/aesni.h": "d3edc71b465aec7282da21939ea30993d9e11bd708f141a3ace007a53d41ebd9", - "libraries/3rdparty/mbedtls/include/mbedtls/arc4.h": "085e0735863b42f5e07d85fdf8c7b0ff0d2eca923338d28aaa8752d3984d044e", - "libraries/3rdparty/mbedtls/include/mbedtls/aria.h": "a57f8a8ee2d566c917d1ff829591680e10c26d50ae52bf19e4e816f04ee98770", - "libraries/3rdparty/mbedtls/include/mbedtls/asn1.h": "8a9664fc53c831357498d8ce0bef2369aa54568a178adb6304ce44722921c950", - "libraries/3rdparty/mbedtls/include/mbedtls/asn1write.h": "bde4ce9456f06efeeeb0ec00484cba52bc5cd529737d4d3da4a86b09d71f53ae", - "libraries/3rdparty/mbedtls/include/mbedtls/base64.h": "bc0d4d9a7d9cf93067270cbd7c40e78555305bef808128548357318bb69d34c0", - "libraries/3rdparty/mbedtls/include/mbedtls/bignum.h": "d8fecfb2b7a680496943dd69cc5d24f644087e9899624a34d3a90c45c3964e93", - "libraries/3rdparty/mbedtls/include/mbedtls/blowfish.h": "0f0397bedb92cf2a18e6377d96ec5ff0d5463e364a5f6ea7511175b59c53b3f4", - "libraries/3rdparty/mbedtls/include/mbedtls/bn_mul.h": "0decf2f87eca52b0298d463b7727d645ab0474243948ff363e200bb4a42cb700", - "libraries/3rdparty/mbedtls/include/mbedtls/camellia.h": "837815e834c054206decffcd1b8f6e7da66ed0d13bac1b33d55b9ff8a64dd0d6", - "libraries/3rdparty/mbedtls/include/mbedtls/ccm.h": "0be6743fc288b4c4a662dfbe7a88803a9ba3e5edde0417d180448db1f99fa339", - "libraries/3rdparty/mbedtls/include/mbedtls/certs.h": "c21b771ccea08030595d2d626a76d92c3333b0ff2310863d298ae3c36bd12748", - "libraries/3rdparty/mbedtls/include/mbedtls/chacha20.h": "bb636ce04b9f415b29f5bfc8a2640463b4c92e5d96e796aeef829cf91e8b4e88", - "libraries/3rdparty/mbedtls/include/mbedtls/chachapoly.h": "f957183bda10fbdc0e47d0b4ffd6a16eb70b53be2e257e3cc31f2758b174b588", - "libraries/3rdparty/mbedtls/include/mbedtls/check_config.h": "0734be691cacb9eef35854c3a1920d7b96cae0247c1f6e6d7a69727c21d4f145", - "libraries/3rdparty/mbedtls/include/mbedtls/cipher.h": "d84b8a5351e29e0660849c4c06f9cda2a950536932378562fef99d170ac00a23", - "libraries/3rdparty/mbedtls/include/mbedtls/cipher_internal.h": "1c1aecc1d4615c8c7493afb0bf28298b8e297c4749d5c129ba002b3bbf6a367c", - "libraries/3rdparty/mbedtls/include/mbedtls/cmac.h": "a6173e959969ceda1b5b2d1876190bd115eabc08a8cdcaf67f29fbed1bf66c47", - "libraries/3rdparty/mbedtls/include/mbedtls/compat-1.3.h": "7c99033d89833c9deceff34e3696dd97f356d20c70fa77e11fcacc19581d45c8", - "libraries/3rdparty/mbedtls/include/mbedtls/config.h": "8ed7c7121f225a2369fd2a9fee1a5ebd72cb2bf55dffa1c6d783f5a52f79d536", - "libraries/3rdparty/mbedtls/include/mbedtls/ctr_drbg.h": "bdd4bcdc67aebb1cc914ef4619424c0708b1f6ba4583152c2dd9cd26ffc27883", - "libraries/3rdparty/mbedtls/include/mbedtls/debug.h": "87282e3299ab2aa3cc7d1b51d7376e51dec55f7fc0bfc9114fc7b69723fb94b7", - "libraries/3rdparty/mbedtls/include/mbedtls/des.h": "a76bd9f372379c4c4380519504c3f0ba3ac85ce2544cf3ad7d6d420325e96fdd", - "libraries/3rdparty/mbedtls/include/mbedtls/dhm.h": "10fb937d5f760ce8115a16e628c329e14c6a161c33c6b2687b948d30bdc1d2ed", - "libraries/3rdparty/mbedtls/include/mbedtls/ecdh.h": "45fe53a83a6371b726c44750e8daf09bad46acdb6c5d5a27708784098c5ac09b", - "libraries/3rdparty/mbedtls/include/mbedtls/ecdsa.h": "a1977a2670f9373da4e525a78262910b733516a250e8ae2146c2112511d6cf0f", - "libraries/3rdparty/mbedtls/include/mbedtls/ecjpake.h": "577582b5ed14e4cfbcb7f84c8d0ea10b383e6811849889d6f0dccf06e410f03d", - "libraries/3rdparty/mbedtls/include/mbedtls/ecp.h": "4d6eb93618209c48a4147814dc4a8b151387198bd2957858e0a044b119363fdf", - "libraries/3rdparty/mbedtls/include/mbedtls/ecp_internal.h": "cb5bd5834222fcf5ebda17867d034f3b3ee0cb6a01ae05e24150d7d7da9b9056", - "libraries/3rdparty/mbedtls/include/mbedtls/entropy.h": "d15e7d90bce63253e5c5c1238659d0ee917a8502246b920ce942b3797dbe327a", - "libraries/3rdparty/mbedtls/include/mbedtls/entropy_poll.h": "a6b0c4a9d45b7fb2e535ac070da0c8fdcb7ddca7d3c221966b9223d601cc2770", - "libraries/3rdparty/mbedtls/include/mbedtls/error.h": "f8fb48cc215dee818166dc5d960961e62f822d8a4ea59540c5e36fdbfa5895a2", - "libraries/3rdparty/mbedtls/include/mbedtls/gcm.h": "28df84fc052aa6ba9bd8aac7e5d88d20b719e4ac31cc98107c09fc320d457648", - "libraries/3rdparty/mbedtls/include/mbedtls/havege.h": "5736439257a124ae54a1278635d8ed377af6b67ce1bf923bbd90ca051a35ad78", - "libraries/3rdparty/mbedtls/include/mbedtls/hkdf.h": "594d8ab95a102b92c716d8858217769d49db34d00d9b45a77443787fe8edebe9", - "libraries/3rdparty/mbedtls/include/mbedtls/hmac_drbg.h": "488f5b8c997c5ebfc0a6eda725157a9ffb7c0a833079d1b00bed86ae3ec31bdd", - "libraries/3rdparty/mbedtls/include/mbedtls/md.h": "d6e92adaf9be894f23db4c9b33ee99e42ec5c7aaeb9c542840385346f2ae1070", - "libraries/3rdparty/mbedtls/include/mbedtls/md2.h": "e5ba12832916893a33d3ac31bfb3479e9fa04ec17924dd0eda42490822bc017f", - "libraries/3rdparty/mbedtls/include/mbedtls/md4.h": "9dcb47bd1bfba5c29fd725460c41156cb844efcc528d9055b5721c7f55fa6e6e", - "libraries/3rdparty/mbedtls/include/mbedtls/md5.h": "62237ef21805f7096cfb1a85bd477d9fc2f8d693c00e8b7731d48cdca39a004f", - "libraries/3rdparty/mbedtls/include/mbedtls/md_internal.h": "b502fdd7d71adad3d0b5a4e44d773c1c00115a90364127fae247c5f6b9f89a78", - "libraries/3rdparty/mbedtls/include/mbedtls/memory_buffer_alloc.h": "33c023938684f17e4cbae1bc373c13a128a733b8d26d26e2a94ba381eceab080", - "libraries/3rdparty/mbedtls/include/mbedtls/net.h": "1b02c8a4566d032837d979b9e7d321289d396fe8af79ab6d848117e82d79e924", - "libraries/3rdparty/mbedtls/include/mbedtls/net_sockets.h": "4e470ea94c8e1ff165d73fffc82b70431e74b755d7fb6f3911b49b9ca84566aa", - "libraries/3rdparty/mbedtls/include/mbedtls/nist_kw.h": "2e29d722b60a7672a0327024e105967569e6bee398c17fab5ed5c06dbfc9d919", - "libraries/3rdparty/mbedtls/include/mbedtls/oid.h": "b2d36fe414b36a0a7389b0d38f038a2fd755457924d735a6c7972c568694222a", - "libraries/3rdparty/mbedtls/include/mbedtls/padlock.h": "d57ac9ffe314c169d8d418c4f61af0ac7a399a8c3c8929e240761dad04c4ba0b", - "libraries/3rdparty/mbedtls/include/mbedtls/pem.h": "8784957cb6512857cccc7d5ef986ae76c7f2cbb4a794efb98e92e7c0e87eeab8", - "libraries/3rdparty/mbedtls/include/mbedtls/pk.h": "53379ac98abd79587fbc19a52bb4df5dc0cc43acbadf3e15094c89e20d6bd91c", - "libraries/3rdparty/mbedtls/include/mbedtls/pk_internal.h": "99aa7f920b6f814d39e1a181079cd187d2fdea7bc9b614dd7a47297b9820a4a8", - "libraries/3rdparty/mbedtls/include/mbedtls/pkcs11.h": "bf6e84c4dc79dd2c06d4118aafb5747bf0ff3e5235de380fb4b336def147888b", - "libraries/3rdparty/mbedtls/include/mbedtls/pkcs12.h": "001d788141f5662a2b94239108ae3c47b0c9371c9f7b74a5df48c29fa0f38cf9", - "libraries/3rdparty/mbedtls/include/mbedtls/pkcs5.h": "c99933a513bc276664bf9ae1deb5fe246b1f68f70c4fc9cc1cc322f50b0218e7", - "libraries/3rdparty/mbedtls/include/mbedtls/platform.h": "b4a6e5d57fe86db1c1d095708845e0c672ff7a477049a6d3ed1d051bf1983d42", - "libraries/3rdparty/mbedtls/include/mbedtls/platform_time.h": "4d1720c2450ea4ad25300d9d6f4594b1866a9548d536a8d76ea9b58344b53e51", - "libraries/3rdparty/mbedtls/include/mbedtls/platform_util.h": "a33e1009eb1fd54b07a85b1472f6c2b1e9b292169661f5be5dcb23b1a4fc4e19", - "libraries/3rdparty/mbedtls/include/mbedtls/poly1305.h": "7656d74786e7cdaa8a59f50e70f99787432aa4d9e474a3b2a17932351c762259", - "libraries/3rdparty/mbedtls/include/mbedtls/ripemd160.h": "0ded6338aeac3feae27877cd3afe681d8a39c6f71421596d7dd455ade5e9296a", - "libraries/3rdparty/mbedtls/include/mbedtls/rsa.h": "cc737a6c76d0761d6d7c83efeb24c1d71328c062f7dcffd981571f365692dd17", - "libraries/3rdparty/mbedtls/include/mbedtls/rsa_internal.h": "af3f06e7b2b97ff7933a1514bb792dd62bebdd6675904d8cf7773ff950698d9d", - "libraries/3rdparty/mbedtls/include/mbedtls/sha1.h": "8c3a4c80e666a29826d879452703d263b2e62beed8c53e629ca526d0e899b524", - "libraries/3rdparty/mbedtls/include/mbedtls/sha256.h": "f814b5f1a6c5e8cec0815516d5b90d78bc008d8066f10537585a43a85f0614c8", - "libraries/3rdparty/mbedtls/include/mbedtls/sha512.h": "da3c21d6a24dc9dad572af9a77c9badc78746e5d839b72a47272b32b8a8783e3", - "libraries/3rdparty/mbedtls/include/mbedtls/ssl.h": "a4bf39c2fd17de235b9d0f5a99e2c532d938867350d5cb2d760118bc451771bd", - "libraries/3rdparty/mbedtls/include/mbedtls/ssl_cache.h": "b9c520e99b305cba100f67e5bcc876ef5a76b22187cd66359e83cb0e63b64ab8", - "libraries/3rdparty/mbedtls/include/mbedtls/ssl_ciphersuites.h": "7b05415e913dda6de714ef6626404837b93b13f33f0bdad2d5b1121b0066dbfd", - "libraries/3rdparty/mbedtls/include/mbedtls/ssl_cookie.h": "0a8daefcff1065c08d56d996cf72467d55c741be03972edac76dd7f946ab02d1", - "libraries/3rdparty/mbedtls/include/mbedtls/ssl_internal.h": "1cf923bd9226d7a43445b4b811e8d99ceca3882952717b96978b992a4a89a08f", - "libraries/3rdparty/mbedtls/include/mbedtls/ssl_ticket.h": "90f71f93fe2dbe4473ca61fca9244178af8bf6c2e17ee1e2a10c8f9f8bd91fb4", - "libraries/3rdparty/mbedtls/include/mbedtls/threading.h": "facbd8ea4a2fdfffdf0f6a8f62d950e32e2195e5b0969531001db5603885c76c", - "libraries/3rdparty/mbedtls/include/mbedtls/timing.h": "5b7ea9cde317563fbb096e358df110b334c7cf4140315e39ee21ed664f309fb3", - "libraries/3rdparty/mbedtls/include/mbedtls/version.h": "b565609959075c6002c1a41b2313b7dca626997108d3b2b4a51f167dd96d41a7", - "libraries/3rdparty/mbedtls/include/mbedtls/x509.h": "46bb20a5fabb9796b6ef0f8bd7d05be822175f2170282adf723eb05645efae0f", - "libraries/3rdparty/mbedtls/include/mbedtls/x509_crl.h": "917edd8a8f601620e3bcf81812c447a9ac569b31d6f31c87eeb92f0c3d35ed6a", - "libraries/3rdparty/mbedtls/include/mbedtls/x509_crt.h": "76e2c7883d145a8e28f2266b86ff4d59ff675d05a21b5d00ba2165590aa9f426", - "libraries/3rdparty/mbedtls/include/mbedtls/x509_csr.h": "9fba654b535fda22f1536f1fc8dfb9315d0f0a9f0ffd573836b462aa2308922d", - "libraries/3rdparty/mbedtls/include/mbedtls/xtea.h": "a8d4f19d9a4a697a0b64abe0ff6fbd67ea4edd711042c96fb29827c5efdd48c6", - "libraries/3rdparty/mbedtls/library/CMakeLists.txt": "a8ce844760611a9f8ee0f818d8fbe9ffae91eb0116a7673e8f7271ca11106785", - "libraries/3rdparty/mbedtls/library/Makefile": "fc602ac24e6bf784399d4b65ceb26b55b442878d5f6d340fe632c41b8321f3db", - "libraries/3rdparty/mbedtls/library/aes.c": "4288fa23a5979c8c57d4df396fc95a14c0c2a11c28a6476b17a1c3dad701112d", - "libraries/3rdparty/mbedtls/library/aesni.c": "a4c2cdddc15fcba198134651f5c291f7e57156823ba530fb8dc686d7ecdc3c30", - "libraries/3rdparty/mbedtls/library/arc4.c": "8857548e90924c9ab082c65bb4a997a9475d79c3497fffb523b70d61fa37aa75", - "libraries/3rdparty/mbedtls/library/aria.c": "8ebc8a8beed52d2ceeb869c8988b5366611ca7b96e234ca4dadd8667ffef23a1", - "libraries/3rdparty/mbedtls/library/asn1parse.c": "0a4aa2abcff3959e39fbccb16d145ce945f5bc5c95bc74dc591feaaa58be99f2", - "libraries/3rdparty/mbedtls/library/asn1write.c": "eafa624d131d994e903e7cca49475a2745d8eba0ac49d774a7dcfb8740aca051", - "libraries/3rdparty/mbedtls/library/base64.c": "182a41b5fff7be8fe584e092bba447cca9e0d712000a058668ba61075cbecee4", - "libraries/3rdparty/mbedtls/library/bignum.c": "defde21b0ed83fc210f1ccd87b1273826eb5f9e9787f87c8c69fb9245e0a1fb7", - "libraries/3rdparty/mbedtls/library/blowfish.c": "9bea5b2b05297123ce707192a349570b5c27dc549f472138b68554e3842b8e6f", - "libraries/3rdparty/mbedtls/library/camellia.c": "df18194fa3f9d3297312d511de43bc0f02b555d37fe24bbcd5fbb197c87f5dc2", - "libraries/3rdparty/mbedtls/library/ccm.c": "b263c34eba5832c33c4e2d09d73d73a2984169c9c048bc0fb9e12f07174fcd68", - "libraries/3rdparty/mbedtls/library/certs.c": "2178d5a922f92374bc1af0cc6a16dd97b6de872ea79afac4250f496d122a7ab2", - "libraries/3rdparty/mbedtls/library/chacha20.c": "33f955bd6872432912645c577725b14a6e513ac984347f3f8970a726b425df05", - "libraries/3rdparty/mbedtls/library/chachapoly.c": "34b37b2b02d17e86b63bd04e661c3448365344bb86b51cc3845ed1c761d55eb7", - "libraries/3rdparty/mbedtls/library/cipher.c": "bf2c957f5ad6e1cee14d0e69ee377ec84ffdaa1a2e7f02366a35c7776a26a8fc", - "libraries/3rdparty/mbedtls/library/cipher_wrap.c": "453c1e854cdf198c7aa661c9009bae89d4c01e81fde078e4e7deef8e6d2084b6", - "libraries/3rdparty/mbedtls/library/cmac.c": "b3c0ef2a64ffab706789e2037f8096c2504d9c0c28560dd996490fb2f8b75704", - "libraries/3rdparty/mbedtls/library/ctr_drbg.c": "fd0ac72baa6ab437be735dbaa02a3345d8ecb24dd8eebf9c0b575cde0d405c5c", - "libraries/3rdparty/mbedtls/library/debug.c": "78472dd80e0848e51a13de98c45d2e14060c1d5e2ff992d94f24988a7a065c92", - "libraries/3rdparty/mbedtls/library/des.c": "2061c8155e25ad8193c0fb209aae0cbd5a870cb64b604acdad9c79a4c761b3cc", - "libraries/3rdparty/mbedtls/library/dhm.c": "f3937f90752fe8cce08bcadb4f20f255684af8edd76632d27b9057cb8c4526d4", - "libraries/3rdparty/mbedtls/library/ecdh.c": "492122e6d15860ed9b0740b3ecc15dccec77c981d6cf9c319e3029d503f14568", - "libraries/3rdparty/mbedtls/library/ecdsa.c": "eb152dd835353cb7458cae1ddf80aa80a5d99e86d34ed4d0e3e7fc125f7f93fe", - "libraries/3rdparty/mbedtls/library/ecjpake.c": "f469f34c65278b30e4dd39c47fc82a105158f0eb07cdea5c33a02e60095d80f8", - "libraries/3rdparty/mbedtls/library/ecp.c": "39762c9f571179332e0b9412cf7c4772fcc2c9b6d2f07c7a6ffccc72bcb74f84", - "libraries/3rdparty/mbedtls/library/ecp_curves.c": "2475a5f0b2fd848c8c86366a0df11c1dd8228f532ccfb454518e1dfd43d5bf8c", - "libraries/3rdparty/mbedtls/library/entropy.c": "933a22f938ef9d3bf1d782b264358e480b9d37e2ee9088fca4fb1b86fba1a828", - "libraries/3rdparty/mbedtls/library/entropy_poll.c": "0a88fe1c876ad3b086569517f275e9b5d4ed7bcb646416517aed44fe2600d910", - "libraries/3rdparty/mbedtls/library/error.c": "fb2c8f00f5ad85f8d8e109adea9228d029fc7ddffb54afdbc013c963f3161ac7", - "libraries/3rdparty/mbedtls/library/gcm.c": "50b47d680006b95bc3bcfeecc01d8d67531ef1c33f15f9ae2b2961ac7a1407b7", - "libraries/3rdparty/mbedtls/library/havege.c": "1cb6a90ed86fc2fca20b5116f3a1a31efa8ca627cb60e53bb80e2145ea5d8602", - "libraries/3rdparty/mbedtls/library/hkdf.c": "c08d6825b64bc78d042a8f01494b708757e44636719e17f260362f15146bbff4", - "libraries/3rdparty/mbedtls/library/hmac_drbg.c": "ca8eef1422406a1098fb9e85b39075db0c742ed7add762365668cf3668a2f810", - "libraries/3rdparty/mbedtls/library/md.c": "cbb194d941c0793bec8903a79b37ca4e1df8f3c2e1d744dfb75a4005071b2eb9", - "libraries/3rdparty/mbedtls/library/md2.c": "8a94a7f0b8e218f24bb0c9c75b7b97c9708525abe0e6367e95f19575efadf77f", - "libraries/3rdparty/mbedtls/library/md4.c": "9913e7e79624592bb95b9596c46865beb1863c3e434bb926ec25a4f26e8c7b44", - "libraries/3rdparty/mbedtls/library/md5.c": "d22e001ad3ac40571ee8ccd6a28534b3a717b85ac3f957736f625650055f01af", - "libraries/3rdparty/mbedtls/library/md_wrap.c": "58f3d626cc386ad4fa460299fa6d1e6038ba17110f4a4832a5a6228dbda42f9c", - "libraries/3rdparty/mbedtls/library/memory_buffer_alloc.c": "12cb517af657889e1ba674f29e06f074f487b1a7ed3cd8b73901431c5c7a08af", - "libraries/3rdparty/mbedtls/library/net_sockets.c": "a068a43b8237298dee876ca04c766eee6821c0dbea29dc8ae94fa1f21773ee46", - "libraries/3rdparty/mbedtls/library/nist_kw.c": "207e85cf70628bdff639648a6598882b5d03c7b0ec52ae3ecfeced1976f6b7ae", - "libraries/3rdparty/mbedtls/library/oid.c": "b4556e0bd537526dcc1ee5cd2dacfad5779094c56be58260acf4d7e7b139c3a7", - "libraries/3rdparty/mbedtls/library/padlock.c": "10a9521ca248e65a725a7af981ebb6cab79577105476fe872b69c3e743d2faa8", - "libraries/3rdparty/mbedtls/library/pem.c": "248ca954d52ac579d710879adbb51f0809b5f8f0e422c0c86adbed42fa51658e", - "libraries/3rdparty/mbedtls/library/pk.c": "32fe9ef24ed691e8ccafda68b97b5f89fe02a71448bf7a28cf120b4110b05b9f", - "libraries/3rdparty/mbedtls/library/pk_wrap.c": "99ed73e81a582dae47aa9bffb36dba44a9aa66616ef63de57811163654491fef", - "libraries/3rdparty/mbedtls/library/pkcs11.c": "8e1b5602b7ef1b7e26e07de027f4a0286842a99dad48f4b13e251b0d6167b10a", - "libraries/3rdparty/mbedtls/library/pkcs12.c": "cb02bffaa8196a9c237a09c7e3d24965c96dc6408dccd6bc544b85f3864802f1", - "libraries/3rdparty/mbedtls/library/pkcs5.c": "3a0ebf774dad943fe26adddd2e9868b947b91c946a7551eae8046a70467b97a5", - "libraries/3rdparty/mbedtls/library/pkparse.c": "e71ff552184fab608af6d56575dce97cf9ecaabdd538b86d0e953b76fa4dc3c6", - "libraries/3rdparty/mbedtls/library/pkwrite.c": "8430dce4584f33cfa22f3964000c1fbfa0542dc8b1cd70609585e0bd98508a25", - "libraries/3rdparty/mbedtls/library/platform.c": "e4f3ceca9b62a91e8d66a9f96190714de3f34b1601e37c6a5e89d340c9e97ff7", - "libraries/3rdparty/mbedtls/library/platform_util.c": "cc2effcae747df6da0dd13b4544f2e285b800a800b99b0f051769be89fa12f44", - "libraries/3rdparty/mbedtls/library/poly1305.c": "8a586ed4fbf51f9af83fbf2d916cb777bbd0d715d697ed1cec65529a365e6a62", - "libraries/3rdparty/mbedtls/library/ripemd160.c": "d017586c9f1151db9092f0e60fb7359fbb268860b9eb16b26a87c129214178b9", - "libraries/3rdparty/mbedtls/library/rsa.c": "8dab05d8fb547fbf74994f113bab1596986b0ede99c979fbd197fdc28397f985", - "libraries/3rdparty/mbedtls/library/rsa_internal.c": "eefbf7959d243da766be010948fdebaa2977a95e61fa09affd7193cf24992687", - "libraries/3rdparty/mbedtls/library/sha1.c": "6231c521eb5616169e23a0fd42aa663e3e49d3594a298560cb36c1ffff248d2b", - "libraries/3rdparty/mbedtls/library/sha256.c": "ff9d0a3df9e100efb6ba6106668b8a01aca1a602890dceeecd55e40ab29b4ea5", - "libraries/3rdparty/mbedtls/library/sha512.c": "b151586e8847454378b0d82207602f6937d022aa1d13e3e6d69e67a18f227c5a", - "libraries/3rdparty/mbedtls/library/ssl_cache.c": "1ad5d0fea8b1bce083a2ad96ff247f6b16925bb53516b104d806a6e65aad4f43", - "libraries/3rdparty/mbedtls/library/ssl_ciphersuites.c": "a9efaf43f2fc044307f9635f4ec32fd03bd6760453b76c12cae616209bc3d93b", - "libraries/3rdparty/mbedtls/library/ssl_cli.c": "b4d3241fe384c481d4b48c94ea0101fec0ad83fed3301d3b7fc10be3949d5952", - "libraries/3rdparty/mbedtls/library/ssl_cookie.c": "8b54041acfb97d5b345829fa488b307dc9a4a6ff83fdf330832599b6c3f9d3cd", - "libraries/3rdparty/mbedtls/library/ssl_srv.c": "cf15d011fe5b0ae8776cc6e289bb56f082fa76bce32744ad761aef0b83bc0311", - "libraries/3rdparty/mbedtls/library/ssl_ticket.c": "f948963c63f2bb90226833f23727be77a787e45abe9f2d52de11bf74f60a6392", - "libraries/3rdparty/mbedtls/library/ssl_tls.c": "23d3d1ca67cde6195e6dd662b86c6ddbba38d9038c17503bf076b35b63110286", - "libraries/3rdparty/mbedtls/library/threading.c": "b11bc522e0b1d45783d4d3d5ec31390cadffaca662dddbb44de7113292d0deb1", - "libraries/3rdparty/mbedtls/library/timing.c": "f516ce5e42b8ca5cffa36232323c8c6a7e594ce0641942810dda6534e41793d5", - "libraries/3rdparty/mbedtls/library/version.c": "5b567a3354bd2f3a56e618eb7b2c4606a151d3a469fb4293d47fe9b6645259ee", - "libraries/3rdparty/mbedtls/library/version_features.c": "a409a8a52bd3780837448a27fc1495878b745d96057cbd3af2ce2c71f6864494", - "libraries/3rdparty/mbedtls/library/x509.c": "4d0883ab99fd117d196bf666fef23742b6149be882a9567ff6deb728e8a2ff0b", - "libraries/3rdparty/mbedtls/library/x509_create.c": "c11f48a5df30ff6db074af8d3ac11277e021eb5da8169512571933d69944378b", - "libraries/3rdparty/mbedtls/library/x509_crl.c": "3f4338fd6920eee4b615108ae1d3bc7387fc4131a8cd7f297a6e0bcc57f7f08e", - "libraries/3rdparty/mbedtls/library/x509_crt.c": "9758f8a5dd1f2f1a952d169bcb7175886e11c9138ba8fa937bf71eea098539c4", - "libraries/3rdparty/mbedtls/library/x509_csr.c": "3949dc1f20dde7e8b484452fe4902bb58ebea3745f7a46eb0b59514d17fd4c36", - "libraries/3rdparty/mbedtls/library/x509write_crt.c": "7476466c419a3af8d68bfedebbcb71fe05cf20fba164f0cac31b83b6ed67f95a", - "libraries/3rdparty/mbedtls/library/x509write_csr.c": "642ca33facc02e2296c5514a79650df10aff717b306c6b6cb8e5f52455237cf7", - "libraries/3rdparty/mbedtls/library/xtea.c": "27e37318e767f4d44d0b94aa29c981bdeff6466350448d841a5219b6ae3035b0", - "libraries/3rdparty/mbedtls/programs/CMakeLists.txt": "528503fbcec620728a53e987437e5f04f34f9b604a6d7e559156aaab2a8502a4", - "libraries/3rdparty/mbedtls/programs/Makefile": "30cc7e78c989ba44369e47654e111271ffc331e9f79c85e391336a0ad161c7e4", - "libraries/3rdparty/mbedtls/programs/README.md": "12ae86078bd2791074cec4dff2652165a027fa9191413e92d06e7f9ad7b0ab81", - "libraries/3rdparty/mbedtls/programs/aes/CMakeLists.txt": "fdd4153e4a452b98eec8fe330cee8766412d6931858938704bb808a1fb722980", - "libraries/3rdparty/mbedtls/programs/aes/aescrypt2.c": "07fb23a1012f9bec71eddce863841588ed4d3bff81aaa425a26c76170958e10b", - "libraries/3rdparty/mbedtls/programs/aes/crypt_and_hash.c": "d149964a671a06e2292a8102b7af9f4341e86528ba9f5e4f990eb8db8fca2b76", - "libraries/3rdparty/mbedtls/programs/hash/CMakeLists.txt": "e969c3ae5259aefeeeaee32b21b401484dff7f651450da1e765fdee2c96b6daf", - "libraries/3rdparty/mbedtls/programs/hash/generic_sum.c": "8ba66f37d4f77b445f3a2c45fba89b79b1df35f9fe6e90e8e1bea7955af464f7", - "libraries/3rdparty/mbedtls/programs/hash/hello.c": "453c9cbaf91147be405488b27bd237c99abcebdc5a71798efd7655aa0172075b", - "libraries/3rdparty/mbedtls/programs/pkey/CMakeLists.txt": "76525ce3dcf9b683076bad9e69baa6fafed3f8076e3c42596175dc55ed2c27f1", - "libraries/3rdparty/mbedtls/programs/pkey/dh_client.c": "37f820445864fc8b1a68654ca6f91724b0603957331e4bfacb097be5c746c1f6", - "libraries/3rdparty/mbedtls/programs/pkey/dh_genprime.c": "915cc30c8da0c190f04caad436b9890cbbcfb4b589162c65f6378fa0f8020070", - "libraries/3rdparty/mbedtls/programs/pkey/dh_prime.txt": "26f568b6b7e200f0c8f6726cd869e5a529d22bdcc7b33a9cf0bb6c0f4acd65a5", - "libraries/3rdparty/mbedtls/programs/pkey/dh_server.c": "7226eb0e9d33612677de7a6f4c8ab201e5ea5a32ac5595541f8907dad93d877e", - "libraries/3rdparty/mbedtls/programs/pkey/ecdh_curve25519.c": "ef83d50a3fa09279ace35b15898b98eac7ffa21eb8c61766053733a89b38cee0", - "libraries/3rdparty/mbedtls/programs/pkey/ecdsa.c": "3e8d188bb157d5d5062663863d712f50b2bcec674f5652bdf6d17813b774d69d", - "libraries/3rdparty/mbedtls/programs/pkey/gen_key.c": "5ac3aaa1d6af7b158d3a9abb40a2e63c6f3969479da3bc78c58c98e63aa36663", - "libraries/3rdparty/mbedtls/programs/pkey/key_app.c": "e95bebe5a6fda6e52e78ee5470e952d920d0fe860dd6283b63cd2ae65943057c", - "libraries/3rdparty/mbedtls/programs/pkey/key_app_writer.c": "7f3c6557a2af4424aec05f6a1b5a4290a28a272c97f016b4836b667995b7e93e", - "libraries/3rdparty/mbedtls/programs/pkey/mpi_demo.c": "af0877b749d4f568a2adbd64537585a726b02b343152fb3e8f5ab9c320328e72", - "libraries/3rdparty/mbedtls/programs/pkey/pk_decrypt.c": "ab47d6b8604d55cb56da97217bc1bddc2e4834800e93321c2b9847fae71c7a5a", - "libraries/3rdparty/mbedtls/programs/pkey/pk_encrypt.c": "0b73cff0c70fe30f1282a07ebf31f45081b215282efe9c7919b4e60b0365e12e", - "libraries/3rdparty/mbedtls/programs/pkey/pk_sign.c": "999c552ee3551661812167b84a94631bf1181a5a5b7c99bff2df0cd672349fca", - "libraries/3rdparty/mbedtls/programs/pkey/pk_verify.c": "e0dbe1ec0a03feded597a0595ebe9c44cf99afff76161635f8ec6fe3ff3a5ae5", - "libraries/3rdparty/mbedtls/programs/pkey/rsa_decrypt.c": "cb6445efb6fefe8ea0685dc89eda7d828b2c26d2aa13a03ec85c7cf7c79a135c", - "libraries/3rdparty/mbedtls/programs/pkey/rsa_encrypt.c": "71bf473bd2c82d6bf2978df35b943674e293a180f211d952b1a7c6f267432adf", - "libraries/3rdparty/mbedtls/programs/pkey/rsa_genkey.c": "0b4fd5ed309a07386aa1c7f71fa55453f18e36c469f00a87caef16129a3d0006", - "libraries/3rdparty/mbedtls/programs/pkey/rsa_priv.txt": "53507af9612ca19196c322d264ca42b65ac4ed92ba9e2f43cd68cd2db51c083e", - "libraries/3rdparty/mbedtls/programs/pkey/rsa_pub.txt": "bbfea547c88fd479235e5c6342742850e9586afb028b44bb298f5e81e3e57f70", - "libraries/3rdparty/mbedtls/programs/pkey/rsa_sign.c": "7699ffe49744c2009ae2d631f37feaaf5b722c52c9965b260ec08cf409422101", - "libraries/3rdparty/mbedtls/programs/pkey/rsa_sign_pss.c": "d5045b2c3ea8e6b9d83c2afeb975e1947dd8f37e5b7e658625020241152c182f", - "libraries/3rdparty/mbedtls/programs/pkey/rsa_verify.c": "56a5896170c30c30bd48f56aebb4ff617b43383738c5df0eb6b671ddca88a40c", - "libraries/3rdparty/mbedtls/programs/pkey/rsa_verify_pss.c": "c35e2f3f49e09623ecfb3eba0abb6b14637c00225df8ffcb9adf48d21dc7e04a", - "libraries/3rdparty/mbedtls/programs/random/CMakeLists.txt": "724c3964776475b96c439cdc33c67586c05c67b340eab391f940478fc29844f4", - "libraries/3rdparty/mbedtls/programs/random/gen_entropy.c": "f4737f38560b09b86c90920b7e3eb2e3f4db679fafd115932fd1f3a0eaf35381", - "libraries/3rdparty/mbedtls/programs/random/gen_random_ctr_drbg.c": "975bc5af04cd4627fda64ceac00683eb2dc409703cb602e5d9d1016b9180b371", - "libraries/3rdparty/mbedtls/programs/random/gen_random_havege.c": "cd37f67973f6e45f82694271f711b01f5edec459b5cf3e391b2b52205f4984bf", - "libraries/3rdparty/mbedtls/programs/ssl/CMakeLists.txt": "677057e1f24c7e0024bd05457014e3b99bc3ac6331f561dd94e481de45663b43", - "libraries/3rdparty/mbedtls/programs/ssl/dtls_client.c": "6ddc5fa57080d881fe1fa02b4d3a8702a1c300ff2cd9b98b6361d5660e335dbf", - "libraries/3rdparty/mbedtls/programs/ssl/dtls_server.c": "a1b6dd4214442c0e141248e278e71895ec903981b2042f28e1b703c3cf6c4ed4", - "libraries/3rdparty/mbedtls/programs/ssl/mini_client.c": "115cdcfffbd5388b3e6e0407781d315808e377cc682b368888cf408d43910bba", - "libraries/3rdparty/mbedtls/programs/ssl/query_config.c": "efe88fbc301d1dd35b8894a11a6e8971d99684815341aa729caecc7811924d55", - "libraries/3rdparty/mbedtls/programs/ssl/ssl_client1.c": "6f05a7f847950f4bf76eda14cacb14ddf645c38d642efa6ab4b0265e09cc3af4", - "libraries/3rdparty/mbedtls/programs/ssl/ssl_client2.c": "f2f0623ffe362b497157e4fa18c6913893e2d7726ee143d7985226d503935644", - "libraries/3rdparty/mbedtls/programs/ssl/ssl_fork_server.c": "8a4f1b22ddb878f1ad53c1a2947057c90eed9517221fb555cf6096c6bbc737b7", - "libraries/3rdparty/mbedtls/programs/ssl/ssl_mail_client.c": "b54e75773e923e4ebf48ec0ea89d7e4b4a1ef0db0f35a7621c2710a4932892e6", - "libraries/3rdparty/mbedtls/programs/ssl/ssl_pthread_server.c": "ffce413b900cdc0b5583d81382a85976796ea6ef60843e661e950bf15c88d428", - "libraries/3rdparty/mbedtls/programs/ssl/ssl_server.c": "5b3a413da632bec17f02940630bdb81000fff45143c77c581d42c62d183e7e6a", - "libraries/3rdparty/mbedtls/programs/ssl/ssl_server2.c": "471da8a6185b4c862cf7e468803c58b1dbcf609d9c15db1bfedf5bd6633f5a5d", - "libraries/3rdparty/mbedtls/programs/test/CMakeLists.txt": "54e985b61218cc5839e244563cae4e8aa1f99524266024d7ba01e5fb203766b9", - "libraries/3rdparty/mbedtls/programs/test/benchmark.c": "ad617ca373dfeab4ad2ffe66373f1ae58940d5a54e6d1461072930c8630caefc", - "libraries/3rdparty/mbedtls/programs/test/cpp_dummy_build.cpp": "698ccc1d8d12fe15ca8121b309ae098fe54299f4cbd9acfe97f7aa1bbc0382a9", - "libraries/3rdparty/mbedtls/programs/test/query_compile_time_config.c": "be5c728ab539767b2a26ce16a7efa87af4bc2e675571dd35f30e5e451b74af12", - "libraries/3rdparty/mbedtls/programs/test/selftest.c": "82ec5c01212ef1e2637ccdbd4f3fb44186d2f09962ba0e9657e330c456200efd", - "libraries/3rdparty/mbedtls/programs/test/udp_proxy.c": "54dd04cd48fdfc8324e1b238bce7e21400c85ef021ac3c32d168fbe2e20882cc", - "libraries/3rdparty/mbedtls/programs/test/udp_proxy_wrapper.sh": "a04ac0c08a0de9b716a6cded205a70825129088a2ca3510e0d1f5660c230d9ca", - "libraries/3rdparty/mbedtls/programs/test/zeroize.c": "8e48487f88e64c421ffd547ec8823a51b1e6f164a9f4c5ffcc8264b86462ff05", - "libraries/3rdparty/mbedtls/programs/util/CMakeLists.txt": "ea1ba02324edbbbecddc8bd1ac421a2d43c886c1cab1a01e1cd912ee27faa944", - "libraries/3rdparty/mbedtls/programs/util/pem2der.c": "501aff1215277aa2f63a8bd25430ff14ee9295e06f8fc2939022b700bb4242cd", - "libraries/3rdparty/mbedtls/programs/util/strerror.c": "a17425f629beb5261526799c5a3c6a27646956f6dd879a1beb5b7e8511aac32c", - "libraries/3rdparty/mbedtls/programs/wince_main.c": "806fe561b03ad9728a9f4423f0400d599c98a057276472d1490a6905c605a208", - "libraries/3rdparty/mbedtls/programs/x509/CMakeLists.txt": "4b68032428176f68769fd51f6856f3da57758fbbf532dcd6359f47001efaef41", - "libraries/3rdparty/mbedtls/programs/x509/cert_app.c": "456fbf1a459ed0f7fa5c7ab9e324a31171441c7209567d3cf61d623dbfe0c60d", - "libraries/3rdparty/mbedtls/programs/x509/cert_req.c": "e4c3aa98d15294115142ee621dc7e1e80dfcd629b9b171b9a262f16e01d4889c", - "libraries/3rdparty/mbedtls/programs/x509/cert_write.c": "cce5c3cda9df4e824b91508bdf170ec5af74b756892efaae0a982d3e5ad529b4", - "libraries/3rdparty/mbedtls/programs/x509/crl_app.c": "4de4afca0e83b78d135a8da399d132414c7122b10f298c7188818ec149ff6b6e", - "libraries/3rdparty/mbedtls/programs/x509/req_app.c": "cdfcbf7ef0eca953642ebe0505456b613c0ccc9a721861d83d28d9f84e16c8d8", - "libraries/3rdparty/mbedtls/scripts/abi_check.py": "e83df5c3bb791a7a855082b4c16dfcaf85393c59aeeb307e290d4e49c6535c38", - "libraries/3rdparty/mbedtls/scripts/apidoc_full.sh": "40fdeb98dde820cd3ad45ee8adbb69c6e8de3ef1861943054b2a573c0db62783", - "libraries/3rdparty/mbedtls/scripts/assemble_changelog.py": "5baba802fd04d2c7d2d070cfbd8dc1172fdae60e14dc2c79bb60807195273bb9", - "libraries/3rdparty/mbedtls/scripts/bump_version.sh": "800dd8c11a883058bf7dcaa01130736c21a4183202075b99d3977a5c558fe600", - "libraries/3rdparty/mbedtls/scripts/config.pl": "b6189d7c5bf3d61b86feacb73903cc2b2a7ca1af35f53d2b2a208e315750bb71", - "libraries/3rdparty/mbedtls/scripts/data_files/error.fmt": "da9c7207db0d53c7f65a5adc4f3d5b182e6bb52ebfb56b23c2ac3032aad4790d", - "libraries/3rdparty/mbedtls/scripts/data_files/query_config.fmt": "66aee385189e99ee5de28eb157e226660cc658d9b122dca896d07b39e5c73a2a", - "libraries/3rdparty/mbedtls/scripts/data_files/rename-1.3-2.0.txt": "2366f726f5f76d66158a187633ba24187f06fc6126af1685b16ef26965a29d11", - "libraries/3rdparty/mbedtls/scripts/data_files/version_features.fmt": "791235bbfd7737683a4c462388a31f0204a716562c9bb4c19fc33d6a68496187", - "libraries/3rdparty/mbedtls/scripts/data_files/vs2010-app-template.vcxproj": "70eaa8c071a05964f866abb19547f178d03a017d09546c191f93b33bcfc48d2a", - "libraries/3rdparty/mbedtls/scripts/data_files/vs2010-main-template.vcxproj": "2aeb88995c4db9539137130d44e7f712e03741465205d41be68d429c0868b769", - "libraries/3rdparty/mbedtls/scripts/data_files/vs2010-sln-template.sln": "f6ccbb56dcd55c1002967c379d07e9af4c8137bc5d4e25b1b48fad1102bc063e", - "libraries/3rdparty/mbedtls/scripts/data_files/vs6-app-template.dsp": "71e0444b6ab5ab8fe016622063b72392eb29f2255a6f4b527308f03a14fd63d1", - "libraries/3rdparty/mbedtls/scripts/data_files/vs6-main-template.dsp": "32d89bf331081f828e4008a2a1853688dc63fc2b3018f527fd2e221d31c8d111", - "libraries/3rdparty/mbedtls/scripts/data_files/vs6-workspace-template.dsw": "5ee39f91104b06bbbe9014b59d53f30f0cee435aa6edd225eaa49942d141afe9", - "libraries/3rdparty/mbedtls/scripts/ecc-heap.sh": "e50d98a5b3b49024b7c060b3d3b9cdf77cae88b7e05dcc93914a5e33deb2e40b", - "libraries/3rdparty/mbedtls/scripts/find-mem-leak.cocci": "1676446b4832d534795b4338b08261fc570fb3a66de328a05da1976769a626f8", - "libraries/3rdparty/mbedtls/scripts/footprint.sh": "0c96cf5e5e51695b85507203a90780e5555a4406abc729793d029c32e9115f57", - "libraries/3rdparty/mbedtls/scripts/generate_errors.pl": "4f551a92b6507c32bf63758c7e037e261762d2ff3ec5b99b7031f18f5956cdea", - "libraries/3rdparty/mbedtls/scripts/generate_features.pl": "351e88f3affe5420d7bd579d2224c2d7c60ee7bc707b58ecd0cb92dbaa4fb09e", - "libraries/3rdparty/mbedtls/scripts/generate_query_config.pl": "4fb047403424badcfb2b2427aaab2a160330f1aee8281e00e18988183afa4c2a", - "libraries/3rdparty/mbedtls/scripts/generate_visualc_files.pl": "5947fa422abd780e5b28be0670a62d5839e1e8d2b6bb5f073d6de8ac91f7be53", - "libraries/3rdparty/mbedtls/scripts/massif_max.pl": "2cee4491ee2ad543bf9bd3750039a74b865ebe4bb1564f3f08c40c20b3438f98", - "libraries/3rdparty/mbedtls/scripts/memory.sh": "0538949b51fb715ec37f6c68fdfa0abe7484f334d9f5ae221f51ade08cf46011", - "libraries/3rdparty/mbedtls/scripts/output_env.sh": "b370d9067b47164afb47ed57adfb7c6f1d1ee4868f172bec432e29e7cd5f02a3", - "libraries/3rdparty/mbedtls/scripts/rename.pl": "9629332866733098f5b92fdf63ec6eb3a98a57e974742e1d4dff922e42ca79c2", - "libraries/3rdparty/mbedtls/scripts/rm-calloc-cast.cocci": "6333b31d5e254449cf8e9127da47cbc5cdd341c14e93d06aa485952ac7987d29", - "libraries/3rdparty/mbedtls/scripts/tmp_ignore_makefiles.sh": "fc2fd053da9c0d55f854d9bfa60e4ae783155993e42c9d2af2c53bd8ecb54d55", - "libraries/3rdparty/mbedtls/scripts/windows_msbuild.bat": "3a8e5605e23fedf7abbc3d4efe42c9cad06f919a590b94a2e578ea29a5a5fe65", - "libraries/3rdparty/mbedtls/tests/CMakeLists.txt": "753aeaf0e7c2e94960cddda69e11b33e571247e79fd1b25428278df9136c5078", - "libraries/3rdparty/mbedtls/tests/Descriptions.txt": "946e61cc0c477b1866d977ca0c8989b84c062015e38879d4cb0b91a24504732c", - "libraries/3rdparty/mbedtls/tests/Makefile": "2eb90437d5ab9fd430122f72321fd420d77e107a12e7ca0cceb3c46034310384", - "libraries/3rdparty/mbedtls/tests/compat.sh": "af6980efa632ede84a5a63fea52ee1012e021ad0a315017d290798ae66fab322", - "libraries/3rdparty/mbedtls/tests/configs/config-wrapper-malloc-0-null.h": "a9935dbfc19cfa41c4460a0abeec578c02dad79d50a583235ef22625698be165", - "libraries/3rdparty/mbedtls/tests/data_files/Makefile": "ad5990d3bbcf29521e7f630c7b8cb20aafd10c9786ccaa027514df0cddcd37cf", - "libraries/3rdparty/mbedtls/tests/data_files/Readme-x509.txt": "8d472178fccae62cb49fd37c5e4792d48277f58aef9d7415a8db335e7dad8360", - "libraries/3rdparty/mbedtls/tests/data_files/bitstring-in-dn.pem": "a56cb4555c1b735454efe2ad7fe080ba9df5df0119aa6b3ba385ff6148ba895e", - "libraries/3rdparty/mbedtls/tests/data_files/cert_example_multi.crt": "7e197f7d2400a69059756db678f0ededc07566fbb3f0b25f235a496827e1cd5a", - "libraries/3rdparty/mbedtls/tests/data_files/cert_example_multi_nocn.crt": "70d06e5a114da637d37d1f733f7f7b1ea99d2ef4743d02c3710fe6d81089d699", - "libraries/3rdparty/mbedtls/tests/data_files/cert_example_wildcard.crt": "2716a0cc21c9a5678b0ad5075ba1a211d7e3e2b621444e3156f901cafad027f6", - "libraries/3rdparty/mbedtls/tests/data_files/cert_md2.crt": "dca8fddabcfba841a9c02e2ef71f2f0b8e553531e8342bb37a47bf723710d4ee", - "libraries/3rdparty/mbedtls/tests/data_files/cert_md4.crt": "c8cd9e7909929678b60d9cfed28b8a71d56e2c8ac05f7be4da480722fd8d086e", - "libraries/3rdparty/mbedtls/tests/data_files/cert_md5.crt": "6b58c44889984514f7f18583138d831a8748ab0b193dabfed9e23bcd2962a3c8", - "libraries/3rdparty/mbedtls/tests/data_files/cert_sha1.crt": "d09400b2d5f1d189ad1c1745a5dcbfbf0c9e8223e57ed02522bc87ce3d092528", - "libraries/3rdparty/mbedtls/tests/data_files/cert_sha224.crt": "fb968a970027efd0317e94b50e2fe9e515a0404dcd73ba7ff86cfcd1d60adbd8", - "libraries/3rdparty/mbedtls/tests/data_files/cert_sha256.crt": "ffe3451b0aab5d89707e3dd706538c7df268609821f9ac71fbae804fae9ad74a", - "libraries/3rdparty/mbedtls/tests/data_files/cert_sha384.crt": "34c4d6e82b7ddaa6ba01cd9b6f0c3caf3dbaff320b47f770b6e939524d99e5d4", - "libraries/3rdparty/mbedtls/tests/data_files/cert_sha512.crt": "576836345a9ef43b29f33eaeb64de06f9bf95b052ac72463e7f1f77f6f9be0fb", - "libraries/3rdparty/mbedtls/tests/data_files/cert_v1_with_ext.crt": "441bbf74490e5e3c271770ba6907ceb8315ba3b3880203ae9ffb6c345b4f56a0", - "libraries/3rdparty/mbedtls/tests/data_files/cli-rsa-sha1.crt": "866a735d2f8e4913cbffd83d7f566f243e122ae4589f7440a8fe44da35b1cda8", - "libraries/3rdparty/mbedtls/tests/data_files/cli-rsa-sha256.crt": "0c9f037835a71595ce7e450b2b478852a3faf8f20ad8c680c9475d7f5c82355c", - "libraries/3rdparty/mbedtls/tests/data_files/cli-rsa-sha256.crt.der": "54583e3f6b904cc7d15940b84510df367493e85b74e273b0c7fa06e9cbdf762a", - "libraries/3rdparty/mbedtls/tests/data_files/cli-rsa-sha256.key.der": "c9af85bb77cb430f57ee1012b3af2aaebe8ae7263a618f19236a09b686e5b615", - "libraries/3rdparty/mbedtls/tests/data_files/cli-rsa.key": "660d13287799f69599adf0aff1db46ee42b4c492b0f153f620f89a639dcb8f7d", - "libraries/3rdparty/mbedtls/tests/data_files/cli-rsa.key.der": "c9af85bb77cb430f57ee1012b3af2aaebe8ae7263a618f19236a09b686e5b615", - "libraries/3rdparty/mbedtls/tests/data_files/cli.opensslconf": "93f28a0072b7049e317380f80080256d336381b5dde799b6560edf5b9fda4bc3", - "libraries/3rdparty/mbedtls/tests/data_files/cli2.crt": "e36c9f3a7036f6f5c7853c772a6b519f03c285f7e533af20ab2b95721c2179fe", - "libraries/3rdparty/mbedtls/tests/data_files/cli2.crt.der": "d2ae3024ffc46e785163539a421eb7eaa046126505212937863d510493e6dcbc", - "libraries/3rdparty/mbedtls/tests/data_files/cli2.key": "f3c47ba835345e9072b0f79628f2d1f539f79749b85afb92bfade5761fbd6757", - "libraries/3rdparty/mbedtls/tests/data_files/cli2.key.der": "557e06381c7e6448cd0d98c664172f6c143dd93cbc0e0d54561bac06fe86c62d", - "libraries/3rdparty/mbedtls/tests/data_files/crl-ec-sha1.pem": "28e158dd3910193eab15911cc39694544a8b0f5bc766e3e1da67f4ac434f9392", - "libraries/3rdparty/mbedtls/tests/data_files/crl-ec-sha224.pem": "907bd1ee58240b7c072e91676f0ebc9702a04d433bffd2384e69c05f6a2879f9", - "libraries/3rdparty/mbedtls/tests/data_files/crl-ec-sha256.pem": "929e7b1adee89d708c200ede454138ad787ebaf7b6de476e1d4faf3b1298dea4", - "libraries/3rdparty/mbedtls/tests/data_files/crl-ec-sha384.pem": "acba589402ef11c7e0cc2dada88d280770644029253b864779fdc5993ec4504e", - "libraries/3rdparty/mbedtls/tests/data_files/crl-ec-sha512.pem": "5e375a364c072b4ecefa09bdead1688a246ba0564be8dc87cd95d23d4876a4b0", - "libraries/3rdparty/mbedtls/tests/data_files/crl-future.pem": "c5c94eae1aca9509707811469e93f3acb7aac48847a2a0e2d9e74b56bb2e43ba", - "libraries/3rdparty/mbedtls/tests/data_files/crl-futureRevocationDate.pem": "9b87e8301b06cafdb544c6c5ff4a2736608ce6d2653e315c67e25272e3b5fcc6", - "libraries/3rdparty/mbedtls/tests/data_files/crl-idp.pem": "5de822f1b4f62cf742ae8b1a93acf160b988e8ba50450999d967ef3871b83a13", - "libraries/3rdparty/mbedtls/tests/data_files/crl-idpnc.pem": "ee36535dd23db1177ed5a52a409aeebbd9931d69da353e35f71e41bedfac52e7", - "libraries/3rdparty/mbedtls/tests/data_files/crl-malformed-trailing-spaces.pem": "93a6e9fde6b830aec66889e35af36c7a2b6d835992ac463ef73deb28fa5c54a6", - "libraries/3rdparty/mbedtls/tests/data_files/crl-rsa-pss-sha1-badsign.pem": "129c391ec45028057e8138f036e9864ec32a0189ab7432efb08478bee5f73880", - "libraries/3rdparty/mbedtls/tests/data_files/crl-rsa-pss-sha1.pem": "edc1bffec8a145087e6f66360584897b060a0fd3582f0143576f643ce0fff637", - "libraries/3rdparty/mbedtls/tests/data_files/crl-rsa-pss-sha224.pem": "637b7a8d60309f66f89a9ed9201ffe7618aa939d66fe630540f17e1704b923d4", - "libraries/3rdparty/mbedtls/tests/data_files/crl-rsa-pss-sha256.pem": "a1912cb8804562ae2dbca1ae10db45b4180bd70f56fb1134534b396234e5b247", - "libraries/3rdparty/mbedtls/tests/data_files/crl-rsa-pss-sha384.pem": "5d9144f238c0aefc2d0bf5293c3ab09203ab12919fb6173ed634d8e42bfdbb54", - "libraries/3rdparty/mbedtls/tests/data_files/crl-rsa-pss-sha512.pem": "7df28c03ec8286a8d00e3dcfa545a02d7885266dbd349c3c57e29a000478c6bf", - "libraries/3rdparty/mbedtls/tests/data_files/crl.pem": "07de7d8ec2532782314fef2d0fe7874df39afe551307873dc9acf862775c5bce", - "libraries/3rdparty/mbedtls/tests/data_files/crl_cat_ec-rsa.pem": "35249d4f945676d93b16bd9f15c7456ce9d774b52b524792497dab97b0432cd9", - "libraries/3rdparty/mbedtls/tests/data_files/crl_cat_ecfut-rsa.pem": "a62d024a1b8d82fc4011c4b3cf12b19598d8be72d4a10927f38f14da7710965d", - "libraries/3rdparty/mbedtls/tests/data_files/crl_cat_rsa-ec.pem": "a5fad1b53645e107a3295471cfa65631abc2718e0cac775cf97f519fe31a4c1c", - "libraries/3rdparty/mbedtls/tests/data_files/crl_cat_rsabadpem-ec.pem": "9b930fb641b1f042f873cc141eee7d29595aa2260116795af4d73517ad62aae6", - "libraries/3rdparty/mbedtls/tests/data_files/crl_expired.pem": "1c84a41b8da15aa1124f6479adfa6cbf111cf8a391a0dc7a2a9a940c30d3a5ef", - "libraries/3rdparty/mbedtls/tests/data_files/crl_md2.pem": "63f35ba431a5b98a8cccff50370f2a983052c0db8a244cc04ef37e4fca85e2fa", - "libraries/3rdparty/mbedtls/tests/data_files/crl_md4.pem": "b685416723dbad577b8e42b6bfa10f980be09805ca591c69c64d1b8a09b177e8", - "libraries/3rdparty/mbedtls/tests/data_files/crl_md5.pem": "8a3d0a4a56a6f8543f50059a6ac0d7a7d0c3fa3525d5f82bf68861e59f57f3f3", - "libraries/3rdparty/mbedtls/tests/data_files/crl_sha1.pem": "f98c02f1ec6a5a2f63fda160f8a7128021bf8b791b460d3404b171a57224051e", - "libraries/3rdparty/mbedtls/tests/data_files/crl_sha224.pem": "1dd5ee3c9d4efe7aacd278b933c613b901bf35c9d9fccad7b928a3ac1b3a301c", - "libraries/3rdparty/mbedtls/tests/data_files/crl_sha256.pem": "6003430f0ae6b4338aca8d19d431b5f7e1e7168f55d02b55b81597eadcf5286f", - "libraries/3rdparty/mbedtls/tests/data_files/crl_sha384.pem": "95cd5a37e5bcf335efa400e13b50cf0c4c2baa470501bda1110624b805fbdf82", - "libraries/3rdparty/mbedtls/tests/data_files/crl_sha512.pem": "091fe29daa3919c518c0590a48f86d690b3f1aa24b3650d58347c00dde61acd4", - "libraries/3rdparty/mbedtls/tests/data_files/crt_cat_rsaexp-ec.pem": "9d7b3df09c803ca77f07720a9dbef99c0bf76ef00212e75fe7f9fdfdb30c3f94", - "libraries/3rdparty/mbedtls/tests/data_files/dh.1000.pem": "e5fa5946d438a33a41573170681d5edd37028ab561774d3cc141fe6962aa4c2b", - "libraries/3rdparty/mbedtls/tests/data_files/dh.optlen.pem": "0a3b1ad06c9aa232f407da2c9557ebb252e35e8df7fa8b01d67be96633182e6e", - "libraries/3rdparty/mbedtls/tests/data_files/dhparams.pem": "93108f830ce1ffc74ccc5c0c45d74d29e2f4e0257bdde8b7d48875eefc12a1ab", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/00.crt": "558609858840dc17a9da804634afbf99424edb8db59ad99dce3687691785be67", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/00.key": "cd88d1232e351058359b9aafa390509951c1a0c6b00b7da285009d910e83ce1d", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/01.crt": "d5a0f0ff62316c2704cce682a6640c78792325d224fd41241dc11960a2a9688e", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/01.key": "c20a5c6eb77c8cf63543107c06dcdae2b49f01622e2d10ce6dc09e59397dcbeb", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/02.crt": "1869b8a995dd86666cabbf176e522db7757193f98543effdf188fd5fe569fa17", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/02.key": "14e626f8c189a5ff349d8efe35d7c357b75c59c1c267526fcac878743aa53d78", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/03.crt": "f3be18625e10235fef73c6de3c4fe1d62a207a2826f87d02749f2b3ea3aa858d", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/03.key": "a04dcc41508c378372d26098665de22c83a63a76ccd1c2533eebe1bf1b9555a1", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/04.crt": "de78b79629f7a6ab401a48d61339d6aedd2f6a553ae4c8c36268f71b0d24f9e7", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/04.key": "28befb1d41f11edfff3c447914acf25d2f620009c184ecd75c6a1a120b24f76a", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/05.crt": "af5679a5655a6db92618c0b103d2e69e869e6effc917df13600754a2cfa2c259", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/05.key": "39e58ffd6ccad062dcbd4b4e3cb1ac31aa27eb378fea6e302de2785c0becd276", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/06.crt": "aaba17838cd6669deef4cca0f0e0b504e8fcaf57e54d19d501a9edf9d8361884", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/06.key": "4c48922433ed3ecd9df09a530a094eefcf61aed3a979c50c138a260a9fcba808", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/07.crt": "9ec6ff17c6f0c030cc25712329f31d0ec3fb7f887ee10ae130ab888693ec6c1f", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/07.key": "54e16d5b34cef77bbc747ea32cdea3a512ddfd0c97e0a2856f2e9fbb8224d3b2", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/08.crt": "2570b5067bee9ab0ac87a7a49d9460120e5e06d85204472a973c1e2d748b5e18", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/08.key": "eb9dc2fb50847a846ad4f36e87c8aab98964e3c4cd3cb5a270158a2352022ee8", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/09.crt": "dcc49f4d753060f11ac645a661e2fafe122f33646acc808d472678ac824ae167", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/09.key": "ea99373ba8ef0158a51790aeac4a17fc02929be89a2a41b509c1be7fd6cc7310", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/10.crt": "094319da4d3a8702483b88ff111fef9bbbf9ea6452deb2421820ac0408aae81e", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/10.key": "74414a3cebefd13ab9d5d6a3b0c2895c39f04deedece9e9b564041d448b49a71", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/11.crt": "16a2d5c046d9953e6782cf6c1fb9f12e4c2e5af2be0b45aeb95292e36b2782ed", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/11.key": "a969b40ed5608775d422fd77636b57c8ae7f7445aeaee4bc36171d37287d6232", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/12.crt": "83def2adceffbce4e823b26d30aece634f65234ff30da599327866180a5dc21e", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/12.key": "86213c8881730842dd39b5beb18eed0bc359576faebfd9a3284e82c9b917985b", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/13.crt": "61d4ecefc25b47d22907effb3b2777db2a92fe74a5da1e45982593de0462c37c", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/13.key": "3adcac5db34bac9243e241cd3d411c408c40c072a0640736e641b2f5770fa22b", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/14.crt": "f69c6bdc9f951170183aeb916efc9b33a6f4c393c3431c014b2cf066f0d4ef73", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/14.key": "e2be9d236ea1d90882d8bbb1863544a3e765ac0916870ded784d89a660d35f42", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/15.crt": "e7ff71176744b78d63e305d665f9bda2ce6a052bc774c72e59473da94e86a687", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/15.key": "25f574ba3a37d6edb1b05352976cea0f8e5d42dd222fe86d30fc640daed78c86", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/16.crt": "95dc0c5c32c7b8cec9f3adfe98838b7de74187ba79f7e228e0b8088d85e01b45", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/16.key": "f78786f4534f25e2effd19746c481f8c795347eb700bf0584a046354054430e8", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/17.crt": "c07d3fa651f1b8e3b0fd9c3841ffeabab1a17f8a76f735b45c1c14dcf2f2f7e8", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/17.key": "cc1e209a9cda5fdff62cf61628cdfff437a7301e483ff0bb339c544d6a420b26", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/18.crt": "4ece74c31247ec25e9275064db5a9438b2d134b48318f0a2b2b0b9a49ac85982", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/18.key": "fc91156511ae0f490825d3c170a2a708f2b0c8107124bc0fa703dd19c12695a6", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/19.crt": "8cb73807d9c53caee9487e713232ac69694092ad5a6d51ff8db37bb9dd56cde2", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/19.key": "5ceabbe6c1af30a28ec8d0d58a4911ab557304e5fb84a90e7a1cc48a33f576f3", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/20.crt": "09bb73126d3698ab939d469f075b425b4172d45b160743cfc50c137f876a6cd7", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/20.key": "a7fc55a3a918fd5b46d9ec2c166a226c361e1e6bc5ac39a33e97c1d664a17715", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/Readme.txt": "89a5cf249f1f1db829a748a9e051ecd9014d448f1f6083000f7a63ce7e7006b0", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c00.pem": "558609858840dc17a9da804634afbf99424edb8db59ad99dce3687691785be67", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c01.pem": "fe9151449a7925f644a2de6d4c242bacdd4e01f0182805a3a09fbdb5a887230d", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c02.pem": "5d259cda21032c86b9dd371264577a4ec6b8f0d652729ba0aeefe99ee8cd59fe", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c03.pem": "0f7bf5e1070c69e6dbf1755889f62b92a329e67233f91407cef9bf934d8cd224", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c04.pem": "45a06b9e7cbf5e5a83725f5e524cf905bd8710dc6e20beabb3ccd5212fdb5232", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c05.pem": "f73789e296878cb979abfb9c0829da492b4729cdd3d28ae2c06b6e7976ca0154", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c06.pem": "07077d1c4a9a444e187e4a9b00cce1acd5ac8135ffe8bce9ca03e334f680692f", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c07.pem": "a417f92841ad64c79207afe8f858d8d4acf44a658451869b2b700cfe4c80a0c7", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c08.pem": "14171c21db9d34cc0984f1f865cfe6cbda9ce3743df4dd2d159767e8532fb016", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c09.pem": "5912ee75858880857a48f1b4b1f5f5bcebe0fe41642198ae0a0853d56c8e9157", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c10.pem": "cbe574373c7d1989baa1b67249ddbd467f1f0882fe68c61191160ced32b607f3", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c11.pem": "8194cd820d069233b2ff62126d19e0e2704030acf20b8f424b39bbc8470d7fa7", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c12.pem": "338b7d86776b4e92e14fa9fa59e2eba86c8f7cc35b0fb79c1d0530088440c9e8", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c13.pem": "389cc52f557cb4fb23926dcbdb4f905ea8cf241f7807321caa90f1c11f919aa5", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c14.pem": "b9acf4c1a26e4a88fe206300987f4a377770e74cc6e524f36a46313f48cd896b", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c15.pem": "703fc1e8838a0fff288d2c079c01d63724ffa3a65aba80e3a985bf8768f5e462", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c16.pem": "569fbf14527ef2ae42de5834d7b210539b040603bee91422b06167843a0e6729", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c17.pem": "c1f325141c11a37292eafcde2a310c5cefecb1062a5e282376105d90851debf4", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c18.pem": "e16bd5f39ef8013b0c48843db8334a450154f75dc3bca0c36021cc752369db38", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c19.pem": "f7896c40eaf4afa3781757083f2aae5239e9ba164da488bff63cac87ad2417e8", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c20.pem": "18a64222ea63f7b80b3b3a844a61065552712fd528edcbcd4f1cb8076a928ac8", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/int.opensslconf": "5db05d936789d8a7433abdab86a8925679b1467a23ebaaa6293f1f3287c53766", - "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/long.sh": "86c14d0a1b264c69e5bac26fab7904d91146842eb7c0c7d71257fb32265afe86", - "libraries/3rdparty/mbedtls/tests/data_files/dir1/test-ca.crt": "d123b3e7e890c87fd8c7db00b464ca70755bb7aea105432f32e0d4e7724ae4e2", - "libraries/3rdparty/mbedtls/tests/data_files/dir2/test-ca.crt": "d123b3e7e890c87fd8c7db00b464ca70755bb7aea105432f32e0d4e7724ae4e2", - "libraries/3rdparty/mbedtls/tests/data_files/dir2/test-ca2.crt": "69ccb7250fc0fbc1b479dccd70d2561e33255086a0f4e4a8672f92e0cc8e754d", - "libraries/3rdparty/mbedtls/tests/data_files/dir3/Readme": "fac09c08823cd79f534a5f5ce76e05ebda64be718f6457d44e84928231f17225", - "libraries/3rdparty/mbedtls/tests/data_files/dir3/test-ca.crt": "d123b3e7e890c87fd8c7db00b464ca70755bb7aea105432f32e0d4e7724ae4e2", - "libraries/3rdparty/mbedtls/tests/data_files/dir3/test-ca2.crt": "69ccb7250fc0fbc1b479dccd70d2561e33255086a0f4e4a8672f92e0cc8e754d", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/Readme": "2bbd3bb85c7080f5745b528ce02b75b5a64aadfcde3cabcf06e7cf068b5f9246", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert11.crt": "d4f47ec1c0d4839eeae9ee8046bda1245b4f714f1a4753eed290efb4a6fa9903", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert12.crt": "e72d7bec40aa781c3c32af83ddfa072b0b0d2bd94a592754b1b05ebe34ec439d", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert13.crt": "55cc6168c43c0b72c7d01248b700a87cb08deea3b35e0e23930606e717b5e5ab", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert14.crt": "92d0c971e08161ca0ee52d3acc16287e31d24d1d3f2697490ef1f902588f3385", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert21.crt": "2d6c5926bf8f606b39933d88f95c3542c6cb7376af2201910c6aeff3e53224c1", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert22.crt": "8cf8a7f8e55e7f533988f4dbb0fcfef8b42f75c94a5fe06371b6cecaf5efd1e6", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert23.crt": "1d7dd79328c314c46169974f94269305263f4f3953e611f6965c510987a05516", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert31.crt": "09ae249d2d0f85a2d7cbdbd7ada36ed1b211ba009d3e48a82596f753c89fcac2", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert32.crt": "8cf8a7f8e55e7f533988f4dbb0fcfef8b42f75c94a5fe06371b6cecaf5efd1e6", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert33.crt": "e9aea2a62046c54110003c435c42454898ad6d3172e86be5c15fbdf845b047a7", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert34.crt": "5d8e5d9b45730b99ad6f0a695290996253fd09cadee34e6d093ed22b575b5d7f", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert41.crt": "80b0b7c00c4ed0e6281406b0182ae723ee28d0ac83ab916cff5a1bf40fef3634", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert42.crt": "5fbef827479243ee08633a600e8c14dc43d0454b2475e506aabea78f5a68d57d", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert43.crt": "e9aea2a62046c54110003c435c42454898ad6d3172e86be5c15fbdf845b047a7", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert44.crt": "bc1d4a8da29b153ba628b442901a08ea844040a3226f197162fae6b42a35efe7", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert45.crt": "3f38723bb879d875f42fe7e9d798e5618b0e7f90fa0df85e47b0f8b04b92bfa5", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert51.crt": "80b0b7c00c4ed0e6281406b0182ae723ee28d0ac83ab916cff5a1bf40fef3634", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert52.crt": "5fbef827479243ee08633a600e8c14dc43d0454b2475e506aabea78f5a68d57d", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert53.crt": "e9aea2a62046c54110003c435c42454898ad6d3172e86be5c15fbdf845b047a7", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert54.crt": "8f94e2b812adb33986cf91b4efbd064755518b76d3814ca1bcdb9f5e0dfe2690", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert61.crt": "09ae249d2d0f85a2d7cbdbd7ada36ed1b211ba009d3e48a82596f753c89fcac2", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert62.crt": "8cf8a7f8e55e7f533988f4dbb0fcfef8b42f75c94a5fe06371b6cecaf5efd1e6", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert63.crt": "6fdac8688e057f8531bc120b3ab9d6e288cfdf19f4d7d982746aa92c634e4b7f", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert71.crt": "09ae249d2d0f85a2d7cbdbd7ada36ed1b211ba009d3e48a82596f753c89fcac2", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert72.crt": "8cf8a7f8e55e7f533988f4dbb0fcfef8b42f75c94a5fe06371b6cecaf5efd1e6", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert73.crt": "0de79dfdf640b6cc736061799f6c1fa1a7d8aee09eeba43e11285375f7a15fc9", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert74.crt": "93de8e5ac8d25beaef072a43e5fd1767e6937831d745c62345dd8d6efb301154", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert81.crt": "0f4c48d44ef2863bb063e76c25608250a2817aa3270161e6c5cda322a43b3919", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert82.crt": "9de3b7854f7f803d98703f98b47dcfd0022359be5bb8fb4ba4f09cb68afb50a7", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert83.crt": "cd92f55a61ed691c23cc268faf7f4d6070a8a03cd3989f915453a6e51542eb19", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert91.crt": "6e4b75377ad27118072f6fe98239f609fad9f97b3de5b333a917e95c9e59028d", - "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert92.crt": "e5cbf36cda413d2659ff53121cf1163099b4275fd3f77c3ce6427a9f0eadf1ea", - "libraries/3rdparty/mbedtls/tests/data_files/ec_224_prv.pem": "2c5f6e9a1466fd74a1ee2eb5f185abe903bbd67633a3bb3425ff951a5a17e181", - "libraries/3rdparty/mbedtls/tests/data_files/ec_224_pub.pem": "21679b5df0af750c766616866c695e8dcb93db4501d19a6febac7ff599d88ec1", - "libraries/3rdparty/mbedtls/tests/data_files/ec_256_long_prv.pem": "edbb78411c53e20a480854bd1c55e26668310d1729a0d7ce448138abe51dd763", - "libraries/3rdparty/mbedtls/tests/data_files/ec_256_prv.pem": "0405a70b26333c2555e31ae665c0a5f37c6cd0e38edf5695afe3638743bdd903", - "libraries/3rdparty/mbedtls/tests/data_files/ec_256_pub.pem": "77b4f55e6a1ea1db4c72a71efb973892ac4a2015a65be470d274da811d9d6cc6", - "libraries/3rdparty/mbedtls/tests/data_files/ec_384_prv.pem": "ed3a69ca0c5f4c62fa2c7b64951a11d1378abb72c3a3e439d7e06a9ec82c2075", - "libraries/3rdparty/mbedtls/tests/data_files/ec_384_pub.pem": "436ec39c20378dd1ae41765df9937e0138f4d724beec8062d4834e03da8cdb1d", - "libraries/3rdparty/mbedtls/tests/data_files/ec_521_prv.pem": "ecb4bed1990396b35f4cc0d3e2fa99b4e3876c89bdd05b691e0c02ad4b43b73d", - "libraries/3rdparty/mbedtls/tests/data_files/ec_521_pub.pem": "20eb17b9dba162bbb2e6055da194b23c91ec71caa47bc022f74f239eb8c0d711", - "libraries/3rdparty/mbedtls/tests/data_files/ec_521_short_prv.pem": "f82aecefacddd06e07012fca5751cdca618487c0b97ade4354e082900cc061c2", - "libraries/3rdparty/mbedtls/tests/data_files/ec_bp256_prv.pem": "0777db4161e8fd9cfcb0833486ea2992f1e173c22b53520e60799a905b05121d", - "libraries/3rdparty/mbedtls/tests/data_files/ec_bp256_pub.pem": "6fdc2e11f20df144d0b30a8227efddc13c13bc75a8ee7c3cb0d39a6dc7bdf9b8", - "libraries/3rdparty/mbedtls/tests/data_files/ec_bp384_prv.pem": "a72bd58d95029d0d6ab68219a29a25f107e235feb0543df7867e28e2a94f881f", - "libraries/3rdparty/mbedtls/tests/data_files/ec_bp384_pub.pem": "f68679ce7aa4e93e9f3acecfa9458fdc6f87a8895d0ea22c477db93c53226723", - "libraries/3rdparty/mbedtls/tests/data_files/ec_bp512_prv.pem": "9873530d30669de09947d05a9a111a38cd81376e2f97726c42250b958c6a1a0f", - "libraries/3rdparty/mbedtls/tests/data_files/ec_bp512_pub.pem": "31659f83a80457d707177c9436a46b4154ccd1c01f01c9de4685a7f8b59245cb", - "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8.der": "fd7e1a365af2323008b0195ec77a95ed9e59104fdbfef1639cb7022ee09c9a01", - "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8.pem": "c6bbe5affbf9a953c8d2124cb80fb48c2e9344b796d328e8c385a1aea5edde64", - "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8.pw.der": "a1e9f7ca94578cb5d21b71292c3a56a6e147751924b67820dd9aad9249b5ab47", - "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8.pw.pem": "d58913cbb587fca417bcbd8c2ec09c858206cee88de3a1351aa8601791066c82", - "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8nopub.der": "22d2162c7b342417c33034ac3aa56f79c01b9874a2df694db9ebd95542380ae9", - "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8nopub.pem": "9587d1d0e4c45c1601faa4384e1bd5634a37f4a86ba4fd85fbd7fc85ad110d20", - "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8nopubparam.der": "2a3381bab277bbca12f4b909335f7a1c13e46c19419c03b18a93be671bc6fe55", - "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8nopubparam.pem": "729ada4d58b82f741acfe7af2649b456c6b2c9f7297d202b83a0680ba4004685", - "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8param.der": "c4352a035ff6e0afce8f8b5f8358e10a871c373f93f3fef3b247245d8ba4d509", - "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8param.pem": "609315a12cb3e58ab934a59c30bef3c835e835bc44244fb640d659f66b82dd8f", - "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.sec1.der": "c5eca7361e00be801678a707c5ca3c3b0dd588fbdfde82f1d29a410868f1c5c5", - "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.sec1.pem": "e4717c4b0e7e29eda161a63f5d778ce42e87e99e2ce8c440d209949f8fa49647", - "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.sec1.pw.pem": "23052547d6b30dfdd3831b5b38c5b11be5bfc90afabe5638b7799a1fc6c67d01", - "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.specdom.der": "4ac48937c8eea09c6f541e8b27b6576276224301ff1c6a6781f3636604540286", - "libraries/3rdparty/mbedtls/tests/data_files/ec_pub.der": "f1b8c5f2626c5a823450e704ad8f7e47efbb3bc648855e0e3ecc471e6c7ff0a8", - "libraries/3rdparty/mbedtls/tests/data_files/ec_pub.pem": "85c0df2b3eb7e7149ea7ea1cc614f7c6acde945ca5264c2d5ec48a23a3c25419", - "libraries/3rdparty/mbedtls/tests/data_files/enco-ca-prstr.pem": "9d6be316630c2d1b2af5f07a0484b39b3ea0d001e2152436e0d3d6881809ba49", - "libraries/3rdparty/mbedtls/tests/data_files/enco-cert-utf8str.pem": "83a7513ea4c9e312e624d151ec1cb2c8cac2ae0db46d5bce813ec5b5d734d6dd", - "libraries/3rdparty/mbedtls/tests/data_files/format_gen.key": "dca1b0916b165817b00f17cca5baabb6cec36da42915d10dc1cfef66e8956c36", - "libraries/3rdparty/mbedtls/tests/data_files/format_gen.pub": "76b4975658959d263f2d4a4dfdd234151bbaa986dd0fb3127e30d67bb3d5db47", - "libraries/3rdparty/mbedtls/tests/data_files/format_pkcs12.fmt": "faf2b10722fe00c42cf53ecb3f73a926237da099f488dac79beeac62d45e4051", - "libraries/3rdparty/mbedtls/tests/data_files/format_rsa.key": "4be0c523a0e7e848d00bfd0f14df939cad57cd23fddbc88f637b8dcef84844d9", - "libraries/3rdparty/mbedtls/tests/data_files/hash_file_1": "975d0c620d3936886f8a3665e585a3e84aa0501f4225bf53029710242823e391", - "libraries/3rdparty/mbedtls/tests/data_files/hash_file_2": "11fcbf1baa36ca45745f10cc5467aee86f066f80ba2c46806d876bf783022ad2", - "libraries/3rdparty/mbedtls/tests/data_files/hash_file_3": "9ae4b369f9f4f03b86505b46a5469542e00aaff7cf7417a71af6d6d0aba3b70c", - "libraries/3rdparty/mbedtls/tests/data_files/hash_file_4": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "libraries/3rdparty/mbedtls/tests/data_files/hash_file_5": "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0", - "libraries/3rdparty/mbedtls/tests/data_files/keyUsage.decipherOnly.crt": "b704f88c55cca613eb99d8669eec61d5ccd8d17d79b3873497fc9819869a9289", - "libraries/3rdparty/mbedtls/tests/data_files/mpi_10": "a8a8e03559b9d8bd1ab263ed74f56cfdc255bb1f4d68c6d75740574aff1d47ea", - "libraries/3rdparty/mbedtls/tests/data_files/mpi_too_big": "1df9e1532ab98dc1592bad8cdc8ddb439820ee7be4fdd5bf66e809f04dd50702", - "libraries/3rdparty/mbedtls/tests/data_files/passwd.psk": "ced9f110932d025ad3b20f9f8a711eba701f83d4b776888b2f310b9a15566cbd", - "libraries/3rdparty/mbedtls/tests/data_files/print_c.pl": "ede2a97f4090ecba0574cf6259b8a7ac14ee72582a7f9d3818d4618e76ba737f", - "libraries/3rdparty/mbedtls/tests/data_files/rsa4096_prv.pem": "fe1368dfb5816c1697ff7842aa4da44fa0961aac16dea803f7b0b1af922f692f", - "libraries/3rdparty/mbedtls/tests/data_files/rsa4096_pub.pem": "e3afcd3274efeb06a3354eb8346a20f3cbcb58025b8a11cb485e896507c4fc64", - "libraries/3rdparty/mbedtls/tests/data_files/rsa512.key": "799d813958afdbab03c10fb91df109f7d7ee0d9affd2282cf050600d50b97d44", - "libraries/3rdparty/mbedtls/tests/data_files/rsa521.key": "4bc698df7312e5ea0a9bda75bc876d16a25a30dbd6d34483b3252ce8224ddf2d", - "libraries/3rdparty/mbedtls/tests/data_files/rsa522.key": "aa458ff31c66c8f7af7c6f07418ac9479bc9aad4d8d1e5128f2d7455ca52eeed", - "libraries/3rdparty/mbedtls/tests/data_files/rsa528.key": "614f9aec7348a481cb5477c47c3bf76d6af8f4a5f21cc875a8efd026c3bdb085", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_1024_3des.pem": "2c387321062ad20d5eff5ec30ba57cde1b1788253e315cf3fef64d896dc6141b", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_1024_aes128.pem": "5032455d9ae5bd96fec4a14b409d122101ad3f074a29b6af28f67c7081a82366", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_1024_aes192.pem": "2628892185635e4f459444f7f5d17dc9f3b0009095d12a11c634bd3a333e4aed", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_1024_aes256.pem": "5dae5ea1714082b515a073ec930d9ffb3294ca2a12a66d131cfb5b35489aca78", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_1024_clear.pem": "0112d73365e459106014ed440d6ca6d45f234370939790e21e9267bfb073bdb4", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_1024_des.pem": "08e9aa7dbf581581131532213ede5f76222efb3c5df3e1d8e9d21f77ffe97be4", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_2048_3des.pem": "7576eec37b28007c0fecc1023ffc0cdd51c5b0964f9d02aa1955774ba9f06fcb", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_2048_aes128.pem": "ee8bcbff13d7f58c5bab527d72b793fbf2085a568ea25af446017f214531dd17", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_2048_aes192.pem": "d24c88836bc1c4cd35734e9fc252ce95f07cf4ef3eb45726ada77b82e3177bc0", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_2048_aes256.pem": "182681da70e9eeb1d1508ef4746763fcf14da6eebd414bea090717c0f830e52d", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_2048_clear.pem": "3e79c3cb57eb569c4271f69b90b3f9475b02d32b835c91f29786a02d5c04a510", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_2048_des.pem": "42183ce524fc60c316f9eac695c30e758d295a0c8013788053c6c43a6ac7fd36", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_2048_public.der": "f9020011c92bc526c75ec849ed15ca63c12d64129cd6b3fcbc5e4fbd9df9b810", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_2048_public.pem": "3c28eea66473c3d3ba126da0c8d7af98e00d1d2f8e7d00a7c55e9a2c5119a850", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_4096_3des.pem": "a5314e0d8e9ae1e34afe514d9219d507c1f018156bbbcd9ec36a5a935f8186bb", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_4096_aes128.pem": "7d544b8d1a6f552c90e4db19d84744b316469d8d6a4eb31e6ce9c6abd8e87e57", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_4096_aes192.pem": "1a05e9f1f7152126eb08dffba59841ee525319b46861ee3ed526c687195bc95c", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_4096_aes256.pem": "cc66bcd61806a601f33ad93a47a53f4785470e2fcb3ded30a77611b1876cd05f", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_4096_clear.pem": "c6ecb3e03f0920f35453d72490e1139f11ecc38a19bd6a1cd89e9004779a372d", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_4096_des.pem": "cf6d0a97cd7750310bedd61e505ca57cbe585c33f6f649426e661551a37ea44b", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_1024_public.der": "e0e4deb81619f62ce2f76795a2f1c49c53c641775c66ae5fbbfdfca7f459442d", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_2048_public.der": "b6cc4647b75d49cfdf45b23ce11aa981f122bc37dfedb0c34cd9cae1835a865f", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_2048_public.pem": "484598e3aebb140471ac33f1b7ad5b404b2264565c0bc3da4d0a5a2018efe004", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_1024_2des.der": "1528b3dba6da80e638cdba8f5b6c078d2012a478e7bd46b6337b2fd362afebcf", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_1024_2des.pem": "7af1096ceca43dae032b481d883e553fba9f222fea125144add0be3b990ee190", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_1024_3des.der": "07a45d24466d4451387f3c11631fee2a7a569d799b6bad4a6ddf8f833e75699c", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_1024_3des.pem": "1971878eef033bd7848c08b815398671a58e8daad5ed01c4afb13205199126d9", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_1024_rc4_128.der": "e37a91a67712970039dc97fef17d876e98095a42f98022624d1acbc7109dd84d", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_1024_rc4_128.pem": "80171741dd3fabb400c2b3e913c1ef2ad24e542f40ee8cc789c41a82958ba969", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_2048_2des.der": "5408d3b730a49b89454651bb2fa431b67215fcdacd8548af5914f1ed0bb786cf", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_2048_2des.pem": "50c2f177ca4d72d06bef23514df39c1d59ac317b7905eff5d73452f22b5fcde2", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_2048_3des.der": "20f9635cd74121e7f40099585ed44e3df6fad7d27b594b71e4a4cb7f931802c0", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_2048_3des.pem": "cde352fa9773ed8fd8888f9bb69d33a1b9dd13dab18f58620f9106b27d603c7a", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_2048_rc4_128.der": "993453b973c65b34d97e7bb1179f9d53e05def19ae6ff1bd33f1cbd85b8d44a3", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_2048_rc4_128.pem": "9fd1378fff6967d5fb74c26cfe5e311e9f1ecd3d8041bc195b1f94caa8ea003d", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_4096_2des.der": "0135bf69430620321b84534a898ae23ca651318a2fbf4f847ee4d8a98511e5e3", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_4096_2des.pem": "7577944396863a97be6fae436361303947778616d165b687b319f9353e80d4dd", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_4096_3des.der": "14900c8e0500418775322e7d7ee4d666c0dac142630479fc9b3788c9c899968d", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_4096_3des.pem": "9a37049edb24ddbdaa1a65cd374068bca32d0049048e88c8c6e38094924213d6", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_4096_rc4_128.der": "a0b2115bb99a823eeb0e0c9e29786bd426c2e4ab192680030cf36866f7300ff0", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_4096_rc4_128.pem": "83e49de7ad3ae1b312f3473a435e14448b5627c5bd0e029ce8917693d878acff", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des.der": "377485165326983aa5a84efeafbaa2ab2bfc6b2ef26b7d0cb0ac62a6e76c4333", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des.pem": "4a89853da284ffc3faa351fd7590af5cf161818c1751140317c63dcd66e759d3", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des_sha224.der": "c7595eb54ad5ee1124767a49156fc1279d3bd63d1745f16666e0df2c88c82612", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des_sha224.pem": "085440d612122680999baf05e4efe8a196f5c39422a2a6c97093e49ddd93f911", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des_sha256.der": "420f7d15d7123478b22d2a0cdfbca16a65809e9e98c4daa1bcf168f348e7f971", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des_sha256.pem": "0c9768289c6b43939c29b864bb984b42c9011c88fa8494f3856ad284fa5edf88", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des_sha384.der": "212264f9eef95b72eeb5777b95e0a042e78180d6749f79938c58bc70d928cdd8", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des_sha384.pem": "740a53af16f5499b17a9b2e59e839f2b95b3669238d631ef06aed63cf8135725", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des_sha512.der": "47905380c77231834a773dccdf06c376fc294a1e13b59f6727196db570f4319b", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des_sha512.pem": "7533d5a146e37001dc57d1f53e8a38182e3925747bf02a1667331332f584709a", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des.der": "09ce34140f0fca9c73c786a90c883351dcf2c22713538dd70af33024c0af0860", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des.pem": "708e7466c2c45ba4681528d62b598a708480eb8fe8b28025e53cf340bd12c55a", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des_sha224.der": "9172bd5c29dff754d8b2dc094fb402c0db98445f77beb99865513badee29ebd2", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des_sha224.pem": "7c80e405d73324a7145ce944f1101275ccdaa2d33dc67d5a5c8e0ad53299709a", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des_sha256.der": "aebdbc8324265dab166be334ff9fa2d4201bfd5c8b70d0907878451ad4d8fdcf", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des_sha256.pem": "98162c6a985e733250cdb9a717c57560ea48ae804800020b997bb9cc633f81fa", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des_sha384.der": "fcf617efcdabb117988a32e5ec0291bfca9116212412d0343bfdd077aefd7a65", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des_sha384.pem": "8653bc8407ef8d9f96b46b1ee6342210234eaf4b5a947acb7807d9f79853a3f5", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des_sha512.der": "1459b5d3cbce943f56f01d69ee2ad2f40877638be699486c8805e7ccd01cf8fc", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des_sha512.pem": "2d7a6c0e119bce4a94717956ea740989866046bf318454c5ea501975e2c16094", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des.der": "6cf06096fc2e23a82f4f70a7197efaf8f148e02ad450cc8ac7a9f3dc4334d85b", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des.pem": "d15cba2d636473deca31d86aeecb0197c966f179910b3b86e92736227146752c", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des_sha224.der": "95bff3dc143382f6c5de5baf2f72e3f41a0da2ef308f613b25312034c3740cab", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des_sha224.pem": "a14337e04dc979d9a3bf67a7c14376568b158249cfd904b91f863f821d811415", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des_sha256.der": "2d502dda0c522d92ccb5b946ea29b8733e682cc4298cf4a6eeb5f0edae0e2109", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des_sha256.pem": "f2c46ab52e1f0d2eea7b99dcce07fef029472bd43444dec83a24da7517616fcb", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des_sha384.der": "5f9b98613a34b6637f556c963bd6bdcde74bddfabf0a6dac048109f63c0d75ac", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des_sha384.pem": "df6de7e2ed97fd20b4476d15e849ba8a03449b2baf8984c4660fbc45e2fc3154", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des_sha512.der": "036c8d1d5a030658232b2ec50f68f97824543bccfe7d7216283ccca076eced8e", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des_sha512.pem": "948f06fc1775e2ef3ffa518bef5b047801cd0c6ad5515285451704ecd873280b", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des.der": "715566f5d9b2734d7713d563907733bcb6464108d9d3acf2f8cbb7c85de5fa3a", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des.pem": "8d94de2021aea75f8c2be923b10dc2dde5ae20611ac59d11e1a33d020c656ef5", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des_sha224.der": "d277d326771d241ed17154ad594359c0228cc350863b876a4c6b15ffcafaf97f", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des_sha224.pem": "65cfceefaf228bcdcd2c4132b27bf14f59bc006dbb00e6cc315340b971f03a10", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des_sha256.der": "6fabb1625c1548fb83f9b4a0fa4556c4c558a7a361453f1a700c2182fee3d5a3", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des_sha256.pem": "87a64aef803b3f878b21441d4363bd92d339f67c3cb0018dafd3a1d2d01935b1", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des_sha384.der": "5f409c99efa3c088f97b01e5db813ef9d87ab2d014a6c2921dfc4b2ef673e0cd", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des_sha384.pem": "68955f866f9fd9b804d128d862a5180e64903bba63b36184ebcd61215078bee1", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des_sha512.der": "a51ad7c84591007089e60fdbb05d8cb164a107bbabaac40ee948d9bafe4c7e34", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des_sha512.pem": "f6bc393737cd3757742966fb7db6912f1e817c2fabdef1f812828c2d5f374387", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des.der": "4b3d847ceb28e1527398013d84b7e7a3ee4fc0225bf6d91ae170f376b4a759a8", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des.pem": "9736c1fd60bdcb63665cb2903a6eec86df2f72c59c82d54eddcc7bb58f4b6e5a", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des_sha224.der": "066799f295a92258bbf8299612ed784127b66ca64ca112231c6cc7b2397038d3", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des_sha224.pem": "d905f3b6b08e38c7d303c90648917da59e0bb03ed7fcbb25b9093f8b2cb1ae41", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des_sha256.der": "2d1c28777ed1b84414d8c17e0be1a667cd46c98e8d10dfa6aead383c503688a0", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des_sha256.pem": "f1523efc7496c198189d9f37298dda2e410ce28af16281e851d4c39a9ba49668", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des_sha384.der": "46c062c7390225dbf7a8ed6f2837a8a37e724986b82c1e64490acf49ce783ff3", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des_sha384.pem": "c899858881141168e0daf871d54e201ce659548fe76efda6cbf8be8c43a75dc5", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des_sha512.der": "9c5b6f7b10e2a73a7bdff474cda5301a6b04ad4858268d2d37b36e24925e0b94", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des_sha512.pem": "7380b0697efe46ee612f70660d9465831e38aef10d1264d55b9b615373b1e282", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des.der": "d1397b7bbc76dad97529e3b1c59923a732e19cc3c7caf099149adbb57536d0a2", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des.pem": "0d6a32350b7caf5e179cc7acfa18a1918897494cd617f1de067bc0d250a00f38", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des_sha224.der": "e83c88036a7d70d2721db82c98d4737dc3cb7fa7550b0afdfd3313e6ba36ea9e", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des_sha224.pem": "94fed3e23676ac1d14652e6c9c9238fecade01cc1838fc8f2abffe15e53ef160", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des_sha256.der": "d1a828ac6fd4a259887053f315cea37e9324b789c8c6263cf73df6480cbfacb1", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des_sha256.pem": "b583d5be7de2d3a854527436ac421da0f10ce1307be213e5eb0c24fcf814a826", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des_sha384.der": "80186b3273d329fb9b48aa970011c9c6eed4082727b273c5c84561e315c89eb5", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des_sha384.pem": "ef178d8836c7f8b6d5e24b495d1b2ee842b22eed17f55a51b8186ccd8eab7ef0", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des_sha512.der": "f39817b0f863684080545ada28a90bc6c59fee310c36f69b083ff53dff1b570a", - "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des_sha512.pem": "8778569cfdb0b38397064f2f01a64e0e3168a70f28dacf7a0e43b39714545e58", - "libraries/3rdparty/mbedtls/tests/data_files/secp521r1_prv.der": "d5575481be80df94b1ec0361cdb142239dd3fb04100247d78934d5a66b5083f2", - "libraries/3rdparty/mbedtls/tests/data_files/server1-ms.req.sha256": "eb6640edc8144b2300988f9dad2b5c0b1c6a7d429bbe8bab31aac8a7b5cad62d", - "libraries/3rdparty/mbedtls/tests/data_files/server1-nospace.crt": "a62cb8ce57a683677156ec67e8a6cd95892cac5d67851f29b3b7cce2be39451b", - "libraries/3rdparty/mbedtls/tests/data_files/server1-v1.crt": "b3c2327c7758342520e9cb485d788d0f475373dbad95790aaee5a4eb5126886e", - "libraries/3rdparty/mbedtls/tests/data_files/server1.cert_type.crt": "5fbedc50290f06c2c68b4e9df688670cb43b129b8f1289dc7a6d69160ff34bf0", - "libraries/3rdparty/mbedtls/tests/data_files/server1.cert_type.crt.openssl.v3_ext": "9c3314a4b2070dcf77c74ce90f5dc5928dd4e608900eb24097e1c1647daf5790", - "libraries/3rdparty/mbedtls/tests/data_files/server1.cert_type_noauthid.crt": "d557ca07706519d45aba576e8f2a4d306918b8d7df05c094411d9a38263db7a3", - "libraries/3rdparty/mbedtls/tests/data_files/server1.crt": "65daee0ad2689c420de31254b1a4d2cfb3805523bc8115eca806758c3995b7f1", - "libraries/3rdparty/mbedtls/tests/data_files/server1.crt.der": "672eab1bdf7167c5f00dd4be04137d22af719ebd3d9f58e3af8974e878c7a700", - "libraries/3rdparty/mbedtls/tests/data_files/server1.crt.openssl.v3_ext": "4f2671d996028c6f498feb04696c6634457bdfa89cfe297dd984c5e35955e042", - "libraries/3rdparty/mbedtls/tests/data_files/server1.csr": "1def45bcdca8b2e73533a8e11fbf79e54ebebbe7e2bef2802f3d080f5a7232fd", - "libraries/3rdparty/mbedtls/tests/data_files/server1.der": "fbd74fde74fb949bc221997ce1a557364f02217bb0a21e7ddbb9b3f29b26c491", - "libraries/3rdparty/mbedtls/tests/data_files/server1.ext_ku.crt": "cf7fd376acb30711d50f3c1f6235c93cd290ba2e839d5115ff4c34d9f29c694b", - "libraries/3rdparty/mbedtls/tests/data_files/server1.key": "469e1de4e72db7ddea4f5f56db4974a612da0f403a8a35464e52d53c60fd61bf", - "libraries/3rdparty/mbedtls/tests/data_files/server1.key_usage.crt": "de236ad3db13eb4eaced13d19df87b6b764425c33e832c631b4398b232a5977a", - "libraries/3rdparty/mbedtls/tests/data_files/server1.key_usage.crt.openssl.v3_ext": "82e5e7d5c89136c6e52683b12507fe6009aa293f6cc700bb3ab863db5538b2b9", - "libraries/3rdparty/mbedtls/tests/data_files/server1.key_usage_noauthid.crt": "1bdb38d82ab5621c270cd38b70b60c29020102a7eee4e681888b347e81552623", - "libraries/3rdparty/mbedtls/tests/data_files/server1.noauthid.crt": "69b3d572084b8f571aa6dc1111cd80089216a1b91c150fde8ba6dcb4bf5ab931", - "libraries/3rdparty/mbedtls/tests/data_files/server1.pubkey": "1079e8fd1cbdd5fdb58009c8370aff59fd60e25bf747f96bff48f2efb562489e", - "libraries/3rdparty/mbedtls/tests/data_files/server1.req.cert_type": "164c2ec94c93ee5c14cbe6dd5f801de7564671a982f0d63bfd710e68df1db18e", - "libraries/3rdparty/mbedtls/tests/data_files/server1.req.cert_type_empty": "c6966374ba5e05cbc9c37631d9e0cf4f97bf287f74baa346345257627a1e21a7", - "libraries/3rdparty/mbedtls/tests/data_files/server1.req.key_usage": "b98a58030a1018b879c2e09fb8fb60f1b4c00cafd09127f1c9fe41140214ab26", - "libraries/3rdparty/mbedtls/tests/data_files/server1.req.key_usage_empty": "f570adcdc5fb07fdec4160d7a9e487994b5934ae30f4c9c0ebe36ca0c08182f8", - "libraries/3rdparty/mbedtls/tests/data_files/server1.req.ku-ct": "a1726757d49c144be980a5298af76f9ef3f885818b748f1afe1d0a642deccf62", - "libraries/3rdparty/mbedtls/tests/data_files/server1.req.md4": "c714030bc56714e45b9b8ffaa7538f4c357de2ae6bbea3c4419f65753a8a6300", - "libraries/3rdparty/mbedtls/tests/data_files/server1.req.md5": "be709c92fbed76cc46ae4e2b12ff1b07bde09372debc92108c6202c19a555eed", - "libraries/3rdparty/mbedtls/tests/data_files/server1.req.sha1": "4d8864469be7a1ff0577a864266d16ccbd1a894ea0836f8b634e62385a499b6e", - "libraries/3rdparty/mbedtls/tests/data_files/server1.req.sha224": "f8e0827e76f1c3662b76ba5d9666613eef410227838ce490cacdc56b0d2acb47", - "libraries/3rdparty/mbedtls/tests/data_files/server1.req.sha256": "a567556759ee5eb2d5885c04542b316676263179a7a1a2c86c4264bf32edbcdc", - "libraries/3rdparty/mbedtls/tests/data_files/server1.req.sha384": "a4416ad2b88b5698deec33882b31f40afe34ddaf77779966cbdd59c2ff6f410f", - "libraries/3rdparty/mbedtls/tests/data_files/server1.req.sha512": "c88adc24936119330d1e505789e7d9b35172343343b36785f982ba8219fc73af", - "libraries/3rdparty/mbedtls/tests/data_files/server1.v1.crt": "6517ab0cd96cd21c5013127ba7f259898c3f81aa75b7b6cbfa9f28db1630fc4a", - "libraries/3rdparty/mbedtls/tests/data_files/server10-badsign.crt": "45095f812487f755d770a39b79232c8e89ff7f6a090345f961bd3639ae284ecf", - "libraries/3rdparty/mbedtls/tests/data_files/server10-bs_int3.pem": "922cae9082d65b87c7e1e5f9f54981addc185de960a01a0c61b1047ba7cb7eda", - "libraries/3rdparty/mbedtls/tests/data_files/server10.crt": "9d39025aa8aa0f7148ca6c7ae16fd89a44e4b51621848deee20b54c76d4ad891", - "libraries/3rdparty/mbedtls/tests/data_files/server10.key": "603c53edfff74463bfa4f9e195377224f6980aef4f86c4428a4b119bb440277f", - "libraries/3rdparty/mbedtls/tests/data_files/server10_int3-bs.pem": "5284c74b547da5d8a09a99a8d2a18836ab514c6ab7670dea2eda9ed66b4d5fb7", - "libraries/3rdparty/mbedtls/tests/data_files/server10_int3_int-ca2.crt": "958c6953649d3315a942ef358615ba7a1bc6fc5414f7f1d17b90d889ef05293a", - "libraries/3rdparty/mbedtls/tests/data_files/server10_int3_int-ca2_ca.crt": "9da80f4918ea65e1667953ab1cce6d9191d26062cfdd401309bd8ace9ee1abab", - "libraries/3rdparty/mbedtls/tests/data_files/server10_int3_spurious_int-ca2.crt": "8505ad8872067838ccde5769ad744b1cb5a32f9299f1c34b309c4367788b56e1", - "libraries/3rdparty/mbedtls/tests/data_files/server1_ca.crt": "1b7ef4238b3f2b42e28ac470cbfe3039d77fa2f857b3503b4816cef7d4d57b79", - "libraries/3rdparty/mbedtls/tests/data_files/server1_csr.opensslconf": "58419c7a63d6f55ba0aabb18b6171c07d8a0ebaa0922eb9a709706ef08be2f18", - "libraries/3rdparty/mbedtls/tests/data_files/server1_pathlen_int_max-1.crt": "f115fe091d7615e1953d51767d1b1a4516aed46c419a059534c1def4dbf381a3", - "libraries/3rdparty/mbedtls/tests/data_files/server1_pathlen_int_max.crt": "841a694f5f1860ec2f6fa597fb16d5f0cca451ee8cd9e657e976bed6cf12b2cd", - "libraries/3rdparty/mbedtls/tests/data_files/server2-badsign.crt": "58b06c4846bf41d63dc20575398c53614cf00f5e688ad6d39e1bdacc51394c5c", - "libraries/3rdparty/mbedtls/tests/data_files/server2-sha256.crt": "91ea0c42112d1b04db1a912fd4cfe97f5e3fe19aca98572030463e57e926a12a", - "libraries/3rdparty/mbedtls/tests/data_files/server2-sha256.crt.der": "80cbc316aa58f8be722fd26b3026f077e61c82398599f9f719eade4bcd98173e", - "libraries/3rdparty/mbedtls/tests/data_files/server2-v1-chain.crt": "49e6698e16cf96a54148d9a0c26644d9854690542c2af01eca25ef23b4c8c8e0", - "libraries/3rdparty/mbedtls/tests/data_files/server2-v1.crt": "c906914b53a430b9fc1e91fcb825f6f4d362cdb59e262fb36e63f958a7dd412d", - "libraries/3rdparty/mbedtls/tests/data_files/server2.crt": "fa79509dfeee01f07bae293374f6e85754489a9e2b10411b94b436dd7121e750", - "libraries/3rdparty/mbedtls/tests/data_files/server2.crt.der": "ec410cf1ce5137ad9d36e78606fd8bae6f01afdd7fd461d04bc4a4bd7d82b063", - "libraries/3rdparty/mbedtls/tests/data_files/server2.der": "ec410cf1ce5137ad9d36e78606fd8bae6f01afdd7fd461d04bc4a4bd7d82b063", - "libraries/3rdparty/mbedtls/tests/data_files/server2.key": "5d061d8e92c246e465654ea6eef75b0667cc49cfb8f76d3b4c2f2517861f8b1e", - "libraries/3rdparty/mbedtls/tests/data_files/server2.key.der": "1820853c99779f8e6b847a9ad7fceba765515f1e6ce991a96b7420d0299334fe", - "libraries/3rdparty/mbedtls/tests/data_files/server2.ku-ds.crt": "8310936407cf3431caf33434d46150c64671a6772a7c029b709c454b36bb392a", - "libraries/3rdparty/mbedtls/tests/data_files/server2.ku-ds_ke.crt": "2efab0f798baddbb50dd74494bca3a3caf873b274cfe21ddc8f9e289c5bfdc91", - "libraries/3rdparty/mbedtls/tests/data_files/server2.ku-ka.crt": "37de57e68c4368c507a9fb73e1c63c9d4e2aa37fb768b4dda3ebba00c30f31ad", - "libraries/3rdparty/mbedtls/tests/data_files/server2.ku-ke.crt": "d1e6a649f41bd76c065bfd17197b4ccc01ded1699a4985017c35bf6573a892a4", - "libraries/3rdparty/mbedtls/tests/data_files/server3.crt": "c63b6a289040359e7403a0a93c20438f24839224b50c229f10c704b553d6387e", - "libraries/3rdparty/mbedtls/tests/data_files/server3.key": "2a67c4daedc10b0f4bad16f06a30ab5b9f401a541fb61aa4451e23479bb75d7c", - "libraries/3rdparty/mbedtls/tests/data_files/server4.crt": "00f8a69ef60c9f8d58b4803905dcc90bdfb7b8c08e3afbb5e0c942ff7085d263", - "libraries/3rdparty/mbedtls/tests/data_files/server4.key": "ed155b755deaee3b5b8dcf271b4c82368f6b143ede5a0699d4442214c0be7361", - "libraries/3rdparty/mbedtls/tests/data_files/server5-badsign.crt": "cdb30a275aa4c2e523cdac2e586a6290bd25601e09b2106648dffd651b28fe72", - "libraries/3rdparty/mbedtls/tests/data_files/server5-der0.crt": "e234e102cd8de90e258906d253157aeb7699a3c6df0c4e79e05d01801999dcb5", - "libraries/3rdparty/mbedtls/tests/data_files/server5-der1a.crt": "558f71b5b97986f1a01980d7f048139d2d0fd2644e417c17445651705d6bde43", - "libraries/3rdparty/mbedtls/tests/data_files/server5-der1b.crt": "2d839fed289ed103741b6f167672435908a6a65a0c6fb5d379678c7db7e272ef", - "libraries/3rdparty/mbedtls/tests/data_files/server5-der2.crt": "833a6dabab7e34b432e3cef2571a3592944325ba3c0c8c4999ded1e4d6e1b8da", - "libraries/3rdparty/mbedtls/tests/data_files/server5-der4.crt": "2acb5b3303360adefc566ba49475a8fd4cfee3b210e42dff654aecea892fb46f", - "libraries/3rdparty/mbedtls/tests/data_files/server5-der8.crt": "3c0ad673bba53faa3b0fc08b80f8c544afec08edc108093154b0bc716aaba28e", - "libraries/3rdparty/mbedtls/tests/data_files/server5-der9.crt": "1f85bdc8ebcd356b1721104c28154a3eb25a4fa8a659d7d9e608845a895d3792", - "libraries/3rdparty/mbedtls/tests/data_files/server5-expired.crt": "c74d074aaffbdc1cef6317e75972967108a5c1a01bdff20bf2c1a2b197515310", - "libraries/3rdparty/mbedtls/tests/data_files/server5-future.crt": "da9311feb63e909fdec49a1e0f6b77776e913c4bb12c064efaa1e28274426b1c", - "libraries/3rdparty/mbedtls/tests/data_files/server5-selfsigned.crt": "599f9beeda983e34e4ee133a9b3f4acf2a7d46dbaedf1b09feb2d3e4e50bca8b", - "libraries/3rdparty/mbedtls/tests/data_files/server5-sha1.crt": "011601f71e5332a28e4fc5149ff728dea7f125381a3d3d90d674d0099abdb3f0", - "libraries/3rdparty/mbedtls/tests/data_files/server5-sha224.crt": "372aaaa32a6852f364c0469b98ee71ff0d09ff70d50ace53f8013c3459160672", - "libraries/3rdparty/mbedtls/tests/data_files/server5-sha384.crt": "98143dac0386ec2fa472763c9c91c4395f54150a229fdf60e6d0bd12965f55df", - "libraries/3rdparty/mbedtls/tests/data_files/server5-sha512.crt": "b4c3ab59b7441ac6795009876df225a6472f7058f381d45be6c18bf94b17484c", - "libraries/3rdparty/mbedtls/tests/data_files/server5-ss-expired.crt": "34134401a22e37243d82873772b1e1ab56cba406df1ebbed9410416bf0fafbbb", - "libraries/3rdparty/mbedtls/tests/data_files/server5-ss-forgeca.crt": "4c1bc4f3305b3c115c7426c15b8f8f3a481650619aa91f779ae181c46589d7b4", - "libraries/3rdparty/mbedtls/tests/data_files/server5-tricky-ip-san.crt": "629ec9d2ca7cac0cb01affb7ffc29684060119a01fce81873d302e1b5e69fdb9", - "libraries/3rdparty/mbedtls/tests/data_files/server5.crt": "4dd04599f24f848cb8ffefa86d3f0452cf32b5471755ba569cd78150e8da960d", - "libraries/3rdparty/mbedtls/tests/data_files/server5.crt.der": "e234e102cd8de90e258906d253157aeb7699a3c6df0c4e79e05d01801999dcb5", - "libraries/3rdparty/mbedtls/tests/data_files/server5.eku-cli.crt": "2dfad57fc6830ad24fd5d5515398f58a5f78303130a122cb50c49225f5123ef8", - "libraries/3rdparty/mbedtls/tests/data_files/server5.eku-cs.crt": "b292617d34dc97975a3e598b56ca430c58b599d96cd2b67450cc5b2c79db052d", - "libraries/3rdparty/mbedtls/tests/data_files/server5.eku-cs_any.crt": "9ff857aac63ad4cfc0462e803394f246b506fa8174e3d9331cc169f91b0af99c", - "libraries/3rdparty/mbedtls/tests/data_files/server5.eku-srv.crt": "13701edcd8ae8d9835c7600415630d62fa492e6d89aa3a2552eb81e483ab5b0f", - "libraries/3rdparty/mbedtls/tests/data_files/server5.eku-srv_cli.crt": "2c70618c65d92d0185bb38cc182297e286b4926def85edab3e317d282b075e21", - "libraries/3rdparty/mbedtls/tests/data_files/server5.key": "dc05ad588945ee5771ea24f4970b79e020acfb9c45c6de9d7975b440394f4938", - "libraries/3rdparty/mbedtls/tests/data_files/server5.key.der": "916591fe3a480392ece0f0259cae9cdbc4178acd63863dfb5e8a135e5aa5fed3", - "libraries/3rdparty/mbedtls/tests/data_files/server5.ku-ds.crt": "0ecf0110cb4ffecf3de743a5effa1cbdc26fb3dc9a1bc41746f1eeddfc1712db", - "libraries/3rdparty/mbedtls/tests/data_files/server5.ku-ka.crt": "b8189aab81f627ff45c0d88445a019d7267b0a3b0b44e75a8c7de8e729333034", - "libraries/3rdparty/mbedtls/tests/data_files/server5.ku-ke.crt": "f72f8d5333e73048ee506e1b3c76f6f8cc06158871a409ba93a15788da867171", - "libraries/3rdparty/mbedtls/tests/data_files/server5.req.ku.sha1": "fc5f1a4d33ade85706572ffe9c6d3e3d3084b7f68f82d1a2626b94349b059987", - "libraries/3rdparty/mbedtls/tests/data_files/server5.req.sha1": "4e252af88001daf597ba2bbbe7f5d0f2d0d0d958df49aba6ceb8595406fb536b", - "libraries/3rdparty/mbedtls/tests/data_files/server5.req.sha224": "e89fd34106cd5505befd4a0df08efa72605770d12d9592de71995f0d258929c9", - "libraries/3rdparty/mbedtls/tests/data_files/server5.req.sha256": "3067b803538b7310eceabbe2588d4a3630461b324cfab9e8462cc6e6be7f9ffa", - "libraries/3rdparty/mbedtls/tests/data_files/server5.req.sha384": "3422248ca366da250d91c237b48281ee186dc4ff1ab2865c870346bf41c36601", - "libraries/3rdparty/mbedtls/tests/data_files/server5.req.sha512": "264839b2aec27ccb1f4ed1770c10e4cc8f849f6d1098196e966691b55b9a3e15", - "libraries/3rdparty/mbedtls/tests/data_files/server6-ss-child.crt": "dc7646970447182dff4e8fcf030d649bef0d9eb3300fb0cd3f4909cc6621365e", - "libraries/3rdparty/mbedtls/tests/data_files/server6.crt": "e0f621487e85868e8377a2f41e4cd6fd135ff43c7ad36806c2edb9f1322f3fad", - "libraries/3rdparty/mbedtls/tests/data_files/server6.key": "2c6ba41ff6fa21bd12f3905eae7e39a7c45f26dc35b14e7761342dc50589ea6e", - "libraries/3rdparty/mbedtls/tests/data_files/server7-badsign.crt": "da4e459260611030752aa4edc491e3522d431566183fda7a14adcb1df1bb5f07", - "libraries/3rdparty/mbedtls/tests/data_files/server7-expired.crt": "c89a494df24636a1a78e74c1ba95cbb4bd15e7995b12a443565c7c4c0df22d5b", - "libraries/3rdparty/mbedtls/tests/data_files/server7-future.crt": "4e7c3c756e04e1b125920b9d1ac768205080e329b68e865861af0bcba59fd4bf", - "libraries/3rdparty/mbedtls/tests/data_files/server7.crt": "16a50e25755765652cb577f39fd20b90c48cb1ffef614826d97c16a9bb9834d5", - "libraries/3rdparty/mbedtls/tests/data_files/server7.key": "603c53edfff74463bfa4f9e195377224f6980aef4f86c4428a4b119bb440277f", - "libraries/3rdparty/mbedtls/tests/data_files/server7_all_space.crt": "9176e45bdbc71a9e3305d4aa723bfd577109732294894fe474d581daf9a9978d", - "libraries/3rdparty/mbedtls/tests/data_files/server7_int-ca-exp.crt": "88be293184fe59904bd35049c82c5cdcccc3ea49c3d8067a5908ceb52d1808ea", - "libraries/3rdparty/mbedtls/tests/data_files/server7_int-ca.crt": "ced5f0929905dd533928c1ca10c725e230e265b099a737c6dc108b5cd4efc272", - "libraries/3rdparty/mbedtls/tests/data_files/server7_int-ca_ca2.crt": "5550b67bd40ece1b08e197e32905fbec81ba858e1490af374684636db0eef6a2", - "libraries/3rdparty/mbedtls/tests/data_files/server7_pem_space.crt": "5b9a16ae6767cbc8f9aca55bc1c47f9146c10f8d6a1b602526cf93a40c0058a2", - "libraries/3rdparty/mbedtls/tests/data_files/server7_spurious_int-ca.crt": "8f1c815e02fe3a53f6b460271cb9562858e5cf6013d155c939974ca852974720", - "libraries/3rdparty/mbedtls/tests/data_files/server7_trailing_space.crt": "b82ed11055d227c7bc0a0714312279879ca63230eb3f1fd8117dca9c90d3cd69", - "libraries/3rdparty/mbedtls/tests/data_files/server8.crt": "3b86f7b1212e67691abba3aab02b69b91e2061e92c1c88df6d6404b6dd748ba3", - "libraries/3rdparty/mbedtls/tests/data_files/server8.key": "e8dfd0a91df11fc13499c9a63ab457861283667c44682c2ed10329b0e406c460", - "libraries/3rdparty/mbedtls/tests/data_files/server8_int-ca2.crt": "737c208b5a67aa359c7e87834847974ca6aee747a70f5ea1b41a78689865c08f", - "libraries/3rdparty/mbedtls/tests/data_files/server9-bad-mgfhash.crt": "b943fb9e78c9ca61cbc69b2f00498916594612d998e407def1245e82fa1a7b11", - "libraries/3rdparty/mbedtls/tests/data_files/server9-bad-saltlen.crt": "7f96c87d95cc483303109653f2f678ed9a20afef6eb2e20dc8e06d35294b4ca6", - "libraries/3rdparty/mbedtls/tests/data_files/server9-badsign.crt": "b03ad81eb75230a5d415ba3294306bed0e5ee9c0752f4fe50a547cf579f92a65", - "libraries/3rdparty/mbedtls/tests/data_files/server9-defaults.crt": "10d1418f03ec088cd9dd0eda38613f1b8aec31fc1789a98784e827311a6217d7", - "libraries/3rdparty/mbedtls/tests/data_files/server9-sha224.crt": "1cb614d26ea2c106ddc50a63d25464b5f731105e1c038107ffa1a8d0113c1ffa", - "libraries/3rdparty/mbedtls/tests/data_files/server9-sha256.crt": "1d479c40bdd65a551bf29ddd30d681e04ea55467e7c39cc762767b64ebd9dfce", - "libraries/3rdparty/mbedtls/tests/data_files/server9-sha384.crt": "2e22374c8a68ebbbe5df9abb61cf3b57ced80f600bbc51b1480b4f46a6fc22c9", - "libraries/3rdparty/mbedtls/tests/data_files/server9-sha512.crt": "9500e7d5a18f802c0ac070ae5a0be82e84c33b54f27ff096cc18174952157044", - "libraries/3rdparty/mbedtls/tests/data_files/server9-with-ca.crt": "6668d0e32f88b35ed05646b35aa04a56afb5121528e1cac22b01641bf253e192", - "libraries/3rdparty/mbedtls/tests/data_files/server9.crt": "8d3a4319e7c4009461ff3a1fb013bef98872d05c714651e04d470220d9f1268e", - "libraries/3rdparty/mbedtls/tests/data_files/server9.key": "41227afd38ca676c904ae59589943b5f57576e72b72c98d8f503f57c8ce70552", - "libraries/3rdparty/mbedtls/tests/data_files/server9.req.sha1": "0711bf87fa40e92fe655f4ca17a11b712e2f31da7b7ad4b4745114db520fecd7", - "libraries/3rdparty/mbedtls/tests/data_files/server9.req.sha224": "6adc1a5b3460980248f4a0291456c61e9045a07458c3aabeee6487dc2740a19b", - "libraries/3rdparty/mbedtls/tests/data_files/server9.req.sha256": "e46e01e6fa8ce9c758b1138286ee6b766d0332283fcaf69395aa606c96ba64f2", - "libraries/3rdparty/mbedtls/tests/data_files/server9.req.sha384": "b767dd39d999e3f07325521e7b0b0a5024e9b69fc0dac6bb1840dc302223f06a", - "libraries/3rdparty/mbedtls/tests/data_files/server9.req.sha512": "1a94e92f3d6a284f1c5a7ff48c31b496a85c0867eda5e5111ed6df150515afce", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca-alt-good.crt": "409b7203b6d92795221b303e79bc734894edb065987d57583da537da03732141", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca-alt.crt": "f788c9127699eb9430855561870d6392e5d6c7906e5e8cb6c216b8bf82501442", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca-alt.csr": "a4e161b4492641d2cbbb83254640e244ff0f47b4aabe175f96a8605d1012bf2c", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca-alt.key": "f3a266be97499730ffc421332f58ccd4819993a882a30e55519927cb25c4488c", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca-good-alt.crt": "7e3b5d9ef012b53937f4035023b6edbf308452ec0c064fa8aaf1df46076e4ad2", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca-sha1.crt": "b9b77eabdfa7a0d01e7949778e4c2852f387e4cdc163420c3967d46fac6aeb94", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca-sha1.crt.der": "d2d3e6d9d8f19ad1511dfbcf3847217c5a3f3b42837d1eadfe75485fca944fce", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca-sha256.crt": "e103df1a2629fab1f0811f7ac64f03900a697e8e7a84dd69deaeed18d74340b4", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca-sha256.crt.der": "1ccfd719021988e76a7f5f5425b802302f910dc5a19045ee4096ab7c5e7ff633", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca-v1.crt": "c20e614640b774846bf8362715f8bee134d330c6ef17278386d265fd02c7c895", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca.crt": "b9b77eabdfa7a0d01e7949778e4c2852f387e4cdc163420c3967d46fac6aeb94", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca.crt.der": "a34cc17e86a8ea89113cd1b193adc2ba80559a8158bdf52c7186ebda8cbaf3c8", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca.der": "d2d3e6d9d8f19ad1511dfbcf3847217c5a3f3b42837d1eadfe75485fca944fce", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca.key": "ea70a2d032b80892abf2fee8676258701fe47a78c31e379fc73542925a783f06", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca.key.der": "77ffe88a785127deb761570bf12fe72fb52bb791e9e4fd5a821b92737d814ee5", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca.opensslconf": "00e1ca126a65a76d040ee79ec865b37316010c6a777c6d39b1f4630a42f15c3e", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca.server1.db": "486b555d2ce9c6d70ccb875c08c87a5fd4bf3dd8d0a268a662715b71db03553d", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca.server1.future-crl.db": "edf89dc30010a965cdf2e80eec29bfaeece5f878c16e4874e9f786f70c0a8864", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca.server1.future-crl.opensslconf": "a4a23cc77fe57f28fe36d4cc613c9d8ab267677f108ec2a70850971627a063b5", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca.server1.opensslconf": "4c84429c44ca052fa17128e689edcdb73072c37ec683fb9d305d60b5c3c10ac1", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca2-expired.crt": "84a47b1a228e8195e7880bda80e41e5f5e56a138f63b6f385c16b4438cbadbdd", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca2.crt": "e75fcd2da099aae03c1f6f5b6e96e3a3b635dea7303a7271803b4ca2f263e9da", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca2.crt.der": "529e5ae24dfcb7f56e6388d6c4be7f9db2e4282c475f622493b1ac777dae0760", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca2.key": "72769bdc9f54e0f2c4a8856bcc4545fcc769ccd77d26f7e35fb3f64419a7df35", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca2.key.der": "d6a5d0b3c94857d0a42032fc9ccc3dc8056403d6c893298f99541972238986f8", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca2.key.enc": "18b93a1c675861bef54a47c044d4431133b5e92c54e433e1d114fbc43871ef08", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca2.ku-crl.crt": "0058d9988640708360c03342a06868b9f0111ee5c8d31bde3f6c163208918042", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca2.ku-crt.crt": "5d529c056aea0bc219f0ea9b7c0deced33571dc0b7939c86b995134f3db19b52", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca2.ku-crt_crl.crt": "2b63ebb849edfd60f449bdf8e334341f2db337f9a8b7cfe21912e01aa4ca05be", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca2.ku-ds.crt": "4a98027dd3b7fbbd5b593a5fdf44e8aaeb476fe4078ca789015965f26b91f710", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca2_cat-future-invalid.crt": "0c61f7c05dc549c8007140d2329488d49966145a023fd19969675eff7df13a5b", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca2_cat-future-present.crt": "83e58e6f98aa25dea60db91ff4c5973cf01fa14f282fb66e11e725cebba456f5", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca2_cat-past-invalid.crt": "f65a2b4cb1c4fceaf26afa3177de2bd21bfc5ab075566f1ea13e81889539bec8", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca2_cat-past-present.crt": "8edfcb79e78122a953bebf1dfa78c69798d0fabd7835cb499fc12b9eb7edb839", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca2_cat-present-future.crt": "b39592be0ea2f71b8a36f197001cef05ecf9455e0f3a85abe1267ecb37b00290", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca2_cat-present-past.crt": "40ed90361d82c9dd008b5eb7dfc909c6a3bb9d42c86833e41a582d4ee12fec35", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca_cat12.crt": "ce16edacc0ff4c43d20005b8c31590a487dcb6bc725be87f83a14fa431f47025", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca_cat21.crt": "a52cbc806866c3f738c8bceed914877b1527c2f006727d7953f7960a367e9454", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca_printable.crt": "5aab65196cafdd30de7d537d9d6b99d98afa0d3492bef1c4f1f166dfbc3ac029", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca_uppercase.crt": "9df5f9ea50c0199e3e138ad4dbfb6f06c0867347a2c1f64230806455f073aa68", - "libraries/3rdparty/mbedtls/tests/data_files/test-ca_utf8.crt": "dc8b6956c671569dae6923c19cf743868fff67ad61f81d3eebdb73e4b40f5ba1", - "libraries/3rdparty/mbedtls/tests/data_files/test-int-ca-exp.crt": "a589337c4557cf2b2363df7a6af92cfa942b4ea00b7a17ea549e21159052fbe5", - "libraries/3rdparty/mbedtls/tests/data_files/test-int-ca.crt": "0c4225974cf3819eea282d0352387629070479b0d7182f4407920984e82b895d", - "libraries/3rdparty/mbedtls/tests/data_files/test-int-ca.key": "c9ce39dd7a23fbf4f10368519fa23bd4a34f32d6015dde5c4042ba477410133a", - "libraries/3rdparty/mbedtls/tests/data_files/test-int-ca2.crt": "62a6a1e32f2d1d25d9757acdaa1c24694ad257f23becb5c2e628e52aa26d4312", - "libraries/3rdparty/mbedtls/tests/data_files/test-int-ca2.key": "97ae364e686400105ed7ce07168ba7d64b7797e27b577ce6e1952e01f3ebcb0d", - "libraries/3rdparty/mbedtls/tests/data_files/test-int-ca3-badsign.crt": "e76023d311aab1e0882e36764789f1dc6f007d0220fc455fb282e96c46744997", - "libraries/3rdparty/mbedtls/tests/data_files/test-int-ca3.crt": "75575083759249bcfa4fd2a562b72b2503c0be2bd7dc1df22f9cee9d2bfd8ad5", - "libraries/3rdparty/mbedtls/tests/data_files/test-int-ca3.key": "8f54c3d71e1669ec7f3f2a1fa835a96b215ff69fae9a7e7081780569ba8e10a9", - "libraries/3rdparty/mbedtls/tests/git-scripts/README.md": "5cb58f97bbf4d2600ebcfd9fe31d7db5f85f346fcaad052f36a09bc3d31000de", - "libraries/3rdparty/mbedtls/tests/git-scripts/pre-commit.sh": "f23674694149984f480e253528d208f192f7f4459472f8ae11ef0f0ac753b06c", - "libraries/3rdparty/mbedtls/tests/git-scripts/pre-push.sh": "13958629764dbd9ae9ac2c02f50c1f9e135b6c3f273ca90c74025c9efdb65389", - "libraries/3rdparty/mbedtls/tests/scripts/all.sh": "071a164010e99f1fd94894071f89680c33082d82afafeb21b5042aa78e5108a1", - "libraries/3rdparty/mbedtls/tests/scripts/basic-build-test.sh": "f948f4c0a39e6542880a9a16f1b9140545475224a2ec792058fc82749c235411", - "libraries/3rdparty/mbedtls/tests/scripts/check-doxy-blocks.pl": "c4748b2bde10d25554a0cbc0fa255d2b46a7dc9846b9ead54cd1e6c4bf2a09aa", - "libraries/3rdparty/mbedtls/tests/scripts/check-generated-files.sh": "e6c811fd663403a6aa9067def43f6f3a5335999a14fd4991bd2b3c891c3e66e1", - "libraries/3rdparty/mbedtls/tests/scripts/check-names.sh": "4298cf33adf30b25e022a213a279aaa5cb74d25da7be3660c89e02c91658c217", - "libraries/3rdparty/mbedtls/tests/scripts/check-python-files.sh": "f6e4aff8d6441fb67671a2578ab6f1d5ce14f404fc094f0233e82220ca467ec6", - "libraries/3rdparty/mbedtls/tests/scripts/check_files.py": "2b1057d5942e9642cb51cdc768f886d26a1670d8d3cd8c936b52f98dfd4e497e", - "libraries/3rdparty/mbedtls/tests/scripts/curves.pl": "4ea7fe6fbaa6ce45b6d57df5f2b308457b1f534e75d5d85c89fa8ae2a0770e52", - "libraries/3rdparty/mbedtls/tests/scripts/depends-hashes.pl": "f70f078e9bbe7deee7fe21b9852137ede88757765b7e01ec683a949fa7a9d6ab", - "libraries/3rdparty/mbedtls/tests/scripts/depends-pkalgs.pl": "f0683ac4044eb07846cc34c321a48fbdbf3e379666c1d7730575fe8867a32c03", - "libraries/3rdparty/mbedtls/tests/scripts/doxygen.sh": "338d23b928bb53b59004360e8b9e7c78fadf1fca23e4a76346ad8dff99f1f1c0", - "libraries/3rdparty/mbedtls/tests/scripts/gen_ctr_drbg.pl": "903d8741d2ee28840ea72eafd428a9c7676efe52ff96e1643f85714a7a353c08", - "libraries/3rdparty/mbedtls/tests/scripts/gen_gcm_decrypt.pl": "8f9e3dae4a67e4d58f86d31c19f3a0826f97c35893aa61a40acc173d19f760ac", - "libraries/3rdparty/mbedtls/tests/scripts/gen_gcm_encrypt.pl": "2287646833c199f3bb873e8737d82f9e270826401c15bc346e6804ea100401fa", - "libraries/3rdparty/mbedtls/tests/scripts/gen_pkcs1_v21_sign_verify.pl": "3605d8b88c1efaf4242a63400d6e0cebed207028d455e3d18d29e94bf3da7ab0", - "libraries/3rdparty/mbedtls/tests/scripts/generate-afl-tests.sh": "ed67c9051896567d42a343a412e4b1be6e644d5174cee0c6fa0ae73ba232db15", - "libraries/3rdparty/mbedtls/tests/scripts/generate_test_code.py": "e024916298f748d4df2f11b00aa8fe3678769b51d37618636d96e092f7e363d5", - "libraries/3rdparty/mbedtls/tests/scripts/key-exchanges.pl": "36daa81f400913d98a25da9fe672ee9db85569c6e1b35de98e9d89950f711c8e", - "libraries/3rdparty/mbedtls/tests/scripts/list-enum-consts.pl": "de80aa6219ad68e81dd36c23d77a06ea28396238e05cb0a8a4b9160109d4202d", - "libraries/3rdparty/mbedtls/tests/scripts/list-identifiers.sh": "b820d00a5c939c6d4bbbd808833fb443a0239abd4e1baffd6e0c878276b8acbc", - "libraries/3rdparty/mbedtls/tests/scripts/list-macros.sh": "ff23c7e511cc2e64a68d6bb7a37b02d2aca869fa547502866e4412489bd929a0", - "libraries/3rdparty/mbedtls/tests/scripts/list-symbols.sh": "641d6e6413ed422785b8f52e49f53f5fb3939569152bdaaaacdebad8fa67d0c9", - "libraries/3rdparty/mbedtls/tests/scripts/mbedtls_test.py": "5df6c85e0620fea1d0d6c87c15e46dcf58b8fef9904ccb0f4838d9c86da6038d", - "libraries/3rdparty/mbedtls/tests/scripts/recursion.pl": "b7024fc95493f9ebce6cf2cd017c8756a7da0566fcc23a46425fc88f7e9528cb", - "libraries/3rdparty/mbedtls/tests/scripts/run-test-suites.pl": "12bcb8320609a55ea8942480ef7e9e73b5a640eda594547c751c85c0fe6d208f", - "libraries/3rdparty/mbedtls/tests/scripts/tcp_client.pl": "2b03f0835a0aafbd6d50f1014f9ff57fba53c538590081b52ece9e52cf78544b", - "libraries/3rdparty/mbedtls/tests/scripts/test-ref-configs.pl": "1c8e34ab3666901668cbb89f5d5be876cebbee6e5aee2f7d57dc08c2333ed64f", - "libraries/3rdparty/mbedtls/tests/scripts/test_generate_test_code.py": "0d8b6ff7553eba6b17c1085a30e8b6a376388e7091541feca5c48ea10144096c", - "libraries/3rdparty/mbedtls/tests/scripts/test_zeroize.gdb": "517e0ee83bd5a2cf1fe848d7d7d0284e47f4719cc468688deac2a6cac91e6b3f", - "libraries/3rdparty/mbedtls/tests/scripts/travis-log-failure.sh": "9e9bd2f57c0ce56393060559ea70ec3b16465a6af0eb152aefac8f226830bc51", - "libraries/3rdparty/mbedtls/tests/ssl-opt.sh": "ca3e4e1c05cc3621cb16c00a0b6ac198f6e079db3beb5c011e017caef6d949dd", - "libraries/3rdparty/mbedtls/tests/suites/helpers.function": "9d8ea2040ba123bfaf8e5c63b3462d905c3bfc33172174a5033c2ba793ca291b", - "libraries/3rdparty/mbedtls/tests/suites/host_test.function": "a033ae4aa02551ce619af1ed070e32b37e13bfc99e5d9ef9476e96f977ea790b", - "libraries/3rdparty/mbedtls/tests/suites/main_test.function": "4af28424403a3a1e0b2fc7f1cf51e8c015658b87296d2adcde863178a70dc4a3", - "libraries/3rdparty/mbedtls/tests/suites/target_test.function": "ef13abb504d8c88266c0d453a3f918daf2a275bf523d1258c5f2cefdc51b96fa", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_aes.cbc.data": "48b7bd70a700c75132cfe1b67fcc93e0d27c7da5cc16903ab67036c58d7d72a3", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_aes.cfb.data": "446c03b719b839834d92996a3dc3d85c0909b079fd7fc48eab1a74ea025de5bb", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_aes.ecb.data": "790180492878f22a4741e57bd4a397d6ab0130c420b4433a3dc53ba8c62d99e2", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_aes.function": "814609d814566e6b67112d3ff3103932366113fb390bc81f3933a28368b26763", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_aes.ofb.data": "5a1aa338d7dd051378c7d44074b29bc1c709d373b89dc856d3d7a345feff2830", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_aes.rest.data": "8886e8458eadf180667a0f46b0b1d4f420ee4b7bf6065420bc5da0d10dca8aba", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_aes.xts.data": "7b0275e8c85574740cd7e8e343ac39933a4220567a6a4fd601ad92906104a5cb", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_arc4.data": "578845eae4e63591029996b54e83aee7ac3212813ea3ed2e3dd095682f074ed9", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_arc4.function": "6d51696599caed1e3d3959c7b4dbe0f571f944a80d2dbacbe63c70e7906d1898", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_aria.data": "07824eaf3ee8b8f61a3df6d45b38210b0a8219ece1eb46094e600abc2fcfef71", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_aria.function": "898e11e4f5b0530d2e2c7e4acbbcf6a25ad59734e3f7c5839c11cd1d92f6736c", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_asn1write.data": "b11c47017d072c185357e1359403fabedb32c0727be8ee3d96b5b0602fd04c25", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_asn1write.function": "ee6eeff25f9410382cad38e6eeaeaa5eff90f9136e1bdebb1afa360c6b4fde97", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_base64.data": "871b00c72061ca46f850be9b9df546c18b69e5c18e4eb7b6183bc63723998bd4", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_base64.function": "e7f0fd3148a3cb82e0fed0bd91113a42cd2200fb816fe79e5d719ef3eb9388c8", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_blowfish.data": "6610609da22905fccfc33ceed0dd7621cdf692f95a9b5d1ba7608eecec4a28eb", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_blowfish.function": "8a59bed4711b3820f725210b6e8b0a0061c1c7bb2c49d9c2aef37da969a89a47", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_camellia.data": "3d38d77a108a94bbfa676f471d02cf99d05fb56b735a3470b28bbdf434bbeba5", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_camellia.function": "371c06424aa04b098667611fbcab3a8f177f7e11ae7cd5245fef3fa84bb4a466", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_ccm.data": "4cb0c0a5071230f38627bd90fb2002508449d178854ca227c59118d6d205ea62", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_ccm.function": "f8128164e537a07c5c4013c2d7a2b3e21a77b9b5cdf100c45e19a34690741209", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_chacha20.data": "8163769ce72adeea70077290eb57d3cb5b0ca20a8998c67b692588850b827099", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_chacha20.function": "7595481d6a34b66791357923dfe0981f552cff27ab2b4385efc1ecc91de15c67", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_chachapoly.data": "c6099c13799bec5a7a802c9ac405b020aca50c4e98d6e8fa3c3b68d8120fcac5", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_chachapoly.function": "6659143a685668d432415c0803cbe9cf27030024fadaea1af5b81b16bd87579b", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.aes.data": "7b6631fd7727a53a6f3c264a1fcdbf99e62551b1a9f36cd68ee10b15eaa889c6", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.arc4.data": "80d8a4a33618ff66ec39cc9a73c02021142d4efa444d8c9f86b8223e198d238c", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.blowfish.data": "04a5fef9e21db1c64e8436028d2ec2db5bc46d9e2fb3dbac9416287b40d200a6", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.camellia.data": "314abe489a8bb4b944e158dc3c730b63d52078c8c9db2b974dfaec818f7584fa", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.ccm.data": "cde33abc7ae2aab86b3a08cfa1b2e96f306f01d276b9ad2df879b7dc992bd3ca", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.chacha20.data": "6e31de18006c045b6718b2b40911036fbda16f2d1e62f21c986aeebbac5194ed", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.chachapoly.data": "24688dd7cc2ff0c16bd22dd07124c1b7ecbba3e9509cb91eb566644351dbfde1", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.des.data": "06a94dcd718688eb443999f3374e4da1f00150ea64aad5ad8c2179b26249161f", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.function": "bd5fe38e886e705b6ffc0abf3ef479f6d94497a68a82022becac44131d0401c5", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.gcm.data": "32da5ca9431f8f98f47d3dc48cff64863dd85e8858637fdfe14ec58d611c395f", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.misc.data": "68bc609d5bfba474629274cad78555a198233100c045a828bb44f764a8902594", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.null.data": "426b27e3a22860b47c05c919749b80d08934160da3dc51867f293718292d5b7d", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.padding.data": "c1f9824657b118e8e797db09b3f7833eb1444b82a287e0d4b9f22a99d79ed776", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_cmac.data": "947b56d2b8ab4e11faa5248f764634173e4ea02f1a9b2d2b10a957d7e38c9ce0", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_cmac.function": "c6629890da1216133a6baf3d14b4d4f72082e156fb41f047d0bf99c066a26239", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_ctr_drbg.data": "76d866177700768f84ee5f5fd2e844834137205ca7d51d788b5bdb6f42ce35f5", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_ctr_drbg.function": "e1e6998d762340945f60a772e213743ec283b4588254e166160844ae172ce57e", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_debug.data": "d2203e242b911715b3a13c9ff60f09a52aeb8947d5d012962262c041fd0f426a", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_debug.function": "18f43709e2a31b7e871cd1de2d4914a47be901f684627e60b47fce6e14f249e9", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_des.data": "99b98d62dd402a10916164d05b963d868b27fc4e61c324f3d183a6e95a6c6ee2", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_des.function": "471881a2baf2de59882234adb3fe0c3f089a43b71802bf7f89f3fc6ec50d778c", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_dhm.data": "9028eefe36def9c04484c4e8ac1f58b5e5dec97505d8e497162ca2d3447c3680", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_dhm.function": "e2de1a546db80b8690aaeb9e5dbd389961464aa1d3021e9eb847763876468ee9", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_ecdh.data": "d57d20ae4d9ac83eeaa79056b0d19fcc1cedb9eccb0c752bf69cb9ee132fa932", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_ecdh.function": "e823742ad8764e178f68c38bc246c9ff07d798b83191a77a4066fd6a99b4b299", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_ecdsa.data": "999f237e9c80dedf3ab1857a6091ebc4ca7590ade23284e047e11d7900cc4469", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_ecdsa.function": "825ca556f1c278cbfe8fd14d61da2ef1394becd0831f0630ca0a8ad3fd42f9fd", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_ecjpake.data": "75c1f08c6f47401c222ea7dbe5ecefe738fbcde941f2322ebdbc7dc764bbac42", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_ecjpake.function": "541c3ae8847f680443ca7a3900ea188b26b3698d8c99fa0a63d7cfa21bf5a050", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_ecp.data": "d9f2b23fee390e4c5f3305f793e51e6994b155b22be9fa34808525c06a56f327", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_ecp.function": "8e643a6cb9e2e6f004ce10fbbfcae7be257ce2b56fb06ac888cdc9f326708cd4", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_entropy.data": "744ba90615f31418d5f450a61dffe38dcceee80222db9a1db7b789e199fa244f", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_entropy.function": "166f24440b92410c0ff58440e4ee172ae03adce2be711aded189f7dbc7fb328d", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_error.data": "52dcf2be05c9a615b859e0328cfc142b109bebdf5de499ee167f41bd02885cd4", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_error.function": "36e0e8637fc05a1a5efc1ad227e042e4e95d2ea1141b5739ebd97016e45e8ee1", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_gcm.aes128_de.data": "1efc1051eb12466eb65428af634140e9a41ac5acf5ec4cc3b5b8ae0e3589e300", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_gcm.aes128_en.data": "2dc4d3ce56e613e6169d481a9b26fffddb1b763ec9fba78f446300e658b5294e", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_gcm.aes192_de.data": "5cbdead079fc4c269ef4322623179b2e60ddfb1b4390cabf5a43576fb614792b", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_gcm.aes192_en.data": "3877cc2a6f10824214508427d824493ac6b8df3ef26143bf2ad95356f49df46b", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_gcm.aes256_de.data": "b581d09e17f5db4914a8678b41ca3611e9c887358a0d8b0b3cd11df1167591a8", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_gcm.aes256_en.data": "fce4bf28915e0c3009b0b4b74da0155b6c2e2cd7aa16b1087bffadcc3e33981e", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_gcm.camellia.data": "4aba96c85717d9e7504f4664b55f47bf8703d5066518d76946f70a6ab3831afa", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_gcm.function": "9fe71a7f00bd7110beaebf3d5c0380d70c40a9ca353bc38eb79956e7473017d4", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_gcm.misc.data": "0b41ffc8013b88064041ec52ee71b346a1f596797d325be23fe88ad6cde6ae0a", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_hkdf.data": "3670baeb5ba65736d7bc42e010c9a58743f6088a5b5c792a10dc1636e5e613c1", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_hkdf.function": "d473ce6532e44d37a45cad36d0f1b071bd9e8eb526740b3fa367eb86496a8a87", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_hmac_drbg.function": "53fb9dc095657edeef3be66e5e1862258f267c99a7a0d340119f65d43f09e0b8", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_hmac_drbg.misc.data": "fb7d852effb65f797c59f9f169cd54226389bb0ebd8836e969b095b4a2ca40f6", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_hmac_drbg.no_reseed.data": "f87612071538230adf2cb2eadbd169032c870c86d7ad321287947da4b0cbfd3a", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_hmac_drbg.nopr.data": "ea197b2bea57bd7715ae41212c2c09904c3d6a95ff150e64a8d93ec5a2db7866", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_hmac_drbg.pr.data": "d23eb1828c7db2a2fe39790bfbf04198c215822280bc3708c186769cb6a65e83", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_md.data": "c54e26c6922d0730e2e7096c3575c0b2001999932b2e0edf6c53ae4d81e32e01", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_md.function": "21b374bece408f3ca6f6202fb9a480dd06279e11101648827abd9908cf9c0033", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_mdx.data": "dfe8fea65aa67aee073e4475ed847be8793b72878bf68ebcd3107cf74de162d0", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_mdx.function": "97f071e3024351a1a440b9699c8618b2c0d74b3e3d8275b32ff052d884b296ac", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_memory_buffer_alloc.data": "c03d0445d0d702b8bdc178e67b14479b09e7ddbf89884e64d3b557ed9f08e770", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_memory_buffer_alloc.function": "3b23941d18171c2a0d2ad8d0baafdd4616df7f05ec102d6cd2f9463cd327d7c9", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_mpi.data": "825de92647ae59dc2813896dd2386c0cb4b29ff1725736ee04c465be0578665f", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_mpi.function": "2f9f034e65fae011818ca834655b52fb7494c4e480ad3778b338ffa74b8062ee", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_nist_kw.data": "c6ca21ade49eeb1577efd2c0e97f13a150bdeac7fe7c078cac869dc3eac324c3", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_nist_kw.function": "778b0257d8dba1a0b3e23d8c1cd2af8c0f27241f90c927b0a979c21a4baa57cf", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_pem.data": "68aabb6911a63e45181ac774cfd0b3830874f4122ae26dedc1b7ae58860a597c", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_pem.function": "a4f8e7937f721c6987672c451b853891dbd1e1a7916a5ba9d8289be920c38b12", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_pk.data": "4bf2ee81b7786e7a0cfa0f2458c309cae4e57359be8f2762a6a285bee630412e", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_pk.function": "d737a0b4314c3f0b827949088d632a46c206ec9961b924ba42cfe521aba60643", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkcs1_v15.data": "0567ec6c611cb0fce56b5de4d872070fd83c4d0a69f7c6c8ae1379b59bbbbcd6", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkcs1_v15.function": "018ae0c21a5bd71403109f327a53db3c65e3b510074615299af0366a94f74b31", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkcs1_v21.data": "b744ee7b5a9ee3aaff33beba47966c481a3e04a13a141e0597918d41aba2e65b", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkcs1_v21.function": "742e6aec71efff5d1e7dc959ec2c99b9ce6982684c9fb236fcd8dd433fd4c503", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkcs5.data": "e07bfc8f3a1d4b64d7ec48817271a9e8efb15fc7afd38fc2d113e3cca6ff2324", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkcs5.function": "b270e4910766fef26639d55a46bacebf835f81722d1aebb87e0e96896522d314", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkparse.data": "724b70c9cb88ae8a0340de7bd0fce0a375d1110fcc55a8f91c34b5ce6c01eec1", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkparse.function": "2923568d57d5b9035c07d35b2680f33995f0bb680d95e4bf051c15d99481df87", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkwrite.data": "f8a8298c71f150c92cbb03e1d4f1d3e44f9250830254ae9d53ea60190ca7c00a", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkwrite.function": "8173093c4a9304683c04b153a1a859b6864617990d5993cc0a6a89e4d1442b82", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_poly1305.data": "8400f29de180cb267c3d859751a5fcacb7229ad74d01f4f3510b816c31cbe28e", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_poly1305.function": "1d11c12b107ff5a5fedc17f884319ed2448dfd7653c1a75539b501557004e20a", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_rsa.data": "0dab4e56d6a60853b51ffa68f3877ff837158540af482653552142628566141d", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_rsa.function": "9d9de755301c97415442bc4c04eb6f218afbb0c7ae3bb823787da7d357350989", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_shax.data": "3cb81f31f418afbb599ba2a4ebba448118258529b54dad4efc4ada9a572f4071", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_shax.function": "42bf445bb76dc2a4d670ada1c6f596f9af021ac91cdb289013098eb8aa7e7b6e", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_ssl.data": "b1efce35b0a401eea4efa281a45adde4990cbc7842115e45764b04634fc23b80", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_ssl.function": "e2cf91110ab2c874f92145f930fd14cf6e2b85012f9b2f842698214eba989fcb", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_timing.data": "993181c28e523e656551f6609a01e84147eb38860acb9390f0a6e3335043652b", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_timing.function": "0b011ca1d13031e56211afb7dfb55ea4e8a1f9a0e46797dbe47dc12b9426b4d5", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_version.data": "d0a5d0fa4b0ab50162d7b59c6f54fc4957be0826653320a02bf0c82612c42ffd", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_version.function": "8b98758e5787c5f515673b17aad2f472b9068b6763ac9aadd8e0bf834c327f78", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_x509parse.data": "5ab86242589441ab2c39fe18b20b0fb0154d83820312dd9cf8d70466c4e8786e", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_x509parse.function": "1eac39f6b7be1f527fc4fea4cdb92bd4d67a3141311ea766a43ea276a32f7d43", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_x509write.data": "e60de9c4eae061cf290becd9d18b41fdd481eff89ce881eb0e3b7a8609568390", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_x509write.function": "f3b3fbcd616ea3e236d2f9356898a28c7cd5cbbf39744b9c8ceda1965e8c5be5", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_xtea.data": "017f8dd2c0679813a57da016c74cb64885e30b8e77407a2943404fad7088f8b9", - "libraries/3rdparty/mbedtls/tests/suites/test_suite_xtea.function": "f66b9841ed246d5eb49127bdbd987c872bdce3528a11898a5910015f908e856c", - "libraries/3rdparty/mbedtls/visualc/VS2010/aescrypt2.vcxproj": "043417123026fb4ecf7feb7fab9e0de963267db1e99a2f84377e32f237b8045b", - "libraries/3rdparty/mbedtls/visualc/VS2010/benchmark.vcxproj": "34cee46f91829888dae67a0bad640021ae3dabbed980e48e8f44b06d243c74fe", - "libraries/3rdparty/mbedtls/visualc/VS2010/cert_app.vcxproj": "9580c3f083cd393a5e2226e7fde83ded1bba1d4e8808cc28d31d2eed572cd9f4", - "libraries/3rdparty/mbedtls/visualc/VS2010/cert_req.vcxproj": "bca5bd8f551c2e14e1acbaab71c19158d40f2d5f3e9db3098574941445480c11", - "libraries/3rdparty/mbedtls/visualc/VS2010/cert_write.vcxproj": "65e112c3cb0b0faeec340038348ca5e00129855ef5a368276b98532fc4169f9c", - "libraries/3rdparty/mbedtls/visualc/VS2010/crl_app.vcxproj": "dde58959d674e5207bf466f17d8e1dab12c6576c876afb460e262d65bd94d211", - "libraries/3rdparty/mbedtls/visualc/VS2010/crypt_and_hash.vcxproj": "be8bca3061c6a08afb42d28955b900ec657f3eee992b3f6cf1466d3de530598e", - "libraries/3rdparty/mbedtls/visualc/VS2010/dh_client.vcxproj": "23b585cead69c28cd5f5d8f2422ce1303fc3d5d9cef4c8ff5369bb4a47380a58", - "libraries/3rdparty/mbedtls/visualc/VS2010/dh_genprime.vcxproj": "b68c83f7806600023c07f99b55d96b78c28e1da33084ee8c7761a09254aac871", - "libraries/3rdparty/mbedtls/visualc/VS2010/dh_server.vcxproj": "7668df571d04ac9f506d81dcedcc7989e4fb37b53c671022f5e1ed2142406935", - "libraries/3rdparty/mbedtls/visualc/VS2010/dtls_client.vcxproj": "cd0e324e374771c8fd81d1b712bd9746907d4adb2a0306f41083cd5233646400", - "libraries/3rdparty/mbedtls/visualc/VS2010/dtls_server.vcxproj": "aee3d1aa6d02766251abda965cd1e7d319f89b28857c51cd52b6dcfd56cafe18", - "libraries/3rdparty/mbedtls/visualc/VS2010/ecdh_curve25519.vcxproj": "cfefecf91e435b351c1827359c66288b552b8d718f559ee1232315b4e2939d13", - "libraries/3rdparty/mbedtls/visualc/VS2010/ecdsa.vcxproj": "c7e955ac8bbd73184fe2b780a037f332939f16f82f4a4fe80f2e7c35680f8fca", - "libraries/3rdparty/mbedtls/visualc/VS2010/gen_entropy.vcxproj": "aee08d42d11354169db4d4ced618439152eabcc463245599ffabf99ee415827f", - "libraries/3rdparty/mbedtls/visualc/VS2010/gen_key.vcxproj": "61ff766c46b082fe2d67278758c1d660cd77e1ec3794302b6753e7e878ff4f25", - "libraries/3rdparty/mbedtls/visualc/VS2010/gen_random_ctr_drbg.vcxproj": "29faff037f31c0b46ad6b27bb7a3f7655a22f9d4c9d217851b929c3b8c88d289", - "libraries/3rdparty/mbedtls/visualc/VS2010/gen_random_havege.vcxproj": "2d2beea10745cdc4e30a344ef9e45685a06178ed1d1941b71dbea7a070329b0b", - "libraries/3rdparty/mbedtls/visualc/VS2010/generic_sum.vcxproj": "7fd50ca75ef487a1ed27104ef13c904ad004c2b8bbc02d36797d926eca0394df", - "libraries/3rdparty/mbedtls/visualc/VS2010/hello.vcxproj": "01909abbd4aa403ab94e7b90d2a06a3386ee0477f90f3758014e4b3efacdb46f", - "libraries/3rdparty/mbedtls/visualc/VS2010/key_app.vcxproj": "596766dd8fc0b019fbb13401d9440a8aadd9829aad005a17c3d4d0c1c9eb0be8", - "libraries/3rdparty/mbedtls/visualc/VS2010/key_app_writer.vcxproj": "df9075ea39ade11af038a75b5ce028c1700509efb2045be029f0ee770293a11f", - "libraries/3rdparty/mbedtls/visualc/VS2010/mbedTLS.sln": "7441c19db10b4a8d5103c8d7d80d08561787b559dc07e2c7021526951c24cb12", - "libraries/3rdparty/mbedtls/visualc/VS2010/mbedTLS.vcxproj": "bb229c5d7f7c7b9251402659b893aa9ffc467b89f17ba25d18f2a42c61ad401a", - "libraries/3rdparty/mbedtls/visualc/VS2010/mini_client.vcxproj": "32465df45b9ae4f08cf61060171ca5937210479a05a3de0e23f879e727855357", - "libraries/3rdparty/mbedtls/visualc/VS2010/mpi_demo.vcxproj": "27ed3a0fa397ab79b6caf824f560a0915615e51249813b5ecccd72b779c757fb", - "libraries/3rdparty/mbedtls/visualc/VS2010/pem2der.vcxproj": "ed28151a49e03835ed5fc94d15df5473bbdaf05ea382e13a247d7e4631115666", - "libraries/3rdparty/mbedtls/visualc/VS2010/pk_decrypt.vcxproj": "2f21f6eb55916f2ae34786f7fa4cf0fc67d9ed5a070bcf690feb5e126c30423f", - "libraries/3rdparty/mbedtls/visualc/VS2010/pk_encrypt.vcxproj": "59a5ac8fda4823a2bc0a18e2f44f9ca9c16c1a4677dd393c34fa276f0988c6c3", - "libraries/3rdparty/mbedtls/visualc/VS2010/pk_sign.vcxproj": "074e424d129819722963606b7ae22a9ce156f98c3c73e8b711dd0d10bb3a5ffe", - "libraries/3rdparty/mbedtls/visualc/VS2010/pk_verify.vcxproj": "42bc1c83134a2b9c4d6e82cb86d6690b27aad36bc63734dc2b7ccb6923f33a21", - "libraries/3rdparty/mbedtls/visualc/VS2010/query_compile_time_config.vcxproj": "24fe4c0e40eea1dc83caf05cf6b21aba63f852d06eebf2148ecd22bee036cba8", - "libraries/3rdparty/mbedtls/visualc/VS2010/req_app.vcxproj": "77d1008065a894f9e7cf2b66119e6fa25109d670987d9dfede21ddd51493e3ad", - "libraries/3rdparty/mbedtls/visualc/VS2010/rsa_decrypt.vcxproj": "042f0dd2e60edd7f93ea561430e685691d917039639968e28a5911214763cbed", - "libraries/3rdparty/mbedtls/visualc/VS2010/rsa_encrypt.vcxproj": "90c6fb6ec43949f0c5046b9b6f5b1e096b848f1dcfa39b8f2422f772797cb65b", - "libraries/3rdparty/mbedtls/visualc/VS2010/rsa_genkey.vcxproj": "1f1c10d55bfdb19df26e142746c57764d1cd33a6cdc9633421e7a74a2af3c0c0", - "libraries/3rdparty/mbedtls/visualc/VS2010/rsa_sign.vcxproj": "a52f6dfee4063e6019de15aad3e80afaf12cf8a3802b4cb6a228bdbee765dfa4", - "libraries/3rdparty/mbedtls/visualc/VS2010/rsa_sign_pss.vcxproj": "0aa419945b0e791d9a52832c4994d09a763db3f69e0b7438b104d72524626565", - "libraries/3rdparty/mbedtls/visualc/VS2010/rsa_verify.vcxproj": "be38b7d95906fec9e03c1edd94696964d5b19cc07e7225d856f11c827a8a997b", - "libraries/3rdparty/mbedtls/visualc/VS2010/rsa_verify_pss.vcxproj": "1cd735720dfc3d49fcd73266d6415450552e8849cfeae92a6c3b69976defe7f8", - "libraries/3rdparty/mbedtls/visualc/VS2010/selftest.vcxproj": "3cd55a43710848fe4fb93f9100aafee8a9b55b9ad2c3fc5cb7fd55c8f28259e8", - "libraries/3rdparty/mbedtls/visualc/VS2010/ssl_client1.vcxproj": "2ac345d74bacc5571ae3ae589cfd4eb4c014de9bbea70a6ecd4247147f768073", - "libraries/3rdparty/mbedtls/visualc/VS2010/ssl_client2.vcxproj": "8d149c88bb194d9f58f36e6fc4c75a9c1506e41583c77c30522205d76e080c84", - "libraries/3rdparty/mbedtls/visualc/VS2010/ssl_fork_server.vcxproj": "084f8a23607a2ab7ad8287c666a4d9dc4bf64a587aae161112cee1386cffe8ec", - "libraries/3rdparty/mbedtls/visualc/VS2010/ssl_mail_client.vcxproj": "6e745dc8d478c49096fb69ba23c93a90509af3290bae804732cbb537e735c929", - "libraries/3rdparty/mbedtls/visualc/VS2010/ssl_server.vcxproj": "e7915db39ed4e284ff456dc480e06553714d5675ac705dfe6579174db5be83cd", - "libraries/3rdparty/mbedtls/visualc/VS2010/ssl_server2.vcxproj": "9ad201669aedeb9cccb9ea637785711a40c12f11c7d9af3381a09a490e4079fa", - "libraries/3rdparty/mbedtls/visualc/VS2010/strerror.vcxproj": "fe12f430b31f3ead1fd255bdb8be4c5d52d514a45368ee7031a2a5830648b716", - "libraries/3rdparty/mbedtls/visualc/VS2010/udp_proxy.vcxproj": "f2b043d5c3cbb825ffedb24cb67142bb3476aa1bb0e5c945499938a393364f44", - "libraries/3rdparty/mbedtls/visualc/VS2010/zeroize.vcxproj": "e2897300a0d3391be518af3fde0cad4ffae8664837f357cb0186843d20de7f13", - "libraries/3rdparty/mbedtls_config/README.md": "dec5f4f70730361ebe2e653ac748bda384760382f7d7afb8dd70876113c5dba5", - "libraries/3rdparty/mbedtls_config/aws_mbedtls_config.h": "9d61ed03d900438108379718d3429771377913119e0f23b19ec2249ebd2bd00b", - "libraries/3rdparty/mbedtls_utils/README.md": "e330a21d504573dae72d764abde401f6378db3852d67be4e8bae291d6ef1a99b", - "libraries/3rdparty/mbedtls_utils/mbedtls_error.c": "906e1e5d8f464f2c8827fb83f7a249785de36ed1f034d225370a3ba211c2cf5b", - "libraries/3rdparty/mbedtls_utils/mbedtls_error.h": "ed6e816433e7e9aad9614cf1a2c04a92e081f803fc1665485a1c56caf06587e9", - "libraries/3rdparty/mbedtls_utils/mbedtls_utils.c": "e6eb0721fdb03edd8345cf5639b21d724fd05acac3bb5ef945e3cb5e158781a6", - "libraries/3rdparty/pkcs11/CONTRIBUTING.md": "400098f5776f8d6289aaa5517f2d33fbc28d98d9612ccf3d4cfc85713d674d95", - "libraries/3rdparty/pkcs11/LICENSE.md": "9bcb0c0cb10c9dbe5090ea05b35ac12160a295c2704b178b2c661c10acfb96e8", - "libraries/3rdparty/pkcs11/README.md": "0e2538782b336a90335524fd19be0e2e21cbd197f161a2aa8f0fc82993eb1609", - "libraries/3rdparty/pkcs11/pkcs11.h": "8bb7aa1aeaa328b6a39913070d6f3d2bdeb9f2c92baf27f714fbb4cbefdf4054", - "libraries/3rdparty/pkcs11/pkcs11f.h": "a85adad038bfc9dad9c71377f3ed3b049ba2ac9b3f37198a372f211d210c6057", - "libraries/3rdparty/pkcs11/pkcs11t.h": "5b58736b6d23f12b4d9492cd24b06b9d11056c3153afc4e89b1fe564749e71a2", - "libraries/3rdparty/tinycbor/src/LICENSE": "3c6ba0b5bfa7830505301ffb336a17b0748e0d61c4d34216e9dc98f10e40395e", - "libraries/3rdparty/tinycbor/src/README.md": "6d6489fb7bfb247f44438f1e73e2f24db38ac3d4b586eeb31d60091a2a6b830f", - "libraries/3rdparty/tinycbor/src/cbor.h": "0fb03658e551dda420c7bfc54cc029c1dea0c9cd906aa23c79a112934f3c5a53", - "libraries/3rdparty/tinycbor/src/cborencoder.c": "bb6539de51904920d2dbf9fc46881a7c7f1f1b27dbf0031ce4873fcefa1627ac", - "libraries/3rdparty/tinycbor/src/cborencoder_close_container_checked.c": "fee715bd5a28e19d7451ef973bd20d08fff8d82a5e59efe6aa89cc738368bf32", - "libraries/3rdparty/tinycbor/src/cborerrorstrings.c": "d2c611466a5702fae92c459844bf9495d90a2fffc1efcd847f188a06feded5b6", - "libraries/3rdparty/tinycbor/src/cborinternal_p.h": "5a58680dc3e1b58220f9e76e18b446caec57f1af75c765116700d60ec105c055", - "libraries/3rdparty/tinycbor/src/cborparser.c": "1decbbb7145a322de9dffd82e7319ac18b84fd0a4c480b8b36f1459aacdb1693", - "libraries/3rdparty/tinycbor/src/cborparser_dup_string.c": "95cbbfe5d49ad5afc8684df17cee7c0b016118da659be49a0230c2a7938cae5a", - "libraries/3rdparty/tinycbor/src/cborpretty.c": "04663de61f37618a25d7509a518e3da4764353b666aab42148181ac83af07406", - "libraries/3rdparty/tinycbor/src/cborpretty_stdio.c": "d5a3178cee64625fa418f36970a666e8eee83e92c395acbd2b89220db93de6fd", - "libraries/3rdparty/tinycbor/src/cborvalidation.c": "53aea74b993f99365260fe25f51071c1b4be95c987a47518e3d26dd56c23b531", - "libraries/3rdparty/tinycbor/src/compilersupport_p.h": "3401cb759b3783bdcf4c8566e99010b364d7348a3f267b15f5f635f09960bab6", - "libraries/3rdparty/tinycbor/src/tinycbor-version.h": "77fc28859af9c24b7dc37aee0a73a07c0c90e7500b73e51c2d4a76c709ad5978", - "libraries/3rdparty/tinycbor/src/utf8_p.h": "b0efa3c4b2b04c4db2809989a86206f9277de5a79ade4838df9bbfb3e17db4bb", - "libraries/3rdparty/tinycrypt/AUTHORS": "478b050e66ce46564c1d081590edc7f3db7fcf1894430d20a9b6b550029d4ab8", - "libraries/3rdparty/tinycrypt/LICENSE": "b2d451fcba3577b118741d733d37ebd15bdd0b6b381e554a7345bdbfa3743108", - "libraries/3rdparty/tinycrypt/Makefile": "7c3c3e1913882fbc6e9ef5c567505704fbe7f12cf55a842eca5b19df8c868ef5", - "libraries/3rdparty/tinycrypt/README": "d795d171058c36cdb8ce718fd615846f345815465efe011aa0b215df86e53a38", - "libraries/3rdparty/tinycrypt/VERSION": "283571d2642fc7b3befd294f45d53b896a1d54d34c86235b13151192b380606a", - "libraries/3rdparty/tinycrypt/asn1/asn1.h": "89499b4d992a8a347ac4805fe01af0c5977ce6237ccb628589b6f885b2e1423a", - "libraries/3rdparty/tinycrypt/asn1/asn1parse.c": "fa021fe9c65c28090e841387b71f59484f62abebf5cafceb0fb555c0dcd572da", - "libraries/3rdparty/tinycrypt/config.mk": "ce91366509d78906308eb30de2f85bfb894b48146ea01d644c734e1a8ca346d1", - "libraries/3rdparty/tinycrypt/documentation/tinycrypt.rst": "8d5716676abf2f0036d58ee7691da44953d8efe97020ed4a5edd4afbea5c054d", - "libraries/3rdparty/tinycrypt/lib/Makefile": "b6bde2680a639927714b1db0cab6c038101d0432d45a08fa6da157aaeff21ec1", - "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/aes.h": "bd9e1ea99ec9717aa68f8c2b9b8844c11a7557017dde19c0ea7ca9599ce28c8e", - "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/cbc_mode.h": "9d04a528294793b47541cb70fe4e83f5c0a70b4c550fb49bce90a22dc863a191", - "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/ccm_mode.h": "79347427c642f708ae10f24784236a5e5a328f807b100a5b0fe90db70bc6432e", - "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/cmac_mode.h": "6f9727d78078f9ae016f18b2ec420f3e6f8afc60e0ea5fa0fbc8e8a646e8f53d", - "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/constants.h": "89c80a6d5f468ebde82fb525a6dd72685cb27720fd385da6e3f3f2a19fba48ec", - "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/ctr_mode.h": "1f3fe4a524a86e9c659643e608e81287b4e898e58316f28ca51b19c212e4bd72", - "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/ctr_prng.h": "8d0f25e6cf23cdd8634778fcba10af888d24fd0d11c496f1b9a0440cd45b2509", - "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/ecc.h": "ab1904e162dc994ef0b0174dcee9e708d57d58828dc5d819ba71713ac443fee4", - "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/ecc_dh.h": "1e8bda76ea0f2673d371a752ea57f3e5da621a3007fd891fa28d4ed555227185", - "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/ecc_dsa.h": "c6545de8ba4490efbde181189b999938b43c36cc1e905d0a12decf1b526b4769", - "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/ecc_platform_specific.h": "ed890b375c177e7abad7b188ac0a737e87d43224325cd1ed944bad3d25c470cf", - "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/hmac.h": "c981663602ae9c4df8f7c2fe5d6e1d2cb1132fc0b90beb4e4eef536d9f54b82b", - "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/hmac_prng.h": "c7d780c4bf3fb23f45ec1225f31f0c8a851c5693f47adf76fb76b7f140ce136a", - "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/sha256.h": "90eb15d8cd82f81ba163c53b199c04eb9e5fda52a41901bb380dd80097f57902", - "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/utils.h": "c5c169e0ae15e394588d7d6797a28af9ab251b1ed1169b3207625752d8d8fc8a", - "libraries/3rdparty/tinycrypt/lib/source/aes_decrypt.c": "edad5e3570012bcc1da57869fdb2bc4e0c6e733fb67f7b362bcc71f88d0af017", - "libraries/3rdparty/tinycrypt/lib/source/aes_encrypt.c": "90957c91a22214b18653bae4ef4abeca8bc6674051c48fe0c97c413a6d65e555", - "libraries/3rdparty/tinycrypt/lib/source/cbc_mode.c": "e09c83712a618ba08a60fef3e5ba2ed5bf712fa6b8c79a074cbf5731665f7ffa", - "libraries/3rdparty/tinycrypt/lib/source/ccm_mode.c": "089fb37565150785cf67c20457fb95409d860cb0b572348148fb09d3d11ac6fd", - "libraries/3rdparty/tinycrypt/lib/source/cmac_mode.c": "67e2a2ac539ed72bd5ee80cd377b1b5f5148f6c743bd8c89904a393d39a5a8d7", - "libraries/3rdparty/tinycrypt/lib/source/ctr_mode.c": "30ce4835f928dc331ed74f86de26b9839ae50e703e6086434edaf3ba5a87473a", - "libraries/3rdparty/tinycrypt/lib/source/ctr_prng.c": "c0a2de479ae4bb72b89236a44058d387e14670f24e114298ee14173c41bd5315", - "libraries/3rdparty/tinycrypt/lib/source/ecc.c": "1c56234ff29708c712d07f864ed498eb6b0ab8475b5b5824079ed0c77070ea1b", - "libraries/3rdparty/tinycrypt/lib/source/ecc_dh.c": "bf6a6ba824721d9fa781b594ade96cbb97d47f65dd7fe5b431dc0ac6eaf335a1", - "libraries/3rdparty/tinycrypt/lib/source/ecc_dsa.c": "f80751d74bc9be544308f5b7495492b68e552b7283540cd50f9d0f295df13591", - "libraries/3rdparty/tinycrypt/lib/source/ecc_platform_specific.c": "17f454ecc206f2ac532c517b13beb56ff730e71efb93eb70b20ee71617a8eb7b", - "libraries/3rdparty/tinycrypt/lib/source/hmac.c": "6c9141de8af68822f611b4213801eda5a8695ece071b3bef34dbb6e52ffdd709", - "libraries/3rdparty/tinycrypt/lib/source/hmac_prng.c": "3a64017e98bd7b25f33819cbcd597d48e9ae00478201a68a485cf7e04f400274", - "libraries/3rdparty/tinycrypt/lib/source/sha256.c": "a8ad4bb2c09e31e4ab86c1b4f8fa073937a42e2694afb4dde6cb1b3c7a4b5ffd", - "libraries/3rdparty/tinycrypt/lib/source/utils.c": "2cf7cd3ee3b48d05b925dc005c1b12ead098f3939e948f55e278e16c180e8d8d", - "libraries/3rdparty/tinycrypt/tests/Makefile": "5d72dc2308dc2cdf16a6565b700d931a9b2ab72550af58a890993f301002c6f2", - "libraries/3rdparty/tinycrypt/tests/include/test_ecc_utils.h": "f793eb6066f90db4222a4d95d47e5f6b2e480bc07e1766e05cd091ccf8cc565c", - "libraries/3rdparty/tinycrypt/tests/include/test_utils.h": "bf74d9342f08637b56652c599b2956a21c56d32e80ec1e9d74b4909bd12b4122", - "libraries/3rdparty/tinycrypt/tests/pseudo-random-data.bin": "87944d1d1787ad21685f9289a5f5e365d7582f395d9d2dd9b122b837b30d1c61", - "libraries/3rdparty/tinycrypt/tests/test_aes.c": "27060817b7a6b0646aa5c4d55bf51586b976326bf165ae9ebdde7f5b26cf5f6b", - "libraries/3rdparty/tinycrypt/tests/test_cbc_mode.c": "59dfe4f51a60b38bb5d6cbc0be5db9ae795c993e58663e58f5fd9998e71f88aa", - "libraries/3rdparty/tinycrypt/tests/test_ccm_mode.c": "32249f37c22a339f6e1b0140fdee83402226a70726fb7beeab225a0989120073", - "libraries/3rdparty/tinycrypt/tests/test_cmac_mode.c": "1b48ae8a493e009e09d9ea9829353a4b90a71c21a297373c242215a67f2b683a", - "libraries/3rdparty/tinycrypt/tests/test_ctr_mode.c": "be4ae7b236ea863937b6091aa1f3717df196a333fbf39ff922d7da0c8eacc512", - "libraries/3rdparty/tinycrypt/tests/test_ctr_prng.c": "f745a4d272810460c85f8c1781da7977e7fdcf02e02d25f34e363b60c8291c9e", - "libraries/3rdparty/tinycrypt/tests/test_ecc_dh.c": "28d253afaa2f1e329ba5ccd4266b34d45346e77235fecc593a78a360ef6195e9", - "libraries/3rdparty/tinycrypt/tests/test_ecc_dsa.c": "55533e65df9e3c7e2e792c92ca5a567b692b92c289c21f12b3cfd75b385fef93", - "libraries/3rdparty/tinycrypt/tests/test_ecc_utils.c": "4ff6a5f2f5465f485ab2333cc4dd15b2244ca875cc016b6e646510d218ba3be8", - "libraries/3rdparty/tinycrypt/tests/test_hmac.c": "c0bca5221fbb587f5c29477fa062d7e30297914c1010102b5f6f47f2cb37e143", - "libraries/3rdparty/tinycrypt/tests/test_hmac_prng.c": "bbdabde91a268dc6b3a20f0efdff63e2d099848a013edfa7e956358ef3a9caf8", - "libraries/3rdparty/tinycrypt/tests/test_sha256.c": "b154011602efffd7319ca8eb6a0a04b9476efe2c1abb42f09748c3ed766197bc", - "libraries/3rdparty/tracealyzer_recorder/Include/aws_secure_sockets.tzext.h": "7a32f358eb66e499cfd083206ef4c7c5da6e1be9374cf50f3e5e286997a9c1b4", - "libraries/3rdparty/tracealyzer_recorder/Include/aws_wifi.tzext.h": "77cda4235e4436878fb5cc5a850075a6ac658b00269fa831d71983f9c0d43137", - "libraries/3rdparty/tracealyzer_recorder/Include/trcExtensions.h": "4750f0f01b17b0b989b59d0d3db673a67de759162d896a3dd89a8b2a9cc43940", - "libraries/3rdparty/tracealyzer_recorder/Include/trcHardwarePort.h": "b22ec1a829e1370154dd9217fae634d714b1bd8765dbeb36dde4529454d98f1c", - "libraries/3rdparty/tracealyzer_recorder/Include/trcKernelPort.h": "4e0a7fd011a2f5acb912f51ff0c1349ffc7a82805ed027a41d3f78737ca20716", - "libraries/3rdparty/tracealyzer_recorder/Include/trcPortDefines.h": "bcbd866a94a9bb5696481eb7e8540101d78dd82d963b2bdb56626a3dd51fa15f", - "libraries/3rdparty/tracealyzer_recorder/Include/trcRecorder.h": "c1e4d5e4ae87b38240e351aa3c93b570e153ad6f326666acd9067ed5e0953fad", - "libraries/3rdparty/tracealyzer_recorder/ReadMe.url": "3fbfd84c715d8e6d3df562c3019b2892139b098641d42d3f5b91781704bf2bfb", - "libraries/3rdparty/tracealyzer_recorder/config/trcConfig.h": "e20d06dbec2b222c6faee3fd940c675028494d0cef41c5d524439e3ba4dccef5", - "libraries/3rdparty/tracealyzer_recorder/config/trcSnapshotConfig.h": "2565df36a1c0c3e50314d3cd10b9a0675f875259da9534b318c7c814ee3ab76a", - "libraries/3rdparty/tracealyzer_recorder/config/trcStreamingConfig.h": "91321655d6de4bbbb05dc2d3d0c36561de70555c627271902c630350e63b8b77", - "libraries/3rdparty/tracealyzer_recorder/readme.txt": "607e810b5ab8d1dcc6101c4af4d5212cb9eb905dec8611361395085198c7becb", - "libraries/3rdparty/tracealyzer_recorder/streamports/AFR_WIFI_LOCAL/Readme-Streamport.txt": "42c43ce0b02c9d7b83ab4786ec246ac359cb034bb694edb2e8b99f16b024d0d3", - "libraries/3rdparty/tracealyzer_recorder/streamports/AFR_WIFI_LOCAL/include/trcStreamingPort.h": "16d3453f41635e9d396537d41d05510662121445a65d8aad713a0612393df71b", - "libraries/3rdparty/tracealyzer_recorder/streamports/AFR_WIFI_LOCAL/trcStreamingPort.c": "ba201fe8d90a15471d06653c4157633c494e467b82e1bfef4d886343868e9cb0", - "libraries/3rdparty/tracealyzer_recorder/streamports/ARM_ITM/Keil-uVision-Tracealyzer-ITM-Exporter.ini": "f115f28d185d7158c6e1b2d7671865aafbbd30bb91f231e69a502173b247d374", - "libraries/3rdparty/tracealyzer_recorder/streamports/ARM_ITM/Readme-ARM_ITM.txt": "9697b415f9559bd5129444f67ffd9283456323b267439399af97bfd9e769b621", - "libraries/3rdparty/tracealyzer_recorder/streamports/ARM_ITM/include/trcStreamingPort.h": "f3a13f5f3e5fdb57a21e9ed8978d25bbbd40176e2f74316f84bb903c79888fe6", - "libraries/3rdparty/tracealyzer_recorder/streamports/ARM_ITM/trcStreamingPort.c": "b8c2dddc68e2976fe7956e679e90e88eb793719b48e1c7b34f7240067915f50d", - "libraries/3rdparty/tracealyzer_recorder/streamports/File/Readme-Streamport.txt": "bab3659daf227c8b13136ce0e9596e5afeffc29de4d156e3040f1535a6f0482b", - "libraries/3rdparty/tracealyzer_recorder/streamports/File/include/trcStreamingPort.h": "6de4cfc1f5305ed7741a541de6f19844ad633cd1376a58e654d5cedbe2120f49", - "libraries/3rdparty/tracealyzer_recorder/streamports/File/trcStreamingPort.c": "459f57c182a7db1242bf713b2e583bea3b6162777becd7e444e7aefb42bb642b", - "libraries/3rdparty/tracealyzer_recorder/streamports/Jlink_RTT/Readme-Streamport.txt": "09c5ddedff88c85b1acb667dd53627f663df8831a710d7d5a62fc7db4db79ded", - "libraries/3rdparty/tracealyzer_recorder/streamports/Jlink_RTT/SEGGER_RTT.c": "7373709c2e587cd1abd221a6f249f9a6e14d8c11ee0b3d75d701b973586f7369", - "libraries/3rdparty/tracealyzer_recorder/streamports/Jlink_RTT/SEGGER_RTT_Printf.c": "ee399915fdbdb91901d825b3c1696f9add8936c354064ff4dc3e69a0dac6ccbe", - "libraries/3rdparty/tracealyzer_recorder/streamports/Jlink_RTT/include/SEGGER_RTT.h": "5da6bbb8b2d11faf2b948b00da9af146bd68dbb51245578e7167a1cb77ef9e5c", - "libraries/3rdparty/tracealyzer_recorder/streamports/Jlink_RTT/include/SEGGER_RTT_Conf.h": "231b7db1562922b395620e05937ebc6438e0f0323bd95057b987294b0872a510", - "libraries/3rdparty/tracealyzer_recorder/streamports/Jlink_RTT/include/trcStreamingPort.h": "83ec42f63402acd8e671d71e6724713b798ebcef792a1a2ff61e6facc34308b4", - "libraries/3rdparty/tracealyzer_recorder/streamports/Jlink_RTT/trcStreamingPort.c": "a33163cb9745dc3670a1bc7d3e60a128005bfc1b0c1734172729542577cd92d2", - "libraries/3rdparty/tracealyzer_recorder/streamports/TCPIP/Readme-Streamport.txt": "1bad876ee3af398df3fafb1f41afa99649bb4a54f5363ef41596df8d51cd8223", - "libraries/3rdparty/tracealyzer_recorder/streamports/TCPIP/include/trcStreamingPort.h": "4423f8db962d42ef503a606acc69758153c870407ce2eea914ed965309a149bd", - "libraries/3rdparty/tracealyzer_recorder/streamports/TCPIP/trcStreamingPort.c": "cd8293c3da466bb9b384d1a40d8f42521edd2941e575aa3095eb6e98e905ce09", - "libraries/3rdparty/tracealyzer_recorder/streamports/TCPIP_Win32/Readme-Streamport.txt": "780fa3af3812a6db0b2f364ba79ea9f53e19e4e8c7a66833e4270d8b4541588a", - "libraries/3rdparty/tracealyzer_recorder/streamports/TCPIP_Win32/include/trcStreamingPort.h": "780f0cd9bee4233e12c07342efc632008315c9e9bd3218e68382e3ded8ac48bf", - "libraries/3rdparty/tracealyzer_recorder/streamports/TCPIP_Win32/trcStreamingPort.c": "2d5a558ce8cbafdf29b186fb27d409622160929d151ef47adfcc18215ade2179", - "libraries/3rdparty/tracealyzer_recorder/streamports/USB_CDC/Readme-Streamport.txt": "a283d5e083e1a231cfb3bc17b30bbc01f4547dc740865d3cd9aa2b5878cbd531", - "libraries/3rdparty/tracealyzer_recorder/streamports/USB_CDC/include/trcStreamingPort.h": "6e7cf9f4d23c569ddb48d2a6cd7101e5266d95104c6a3a02326b89ab94c357b0", - "libraries/3rdparty/tracealyzer_recorder/streamports/USB_CDC/trcStreamingPort.c": "109bf4ca36cef6e364455ca8c4311ae614eb88e3bbfb0d5f0537eb03d65b64a7", - "libraries/3rdparty/tracealyzer_recorder/tracealyzer_readme.txt": "7fbf1589361df83fb3dae0e6ab4705bddfda4e6f5a38c44bfac9d7d408279407", - "libraries/3rdparty/tracealyzer_recorder/trcKernelPort.c": "bf314236cc6eec16119190cc91c96f9892d69f2f3f5887f7c658dda21385dab2", - "libraries/3rdparty/tracealyzer_recorder/trcSnapshotRecorder.c": "12f0c25ae2bd3a287e824d89c840a0e9ce6e3ecd892e830c1b403399a376fded", - "libraries/3rdparty/tracealyzer_recorder/trcStreamingRecorder.c": "a558fcea27ef041cb24615695a39ace3d84f81caa94534d0e7d69baf4d03cace", - "libraries/3rdparty/unity/CMakeLists.txt": "c9af8e56b8815a03197444cc642cfa5f33534efa6363573d94ba2c08c705e668", - "libraries/3rdparty/unity/LICENSE.txt": "3ed9b51da86f52c729c96cc99fdde6444b2297c788a9cf4ad1d3649dc34c4985", - "libraries/3rdparty/unity/README.md": "c4612d859d547fe4fd7a344899d33a6a0b91b65df4b3d90a75e1e766b36462a6", - "libraries/3rdparty/unity/auto/colour_prompt.rb": "e98b5171e72057bcfc19ae252f1c7d74ec93eca16957379ccce49da85712c4a4", - "libraries/3rdparty/unity/auto/colour_reporter.rb": "2e6fbc6a1718d1f755378a934526a5b4fe11ef045302ac1e1c251e927477d697", - "libraries/3rdparty/unity/auto/generate_config.yml": "85c5702a168e366148e8ec89df416eae888278a526c79459162c0f37641a02fe", - "libraries/3rdparty/unity/auto/generate_module.rb": "8d7ca483abf4bbd81b6b6e35628a31db43957b60ffd1fc9f5879976ae49d5676", - "libraries/3rdparty/unity/auto/generate_test_runner.rb": "3b267203eb9bc77ecd495024fedf857b3f7ac882804848a1d616028113ec5888", - "libraries/3rdparty/unity/auto/parse_output.rb": "3f33f2d75d316c767cf22ca59d404ff2287a5c8eeb37ebbe02f4bfe4ce099877", - "libraries/3rdparty/unity/auto/stylize_as_junit.rb": "d1d32f676a7de29b5c6526ddfff0f260f8881a2a2ccd06a31da34e94cca15d7c", - "libraries/3rdparty/unity/auto/test_file_filter.rb": "a69a44fccafbb504635163793799aa59809035951d7f258547d64d4145131a60", - "libraries/3rdparty/unity/auto/type_sanitizer.rb": "ecc5677ac9820f343aca50893463602fca940c24daf07a4784b4e9e0801c3f4b", - "libraries/3rdparty/unity/auto/unity_test_summary.py": "e46350b7132f04a7bb339d47bcef11ae0cb9e74c2050d0d75697b33c253c2895", - "libraries/3rdparty/unity/auto/unity_test_summary.rb": "22f41c7a277cb37895d742829ce9ca7ba65180a3b0011126c1e90c8cb1b37c20", - "libraries/3rdparty/unity/auto/unity_to_junit.py": "0743f26b5ae67af204981293337f9cc9a8cb46c90aaa3f46f31fd9658ab65990", - "libraries/3rdparty/unity/docs/ThrowTheSwitchCodingStandard.md": "f0f000eb1fc32b3a6684da894ed816d09ba077ad85e65e44f1f7998da47ef178", - "libraries/3rdparty/unity/docs/UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf": "28e8687d90c111ee8c249a7748495a0bfe00a3f35231b026ac73eed01d32eb34", - "libraries/3rdparty/unity/docs/UnityAssertionsReference.md": "4a7475082e43c174b8cb6d80d9505da5700d4ffadec7eb6923c813c57988ec56", - "libraries/3rdparty/unity/docs/UnityConfigurationGuide.md": "63008818f574d5a1cf365c484493dedca3763a563efd77f460a60325f30d4c16", - "libraries/3rdparty/unity/docs/UnityGettingStartedGuide.md": "c7eae02ffedd7ad4a112dab2ded25f238aed89f2358dd54bce7e64ae803dd4e2", - "libraries/3rdparty/unity/docs/UnityHelperScriptsGuide.md": "f8b89d36c0b901265fd3366f0a93045218c03adf501c240a5570bc68e22ceaac", - "libraries/3rdparty/unity/examples/example_1/makefile": "367e10ef968648ec5c531f144bb0ee257a619091a76fcc17516c220bf20539e6", - "libraries/3rdparty/unity/examples/example_1/readme.txt": "4d72d51f1a385cd4aeb594e4485ca2439d5b86247523cd2d2b89acc2173d8a24", - "libraries/3rdparty/unity/examples/example_1/src/ProductionCode.c": "9d6b0ae761f7dfc008d6547031ff92de63976f5621b6feef2a29614cec51b357", - "libraries/3rdparty/unity/examples/example_1/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", - "libraries/3rdparty/unity/examples/example_1/src/ProductionCode2.c": "c2cc0a76cb2ea145d3861bd9ccc467ac45ad3e8230d5075ed174ce3a5cd50a76", - "libraries/3rdparty/unity/examples/example_1/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", - "libraries/3rdparty/unity/examples/example_1/test/TestProductionCode.c": "33e4b165d437c376f2393da59be0b22a3a458ebbe94cc2b340159b71f2d8bb74", - "libraries/3rdparty/unity/examples/example_1/test/TestProductionCode2.c": "11387f2ecdc97ee3344c0df42123e73cae899702b348d5597e09e9760db267aa", - "libraries/3rdparty/unity/examples/example_1/test/test_runners/TestProductionCode2_Runner.c": "2c84d6b954a6810a7c509dc861ee0c18a562dd23a5dd7747ea524f0c1467d9a4", - "libraries/3rdparty/unity/examples/example_1/test/test_runners/TestProductionCode_Runner.c": "b6ec7bb984eddea80c178ecb30f6f772325a745ff9812a5e3f41f236c43e19e0", - "libraries/3rdparty/unity/examples/example_2/makefile": "9c925a4b80f11ce51cb65fef51f8e1279113dc67838c71b5bc8b0c31009e65bb", - "libraries/3rdparty/unity/examples/example_2/readme.txt": "a03bf4ac2d294a037189b42f7bf8fdff0bf50524857e3f8933eba76085f22f04", - "libraries/3rdparty/unity/examples/example_2/src/ProductionCode.c": "75136eec7a43d0dbe980dea19ec46f6e16c0da92093686e59f6143d8ae8b5bb7", - "libraries/3rdparty/unity/examples/example_2/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", - "libraries/3rdparty/unity/examples/example_2/src/ProductionCode2.c": "a929e7ef393ec5ccc53e3f885d663a1c8fbe5cc5f72a0fcad5c0d2f6cbc8b210", - "libraries/3rdparty/unity/examples/example_2/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", - "libraries/3rdparty/unity/examples/example_2/test/TestProductionCode.c": "7db7b7d9e7216fdc0814ff8bbecc37f40e573006207b47cfd8954469ebc9b502", - "libraries/3rdparty/unity/examples/example_2/test/TestProductionCode2.c": "332f23e940a9676504c84dc92d1a6cf72cd9204afe7f664c16b58ee7dbff312d", - "libraries/3rdparty/unity/examples/example_2/test/test_runners/TestProductionCode2_Runner.c": "14aef95de310f1e1381feaaf256ea94d0905a538311b5e3fdc944f927e75b287", - "libraries/3rdparty/unity/examples/example_2/test/test_runners/TestProductionCode_Runner.c": "a782491bcd8dd857b26a62df58e8671f1cb7641d6c0fe7f7853c079732ccd8e9", - "libraries/3rdparty/unity/examples/example_2/test/test_runners/all_tests.c": "fe5c0418201d70dc696b0db6acf60b2ea0069d74fa94fb96d7169b8752e00d17", - "libraries/3rdparty/unity/examples/example_3/helper/UnityHelper.c": "091c2466d25deffd8958332ad03d393ca1ec1b1f6150c16626d57d5901eb1b21", - "libraries/3rdparty/unity/examples/example_3/helper/UnityHelper.h": "a95bb6d3704c51637bb0855787236b41229e3836601ba97e88768f95779f3d4d", - "libraries/3rdparty/unity/examples/example_3/rakefile.rb": "2bd39eda1eb55bddd65a0a1536f707c2304b70bca3ac6bba6c0790d745a79a45", - "libraries/3rdparty/unity/examples/example_3/rakefile_helper.rb": "cfee16d634da56580eb6e7cdd5fe6fdffe432b21fba11f7262949d94f4622470", - "libraries/3rdparty/unity/examples/example_3/readme.txt": "2af5e731fb1db0ddf5c739f0b08fb2724e4acc7efb7ee0a02fe474a3e69d284a", - "libraries/3rdparty/unity/examples/example_3/src/ProductionCode.c": "75136eec7a43d0dbe980dea19ec46f6e16c0da92093686e59f6143d8ae8b5bb7", - "libraries/3rdparty/unity/examples/example_3/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", - "libraries/3rdparty/unity/examples/example_3/src/ProductionCode2.c": "a929e7ef393ec5ccc53e3f885d663a1c8fbe5cc5f72a0fcad5c0d2f6cbc8b210", - "libraries/3rdparty/unity/examples/example_3/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", - "libraries/3rdparty/unity/examples/example_3/target_gcc_32.yml": "2e61fc6bc7930929985f1ea1ec5d0019fe1d133c01555c86b01b20145fb6aaa4", - "libraries/3rdparty/unity/examples/example_3/test/TestProductionCode.c": "b0e815e2285b1730d7dcd24b400d15b4efccfe5e4776d96248a2165c2f0caec6", - "libraries/3rdparty/unity/examples/example_3/test/TestProductionCode2.c": "895f437abd40bd461fd86a3b8ed6bc02c5c283fc3926aafe53b473e477fa0a5a", - "libraries/3rdparty/unity/examples/example_4/meson.build": "b7ca305825ef9e6bef4e3a3fb4d0fba19882073e1f2c4e755f8044f697b93119", - "libraries/3rdparty/unity/examples/example_4/readme.txt": "d16faba668694cacde12746c58ec512de301218543217a9644e4e269bee8ab0c", - "libraries/3rdparty/unity/examples/example_4/src/ProductionCode.c": "9d6b0ae761f7dfc008d6547031ff92de63976f5621b6feef2a29614cec51b357", - "libraries/3rdparty/unity/examples/example_4/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", - "libraries/3rdparty/unity/examples/example_4/src/ProductionCode2.c": "c2cc0a76cb2ea145d3861bd9ccc467ac45ad3e8230d5075ed174ce3a5cd50a76", - "libraries/3rdparty/unity/examples/example_4/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", - "libraries/3rdparty/unity/examples/example_4/src/meson.build": "46a328e6425249131d7ddc66bfd0b699638efec6d722e7f191621d60d7cb18d6", - "libraries/3rdparty/unity/examples/example_4/subprojects/unity.wrap": "59d1f20c0ada120ee62ef1baf30be51ebaaf40d30b16e4da014f9d58023b7a8a", - "libraries/3rdparty/unity/examples/example_4/test/TestProductionCode.c": "f3a8fa16e599d6aa7a0c9cf604ea1d42ff5466244372e00543fc3b2e116f0d41", - "libraries/3rdparty/unity/examples/example_4/test/TestProductionCode2.c": "26c0ee5fabc061cfd32ae891ab16f4b985f306dfea1a939d00e89a3c1ae6f25e", - "libraries/3rdparty/unity/examples/example_4/test/meson.build": "5b19fa4453b496f7a63de664c470ede7485d17ccd3b88a8e6a4b63d4da5be243", - "libraries/3rdparty/unity/examples/example_4/test/test_runners/TestProductionCode2_Runner.c": "2c84d6b954a6810a7c509dc861ee0c18a562dd23a5dd7747ea524f0c1467d9a4", - "libraries/3rdparty/unity/examples/example_4/test/test_runners/TestProductionCode_Runner.c": "b6ec7bb984eddea80c178ecb30f6f772325a745ff9812a5e3f41f236c43e19e0", - "libraries/3rdparty/unity/examples/example_4/test/test_runners/meson.build": "b8a2bfb8acb2f83d22a74700f1adb4e90474f11272aa341670fad17c7ae5e71e", - "libraries/3rdparty/unity/examples/unity_config.h": "e339e493a19a70352c324e371aba058e8795ef166d7af4f1edd8c49ed9771a70", - "libraries/3rdparty/unity/extras/eclipse/error_parsers.txt": "67e309b5e803a22ba22c347aa5123cbbe73edcbfe9950aa0fd74576a4add1a12", - "libraries/3rdparty/unity/extras/fixture/rakefile.rb": "00806fb140d73e67b0c3b6b944f0ab3197e51c0b88b975e6dd778043f1e7a9ab", - "libraries/3rdparty/unity/extras/fixture/rakefile_helper.rb": "db69f025b23ba4f30a38155a10199082ac45bc2cb49d6fe039365a3fde11c79c", - "libraries/3rdparty/unity/extras/fixture/readme.txt": "5692862a5fbc1910978be7ea4751899bafb6b913ce34cffa5517c0eba1fe40e3", - "libraries/3rdparty/unity/extras/fixture/src/unity_fixture.c": "29c1ed80d563a7b216b0fb4213dfc173094fd4f51d2e1c1ec188e75063386d59", - "libraries/3rdparty/unity/extras/fixture/src/unity_fixture.h": "6ef887747dcea12dcc5e24273aa1e792d90277ac4e32fb187969ed6217bf3131", - "libraries/3rdparty/unity/extras/fixture/src/unity_fixture_internals.h": "56eba22c7fd8c73d4bf8f95639f08abf63573f22efaec4b8061578b604eb556b", - "libraries/3rdparty/unity/extras/fixture/src/unity_fixture_malloc_overrides.h": "446d4a58dd88ce0bceba6e095ac4f26a4c55898e67265d688450fa3aacc7741c", - "libraries/3rdparty/unity/extras/fixture/test/Makefile": "665bba3afaf6ebd289432b039e40b03a24c7fee6f4dde8f82b1a7468fe82a7e7", - "libraries/3rdparty/unity/extras/fixture/test/main/AllTests.c": "1ec0a0e004f8a70d03dc76e28f38f09519bbaf7306d48d17d5bf0573d34c87c0", - "libraries/3rdparty/unity/extras/fixture/test/template_fixture_tests.c": "3ca4c500397fc3dd7370b419e7d4f7abb3a8b05deacaf72a4e2ccb396669003a", - "libraries/3rdparty/unity/extras/fixture/test/unity_fixture_Test.c": "d8d631a1e192b25ae24ea6ecf3bb53e86eff8f0615a1ad7095106d847b847d18", - "libraries/3rdparty/unity/extras/fixture/test/unity_fixture_TestRunner.c": "e739cdf119f943d482fe99b6acec671aa88a78b9cb38bb2b459d946ab962a200", - "libraries/3rdparty/unity/extras/fixture/test/unity_output_Spy.c": "efa0dfae695ba004c67a120c0b0e3d6f93f72cf7a992662bd4ab15d725c3ff45", - "libraries/3rdparty/unity/extras/fixture/test/unity_output_Spy.h": "b5adfe4f07d3c1c4b7cb0178344ccf608c60a08713d768c8b3e073c6f030dde5", - "libraries/3rdparty/unity/meson.build": "78b6c83b22c043c2741e1c63dbdc5477a39ba74566bcfcc704580976d4d79bd5", - "libraries/3rdparty/unity/release/build.info": "d068d6cff7b4f86fea550f0c3a9d37b227c5c18c20da61d2f73553906484999f", - "libraries/3rdparty/unity/release/version.info": "bf2380afad00fc76d9fb76d653c32eca8efe8916cf88f7000fa8920860ded480", - "libraries/3rdparty/unity/src/meson.build": "9e8bba1e59c9ad97365fc322eca8a2ca2a97b5c4e35de0389d3e4c8bdcc83aa9", - "libraries/3rdparty/unity/src/unity.c": "7486d9c33bce48a2ec7967e72407e906d06cb179ed90babf06626f181ea35a6f", - "libraries/3rdparty/unity/src/unity.h": "a1d55805833e8464ac217f7f93d7a6fba59e1b12df05c7517fda8f7717fda31f", - "libraries/3rdparty/unity/src/unity_internals.h": "ae94c9a6908768407f4d29d6b1acd06603e21e7946800dbe4a7bd1a510ce575a", - "libraries/3rdparty/unity/test/Makefile": "da2a6c3820bed28cb3f4f71085daabc80e02b97ab75b59447e18b533d7d572bd", - "libraries/3rdparty/unity/test/expectdata/testsample_cmd.c": "832ec9c8c30fd374adea6620dd38c19c689047bdad0513984066e525eefc0723", - "libraries/3rdparty/unity/test/expectdata/testsample_def.c": "246d3d9bc73ccef28f7a70b8748d95cd31eb85b9874e6972d30be1f74000fb8c", - "libraries/3rdparty/unity/test/expectdata/testsample_head1.c": "ed31f2c63e4bb7ba015a5388429b34287ecefa098551e55ae5864b883c3cdad4", - "libraries/3rdparty/unity/test/expectdata/testsample_head1.h": "fc279a298e45f70a559d05132ae888973c8f5aad913c0b2d6d8425ccbde5c998", - "libraries/3rdparty/unity/test/expectdata/testsample_mock_cmd.c": "b826f44458088555058b6c3b9c7ef15c2a5528c8efe01034d0f1debee06a739e", - "libraries/3rdparty/unity/test/expectdata/testsample_mock_def.c": "1016f1162a3ea3be49dffd824e529493d2845860d1139cb44cc32f0fe0a0701f", - "libraries/3rdparty/unity/test/expectdata/testsample_mock_head1.c": "cb7b253cefa315d7b4edaa386bffb63a728f3b33c869bf55ecfcd53d1e47eaaf", - "libraries/3rdparty/unity/test/expectdata/testsample_mock_head1.h": "9cb779d98b40e5dfcf70db57f7d3deae6310cac80547140c972ecde585f56c18", - "libraries/3rdparty/unity/test/expectdata/testsample_mock_new1.c": "4e5d73972dce4276dc688016eeb310e93ef96ea7beee0e6839092f0459798856", - "libraries/3rdparty/unity/test/expectdata/testsample_mock_new2.c": "74418cfefe544ac366a043972648c31742b2a4652155507c93a1a2a38471a5eb", - "libraries/3rdparty/unity/test/expectdata/testsample_mock_param.c": "6a8edda1c9b5a56d38e705d2d0341232ca9a55f1fb7383171475cb972c9b6c18", - "libraries/3rdparty/unity/test/expectdata/testsample_mock_run1.c": "4e5d73972dce4276dc688016eeb310e93ef96ea7beee0e6839092f0459798856", - "libraries/3rdparty/unity/test/expectdata/testsample_mock_run2.c": "74418cfefe544ac366a043972648c31742b2a4652155507c93a1a2a38471a5eb", - "libraries/3rdparty/unity/test/expectdata/testsample_mock_yaml.c": "763d37bc5a5edc7566bf6625dd38878aed8cc94a5cec8f6e23aee16e30bdaad6", - "libraries/3rdparty/unity/test/expectdata/testsample_new1.c": "983abee21894ba9fb5d667a69b046558867f9f16eaf546d259671f54dd4be626", - "libraries/3rdparty/unity/test/expectdata/testsample_new2.c": "9726bdaec7a5c8e99b4e6bbfc41b91c8687665bbafdb617be4514eadc30b023c", - "libraries/3rdparty/unity/test/expectdata/testsample_param.c": "7ab6834f8376908625b9999a4c5dad32ad65c8f3fd852e78b6d9c3bc871fc639", - "libraries/3rdparty/unity/test/expectdata/testsample_run1.c": "983abee21894ba9fb5d667a69b046558867f9f16eaf546d259671f54dd4be626", - "libraries/3rdparty/unity/test/expectdata/testsample_run2.c": "9726bdaec7a5c8e99b4e6bbfc41b91c8687665bbafdb617be4514eadc30b023c", - "libraries/3rdparty/unity/test/expectdata/testsample_yaml.c": "17714f87e28c7723608fdc832189965482404e3540e3f3ec55afa7f07054e0a7", - "libraries/3rdparty/unity/test/rakefile": "7bdd33e324a46e8e5cb97a052a2d62dae0c0a7e4c33cce9976e34af316d37007", - "libraries/3rdparty/unity/test/rakefile_helper.rb": "57a77ff52e8e79a9fa30c308465cbfbfba9881ee5871de182abbf92682f16477", - "libraries/3rdparty/unity/test/spec/generate_module_existing_file_spec.rb": "41d0b6bf8255f97e4fbf6c4f5fb2dcc61d846d2ddaf2cad763c1f500b8a68727", - "libraries/3rdparty/unity/test/targets/clang_file.yml": "afbb70db8cc433aca8e6ea3d04d2f5142cc8bd1a8f6e421006038c9601222d32", - "libraries/3rdparty/unity/test/targets/clang_strict.yml": "336cc5344beccd0c3a6c83227b764c8945193b464600ba56ade14c3c44c98b27", - "libraries/3rdparty/unity/test/targets/gcc_32.yml": "734debdb4392b83942cdccfb31ca724a43b923617a8b45d86bf6a1fefa86a7e6", - "libraries/3rdparty/unity/test/targets/gcc_64.yml": "530851623a24956399add9f0c0fe18719eb6dc428c1bec03ae6b255a9d0ae972", - "libraries/3rdparty/unity/test/targets/gcc_auto_limits.yml": "fbd96dc8a94c4de70dae87ff378312b3ee07cb8219d6290af17d36e3b34d0f6e", - "libraries/3rdparty/unity/test/targets/gcc_auto_stdint.yml": "c9ec9f61987603d059d4509f4befe0744f5fa99a137d95be359ddd2c71443281", - "libraries/3rdparty/unity/test/targets/gcc_manual_math.yml": "3bd8b0d4eb9fa693f4cf74fdaf61e31183b85351c4e957577bc8497cdc8f15a0", - "libraries/3rdparty/unity/test/targets/hitech_picc18.yml": "7b2a4ea56f3125fd75bb7d8e9baf1f26706b206f98c6f88e4d4b4091361fc546", - "libraries/3rdparty/unity/test/targets/iar_arm_v4.yml": "3df93ad02fd4e1cc17d28a63f824881eee4f73e1db54e43ff36909dd2f5eabaf", - "libraries/3rdparty/unity/test/targets/iar_arm_v5.yml": "bb6f961bbf3cf2c4651a33bf415818726b4d609c05cb9fdeabe6dc7a94d47e6b", - "libraries/3rdparty/unity/test/targets/iar_arm_v5_3.yml": "bb6f961bbf3cf2c4651a33bf415818726b4d609c05cb9fdeabe6dc7a94d47e6b", - "libraries/3rdparty/unity/test/targets/iar_armcortex_LM3S9B92_v5_4.yml": "8835f98e84e75b920fb9e27c0ebcc9c11f14bff768b382441099a01cbf7a129d", - "libraries/3rdparty/unity/test/targets/iar_cortexm3_v5.yml": "70ba518b050162526cf5cfd3cdc90a00a6aad0d0ef65558612d384c855513d52", - "libraries/3rdparty/unity/test/targets/iar_msp430.yml": "527ef25ba8d5056a8b44fce38302895a1a8ed342331edeed69db067b831c8e7b", - "libraries/3rdparty/unity/test/targets/iar_sh2a_v6.yml": "b99162afd271d76014220cabda53ff3951aae6595b198520eba36ef095e57746", - "libraries/3rdparty/unity/test/testdata/CException.h": "3d791048e28a3a83580dc5cb7a03d918323247128bde97b055e1037924a4a3a0", - "libraries/3rdparty/unity/test/testdata/Defs.h": "309f8524e59399b7e9e5f2a02ab7a1a4e21d6f808bdb05730ad41366412b72ea", - "libraries/3rdparty/unity/test/testdata/cmock.h": "f600e74488bfc56862df2daedce1a3525eaad43ed72c6706817f6629b180a1ec", - "libraries/3rdparty/unity/test/testdata/mockMock.h": "f198c43bad6e541c08b5e32c204d894be499ff005032c3ffa25e7ed7ba176001", - "libraries/3rdparty/unity/test/testdata/testRunnerGenerator.c": "b860abcd7d1b06000a6cdac491016c7396fb3da70fe4f04bca557fdf599136a3", - "libraries/3rdparty/unity/test/testdata/testRunnerGeneratorSmall.c": "f32a9a46a78102474346c7516bdb0401fabef9ee8616d033237a4bc658e3357a", - "libraries/3rdparty/unity/test/testdata/testRunnerGeneratorWithMocks.c": "96b3eba183241dd7fe69045e51aac3b76ef1632db13ad2ac058300ac201f6d88", - "libraries/3rdparty/unity/test/tests/test_generate_test_runner.rb": "bbcfbcd8c45d6c8dcd05fc2400914805d965e378297d536a63276cb2760deda3", - "libraries/3rdparty/unity/test/tests/testparameterized.c": "a3759d06ae748456d37e36bc8c44fe74995f95813c9697cd98cf4f0cfa55f6bb", - "libraries/3rdparty/unity/test/tests/testunity.c": "f8c1a7d15941af4299f3870d8a4311dd738f36d288ac82d1469c87837827bb7f", - "libraries/3rdparty/win_pcap/Packet32.h": "91424a5947374de2ea163bff4e0c033e3f6d1a2a789f3999f6e20c95080ffa32", - "libraries/3rdparty/win_pcap/PacketData.h": "4cb0df826837bf82691e5a98a7599671b259efc512b1c4825accca77d0cfc7a1", - "libraries/3rdparty/win_pcap/Win32-Extensions.h": "81117e8c6de61172df09834f50a1b127de721abb960e25dd25dbaef97d9e48fa", - "libraries/3rdparty/win_pcap/bittypes.h": "f895a46f3d528a66a2489850e478123dd1eedc5e62a3a529e626c3ab08cbabe1", - "libraries/3rdparty/win_pcap/ip6_misc.h": "fccef70161c3607d1cf0128013ee00410d477a581b62bb0d337d77a51d43ec05", - "libraries/3rdparty/win_pcap/libwpcap.a": "6082e9aeb725b2836e4f746527630885d1ec4c4004f81cdc9fd8d5a130097207", - "libraries/3rdparty/win_pcap/pcap-bpf.h": "a24e6a99451cc013cb1b891724fb04b4079251557852f5667f998a342d1b6446", - "libraries/3rdparty/win_pcap/pcap-namedb.h": "97afaf663c4ed4710101d5c6053011e0764642ae1adbffdabc9ee0dcf88874e1", - "libraries/3rdparty/win_pcap/pcap-stdinc.h": "937710c6e5412a5d2cf423ccbf4dfc06fefef17a077aa73b1fd4d1d82ead8fce", - "libraries/3rdparty/win_pcap/pcap.h": "c86912e57dc4da38d36ea3ac0e85b1b42c57548be418773c627043bc69ae8181", - "libraries/3rdparty/win_pcap/pcap/bluetooth.h": "b3ef727f506c30e72ed22a8837d737d75d2858cd7427e7022ab63cfe3dd9d844", - "libraries/3rdparty/win_pcap/pcap/bpf.h": "ea7397eaeaac18a0230aa2f3fecfabf387f2d1135e80ddc6a8eaa0e9b88c5408", - "libraries/3rdparty/win_pcap/pcap/namedb.h": "94cc2e21a83e9fc7a3b159f2fa5cd6c478edcbed05fef13cd9ad08d5364217f9", - "libraries/3rdparty/win_pcap/pcap/pcap.h": "43db459d6d64e995f8a42cba0c5d5515ed5c366e7bdb5fc717f8d14df614769e", - "libraries/3rdparty/win_pcap/pcap/sll.h": "08e56e0ac5747bfe919b22463cfbbfb8355288b32b36ce112cb047df58dc795a", - "libraries/3rdparty/win_pcap/pcap/usb.h": "81c16c743d81f8302fa61ab585ec0e2e29d69844d03f65600054269d6c315246", - "libraries/3rdparty/win_pcap/pcap/vlan.h": "196de3fda8473dde90ee24a682d399245da03a5a6106accf80d97da43900fe4d", - "libraries/3rdparty/win_pcap/remote-ext.h": "9f61998150429f80e5e000b1c9cab44372dbae0546174fcae8771e2e578bb46f", - "libraries/3rdparty/win_pcap/wpcap.lib": "0becdc2d0f2f1e7be3e56cedc9f72578dbac35b347cc15bc031276d10f501b49", - "libraries/CMakeLists.txt": "3c763650e1d81fc74e4e2f0ecebaa3602f273fc7745d3c8dfc2e092afd400f60", - "libraries/abstractions/ble_hal/CMakeLists.txt": "1cb8f857cfa06ad053b2724f3e418b81d1dc71ec0647cfe4fb0b706e6fb221ed", - "libraries/abstractions/ble_hal/include/bt_hal_avsrc_profile.h": "d92214761ec8efa7ee86d7804b96f09193006f4aaba672f36476eb455ef57768", - "libraries/abstractions/ble_hal/include/bt_hal_gatt_client.h": "91cd571150e804b11320dce7c8652faac9f7c5aa0ce1f897c7c0120c5f0814b4", - "libraries/abstractions/ble_hal/include/bt_hal_gatt_server.h": "bbc5a583be1f7def664b04d64e470385fb7f4d63bdb3ffcc7e961097fd3e30b7", - "libraries/abstractions/ble_hal/include/bt_hal_gatt_types.h": "5d291bb84617fdc485871710b43edac2a64678ac6352ece3ea858d863213a9a1", - "libraries/abstractions/ble_hal/include/bt_hal_manager.h": "c2e0fa6143dc436c62393ffcbd762ed991db78e783ba9223deb02c6b86aeada2", - "libraries/abstractions/ble_hal/include/bt_hal_manager_adapter_ble.h": "5c93421fd8ea114d82a4b2248c4422efc5c06dceaa09697fc8a94b7e4edb99e4", - "libraries/abstractions/ble_hal/include/bt_hal_manager_adapter_classic.h": "107c84bd346e14271cfb9ea46e438c3ef05d78a28ba762a0e50ab1af8847b0fc", - "libraries/abstractions/ble_hal/include/bt_hal_manager_types.h": "f3640d3ef30ae41070fece9f8a07a65a5ab075f6788e42a1a5524160464167d5", - "libraries/abstractions/common_io/CMakeLists.txt": "f812c17f34c2a06a831a4aa5860f620ce96f65374584c43891bd340478e027a2", - "libraries/abstractions/common_io/include/iot_adc.h": "e20e9a668578b5e037baae0b1bfc0ed3560fe3a01e7d9f1d55985e306ef97699", - "libraries/abstractions/common_io/include/iot_battery.h": "3c12ce4bfcdceb3ee6e0c557d2d2009f0c7c6a9979a3b1cb06874e7fe45ddfe5", - "libraries/abstractions/common_io/include/iot_efuse.h": "3ff895ab5584a0c5769e5a387163e5d4f246cb1d7f217d9f67b01a4c123c7e3c", - "libraries/abstractions/common_io/include/iot_flash.h": "f12759d25adb0a0c1c9bd153386a500551596963c926b5e3614298f976d68429", - "libraries/abstractions/common_io/include/iot_gpio.h": "4c62f0c51782b25698e278cb8fcb4fd6080ce0fe9e7351a36b67f6af2e52cfa8", - "libraries/abstractions/common_io/include/iot_hw.h": "3dbc998b76915ed158da5b56a9f1c4605f7f1955b77c41bcfcd05795e6535f60", - "libraries/abstractions/common_io/include/iot_i2c.h": "2fb1e3d1a192585a6f1b9552355cad3c0f6285e352f1ab2fd38c8a16dde23f06", - "libraries/abstractions/common_io/include/iot_i2s.h": "844e15268abe057130215c499f5d55510106bf2fc0fa9b869c84a9398a3cafd2", - "libraries/abstractions/common_io/include/iot_perfcounter.h": "bc54b82f9d1ded264f2663350a5ecb0d742b01fe3d2662a3a8f208e4994c6615", - "libraries/abstractions/common_io/include/iot_power.h": "6cf68180c451dcf72c522fe3941dbbf3c10bec1add9ece93f6e4acbe744f7a21", - "libraries/abstractions/common_io/include/iot_pwm.h": "e9ac4e6b87f9c42c0d55650fd2500f9db73157cacccf709f4ed286657b8d09bb", - "libraries/abstractions/common_io/include/iot_reset.h": "d2ac9bf76af48dd126f3a29cf644adc7e7601a45c77bbe6dc32d1cf54150c75c", - "libraries/abstractions/common_io/include/iot_rtc.h": "145b95d00cff7addbfb7ba44ee33884b20a94a950ae3b3d9908d5f8196762d28", - "libraries/abstractions/common_io/include/iot_sdio.h": "70b4fbf0bd694cb12563915f0582670ff2f98cb4ac39416280afde9ad0911363", - "libraries/abstractions/common_io/include/iot_spi.h": "1179daa5561523f5ea42a04b47b94724980f3d06e7273b299bf5f8eeeb2ed928", - "libraries/abstractions/common_io/include/iot_timer.h": "ad9b65fedb72dcc9e6ce164b65d527f3fe0ccf894076e128a7ad292afe5be1b0", - "libraries/abstractions/common_io/include/iot_tsensor.h": "33b02f744d454d0c52686c628090f9742d77e7a1682fb7ee149c395c73e4ef2b", - "libraries/abstractions/common_io/include/iot_uart.h": "76c93f7e5978d40cb335db05e1dd04c764fbdbb369a9084ec951707352e8beef", - "libraries/abstractions/common_io/include/iot_usb_device.h": "2f48d26588eb56f98e2565bd8e54042d9522d13015139ccb2c950e0579c6a4ca", - "libraries/abstractions/common_io/include/iot_usb_host.h": "39a28b38fbb9b02ab2659cf14428cf010425b258254d6334ee1e63fad3f7e80b", - "libraries/abstractions/common_io/include/iot_watchdog.h": "b5e8b77ffa2d0f845408d18d30b2f176458b286b207737475d1bafa4bc34d1d9", - "libraries/abstractions/common_io/test/iot_test_common_io.c": "da3e4a3279da4007b25975ada566d97a3e4d83ef70db30b96db5ec8e4c9947e7", - "libraries/abstractions/common_io/test/iot_test_common_io_internal.h": "840700ef7122cf14f2532a398c3e4fd0a5cdd841318b62ea77c518b90330b1fe", - "libraries/abstractions/common_io/test/test_iot_adc.c": "eb0f7fe7b2dca830c08a4c5a6e11508873c704480acd385c66ee1a3f9d4d1b17", - "libraries/abstractions/common_io/test/test_iot_battery.c": "8879c4f625519ccd332286629396b1d8041d7b37c92a519658baa4fef6078c82", - "libraries/abstractions/common_io/test/test_iot_efuse.c": "fa6efc8735490396efe8abaf08817eadb783eaccce075811022ff0098ee8e6ce", - "libraries/abstractions/common_io/test/test_iot_flash.c": "83831bc678d08218e0b8a67b9c12a1acd7b2a962369a08de6a4e0ac78a6c3f39", - "libraries/abstractions/common_io/test/test_iot_gpio.c": "9d099a07da544c83d0dafe88d774cb7b9d0cd9ec16fc3110a01352fa691d3f79", - "libraries/abstractions/common_io/test/test_iot_i2c.c": "2345c067219cdf0f131d040ebef2c258933b743d4d181a2520e8da84128b8967", - "libraries/abstractions/common_io/test/test_iot_i2s.c": "22582a2f9d737fbc9b2d2c460af59ff7cb35b90114616119bdffbed50db99f41", - "libraries/abstractions/common_io/test/test_iot_perfcounter.c": "ef6b558138dfc5cf18b4b13192a15d36958cfea5fccfa836f0740ace58872ef1", - "libraries/abstractions/common_io/test/test_iot_power.c": "fd83859873747d6ff00ef05dfeb4ddb8863f5faa75a009e708c1475a8f4dc8a2", - "libraries/abstractions/common_io/test/test_iot_pwm.c": "fda4dae6586b4b61c1bec78ec5a36791f8b615d679f5ecd050f70abd271f84b2", - "libraries/abstractions/common_io/test/test_iot_reset.c": "bf33cb8b0af7eae1bdef79fb288f1062729b5fc70008172131909af85e3004df", - "libraries/abstractions/common_io/test/test_iot_rtc.c": "bc8918e3205637743faf100e44ec5de2cb72a9f1cf9ac0a3c2af526df457e618", - "libraries/abstractions/common_io/test/test_iot_sdio.c": "99b82d7d7271cf8b1cd51f3454406ab7d00db9faa850ee6082e429ff2b49b755", - "libraries/abstractions/common_io/test/test_iot_spi.c": "02e266d7eca769db5d33e43a6e3fad8e63da0c674de6ea1efc8c2e2636180c7b", - "libraries/abstractions/common_io/test/test_iot_timer.c": "9b35827fb43dd5eec488f4c825ef79f5ab2bb835f6985a6a89b8009540a1aa8f", - "libraries/abstractions/common_io/test/test_iot_tsensor.c": "0dfe023f2f456c922d016d0bfd307cd70d9bd89223e000a9d262cbf8dd8a4656", - "libraries/abstractions/common_io/test/test_iot_uart.c": "fab329bf1a05044af198f69387ba823dfae328d862df69ef001fa4918a2c2bec", - "libraries/abstractions/common_io/test/test_iot_watchdog.c": "93126dc28252854b0c63782e7adfd5f2f192d998d8dfb080fb181b0ab2589089", - "libraries/abstractions/common_io/test/test_scripts/adc/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "libraries/abstractions/common_io/test/test_scripts/adc/test_iot_adc_rp3.py": "1427e623936ad97cef2ab2821a274c13065bd88fdddfdea75200926949252167", - "libraries/abstractions/common_io/test/test_scripts/adc/test_iot_adc_test.py": "2887a7ca6321a91bb00c503fcf0f60eccbdb73b3b9a9dfc82117a523b51cf04b", - "libraries/abstractions/common_io/test/test_scripts/adc/test_iot_runonPI_adc.sh": "86f371f2115d6b359d27c656e22ddc8b308476bf9151ccd23579281c58bcb02d", - "libraries/abstractions/common_io/test/test_scripts/gpio/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "libraries/abstractions/common_io/test/test_scripts/gpio/test_iot_gpio_rp3.py": "5072e819e935d56327155b8b3d32149b52de9d9f12427b6c67aae10f7423f720", - "libraries/abstractions/common_io/test/test_scripts/gpio/test_iot_gpio_test.py": "217d919ab1dcbbc99e5b7cae01569e8219ae79d7bd6edf0764ace38d24b9fa55", - "libraries/abstractions/common_io/test/test_scripts/gpio/test_iot_runonPI_gpio.sh": "9f0d1c9fd4c346c88dde88dd692b7a0e88d5da7665bd364c5180e97162c246f8", - "libraries/abstractions/common_io/test/test_scripts/i2c_master/test_iot_i2c_master_rp3.py": "821c577e2a78ab550310fb4727eec32e619899c7b44a4d3552ab6daff60affe0", - "libraries/abstractions/common_io/test/test_scripts/i2c_master/test_iot_i2c_master_test.py": "d4697e5bc20dab76ad494f4fe36b2fa3f495482beeb7e6eafa82f4e6ddab88b1", - "libraries/abstractions/common_io/test/test_scripts/i2c_master/test_iot_runonPI_i2c_master.sh": "baff23f31e85de8a31567f93da2299ea61e6be6c560b7e2d803b0fe844cd525d", - "libraries/abstractions/common_io/test/test_scripts/pwm/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "libraries/abstractions/common_io/test/test_scripts/pwm/test_iot_pwm_rp3.py": "3cb24d95cdb454b176eb0c6e1a61cf07b95859fdb9f14c4b717244385f1749be", - "libraries/abstractions/common_io/test/test_scripts/pwm/test_iot_pwm_test.py": "c95d993bf8ff7e1425224e955f45eb5c2bfe421cd25966d75f2916a9c481be39", - "libraries/abstractions/common_io/test/test_scripts/pwm/test_iot_runonPI_pwm.sh": "a221cd3c37bdec83070fc5b835191dc0405c631770fbf0d5f228082900e586c6", - "libraries/abstractions/common_io/test/test_scripts/spi_master/test_iot_spi_master_pyb.sh": "990cb65c257fc3fbb97c05286fbf3282214deb056429ed6a23f078da2e44eb22", - "libraries/abstractions/common_io/test/test_scripts/spi_master/test_iot_spi_master_test.py": "b6bb2834b8ec4b5c5be59165458567b5447416261cee321215d98311eb4f1eaf", - "libraries/abstractions/common_io/test/test_scripts/test_iot_assisted_tests.py": "695ad3b1c4aaed689e16b65b03fc686ed4b6f168a93ff5e92f26b9fa8bd35848", - "libraries/abstractions/common_io/test/test_scripts/test_iot_test_template.py": "248f70a233930fbf348fc1a7a55a3f7825e67626a265a2e2d6d4c72181601789", - "libraries/abstractions/common_io/test/test_scripts/tsensor/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "libraries/abstractions/common_io/test/test_scripts/tsensor/test_iot_runonPI_tsensor.sh": "f2bd7476ac5785b29f58de13cfbe7f7a2c1ebf8d7bb0f1bff32e36b6c7dae795", - "libraries/abstractions/common_io/test/test_scripts/tsensor/test_iot_tsensor_rp3.py": "6c44faedb3a712570e7821639587ea9ba52a1ca98dbd51b3866a74569b26c9d5", - "libraries/abstractions/common_io/test/test_scripts/tsensor/test_iot_tsensor_test.py": "e940aa613b1f7ecbe3b71bf863f09bb6b25ba64da406108ca076d9933093a34f", - "libraries/abstractions/common_io/test/test_scripts/uart/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "libraries/abstractions/common_io/test/test_scripts/uart/test_iot_runonPI_uart.sh": "304be0c6c2904d9651d32a442eae21c8a440d90426c7b576fdb70a1e80cec0cd", - "libraries/abstractions/common_io/test/test_scripts/uart/test_iot_uart_rp3.py": "e2a51ada857214ea674da0d5be0808338b00131d03e5d22cc4012f1cdb7e8977", - "libraries/abstractions/common_io/test/test_scripts/uart/test_iot_uart_test.py": "5fa064fe610758e5c460708d9c9e379467637ecaff3eb3c483583e80be961258", - "libraries/abstractions/common_io/test/test_scripts/usb_device/test_iot_usb_device_test.py": "9056bec1ba45998aec3cf8e3ba7c86faebdd39841b7b8817ae616d8ec07f37cb", - "libraries/abstractions/pkcs11/CMakeLists.txt": "f801d0746a68ef39ba421b30067a1d5b0b3eeab92c894ba3745e60ac70e392eb", - "libraries/abstractions/pkcs11/ReadMe.md": "e93cec785840baceb712e9717b1e61b5d16b11e4ef896bdd4248fd550f4f2e7e", - "libraries/abstractions/pkcs11/corePKCS11/3rdparty/mbedtls_utils/mbedtls_error.c": "d6743b465d3bcd0445ac01d35599929db86fa26e12e6e423a746de67e930d0de", - "libraries/abstractions/pkcs11/corePKCS11/3rdparty/mbedtls_utils/mbedtls_error.h": "e4ca81332108f92360fd02e95f6af2b79f95d00b7a07d4f8dfadb3416e9b8f65", - "libraries/abstractions/pkcs11/corePKCS11/3rdparty/mbedtls_utils/mbedtls_utils.c": "9a7734e796aceaac8f6448b9b0ae7effc97d0fe4b508f7587c93e7620eefcd3d", - "libraries/abstractions/pkcs11/corePKCS11/CHANGELOG.md": "7957799a46e10e6266bfdbe152c56b7b906903f25264eab454524b10eec32ff9", - "libraries/abstractions/pkcs11/corePKCS11/CODE_OF_CONDUCT.md": "34b6c98d5c23127ae6769e95e483e5bf6d3704ae1f0d3ae4e69d15f4ede118b6", - "libraries/abstractions/pkcs11/corePKCS11/CONTRIBUTING.md": "b050a75d5f6d2236ed40ad91dc53c4a4b30da184f9298f6f18507beae5fd7cb7", - "libraries/abstractions/pkcs11/corePKCS11/LICENSE": "508a77d2e7b51d98adeed32648ad124b7b30241a8e70b2e72c99f92d8e5874d1", - "libraries/abstractions/pkcs11/corePKCS11/MISRA.md": "f996475ac02f238cb52eca1d0708d220e2a12a35ceacda8ef2806d2cad087de0", - "libraries/abstractions/pkcs11/corePKCS11/README.md": "7ed25a4c5d5766fd09d31a366dfb71bcbe055f2442fa5cfb5632c0ca99067801", - "libraries/abstractions/pkcs11/corePKCS11/docs/doxygen/config.doxyfile": "ea3142f9ddec5f7500a0588c4953e4c665fea690ad509495392d3bd0aa110d46", - "libraries/abstractions/pkcs11/corePKCS11/docs/doxygen/layout.xml": "555a70789f54c525456ad9d30730614fe7119afb8b81dd8f8067af28dd14f66c", - "libraries/abstractions/pkcs11/corePKCS11/docs/doxygen/pages.doxy": "1bbe7f892def707a0fb97d301fd388291233b033fbf54370d63f508eb012c492", - "libraries/abstractions/pkcs11/corePKCS11/docs/doxygen/style.css": "e3d3b4438744aa4d547bcacc6e64f3fcfc5057b476c5237e5107e6bbe0aac72a", - "libraries/abstractions/pkcs11/corePKCS11/docs/images/pkcs11_digest.png": "92b850c3d210841e17fd95c3e9c8f7049ce7379ea0a5f63482a02577e4e6dfa6", - "libraries/abstractions/pkcs11/corePKCS11/docs/images/pkcs11_object_generate.png": "de93f2d18ceccb8cad11e8d6ac0b0a724401ef9900d7c6213321f4d2f04b4a06", - "libraries/abstractions/pkcs11/corePKCS11/docs/images/pkcs11_object_import.png": "ffa297b8cffee9d7e5acd6a1c94449886ede948c1c4291add518d29480e58b97", - "libraries/abstractions/pkcs11/corePKCS11/docs/images/pkcs11_rng.png": "6af00134c0f91c2c5112f8b9517e4c1f705b8f27fd835faf614b7d44914ef6f6", - "libraries/abstractions/pkcs11/corePKCS11/docs/images/pkcs11_sign_verify.png": "8003449a654fe1d051ca1ff289c1dd88009ce1c704962177957238d1557603de", - "libraries/abstractions/pkcs11/corePKCS11/docs/plantuml/pkcs11_digest.pu": "5ee805f82c68f09e901c9dd0b944c5e3ab840ec91df2500bc7f6d85e3305e844", - "libraries/abstractions/pkcs11/corePKCS11/docs/plantuml/pkcs11_object_generate.pu": "f03e0963477c8a37af7333513b72b0f0d83a9a49f724a956049794baea5d4f13", - "libraries/abstractions/pkcs11/corePKCS11/docs/plantuml/pkcs11_object_import.pu": "25e535911e40351e16c58745fca0b714c629ddc74e959d7c85ba8b14fb94a2f5", - "libraries/abstractions/pkcs11/corePKCS11/docs/plantuml/pkcs11_rng.pu": "2d32aeefba3adf3f5e992d8ffdc414b01f7d7dd8f3b5419a604f1194f56eec3f", - "libraries/abstractions/pkcs11/corePKCS11/docs/plantuml/pkcs11_sign_verify.pu": "24024c8acc15496eb28b56306a4688bf0d2ff509a352d70961438c31d2988b81", - "libraries/abstractions/pkcs11/corePKCS11/lexicon.txt": "1daddf92d2673aff5be9723d594eec392a87f55eadc3eba1669f46c71e37394f", - "libraries/abstractions/pkcs11/corePKCS11/manifest.yml": "fdc5bd5d73679b01733cf87da37eebd19b2d4356044033f1e670a3fcc718fdb0", - "libraries/abstractions/pkcs11/corePKCS11/pkcsFilePaths.cmake": "c4c788196d29bf84eee316ef787d024df42766a3b539cafb66d88241b713cde6", - "libraries/abstractions/pkcs11/corePKCS11/source/core_pkcs11.c": "054332414af165b56deb39e0efa9f2944d1778917e46bdd4f2819b7a96f6befb", - "libraries/abstractions/pkcs11/corePKCS11/source/core_pki_utils.c": "0869deb94f99e38247ac997a4a9f46679a2768adbc242c4faf44215473bdc913", - "libraries/abstractions/pkcs11/corePKCS11/source/include/core_pkcs11.h": "a316c64222721ec876a3c44b1404d1f4720ebf7af7bde8d4444ccbd326cca932", - "libraries/abstractions/pkcs11/corePKCS11/source/include/core_pkcs11_pal.h": "b56aff8cf6ee881fe9814c168268487932cbbd14c565f483603f44e5fa07dc34", - "libraries/abstractions/pkcs11/corePKCS11/source/include/core_pki_utils.h": "84aa3211591993ecb5176874ae184258bbe8a6bbe493691b3e4fb032bd5aad8d", - "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/CMakeLists.txt": "8a2b3e6b99a50366f9ca7d3e25f4a0ef94fe0ba85d0ce4a6f13f39bb429e3a09", - "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/cmock_build.cmake": "9dc11afd4003291373290c70c37da6f0e19f5f3ac56fdac9443c50abeeb42ed4", - "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/config/aws_mbedtls_config.h": "6f8482bf11b08377434547dc13aa2e4d1cbac539f667416d7f995057ea9f70bc", - "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/config/core_pkcs11_config.h": "93dd3beaf68e34f5be9c2783ae6f4f3ade04101889ff4abece86a1bfec075902", - "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/config/logging_levels.h": "810b8c4754dffa9677db0313abbd9eac6cd14b67ade45e1441e0aeb91085c31f", - "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/config/logging_stack.h": "2d81f65fd7e27f0b9dc34c7544f8a68e32e9935053a10ee7ec8fdbfcadacda6f", - "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/config/mock_osal.h": "db4ae8bed56ed8f3d6646859326905c7d55651dc8d3cde04dab58b3a14675cb2", - "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/config/threading_alt.h": "363ca48b5e23f61ccee72506dc46e76577f5f458456368684869864c92b331f4", - "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/core_pkcs11_mbedtls_utest.c": "86ab71cf8a3d3eba98ab955999df90756b82a579cc815bbc7047562e021ee20b", - "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/core_pkcs11_utest.c": "2376065bb4e7b1afdd799db842786e2d7f3e22f72e4696e39dafa7393161d9b3", - "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/core_pki_utils_utest.c": "fd0bc2a1e0d8f8213df964b3df819e4ff56c5d5531bf8869943b173a99a33a51", - "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/unit_test_build.cmake": "39f00d0e35a597284f2fe65e2450a37041e966fe5ea40107f1a8c872cb6c28c9", - "libraries/abstractions/pkcs11/corePKCS11/tools/cmock/coverage.cmake": "8ac1ac5e6d5628fc8625d57f74249f15f53eba61f8338813d36d3dfa9dc1cf9b", - "libraries/abstractions/pkcs11/corePKCS11/tools/cmock/create_test.cmake": "9b1832fc7a89a99b191f304fdb65d3e3a84ac1aa89cc5b7fc71abe4ec8d72c6a", - "libraries/abstractions/pkcs11/corePKCS11/tools/cmock/pkcs_mbedtls/project.yml": "6940aa5db415867d18ab27fbaad67136bba87a728af16d3e4a317df29362c351", - "libraries/abstractions/pkcs11/corePKCS11/tools/cmock/pkcs_wrapper/project.yml": "bd664576c8428fd2982b8b8d3bab25511398b38a33f13d51f756ee32fe2c0fba", - "libraries/abstractions/pkcs11/corePKCS11/tools/coverity/misra.config": "6088b758faa011ce7db6ed34d0e48c5e98fdd4ff322adff0caee3fcc5a32e689", - "libraries/abstractions/pkcs11/corePKCS11/tools/spell/README.md": "d4fd9c81461a1a063115ec7c0e01aaeeec8d85896a5899d5357aefcb0786a290", - "libraries/abstractions/pkcs11/corePKCS11/tools/spell/ablexicon": "8331e75031fca289b35dff96a11598ce61b39714b6075953768dce9902955bd1", - "libraries/abstractions/pkcs11/corePKCS11/tools/spell/extract-comments": "34bcc69d8a2d3bba61aa433ac7cc40c9c7a3e78ae3aa7ddf930d4e38debe96dc", - "libraries/abstractions/pkcs11/corePKCS11/tools/spell/find-unknown-comment-words": "b5ec8e2fdfda0e4b1c67d716fc6665be77bd4d4a5cace1d21da9c8932c3e89de", - "libraries/abstractions/pkcs11/corePKCS11/tools/uncrustify.cfg": "55c02144fdaa3d62e03ed97e3e89a54b67d9433a5320ec02ec82e75344b21656", - "libraries/abstractions/pkcs11/ecc608a/atca_cert_chain.c": "8a2fc091ca28cdd2664ab70b95b63a803c21092950a4b2bc779e851d0ab16b26", - "libraries/abstractions/pkcs11/ecc608a/atca_cert_chain.h": "7f131af6adb3203be4b966e85d3e0fd276dd4d061723813e67758135bc4ff6ba", - "libraries/abstractions/pkcs11/ecc608a/core_pkcs11_secure_element.c": "23c3e921cb5e8dd083a8e8d04db2fec47995cb7de394197e3bc0178782b3f1b2", - "libraries/abstractions/pkcs11/psa/License.md": "79147b607b79da7884e49f492f0623ad85f7ad30a991f15fb0ab5022e8d5ae44", - "libraries/abstractions/pkcs11/psa/ReadMe.md": "a32d945bfcf103f4e18042a62be40e91114c9cf0a4edbc49464d6e647a083b41", - "libraries/abstractions/pkcs11/psa/iot_pkcs11_psa.c": "e0793cfccc98473f11e61c9166a3c86c22f16533994a5a98b72d5dea3089bdbe", - "libraries/abstractions/pkcs11/psa/iot_pkcs11_psa_input_format.c": "f45ed6ee4912fc36f09ff05deae11feb85561d6bd72b68e3872f05c5588f4c9c", - "libraries/abstractions/pkcs11/psa/iot_pkcs11_psa_input_format.h": "0c4114b6f1934ae33d27f0a09cef894b8891d73c1c2e327e989b493402c2d515", - "libraries/abstractions/pkcs11/psa/iot_pkcs11_psa_object_management.c": "d8b82c6891df0338d7df67f75b2c1ac6a931e3c5411cd85375755d0487f8f95e", - "libraries/abstractions/pkcs11/psa/iot_pkcs11_psa_object_management.h": "1fdc7288cd54755297752fe584d6a3966a7330583c74acda24691cf374703ab1", - "libraries/abstractions/platform/CMakeLists.txt": "20e44ccb13df778f3f938bb19cb876f1cde3a3b7a5d13ae74a2b536cf54798e6", - "libraries/abstractions/platform/freertos/include/platform/iot_network_ble.h": "3a53d18dc0980b0c70baac980653e2246fc6b47e8c7ebf49bea8f5615015205a", - "libraries/abstractions/platform/freertos/include/platform/iot_network_freertos.h": "6ba06cea2088481bbb5a1f63cd35ba61474d81c61a00cca317750a9d7d3541ce", - "libraries/abstractions/platform/freertos/include/platform/iot_platform_types_freertos.h": "3f1fa78bb0b9a275ef4e83df844d4ffc936a36fd67a8e0e6499fe504e93efe41", - "libraries/abstractions/platform/freertos/iot_clock_freertos.c": "978264f245a2ac646ba11ea18a9152208d51ce554dc4d26fb672a0350cf13f62", - "libraries/abstractions/platform/freertos/iot_metrics.c": "70616385eb4c5eea47a718ea0e95cd7f3dbf4b8f243eba60d9d7a2a0f832874c", - "libraries/abstractions/platform/freertos/iot_network_freertos.c": "704c96b6c1c872d7fabaead8ab39995423bada0de8f7636d1a53db6f59aad9ba", - "libraries/abstractions/platform/freertos/iot_threads_freertos.c": "1af294d45841473f9d47245fd1da299171e26118d0fcae8061dbd23ef7055686", - "libraries/abstractions/platform/include/platform/iot_clock.h": "defa2f5319cfaa15321dd7d950f6001b3e48dee14f2797f98c0bf2edbd49afb0", - "libraries/abstractions/platform/include/platform/iot_metrics.h": "4c7213608554b22554f15eb93bd4b76ce76b2169c3719b07687bc3657f99be63", - "libraries/abstractions/platform/include/platform/iot_network.h": "fb4066ad503762e14439fa9bc88ef82fd67efdf165954eeb7240bc12b3f22c84", - "libraries/abstractions/platform/include/platform/iot_threads.h": "a7a70bf277aeea5e8a480008c06331ffc628717b7bddd017351a41ce39c624c7", - "libraries/abstractions/platform/include/types/iot_platform_types.h": "587bae7e9b6ea955877ebd6ba16dec411f452c10d70f8375280d91d0c521cd5b", - "libraries/abstractions/posix/CMakeLists.txt": "de791cb48fb673efa912fdff73e6a3baa8c0b6b8b04e3bb6bc0db4d48bdf92ec", - "libraries/abstractions/posix/include/FreeRTOS_POSIX/errno.h": "63e28e6669ee2923d2ef6ce8e34630e0d4684805d06392918e18c8c382cc0af2", - "libraries/abstractions/posix/include/FreeRTOS_POSIX/fcntl.h": "c8a72b1167bb503a618003740d9302f9c09d824e88e13a846f1e4d088f70369c", - "libraries/abstractions/posix/include/FreeRTOS_POSIX/mqueue.h": "dc4487732956540662472ebbbdbcb8b484b96c96b520b5e2dc4577a990fd77ab", - "libraries/abstractions/posix/include/FreeRTOS_POSIX/pthread.h": "8ed558699b8333699e133ad8e45683f57aed27930647f963bbce9f75fbebd752", - "libraries/abstractions/posix/include/FreeRTOS_POSIX/sched.h": "a5934933798dd885a42a56086a3392a6d2308f7da050c43d7ead74ed9bd6cc68", - "libraries/abstractions/posix/include/FreeRTOS_POSIX/semaphore.h": "5083acc6f8e4b0665fd2e3dd859695e1275e18d28c31d38fb928653cbc9b0e4a", - "libraries/abstractions/posix/include/FreeRTOS_POSIX/signal.h": "741a1a9c91be63b63ce47067603de2800513270634349b1d2bf04b11f306c42c", - "libraries/abstractions/posix/include/FreeRTOS_POSIX/sys/types.h": "8bf35f1c28ad99dbb69188857a993fba0bd525d5331dcc888267be97a6970a88", - "libraries/abstractions/posix/include/FreeRTOS_POSIX/time.h": "3701373dbc98635ccfc0088cf1d458cea5cd1b66cbfa83ed7b71cd6e0810cbca", - "libraries/abstractions/posix/include/FreeRTOS_POSIX/unistd.h": "910f4d265a487dca969d708f60d1b822030feb31eff8f1f96fd234b299390099", - "libraries/abstractions/posix/include/FreeRTOS_POSIX/utils.h": "237cbdd8c5edeea07b02d60dcda4300f956aec170b8654c4878c2e3e849fec78", - "libraries/abstractions/retry_utils/CMakeLists.txt": "01073da9f8c1d000cb903864889e97ae3307697853943f0615d81d9c09b076dd", - "libraries/abstractions/retry_utils/freertos/retry_utils_freertos.c": "d8c30cbade9314109bdbaf1a6562ad4562cd225f66dfcd859f214ac14b9948c9", - "libraries/abstractions/retry_utils/retry_utils.h": "74af51a758846d263f613b7be921f7b65ac29f734eb55cc7ae687a9115aaee42", - "libraries/abstractions/secure_sockets/CMakeLists.txt": "c63a1272f25d85aece46ffe8244b9defef75ea48c8e5c16c6f0b22a783616e41", - "libraries/abstractions/secure_sockets/freertos_plus_tcp/iot_secure_sockets.c": "1056ea6d041a4874647d14539be9436f4d22568a9c221ca1d18932613ba3153a", - "libraries/abstractions/secure_sockets/include/iot_secure_sockets.h": "166e49a70c3f7e5f17950753fbeb1f4a20a08dbe2052a2796e4c5b3b838e6325", - "libraries/abstractions/secure_sockets/include/iot_secure_sockets_config_defaults.h": "01fc8396c938a471b6fe004d7606e5b8be7d242e3930b6650ae4c5a656fcbc84", - "libraries/abstractions/secure_sockets/include/iot_secure_sockets_wrapper_metrics.h": "bf52d247e676e330730561a7563226de37c92dbc1cb0e427e507e9cccb97e743", - "libraries/abstractions/secure_sockets/lwip/iot_secure_sockets.c": "168baf5419310d2561dcd84b89d98dd82431a62bc5de47b0128b49cbcee48ba8", - "libraries/abstractions/secure_sockets/utest/CMakeLists.txt": "fcf1096bfbf730be2081055b8fec3ad799e1862a46ddbd91587b2c6882255f1b", - "libraries/abstractions/secure_sockets/utest/include/lwipopts.h": "3d60a1130ba4f01bbae96b39b459d7c307325066ecf76b6a4d32b8a78b337018", - "libraries/abstractions/secure_sockets/utest/include/mocked-types.h": "8bf43e1f5161d5d7e743f238ffd96bc2107c71a39280f7731c4ead071d3eead1", - "libraries/abstractions/secure_sockets/utest/project.yml": "384bbbe2c3494178d374752ba3669e1913e5e0db48d5815fd41d45574091ef53", - "libraries/abstractions/secure_sockets/utest/secure_sockets_utest.c": "b3632fcf82a6def6a9bbedff47f7058b6002e7e19e8e2af75deedcf2bc532c8c", - "libraries/abstractions/transport/secure_sockets/transport_secure_sockets.c": "716fbd39e7b86cacaf618ce185535c0a5b66884ee0245d9515ecb42dbb5c142c", - "libraries/abstractions/transport/secure_sockets/transport_secure_sockets.h": "0be0e5d14fe39f6faee76313bbc5673e7a32b23afe17efacf4d380c97683394a", - "libraries/abstractions/transport/transport_interface.cmake": "4df5d353d77c20cfadf6c6c0ebd3bd40a9f9051fbf3aa9490a443aa49e2d20d5", - "libraries/abstractions/transport/transport_interface_secure_sockets.cmake": "d717d8cc736cd536569df63416f01f22c342daffafcc6dfd6c8e96cb7b626232", - "libraries/abstractions/transport/utest/CMakeLists.txt": "5c81c12612af44d53c5a902e2214ab4d52a2769d6beb340dc4ca18c1e57bc185", - "libraries/abstractions/transport/utest/project.yml": "a27ed6ecc7dc19dc73a38b7e938048f4fd17f0e46b362cdb585887504f2a8d16", - "libraries/abstractions/transport/utest/transport_secure_sockets_utest.c": "db86ac12bbc2b0a8048d7658cb5184fe766120fa7b95f7a96e8a5be0f381613a", - "libraries/abstractions/wifi/CMakeLists.txt": "8e74e2f750f62bee0e7386b1c94adb07322fc1ae7dbeaef7d9efb54a0d2efb70", - "libraries/abstractions/wifi/include/iot_wifi.h": "0b025389f33184fe47a2e73dd2f756152de927e41fc5e9bca2ff32275b9e1df9", - "libraries/c_sdk/aws/defender/CMakeLists.txt": "de4952a1be909854af3d47476764f5e6675fed9c7e2fc4abad0fd43eb0ee2726", - "libraries/c_sdk/aws/defender/include/aws_defender.h": "e5988117eabcef3002cdf42eb6410a218c7166ed91bed38121af7a817281e45e", - "libraries/c_sdk/aws/defender/include/aws_iot_defender.h": "206eeb76da21496c898aaefbf949c1e6f35fae7acdee5fcd6c6aa33b4fd878e7", - "libraries/c_sdk/aws/defender/src/aws_iot_defender_api.c": "483243a5b084c2db43028a9c79591ecc5634b9814567dbaa92e8069149a44098", - "libraries/c_sdk/aws/defender/src/aws_iot_defender_collector.c": "cb34c7136e3df523f23bc7e1c0cb54e8a22261c668afd26bb9f437f550b78f7d", - "libraries/c_sdk/aws/defender/src/aws_iot_defender_mqtt.c": "622d99ffe2b1d60eb6a12c3d1034c7e85ac53eb2b812ddcfa10df3ab156f6c53", - "libraries/c_sdk/aws/defender/src/aws_iot_defender_v1.c": "acbcca7d333fc49fb8ae8175b872083163f90f8cf7bd4d88ddd341384309af08", - "libraries/c_sdk/aws/defender/src/private/aws_iot_defender_internal.h": "a75d493354f51380eb12069739e0ccb5ccd24776291a5f52025e25bfb67ec27b", - "libraries/c_sdk/aws/defender/test/system/aws_iot_tests_defender_system.c": "54a21bb5f5e11bcc5b88d085f9f69e8f03d6f68912de8d82e65946231d935c3f", - "libraries/c_sdk/aws/defender/test/unit/aws_iot_tests_defender_unit.c": "f936ff72b4dae4222016da5d41f261252b125ffb38ef762d19234a92b65177c3", - "libraries/c_sdk/aws/shadow/CMakeLists.txt": "cc67e96a38a0417c67bfb7a6e000a56c37c84c26dfe426549ca7cf19e59b6bb4", - "libraries/c_sdk/aws/shadow/include/aws_iot_shadow.h": "108a5d14e73a7fd3a10eb8f6e7ba1b235defcbf58887209a5b4af2a3c460fa4f", - "libraries/c_sdk/aws/shadow/include/aws_shadow.h": "9c0ca2358c7f9e38b40ecea0aec469a26c1a0fa049ebf3d012f01c4ab291eded", - "libraries/c_sdk/aws/shadow/include/types/aws_iot_shadow_types.h": "278ff857e76963a72b229f486a9df0fa55930373312c153dd4165fddc075d39f", - "libraries/c_sdk/aws/shadow/src/aws_iot_shadow_api.c": "db16e46664aaf4ccbba826972624aa542392e2cd01992c11697a8c1b6573fdc2", - "libraries/c_sdk/aws/shadow/src/aws_iot_shadow_operation.c": "8c426b8915dd1f52044d2f7700f6427e6e916e83d0b4a43371a6c75d1f4fec7c", - "libraries/c_sdk/aws/shadow/src/aws_iot_shadow_parser.c": "56f27be23afde3278e45a16cadad654709f9edc515953fbeeb329605450d155f", - "libraries/c_sdk/aws/shadow/src/aws_iot_shadow_static_memory.c": "4b8ef05038cc3d9d7909b610db1be4550304e6242c8fdc3cda842573da80797a", - "libraries/c_sdk/aws/shadow/src/aws_iot_shadow_subscription.c": "2469963ec2a797fc4701a7e263176e84c74d50e8abb33ce02f8e18b83534c261", - "libraries/c_sdk/aws/shadow/src/aws_shadow.c": "ef64825842a1e3e23d0b9067316c6f7d4cfe8818b26cc535467cd5a78c9eb98f", - "libraries/c_sdk/aws/shadow/src/aws_shadow_config_defaults.h": "7fb46ab0e7d7bf9fae1a65f4dae6900ae9c3d3bbe0747ccd05f76931b70bb669", - "libraries/c_sdk/aws/shadow/src/private/aws_iot_shadow_internal.h": "dfa638605fa05eae3b00236cb71401b05a23008ba241810a1033219c56bbed7b", - "libraries/c_sdk/aws/shadow/test/aws_test_shadow.c": "d14e0e53cc54f4385f3b0f89a9a64f2b93885721bd1ba1ebd3076f39b67aebab", - "libraries/c_sdk/aws/shadow/test/system/aws_iot_tests_shadow_system.c": "c7cb61fe273c1a5b0b376c8546167941df711e48705241644a173106e8785cb1", - "libraries/c_sdk/aws/shadow/test/unit/aws_iot_tests_shadow_api.c": "9e0d845a524ecdb036b959f81b748db823b79ce8fabd06d040a5ff7d945b5387", - "libraries/c_sdk/aws/shadow/test/unit/aws_iot_tests_shadow_parser.c": "c6d6d717f9e5bb941319e39dc444ae3d8d5d658f2ce20b73a9ccafa499fc7d9e", - "libraries/c_sdk/standard/ble/CMakeLists.txt": "0f11f84f0ecda360b6495bd06f39776dd29a06ca59342126427bc6bcc882e734", - "libraries/c_sdk/standard/ble/include/iot_ble.h": "d5af99ca247bbd26ca89c230c0e11f1f635dc9eb912c8854e9db134468f681af", - "libraries/c_sdk/standard/ble/include/iot_ble_config_defaults.h": "b7725d70d2a4c2b8ed2515d4003aec13b2021ce2bbec7cf63078ec5e24737ad6", - "libraries/c_sdk/standard/ble/include/iot_ble_data_transfer.h": "51bbcadcfca661328116a9ebc719b1aa4ff7de2c8725b99a3f14a89084ced6c9", - "libraries/c_sdk/standard/ble/include/iot_ble_device_information.h": "490adc5631cca5a7902bea574a0dd00c30d08352185f4d09900f25a535b45c6d", - "libraries/c_sdk/standard/ble/include/iot_ble_mqtt_serialize.h": "ba93bc531e0a9edf83e06396eb6e7b5b8f402545d0caa84241445260b2592598", - "libraries/c_sdk/standard/ble/include/iot_ble_mqtt_transport.h": "604635e6ab30c923b9167b051459593ba845ccc073addf2fef6fb729f08b9d46", - "libraries/c_sdk/standard/ble/include/iot_ble_mqtt_transport_config.h": "b2cabcdd54a9fb05873aeb7dbdb30063b634bb53b75e7eb8d41d8c520b601275", - "libraries/c_sdk/standard/ble/include/iot_ble_wifi_provisioning.h": "900a018fd609063948b5f6fc2395c9ba9a6325e6c387f1ab646bde20873f5d9d", - "libraries/c_sdk/standard/ble/src/iot_ble_gap.c": "c0729d65b549034250c5a055c6709cd063367a95c2805d5929c7998ed8312b93", - "libraries/c_sdk/standard/ble/src/iot_ble_gatt.c": "9c45c461fc3f6757c807591cc4dd9a24933ae876786b7564436cff5f9a4dcd34", - "libraries/c_sdk/standard/ble/src/iot_ble_internal.h": "592901572381ab481ea8e96de24f06342ddb476aae0ce36dc882344891cbff9c", - "libraries/c_sdk/standard/ble/src/services/data_transfer/iot_ble_data_transfer.c": "9f4f5bb1942f7939eaf747c4a19bbde34a3711cf4837ba31056b91c0a66c466d", - "libraries/c_sdk/standard/ble/src/services/device_information/iot_ble_device_information.c": "4addd8491e9b72917cc2fe9f1ac6456ee41ee592b250838a55f717e62bc6e792", - "libraries/c_sdk/standard/ble/src/services/mqtt_ble/iot_ble_mqtt_serialize.c": "46278a662dab57ac35c7163d57a7a720f3777c88678a7da309b34d80e5c89e02", - "libraries/c_sdk/standard/ble/src/services/mqtt_ble/iot_ble_mqtt_transport.c": "41ff2daca4830fc46ce1f3a895dcabc8be357a80f83bcacdf436e273df6f775f", - "libraries/c_sdk/standard/ble/src/services/mqtt_ble/iot_network_ble.c": "84a8cff83ece4744b688319066cf547edd2d9859a46d754b7dfdffb7f015c54a", - "libraries/c_sdk/standard/ble/src/services/wifi_provisioning/iot_ble_wifi_provisioning.c": "5c1dce5b3c17a683901aff691509759a5256705d4777a0fdd735b9f653357590", - "libraries/c_sdk/standard/ble/utest/ble_mqtt_transport/CMakeLists.txt": "f6509158be47e3bd43869e49939abdc36fc325bfd508c26eaf8e034fa2bb13ae", - "libraries/c_sdk/standard/ble/utest/ble_mqtt_transport/iot_ble_mqtt_transport_utest.c": "7f2530809364e3723a576ca57e2e656f9263a2b530ba22ca40071ad6bfec5617", - "libraries/c_sdk/standard/ble/utest/ble_mqtt_transport/project.yml": "1a92f7ef1d78b693b3a09059a713261e9fc769fafd95814ecaa52d2aafbef7c5", - "libraries/c_sdk/standard/ble/utest/data_transfer/CMakeLists.txt": "f2a7b2993767011f69d2aaf3e82aa8434f360163119d50c91db8f4d2bcca392f", - "libraries/c_sdk/standard/ble/utest/data_transfer/iot_ble_data_transfer_utest.c": "072a0265edd9c5bf4214ee8c3bb895ef68200dddb8ffde43d893134a4ca9916a", - "libraries/c_sdk/standard/common/CMakeLists.txt": "e9c38c6e8510540bfc140333ed4c17113d8949fd49a2a9b882881999a1e6778b", - "libraries/c_sdk/standard/common/include/iot_appversion32.h": "7a772fe6be5d5f177dfa77b63c643a972c276da82817cf4ebbaba8c27312a66e", - "libraries/c_sdk/standard/common/include/iot_atomic.h": "5a974d1154b945590472b40d4e4103ef489441e7f8fa2499ac68e4c1171c7440", - "libraries/c_sdk/standard/common/include/iot_init.h": "8412b5f301aebd15bad900e48748beb406092843b99feffe97f43994a3273d97", - "libraries/c_sdk/standard/common/include/iot_linear_containers.h": "084bb3420d1d0876efa9d8ba04355032f6284038d8d90a1e7b54612270766d81", - "libraries/c_sdk/standard/common/include/iot_logging_setup.h": "d44de83fb5e0c002fae577fd2bf441fd747d548dd2a3b2e6fdf29b95db760890", - "libraries/c_sdk/standard/common/include/iot_taskpool.h": "d4e48a78b25c2d5de9b4ddca83e04eea73178cd0c4276ed72aabe27ced3d397a", - "libraries/c_sdk/standard/common/include/private/iot_default_root_certificates.h": "e144532e63d0d37975fb2a42e0ea68b5f964c4123e48169a031d646381fcc64b", - "libraries/c_sdk/standard/common/include/private/iot_doubly_linked_list.h": "890dcba20e326ad6f1cafc8aeb2504fd83cc0b66f65c129a1c403b651b3b3ae2", - "libraries/c_sdk/standard/common/include/private/iot_error.h": "e436377ac6fe9c522ba83042eff8bc0b6cdb1ace19ca5eba744080b250c5239d", - "libraries/c_sdk/standard/common/include/private/iot_lib_init.h": "e40e08941cc0652d55f281556a3febf9ce2c8a96ea6dc15c79ae4e4fd857911a", - "libraries/c_sdk/standard/common/include/private/iot_logging.h": "b10f162b2cbed3774fc509a6b7c6dad7e284b8c34896e849df085ffcb99a870b", - "libraries/c_sdk/standard/common/include/private/iot_static_memory.h": "1eec32535deede978f84fdc6e81745c495a553801a4c0dc4c5b87fda8852acc2", - "libraries/c_sdk/standard/common/include/private/iot_taskpool_internal.h": "66d2aa40f59b652d8650fc748674820fade00ddf7d2bf8d94c835bd1b6192fab", - "libraries/c_sdk/standard/common/include/types/iot_network_types.h": "c4633ad4e316fb09dfdb24a792c7d7826f76d50117034c49ed7ef4059191288f", - "libraries/c_sdk/standard/common/include/types/iot_taskpool_types.h": "964ed18ad220fd0edcffbdf5d72631d53331ad350faf377a69b39fd68dc858ad", - "libraries/c_sdk/standard/common/iot_device_metrics.c": "79bc39fc4dcb46a4a8ec924d5b46ff0bc7e36306ae25c166649ce33d3e8e7491", - "libraries/c_sdk/standard/common/iot_init.c": "54d9433be558894d8c00e280a8adede90bca510f0fedd70e7f9061d7245d5375", - "libraries/c_sdk/standard/common/iot_static_memory_common.c": "0e3d567dbc4f4f9986c8a1839e7396d7c336ed3fcb183ee5f9157d824ebfb906", - "libraries/c_sdk/standard/common/taskpool/iot_taskpool.c": "3510f2130d79f5277b89592930790d13ad3e3f6b9f7d461dba286f79dcc352a5", - "libraries/c_sdk/standard/common/taskpool/iot_taskpool_static_memory.c": "be38b5a6336584f62740ae968fc2679dc81e61b73fd9a8834808cc50c6cfc224", - "libraries/c_sdk/standard/https/CMakeLists.txt": "bd2b0a43265d77407cc60c7e1f5b2f2f27004ee8fa195dcafd89c542e87f1636", - "libraries/c_sdk/standard/https/include/iot_https_client.h": "c1b4150a013edb7757b3a8aa85e97708781b5d2441bc6796faea57efc2082658", - "libraries/c_sdk/standard/https/include/iot_https_utils.h": "1f3469febcfff3278b16afc5515c46c689d8442c738505ae14b1d0312515cd7d", - "libraries/c_sdk/standard/https/include/types/iot_https_types.h": "02eab3f1c38260cd7696be6f046015513ef0091edba16c510e0dcdaea295e7e2", - "libraries/c_sdk/standard/https/src/iot_https_client.c": "515d38726ca9742f2427957e4e8f27a383653f5e807ea6329fdef8d4d8463038", - "libraries/c_sdk/standard/https/src/iot_https_utils.c": "e71496d7d9d33b6ac7c568d9ee0dd96fe8bf57f03d2725f703f0ecca6d9023a4", - "libraries/c_sdk/standard/https/src/private/iot_https_internal.h": "7146f910480ee5a2c628bb87fb009ba46d5f942033bd831008fb20a1e027d1b0", - "libraries/c_sdk/standard/mqtt/CMakeLists.txt": "69f3d607bc4c06d40fdba5afd750b15f30217d5df6cd4969c4123126806f9495", - "libraries/c_sdk/standard/mqtt/README.md": "83eaa68bea6808447db5ded5a357f79519addba0ec43d52d6bad031a695df8f8", - "libraries/c_sdk/standard/mqtt/include/iot_mqtt.h": "3287cba2d8297c52d6b21d9bc9deed19438f622d0013caed4480647a28560fb2", - "libraries/c_sdk/standard/mqtt/include/iot_mqtt_agent.h": "552e7d3e4e54cd1090788bca077e1beaf765eb98f64b19c6278c75276eaf4e25", - "libraries/c_sdk/standard/mqtt/include/iot_mqtt_agent_config_defaults.h": "fd403ba274c904d0c2f74723470ba36bb8d87c13efa55bd18c6ff4a3e419b392", - "libraries/c_sdk/standard/mqtt/include/iot_mqtt_config_defaults.h": "c8874aa0a7f4bded9c5cecea557e1ab6f4c931a111df5cedee840e794abf9d69", - "libraries/c_sdk/standard/mqtt/include/iot_mqtt_lib.h": "9fbc2764e0ea8f53a8896b09db22d29d80066b1b671fb59e0a035ef8dbff291b", - "libraries/c_sdk/standard/mqtt/include/types/iot_mqtt_types.h": "24633a4d5b3e304c95303e2840f1435c9b285c7692c373ad3db35015ef6d984f", - "libraries/c_sdk/standard/mqtt/src/iot_mqtt_agent.c": "b425e8a9ec45a2cd6bf88a008239dc11b86e8447c203a70460551eeb9e78dbe7", - "libraries/c_sdk/standard/mqtt/src/iot_mqtt_api.c": "ff420da868f1d436f871deae1e65bfade349761cf255c77d81f519013f56ce4e", - "libraries/c_sdk/standard/mqtt/src/iot_mqtt_context_connection.c": "68d0ffdf8c6f16431dc3fafa0c1dee813e7a47a0b380a48c901447eab6eeaf72", - "libraries/c_sdk/standard/mqtt/src/iot_mqtt_managed_function_wrapper.c": "ad603702595a6c26a64ab24335d33276c866b7e2f5a0be8abd7679548b9521f9", - "libraries/c_sdk/standard/mqtt/src/iot_mqtt_mutex_wrapper.c": "d21248495ba1ae1c5afde460a0e1b2148505075d48f512fa5c4be267057bb322", - "libraries/c_sdk/standard/mqtt/src/iot_mqtt_network.c": "e99a7cb9dabe6d5d5be10d59dfb5bc05e09b12220030b92ff21772eb973b80bd", - "libraries/c_sdk/standard/mqtt/src/iot_mqtt_operation.c": "340f040e0f9c784a2e792214a471d69ad33c666406099c8b363a9443b207c737", - "libraries/c_sdk/standard/mqtt/src/iot_mqtt_publish_duplicates.c": "209e3e8ed5337dcce7ab61de1916a9682bf7e9a297b31f05c77d4e21c01f7b07", - "libraries/c_sdk/standard/mqtt/src/iot_mqtt_serializer_deserializer_wrapper.c": "a9313cee3fe3266768e85e05defcd116919eaadf24d9996b5ba470a53ee6c1c8", - "libraries/c_sdk/standard/mqtt/src/iot_mqtt_static_memory.c": "5722e931c09a19c09f3efaaa37decdad042d32d8d0062b337ce8fea001566191", - "libraries/c_sdk/standard/mqtt/src/iot_mqtt_subscription.c": "263ba6489a1fbbdf9c674c75251811baa6819e9f98ff2f5853e060e829ff4c4a", - "libraries/c_sdk/standard/mqtt/src/iot_mqtt_subscription_container.c": "39bf732e97066a4c9e2761fd4b807d7bcb9eba135f425b8ef67756d677d9c98a", - "libraries/c_sdk/standard/mqtt/src/iot_mqtt_validate.c": "dfc50e0321c44f4db18ed91056d65f5a54863879f1247245fa19e5d28b8cc35a", - "libraries/c_sdk/standard/mqtt/src/private/iot_mqtt_internal.h": "8f5f21f27646d77c2020c2312189f456e6d3743a263e417e846b1b1575b3841d", - "libraries/c_sdk/standard/serializer/CMakeLists.txt": "dde7183a219ed813b6dad00bdf0423e5cee51c543db53a9365432471da41ad9e", - "libraries/c_sdk/standard/serializer/include/iot_json_utils.h": "5bf1f710e690b9955d90e0df02db2cfabaadea4d750acda4085c25feebbabc4b", - "libraries/c_sdk/standard/serializer/include/iot_serializer.h": "d83dfd2b9cae3df2ce12e1839039d0cbb436a0864b06b0421b2ffa2e3e1ed038", - "libraries/c_sdk/standard/serializer/src/cbor/iot_serializer_tinycbor_decoder.c": "b57282296f0f67cf378fc353a6e93201f6cbc3eb9285370511e9d832a13cdc3b", - "libraries/c_sdk/standard/serializer/src/cbor/iot_serializer_tinycbor_encoder.c": "d9d45720775644c14d3b855c70e77c988bf031c73013101e652edaede696db23", - "libraries/c_sdk/standard/serializer/src/iot_json_utils.c": "31e6f42d53b68ca208463ad9d656343a951618c87053e263cab533448fabc5f6", - "libraries/c_sdk/standard/serializer/src/iot_serializer_static_memory.c": "b29ecc34006e58e985cffc405120941f447ffab98647b5c444937b6c93d0cd88", - "libraries/c_sdk/standard/serializer/src/json/iot_serializer_json_decoder.c": "bd54cf6d88268aef636c4ff52a4c52550dd772181d7967cf0ee27d1c5fd0f541", - "libraries/c_sdk/standard/serializer/src/json/iot_serializer_json_encoder.c": "45d69b8bea3fde62360a18ca10268196931dea88b8ef3ace62af066d5ba67c9c", - "libraries/coreJSON/CHANGELOG.md": "efc83f098daae4516e71a34036cb907a6d14e2fc8dd2cffad19f2b3b2926a94e", - "libraries/coreJSON/LICENSE.md": "508a77d2e7b51d98adeed32648ad124b7b30241a8e70b2e72c99f92d8e5874d1", - "libraries/coreJSON/MISRA.md": "5a014f2acd491402fb2479209fc2b752ebec45ff733089751c62e8e464633152", - "libraries/coreJSON/README.md": "e5690e8c8ca897d2a4c1f82a7176537d18aece2e1348fa4a5541249c8a66c9ef", - "libraries/coreJSON/docs/doxygen/config.doxyfile": "d7e89c5b42917f7b85b9043252e7acee1ed7166c3a3cdf641a53761b8ad89e96", - "libraries/coreJSON/docs/doxygen/layout.xml": "555a70789f54c525456ad9d30730614fe7119afb8b81dd8f8067af28dd14f66c", - "libraries/coreJSON/docs/doxygen/pages.dox": "c099e791c67d820a2bee12b728ddd9f688a684983fabdd9717a95f9c09b5cb98", - "libraries/coreJSON/docs/doxygen/style.css": "e3d3b4438744aa4d547bcacc6e64f3fcfc5057b476c5237e5107e6bbe0aac72a", - "libraries/coreJSON/jsonFilePaths.cmake": "f32f3a92f044c43d37eeb359f23efbdbd428ff643b1778c5381d1fbdc353cf1f", - "libraries/coreJSON/lexicon.txt": "581289ecf01fa8cc600f1596fbd95cc16096d513e1d9352fbdc60f53787d8dc7", - "libraries/coreJSON/manifest.yml": "587f9a37543c0c5453f21de44f1fdb407f80a7140fc81f8bfeb250ec6177b830", - "libraries/coreJSON/security.md": "92134ccc4ed81e5546dd4581be6ddbd3a3a98aafc4c06089ab1d9c1a58df80d5", - "libraries/coreJSON/source/core_json.c": "85e1ea67a8090d455bfa0bf55291a58340aa85f1181db70f0a8bb8f8c0446249", - "libraries/coreJSON/source/include/core_json.h": "0931d76f23e2d53e308b5b56f6e351bc0c1669412d04f7cd809c4c14859beffd", - "libraries/coreJSON/test/CMakeLists.txt": "f22296561886d698c1672c2d5df2e94c34363b8a40d42985fc71abc5640ddcc6", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/CODE_OF_CONDUCT.md": "34b6c98d5c23127ae6769e95e483e5bf6d3704ae1f0d3ae4e69d15f4ede118b6", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/CONTRIBUTING.md": "b050a75d5f6d2236ed40ad91dc53c4a4b30da184f9298f6f18507beae5fd7cb7", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/LICENSE": "09e8a9bcec8067104652c168685ab0931e7868f9c8284b66f5ae6edae5f1130b", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/NOTICE": "d4290ed64c2edd0fce1d84e3f9dfb2881240fe534def76b8cd29ed6af683e287", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/README.md": "d1de02d49f1baf2d8f376777731ca952eda223d23faf6f87ac17ec5f6eec1622", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/scripts/setup-proof.py": "250c684e31390f2831c4833b5bb642fcb9246e14a73e4e71aa64717c866d30ce", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/scripts/setup.py": "15eaf8dc1a3921b6ec647396e504b6f1346ca37aa7aea46a73110e5681211b2a", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/scripts/util.py": "7cc883f38bbe3a34f1be2f78655131f82d89356112dac292edbf9c5ef4de11b8", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-proof/FUNCTION_harness.c": "f2802074ae7080f73b53081f262c7b9f7245b8ef1e4fd4e3dc88262a2453af4d", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-proof/Makefile": "b7311b8cdd2f100da52ed793ddaa77aab0e8943e06cdcd2b29c05953c869e5a3", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-proof/README.md": "9abd31be7593b6de5507a36587f18298e870da24e2c2f2ab1235e9e04464d6c7", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-proof/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-proof/cbmc-viewer.json": "31c095521f43d2b919f96351d52b5900653ef3813af1c055ef88cb01114c57b6", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/include/README.md": "1ebb917adfbfeba5019583d75438c3f745da8a93752e88b1b31bdad351a1ac9d", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/README.md": "dda48722cef39f7482baa20929815222d6cb643541505af7ac0202ab4ea30675", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/assert/Makefile": "8eda2c18734c4e1a2b07bb5cdbd5b7d5974651184a8dd594409e122b52a06416", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/assert/assert_harness.c": "034f86fc93c6cf928500721ba5bcf9b96f327596a2b931b52474ddd66c765941", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/bounds_check/Makefile": "142e70065dfe3d20bfd83d4566a26e60a254d410111d9af072e31e96b6209cd6", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/bounds_check/bounds_check_harness.c": "b1b242ef2cbc76b275951e75d87fe07d181a3538b1fc8c31839883f8eef80a11", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/conversion_check/Makefile": "97ff3a0a72e2ad71f520fb3875cfbbd3a1124df6236a14930948343fd3f219a0", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/conversion_check/conversion_check_harness.c": "89c63b828b051da2e0b0767cd2704419c389d5390178cbdcccfe591940d42da1", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/div_by_zero_check/Makefile": "3367383673bcd9262b9b61fff6c4961abe70aa2ffb3b8e3f59d014d94927b84c", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/div_by_zero_check/div_by_zero_check_harness.c": "d4255afad71ad03efc1729c46bab842f1d3727967eb75c0e41d26add25ae684a", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/float_overflow_check/Makefile": "49ffbdb80bdb47fef8c3f2af3e2445def5a1fe764285f7f28163ff55206e0cf4", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/float_overflow_check/float_overflow_check_harness.c": "0b762450e1abdfdb6eefde48545d0ea51a5699727ca46decb8aa6893dc0bf684", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/float_underflow_check/Makefile": "3a561f39099cc9a6783bfc779c56a68a08b61c336f44cdc3b957868651899354", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/float_underflow_check/float_underflow_check_harness.c": "8b84e5fefef6615ed4518834b9861bf07ebb35db8583a30c26d09f8d04bf4381", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/nan_check/Makefile": "440a4b02b6bcaa94c95c33b900ba5febca83aed17990c30b5dfddce246c9f29e", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/nan_check/nan_check_harness.c": "8376f52bcb36282975be5749f61179bffb5b5ced4161e39c68ef86c3792f09bc", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_check/Makefile": "ecd0cacef27ec44df5af35549e801aa4c17f4078b3d4b5beb3e73dfc787f54c2", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_check/pointer_check_harness.c": "662e399061f5c413c8ace57886174b11e755cb66999a90950409bf04d8cfab07", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_overflow_check/Makefile": "f1875b30dfc83287132387682a13e435a82b11186707526d39a4e10794cebb04", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_overflow_check/pointer_overflow_check_harness.c": "118c0a62a647d824f98ec779956f89b540b74206c4f81f83298d6440fa1bee16", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_primitive_check/Makefile": "131b7ee0daed69e68bdb7a949ddb5667f216a3912522ca69019871a81d25f10d", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_primitive_check/pointer_primitive_check_harness.c": "ca0e47a48fe2a0023f6c5e7e410efd5e90705d39864b3be48322f5ac82f3398d", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_underflow_check/Makefile": "5208e5e4348a5c4bb983af1c1907d7531b5988b89589ca569fbe74a8f6daff69", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_underflow_check/pointer_underflow_check_harness.c": "effb8b9837ed060a1b9a1c905afc5003bebe4832a27e7bfec940405b2e6eba52", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/signed_overflow_check/Makefile": "e08765ec88321f8f909a417af4d4e528222c32ae1224bc120a518d851accb3f3", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/signed_overflow_check/signed_overflow_check_harness.c": "1083db8aa4fc4bdcc3b89d3723d0fe58e529c330a21200f3ddc75adaf7ff9956", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/signed_underflow_check/Makefile": "4d970e22f170d34ca5c2b92db785972eb9e0529c1f68217da5eae1b86cbd2944", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/signed_underflow_check/signed_underflow_check_harness.c": "040b507614725741b8bb8d553b12d273aa7e165253fbe17e9e9cd58102d01409", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/undefined_shift_check/Makefile": "da67123ebdd610d48888064339a1180c0ebdc662b7d19c68f97a120c9499f84c", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/undefined_shift_check/undefined_shift_check_harness.c": "0f643a2aad93e70fc540f6aecf3046063a09817e5c4bec735c88ac7820f62ff2", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/unsigned_overflow_check/Makefile": "e90461e92d5257521b9c4766beaa3ff986f35dc2c7dee695f983e88baff8e2aa", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/unsigned_overflow_check/unsigned_overflow_check_harness.c": "b85cfcacd82a28417112248f72e8f734cd7799b1df4360734caf186c775669a5", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/unsigned_underflow_check/Makefile": "03beb64ea16f9748f3d739572b850371444fcafe762a51b4240bb9bbef85fdc1", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/unsigned_underflow_check/unsigned_underflow_check_harness.c": "70f9f7cbe112c6610d9785a425bb43f098e80cefce795a1f79bdda03220d6c06", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/Makefile-project-defines": "9f1fb40fa45392f32901168bf4e012b78adb71e2daf6864d4a1a7d76b84f6f51", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/Makefile-project-targets": "d8c3930590646a4a3b5f5ed446758bf2d8b27ffb742dee196efb816ae2f502f6", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/Makefile-project-testing": "acb51f25870892f177057e7f56e73979e0eeb4967e3280aa160fd33a1a7bb03f", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/Makefile.common": "e23552ebdfa3fdba1bb158d8c868f139f2411a261c8d88f36bf9e2d6c076a21f", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/README.md": "142dc28dad300138bed3a174bdb7ce714f1c6a882299440e63552e2bebd2f7d0", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/prepare.py": "0d50cf7aece2c4f205a058ddb3bf6c1b0c1cfcfa9ea6dca9a145f1bdd7a442f9", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/run-cbmc-proofs.py": "aedcb62405ffb22af83c4b4cb38a665b57bfa3ecd102d868056b315306a26734", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/sources/README.md": "cfaa166351aeff46c321fd5627d417278accf8e88155481f678702644ce88138", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/stubs/README.md": "a87bfd893269da4a5c95f88369ce394b1e031dc6dbfd09195cd11485b77eac7f", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/training-material/CODING-FOR-VERIFICATION.md": "84c354dc41a70be81f085e6cb75f8328980b83a68333f179bba3fb69fee29bc7", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/training-material/DEBUG-CBMC.md": "d7e3ec89a44e5efcd8c2accac852bc9f261df54445eb4b3d1b4ffe5126abe6d1", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/training-material/FAQ.md": "d298098f6ead244a7d815aae24fe005e0ea09848abe42dd255694d42632769f5", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/training-material/PLANNING.md": "06ffd2048e70658246cba4359d5bcd121868238ca918041a874fddf311c22a8b", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/training-material/PROOF-WRITING.md": "2c037872b6c0994de2e0028cb9e7a8923342cacb2b6e3adc1c6f4ef3971a950d", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/training-material/README.md": "e453beb7cb3e4064bc6c85102c00176bf77b14e705046b8d8138c1614e237b12", - "libraries/coreJSON/test/cbmc/aws-templates-for-cbmc-proofs/training-material/checklist.md": "000710d7ef9e7e716ff58869dfd7efebfa9d7b017672812d089a55698494e52f", - "libraries/coreJSON/test/cbmc/include/README.md": "1ebb917adfbfeba5019583d75438c3f745da8a93752e88b1b31bdad351a1ac9d", - "libraries/coreJSON/test/cbmc/include/core_json_annex.h": "8677edc5f2b496d1b67abdd5f689c96542fbb066619e167ad78222dfc3c2b926", - "libraries/coreJSON/test/cbmc/include/skipGeneric.h": "ff170c08f0cd276d2d41ca915c45a3dfd138cab13a0284984c6359d815766b69", - "libraries/coreJSON/test/cbmc/litani/LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", - "libraries/coreJSON/test/cbmc/litani/NOTICE": "becc1029d600695c22c6c3dbe3a8b7824b539d9b7ed533b4ecebbb259dce2d8b", - "libraries/coreJSON/test/cbmc/litani/README.md": "f15f69182a049661c0795534e03b6d4e5aa0a8093d5da4421fcb655eb27f7681", - "libraries/coreJSON/test/cbmc/litani/THIRD-PARTY": "83a5fa777a8dfb9127d69e1b0b9d776930530258300c41ac8b2180c5699bd273", - "libraries/coreJSON/test/cbmc/litani/doc/Makefile": "af66c3b302388d09608d2c335cbea6d74398f1f5a8c4d56c86cd705947bc0689", - "libraries/coreJSON/test/cbmc/litani/doc/foot.html": "1694311aa8f471c9904dd4588965bd326173f216e30353e5d65f64371007da1e", - "libraries/coreJSON/test/cbmc/litani/doc/head.html": "76ce1041a11873360e6cda911a970b337d2191c125c5d6910798bc836d4d81b6", - "libraries/coreJSON/test/cbmc/litani/doc/index.md": "83267d5fead2464a853bc29710fd68793d94a32119c280d89802ede900a1dc08", - "libraries/coreJSON/test/cbmc/litani/doc/litani-flow.dot": "bfe01d6fb726571e82beeb4df7751cd72e655b8527edb8ffc4244247537d036b", - "libraries/coreJSON/test/cbmc/litani/lib/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "libraries/coreJSON/test/cbmc/litani/lib/litani.py": "31844ab14bae0b891200331e6ffeced6a5dd26c3c95c86e160b3344dfeb38d8c", - "libraries/coreJSON/test/cbmc/litani/lib/litani_report.py": "9cb5d588df49b4a93c101b674c4c96a3e355654130a88c5fe4dd03703145858b", - "libraries/coreJSON/test/cbmc/litani/lib/ninja_syntax.py": "74cf8d2ba381b447796b4db7933711a1844284b192cca23638bfc7b21a54d4f3", - "libraries/coreJSON/test/cbmc/litani/litani": "975fe534cc3281675d158416f4b5ed79b0b9fa5345d3f0944844ef2227498c84", - "libraries/coreJSON/test/cbmc/litani/litani-progress": "a3c0f0873b06e801587dbbd26aeb9382fdb60b97efffc56b9fbbae9d3627c9fc", - "libraries/coreJSON/test/cbmc/litani/litani-report": "ea9aee104dfc7a73cb89a6b01c8ebb581e7fc6e9b4f30796bb96ee07ae5795be", - "libraries/coreJSON/test/cbmc/litani/templates/dashboard.jinja.html": "224c4855cf8079003e72c57ce2aa7429bca50924f6d9b5ccf27a711a19844798", - "libraries/coreJSON/test/cbmc/litani/templates/file-list.jinja.html": "2151bd3c71559e887d64ba471522f5fc4eeea7f261d118672d390cef3c5fd856", - "libraries/coreJSON/test/cbmc/litani/templates/pipeline.jinja.html": "d22892a6cabbe10c9aa51603cb763492012d2212e142b3404fdcf34bcd4e848b", - "libraries/coreJSON/test/cbmc/litani/templates/runtime-box.jinja.gnu": "ae73382f2cba9ea418fec6f163192fbadab884296d55ca58ff4af86cfa257baf", - "libraries/coreJSON/test/cbmc/litani/test/README.md": "c1e5c0ec6b79a30040e88986dc84d15917712af49a9989aacc1542c725a7f652", - "libraries/coreJSON/test/cbmc/litani/test/run-tests": "0b3af49895a6b7d57e9889139f3ed20c028a7611c140e977583a27b7f4028d50", - "libraries/coreJSON/test/cbmc/litani/test/tests/1/Makefile": "a2ec421ed917ecd59f4c885faa487eeed30b59d3f8f09f863a00d240b2bcb983", - "libraries/coreJSON/test/cbmc/litani/test/tests/1/litani-test.sh": "b1cb5ad8b6c5b640659fddb32988d986b27bded9cf3f1a08fd1ecec87f730e93", - "libraries/coreJSON/test/cbmc/litani/test/tests/2/Makefile": "3531c2a1733b48d064016a34b7582874a87757ae279d1c5099cfd3ba6c5f2f3d", - "libraries/coreJSON/test/cbmc/litani/test/tests/2/litani-test.sh": "b1cb5ad8b6c5b640659fddb32988d986b27bded9cf3f1a08fd1ecec87f730e93", - "libraries/coreJSON/test/cbmc/litani/test/tests/3/Makefile": "3793c6940a452f1db086977f59e648b89c90aee688ff323f5ae597844078cf66", - "libraries/coreJSON/test/cbmc/litani/test/tests/3/litani-test.sh": "c95d186c612c5a62e237ee1613e4a51f830c81f1cbc6db442a2ce5f4f67b1fc7", - "libraries/coreJSON/test/cbmc/litani/test/tests/4/Makefile": "3793c6940a452f1db086977f59e648b89c90aee688ff323f5ae597844078cf66", - "libraries/coreJSON/test/cbmc/litani/test/tests/4/litani-test.sh": "b1cb5ad8b6c5b640659fddb32988d986b27bded9cf3f1a08fd1ecec87f730e93", - "libraries/coreJSON/test/cbmc/proofs/JSON_Search/JSON_Search_harness.c": "9401de48b5baef89737db6458c9713d0f7038d78b6e6d2a64ed34d56b9c2fe97", - "libraries/coreJSON/test/cbmc/proofs/JSON_Search/Makefile": "9d3df3779dc4487191a4958e420b5e17ae7f2a8c72b42b5f828a5fde74aef4e4", - "libraries/coreJSON/test/cbmc/proofs/JSON_Search/README.md": "6e3f49ad385305cd0ec09bd6e9f6d343be784e9a4d6cfde31d839c0fb54a1312", - "libraries/coreJSON/test/cbmc/proofs/JSON_Search/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreJSON/test/cbmc/proofs/JSON_Search/cbmc-viewer.json": "6da77d4bf12527d3e501027861e38907084f4d23c6ce122d4da4d94dcd33a5a3", - "libraries/coreJSON/test/cbmc/proofs/JSON_Validate/JSON_Validate_harness.c": "e3acaa7b37395a1b8658553b8e1cf5e69d9476a5e6a69609c29eb3b2f6540d4c", - "libraries/coreJSON/test/cbmc/proofs/JSON_Validate/Makefile": "517644e63575deaf71c485a6383000b9e948f0dc3148ac746c4ccfbac45643fe", - "libraries/coreJSON/test/cbmc/proofs/JSON_Validate/README.md": "b59f599efc875baf43bec04bbf8b8128035d4029384eef85e791220652556a6e", - "libraries/coreJSON/test/cbmc/proofs/JSON_Validate/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreJSON/test/cbmc/proofs/JSON_Validate/cbmc-viewer.json": "2d3aff70830a307ffd0ea58660969c781f4cec87116de38cc6f39b97ae7aef0e", - "libraries/coreJSON/test/cbmc/proofs/Makefile": "66cadd3793117843a103cd3cedd842f1b05039bb3b70eab1855b1817ee829217", - "libraries/coreJSON/test/cbmc/proofs/Makefile-json.common": "9638337492da33c3892e0b27c238666a44bd14adda49b30a2ff92b632b45387f", - "libraries/coreJSON/test/cbmc/proofs/Makefile-project-defines": "fd69da4e6c6df9b44d9dd5808117deb730a4cc7407a96f84ee7097fc5bbf3b30", - "libraries/coreJSON/test/cbmc/proofs/Makefile-project-targets": "cf0f30169e817afc81cc8d161d4bcc336f369392db04b81c43570fffdb57ca6c", - "libraries/coreJSON/test/cbmc/proofs/Makefile-project-testing": "acb51f25870892f177057e7f56e73979e0eeb4967e3280aa160fd33a1a7bb03f", - "libraries/coreJSON/test/cbmc/proofs/Makefile-template-defines": "50b3687413c3a9a1e42a62954b1007e270fadbfda068fcb8e796b1862563507f", - "libraries/coreJSON/test/cbmc/proofs/Makefile.common": "e23552ebdfa3fdba1bb158d8c868f139f2411a261c8d88f36bf9e2d6c076a21f", - "libraries/coreJSON/test/cbmc/proofs/README.md": "142dc28dad300138bed3a174bdb7ce714f1c6a882299440e63552e2bebd2f7d0", - "libraries/coreJSON/test/cbmc/proofs/run-cbmc-proofs.py": "b37b71fb8ccf4b101ea1ffc65107c857f45fa6e228f1eb9e2041c017efd3319c", - "libraries/coreJSON/test/cbmc/proofs/skipAnyLiteral/Makefile": "bfd696dd9aaf2ce7b0c486c3dae2e181438e83727c76dd1cf34559293bc2e0d8", - "libraries/coreJSON/test/cbmc/proofs/skipAnyLiteral/README.md": "7df172f374b3f15a458a9fa766ba5e79687549f2dcf501d8d7de9aa5290efc2f", - "libraries/coreJSON/test/cbmc/proofs/skipAnyLiteral/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreJSON/test/cbmc/proofs/skipAnyLiteral/cbmc-viewer.json": "fae6047e1eed0cf84842c64e6fb697d295bb4cb3b4c09b8314c306c3fc6462ae", - "libraries/coreJSON/test/cbmc/proofs/skipAnyLiteral/skipAnyLiteral_harness.c": "c7197f766268d4bfc42dd1f974dd47a7355ec05e287cc3a562f3aea3e3b77113", - "libraries/coreJSON/test/cbmc/proofs/skipCollection/Makefile": "0349bae0eadee7229072a5bdeda767e0d85ea4dd56f1829890c7957ea283e0e8", - "libraries/coreJSON/test/cbmc/proofs/skipCollection/README.md": "4314646b3917f891cfb5ca83b7862bb9412434bc7b156f8337dd6deaf4b4751f", - "libraries/coreJSON/test/cbmc/proofs/skipCollection/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreJSON/test/cbmc/proofs/skipCollection/cbmc-viewer.json": "be80ad3ea1285e22419058ed98c05d8159994755fa4c6bafb015d5d63f065128", - "libraries/coreJSON/test/cbmc/proofs/skipCollection/skipCollection_harness.c": "ad4b9ce8661ac3666b3588740e0dbd608b236b1c71a587d2bb8cf56bf57598e0", - "libraries/coreJSON/test/cbmc/proofs/skipEscape/Makefile": "2c355113aec48c5d4c4dbdc16fef7601c174011b61920e1047e6c55487d147da", - "libraries/coreJSON/test/cbmc/proofs/skipEscape/README.md": "3e5425772da09445abb5d976a789941ea1233744a717887165efb7a89f87ba2f", - "libraries/coreJSON/test/cbmc/proofs/skipEscape/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreJSON/test/cbmc/proofs/skipEscape/cbmc-viewer.json": "6318ff51b7058066c99a87b99194b1d65d4a33d77a83da3dc4fad6327778b29f", - "libraries/coreJSON/test/cbmc/proofs/skipEscape/skipEscape_harness.c": "15ed7715eb0f4fd87289d95ae4ccf2a1a54b4f00cb228f0e4cc67268b9f0b94e", - "libraries/coreJSON/test/cbmc/proofs/skipNumber/Makefile": "20ffa32b03006ec004d968f3984567be678ce81b8a4ae85c250f8a3630c12666", - "libraries/coreJSON/test/cbmc/proofs/skipNumber/README.md": "0d4f0d613efe747e39bac8874b639129b74f164fcb017cc8aa1acae9e0da8b0e", - "libraries/coreJSON/test/cbmc/proofs/skipNumber/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreJSON/test/cbmc/proofs/skipNumber/cbmc-viewer.json": "13bd089ecb4de1a6edca24af3bb2d2dbf124681e71a50539bda9cb85c502b16f", - "libraries/coreJSON/test/cbmc/proofs/skipNumber/skipNumber_harness.c": "e4379adf237dec5232fc6219fe8902a7c0852f5e2831279cbc093adb097ce214", - "libraries/coreJSON/test/cbmc/proofs/skipSpace/Makefile": "825e917450aeaf3536995a43b84e6b846191ff976e7e3b789f8cbde804d8e319", - "libraries/coreJSON/test/cbmc/proofs/skipSpace/README.md": "620573816baea73974121fb4415ad4dfca463a38e925152aa3d4e2b04a53d122", - "libraries/coreJSON/test/cbmc/proofs/skipSpace/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreJSON/test/cbmc/proofs/skipSpace/cbmc-viewer.json": "3a3db6ce8ebe463f90a95bb9b984bb9c8c0a8c346dfe3fd9f1e736e12bac8782", - "libraries/coreJSON/test/cbmc/proofs/skipSpace/skipSpace_harness.c": "1161e56d2fb3e366117d746b9739ff4224f35c7a3f8a58e19b4b73c35eef7552", - "libraries/coreJSON/test/cbmc/proofs/skipSpaceAndComma/Makefile": "8759e841c7a053a9117758370b768561e85baa72919bff3ed6aed65178cf8658", - "libraries/coreJSON/test/cbmc/proofs/skipSpaceAndComma/README.md": "acbbf3b27c2f02885f9b5c92f47208f335fb54eb4f730a7b73dad404e7c6305d", - "libraries/coreJSON/test/cbmc/proofs/skipSpaceAndComma/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreJSON/test/cbmc/proofs/skipSpaceAndComma/cbmc-viewer.json": "1de624ce0d5cdfb47f4e60861fad02c9ecad2cb1d825cc4ff7cbe438f32ee2ec", - "libraries/coreJSON/test/cbmc/proofs/skipSpaceAndComma/skipSpaceAndComma_harness.c": "df994cf19cd3f81e5d3ce8bbb256f4661103a4463817f01d88cf047c7608060f", - "libraries/coreJSON/test/cbmc/proofs/skipString/Makefile": "84a027e8b6ab7744bba40d2889dfb218bfc45f3d18aa91595e09557d3d1a24b1", - "libraries/coreJSON/test/cbmc/proofs/skipString/README.md": "1bc095eaac3f4f5945a7dac68dc5baf969dc18a4dee99423da6bbdf779a9387c", - "libraries/coreJSON/test/cbmc/proofs/skipString/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreJSON/test/cbmc/proofs/skipString/cbmc-viewer.json": "2ca367bb82a31b0e2758e773bc28b7360cd54917696fa019b35a1ed401228cbe", - "libraries/coreJSON/test/cbmc/proofs/skipString/skipString_harness.c": "cabdfd74d21689000c9c123e198ae291f989f8ac42ddfd68e179901b076510bc", - "libraries/coreJSON/test/cbmc/proofs/skipUTF8/Makefile": "4fbbea93626213a1782113d1bebb7ed521c03443bccfe0b79f64a1f6552faa96", - "libraries/coreJSON/test/cbmc/proofs/skipUTF8/README.md": "d0224f808e488f9c5d257bf40d465bcef9934b5de5d5cc91a40395d888dd109c", - "libraries/coreJSON/test/cbmc/proofs/skipUTF8/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreJSON/test/cbmc/proofs/skipUTF8/cbmc-viewer.json": "e6c1725d654647bc7bfb06be02406424b554104b42f739f6d3339e99106ecd65", - "libraries/coreJSON/test/cbmc/proofs/skipUTF8/skipUTF8_harness.c": "ae9bfd454f5a9e436414c38efaf29359c499fe9f12267d7853aa1eff37194e53", - "libraries/coreJSON/test/cbmc/sources/README.md": "cfaa166351aeff46c321fd5627d417278accf8e88155481f678702644ce88138", - "libraries/coreJSON/test/cbmc/stubs/README.md": "a87bfd893269da4a5c95f88369ce394b1e031dc6dbfd09195cd11485b77eac7f", - "libraries/coreJSON/test/cbmc/stubs/skipAnyLiteral.c": "1e668f002e46b4f3c79adf10847dcafdbec90cf47c272c7bab1c2ba7adb9eb28", - "libraries/coreJSON/test/cbmc/stubs/skipAnyScalar.c": "bdcce12e27256c6bea976a5c39cccc000692b127ecc0e07944c604171e18ad24", - "libraries/coreJSON/test/cbmc/stubs/skipCollection.c": "49cf4e5cd6eb738c2eb18ca8270ae9e6886918cee65bf88ee9c15db78d18ce44", - "libraries/coreJSON/test/cbmc/stubs/skipDigits.c": "3dd48ccf06cf3c33d28d8869e3ae6913541f47bdc24d3e4067162e9f811e9e85", - "libraries/coreJSON/test/cbmc/stubs/skipEscape.c": "b07b53a10497509a3501382d501a9a47362d21cd338005ec0dc0886a3328d624", - "libraries/coreJSON/test/cbmc/stubs/skipGeneric.c": "f92d0ea5ca2a80d69c73a3784516c5da5703baa9de38a50092130573a11db2de", - "libraries/coreJSON/test/cbmc/stubs/skipNumber.c": "67be362c4b142d8d82e60f279826a341d8e82c15680f8ae43f27240c5e3642d2", - "libraries/coreJSON/test/cbmc/stubs/skipSpace.c": "866455d2ab76ea04d3221a79c35a216e2921dd44078320fd49d07256e7bda465", - "libraries/coreJSON/test/cbmc/stubs/skipSpaceAndComma.c": "1f17de493fc5dafbbd0e421c02d91651aaf63189fd3506dad9f6f3aea34b8993", - "libraries/coreJSON/test/cbmc/stubs/skipString.c": "d7ea329ee82b79262a81767ac0668e7589e6ce5411140713134a7ba3aa96e52c", - "libraries/coreJSON/test/cbmc/stubs/skipUTF8.c": "88dc3cca61ef0ec69fc2ac23ec0d2e709c84101475fa2881bb46f2f32c522346", - "libraries/coreJSON/test/unit-test/CMakeLists.txt": "bb0a488a774d045b9d69078094ab50389b5e6b881cca16b967c69f198206ca5a", - "libraries/coreJSON/test/unit-test/Unity/CMakeLists.txt": "e3f877ac53b976cf8279780dfa84ef790a2d7689f5171329c58f680a25b2b4b7", - "libraries/coreJSON/test/unit-test/Unity/LICENSE.txt": "3ed9b51da86f52c729c96cc99fdde6444b2297c788a9cf4ad1d3649dc34c4985", - "libraries/coreJSON/test/unit-test/Unity/README.md": "3cef66478d170c8173baa5ceb7d43fb4ff2c417547f7896cd86cb32c60544683", - "libraries/coreJSON/test/unit-test/Unity/auto/colour_prompt.rb": "2f879fa491913d5c32312353c2df6288fbdae11d78f43264078eab4c561f6c34", - "libraries/coreJSON/test/unit-test/Unity/auto/colour_reporter.rb": "2e6fbc6a1718d1f755378a934526a5b4fe11ef045302ac1e1c251e927477d697", - "libraries/coreJSON/test/unit-test/Unity/auto/generate_config.yml": "85c5702a168e366148e8ec89df416eae888278a526c79459162c0f37641a02fe", - "libraries/coreJSON/test/unit-test/Unity/auto/generate_module.rb": "152ae9eb4c00a54850099bf325093bd4b40e56100426af0a37b7b9b63c757c39", - "libraries/coreJSON/test/unit-test/Unity/auto/generate_test_runner.rb": "784ec49885e9e88f021bf28d34e37c83c78d1ea60ec751acd90896044abfa8ed", - "libraries/coreJSON/test/unit-test/Unity/auto/parse_output.rb": "ad1910bfff4d778f1fc53c111588238ee003809eb60717fde6dce7cf854879c6", - "libraries/coreJSON/test/unit-test/Unity/auto/run_test.erb": "7b61e8c78300c409e0d58c49f3e6083850033b6b0f9b988859489ea1dc33d82d", - "libraries/coreJSON/test/unit-test/Unity/auto/stylize_as_junit.rb": "fd0c45171391cbd0bc63cd5d4499e89eb51d087cf9c6c5ac2d4127e3d56bd9eb", - "libraries/coreJSON/test/unit-test/Unity/auto/test_file_filter.rb": "a69a44fccafbb504635163793799aa59809035951d7f258547d64d4145131a60", - "libraries/coreJSON/test/unit-test/Unity/auto/type_sanitizer.rb": "ecc5677ac9820f343aca50893463602fca940c24daf07a4784b4e9e0801c3f4b", - "libraries/coreJSON/test/unit-test/Unity/auto/unity_test_summary.py": "e46350b7132f04a7bb339d47bcef11ae0cb9e74c2050d0d75697b33c253c2895", - "libraries/coreJSON/test/unit-test/Unity/auto/unity_test_summary.rb": "721818505aab3199a712e4d6f964c84b07720f84a8fcf504349b586f05e8cd2b", - "libraries/coreJSON/test/unit-test/Unity/auto/unity_to_junit.py": "0743f26b5ae67af204981293337f9cc9a8cb46c90aaa3f46f31fd9658ab65990", - "libraries/coreJSON/test/unit-test/Unity/docs/ThrowTheSwitchCodingStandard.md": "f0f000eb1fc32b3a6684da894ed816d09ba077ad85e65e44f1f7998da47ef178", - "libraries/coreJSON/test/unit-test/Unity/docs/UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf": "28e8687d90c111ee8c249a7748495a0bfe00a3f35231b026ac73eed01d32eb34", - "libraries/coreJSON/test/unit-test/Unity/docs/UnityAssertionsReference.md": "a85c1b770999c51043cd60c8f60691f941cce34724c4034146506c477c9339c9", - "libraries/coreJSON/test/unit-test/Unity/docs/UnityConfigurationGuide.md": "1280dfbbb5169d45bb3822b2e681588413679cf34c0a4967f05f0be9d686659f", - "libraries/coreJSON/test/unit-test/Unity/docs/UnityGettingStartedGuide.md": "54193aa975c291e62682c65fe088b7f960bedf4b58e2ce63e2dc1696a8ca3f6f", - "libraries/coreJSON/test/unit-test/Unity/docs/UnityHelperScriptsGuide.md": "a794fa7886738433f7724ee3b23ebf5e27a3d6136f09fd62ec6199a66e638c08", - "libraries/coreJSON/test/unit-test/Unity/examples/example_1/makefile": "a6b1cba50764fa8f18ef16dd11f4f1e7cd90e614d14bfe7dc22239245751cb6a", - "libraries/coreJSON/test/unit-test/Unity/examples/example_1/readme.txt": "4d72d51f1a385cd4aeb594e4485ca2439d5b86247523cd2d2b89acc2173d8a24", - "libraries/coreJSON/test/unit-test/Unity/examples/example_1/src/ProductionCode.c": "9d6b0ae761f7dfc008d6547031ff92de63976f5621b6feef2a29614cec51b357", - "libraries/coreJSON/test/unit-test/Unity/examples/example_1/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", - "libraries/coreJSON/test/unit-test/Unity/examples/example_1/src/ProductionCode2.c": "c2cc0a76cb2ea145d3861bd9ccc467ac45ad3e8230d5075ed174ce3a5cd50a76", - "libraries/coreJSON/test/unit-test/Unity/examples/example_1/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", - "libraries/coreJSON/test/unit-test/Unity/examples/example_1/test/TestProductionCode.c": "33e4b165d437c376f2393da59be0b22a3a458ebbe94cc2b340159b71f2d8bb74", - "libraries/coreJSON/test/unit-test/Unity/examples/example_1/test/TestProductionCode2.c": "11387f2ecdc97ee3344c0df42123e73cae899702b348d5597e09e9760db267aa", - "libraries/coreJSON/test/unit-test/Unity/examples/example_1/test/test_runners/TestProductionCode2_Runner.c": "2c84d6b954a6810a7c509dc861ee0c18a562dd23a5dd7747ea524f0c1467d9a4", - "libraries/coreJSON/test/unit-test/Unity/examples/example_1/test/test_runners/TestProductionCode_Runner.c": "b6ec7bb984eddea80c178ecb30f6f772325a745ff9812a5e3f41f236c43e19e0", - "libraries/coreJSON/test/unit-test/Unity/examples/example_2/makefile": "da2bf7ebba3456dec77ef500884654fdcffeb514ecbb84dc9cf930821ec2e9ec", - "libraries/coreJSON/test/unit-test/Unity/examples/example_2/readme.txt": "a03bf4ac2d294a037189b42f7bf8fdff0bf50524857e3f8933eba76085f22f04", - "libraries/coreJSON/test/unit-test/Unity/examples/example_2/src/ProductionCode.c": "075f25b87aa9f9a4ee0c7b79893ce76a8d6f79d450b5c158bb6fb84aa0ed4d31", - "libraries/coreJSON/test/unit-test/Unity/examples/example_2/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", - "libraries/coreJSON/test/unit-test/Unity/examples/example_2/src/ProductionCode2.c": "a929e7ef393ec5ccc53e3f885d663a1c8fbe5cc5f72a0fcad5c0d2f6cbc8b210", - "libraries/coreJSON/test/unit-test/Unity/examples/example_2/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", - "libraries/coreJSON/test/unit-test/Unity/examples/example_2/test/TestProductionCode.c": "7db7b7d9e7216fdc0814ff8bbecc37f40e573006207b47cfd8954469ebc9b502", - "libraries/coreJSON/test/unit-test/Unity/examples/example_2/test/TestProductionCode2.c": "332f23e940a9676504c84dc92d1a6cf72cd9204afe7f664c16b58ee7dbff312d", - "libraries/coreJSON/test/unit-test/Unity/examples/example_2/test/test_runners/TestProductionCode2_Runner.c": "14aef95de310f1e1381feaaf256ea94d0905a538311b5e3fdc944f927e75b287", - "libraries/coreJSON/test/unit-test/Unity/examples/example_2/test/test_runners/TestProductionCode_Runner.c": "a782491bcd8dd857b26a62df58e8671f1cb7641d6c0fe7f7853c079732ccd8e9", - "libraries/coreJSON/test/unit-test/Unity/examples/example_2/test/test_runners/all_tests.c": "fe5c0418201d70dc696b0db6acf60b2ea0069d74fa94fb96d7169b8752e00d17", - "libraries/coreJSON/test/unit-test/Unity/examples/example_3/helper/UnityHelper.c": "091c2466d25deffd8958332ad03d393ca1ec1b1f6150c16626d57d5901eb1b21", - "libraries/coreJSON/test/unit-test/Unity/examples/example_3/helper/UnityHelper.h": "a95bb6d3704c51637bb0855787236b41229e3836601ba97e88768f95779f3d4d", - "libraries/coreJSON/test/unit-test/Unity/examples/example_3/rakefile.rb": "7b3b7d271caeb7af887b08986c9922ec331c8515d654ffb3e200833aa9be809f", - "libraries/coreJSON/test/unit-test/Unity/examples/example_3/rakefile_helper.rb": "bfc4aca33ed7bf68ffebf686790ec0c9e7a7bd23527147e81c10f4fd2dc38be0", - "libraries/coreJSON/test/unit-test/Unity/examples/example_3/readme.txt": "2af5e731fb1db0ddf5c739f0b08fb2724e4acc7efb7ee0a02fe474a3e69d284a", - "libraries/coreJSON/test/unit-test/Unity/examples/example_3/src/ProductionCode.c": "075f25b87aa9f9a4ee0c7b79893ce76a8d6f79d450b5c158bb6fb84aa0ed4d31", - "libraries/coreJSON/test/unit-test/Unity/examples/example_3/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", - "libraries/coreJSON/test/unit-test/Unity/examples/example_3/src/ProductionCode2.c": "a929e7ef393ec5ccc53e3f885d663a1c8fbe5cc5f72a0fcad5c0d2f6cbc8b210", - "libraries/coreJSON/test/unit-test/Unity/examples/example_3/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", - "libraries/coreJSON/test/unit-test/Unity/examples/example_3/target_gcc_32.yml": "2e61fc6bc7930929985f1ea1ec5d0019fe1d133c01555c86b01b20145fb6aaa4", - "libraries/coreJSON/test/unit-test/Unity/examples/example_3/test/TestProductionCode.c": "b0e815e2285b1730d7dcd24b400d15b4efccfe5e4776d96248a2165c2f0caec6", - "libraries/coreJSON/test/unit-test/Unity/examples/example_3/test/TestProductionCode2.c": "895f437abd40bd461fd86a3b8ed6bc02c5c283fc3926aafe53b473e477fa0a5a", - "libraries/coreJSON/test/unit-test/Unity/examples/example_4/meson.build": "535ea70e1617196a43d38dc5039a7097d6524d9d994714f63cf153818fb409b9", - "libraries/coreJSON/test/unit-test/Unity/examples/example_4/readme.txt": "d16faba668694cacde12746c58ec512de301218543217a9644e4e269bee8ab0c", - "libraries/coreJSON/test/unit-test/Unity/examples/example_4/src/ProductionCode.c": "9d6b0ae761f7dfc008d6547031ff92de63976f5621b6feef2a29614cec51b357", - "libraries/coreJSON/test/unit-test/Unity/examples/example_4/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", - "libraries/coreJSON/test/unit-test/Unity/examples/example_4/src/ProductionCode2.c": "c2cc0a76cb2ea145d3861bd9ccc467ac45ad3e8230d5075ed174ce3a5cd50a76", - "libraries/coreJSON/test/unit-test/Unity/examples/example_4/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", - "libraries/coreJSON/test/unit-test/Unity/examples/example_4/src/meson.build": "94cfe0c2645b58533c4c416e3610835ae1336543e5ab6ae42afc336e817f31bd", - "libraries/coreJSON/test/unit-test/Unity/examples/example_4/subprojects/unity.wrap": "59d1f20c0ada120ee62ef1baf30be51ebaaf40d30b16e4da014f9d58023b7a8a", - "libraries/coreJSON/test/unit-test/Unity/examples/example_4/test/TestProductionCode.c": "f3a8fa16e599d6aa7a0c9cf604ea1d42ff5466244372e00543fc3b2e116f0d41", - "libraries/coreJSON/test/unit-test/Unity/examples/example_4/test/TestProductionCode2.c": "26c0ee5fabc061cfd32ae891ab16f4b985f306dfea1a939d00e89a3c1ae6f25e", - "libraries/coreJSON/test/unit-test/Unity/examples/example_4/test/meson.build": "785bb1c9ed0714a8f7e53bbb808e584cf8c34be90a42a7bbff7de7b7d4ba3889", - "libraries/coreJSON/test/unit-test/Unity/examples/example_4/test/test_runners/TestProductionCode2_Runner.c": "2c84d6b954a6810a7c509dc861ee0c18a562dd23a5dd7747ea524f0c1467d9a4", - "libraries/coreJSON/test/unit-test/Unity/examples/example_4/test/test_runners/TestProductionCode_Runner.c": "b6ec7bb984eddea80c178ecb30f6f772325a745ff9812a5e3f41f236c43e19e0", - "libraries/coreJSON/test/unit-test/Unity/examples/example_4/test/test_runners/meson.build": "4c95601301634554cd6d4de7280a27d703fba081d3b2e2fca4fd5e0fbfbcb942", - "libraries/coreJSON/test/unit-test/Unity/examples/unity_config.h": "63ee0c6ea60845c16545f501d5790f9d3f886723a617960dc018139674d022f7", - "libraries/coreJSON/test/unit-test/Unity/extras/eclipse/error_parsers.txt": "67e309b5e803a22ba22c347aa5123cbbe73edcbfe9950aa0fd74576a4add1a12", - "libraries/coreJSON/test/unit-test/Unity/extras/fixture/readme.md": "2fab9d3b45056588cfdb06a6c745c2d66ed0c0a71709102b0c089b554ea23bc2", - "libraries/coreJSON/test/unit-test/Unity/extras/fixture/src/unity_fixture.c": "090875bd5b4d55966fdd6f9d984aa9883924a395d1a56a78ccbf9885e058a643", - "libraries/coreJSON/test/unit-test/Unity/extras/fixture/src/unity_fixture.h": "73854da3d615a041ab114be64bb98debfa8b186ac9741682f3de4cabc153100b", - "libraries/coreJSON/test/unit-test/Unity/extras/fixture/src/unity_fixture_internals.h": "adf665b853438b5e35ffc72e6d0f1bd404a09188fbd4fc7c64c2eb30b25781ea", - "libraries/coreJSON/test/unit-test/Unity/extras/fixture/test/Makefile": "f61e0e71da2aa1e38d4ba244178ef7ddd976447bc57332e17ac62319e1765ee3", - "libraries/coreJSON/test/unit-test/Unity/extras/fixture/test/main/AllTests.c": "b90030dde0bdea78a78df99e177bba1aa6a162a21527027920e01abbe991e8f5", - "libraries/coreJSON/test/unit-test/Unity/extras/fixture/test/template_fixture_tests.c": "3ca4c500397fc3dd7370b419e7d4f7abb3a8b05deacaf72a4e2ccb396669003a", - "libraries/coreJSON/test/unit-test/Unity/extras/fixture/test/unity_fixture_Test.c": "6edfe13bd81264856f4bbe3d421ab40f1f47529e0a57f7b95b1b13155d51db24", - "libraries/coreJSON/test/unit-test/Unity/extras/fixture/test/unity_fixture_TestRunner.c": "cabed04e1b026bd8ae2b47f54e8777899c3564cae952e62fc59965d2117a3215", - "libraries/coreJSON/test/unit-test/Unity/extras/memory/readme.md": "5cc935c39537f3a403a80b82c1ba24d6ba895275927a6b5db8362e233438a97a", - "libraries/coreJSON/test/unit-test/Unity/extras/memory/src/unity_memory.c": "7bc202de8e950466f713b2c3918beb824a10d33cd7df43058dd4676573fc2645", - "libraries/coreJSON/test/unit-test/Unity/extras/memory/src/unity_memory.h": "85ea1b5fa55bd59f03901fad4272a938a33696d9f0821d085ba6fc5463fb391b", - "libraries/coreJSON/test/unit-test/Unity/extras/memory/test/Makefile": "4530559b0cf8de81a35d3e5901aa3b5bdfb523cba3458bac37e1beebedde0e63", - "libraries/coreJSON/test/unit-test/Unity/extras/memory/test/unity_memory_Test.c": "64e492cafc7da28265299706ee3c663db66edf3c5556cb27f06039d1876f63d8", - "libraries/coreJSON/test/unit-test/Unity/extras/memory/test/unity_memory_TestRunner.c": "8265bf36612d73d5286303a4259b444e7e86ed011551c3be9f43be6a1804a781", - "libraries/coreJSON/test/unit-test/Unity/extras/memory/test/unity_output_Spy.c": "c18d6d3034a751915b3deb137b098eee14498a06b4f7bf8a8a59ffe4d260d4a7", - "libraries/coreJSON/test/unit-test/Unity/extras/memory/test/unity_output_Spy.h": "20f9beac9acaf917cbf2011fbae1e5b919c6876646ca48e02379b72a12f7f971", - "libraries/coreJSON/test/unit-test/Unity/meson.build": "5a676c7d47d469a8c0d3017d03d6db12455948848134f51a7f3fe379904178f9", - "libraries/coreJSON/test/unit-test/Unity/src/meson.build": "ce67ee2e8b146d979199c5e7ad34adb28cc535cac824f8b72869a4222765b59d", - "libraries/coreJSON/test/unit-test/Unity/src/unity.c": "d7a7255e0fc01418a412d01780aa69c10c64fe03eebfce0e8e2be1144c5959c8", - "libraries/coreJSON/test/unit-test/Unity/src/unity.h": "04736e0c4d9958512b2c88ce40ddf8f81129be1c0dded8dcb10236a62e435172", - "libraries/coreJSON/test/unit-test/Unity/src/unity_internals.h": "0a5c780a6316e9c358416c3d55f95c81e6093030d5653ca7f41adb9e6f3f730a", - "libraries/coreJSON/test/unit-test/Unity/test/Makefile": "e9dc822a21971c3c818135c6c0818393b7b29a5044d5c0fac4c3849030387203", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_cmd.c": "832ec9c8c30fd374adea6620dd38c19c689047bdad0513984066e525eefc0723", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_def.c": "246d3d9bc73ccef28f7a70b8748d95cd31eb85b9874e6972d30be1f74000fb8c", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_head1.c": "ed31f2c63e4bb7ba015a5388429b34287ecefa098551e55ae5864b883c3cdad4", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_head1.h": "fc279a298e45f70a559d05132ae888973c8f5aad913c0b2d6d8425ccbde5c998", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_mock_cmd.c": "b826f44458088555058b6c3b9c7ef15c2a5528c8efe01034d0f1debee06a739e", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_mock_def.c": "1016f1162a3ea3be49dffd824e529493d2845860d1139cb44cc32f0fe0a0701f", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_mock_head1.c": "cb7b253cefa315d7b4edaa386bffb63a728f3b33c869bf55ecfcd53d1e47eaaf", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_mock_head1.h": "9cb779d98b40e5dfcf70db57f7d3deae6310cac80547140c972ecde585f56c18", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_mock_new1.c": "4e5d73972dce4276dc688016eeb310e93ef96ea7beee0e6839092f0459798856", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_mock_new2.c": "74418cfefe544ac366a043972648c31742b2a4652155507c93a1a2a38471a5eb", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_mock_param.c": "6a8edda1c9b5a56d38e705d2d0341232ca9a55f1fb7383171475cb972c9b6c18", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_mock_run1.c": "4e5d73972dce4276dc688016eeb310e93ef96ea7beee0e6839092f0459798856", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_mock_run2.c": "74418cfefe544ac366a043972648c31742b2a4652155507c93a1a2a38471a5eb", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_mock_yaml.c": "763d37bc5a5edc7566bf6625dd38878aed8cc94a5cec8f6e23aee16e30bdaad6", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_new1.c": "983abee21894ba9fb5d667a69b046558867f9f16eaf546d259671f54dd4be626", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_new2.c": "9726bdaec7a5c8e99b4e6bbfc41b91c8687665bbafdb617be4514eadc30b023c", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_param.c": "7ab6834f8376908625b9999a4c5dad32ad65c8f3fd852e78b6d9c3bc871fc639", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_run1.c": "983abee21894ba9fb5d667a69b046558867f9f16eaf546d259671f54dd4be626", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_run2.c": "9726bdaec7a5c8e99b4e6bbfc41b91c8687665bbafdb617be4514eadc30b023c", - "libraries/coreJSON/test/unit-test/Unity/test/expectdata/testsample_yaml.c": "17714f87e28c7723608fdc832189965482404e3540e3f3ec55afa7f07054e0a7", - "libraries/coreJSON/test/unit-test/Unity/test/rakefile": "26fb64768302e1336cf6abdd2ca8eae49562096518a416f086b8e544bebc9729", - "libraries/coreJSON/test/unit-test/Unity/test/rakefile_helper.rb": "0d0839f4629e3305e6a2fbb8d3c17affaeaa94707cc247c4a972d2f8dbaa8fc0", - "libraries/coreJSON/test/unit-test/Unity/test/spec/generate_module_existing_file_spec.rb": "41d0b6bf8255f97e4fbf6c4f5fb2dcc61d846d2ddaf2cad763c1f500b8a68727", - "libraries/coreJSON/test/unit-test/Unity/test/targets/ansi.yml": "ff3c3e77809d208e398d05502814248e5517b488790f741115673889c9df7d49", - "libraries/coreJSON/test/unit-test/Unity/test/targets/clang_file.yml": "ac73b6b5d94ca4172945d0ec20daf9c69cfb890593d1e3649157e76cef1c68fc", - "libraries/coreJSON/test/unit-test/Unity/test/targets/clang_strict.yml": "94360fbe3b7ad0ed8d935269cbc81867de4068d022e763dd1175d30297b00b77", - "libraries/coreJSON/test/unit-test/Unity/test/targets/gcc_32.yml": "ed830992a0ec5a64f37a0eb310471d97f33ad1fccfad8dce040c5ac10fa76485", - "libraries/coreJSON/test/unit-test/Unity/test/targets/gcc_64.yml": "170bc616bac1b1b766d44797a23c235b47cd18beb4a50abce68c70dcc4ff90d9", - "libraries/coreJSON/test/unit-test/Unity/test/targets/gcc_auto_limits.yml": "d2d24592f1ae926854d869f7c5c15e0a5979622530b85dc38348470e4a0a799d", - "libraries/coreJSON/test/unit-test/Unity/test/targets/gcc_auto_stdint.yml": "0c5ec51bcfb43f4301e2bd4b78836f202674f507c9c23854752ef6dbc0bdf908", - "libraries/coreJSON/test/unit-test/Unity/test/targets/gcc_manual_math.yml": "9c67d40734a9837e79012200a7121d10f002193cf0cf93a3c07696f3eb8fec65", - "libraries/coreJSON/test/unit-test/Unity/test/targets/hitech_picc18.yml": "eebc4afcecf8ebfba6bd0869f860e263d2aaa21647dea002050d30e3c9cd71a5", - "libraries/coreJSON/test/unit-test/Unity/test/targets/iar_arm_v4.yml": "57e3c06db4a429a1b579f909e4ffa22ad1b5c651f5561fb6b69cea6184be6150", - "libraries/coreJSON/test/unit-test/Unity/test/targets/iar_arm_v5.yml": "db2dc6f61e3067f75c2ff25d8240eb2ff17377d211a774cefee05ff5b3b465b8", - "libraries/coreJSON/test/unit-test/Unity/test/targets/iar_arm_v5_3.yml": "db2dc6f61e3067f75c2ff25d8240eb2ff17377d211a774cefee05ff5b3b465b8", - "libraries/coreJSON/test/unit-test/Unity/test/targets/iar_armcortex_LM3S9B92_v5_4.yml": "c09088bcb23f8b7f20315e0e9ea471de64d5ffa3ba2472f8f18ce684f852c30f", - "libraries/coreJSON/test/unit-test/Unity/test/targets/iar_cortexm3_v5.yml": "d6980cc05f2519a6ba9cf3b22416f80f18d3c6f3f5f713fe952739ebdfb753d0", - "libraries/coreJSON/test/unit-test/Unity/test/targets/iar_msp430.yml": "8aeaea8a80e3acc9ddbe7ba60b752cd76963f1d95744700b6913638e958970f2", - "libraries/coreJSON/test/unit-test/Unity/test/targets/iar_sh2a_v6.yml": "a3ab0a230f7632f8154c27421c7d86dc8e3be1edfcae8e0a2dfeca50993ffc34", - "libraries/coreJSON/test/unit-test/Unity/test/testdata/CException.h": "1d815018f2b5c5973982e9e13c9534bb5cd96e6deea5b1f29b531233f476e843", - "libraries/coreJSON/test/unit-test/Unity/test/testdata/Defs.h": "9c7988c8f87c13251880be27117c9cd5d7078990bef9d34200a342cf26911bd7", - "libraries/coreJSON/test/unit-test/Unity/test/testdata/cmock.h": "ae873ab649d7ea46f2e23ee13cbac383c527d5935bc40b31dced6969fb4d235d", - "libraries/coreJSON/test/unit-test/Unity/test/testdata/mockMock.h": "bbf1b3aaddf02a21cdb52b7b58d2f74927d586d013ca923e25eb93b121bdcf47", - "libraries/coreJSON/test/unit-test/Unity/test/testdata/testRunnerGenerator.c": "721d2a8bef4daf1d4a61e30f8bf8bf1d263377c9f763f9129218d638ddac65d8", - "libraries/coreJSON/test/unit-test/Unity/test/testdata/testRunnerGeneratorSmall.c": "f32a9a46a78102474346c7516bdb0401fabef9ee8616d033237a4bc658e3357a", - "libraries/coreJSON/test/unit-test/Unity/test/testdata/testRunnerGeneratorWithMocks.c": "ea6887c98c35906e04e492cc06618294fef70f0bbbc9ca0cf1dd2ac3c14fe72d", - "libraries/coreJSON/test/unit-test/Unity/test/tests/self_assessment_utils.h": "10bdbaac9062a05157f23b55ff0959950db58627a4e597a72457ba0e0a52fad9", - "libraries/coreJSON/test/unit-test/Unity/test/tests/test_generate_test_runner.rb": "aa5973d07defb058f5315bc019be5870cf26ce777b6fdadd096a1295c0dd3a28", - "libraries/coreJSON/test/unit-test/Unity/test/tests/test_unity_arrays.c": "d340ae1c4ee5adc036ae1df3c6cec3b367e377ebc64ff02c304208b45940a8b2", - "libraries/coreJSON/test/unit-test/Unity/test/tests/test_unity_core.c": "cab9f80d420de32861c24d5aad4dfaf33798421435b8d68449c28006c099495e", - "libraries/coreJSON/test/unit-test/Unity/test/tests/test_unity_doubles.c": "0906e71818e5a8587f5e8f14104b1c5bed4771546f1def063916389e0d39ff37", - "libraries/coreJSON/test/unit-test/Unity/test/tests/test_unity_floats.c": "6f5d2f085dd4a6b57fb3a5257c92361d3e7b1e8be852e4ea97350faa3d06f319", - "libraries/coreJSON/test/unit-test/Unity/test/tests/test_unity_integers.c": "7ae4621f827081f4d61184c0430e6e67c2cb2299cf28f095b11f4ff10bd75224", - "libraries/coreJSON/test/unit-test/Unity/test/tests/test_unity_integers_64.c": "1ea47affa74ec83082db084ee008fb32f3eee94b880b60b7cdf86d2662418ca8", - "libraries/coreJSON/test/unit-test/Unity/test/tests/test_unity_memory.c": "a68346b5cb42e18b0e92ab53a60c62f7e5243ea1e105d27a32965db79ede1ac1", - "libraries/coreJSON/test/unit-test/Unity/test/tests/test_unity_parameterized.c": "af59c588f7322ecf035cd87f19affd39ca7315393c4713dd7344432f9542fe12", - "libraries/coreJSON/test/unit-test/Unity/test/tests/test_unity_strings.c": "427545971b1ca377ded2864d7d14a2dd492b4bf92cc3f1bd30148e42b03b0ad3", - "libraries/coreJSON/test/unit-test/Unity/unityConfig.cmake": "addf5bb044d859fda5bf93b7060df91e3950c813c84a460ba65f7eaba0fac561", - "libraries/coreJSON/test/unit-test/catch_assert.h": "de1bfd864b4f994720f3393a4c735b13091270fa22b263d9af1f35a0dc80ce83", - "libraries/coreJSON/test/unit-test/core_json_utest.c": "d1447cb75cf973867bab5a78dac56fc63a2e9a505ea883e609561fbd9a91f36b", - "libraries/coreJSON/test/unit-test/unity_build.cmake": "0bd532c05dac6876647508256c5c50ff87b2c2017ab9e3cb866cf0722edc1ddc", - "libraries/coreJSON/tools/coverity/misra.config": "0937a68953239f2fcd82d515d8c516c33ea30d4dc7719e279076d76df834df30", - "libraries/coreJSON/tools/uncrustify.cfg": "55c02144fdaa3d62e03ed97e3e89a54b67d9433a5320ec02ec82e75344b21656", - "libraries/coreJSON/tools/unity/coverage.cmake": "44684d66e5193f6c54e47c677c1efd3251f4e83c9893e336918dd90e72c922bd", - "libraries/coreJSON/tools/unity/create_test.cmake": "086650d12714429c4130c386417e1aef985421f26c4c82a209ac0d40f71c1cd2", - "libraries/coreJSON/tools/unity/project.yml": "12130e50fcf569eaee1c82ebf43c3accfdc599b0f42064ea6819a49f2089eb2f", - "libraries/coreMQTT/CHANGELOG.md": "c6eb4c75121ec7aee094eec27012323ccfb292619fdc3e0cd0367d01135ede58", - "libraries/coreMQTT/LICENSE": "508a77d2e7b51d98adeed32648ad124b7b30241a8e70b2e72c99f92d8e5874d1", - "libraries/coreMQTT/MISRA.md": "b3a5a2002278248e081dcecf5b4cf10d25ce10cf369be2d23e519cbec4e175b4", - "libraries/coreMQTT/README.md": "797ea7121a4716d27a756c604bf9e6ae20f4fb9755acd9a69d3e16330cdf16ab", - "libraries/coreMQTT/docs/doxygen/config.doxyfile": "ae481bdff8ce9b0583937702e190024332c9434e8655cb800c84c995ef31e00f", - "libraries/coreMQTT/docs/doxygen/layout.xml": "555a70789f54c525456ad9d30730614fe7119afb8b81dd8f8067af28dd14f66c", - "libraries/coreMQTT/docs/doxygen/pages.dox": "ab5b11eaf04d14f5f15b0242a2bb19d2a94bd9b1dd26647dc19f9012fe8c2f6d", - "libraries/coreMQTT/docs/doxygen/porting.dox": "1edb176f2260e8a6d3115286218f5791e664a48f2a939e8e03e9c784cbb42491", - "libraries/coreMQTT/docs/doxygen/style.css": "e3d3b4438744aa4d547bcacc6e64f3fcfc5057b476c5237e5107e6bbe0aac72a", - "libraries/coreMQTT/docs/plantuml/images/mqtt_connect_design.png": "21b94da4fcf887e92a6b69792e0438a2606e084670106bda53ede60d77915b92", - "libraries/coreMQTT/docs/plantuml/images/mqtt_processloop_design.png": "e840f26ce3e411d3eedae32073a9506b000f44b4b328df68d6c854fc423a3e43", - "libraries/coreMQTT/docs/plantuml/images/mqtt_receiveloop_design.png": "cecf49d04c44aee8f69ae2ea5c842db85973e43aba2fd7c3da04da6768931b02", - "libraries/coreMQTT/docs/plantuml/mqtt_connect_design.pu": "58d747147b1bc68565dfb0d64c0f13a3134778465209f3c320232641a915a999", - "libraries/coreMQTT/docs/plantuml/mqtt_processloop_design.pu": "3682c146c15953956cbaf2121c35aac02a4706dcc953841c15c7b0635cdaec42", - "libraries/coreMQTT/docs/plantuml/mqtt_receiveloop_design.pu": "5d271bfa63049501d47af872eb96d0aad770fdb478ab58876ebadcc7b46dd733", - "libraries/coreMQTT/lexicon.txt": "c3d26633ae8ff3e748ba0e269c06d0057b12319070e9a3fdecfa6136f24e4c36", - "libraries/coreMQTT/manifest.yml": "b3f86f6fdfb824520318a2b04895882eb16ffe985a1eb8c5b10c616d86fa18bf", - "libraries/coreMQTT/mqttFilePaths.cmake": "40ee4b2022a23805a8bd4902404e6c3fe32a6ba0981d9ca7d2ac8521859c8d11", - "libraries/coreMQTT/security.md": "8063f29b315032ffdb3d4c37d003292f77ea1177d05ec3896614f257fe931723", - "libraries/coreMQTT/source/core_mqtt.c": "2f0d56264736ce026549b99f991ebff0f602fb289ad8b22a4c94ce7836aad1ca", - "libraries/coreMQTT/source/core_mqtt_serializer.c": "8cb09c807d8aea914a0a3268c46e882ee42951e14ea19abbf96245f814d4b4b2", - "libraries/coreMQTT/source/core_mqtt_state.c": "f3c475d175f0ddad8f32807282a4276f95375bed82a67080dea41ae7cf490c8f", - "libraries/coreMQTT/source/include/core_mqtt.h": "bf37cbe64fcdd3a24a0d0d5c2c5daa69472120f99c9529dacc76a4e10e721a62", - "libraries/coreMQTT/source/include/core_mqtt_config_defaults.h": "60a4e109544b2747acbe34d1438a97e85e55920a960e040cf154373e1ae5f709", - "libraries/coreMQTT/source/include/core_mqtt_serializer.h": "9eb9af54f2c0ca091cd63d7eb3e3fc0313e18219871d172fcb240fd1ebca8898", - "libraries/coreMQTT/source/include/core_mqtt_state.h": "11ea1c958688041d768135c37d6d35fe54c8d4033db5c9421a15cd3b4486e208", - "libraries/coreMQTT/source/interface/transport_interface.h": "3a54afc049708febbbc7d66953041d394143a4775724d0e363492267a6de26fa", - "libraries/coreMQTT/test/CMakeLists.txt": "329fe5c02c29d0daf12236504e13097296b3f10c695fbb710590270ac3fcbb68", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/CODE_OF_CONDUCT.md": "34b6c98d5c23127ae6769e95e483e5bf6d3704ae1f0d3ae4e69d15f4ede118b6", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/CONTRIBUTING.md": "b050a75d5f6d2236ed40ad91dc53c4a4b30da184f9298f6f18507beae5fd7cb7", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/LICENSE": "09e8a9bcec8067104652c168685ab0931e7868f9c8284b66f5ae6edae5f1130b", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/NOTICE": "d4290ed64c2edd0fce1d84e3f9dfb2881240fe534def76b8cd29ed6af683e287", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/README.md": "d1de02d49f1baf2d8f376777731ca952eda223d23faf6f87ac17ec5f6eec1622", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/scripts/setup-proof.py": "250c684e31390f2831c4833b5bb642fcb9246e14a73e4e71aa64717c866d30ce", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/scripts/setup.py": "15eaf8dc1a3921b6ec647396e504b6f1346ca37aa7aea46a73110e5681211b2a", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/scripts/util.py": "7cc883f38bbe3a34f1be2f78655131f82d89356112dac292edbf9c5ef4de11b8", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-proof/FUNCTION_harness.c": "f2802074ae7080f73b53081f262c7b9f7245b8ef1e4fd4e3dc88262a2453af4d", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-proof/Makefile": "b7311b8cdd2f100da52ed793ddaa77aab0e8943e06cdcd2b29c05953c869e5a3", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-proof/README.md": "9abd31be7593b6de5507a36587f18298e870da24e2c2f2ab1235e9e04464d6c7", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-proof/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-proof/cbmc-viewer.json": "31c095521f43d2b919f96351d52b5900653ef3813af1c055ef88cb01114c57b6", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/include/README.md": "1ebb917adfbfeba5019583d75438c3f745da8a93752e88b1b31bdad351a1ac9d", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/README.md": "dda48722cef39f7482baa20929815222d6cb643541505af7ac0202ab4ea30675", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/assert/Makefile": "8eda2c18734c4e1a2b07bb5cdbd5b7d5974651184a8dd594409e122b52a06416", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/assert/assert_harness.c": "034f86fc93c6cf928500721ba5bcf9b96f327596a2b931b52474ddd66c765941", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/bounds_check/Makefile": "142e70065dfe3d20bfd83d4566a26e60a254d410111d9af072e31e96b6209cd6", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/bounds_check/bounds_check_harness.c": "b1b242ef2cbc76b275951e75d87fe07d181a3538b1fc8c31839883f8eef80a11", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/conversion_check/Makefile": "97ff3a0a72e2ad71f520fb3875cfbbd3a1124df6236a14930948343fd3f219a0", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/conversion_check/conversion_check_harness.c": "89c63b828b051da2e0b0767cd2704419c389d5390178cbdcccfe591940d42da1", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/div_by_zero_check/Makefile": "3367383673bcd9262b9b61fff6c4961abe70aa2ffb3b8e3f59d014d94927b84c", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/div_by_zero_check/div_by_zero_check_harness.c": "d4255afad71ad03efc1729c46bab842f1d3727967eb75c0e41d26add25ae684a", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/float_overflow_check/Makefile": "49ffbdb80bdb47fef8c3f2af3e2445def5a1fe764285f7f28163ff55206e0cf4", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/float_overflow_check/float_overflow_check_harness.c": "0b762450e1abdfdb6eefde48545d0ea51a5699727ca46decb8aa6893dc0bf684", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/float_underflow_check/Makefile": "3a561f39099cc9a6783bfc779c56a68a08b61c336f44cdc3b957868651899354", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/float_underflow_check/float_underflow_check_harness.c": "8b84e5fefef6615ed4518834b9861bf07ebb35db8583a30c26d09f8d04bf4381", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/nan_check/Makefile": "440a4b02b6bcaa94c95c33b900ba5febca83aed17990c30b5dfddce246c9f29e", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/nan_check/nan_check_harness.c": "8376f52bcb36282975be5749f61179bffb5b5ced4161e39c68ef86c3792f09bc", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_check/Makefile": "ecd0cacef27ec44df5af35549e801aa4c17f4078b3d4b5beb3e73dfc787f54c2", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_check/pointer_check_harness.c": "662e399061f5c413c8ace57886174b11e755cb66999a90950409bf04d8cfab07", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_overflow_check/Makefile": "f1875b30dfc83287132387682a13e435a82b11186707526d39a4e10794cebb04", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_overflow_check/pointer_overflow_check_harness.c": "118c0a62a647d824f98ec779956f89b540b74206c4f81f83298d6440fa1bee16", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_primitive_check/Makefile": "131b7ee0daed69e68bdb7a949ddb5667f216a3912522ca69019871a81d25f10d", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_primitive_check/pointer_primitive_check_harness.c": "ca0e47a48fe2a0023f6c5e7e410efd5e90705d39864b3be48322f5ac82f3398d", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_underflow_check/Makefile": "5208e5e4348a5c4bb983af1c1907d7531b5988b89589ca569fbe74a8f6daff69", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_underflow_check/pointer_underflow_check_harness.c": "effb8b9837ed060a1b9a1c905afc5003bebe4832a27e7bfec940405b2e6eba52", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/signed_overflow_check/Makefile": "e08765ec88321f8f909a417af4d4e528222c32ae1224bc120a518d851accb3f3", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/signed_overflow_check/signed_overflow_check_harness.c": "1083db8aa4fc4bdcc3b89d3723d0fe58e529c330a21200f3ddc75adaf7ff9956", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/signed_underflow_check/Makefile": "4d970e22f170d34ca5c2b92db785972eb9e0529c1f68217da5eae1b86cbd2944", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/signed_underflow_check/signed_underflow_check_harness.c": "040b507614725741b8bb8d553b12d273aa7e165253fbe17e9e9cd58102d01409", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/undefined_shift_check/Makefile": "da67123ebdd610d48888064339a1180c0ebdc662b7d19c68f97a120c9499f84c", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/undefined_shift_check/undefined_shift_check_harness.c": "0f643a2aad93e70fc540f6aecf3046063a09817e5c4bec735c88ac7820f62ff2", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/unsigned_overflow_check/Makefile": "e90461e92d5257521b9c4766beaa3ff986f35dc2c7dee695f983e88baff8e2aa", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/unsigned_overflow_check/unsigned_overflow_check_harness.c": "b85cfcacd82a28417112248f72e8f734cd7799b1df4360734caf186c775669a5", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/unsigned_underflow_check/Makefile": "03beb64ea16f9748f3d739572b850371444fcafe762a51b4240bb9bbef85fdc1", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/unsigned_underflow_check/unsigned_underflow_check_harness.c": "70f9f7cbe112c6610d9785a425bb43f098e80cefce795a1f79bdda03220d6c06", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/Makefile-project-defines": "9f1fb40fa45392f32901168bf4e012b78adb71e2daf6864d4a1a7d76b84f6f51", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/Makefile-project-targets": "d8c3930590646a4a3b5f5ed446758bf2d8b27ffb742dee196efb816ae2f502f6", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/Makefile-project-testing": "acb51f25870892f177057e7f56e73979e0eeb4967e3280aa160fd33a1a7bb03f", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/Makefile.common": "e23552ebdfa3fdba1bb158d8c868f139f2411a261c8d88f36bf9e2d6c076a21f", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/README.md": "142dc28dad300138bed3a174bdb7ce714f1c6a882299440e63552e2bebd2f7d0", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/prepare.py": "0d50cf7aece2c4f205a058ddb3bf6c1b0c1cfcfa9ea6dca9a145f1bdd7a442f9", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/run-cbmc-proofs.py": "aedcb62405ffb22af83c4b4cb38a665b57bfa3ecd102d868056b315306a26734", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/sources/README.md": "cfaa166351aeff46c321fd5627d417278accf8e88155481f678702644ce88138", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/stubs/README.md": "a87bfd893269da4a5c95f88369ce394b1e031dc6dbfd09195cd11485b77eac7f", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/training-material/CODING-FOR-VERIFICATION.md": "84c354dc41a70be81f085e6cb75f8328980b83a68333f179bba3fb69fee29bc7", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/training-material/DEBUG-CBMC.md": "d7e3ec89a44e5efcd8c2accac852bc9f261df54445eb4b3d1b4ffe5126abe6d1", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/training-material/FAQ.md": "d298098f6ead244a7d815aae24fe005e0ea09848abe42dd255694d42632769f5", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/training-material/PLANNING.md": "06ffd2048e70658246cba4359d5bcd121868238ca918041a874fddf311c22a8b", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/training-material/PROOF-WRITING.md": "2c037872b6c0994de2e0028cb9e7a8923342cacb2b6e3adc1c6f4ef3971a950d", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/training-material/README.md": "e453beb7cb3e4064bc6c85102c00176bf77b14e705046b8d8138c1614e237b12", - "libraries/coreMQTT/test/cbmc/aws-templates-for-cbmc-proofs/training-material/checklist.md": "000710d7ef9e7e716ff58869dfd7efebfa9d7b017672812d089a55698494e52f", - "libraries/coreMQTT/test/cbmc/include/README.md": "1ebb917adfbfeba5019583d75438c3f745da8a93752e88b1b31bdad351a1ac9d", - "libraries/coreMQTT/test/cbmc/include/core_mqtt_config.h": "862bbd75a7f93872530b5b6dd8b359eb85390fccae88bf6a94681973a695e109", - "libraries/coreMQTT/test/cbmc/include/event_callback_stub.h": "ec72f70cee375a9eac97b2af33ab9beeffc43e74d98fe3b6c10bf3b7c3094daf", - "libraries/coreMQTT/test/cbmc/include/get_time_stub.h": "5c2cbfe4bf9765d892c1d058e7ba1f0feb52fe44340ae3c12219238bdc25aaf8", - "libraries/coreMQTT/test/cbmc/include/mqtt_cbmc_state.h": "4b44117452114f105fce584ce292e21f77ec138917b1da96bdefc9e6272d41e6", - "libraries/coreMQTT/test/cbmc/include/network_interface_stubs.h": "9fe618fbf78e39f8a2c37daa5705d0cd92ac401b783791092416fee8773d6fb4", - "libraries/coreMQTT/test/cbmc/litani/LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", - "libraries/coreMQTT/test/cbmc/litani/NOTICE": "becc1029d600695c22c6c3dbe3a8b7824b539d9b7ed533b4ecebbb259dce2d8b", - "libraries/coreMQTT/test/cbmc/litani/README.md": "f15f69182a049661c0795534e03b6d4e5aa0a8093d5da4421fcb655eb27f7681", - "libraries/coreMQTT/test/cbmc/litani/THIRD-PARTY": "83a5fa777a8dfb9127d69e1b0b9d776930530258300c41ac8b2180c5699bd273", - "libraries/coreMQTT/test/cbmc/litani/doc/Makefile": "af66c3b302388d09608d2c335cbea6d74398f1f5a8c4d56c86cd705947bc0689", - "libraries/coreMQTT/test/cbmc/litani/doc/foot.html": "1694311aa8f471c9904dd4588965bd326173f216e30353e5d65f64371007da1e", - "libraries/coreMQTT/test/cbmc/litani/doc/head.html": "76ce1041a11873360e6cda911a970b337d2191c125c5d6910798bc836d4d81b6", - "libraries/coreMQTT/test/cbmc/litani/doc/index.md": "83267d5fead2464a853bc29710fd68793d94a32119c280d89802ede900a1dc08", - "libraries/coreMQTT/test/cbmc/litani/doc/litani-flow.dot": "bfe01d6fb726571e82beeb4df7751cd72e655b8527edb8ffc4244247537d036b", - "libraries/coreMQTT/test/cbmc/litani/lib/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "libraries/coreMQTT/test/cbmc/litani/lib/litani.py": "31844ab14bae0b891200331e6ffeced6a5dd26c3c95c86e160b3344dfeb38d8c", - "libraries/coreMQTT/test/cbmc/litani/lib/litani_report.py": "9cb5d588df49b4a93c101b674c4c96a3e355654130a88c5fe4dd03703145858b", - "libraries/coreMQTT/test/cbmc/litani/lib/ninja_syntax.py": "74cf8d2ba381b447796b4db7933711a1844284b192cca23638bfc7b21a54d4f3", - "libraries/coreMQTT/test/cbmc/litani/litani": "975fe534cc3281675d158416f4b5ed79b0b9fa5345d3f0944844ef2227498c84", - "libraries/coreMQTT/test/cbmc/litani/litani-progress": "a3c0f0873b06e801587dbbd26aeb9382fdb60b97efffc56b9fbbae9d3627c9fc", - "libraries/coreMQTT/test/cbmc/litani/litani-report": "ea9aee104dfc7a73cb89a6b01c8ebb581e7fc6e9b4f30796bb96ee07ae5795be", - "libraries/coreMQTT/test/cbmc/litani/templates/dashboard.jinja.html": "224c4855cf8079003e72c57ce2aa7429bca50924f6d9b5ccf27a711a19844798", - "libraries/coreMQTT/test/cbmc/litani/templates/file-list.jinja.html": "2151bd3c71559e887d64ba471522f5fc4eeea7f261d118672d390cef3c5fd856", - "libraries/coreMQTT/test/cbmc/litani/templates/pipeline.jinja.html": "d22892a6cabbe10c9aa51603cb763492012d2212e142b3404fdcf34bcd4e848b", - "libraries/coreMQTT/test/cbmc/litani/templates/runtime-box.jinja.gnu": "ae73382f2cba9ea418fec6f163192fbadab884296d55ca58ff4af86cfa257baf", - "libraries/coreMQTT/test/cbmc/litani/test/README.md": "c1e5c0ec6b79a30040e88986dc84d15917712af49a9989aacc1542c725a7f652", - "libraries/coreMQTT/test/cbmc/litani/test/run-tests": "0b3af49895a6b7d57e9889139f3ed20c028a7611c140e977583a27b7f4028d50", - "libraries/coreMQTT/test/cbmc/litani/test/tests/1/Makefile": "a2ec421ed917ecd59f4c885faa487eeed30b59d3f8f09f863a00d240b2bcb983", - "libraries/coreMQTT/test/cbmc/litani/test/tests/1/litani-test.sh": "b1cb5ad8b6c5b640659fddb32988d986b27bded9cf3f1a08fd1ecec87f730e93", - "libraries/coreMQTT/test/cbmc/litani/test/tests/2/Makefile": "3531c2a1733b48d064016a34b7582874a87757ae279d1c5099cfd3ba6c5f2f3d", - "libraries/coreMQTT/test/cbmc/litani/test/tests/2/litani-test.sh": "b1cb5ad8b6c5b640659fddb32988d986b27bded9cf3f1a08fd1ecec87f730e93", - "libraries/coreMQTT/test/cbmc/litani/test/tests/3/Makefile": "3793c6940a452f1db086977f59e648b89c90aee688ff323f5ae597844078cf66", - "libraries/coreMQTT/test/cbmc/litani/test/tests/3/litani-test.sh": "c95d186c612c5a62e237ee1613e4a51f830c81f1cbc6db442a2ce5f4f67b1fc7", - "libraries/coreMQTT/test/cbmc/litani/test/tests/4/Makefile": "3793c6940a452f1db086977f59e648b89c90aee688ff323f5ae597844078cf66", - "libraries/coreMQTT/test/cbmc/litani/test/tests/4/litani-test.sh": "b1cb5ad8b6c5b640659fddb32988d986b27bded9cf3f1a08fd1ecec87f730e93", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Connect/MQTT_Connect_harness.c": "c41c091bfe97783b398b09db18b70946df6599ab318fdf6ccece00b9429bc68d", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Connect/Makefile": "a76f790acb4b9ae3f5fe65cf9b21cad9c989b681c43d16e2f7f18039c50c8269", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Connect/README.md": "56ef61cf1649982459e19664c8388fe891ac22cd9ace86d02e9dc19cc237fb58", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Connect/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Connect/cbmc-viewer.json": "cab584fd42fc0f278ce71342de8d61eaf2d76a29fabb4d20e47bfc23222a28e1", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializeAck/MQTT_DeserializeAck_harness.c": "cf5a229ea96395f3897935dfbac6f035be072987b1177f4a9ee7b7652b0557ce", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializeAck/Makefile": "19b8901b34714c2f43dea31f92c8d3d92ebe2bbd3cfc64ddbb8662fb0425255d", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializeAck/README.md": "7a7d6c9942e7f500d437c5a719f1a34058e359765400dcee5c92f863f4b5a571", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializeAck/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializeAck/cbmc-viewer.json": "64303ecfdb4e576970e009599853582974cf2f127e55ec4b8abd022806edad84", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializePublish/MQTT_DeserializePublish_harness.c": "245fdd42080e0bd1d004ef1dabf6728f00876f8ae497983f73394e9d2e6710a3", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializePublish/Makefile": "0898d4140cac0be565d0f9d2383efb29956864f55ef17e04151ba09269426815", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializePublish/README.md": "75cf3eaace92611b83a309ed9dfd488dda51b8f4f4917ba4c502352bb46ce144", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializePublish/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializePublish/cbmc-viewer.json": "47e712b26c107b25f7aca63d3b947acf9f056f28bf3a9bea108a591b237cbeed", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Disconnect/MQTT_Disconnect_harness.c": "62a1dcfb08ed8860c47ea7969eb6c48e11eaa8867e937775363d61e9f3eeca1c", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Disconnect/Makefile": "a10513d306d332c8883687913b5d8d1b4fc24c1f550688031455f03be482f3c6", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Disconnect/README.md": "ec8d0fd2765e652ae921480aed0fb834ca7aaeb29732be426c57d1869c310454", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Disconnect/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Disconnect/cbmc-viewer.json": "bf4978a78d0061026ae9f78c03ccae0ee1e6cdcfb39b7350d2aefe68cbd9ac98", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetIncomingPacketTypeAndLength/MQTT_GetIncomingPacketTypeAndLength_harness.c": "e894bb1f6b064a962d2dac824a23dd7602ade177fb16a70e366e45a600aeeebd", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetIncomingPacketTypeAndLength/Makefile": "4423c7597e296f08c0f7cb9de52d945377563ec3e2f02249fcf6d903648dbc9a", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetIncomingPacketTypeAndLength/README.md": "3f5540f0a13298b8f90721fcfe9ba561cda091cdd6797c2c3f8b85b57b0812f2", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetIncomingPacketTypeAndLength/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetIncomingPacketTypeAndLength/cbmc-viewer.json": "97a42a4e5454069192e8d0e654a6805782c587af560b08f17a095682d8d1cd85", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetPacketId/MQTT_GetPacketId_harness.c": "91f91fcc31ea8c9567c3b58ad685e2c1f6cf34e3b77c0e386520024448958ac7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetPacketId/Makefile": "1ab9da1dacd1a33713a2e2f6848d97252fcc47fb9489633c763a41761af1b025", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetPacketId/README.md": "173028ffc86135f832c5b763987f0cd623b1949d46f94afe6f24ae27578a7a8d", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetPacketId/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetPacketId/cbmc-viewer.json": "ee5d6d6e29ec44fbcf95ba512a32fee52b5b333b6fcf432dc57b8d60f64840a1", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetSubAckStatusCodes/MQTT_GetSubAckStatusCodes_harness.c": "9c52aa70924c19a497e0d4404c3ef199d537292fef39cc3d7da1e609ad0d8839", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetSubAckStatusCodes/Makefile": "fb43e3ef5da978ba636b9b8c94984988fe5ebdf417608cbee901d95135f6b658", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetSubAckStatusCodes/README.md": "2d74b1a9895f27194a11a08d5e2690145ea717267365446f93d676865b4338f9", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetSubAckStatusCodes/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetSubAckStatusCodes/cbmc-viewer.json": "6abd54df401cf3bf8ae26e1515e34e0bf794565d5666b1d8f0c411ae61156157", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Init/MQTT_Init_harness.c": "36631f88308aa32358c9e242c327bc89fd540a20fa9d2907ce23fe4b47083b9a", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Init/Makefile": "55515078de553566bf63b2df808b6e2a3b2fe6edd48069f3d28ecc0d8c79b7a8", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Init/README.md": "ca6a087edcbeb2cd36cee08b509952e2fbaafdaacf5cfeb12016b327dd67d220", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Init/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Init/cbmc-viewer.json": "72a69eeacc6efe57b089a25f951a7427b1985d439812512c92e284c0279add2e", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_MatchTopic/MQTT_MatchTopic_harness.c": "bddac2f9b7d55824919bf371ee80b616548b47d4adaa80e080ffcbddd1a34616", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_MatchTopic/Makefile": "6a167927fee24f423215499a6f810050b54ff0ba96d0ff50f951a8a01f7273a3", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_MatchTopic/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_MatchTopic/cbmc-viewer.json": "b69a5577a7b673b1c40b34949efac35ec6271451079862825401b3d2a128d789", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Ping/MQTT_Ping_harness.c": "fd45cca3a1af84c0349b9285a2edbd745ac0054d88ea38416d535156f89819d3", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Ping/Makefile": "3a84d9afa0cc8ef70f6f4de03f2ccef17eb808c8d929793642e7aef5bd166ca1", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Ping/README.md": "0a93c1b497a1c52a6121e92c071d6e4bb9e168b17555ed1f9c0f6d9053a9b113", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Ping/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Ping/cbmc-viewer.json": "f6c242754a1c117221b01a11f7cdbd0e6438eeeb520a6a0a842e85b6f6f07ef4", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_ProcessLoop/MQTT_ProcessLoop_harness.c": "e656fb0913ef3a598688caf6f54faad4084fe50c40b968d5847e95da62feb1cf", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_ProcessLoop/Makefile": "48b0d57b7f25be04e4407c84bd5da642b76691dc789b26b7e591eddd3fdc46d9", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_ProcessLoop/README.md": "241f1632dac11c88647d93a537e843febe8aa7cdef51a2eb8f222c2ef54d9f14", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_ProcessLoop/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_ProcessLoop/cbmc-viewer.json": "79aec48e68b39c6e4d339247d55b72186f0d8f3ed8baa54d7005899a09f8ec98", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Publish/MQTT_Publish_harness.c": "da56ccc4842acc942c33992ce22fb87c5779aa12592529098f2206a9442cdaf5", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Publish/Makefile": "879840e755a86e9e5b8e75297cd0944e6851c0c0f3b1e7cdb43dbfe53f85b1a3", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Publish/README.md": "020fe4a980704d4ca277ba5f3177131cd4ca17cf8cb50932fc77239270f090f8", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Publish/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Publish/cbmc-viewer.json": "9b69f8a19dac6acdeee2eddfe653599008df1502df115c7ed861d8920ee8a745", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_ReceiveLoop/MQTT_ReceiveLoop_harness.c": "0994de351677a9adeb60cf71976b320ba72de5f8f262df6caaf8e5b75908031c", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_ReceiveLoop/Makefile": "07199912ad091ec8eabb858b1928409962ee62a220e8bc56e437717e165dee85", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_ReceiveLoop/README.md": "e374941c2cfb38a528b50eb6ce77b8642feb4d471c283290ef5bf893e6f6f6be", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_ReceiveLoop/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_ReceiveLoop/cbmc-viewer.json": "8dae172cd3cf76f4857621a32a943815dbc64b767be0dcbdc6f236c1ce73d87a", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeAck/MQTT_SerializeAck_harness.c": "5aa230f88df7faeddd72c9d322d64f20c6bc36865824232f6b09a9a54f383941", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeAck/Makefile": "404d6903622abbee1a5de868d65dc96aa702994899139f91db4825f4226f30c9", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeAck/README.md": "5e6fc8595d1fa6e42e46f89b1c82a699f42776068ef8842d3028b3b5cd930208", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeAck/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeAck/cbmc-viewer.json": "97acbe10b64118abc2c50a2ce9b6d41d20c9636e8eea4eb1f690965e338f3dca", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeConnect/MQTT_SerializeConnect_harness.c": "8c85f48ec818343203782e2f360da69acf4c9d245a8cd2529d6f5f6e807d5eb8", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeConnect/Makefile": "be52f16379b711c424bc9630d52005c3944c5a40a85847c33daaa22282e33656", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeConnect/README.md": "8176a747d19bd17bbc0e318858ba82c9ed1e35007766e79d294ca26e4772bc0a", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeConnect/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeConnect/cbmc-viewer.json": "46d696d30594fe3ad0320f9b3fed7948ec877c87df95f6b48aa92dfccf29f5cf", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeDisconnect/MQTT_SerializeDisconnect_harness.c": "bad51abf8558418c1c3e82d8e8291db29f6f81592f81d00df25e26f022d481b4", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeDisconnect/Makefile": "1b390c0119f425bcfc4eab47e1e89e8dff524892eeeb4b22dc14eb0d3e899e4f", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeDisconnect/README.md": "6cfa4a964cbebddb3273f54787c4fd387517cb7dfa41ad52db1b0d4c831b6a42", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeDisconnect/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeDisconnect/cbmc-viewer.json": "38376b24ad94f9802301d5a2d15aab04cbc83b464756ec8fa6b82090b5f64df8", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePingreq/MQTT_SerializePingreq_harness.c": "f44d78cf518a234912c7ef4d108439e69b40e70abc5d8d7023637719a52a68a5", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePingreq/Makefile": "94f1c85d775e5a90888d9d50ce36c4c701c25c26d110470765fc0a0dc965a33d", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePingreq/README.md": "d6a9f488491dbe597490c3b5534bc230e43f468f7198bc785223303dd55b14ba", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePingreq/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePingreq/cbmc-viewer.json": "eb118ca44d049c8bb9872e3d73601a3643c7fbb4e7939f078be32a6f89d22c52", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublish/MQTT_SerializePublish_harness.c": "ac1a83426b1553481f2fc4337ab0e43fe6fc1f6626648accf01690a1694cb9e3", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublish/Makefile": "60798ba1e5074e3e3eba28bb25106304799fee5744760db24274a48648b849c5", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublish/README.md": "2b7bd481ec1b8ec86339cc9489108660d9565014fe188c3675011fbf35418162", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublish/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublish/cbmc-viewer.json": "907873e23c42a57756a18e3e179ad347b7b70210297a0abea7322b1c2f47545d", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublishHeader/MQTT_SerializePublishHeader_harness.c": "19ddb93e4c2465bdb50487d36fb4f980249a688d3df164e835e42a6d424e6fbf", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublishHeader/Makefile": "59b6107ce9da982749fd594741776679a178cd0edf9ae01a37dd7083f6fd96db", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublishHeader/README.md": "bf530b289a27f153bfab861208c39235e68e6e6af7e139a64a60cea749609deb", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublishHeader/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublishHeader/cbmc-viewer.json": "80c29042213ab8cc35df703b910864447ffd197a30c8092a3f44afbc980e077d", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeSubscribe/MQTT_SerializeSubscribe_harness.c": "7888d3e662171b2cb0fd4694b0bf25af8fc1d0e6a56dd9c6c45c25c01ac73d1a", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeSubscribe/Makefile": "deedd106c13ce55b92cec98187e9fef8f204aa89dd267c3d75cd4b8593507ef3", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeSubscribe/README.md": "b604ae8cb53c551e05cc34995632bf589ffa4cb6ec423c2222445a3b5b67f8fc", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeSubscribe/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeSubscribe/cbmc-viewer.json": "b2250403fe8c62be92d03a4074d14389adb65c6011dd377024c132cf4b6ca846", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeUnsubscribe/MQTT_SerializeUnsubscribe_harness.c": "170897c6ec216e4e8b7535d29ffcdab8c867423bfae49e453877bd88c6b0c6e1", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeUnsubscribe/Makefile": "518841906dfbd49f5aacf7b6cc8d22a65497c9def47c2ecf2a7b0e3bc6205b5c", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeUnsubscribe/README.md": "d2a2e6132e9813e8115c8456f44d6a47ba0694c164ca5af7d623cc42bbf64cba", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeUnsubscribe/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeUnsubscribe/cbmc-viewer.json": "825c4d6438cc955585f8cc96d1e0db10dfa339b3b8e9affa649ba80290d14bdd", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Subscribe/MQTT_Subscribe_harness.c": "06bc663a1826d95eeb60a46236fcba641511053974be20fc691b464693791da6", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Subscribe/Makefile": "df44df207fb78c123d1f485f69525d94b229c22ed6a9ddc57cdb0893b3aef97a", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Subscribe/README.md": "3030e6395ffdb3ad5e06cb6c4eac7f547b4b449cbff149eca48d0457b16b4a3a", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Subscribe/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Subscribe/cbmc-viewer.json": "9bdd8ffaf8f974098a76bf0ffac325925ada3091a660b0350939762106e267c9", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Unsubscribe/MQTT_Unsubscribe_harness.c": "83c696d3f956ed5f997475e1b28c83aca2c3b328d49927fac853cbc56820516c", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Unsubscribe/Makefile": "d73c02ecab06c21886b82799b5229ccf81da83ab644da39a17d166fdaa1b051a", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Unsubscribe/README.md": "0cea32d7b5aa59d40f68bddb1d67adc4dcbf2f0f8f8a9d8ad4c138bcfbbd77b8", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Unsubscribe/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/coreMQTT/test/cbmc/proofs/MQTT_Unsubscribe/cbmc-viewer.json": "a0869989a2bc70187d7895dddb395904eca58cc2b412d6c623adaefb9be8c6e9", - "libraries/coreMQTT/test/cbmc/proofs/Makefile-project-defines": "76e22aea31f930b26133e16927dc45124186f68f2f4c698e297653966a598d75", - "libraries/coreMQTT/test/cbmc/proofs/Makefile-project-targets": "d8c3930590646a4a3b5f5ed446758bf2d8b27ffb742dee196efb816ae2f502f6", - "libraries/coreMQTT/test/cbmc/proofs/Makefile-project-testing": "acb51f25870892f177057e7f56e73979e0eeb4967e3280aa160fd33a1a7bb03f", - "libraries/coreMQTT/test/cbmc/proofs/Makefile-template-defines": "50b3687413c3a9a1e42a62954b1007e270fadbfda068fcb8e796b1862563507f", - "libraries/coreMQTT/test/cbmc/proofs/Makefile.common": "e23552ebdfa3fdba1bb158d8c868f139f2411a261c8d88f36bf9e2d6c076a21f", - "libraries/coreMQTT/test/cbmc/proofs/README.md": "142dc28dad300138bed3a174bdb7ce714f1c6a882299440e63552e2bebd2f7d0", - "libraries/coreMQTT/test/cbmc/proofs/run-cbmc-proofs.py": "b37b71fb8ccf4b101ea1ffc65107c857f45fa6e228f1eb9e2041c017efd3319c", - "libraries/coreMQTT/test/cbmc/sources/README.md": "cfaa166351aeff46c321fd5627d417278accf8e88155481f678702644ce88138", - "libraries/coreMQTT/test/cbmc/sources/mqtt_cbmc_state.c": "aad4116ee19185306a152f9fcf14c30cedb2363a11640e378c025eed1b1f987a", - "libraries/coreMQTT/test/cbmc/stubs/README.md": "a87bfd893269da4a5c95f88369ce394b1e031dc6dbfd09195cd11485b77eac7f", - "libraries/coreMQTT/test/cbmc/stubs/event_callback_stub.c": "026a3cd17b0feebe1d895b9b377f77b06b6f0d824d1f313345be30cbea74aed9", - "libraries/coreMQTT/test/cbmc/stubs/get_time_stub.c": "1b04d0d801507505aff30409247af2bd6b23ab1feb20115d731fd8511142848b", - "libraries/coreMQTT/test/cbmc/stubs/memcpy.c": "4579fc723b89e9416fb39e9b7bb5efc1d7eaefc766de4cb2f6fbe6f77760a138", - "libraries/coreMQTT/test/cbmc/stubs/network_interface_stubs.c": "9f1d83a07dfc7ab58064a9cb0ff8be2fe366261c3ae48f92306cceadc0a3e683", - "libraries/coreMQTT/test/unit-test/CMakeLists.txt": "a865b6f4641222225eafb212cf50cd2fcc86c1b9054baa803efc28181f46b531", - "libraries/coreMQTT/test/unit-test/CMock/Gemfile": "98249ab9b0a5d95ca03b9b68992d29d944e132c0eb65e71bd6ffed9f0e40d98b", - "libraries/coreMQTT/test/unit-test/CMock/LICENSE.txt": "a228c2871b9a779a6542a49470c5b567f2806dddcbcf90af861bb4d39291626c", - "libraries/coreMQTT/test/unit-test/CMock/README.md": "7e5eda88c3a355bad26c706daa6350186c89fe1db148697192be99fcb38aa142", - "libraries/coreMQTT/test/unit-test/CMock/config/production_environment.rb": "53043c94478f0bc85135849a7ab04da60cb4fe37661550df8b9ad3b0d3936bf8", - "libraries/coreMQTT/test/unit-test/CMock/config/test_environment.rb": "a89de3aa45ddf4759f719421ec227594b8c6dd874e61d0972c771f92f81a8ac0", - "libraries/coreMQTT/test/unit-test/CMock/docs/CMock_Summary.md": "b1950eba2df737fb1a106b15b34a4e92b2fe7a601789ba481d92b6de60e4cfbd", - "libraries/coreMQTT/test/unit-test/CMock/docs/ThrowTheSwitchCodingStandard.md": "a1838b8c9e20ac3c15bf96742b716b6621c0607c9273ae0f92a6769e3aa45f41", - "libraries/coreMQTT/test/unit-test/CMock/examples/make_example/Makefile": "4180bf84b4a71086dcdd9e5f622c63be705981f8e98e311d7ecceb44940c3ea8", - "libraries/coreMQTT/test/unit-test/CMock/examples/make_example/src/foo.c": "0bec016ce8f7d6033049664c12cfcc5c0099e638fc6395e753b4d36ea2808d72", - "libraries/coreMQTT/test/unit-test/CMock/examples/make_example/src/foo.h": "e987f3bf49f430e2a9cb70bdd7105f8945e028d1598f361b30fe87a0585d97a3", - "libraries/coreMQTT/test/unit-test/CMock/examples/make_example/src/main.c": "23c00ca8f9cd5d89107f26d0804e1a2a6f8840941462ddd616f0fa33da7dd0c1", - "libraries/coreMQTT/test/unit-test/CMock/examples/make_example/test/test_foo.c": "6d2fe8d7ece7f0f8426fe684896c8bf76d15ea35e56add62d59558b47ee32347", - "libraries/coreMQTT/test/unit-test/CMock/examples/make_example/test/test_main.c": "73baf6160697615a9af98a184479a28e92d42fb82c0f310efea1b105910a3b0b", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/gcc.yml": "5c5d558eba12c2c31432472acf7e90559bbd351632f4cb80c3ee621e4e65969a", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/iar_v4.yml": "f5722f968d75bbe9af61c0ad0f01b6b98afa1a08185526ae49ba121bac937ce7", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/iar_v5.yml": "bcf8ab60e79e586b628e8c0aff5c50011dd3db2695468b2ca6b8c25d3783e506", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/rakefile.rb": "5e0b4e5ae6dd28e4d882b06f6a2f99e35febe6a799e5103d255b3d44371f6060", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/rakefile_helper.rb": "16770f78c965b0ea1fd29ddb817d8756bd6f8f3020693c5f0a867732b1488ee1", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/AT91SAM7X256.h": "284e49294ecd18da7c0b4abbf825cf8edb0f68884d334167c1f755b8528b34f8", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/AdcConductor.c": "b14eb5f4196976d82c9501184c0496ac5c071ca9a993ddab0779faea95810f44", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/AdcConductor.h": "961bcc853beb286a6ed95ccaf1b48337e1e36b8e543ebb60ce9a56b80238d8e9", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/AdcHardware.c": "e9aabd8f076c0d1738d6ea6294c0e16f15643ba19483b1ba6eee861f02cbb9e7", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/AdcHardware.h": "af2841747b2659b183891c9c4c00a2b7c065b51a8b958c35d4a6be8564326e10", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/AdcHardwareConfigurator.c": "06b303aab471c751073c25170c8b4bc5f52cd89eb52a29a0db32946975bafa6f", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/AdcHardwareConfigurator.h": "2ac7b673358582f4df15beb5956cb9f66b8c56882ddb1f8508314d96459aebf7", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/AdcModel.c": "885c0a3df693def8de467cc9d9cbb503ba795ffe379d65de02409f8fca2fe360", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/AdcModel.h": "3ea12eb954305556617507aa8983f26fe0cb7afb7c8afc71341056e6d8ca23dd", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/AdcTemperatureSensor.c": "301cb0b59970bc21f85b068d103732e4dcb55cdbb74536a242a2c45ea8151610", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/AdcTemperatureSensor.h": "2fddbdb25206928f3c016ef362174caaf735d683da8e246f8d01f191d3926b73", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/Executor.c": "0cdf97b9afa1e7f2da8580b93a19fc536ad83ff4ff5ad1e42013e795af5db025", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/Executor.h": "11a373abf8479822f68c5ba2c244c922df6366047531c7953b1a257833075a7f", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/IntrinsicsWrapper.c": "95796f352948558443ea6000f9b1237d5b961d2275d12d7b4d33c6d05a4b90d6", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/IntrinsicsWrapper.h": "89354ee37181c2effe24d952bd3e4c7f44f7e02f8a85fe08debc64b4fdef3a4d", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/Main.c": "23b5e3b20efbe81415f4a8c21a47c767d6560e05e59b1a6b0220e5e4ae2503d4", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/Main.h": "6cbfb303c81f28a5e0b5cbb1fc44a860310af5f9c83fd5391b81c61ea4c6203f", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/Model.c": "8d62e7a6d628d609ffcda11085b09ee0f8fe18a1c527d8fcad54810a879cb705", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/Model.h": "409578c18146e8a728d4a0da93ed34d65880fc96dac39c2786a442e6ff47bb31", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/ModelConfig.h": "118773cc1bbaf51497b9e56fb3a65de4479944973565283223241e73abb34fed", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/TaskScheduler.c": "ccfda6443fa3c524f00d5810dfa48fa23e12608cf8e6dde46e5bf10293de717c", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/TaskScheduler.h": "b6e6f8c61bdd97ee32efe3a5b130c68379978ac126dc9695681de1a4393b0e14", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/TemperatureCalculator.c": "8ffc3c06a3449fd560275736c5cc3202137f00d0513e651304c836fd78128a56", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/TemperatureCalculator.h": "bfee490f7a59b6eedcd357c99cbff6be20b33b4aa96d54789aa420f69f3ceb33", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/TemperatureFilter.c": "fb6997e829daeefe1fa89a5febeb8aab8c9a9adfafb5739f60f786c69b57a3ea", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/TemperatureFilter.h": "0731c950b85d436e651737cca0ecff430edea68d62599e27167e7c5a2a57d983", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/TimerConductor.c": "b10f5485f4a884019257dcd143dddfda528af77b1f8b005a40b2443020ef67a5", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/TimerConductor.h": "53deff5a2ce521b48c69e1d85641e2c7da7d0bdbd1de48f622cc1a7df5efd177", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/TimerConfigurator.c": "145397008f450ec09b8bd010b02430c3becddc92a7fcbe31c06a5baf99e32105", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/TimerConfigurator.h": "55e7e6f42f76dc2c9c60137be3b4a4bfd3e9e96e4ce41c2300221bcf8fab24b9", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/TimerHardware.c": "5085266579205f2be126cc0e5f34c443469a3e5da53efd0fa2d95a7653a98803", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/TimerHardware.h": "abddafeeb43ee8cdc31389263b8826f3ccf6a20573ca4702dfeb537b00a04104", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/TimerInterruptConfigurator.c": "596665665389de910b1dbd15c292f141a8e64a2c4a0164a7959121bed2467645", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/TimerInterruptConfigurator.h": "5a7adb509ada4640fdccf739be3de8abb470b41bcddb9a9834e9b238a9fabd02", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/TimerInterruptHandler.c": "7fab66be3e4d5c430a1dfddee56559ba55ab4cd0d448c583637072e9dc9f10da", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/TimerInterruptHandler.h": "5cc7ecbd35069059f0fb2d516f8b63929e0a4d0fa00e53b593f0827d5f637d29", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/TimerModel.c": "315b80af627d601b85c203ad389f455d5a010806ea113fc410c9bb5566cb7966", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/TimerModel.h": "8946208aac57141bc8078bae72461ce1b0afcf9509eb7c9dd52d7643bf3c99da", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/Types.h": "342e458d2f13f4b2f42ac03133f005635bd4002ae446f5aa5006c73f4160a3d3", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/UsartBaudRateRegisterCalculator.c": "a0a5c91867bd150cff7d8d1a25e5e3355a780421715afa1b9b7ea747612b8fd3", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/UsartBaudRateRegisterCalculator.h": "cfe9a2cd19135f1c1058748f6c82be18331e35a7796a8801103458b2c36912e7", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/UsartConductor.c": "3536b396eddfd8d605ac050c18fd150764031ed873e18362fb0ebc34d9d7dc3c", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/UsartConductor.h": "58ce401a82e272c72f0d9cc81310a103d6bebd9565d8ba783d8a99a014a17aad", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/UsartConfigurator.c": "d4805a5c993e1c0227442f926bd9a28dd1d8af59fdb93c35fa707e14d77baf09", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/UsartConfigurator.h": "95eeabe4b7a99b54cf49531930b0a4be7fe812420c53dc1b730dec7f08e2d1c0", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/UsartHardware.c": "97db4fe3c762e48593838b8ff9ba20e08ce02ceb39bffa592b8691d850ecfe0f", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/UsartHardware.h": "99fa878f31c0b2f5d91cc7646ef25823c38a5c78a747a780d4c25754f448af0e", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/UsartModel.c": "36d389273df8ac7d3b28a3490a511c1be2c117d73d9f7a26dd7d34af5c6cd5a7", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/UsartModel.h": "c367f4aab51341ba2dd1780bad6b7cf59c344009505695b608b734b4711592b3", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/UsartPutChar.c": "2b2aab187d2b818ab28750a0676298205a7f7938ebffa440aaff99f3bc37002c", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/UsartPutChar.h": "557610200557eb94f1a7f5d7a1a7d26bd0827f5e2b06749353dfa4fae73d4439", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/UsartTransmitBufferStatus.c": "7924adbc923cd9eb3bcea5877defbacb3ec16a03de29e7327ff064304a914505", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/src/UsartTransmitBufferStatus.h": "955b1a7e0f4de642f8bb6083b8fa8c3f4d75bdc4c378794aac6dde049410d42f", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestAdcConductor.c": "9d22203689e18bdb6daf3a8aee7d17438028deb1d924731a0597c13743616d88", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestAdcHardware.c": "b3b05e87ac62d463ef489eb2e8aca41d2b6829ef8edaab27622c9c4889a59dba", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestAdcHardwareConfigurator.c": "58333e4681ca8a34e98b11129deebc653e44e3587b03b6b7f523a80ace169225", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestAdcModel.c": "dcf55240bd2ce74f8e3bcc28a98ed8037d51375ade9ebb1d61e882b41e11a9b6", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestAdcTemperatureSensor.c": "f5178bbb8605872e09608baff9b049cc826afa278bc1a125389255e786131f8f", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestExecutor.c": "db1bc8f44e9183b2a7909c0c0b8fac6b25b37d4aee0f47c9ab181500cf384ac9", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestMain.c": "67944d7590384483ecb8b1c06cdc9426e4c78bdfa99886f4d24f9d07e2aa84c0", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestModel.c": "1720d2acf16537a03ff8b6e800f04c46312c9f17985d856f3cb3f64309a869f0", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestTaskScheduler.c": "4efcd2cc31f7c3737f8a0143faf05f370466cb7acf75f0d15f7d661f9303472c", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestTemperatureCalculator.c": "f0b725debcc365c16a055371f3f48534d3f30bac75804cc9c5838850a8bb91c9", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestTemperatureFilter.c": "ffc624388daa2322ce339cff9445abf37cd2372534db356f57821b9e49874761", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestTimerConductor.c": "7d2d58e797a65e44698e30cdb79cac7e94fb96c8e95623c3ab8f9ec0f9078809", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestTimerConfigurator.c": "51748b3199379ebd5797c4da7bdefed444aed398ae36508c098c3f00a2a4416c", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestTimerHardware.c": "7ab489c8cdf7d8d0421482a1a6ef7b1f8663e38453a140e9a5550d1c67844170", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestTimerInterruptConfigurator.c": "7f8eb3100b9091d2996c8f75459659e8ae0c5a75f0d5ee08e3649b17f3394cce", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestTimerInterruptHandler.c": "0000e221012abd79eaf668188923275b7e7e12ef297b15b2165e35440c0f1eac", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestTimerModel.c": "cee4214bb0cf367910562488f448014bc802274d2894bc87ad9fa49098a99add", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestUsartBaudRateRegisterCalculator.c": "729c0d4162bd09ac4514e2de1f70e1b0b4fb05ee125dcfb91314aa40986e8235", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestUsartConductor.c": "ab351f7a74ba445200ccf3d851122fb86531e8511d8cbbbfd1d70b9ccd4a93a4", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestUsartConfigurator.c": "719758e045571b2c532007e37cfe9939eddcc850e069481524f5d4b17d9d399e", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestUsartHardware.c": "c29fa69264fd62d7a466a95de9c927e94119b366ecb1d333be47c60de6183fa1", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestUsartModel.c": "5ab9a684792f271e587d4e861de5c3dc90439dcc4670d7a06da8bd078161a2df", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestUsartPutChar.c": "cde5d54b2acf09a6caf86e360c9a2fd40fb6ccdc8fcfe78d4b10ca7c34d95e9e", - "libraries/coreMQTT/test/unit-test/CMock/examples/temp_sensor/test/TestUsartTransmitBufferStatus.c": "d66b41fefa7200f926652c67cc3797b6143b321e7be5eefb099caaa4cfe2af37", - "libraries/coreMQTT/test/unit-test/CMock/lib/cmock.rb": "f0edc4e161d909610f05f5e915b8262efb41afa36e0ac3be131f5626d3c58960", - "libraries/coreMQTT/test/unit-test/CMock/lib/cmock_config.rb": "967100e4f4d602c934d43c00d7f996186a241c6e50f3351e5488039c23891511", - "libraries/coreMQTT/test/unit-test/CMock/lib/cmock_file_writer.rb": "10145593832b79591152a96fe63371c921b0a544a1fa5811d268b520923cb8ae", - "libraries/coreMQTT/test/unit-test/CMock/lib/cmock_generator.rb": "4d3becae94cdd6e22c11e9bb2b925d94cb5dd1db38585963dd41a10b5b212ac9", - "libraries/coreMQTT/test/unit-test/CMock/lib/cmock_generator_plugin_array.rb": "0cb11153bbcc6e2cbaa07c74e9586e3172ce230019bc3f022894520c086f21d6", - "libraries/coreMQTT/test/unit-test/CMock/lib/cmock_generator_plugin_callback.rb": "4119c7f44d9e28264069064e1291589a16274bf93e5a14552e11a620ebb7dbd9", - "libraries/coreMQTT/test/unit-test/CMock/lib/cmock_generator_plugin_cexception.rb": "708f8c4336375acfcfec43e8190154cce8e12728e74737285824fb65944cca1d", - "libraries/coreMQTT/test/unit-test/CMock/lib/cmock_generator_plugin_expect.rb": "6df76c4d83db376ff82bb045c0f3003818f411fa7d9157a3a94e07031faddd22", - "libraries/coreMQTT/test/unit-test/CMock/lib/cmock_generator_plugin_expect_any_args.rb": "a89ff1e3376663d193d43f4d81ced30bf4691415ee98bfc12a29c6cc93cc25b2", - "libraries/coreMQTT/test/unit-test/CMock/lib/cmock_generator_plugin_ignore.rb": "5dd940f4b8ad31ccb94183e3c49a94410d1bdfdeefa33041dfd6de167f874abc", - "libraries/coreMQTT/test/unit-test/CMock/lib/cmock_generator_plugin_ignore_arg.rb": "8b65b5e69deae8a1bfaec78a7fe289ae96da9ecbf5f75bfc927f66326752ee0a", - "libraries/coreMQTT/test/unit-test/CMock/lib/cmock_generator_plugin_ignore_stateless.rb": "035693e7216923faaebee04641328fa470354209a24c2cc1511da76a16eb061a", - "libraries/coreMQTT/test/unit-test/CMock/lib/cmock_generator_plugin_return_thru_ptr.rb": "d9e4becb9f498eda5789f018afce08b7754b7201f839269753233d4a96afa7f5", - "libraries/coreMQTT/test/unit-test/CMock/lib/cmock_generator_utils.rb": "a3a991519847f367060ce0ee9573c3fe198572dc2293b62530d20eade3231acb", - "libraries/coreMQTT/test/unit-test/CMock/lib/cmock_header_parser.rb": "bd3517c139bd3e77b852b5462f2ed3819e3c8a2246edfbe1c3bbc7be96aa0070", - "libraries/coreMQTT/test/unit-test/CMock/lib/cmock_plugin_manager.rb": "c4af08cb8b44fa782c0cc6b5027d5a0001241492bbd67fd3b900c735daff7650", - "libraries/coreMQTT/test/unit-test/CMock/lib/cmock_unityhelper_parser.rb": "35a45f4dbfddf0ae863ddead0b302ee1b6ac51153295be5c07bd26fd9c397787", - "libraries/coreMQTT/test/unit-test/CMock/meson.build": "499a9acba3250bb3654bfb97429e4959d7e919965f80cf2654c095139b9528fd", - "libraries/coreMQTT/test/unit-test/CMock/scripts/create_makefile.rb": "a89601aae619a101901c98fa211c24484ce0f16abb4fdc74339973da630e2de3", - "libraries/coreMQTT/test/unit-test/CMock/scripts/create_mock.rb": "f0ac5b9b046564354f3b1dc548220842936901f1757c0fc80c6a38aca207ec52", - "libraries/coreMQTT/test/unit-test/CMock/scripts/create_runner.rb": "3913d1d40de255a31cc338f52e632d4b4b05e975b30c1a03bbee7d1e3bb95901", - "libraries/coreMQTT/test/unit-test/CMock/scripts/test_summary.rb": "7f782242056d906c3759ec8785c47b4006cb658ae88d5b331fd0b45a546c6e94", - "libraries/coreMQTT/test/unit-test/CMock/src/cmock.c": "6cd73033ba5ad688626bad666169d0869f7978bee7672a098998e0894d9b1287", - "libraries/coreMQTT/test/unit-test/CMock/src/cmock.h": "fb386d093680f1f82fa493d29959e3cc6b195c2738c07fc36a3c33868881a5b2", - "libraries/coreMQTT/test/unit-test/CMock/src/cmock_internals.h": "33176ace775e36ea3aaee1041d5df0967e5f120170f17f68be1ebc54c91f3027", - "libraries/coreMQTT/test/unit-test/CMock/src/meson.build": "29260b081670469c41d6e6fb0d6225aa1323b9857ea9baf7631257f896fa8afa", - "libraries/coreMQTT/test/unit-test/CMock/test/c/TestCMockC.c": "7beed4e807a064045a2f00bb149af817483fc70331aedfaa0d2934d3b94f993f", - "libraries/coreMQTT/test/unit-test/CMock/test/c/TestCMockC.yml": "7457da36df8102d71c336ca384702879161097ff542380bed78cb5446984ae4c", - "libraries/coreMQTT/test/unit-test/CMock/test/c/TestCMockCDynamic.c": "eeaac501c9e65e166ebd11b90c5275c67597e81e6c9c3156faf006751023495b", - "libraries/coreMQTT/test/unit-test/CMock/test/c/TestCMockCDynamic.yml": "4755d85389465ac56733780ec7da93965dccf5eba935195acbbb7de251c6048a", - "libraries/coreMQTT/test/unit-test/CMock/test/c/TestCMockCDynamic_Runner.c": "ba26744cbf8c4f1ea7de6ca7254700bf1e16ae57682270dc4d94393ccd501588", - "libraries/coreMQTT/test/unit-test/CMock/test/c/TestCMockC_Runner.c": "465d91fe9d981509a92267d0471fbb3e412a88b6f7d50437fe91e47ef6d69e8f", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/Resource/SAM7_FLASH.mac": "8ac360d36256589216b144c525d510af24457ef763becd14b137f63e953cc17d", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/Resource/SAM7_RAM.mac": "df15f8e476e1ca1b8d3141cfe0c801881939e70cefca237a98d804742cccdcfe", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/Resource/SAM7_SIM.mac": "6177e42e1a0a493976fb4d196b65cb1257e045db281ad48569b4b9ee6d9f37bc", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/Resource/at91SAM7X256_FLASH.xcl": "8594f9522b6ae41e96ab7b848dd7e4024876f7882d95f60a8bb6577ffd154605", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/Resource/at91SAM7X256_RAM.xcl": "713104cf6bf984663d5227b3ea6fe1d045413630b5a71404b2a2a7156346ae9b", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/Resource/ioat91sam7x256.ddf": "f23d06dcacffa6d544f4a560a4692bdaba7b918b488b810db928b418a4bbfd88", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/cmock_demo.dep": "5157f2a91a7169b63aa30424a220053a8983194e6145d14f3a39bfa2e63175ac", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/cmock_demo.ewd": "176d8abee2d57ee30575952da2aa2bfa4dc851b908e44df728b6a4a2c222fd8c", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/cmock_demo.ewp": "ffacbcc9ee4b092f01af22ee7bdcd34bff44043cd3c903ff9530912b0d4eaf0a", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/cmock_demo.eww": "7b5fe1867f77d1c6a09c591e3c4705a20ec0102a10e5049aa3fdb1989596e23b", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/incIAR/AT91SAM7X-EK.h": "41b4cd1cbc547b10818daf44adeb335a7dcd6846b229195c156be0be9b1cc056", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/incIAR/AT91SAM7X256.inc": "5f7c307376baf65d6ae5e16bb23b7d9374b713c7a8bd963240418dd026f5cd79", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/incIAR/AT91SAM7X256.rdf": "f7a13e637d12010564f884cb25ca152909f5cf056fbd87b8f837e6e999305411", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/incIAR/AT91SAM7X256.tcl": "959dfe614a39ca1c47aa5e42d10979bb939c4c0464cc01f3d395a17baa2759f8", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/incIAR/AT91SAM7X256_inc.h": "cf75fa42dbdac6d2e055ee6a1b4be6c3fda982bca36832167dbb3338c2529ea0", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/incIAR/ioat91sam7x256.h": "df4353041f1daef07fff13afedf5c82b6502ec3f27af4b7943a409dbf27bcdc4", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/incIAR/lib_AT91SAM7X256.h": "d500574f73b3e2c0e026d600f9949f680270aa9e78c82b0250276c75edbd79b1", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/settings/cmock_demo.cspy.bat": "0b95a0e1455c0947578eb48f8e77dc4303c672208d92a29883061115dfd4740a", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/settings/cmock_demo.dbgdt": "16333ca6fc95ee3c09e1d65fb546fd714e1039a2d83a7ab88d5113f7b92e89de", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/settings/cmock_demo.dni": "36b4ad5d2c76a305040b922a7b27d4d36f68e3ffaa13ca327db77b7f82280e6b", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/settings/cmock_demo.wsdt": "1502e8d1c367c132f62906a92a931ced79057ef818fdc502900ab6fa092681a7", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/srcIAR/Cstartup.s79": "73b3a3034252453843ce316daae1cc691d8289a6943105718c04e5864b384110", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v4/srcIAR/Cstartup_SAM7.c": "15857d19064c45c733ffc3c3de66b9f987bdd44b8e1d29b3ae17a355faaa3472", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/Resource/SAM7_FLASH.mac": "8ac360d36256589216b144c525d510af24457ef763becd14b137f63e953cc17d", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/Resource/SAM7_RAM.mac": "df15f8e476e1ca1b8d3141cfe0c801881939e70cefca237a98d804742cccdcfe", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/Resource/SAM7_SIM.mac": "6177e42e1a0a493976fb4d196b65cb1257e045db281ad48569b4b9ee6d9f37bc", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/Resource/at91SAM7X256_FLASH.icf": "d37f75919b1793bac86891e7fa9a9142ae83de351d5ef169af909ce770ae6d01", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/Resource/at91SAM7X256_RAM.icf": "170c34f5e702138b2b20cb696a482886936cdad8eaddb18c6c84abc5facf0a17", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/cmock_demo.dep": "0a869be5fc1a6ba0991c5012d8d4bf21ecdaf35ce23ff2207bbe35fc72b7acc2", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/cmock_demo.ewd": "5ebda13f0da843a1a4343bdb77c728d72ffcf8356a48eb6e3d5527428f6a1ba4", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/cmock_demo.ewp": "019d8fe92e6206e06b9fc46938e2ac19d9b8d9e27186f4ed05bc9f1f4ffca31b", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/cmock_demo.eww": "252dbeae342d9ad0c34d7f4a622dec74a5f400c08ad931771dc418dcc8aea7c3", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/incIAR/AT91SAM7X-EK.h": "41b4cd1cbc547b10818daf44adeb335a7dcd6846b229195c156be0be9b1cc056", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/incIAR/AT91SAM7X256_inc.h": "7fbf38b71f042bd3130dd7a0cc6e55130eae320e4fe705e078e5f9144c6e03b1", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/incIAR/lib_AT91SAM7X256.h": "405c0c979b5c39e520624e0b5da725690c69f220d5985c6129b1be0bde3ff4a1", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/incIAR/project.h": "431c8cdd8373916c97b6555fd0df183b4eed8799fe61397c5b9458d71e194edf", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.cspy.bat": "2e1acdf2e55863b5e33588ee350d4ea8325a79aef8f143a1d1e4dc9a20894ebe", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.dbgdt": "1967e4e174ca97638a540915477a6cbc829cf2d19bb4ad6046ebb43cef922619", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.dni": "e7db4742adcbe78483a5a2bd0510ef338a2ddddcca3b4587d493c54fec22a722", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.wsdt": "bfd819154f05571882a5c70fa8e47aaf4a6be521b9ce321b086ecc8b3fad2fe9", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X_FLASH_Debug.jlink": "94a14185b32946b9295be7a4230afb5f71ddf87bff3e9f279ce4d82feabe98f9", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/settings/cmock_demo.cspy.bat": "98d3f600ca83fc5e0e141e27f17c92b52b28997445a64d7f63cb4312f490a580", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/settings/cmock_demo.dbgdt": "942572f2cb503a36b9e633642c54e72dc8bc929a41a9430fe62837ea3eb837c0", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/settings/cmock_demo.dni": "35f715df5935f7b03aae4126e33e296bd36df32f86aa00d425a09e65ce1fb66c", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/settings/cmock_demo.wsdt": "b5f6a167aa78028b09a439565dede111bf8119403c9f290367163356008807f5", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/settings/cmock_demo_Binary.jlink": "94a14185b32946b9295be7a4230afb5f71ddf87bff3e9f279ce4d82feabe98f9", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/settings/cmock_demo_FLASH_Debug.jlink": "94a14185b32946b9295be7a4230afb5f71ddf87bff3e9f279ce4d82feabe98f9", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/settings/cmock_demo_RAM_Debug.jlink": "94a14185b32946b9295be7a4230afb5f71ddf87bff3e9f279ce4d82feabe98f9", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/srcIAR/Cstartup.s": "f01a69400b4d52ad0202134d4d1eb2b2afb8b5b90f19cab527ef2c63354725a6", - "libraries/coreMQTT/test/unit-test/CMock/test/iar/iar_v5/srcIAR/Cstartup_SAM7.c": "ffffb70bb3424fb7537c766bfa1d0831154bbc455b10a7085ddfe6e5a51cd8e3", - "libraries/coreMQTT/test/unit-test/CMock/test/rakefile": "d324d932b8c69438ad43e7fddb4b28ec67e5c842b0dad2acb2554bcbcee7542c", - "libraries/coreMQTT/test/unit-test/CMock/test/rakefile_helper.rb": "7885bdc225c6b35de64317b9c2a6352e8637be6538280c9cb7efb60b76cd9a3a", - "libraries/coreMQTT/test/unit-test/CMock/test/system/systest_generator.rb": "58f80ae3b57314f1ac5ce062a5c8b073e51b69e244347fcd2e0909a0918d4ce5", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_compilation/callingconv.h": "f0d451838c94b20cb9df40827b1667e82719adf34bc7f848ce1ab330a95f5ece", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_compilation/config.yml": "55da291e818f575aaec65bfd678b9bc92badc2775bd012ea465d124bb03f6874", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_compilation/const.h": "452666930532c934d30c06081a1207422064421e2111ef3d774f60801c8d0298", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_compilation/inline.h": "faae36b96040414ffbbd8c9cd0ddcf1d918b5431ad81c12e391fe8b283ae915f", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_compilation/osek.h": "6283a1ba1ce53af3c73e246ec073497aec8d5da7e573f8474a45e1ccaf72730c", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_compilation/parsing.h": "f6f31c9b303aaf2948ed48cd6e8dcc0d7cef5bacc91b5746b11d432701911bd4", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/all_plugins_but_other_limits.yml": "23512e99944a08a4517037fddc6f13451118a23a19327270e7f0cde0a882643e", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/all_plugins_coexist.yml": "2fa3f85fa5bcfd432d7e82be741d3e4bce969182d3b3c4335ab2bac494a8b3e2", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/array_and_pointer_handling.yml": "afd7b725c51a0268b2fe582416b59e303c611a86af8359627a10483ccf4ac3dc", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/basic_expect_and_return.yml": "188b82892feac0f148d9b8d1edf9929e4145d8adb7ffc0b2752be3dfe5c620d8", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/const_primitives_handling.yml": "2610282b06d4b05f3f7e9b22254278648a29dcf1808f8206ac92d183ed7c7ebd", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/doesnt_leave_details_behind.yml": "5d39bdb3fb162c3664ed180754c6b8042c12ad7e29ccc65b42c312ccfeed322a", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/enforce_strict_ordering.yml": "85f9cc7ce2eb22b0da825ca8d6e38a05bffb69dab0e66c0e516753b74fcfe10b", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/expect_and_return_custom_types.yml": "361e10a02795595bf45c64b2026d9342fff1e4d0308fb5202413bffb84bd3b10", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/expect_and_return_treat_as.yml": "6601ab58a7b0719e26124b40d3aed2272a032f4ff3ae45da241b0b39bdf03ce9", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/expect_and_throw.yml": "18eb54309f69744598138a5b3f8ef4b898bbc3fb46b1a42306016d6ed566c1d3", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/expect_any_args.yml": "1348aa720acf85e117c6c23353f205b3438eac30baee86efeacbdc04f2645d27", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/fancy_pointer_handling.yml": "a3033a4e31bcfbf66126059476d9fdc7bdaa197a8b6568a382c93e373110abb4", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/function_pointer_handling.yml": "85c81773cf1dcf80dc84ccb433d8442aabde1b8635292819315287e828b93f63", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/ignore_and_return.yml": "4300c43c2e59a39111809e3e4571484e45146344a20d706a2c0c8618159fa2ad", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/ignore_and_return_stateless.yml": "4f9358583b2f8159251937699441854a41ddbe0bf9b1d8fbf1bebfeb8f32c0c1", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/ignore_strict_mock_calling.yml": "08c69a141af52960e0e9043d717ff5df442f7889edcd145898c0cade3fcc3e72", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/newer_standards_stuff1.yml": "f2073b808f4cc2d918612ff1c910fbc4a8ead998b12fcbc7608d430fe71d8eb9", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/nonstandard_parsed_stuff_1.yml": "23db82fdbc1643ed58a58c20a4154e75b8559509a3f827fb43e9c5965103e4f6", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/nonstandard_parsed_stuff_2.yml": "f51bae36303d532e357105195369615ab17560234efb1f0141973c2794ac0693", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/out_of_memory.yml": "4b4509e9c368fdec539be90daa164185175849afcf39c2d0a9c4d9ff9e423191", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/parsing_challenges.yml": "6f9a0d35489a6e6435211923ea43349e17cb68fc9652cb98511be8f74a78a079", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/return_thru_ptr_and_expect_any_args.yml": "64915233c5cb94bdff20cf89f650de58f278a214417bacf52129b67d67208cc0", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/return_thru_ptr_ignore_arg.yml": "cde16df22f47d782043ce85063cd7d53dcb3473eebd25631bbd18d7d87c38db0", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/skeleton.yml": "569c26fecbd11f185b9e4a5e2a0377306d18b2bf95402d9e04c3865468e1e066", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/skeleton_update.yml": "db55c821e8ea59817cd6d65f69a119bc1b1c75dff14fac1456167a5488b8e96e", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/struct_union_enum_expect_and_return.yml": "c926cca48cce1932fd57dc871187073cf3e35d12569369695a18a4a6fb7be3f8", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/struct_union_enum_expect_and_return_with_plugins.yml": "29f087a7f1217b3724517523dbf122bfe07277505549c465b1821df926b75c6e", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/stubs_with_callbacks.yml": "5e2cf62796105fa958e9528d3a30cff3a83c4f9d23385ab75a5939841647c486", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/unity_64bit_support.yml": "91a78d7f1216c1c18388116c169d2da0994351e61155fa6bb622bf16b635838e", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/unity_ignores.yml": "f6e9193481c9f0a5c5ab50833fea66da7bc34977b35a176fd613130ec883bf92", - "libraries/coreMQTT/test/unit-test/CMock/test/system/test_interactions/unity_void_pointer_compare.yml": "b92f86081c7771eca83efad7e38e071ee5bf8ce2e1a410df7d7af9c392486e6e", - "libraries/coreMQTT/test/unit-test/CMock/test/targets/clang_strict.yml": "4d477d7d7c1ffe0ce9175b89d4812119c7a0a79e924290e59c3dbd46b0975de3", - "libraries/coreMQTT/test/unit-test/CMock/test/targets/gcc.yml": "f012ab43326a37713fb72f33c0e03771fbbf4347e549de6cfdb476cda0ad9118", - "libraries/coreMQTT/test/unit-test/CMock/test/targets/gcc_64.yml": "0c0df186d99f01666f0d8145289179d86298c3671cdd7083c5e3c4a41625d5d2", - "libraries/coreMQTT/test/unit-test/CMock/test/targets/gcc_tiny.yml": "c9b57fd070a3e98fc3c237c9b3b99b31d0cf01cc0565b81812f57f68ca340714", - "libraries/coreMQTT/test/unit-test/CMock/test/targets/iar_arm_v4.yml": "fe0f205df28d23f4a940c1efce9e74ddd227427eaa55a70a283d8ff0722e45f4", - "libraries/coreMQTT/test/unit-test/CMock/test/targets/iar_arm_v5.yml": "7649d656896a709b2124b232bbe2d4911ae141617ccdd947e1f1541f23615bed", - "libraries/coreMQTT/test/unit-test/CMock/test/test_helper.rb": "7561fd77c8b7c6ec581d2e946db129893dd842d813801bd5ff6dfb42eb98cb19", - "libraries/coreMQTT/test/unit-test/CMock/test/unit/cmock_config_test.rb": "a583acc99d07d80cf5cd6ece9765e1f43bd834576d30df342b1769b9889050b5", - "libraries/coreMQTT/test/unit-test/CMock/test/unit/cmock_config_test.yml": "2b1460d832657fe5f69b70b92a7bcd40edd42346aea4bab20043ffecd43719e4", - "libraries/coreMQTT/test/unit-test/CMock/test/unit/cmock_file_writer_test.rb": "88cf580634a0907f12b8068f1deefe7e90a14b0111d55da6d413f3827347b9d6", - "libraries/coreMQTT/test/unit-test/CMock/test/unit/cmock_generator_main_test.rb": "2d51d72ba7d6ccd664556e2c2fe0cfe1aff821e351de70a0a8d0b241bbc5ef73", - "libraries/coreMQTT/test/unit-test/CMock/test/unit/cmock_generator_plugin_array_test.rb": "560f97841377b5ae6704cd4363e0d21c8883abcb7f5d2907608e6c0aa68c3518", - "libraries/coreMQTT/test/unit-test/CMock/test/unit/cmock_generator_plugin_callback_test.rb": "5134242ce1626493fba063b040edcdfb955267374f58dcc0a500c198fb26f51e", - "libraries/coreMQTT/test/unit-test/CMock/test/unit/cmock_generator_plugin_cexception_test.rb": "4a4bdfa48a17829dd1c3d58cfd4da6769bfde6bd592b55afc2685d24a667fec1", - "libraries/coreMQTT/test/unit-test/CMock/test/unit/cmock_generator_plugin_expect_a_test.rb": "4ec2bfdb7c6f35c1b9d1e15748891dd2e823f304892207030265f3769c990d37", - "libraries/coreMQTT/test/unit-test/CMock/test/unit/cmock_generator_plugin_expect_any_args_test.rb": "1b840d79c1630365f47e0a304daf5e52c76d2bd2815d37ca7590b30fd51fbec1", - "libraries/coreMQTT/test/unit-test/CMock/test/unit/cmock_generator_plugin_expect_b_test.rb": "a37304cc8f794c0d70298cd4873701bd5307b0c3827af0e453dff00911e9d47b", - "libraries/coreMQTT/test/unit-test/CMock/test/unit/cmock_generator_plugin_ignore_arg_test.rb": "cc79bf0080a069d76e91c230af75751e32fc86fbf4992b202d4905cf14368aad", - "libraries/coreMQTT/test/unit-test/CMock/test/unit/cmock_generator_plugin_ignore_stateless_test.rb": "dad02980c5efdd1182b4fa45ced2e36a1f0678df19ceaee7719c3c8303f47a9a", - "libraries/coreMQTT/test/unit-test/CMock/test/unit/cmock_generator_plugin_ignore_test.rb": "dc09b360cb2268924a6bc839a3130b9215c813780a3e71e589512015608e300b", - "libraries/coreMQTT/test/unit-test/CMock/test/unit/cmock_generator_plugin_return_thru_ptr_test.rb": "0b7351668087ed19560e963fdca2cdab19c1973e1f9274c0302f18110a7610ee", - "libraries/coreMQTT/test/unit-test/CMock/test/unit/cmock_generator_utils_test.rb": "663b3caa05cf3b0f889b7e7251643f38329bbf6a83c64910b8e3f917a1dca361", - "libraries/coreMQTT/test/unit-test/CMock/test/unit/cmock_header_parser_test.rb": "1c2c7b81d2f1c44b9a10eeef06e70c77fa14947e7dc889a37632dc9b680755dc", - "libraries/coreMQTT/test/unit-test/CMock/test/unit/cmock_plugin_manager_test.rb": "510fe651508db42d428539b63fbf2aa5c2601ac4b5f1fe0d5d756ba4f03f08e5", - "libraries/coreMQTT/test/unit-test/CMock/test/unit/cmock_unityhelper_parser_test.rb": "e77b10af099223b17e9c524d0e6520a8d90ef878f9326d8729a3d0cab437d172", - "libraries/coreMQTT/test/unit-test/CMock/vendor/behaviors/Manifest.txt": "f6def0d4d599a6d17c7b0a6e5cc65824ba9312a85c4d9640f9f40f3a65fe6e39", - "libraries/coreMQTT/test/unit-test/CMock/vendor/behaviors/Rakefile": "be9b1156744f3cf65e64c075ae5385313ce59e5ac4178ed8c63371bc817d214f", - "libraries/coreMQTT/test/unit-test/CMock/vendor/behaviors/lib/behaviors.rb": "c818cb720cce5d3da2b1a1e09601f2329f8889cccfdaf4e7ad7482d2524609d0", - "libraries/coreMQTT/test/unit-test/CMock/vendor/behaviors/lib/behaviors/reporttask.rb": "6abac47d73976e719ef3b2e47ffde7e048a08044e807b8d5b3eca7ab18c3acd8", - "libraries/coreMQTT/test/unit-test/CMock/vendor/behaviors/test/behaviors_tasks_test.rb": "04ef3a3e45cd62bc102267a2919240a9a021438e0dafccf2d817234104426ba9", - "libraries/coreMQTT/test/unit-test/CMock/vendor/behaviors/test/behaviors_test.rb": "4240fa9b7f31dcff3c5509827ebed298d2c388f55b8701221874300e815d76e0", - "libraries/coreMQTT/test/unit-test/CMock/vendor/behaviors/test/tasks_test/Rakefile": "0c9e136971e8aeb54404b4827de1b85cabb5512a8aaf8f36929e052339144638", - "libraries/coreMQTT/test/unit-test/CMock/vendor/behaviors/test/tasks_test/lib/user.rb": "b5527ab1ec2cde94b51b84e785840a076ceb4df87f8c71a52eb9119a1785f1d5", - "libraries/coreMQTT/test/unit-test/CMock/vendor/behaviors/test/tasks_test/test/user_test.rb": "e12e02edcc9868ad43634427fef9873e7e6a03a6144d59ed302d1f40beab18d6", - "libraries/coreMQTT/test/unit-test/cmock_build.cmake": "d73f758fdc599d6abcd447dbbd05331a14615eeb631b22cf5101b8a3d4eeebc2", - "libraries/coreMQTT/test/unit-test/core_mqtt_config.h": "5923a227f7e7caaaa297471b1385de06a5c3d9483778ba845de3d43aa12fd631", - "libraries/coreMQTT/test/unit-test/core_mqtt_serializer_utest.c": "9b8911345a989f41242fa96c646f62857f8a681abe6227209cc9aff1fc24aa7c", - "libraries/coreMQTT/test/unit-test/core_mqtt_state_utest.c": "d844c9e20df0537242486dd6d8ccd3d2f1e496487924d28a3d42745bc56ba66c", - "libraries/coreMQTT/test/unit-test/core_mqtt_utest.c": "3584d46147451d2d7ef82f68d0d697d18069862b3437c0492f8d11fca879a2c2", - "libraries/coreMQTT/tools/cmock/coverage.cmake": "8ac1ac5e6d5628fc8625d57f74249f15f53eba61f8338813d36d3dfa9dc1cf9b", - "libraries/coreMQTT/tools/cmock/create_test.cmake": "41dc66ba43772ccbcc59871e16ebc60b8671875e0e59d9068313be0aac1f25b2", - "libraries/coreMQTT/tools/cmock/project.yml": "805074ab6dcf01b29aac19ab1964b70227d0f7013b5b755dbf5c17ae66e6a0d6", - "libraries/coreMQTT/tools/uncrustify.cfg": "55c02144fdaa3d62e03ed97e3e89a54b67d9433a5320ec02ec82e75344b21656", - "libraries/core_json.cmake": "7251b93e8e604fefdab3569fdde89cda4d191386d03ab9baab158096177ea386", - "libraries/core_mqtt_demo_dependencies.cmake": "da65d2b2dfda0903e36e08a44052cebbfc2e55dbf495ab2261d3dc18d9a2c6a6", - "libraries/device_shadow_demo_dependencies.cmake": "3b98fe1e68a05e5e6380d00f7beb197fe0b9d73e9f5e229d63a06f4252a3da4d", - "libraries/device_shadow_for_aws/CHANGELOG.md": "9fb0045893f2f176a7c38eaa5428ee8f0d94f9230d5fa4764f3ebb4975622734", - "libraries/device_shadow_for_aws/LICENSE": "52f54173fb286e7baa536bab3fb2aef58891af07e96646fb4d80663fabdfdcfb", - "libraries/device_shadow_for_aws/MISRA.md": "83c3eaba6c074f8ecb666c2d9d8c3de156fe47eedaae379494f70fea4653fce0", - "libraries/device_shadow_for_aws/README.md": "1fc9975017dff963dd6fead61ce4f4f37e1e96bc0c1c3adc7675127de46546f5", - "libraries/device_shadow_for_aws/docs/doxygen/config.doxyfile": "fb5f607c28e0bbcadeb70c1fe4e3393bb2feac9c581da205c1a90534f78c2d7b", - "libraries/device_shadow_for_aws/docs/doxygen/layout.xml": "555a70789f54c525456ad9d30730614fe7119afb8b81dd8f8067af28dd14f66c", - "libraries/device_shadow_for_aws/docs/doxygen/pages.dox": "79630b146f50c9da781ddb199ecb63fb2a7089e0b74de9dcd2bcdffe4390f64c", - "libraries/device_shadow_for_aws/docs/doxygen/porting.dox": "57770d46dfc3d9a8ea9dac0495ee057956221981221fe70ddf8fbf6b46a8cfe3", - "libraries/device_shadow_for_aws/docs/doxygen/style.css": "e3d3b4438744aa4d547bcacc6e64f3fcfc5057b476c5237e5107e6bbe0aac72a", - "libraries/device_shadow_for_aws/docs/plantuml/images/shadow_design_operation.png": "be26eeab05864c35a8777eab1ca26255c7c585d88ed88e548f67c86891f210b9", - "libraries/device_shadow_for_aws/docs/plantuml/shadow_design_typicaloperation.pu": "81c9ef7f7e2cd9d56aed1f29e96d6a3677a530eb6c9ada4bb2bf1d3572ae7479", - "libraries/device_shadow_for_aws/lexicon.txt": "633871e3214e52dc9c7f651f589d83602a9998c985d85e1c43163915340efa92", - "libraries/device_shadow_for_aws/manifest.yml": "6e07227fc381b1e2f747fd61a669916c29ad9ada8562fbdd1c6772342fe0eb3f", - "libraries/device_shadow_for_aws/security.md": "92134ccc4ed81e5546dd4581be6ddbd3a3a98aafc4c06089ab1d9c1a58df80d5", - "libraries/device_shadow_for_aws/shadowFilePaths.cmake": "0288a46686c14976f166ba2466ea9dafdb5388fc1563430d88ff989e479c1ce5", - "libraries/device_shadow_for_aws/source/include/shadow.h": "0193cd4fb0127098714f6083db3e68bccdf971a0122240476268783e3c34086b", - "libraries/device_shadow_for_aws/source/include/shadow_config_defaults.h": "96fda86470113b9dd22f78526690795d7ea1ecd7b523515dd194f050c4596726", - "libraries/device_shadow_for_aws/source/shadow.c": "15c5ac7ed8b24b42f8e438b570e2342be7b83b9a561adcaf1b358dd7fe63658e", - "libraries/device_shadow_for_aws/test/CMakeLists.txt": "4f5de7fdcf2cbdf2fd557b569ddc34f405dddc51df66ce95d164fe01ce5a63b0", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/CODE_OF_CONDUCT.md": "34b6c98d5c23127ae6769e95e483e5bf6d3704ae1f0d3ae4e69d15f4ede118b6", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/CONTRIBUTING.md": "b050a75d5f6d2236ed40ad91dc53c4a4b30da184f9298f6f18507beae5fd7cb7", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/LICENSE": "09e8a9bcec8067104652c168685ab0931e7868f9c8284b66f5ae6edae5f1130b", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/NOTICE": "d4290ed64c2edd0fce1d84e3f9dfb2881240fe534def76b8cd29ed6af683e287", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/README.md": "d1de02d49f1baf2d8f376777731ca952eda223d23faf6f87ac17ec5f6eec1622", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/scripts/setup-proof.py": "250c684e31390f2831c4833b5bb642fcb9246e14a73e4e71aa64717c866d30ce", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/scripts/setup.py": "15eaf8dc1a3921b6ec647396e504b6f1346ca37aa7aea46a73110e5681211b2a", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/scripts/util.py": "7cc883f38bbe3a34f1be2f78655131f82d89356112dac292edbf9c5ef4de11b8", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-proof/FUNCTION_harness.c": "f2802074ae7080f73b53081f262c7b9f7245b8ef1e4fd4e3dc88262a2453af4d", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-proof/Makefile": "b7311b8cdd2f100da52ed793ddaa77aab0e8943e06cdcd2b29c05953c869e5a3", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-proof/README.md": "9abd31be7593b6de5507a36587f18298e870da24e2c2f2ab1235e9e04464d6c7", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-proof/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-proof/cbmc-viewer.json": "31c095521f43d2b919f96351d52b5900653ef3813af1c055ef88cb01114c57b6", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/include/README.md": "1ebb917adfbfeba5019583d75438c3f745da8a93752e88b1b31bdad351a1ac9d", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/README.md": "dda48722cef39f7482baa20929815222d6cb643541505af7ac0202ab4ea30675", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/assert/Makefile": "8eda2c18734c4e1a2b07bb5cdbd5b7d5974651184a8dd594409e122b52a06416", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/assert/assert_harness.c": "034f86fc93c6cf928500721ba5bcf9b96f327596a2b931b52474ddd66c765941", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/bounds_check/Makefile": "142e70065dfe3d20bfd83d4566a26e60a254d410111d9af072e31e96b6209cd6", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/bounds_check/bounds_check_harness.c": "b1b242ef2cbc76b275951e75d87fe07d181a3538b1fc8c31839883f8eef80a11", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/conversion_check/Makefile": "97ff3a0a72e2ad71f520fb3875cfbbd3a1124df6236a14930948343fd3f219a0", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/conversion_check/conversion_check_harness.c": "89c63b828b051da2e0b0767cd2704419c389d5390178cbdcccfe591940d42da1", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/div_by_zero_check/Makefile": "3367383673bcd9262b9b61fff6c4961abe70aa2ffb3b8e3f59d014d94927b84c", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/div_by_zero_check/div_by_zero_check_harness.c": "d4255afad71ad03efc1729c46bab842f1d3727967eb75c0e41d26add25ae684a", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/float_overflow_check/Makefile": "49ffbdb80bdb47fef8c3f2af3e2445def5a1fe764285f7f28163ff55206e0cf4", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/float_overflow_check/float_overflow_check_harness.c": "0b762450e1abdfdb6eefde48545d0ea51a5699727ca46decb8aa6893dc0bf684", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/float_underflow_check/Makefile": "3a561f39099cc9a6783bfc779c56a68a08b61c336f44cdc3b957868651899354", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/float_underflow_check/float_underflow_check_harness.c": "8b84e5fefef6615ed4518834b9861bf07ebb35db8583a30c26d09f8d04bf4381", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/nan_check/Makefile": "440a4b02b6bcaa94c95c33b900ba5febca83aed17990c30b5dfddce246c9f29e", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/nan_check/nan_check_harness.c": "8376f52bcb36282975be5749f61179bffb5b5ced4161e39c68ef86c3792f09bc", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_check/Makefile": "ecd0cacef27ec44df5af35549e801aa4c17f4078b3d4b5beb3e73dfc787f54c2", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_check/pointer_check_harness.c": "662e399061f5c413c8ace57886174b11e755cb66999a90950409bf04d8cfab07", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_overflow_check/Makefile": "f1875b30dfc83287132387682a13e435a82b11186707526d39a4e10794cebb04", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_overflow_check/pointer_overflow_check_harness.c": "118c0a62a647d824f98ec779956f89b540b74206c4f81f83298d6440fa1bee16", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_primitive_check/Makefile": "131b7ee0daed69e68bdb7a949ddb5667f216a3912522ca69019871a81d25f10d", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_primitive_check/pointer_primitive_check_harness.c": "ca0e47a48fe2a0023f6c5e7e410efd5e90705d39864b3be48322f5ac82f3398d", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_underflow_check/Makefile": "5208e5e4348a5c4bb983af1c1907d7531b5988b89589ca569fbe74a8f6daff69", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/pointer_underflow_check/pointer_underflow_check_harness.c": "effb8b9837ed060a1b9a1c905afc5003bebe4832a27e7bfec940405b2e6eba52", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/signed_overflow_check/Makefile": "e08765ec88321f8f909a417af4d4e528222c32ae1224bc120a518d851accb3f3", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/signed_overflow_check/signed_overflow_check_harness.c": "1083db8aa4fc4bdcc3b89d3723d0fe58e529c330a21200f3ddc75adaf7ff9956", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/signed_underflow_check/Makefile": "4d970e22f170d34ca5c2b92db785972eb9e0529c1f68217da5eae1b86cbd2944", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/signed_underflow_check/signed_underflow_check_harness.c": "040b507614725741b8bb8d553b12d273aa7e165253fbe17e9e9cd58102d01409", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/undefined_shift_check/Makefile": "da67123ebdd610d48888064339a1180c0ebdc662b7d19c68f97a120c9499f84c", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/undefined_shift_check/undefined_shift_check_harness.c": "0f643a2aad93e70fc540f6aecf3046063a09817e5c4bec735c88ac7820f62ff2", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/unsigned_overflow_check/Makefile": "e90461e92d5257521b9c4766beaa3ff986f35dc2c7dee695f983e88baff8e2aa", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/unsigned_overflow_check/unsigned_overflow_check_harness.c": "b85cfcacd82a28417112248f72e8f734cd7799b1df4360734caf186c775669a5", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/unsigned_underflow_check/Makefile": "03beb64ea16f9748f3d739572b850371444fcafe762a51b4240bb9bbef85fdc1", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/negative_tests/unsigned_underflow_check/unsigned_underflow_check_harness.c": "70f9f7cbe112c6610d9785a425bb43f098e80cefce795a1f79bdda03220d6c06", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/Makefile-project-defines": "9f1fb40fa45392f32901168bf4e012b78adb71e2daf6864d4a1a7d76b84f6f51", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/Makefile-project-targets": "d8c3930590646a4a3b5f5ed446758bf2d8b27ffb742dee196efb816ae2f502f6", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/Makefile-project-testing": "acb51f25870892f177057e7f56e73979e0eeb4967e3280aa160fd33a1a7bb03f", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/Makefile.common": "e23552ebdfa3fdba1bb158d8c868f139f2411a261c8d88f36bf9e2d6c076a21f", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/README.md": "142dc28dad300138bed3a174bdb7ce714f1c6a882299440e63552e2bebd2f7d0", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/prepare.py": "0d50cf7aece2c4f205a058ddb3bf6c1b0c1cfcfa9ea6dca9a145f1bdd7a442f9", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/proofs/run-cbmc-proofs.py": "aedcb62405ffb22af83c4b4cb38a665b57bfa3ecd102d868056b315306a26734", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/sources/README.md": "cfaa166351aeff46c321fd5627d417278accf8e88155481f678702644ce88138", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/template-for-repository/stubs/README.md": "a87bfd893269da4a5c95f88369ce394b1e031dc6dbfd09195cd11485b77eac7f", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/training-material/CODING-FOR-VERIFICATION.md": "84c354dc41a70be81f085e6cb75f8328980b83a68333f179bba3fb69fee29bc7", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/training-material/DEBUG-CBMC.md": "d7e3ec89a44e5efcd8c2accac852bc9f261df54445eb4b3d1b4ffe5126abe6d1", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/training-material/FAQ.md": "d298098f6ead244a7d815aae24fe005e0ea09848abe42dd255694d42632769f5", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/training-material/PLANNING.md": "06ffd2048e70658246cba4359d5bcd121868238ca918041a874fddf311c22a8b", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/training-material/PROOF-WRITING.md": "2c037872b6c0994de2e0028cb9e7a8923342cacb2b6e3adc1c6f4ef3971a950d", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/training-material/README.md": "e453beb7cb3e4064bc6c85102c00176bf77b14e705046b8d8138c1614e237b12", - "libraries/device_shadow_for_aws/test/cbmc/aws-templates-for-cbmc-proofs/training-material/checklist.md": "000710d7ef9e7e716ff58869dfd7efebfa9d7b017672812d089a55698494e52f", - "libraries/device_shadow_for_aws/test/cbmc/include/README.md": "1ebb917adfbfeba5019583d75438c3f745da8a93752e88b1b31bdad351a1ac9d", - "libraries/device_shadow_for_aws/test/cbmc/include/shadow_cbmc_state.h": "a4434df15b61c8ef2ef5a361fda246b48911da926a9e684d52ee742be8fef11a", - "libraries/device_shadow_for_aws/test/cbmc/litani/LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", - "libraries/device_shadow_for_aws/test/cbmc/litani/NOTICE": "becc1029d600695c22c6c3dbe3a8b7824b539d9b7ed533b4ecebbb259dce2d8b", - "libraries/device_shadow_for_aws/test/cbmc/litani/README.md": "f15f69182a049661c0795534e03b6d4e5aa0a8093d5da4421fcb655eb27f7681", - "libraries/device_shadow_for_aws/test/cbmc/litani/THIRD-PARTY": "83a5fa777a8dfb9127d69e1b0b9d776930530258300c41ac8b2180c5699bd273", - "libraries/device_shadow_for_aws/test/cbmc/litani/doc/Makefile": "af66c3b302388d09608d2c335cbea6d74398f1f5a8c4d56c86cd705947bc0689", - "libraries/device_shadow_for_aws/test/cbmc/litani/doc/foot.html": "1694311aa8f471c9904dd4588965bd326173f216e30353e5d65f64371007da1e", - "libraries/device_shadow_for_aws/test/cbmc/litani/doc/head.html": "76ce1041a11873360e6cda911a970b337d2191c125c5d6910798bc836d4d81b6", - "libraries/device_shadow_for_aws/test/cbmc/litani/doc/index.md": "83267d5fead2464a853bc29710fd68793d94a32119c280d89802ede900a1dc08", - "libraries/device_shadow_for_aws/test/cbmc/litani/doc/litani-flow.dot": "bfe01d6fb726571e82beeb4df7751cd72e655b8527edb8ffc4244247537d036b", - "libraries/device_shadow_for_aws/test/cbmc/litani/lib/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "libraries/device_shadow_for_aws/test/cbmc/litani/lib/litani.py": "31844ab14bae0b891200331e6ffeced6a5dd26c3c95c86e160b3344dfeb38d8c", - "libraries/device_shadow_for_aws/test/cbmc/litani/lib/litani_report.py": "9cb5d588df49b4a93c101b674c4c96a3e355654130a88c5fe4dd03703145858b", - "libraries/device_shadow_for_aws/test/cbmc/litani/lib/ninja_syntax.py": "74cf8d2ba381b447796b4db7933711a1844284b192cca23638bfc7b21a54d4f3", - "libraries/device_shadow_for_aws/test/cbmc/litani/litani": "975fe534cc3281675d158416f4b5ed79b0b9fa5345d3f0944844ef2227498c84", - "libraries/device_shadow_for_aws/test/cbmc/litani/litani-progress": "a3c0f0873b06e801587dbbd26aeb9382fdb60b97efffc56b9fbbae9d3627c9fc", - "libraries/device_shadow_for_aws/test/cbmc/litani/litani-report": "ea9aee104dfc7a73cb89a6b01c8ebb581e7fc6e9b4f30796bb96ee07ae5795be", - "libraries/device_shadow_for_aws/test/cbmc/litani/templates/dashboard.jinja.html": "224c4855cf8079003e72c57ce2aa7429bca50924f6d9b5ccf27a711a19844798", - "libraries/device_shadow_for_aws/test/cbmc/litani/templates/file-list.jinja.html": "2151bd3c71559e887d64ba471522f5fc4eeea7f261d118672d390cef3c5fd856", - "libraries/device_shadow_for_aws/test/cbmc/litani/templates/pipeline.jinja.html": "d22892a6cabbe10c9aa51603cb763492012d2212e142b3404fdcf34bcd4e848b", - "libraries/device_shadow_for_aws/test/cbmc/litani/templates/runtime-box.jinja.gnu": "ae73382f2cba9ea418fec6f163192fbadab884296d55ca58ff4af86cfa257baf", - "libraries/device_shadow_for_aws/test/cbmc/litani/test/README.md": "c1e5c0ec6b79a30040e88986dc84d15917712af49a9989aacc1542c725a7f652", - "libraries/device_shadow_for_aws/test/cbmc/litani/test/run-tests": "0b3af49895a6b7d57e9889139f3ed20c028a7611c140e977583a27b7f4028d50", - "libraries/device_shadow_for_aws/test/cbmc/litani/test/tests/1/Makefile": "a2ec421ed917ecd59f4c885faa487eeed30b59d3f8f09f863a00d240b2bcb983", - "libraries/device_shadow_for_aws/test/cbmc/litani/test/tests/1/litani-test.sh": "b1cb5ad8b6c5b640659fddb32988d986b27bded9cf3f1a08fd1ecec87f730e93", - "libraries/device_shadow_for_aws/test/cbmc/litani/test/tests/2/Makefile": "3531c2a1733b48d064016a34b7582874a87757ae279d1c5099cfd3ba6c5f2f3d", - "libraries/device_shadow_for_aws/test/cbmc/litani/test/tests/2/litani-test.sh": "b1cb5ad8b6c5b640659fddb32988d986b27bded9cf3f1a08fd1ecec87f730e93", - "libraries/device_shadow_for_aws/test/cbmc/litani/test/tests/3/Makefile": "3793c6940a452f1db086977f59e648b89c90aee688ff323f5ae597844078cf66", - "libraries/device_shadow_for_aws/test/cbmc/litani/test/tests/3/litani-test.sh": "c95d186c612c5a62e237ee1613e4a51f830c81f1cbc6db442a2ce5f4f67b1fc7", - "libraries/device_shadow_for_aws/test/cbmc/litani/test/tests/4/Makefile": "3793c6940a452f1db086977f59e648b89c90aee688ff323f5ae597844078cf66", - "libraries/device_shadow_for_aws/test/cbmc/litani/test/tests/4/litani-test.sh": "b1cb5ad8b6c5b640659fddb32988d986b27bded9cf3f1a08fd1ecec87f730e93", - "libraries/device_shadow_for_aws/test/cbmc/proofs/Makefile-project-defines": "88668a1c0ec1b0b7a944fdcc4997b050e7633f3f33da0fec37f280c11799ac03", - "libraries/device_shadow_for_aws/test/cbmc/proofs/Makefile-project-targets": "d8c3930590646a4a3b5f5ed446758bf2d8b27ffb742dee196efb816ae2f502f6", - "libraries/device_shadow_for_aws/test/cbmc/proofs/Makefile-project-testing": "acb51f25870892f177057e7f56e73979e0eeb4967e3280aa160fd33a1a7bb03f", - "libraries/device_shadow_for_aws/test/cbmc/proofs/Makefile-template-defines": "50b3687413c3a9a1e42a62954b1007e270fadbfda068fcb8e796b1862563507f", - "libraries/device_shadow_for_aws/test/cbmc/proofs/Makefile.common": "e23552ebdfa3fdba1bb158d8c868f139f2411a261c8d88f36bf9e2d6c076a21f", - "libraries/device_shadow_for_aws/test/cbmc/proofs/README.md": "142dc28dad300138bed3a174bdb7ce714f1c6a882299440e63552e2bebd2f7d0", - "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_GetTopicString/Makefile": "e78d4425a8651d72d500df887628335b1d5e38b419fdf7f81548ef2f260499cf", - "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_GetTopicString/README.md": "accc952272ea78212cf6d4842e274e5212c75b31c4dc3d471fd4c62a0a26f90c", - "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_GetTopicString/Shadow_GetTopicString_harness.c": "4ed02d7a350669d75af2f0bb9e892b5b9573e96be7a78c1303f7b10d71684a5b", - "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_GetTopicString/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_GetTopicString/cbmc-viewer.json": "76ee8989609434f5d85140cfebad4a10f6094b08c3c9f4fdc6f77b8349998bac", - "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_MatchTopic/Makefile": "c3c9494dcce237a07cb4e87c7ec36b0079bdd0999df594d77b063eeac7907e3c", - "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_MatchTopic/README.md": "00d47208dd0ae8c71dff2e619d1255b6c73241fb8d9fc3879f9ae879e000b3dc", - "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_MatchTopic/Shadow_MatchTopic_harness.c": "c6ad96a0574c3403d0fecd41e15e107bf1dcf97cbfb4eb2c7af6653dea18e2f0", - "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_MatchTopic/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", - "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_MatchTopic/cbmc-viewer.json": "b596eaf251320594edc10aab35f561c68f847211325565f18b838719bf8644c4", - "libraries/device_shadow_for_aws/test/cbmc/proofs/run-cbmc-proofs.py": "b37b71fb8ccf4b101ea1ffc65107c857f45fa6e228f1eb9e2041c017efd3319c", - "libraries/device_shadow_for_aws/test/cbmc/sources/README.md": "cfaa166351aeff46c321fd5627d417278accf8e88155481f678702644ce88138", - "libraries/device_shadow_for_aws/test/cbmc/sources/shadow_cbmc_state.c": "06f7f712ef1bb96d24fc3140df7323a07d7385457d5e4c05d51bc76c67b539be", - "libraries/device_shadow_for_aws/test/cbmc/stubs/README.md": "a87bfd893269da4a5c95f88369ce394b1e031dc6dbfd09195cd11485b77eac7f", - "libraries/device_shadow_for_aws/test/unit-test/CMakeLists.txt": "3450a4ea7b5cf02588d8f1c577115788d19e4038f1ec6838c56b5e6deb835bb9", - "libraries/device_shadow_for_aws/test/unit-test/CMock/Gemfile": "98249ab9b0a5d95ca03b9b68992d29d944e132c0eb65e71bd6ffed9f0e40d98b", - "libraries/device_shadow_for_aws/test/unit-test/CMock/LICENSE.txt": "a228c2871b9a779a6542a49470c5b567f2806dddcbcf90af861bb4d39291626c", - "libraries/device_shadow_for_aws/test/unit-test/CMock/README.md": "7e5eda88c3a355bad26c706daa6350186c89fe1db148697192be99fcb38aa142", - "libraries/device_shadow_for_aws/test/unit-test/CMock/config/production_environment.rb": "53043c94478f0bc85135849a7ab04da60cb4fe37661550df8b9ad3b0d3936bf8", - "libraries/device_shadow_for_aws/test/unit-test/CMock/config/test_environment.rb": "a89de3aa45ddf4759f719421ec227594b8c6dd874e61d0972c771f92f81a8ac0", - "libraries/device_shadow_for_aws/test/unit-test/CMock/docs/CMock_Summary.md": "b1950eba2df737fb1a106b15b34a4e92b2fe7a601789ba481d92b6de60e4cfbd", - "libraries/device_shadow_for_aws/test/unit-test/CMock/docs/ThrowTheSwitchCodingStandard.md": "a1838b8c9e20ac3c15bf96742b716b6621c0607c9273ae0f92a6769e3aa45f41", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/make_example/Makefile": "4180bf84b4a71086dcdd9e5f622c63be705981f8e98e311d7ecceb44940c3ea8", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/make_example/src/foo.c": "0bec016ce8f7d6033049664c12cfcc5c0099e638fc6395e753b4d36ea2808d72", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/make_example/src/foo.h": "e987f3bf49f430e2a9cb70bdd7105f8945e028d1598f361b30fe87a0585d97a3", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/make_example/src/main.c": "23c00ca8f9cd5d89107f26d0804e1a2a6f8840941462ddd616f0fa33da7dd0c1", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/make_example/test/test_foo.c": "6d2fe8d7ece7f0f8426fe684896c8bf76d15ea35e56add62d59558b47ee32347", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/make_example/test/test_main.c": "73baf6160697615a9af98a184479a28e92d42fb82c0f310efea1b105910a3b0b", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/gcc.yml": "5c5d558eba12c2c31432472acf7e90559bbd351632f4cb80c3ee621e4e65969a", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/iar_v4.yml": "f5722f968d75bbe9af61c0ad0f01b6b98afa1a08185526ae49ba121bac937ce7", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/iar_v5.yml": "bcf8ab60e79e586b628e8c0aff5c50011dd3db2695468b2ca6b8c25d3783e506", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/rakefile.rb": "5e0b4e5ae6dd28e4d882b06f6a2f99e35febe6a799e5103d255b3d44371f6060", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/rakefile_helper.rb": "16770f78c965b0ea1fd29ddb817d8756bd6f8f3020693c5f0a867732b1488ee1", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/AT91SAM7X256.h": "284e49294ecd18da7c0b4abbf825cf8edb0f68884d334167c1f755b8528b34f8", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/AdcConductor.c": "b14eb5f4196976d82c9501184c0496ac5c071ca9a993ddab0779faea95810f44", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/AdcConductor.h": "961bcc853beb286a6ed95ccaf1b48337e1e36b8e543ebb60ce9a56b80238d8e9", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/AdcHardware.c": "e9aabd8f076c0d1738d6ea6294c0e16f15643ba19483b1ba6eee861f02cbb9e7", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/AdcHardware.h": "af2841747b2659b183891c9c4c00a2b7c065b51a8b958c35d4a6be8564326e10", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/AdcHardwareConfigurator.c": "06b303aab471c751073c25170c8b4bc5f52cd89eb52a29a0db32946975bafa6f", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/AdcHardwareConfigurator.h": "2ac7b673358582f4df15beb5956cb9f66b8c56882ddb1f8508314d96459aebf7", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/AdcModel.c": "885c0a3df693def8de467cc9d9cbb503ba795ffe379d65de02409f8fca2fe360", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/AdcModel.h": "3ea12eb954305556617507aa8983f26fe0cb7afb7c8afc71341056e6d8ca23dd", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/AdcTemperatureSensor.c": "301cb0b59970bc21f85b068d103732e4dcb55cdbb74536a242a2c45ea8151610", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/AdcTemperatureSensor.h": "2fddbdb25206928f3c016ef362174caaf735d683da8e246f8d01f191d3926b73", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/Executor.c": "0cdf97b9afa1e7f2da8580b93a19fc536ad83ff4ff5ad1e42013e795af5db025", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/Executor.h": "11a373abf8479822f68c5ba2c244c922df6366047531c7953b1a257833075a7f", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/IntrinsicsWrapper.c": "95796f352948558443ea6000f9b1237d5b961d2275d12d7b4d33c6d05a4b90d6", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/IntrinsicsWrapper.h": "89354ee37181c2effe24d952bd3e4c7f44f7e02f8a85fe08debc64b4fdef3a4d", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/Main.c": "23b5e3b20efbe81415f4a8c21a47c767d6560e05e59b1a6b0220e5e4ae2503d4", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/Main.h": "6cbfb303c81f28a5e0b5cbb1fc44a860310af5f9c83fd5391b81c61ea4c6203f", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/Model.c": "8d62e7a6d628d609ffcda11085b09ee0f8fe18a1c527d8fcad54810a879cb705", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/Model.h": "409578c18146e8a728d4a0da93ed34d65880fc96dac39c2786a442e6ff47bb31", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/ModelConfig.h": "118773cc1bbaf51497b9e56fb3a65de4479944973565283223241e73abb34fed", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/TaskScheduler.c": "ccfda6443fa3c524f00d5810dfa48fa23e12608cf8e6dde46e5bf10293de717c", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/TaskScheduler.h": "b6e6f8c61bdd97ee32efe3a5b130c68379978ac126dc9695681de1a4393b0e14", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/TemperatureCalculator.c": "8ffc3c06a3449fd560275736c5cc3202137f00d0513e651304c836fd78128a56", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/TemperatureCalculator.h": "bfee490f7a59b6eedcd357c99cbff6be20b33b4aa96d54789aa420f69f3ceb33", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/TemperatureFilter.c": "fb6997e829daeefe1fa89a5febeb8aab8c9a9adfafb5739f60f786c69b57a3ea", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/TemperatureFilter.h": "0731c950b85d436e651737cca0ecff430edea68d62599e27167e7c5a2a57d983", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/TimerConductor.c": "b10f5485f4a884019257dcd143dddfda528af77b1f8b005a40b2443020ef67a5", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/TimerConductor.h": "53deff5a2ce521b48c69e1d85641e2c7da7d0bdbd1de48f622cc1a7df5efd177", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/TimerConfigurator.c": "145397008f450ec09b8bd010b02430c3becddc92a7fcbe31c06a5baf99e32105", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/TimerConfigurator.h": "55e7e6f42f76dc2c9c60137be3b4a4bfd3e9e96e4ce41c2300221bcf8fab24b9", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/TimerHardware.c": "5085266579205f2be126cc0e5f34c443469a3e5da53efd0fa2d95a7653a98803", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/TimerHardware.h": "abddafeeb43ee8cdc31389263b8826f3ccf6a20573ca4702dfeb537b00a04104", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/TimerInterruptConfigurator.c": "596665665389de910b1dbd15c292f141a8e64a2c4a0164a7959121bed2467645", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/TimerInterruptConfigurator.h": "5a7adb509ada4640fdccf739be3de8abb470b41bcddb9a9834e9b238a9fabd02", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/TimerInterruptHandler.c": "7fab66be3e4d5c430a1dfddee56559ba55ab4cd0d448c583637072e9dc9f10da", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/TimerInterruptHandler.h": "5cc7ecbd35069059f0fb2d516f8b63929e0a4d0fa00e53b593f0827d5f637d29", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/TimerModel.c": "315b80af627d601b85c203ad389f455d5a010806ea113fc410c9bb5566cb7966", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/TimerModel.h": "8946208aac57141bc8078bae72461ce1b0afcf9509eb7c9dd52d7643bf3c99da", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/Types.h": "342e458d2f13f4b2f42ac03133f005635bd4002ae446f5aa5006c73f4160a3d3", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/UsartBaudRateRegisterCalculator.c": "a0a5c91867bd150cff7d8d1a25e5e3355a780421715afa1b9b7ea747612b8fd3", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/UsartBaudRateRegisterCalculator.h": "cfe9a2cd19135f1c1058748f6c82be18331e35a7796a8801103458b2c36912e7", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/UsartConductor.c": "3536b396eddfd8d605ac050c18fd150764031ed873e18362fb0ebc34d9d7dc3c", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/UsartConductor.h": "58ce401a82e272c72f0d9cc81310a103d6bebd9565d8ba783d8a99a014a17aad", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/UsartConfigurator.c": "d4805a5c993e1c0227442f926bd9a28dd1d8af59fdb93c35fa707e14d77baf09", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/UsartConfigurator.h": "95eeabe4b7a99b54cf49531930b0a4be7fe812420c53dc1b730dec7f08e2d1c0", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/UsartHardware.c": "97db4fe3c762e48593838b8ff9ba20e08ce02ceb39bffa592b8691d850ecfe0f", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/UsartHardware.h": "99fa878f31c0b2f5d91cc7646ef25823c38a5c78a747a780d4c25754f448af0e", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/UsartModel.c": "36d389273df8ac7d3b28a3490a511c1be2c117d73d9f7a26dd7d34af5c6cd5a7", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/UsartModel.h": "c367f4aab51341ba2dd1780bad6b7cf59c344009505695b608b734b4711592b3", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/UsartPutChar.c": "2b2aab187d2b818ab28750a0676298205a7f7938ebffa440aaff99f3bc37002c", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/UsartPutChar.h": "557610200557eb94f1a7f5d7a1a7d26bd0827f5e2b06749353dfa4fae73d4439", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/UsartTransmitBufferStatus.c": "7924adbc923cd9eb3bcea5877defbacb3ec16a03de29e7327ff064304a914505", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/src/UsartTransmitBufferStatus.h": "955b1a7e0f4de642f8bb6083b8fa8c3f4d75bdc4c378794aac6dde049410d42f", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestAdcConductor.c": "9d22203689e18bdb6daf3a8aee7d17438028deb1d924731a0597c13743616d88", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestAdcHardware.c": "b3b05e87ac62d463ef489eb2e8aca41d2b6829ef8edaab27622c9c4889a59dba", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestAdcHardwareConfigurator.c": "58333e4681ca8a34e98b11129deebc653e44e3587b03b6b7f523a80ace169225", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestAdcModel.c": "dcf55240bd2ce74f8e3bcc28a98ed8037d51375ade9ebb1d61e882b41e11a9b6", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestAdcTemperatureSensor.c": "f5178bbb8605872e09608baff9b049cc826afa278bc1a125389255e786131f8f", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestExecutor.c": "db1bc8f44e9183b2a7909c0c0b8fac6b25b37d4aee0f47c9ab181500cf384ac9", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestMain.c": "67944d7590384483ecb8b1c06cdc9426e4c78bdfa99886f4d24f9d07e2aa84c0", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestModel.c": "1720d2acf16537a03ff8b6e800f04c46312c9f17985d856f3cb3f64309a869f0", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestTaskScheduler.c": "4efcd2cc31f7c3737f8a0143faf05f370466cb7acf75f0d15f7d661f9303472c", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestTemperatureCalculator.c": "f0b725debcc365c16a055371f3f48534d3f30bac75804cc9c5838850a8bb91c9", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestTemperatureFilter.c": "ffc624388daa2322ce339cff9445abf37cd2372534db356f57821b9e49874761", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestTimerConductor.c": "7d2d58e797a65e44698e30cdb79cac7e94fb96c8e95623c3ab8f9ec0f9078809", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestTimerConfigurator.c": "51748b3199379ebd5797c4da7bdefed444aed398ae36508c098c3f00a2a4416c", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestTimerHardware.c": "7ab489c8cdf7d8d0421482a1a6ef7b1f8663e38453a140e9a5550d1c67844170", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestTimerInterruptConfigurator.c": "7f8eb3100b9091d2996c8f75459659e8ae0c5a75f0d5ee08e3649b17f3394cce", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestTimerInterruptHandler.c": "0000e221012abd79eaf668188923275b7e7e12ef297b15b2165e35440c0f1eac", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestTimerModel.c": "cee4214bb0cf367910562488f448014bc802274d2894bc87ad9fa49098a99add", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestUsartBaudRateRegisterCalculator.c": "729c0d4162bd09ac4514e2de1f70e1b0b4fb05ee125dcfb91314aa40986e8235", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestUsartConductor.c": "ab351f7a74ba445200ccf3d851122fb86531e8511d8cbbbfd1d70b9ccd4a93a4", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestUsartConfigurator.c": "719758e045571b2c532007e37cfe9939eddcc850e069481524f5d4b17d9d399e", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestUsartHardware.c": "c29fa69264fd62d7a466a95de9c927e94119b366ecb1d333be47c60de6183fa1", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestUsartModel.c": "5ab9a684792f271e587d4e861de5c3dc90439dcc4670d7a06da8bd078161a2df", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestUsartPutChar.c": "cde5d54b2acf09a6caf86e360c9a2fd40fb6ccdc8fcfe78d4b10ca7c34d95e9e", - "libraries/device_shadow_for_aws/test/unit-test/CMock/examples/temp_sensor/test/TestUsartTransmitBufferStatus.c": "d66b41fefa7200f926652c67cc3797b6143b321e7be5eefb099caaa4cfe2af37", - "libraries/device_shadow_for_aws/test/unit-test/CMock/lib/cmock.rb": "f0edc4e161d909610f05f5e915b8262efb41afa36e0ac3be131f5626d3c58960", - "libraries/device_shadow_for_aws/test/unit-test/CMock/lib/cmock_config.rb": "967100e4f4d602c934d43c00d7f996186a241c6e50f3351e5488039c23891511", - "libraries/device_shadow_for_aws/test/unit-test/CMock/lib/cmock_file_writer.rb": "10145593832b79591152a96fe63371c921b0a544a1fa5811d268b520923cb8ae", - "libraries/device_shadow_for_aws/test/unit-test/CMock/lib/cmock_generator.rb": "4d3becae94cdd6e22c11e9bb2b925d94cb5dd1db38585963dd41a10b5b212ac9", - "libraries/device_shadow_for_aws/test/unit-test/CMock/lib/cmock_generator_plugin_array.rb": "0cb11153bbcc6e2cbaa07c74e9586e3172ce230019bc3f022894520c086f21d6", - "libraries/device_shadow_for_aws/test/unit-test/CMock/lib/cmock_generator_plugin_callback.rb": "4119c7f44d9e28264069064e1291589a16274bf93e5a14552e11a620ebb7dbd9", - "libraries/device_shadow_for_aws/test/unit-test/CMock/lib/cmock_generator_plugin_cexception.rb": "708f8c4336375acfcfec43e8190154cce8e12728e74737285824fb65944cca1d", - "libraries/device_shadow_for_aws/test/unit-test/CMock/lib/cmock_generator_plugin_expect.rb": "6df76c4d83db376ff82bb045c0f3003818f411fa7d9157a3a94e07031faddd22", - "libraries/device_shadow_for_aws/test/unit-test/CMock/lib/cmock_generator_plugin_expect_any_args.rb": "a89ff1e3376663d193d43f4d81ced30bf4691415ee98bfc12a29c6cc93cc25b2", - "libraries/device_shadow_for_aws/test/unit-test/CMock/lib/cmock_generator_plugin_ignore.rb": "5dd940f4b8ad31ccb94183e3c49a94410d1bdfdeefa33041dfd6de167f874abc", - "libraries/device_shadow_for_aws/test/unit-test/CMock/lib/cmock_generator_plugin_ignore_arg.rb": "8b65b5e69deae8a1bfaec78a7fe289ae96da9ecbf5f75bfc927f66326752ee0a", - "libraries/device_shadow_for_aws/test/unit-test/CMock/lib/cmock_generator_plugin_ignore_stateless.rb": "035693e7216923faaebee04641328fa470354209a24c2cc1511da76a16eb061a", - "libraries/device_shadow_for_aws/test/unit-test/CMock/lib/cmock_generator_plugin_return_thru_ptr.rb": "d9e4becb9f498eda5789f018afce08b7754b7201f839269753233d4a96afa7f5", - "libraries/device_shadow_for_aws/test/unit-test/CMock/lib/cmock_generator_utils.rb": "a3a991519847f367060ce0ee9573c3fe198572dc2293b62530d20eade3231acb", - "libraries/device_shadow_for_aws/test/unit-test/CMock/lib/cmock_header_parser.rb": "bd3517c139bd3e77b852b5462f2ed3819e3c8a2246edfbe1c3bbc7be96aa0070", - "libraries/device_shadow_for_aws/test/unit-test/CMock/lib/cmock_plugin_manager.rb": "c4af08cb8b44fa782c0cc6b5027d5a0001241492bbd67fd3b900c735daff7650", - "libraries/device_shadow_for_aws/test/unit-test/CMock/lib/cmock_unityhelper_parser.rb": "35a45f4dbfddf0ae863ddead0b302ee1b6ac51153295be5c07bd26fd9c397787", - "libraries/device_shadow_for_aws/test/unit-test/CMock/meson.build": "499a9acba3250bb3654bfb97429e4959d7e919965f80cf2654c095139b9528fd", - "libraries/device_shadow_for_aws/test/unit-test/CMock/scripts/create_makefile.rb": "a89601aae619a101901c98fa211c24484ce0f16abb4fdc74339973da630e2de3", - "libraries/device_shadow_for_aws/test/unit-test/CMock/scripts/create_mock.rb": "f0ac5b9b046564354f3b1dc548220842936901f1757c0fc80c6a38aca207ec52", - "libraries/device_shadow_for_aws/test/unit-test/CMock/scripts/create_runner.rb": "3913d1d40de255a31cc338f52e632d4b4b05e975b30c1a03bbee7d1e3bb95901", - "libraries/device_shadow_for_aws/test/unit-test/CMock/scripts/test_summary.rb": "7f782242056d906c3759ec8785c47b4006cb658ae88d5b331fd0b45a546c6e94", - "libraries/device_shadow_for_aws/test/unit-test/CMock/src/cmock.c": "6cd73033ba5ad688626bad666169d0869f7978bee7672a098998e0894d9b1287", - "libraries/device_shadow_for_aws/test/unit-test/CMock/src/cmock.h": "fb386d093680f1f82fa493d29959e3cc6b195c2738c07fc36a3c33868881a5b2", - "libraries/device_shadow_for_aws/test/unit-test/CMock/src/cmock_internals.h": "33176ace775e36ea3aaee1041d5df0967e5f120170f17f68be1ebc54c91f3027", - "libraries/device_shadow_for_aws/test/unit-test/CMock/src/meson.build": "29260b081670469c41d6e6fb0d6225aa1323b9857ea9baf7631257f896fa8afa", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/c/TestCMockC.c": "7beed4e807a064045a2f00bb149af817483fc70331aedfaa0d2934d3b94f993f", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/c/TestCMockC.yml": "7457da36df8102d71c336ca384702879161097ff542380bed78cb5446984ae4c", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/c/TestCMockCDynamic.c": "eeaac501c9e65e166ebd11b90c5275c67597e81e6c9c3156faf006751023495b", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/c/TestCMockCDynamic.yml": "4755d85389465ac56733780ec7da93965dccf5eba935195acbbb7de251c6048a", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/c/TestCMockCDynamic_Runner.c": "ba26744cbf8c4f1ea7de6ca7254700bf1e16ae57682270dc4d94393ccd501588", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/c/TestCMockC_Runner.c": "465d91fe9d981509a92267d0471fbb3e412a88b6f7d50437fe91e47ef6d69e8f", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/Resource/SAM7_FLASH.mac": "8ac360d36256589216b144c525d510af24457ef763becd14b137f63e953cc17d", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/Resource/SAM7_RAM.mac": "df15f8e476e1ca1b8d3141cfe0c801881939e70cefca237a98d804742cccdcfe", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/Resource/SAM7_SIM.mac": "6177e42e1a0a493976fb4d196b65cb1257e045db281ad48569b4b9ee6d9f37bc", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/Resource/at91SAM7X256_FLASH.xcl": "8594f9522b6ae41e96ab7b848dd7e4024876f7882d95f60a8bb6577ffd154605", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/Resource/at91SAM7X256_RAM.xcl": "713104cf6bf984663d5227b3ea6fe1d045413630b5a71404b2a2a7156346ae9b", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/Resource/ioat91sam7x256.ddf": "f23d06dcacffa6d544f4a560a4692bdaba7b918b488b810db928b418a4bbfd88", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/cmock_demo.dep": "5157f2a91a7169b63aa30424a220053a8983194e6145d14f3a39bfa2e63175ac", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/cmock_demo.ewd": "176d8abee2d57ee30575952da2aa2bfa4dc851b908e44df728b6a4a2c222fd8c", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/cmock_demo.ewp": "ffacbcc9ee4b092f01af22ee7bdcd34bff44043cd3c903ff9530912b0d4eaf0a", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/cmock_demo.eww": "7b5fe1867f77d1c6a09c591e3c4705a20ec0102a10e5049aa3fdb1989596e23b", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/incIAR/AT91SAM7X-EK.h": "41b4cd1cbc547b10818daf44adeb335a7dcd6846b229195c156be0be9b1cc056", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/incIAR/AT91SAM7X256.inc": "5f7c307376baf65d6ae5e16bb23b7d9374b713c7a8bd963240418dd026f5cd79", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/incIAR/AT91SAM7X256.rdf": "f7a13e637d12010564f884cb25ca152909f5cf056fbd87b8f837e6e999305411", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/incIAR/AT91SAM7X256.tcl": "959dfe614a39ca1c47aa5e42d10979bb939c4c0464cc01f3d395a17baa2759f8", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/incIAR/AT91SAM7X256_inc.h": "cf75fa42dbdac6d2e055ee6a1b4be6c3fda982bca36832167dbb3338c2529ea0", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/incIAR/ioat91sam7x256.h": "df4353041f1daef07fff13afedf5c82b6502ec3f27af4b7943a409dbf27bcdc4", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/incIAR/lib_AT91SAM7X256.h": "d500574f73b3e2c0e026d600f9949f680270aa9e78c82b0250276c75edbd79b1", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/settings/cmock_demo.cspy.bat": "0b95a0e1455c0947578eb48f8e77dc4303c672208d92a29883061115dfd4740a", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/settings/cmock_demo.dbgdt": "16333ca6fc95ee3c09e1d65fb546fd714e1039a2d83a7ab88d5113f7b92e89de", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/settings/cmock_demo.dni": "36b4ad5d2c76a305040b922a7b27d4d36f68e3ffaa13ca327db77b7f82280e6b", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/settings/cmock_demo.wsdt": "1502e8d1c367c132f62906a92a931ced79057ef818fdc502900ab6fa092681a7", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/srcIAR/Cstartup.s79": "73b3a3034252453843ce316daae1cc691d8289a6943105718c04e5864b384110", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v4/srcIAR/Cstartup_SAM7.c": "15857d19064c45c733ffc3c3de66b9f987bdd44b8e1d29b3ae17a355faaa3472", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/Resource/SAM7_FLASH.mac": "8ac360d36256589216b144c525d510af24457ef763becd14b137f63e953cc17d", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/Resource/SAM7_RAM.mac": "df15f8e476e1ca1b8d3141cfe0c801881939e70cefca237a98d804742cccdcfe", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/Resource/SAM7_SIM.mac": "6177e42e1a0a493976fb4d196b65cb1257e045db281ad48569b4b9ee6d9f37bc", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/Resource/at91SAM7X256_FLASH.icf": "d37f75919b1793bac86891e7fa9a9142ae83de351d5ef169af909ce770ae6d01", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/Resource/at91SAM7X256_RAM.icf": "170c34f5e702138b2b20cb696a482886936cdad8eaddb18c6c84abc5facf0a17", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/cmock_demo.dep": "0a869be5fc1a6ba0991c5012d8d4bf21ecdaf35ce23ff2207bbe35fc72b7acc2", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/cmock_demo.ewd": "5ebda13f0da843a1a4343bdb77c728d72ffcf8356a48eb6e3d5527428f6a1ba4", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/cmock_demo.ewp": "019d8fe92e6206e06b9fc46938e2ac19d9b8d9e27186f4ed05bc9f1f4ffca31b", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/cmock_demo.eww": "252dbeae342d9ad0c34d7f4a622dec74a5f400c08ad931771dc418dcc8aea7c3", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/incIAR/AT91SAM7X-EK.h": "41b4cd1cbc547b10818daf44adeb335a7dcd6846b229195c156be0be9b1cc056", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/incIAR/AT91SAM7X256_inc.h": "7fbf38b71f042bd3130dd7a0cc6e55130eae320e4fe705e078e5f9144c6e03b1", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/incIAR/lib_AT91SAM7X256.h": "405c0c979b5c39e520624e0b5da725690c69f220d5985c6129b1be0bde3ff4a1", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/incIAR/project.h": "431c8cdd8373916c97b6555fd0df183b4eed8799fe61397c5b9458d71e194edf", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.cspy.bat": "2e1acdf2e55863b5e33588ee350d4ea8325a79aef8f143a1d1e4dc9a20894ebe", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.dbgdt": "1967e4e174ca97638a540915477a6cbc829cf2d19bb4ad6046ebb43cef922619", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.dni": "e7db4742adcbe78483a5a2bd0510ef338a2ddddcca3b4587d493c54fec22a722", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.wsdt": "bfd819154f05571882a5c70fa8e47aaf4a6be521b9ce321b086ecc8b3fad2fe9", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X_FLASH_Debug.jlink": "94a14185b32946b9295be7a4230afb5f71ddf87bff3e9f279ce4d82feabe98f9", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/settings/cmock_demo.cspy.bat": "98d3f600ca83fc5e0e141e27f17c92b52b28997445a64d7f63cb4312f490a580", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/settings/cmock_demo.dbgdt": "942572f2cb503a36b9e633642c54e72dc8bc929a41a9430fe62837ea3eb837c0", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/settings/cmock_demo.dni": "35f715df5935f7b03aae4126e33e296bd36df32f86aa00d425a09e65ce1fb66c", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/settings/cmock_demo.wsdt": "b5f6a167aa78028b09a439565dede111bf8119403c9f290367163356008807f5", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/settings/cmock_demo_Binary.jlink": "94a14185b32946b9295be7a4230afb5f71ddf87bff3e9f279ce4d82feabe98f9", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/settings/cmock_demo_FLASH_Debug.jlink": "94a14185b32946b9295be7a4230afb5f71ddf87bff3e9f279ce4d82feabe98f9", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/settings/cmock_demo_RAM_Debug.jlink": "94a14185b32946b9295be7a4230afb5f71ddf87bff3e9f279ce4d82feabe98f9", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/srcIAR/Cstartup.s": "f01a69400b4d52ad0202134d4d1eb2b2afb8b5b90f19cab527ef2c63354725a6", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/iar/iar_v5/srcIAR/Cstartup_SAM7.c": "ffffb70bb3424fb7537c766bfa1d0831154bbc455b10a7085ddfe6e5a51cd8e3", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/rakefile": "d324d932b8c69438ad43e7fddb4b28ec67e5c842b0dad2acb2554bcbcee7542c", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/rakefile_helper.rb": "7885bdc225c6b35de64317b9c2a6352e8637be6538280c9cb7efb60b76cd9a3a", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/systest_generator.rb": "58f80ae3b57314f1ac5ce062a5c8b073e51b69e244347fcd2e0909a0918d4ce5", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_compilation/callingconv.h": "f0d451838c94b20cb9df40827b1667e82719adf34bc7f848ce1ab330a95f5ece", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_compilation/config.yml": "55da291e818f575aaec65bfd678b9bc92badc2775bd012ea465d124bb03f6874", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_compilation/const.h": "452666930532c934d30c06081a1207422064421e2111ef3d774f60801c8d0298", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_compilation/inline.h": "faae36b96040414ffbbd8c9cd0ddcf1d918b5431ad81c12e391fe8b283ae915f", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_compilation/osek.h": "6283a1ba1ce53af3c73e246ec073497aec8d5da7e573f8474a45e1ccaf72730c", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_compilation/parsing.h": "f6f31c9b303aaf2948ed48cd6e8dcc0d7cef5bacc91b5746b11d432701911bd4", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/all_plugins_but_other_limits.yml": "23512e99944a08a4517037fddc6f13451118a23a19327270e7f0cde0a882643e", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/all_plugins_coexist.yml": "2fa3f85fa5bcfd432d7e82be741d3e4bce969182d3b3c4335ab2bac494a8b3e2", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/array_and_pointer_handling.yml": "afd7b725c51a0268b2fe582416b59e303c611a86af8359627a10483ccf4ac3dc", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/basic_expect_and_return.yml": "188b82892feac0f148d9b8d1edf9929e4145d8adb7ffc0b2752be3dfe5c620d8", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/const_primitives_handling.yml": "2610282b06d4b05f3f7e9b22254278648a29dcf1808f8206ac92d183ed7c7ebd", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/doesnt_leave_details_behind.yml": "5d39bdb3fb162c3664ed180754c6b8042c12ad7e29ccc65b42c312ccfeed322a", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/enforce_strict_ordering.yml": "85f9cc7ce2eb22b0da825ca8d6e38a05bffb69dab0e66c0e516753b74fcfe10b", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/expect_and_return_custom_types.yml": "361e10a02795595bf45c64b2026d9342fff1e4d0308fb5202413bffb84bd3b10", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/expect_and_return_treat_as.yml": "6601ab58a7b0719e26124b40d3aed2272a032f4ff3ae45da241b0b39bdf03ce9", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/expect_and_throw.yml": "18eb54309f69744598138a5b3f8ef4b898bbc3fb46b1a42306016d6ed566c1d3", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/expect_any_args.yml": "1348aa720acf85e117c6c23353f205b3438eac30baee86efeacbdc04f2645d27", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/fancy_pointer_handling.yml": "a3033a4e31bcfbf66126059476d9fdc7bdaa197a8b6568a382c93e373110abb4", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/function_pointer_handling.yml": "85c81773cf1dcf80dc84ccb433d8442aabde1b8635292819315287e828b93f63", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/ignore_and_return.yml": "4300c43c2e59a39111809e3e4571484e45146344a20d706a2c0c8618159fa2ad", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/ignore_and_return_stateless.yml": "4f9358583b2f8159251937699441854a41ddbe0bf9b1d8fbf1bebfeb8f32c0c1", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/ignore_strict_mock_calling.yml": "08c69a141af52960e0e9043d717ff5df442f7889edcd145898c0cade3fcc3e72", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/newer_standards_stuff1.yml": "f2073b808f4cc2d918612ff1c910fbc4a8ead998b12fcbc7608d430fe71d8eb9", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/nonstandard_parsed_stuff_1.yml": "23db82fdbc1643ed58a58c20a4154e75b8559509a3f827fb43e9c5965103e4f6", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/nonstandard_parsed_stuff_2.yml": "f51bae36303d532e357105195369615ab17560234efb1f0141973c2794ac0693", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/out_of_memory.yml": "4b4509e9c368fdec539be90daa164185175849afcf39c2d0a9c4d9ff9e423191", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/parsing_challenges.yml": "6f9a0d35489a6e6435211923ea43349e17cb68fc9652cb98511be8f74a78a079", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/return_thru_ptr_and_expect_any_args.yml": "64915233c5cb94bdff20cf89f650de58f278a214417bacf52129b67d67208cc0", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/return_thru_ptr_ignore_arg.yml": "cde16df22f47d782043ce85063cd7d53dcb3473eebd25631bbd18d7d87c38db0", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/skeleton.yml": "569c26fecbd11f185b9e4a5e2a0377306d18b2bf95402d9e04c3865468e1e066", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/skeleton_update.yml": "db55c821e8ea59817cd6d65f69a119bc1b1c75dff14fac1456167a5488b8e96e", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/struct_union_enum_expect_and_return.yml": "c926cca48cce1932fd57dc871187073cf3e35d12569369695a18a4a6fb7be3f8", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/struct_union_enum_expect_and_return_with_plugins.yml": "29f087a7f1217b3724517523dbf122bfe07277505549c465b1821df926b75c6e", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/stubs_with_callbacks.yml": "5e2cf62796105fa958e9528d3a30cff3a83c4f9d23385ab75a5939841647c486", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/unity_64bit_support.yml": "91a78d7f1216c1c18388116c169d2da0994351e61155fa6bb622bf16b635838e", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/unity_ignores.yml": "f6e9193481c9f0a5c5ab50833fea66da7bc34977b35a176fd613130ec883bf92", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/system/test_interactions/unity_void_pointer_compare.yml": "b92f86081c7771eca83efad7e38e071ee5bf8ce2e1a410df7d7af9c392486e6e", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/targets/clang_strict.yml": "4d477d7d7c1ffe0ce9175b89d4812119c7a0a79e924290e59c3dbd46b0975de3", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/targets/gcc.yml": "f012ab43326a37713fb72f33c0e03771fbbf4347e549de6cfdb476cda0ad9118", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/targets/gcc_64.yml": "0c0df186d99f01666f0d8145289179d86298c3671cdd7083c5e3c4a41625d5d2", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/targets/gcc_tiny.yml": "c9b57fd070a3e98fc3c237c9b3b99b31d0cf01cc0565b81812f57f68ca340714", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/targets/iar_arm_v4.yml": "fe0f205df28d23f4a940c1efce9e74ddd227427eaa55a70a283d8ff0722e45f4", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/targets/iar_arm_v5.yml": "7649d656896a709b2124b232bbe2d4911ae141617ccdd947e1f1541f23615bed", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/test_helper.rb": "7561fd77c8b7c6ec581d2e946db129893dd842d813801bd5ff6dfb42eb98cb19", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/unit/cmock_config_test.rb": "a583acc99d07d80cf5cd6ece9765e1f43bd834576d30df342b1769b9889050b5", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/unit/cmock_config_test.yml": "2b1460d832657fe5f69b70b92a7bcd40edd42346aea4bab20043ffecd43719e4", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/unit/cmock_file_writer_test.rb": "88cf580634a0907f12b8068f1deefe7e90a14b0111d55da6d413f3827347b9d6", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/unit/cmock_generator_main_test.rb": "2d51d72ba7d6ccd664556e2c2fe0cfe1aff821e351de70a0a8d0b241bbc5ef73", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/unit/cmock_generator_plugin_array_test.rb": "560f97841377b5ae6704cd4363e0d21c8883abcb7f5d2907608e6c0aa68c3518", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/unit/cmock_generator_plugin_callback_test.rb": "5134242ce1626493fba063b040edcdfb955267374f58dcc0a500c198fb26f51e", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/unit/cmock_generator_plugin_cexception_test.rb": "4a4bdfa48a17829dd1c3d58cfd4da6769bfde6bd592b55afc2685d24a667fec1", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/unit/cmock_generator_plugin_expect_a_test.rb": "4ec2bfdb7c6f35c1b9d1e15748891dd2e823f304892207030265f3769c990d37", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/unit/cmock_generator_plugin_expect_any_args_test.rb": "1b840d79c1630365f47e0a304daf5e52c76d2bd2815d37ca7590b30fd51fbec1", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/unit/cmock_generator_plugin_expect_b_test.rb": "a37304cc8f794c0d70298cd4873701bd5307b0c3827af0e453dff00911e9d47b", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/unit/cmock_generator_plugin_ignore_arg_test.rb": "cc79bf0080a069d76e91c230af75751e32fc86fbf4992b202d4905cf14368aad", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/unit/cmock_generator_plugin_ignore_stateless_test.rb": "dad02980c5efdd1182b4fa45ced2e36a1f0678df19ceaee7719c3c8303f47a9a", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/unit/cmock_generator_plugin_ignore_test.rb": "dc09b360cb2268924a6bc839a3130b9215c813780a3e71e589512015608e300b", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/unit/cmock_generator_plugin_return_thru_ptr_test.rb": "0b7351668087ed19560e963fdca2cdab19c1973e1f9274c0302f18110a7610ee", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/unit/cmock_generator_utils_test.rb": "663b3caa05cf3b0f889b7e7251643f38329bbf6a83c64910b8e3f917a1dca361", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/unit/cmock_header_parser_test.rb": "1c2c7b81d2f1c44b9a10eeef06e70c77fa14947e7dc889a37632dc9b680755dc", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/unit/cmock_plugin_manager_test.rb": "510fe651508db42d428539b63fbf2aa5c2601ac4b5f1fe0d5d756ba4f03f08e5", - "libraries/device_shadow_for_aws/test/unit-test/CMock/test/unit/cmock_unityhelper_parser_test.rb": "e77b10af099223b17e9c524d0e6520a8d90ef878f9326d8729a3d0cab437d172", - "libraries/device_shadow_for_aws/test/unit-test/CMock/vendor/behaviors/Manifest.txt": "f6def0d4d599a6d17c7b0a6e5cc65824ba9312a85c4d9640f9f40f3a65fe6e39", - "libraries/device_shadow_for_aws/test/unit-test/CMock/vendor/behaviors/Rakefile": "be9b1156744f3cf65e64c075ae5385313ce59e5ac4178ed8c63371bc817d214f", - "libraries/device_shadow_for_aws/test/unit-test/CMock/vendor/behaviors/lib/behaviors.rb": "c818cb720cce5d3da2b1a1e09601f2329f8889cccfdaf4e7ad7482d2524609d0", - "libraries/device_shadow_for_aws/test/unit-test/CMock/vendor/behaviors/lib/behaviors/reporttask.rb": "6abac47d73976e719ef3b2e47ffde7e048a08044e807b8d5b3eca7ab18c3acd8", - "libraries/device_shadow_for_aws/test/unit-test/CMock/vendor/behaviors/test/behaviors_tasks_test.rb": "04ef3a3e45cd62bc102267a2919240a9a021438e0dafccf2d817234104426ba9", - "libraries/device_shadow_for_aws/test/unit-test/CMock/vendor/behaviors/test/behaviors_test.rb": "4240fa9b7f31dcff3c5509827ebed298d2c388f55b8701221874300e815d76e0", - "libraries/device_shadow_for_aws/test/unit-test/CMock/vendor/behaviors/test/tasks_test/Rakefile": "0c9e136971e8aeb54404b4827de1b85cabb5512a8aaf8f36929e052339144638", - "libraries/device_shadow_for_aws/test/unit-test/CMock/vendor/behaviors/test/tasks_test/lib/user.rb": "b5527ab1ec2cde94b51b84e785840a076ceb4df87f8c71a52eb9119a1785f1d5", - "libraries/device_shadow_for_aws/test/unit-test/CMock/vendor/behaviors/test/tasks_test/test/user_test.rb": "e12e02edcc9868ad43634427fef9873e7e6a03a6144d59ed302d1f40beab18d6", - "libraries/device_shadow_for_aws/test/unit-test/cmock_build.cmake": "d73f758fdc599d6abcd447dbbd05331a14615eeb631b22cf5101b8a3d4eeebc2", - "libraries/device_shadow_for_aws/test/unit-test/shadow_utest.c": "64bc9c0222c96ed2e5af10c9e8f543b21d371e7791101554478e7947142bea86", - "libraries/device_shadow_for_aws/tools/cmock/coverage.cmake": "8ac1ac5e6d5628fc8625d57f74249f15f53eba61f8338813d36d3dfa9dc1cf9b", - "libraries/device_shadow_for_aws/tools/cmock/create_test.cmake": "41dc66ba43772ccbcc59871e16ebc60b8671875e0e59d9068313be0aac1f25b2", - "libraries/device_shadow_for_aws/tools/cmock/project.yml": "805074ab6dcf01b29aac19ab1964b70227d0f7013b5b755dbf5c17ae66e6a0d6", - "libraries/device_shadow_for_aws/tools/misra.config": "87445ff3dcb7c836a2f1ed650d751277aec5fd90639a73f43fb699dfff33b15e", - "libraries/device_shadow_for_aws/tools/uncrustify.cfg": "55c02144fdaa3d62e03ed97e3e89a54b67d9433a5320ec02ec82e75344b21656", - "libraries/freertos_plus/aws/greengrass/CMakeLists.txt": "393bd7ea752c2e8cd5c8844ca16ef65f0e511425fc5aa93e685ebf185e108d8e", - "libraries/freertos_plus/aws/greengrass/include/aws_ggd_config_defaults.h": "434b1e4a7fcc217e88275ac039f602e484e5d6b424bb010515d53c7cecc316c2", - "libraries/freertos_plus/aws/greengrass/include/aws_greengrass_discovery.h": "5798efbcec0e5e969cbd169e75c277adfa844b05f8e39ced88ad8d4fbe969d57", - "libraries/freertos_plus/aws/greengrass/src/aws_greengrass_discovery.c": "a314e73563229f862e4b0e104c1aed2a7140a893e69bbb6dda01e7bda4da25bf", - "libraries/freertos_plus/aws/greengrass/src/aws_helper_secure_connect.c": "40e0e21bb6cb1a392e3db33c129f5b3f183948d95605edacfe3e18c02d008514", - "libraries/freertos_plus/aws/greengrass/src/aws_helper_secure_connect.h": "8a71233b2b831488a385f659530907a26adddb8edfe391c0adce7a1497ff5758", - "libraries/freertos_plus/aws/greengrass/test/aws_greengrass_discovery_test_access_declare.h": "45272bea7f9a1018ceb9028e03145aa789fe5b367310b77c4f4e4fc993007f53", - "libraries/freertos_plus/aws/greengrass/test/aws_greengrass_discovery_test_access_define.h": "6bd7b214b1e9936dc7fa4bb9f6604ebb79af66ae7e94891ca2c3948b4137f176", - "libraries/freertos_plus/aws/greengrass/test/aws_test_ggd_system.c": "8dde331777cf0a01864d12003f2e7fe3c2d9ed2d834ff576c793ebb5062eb6de", - "libraries/freertos_plus/aws/greengrass/test/aws_test_ggd_unit.c": "6c0952a26a21ad22eb0ae4786525652ad21a45f4bfb42ff4c9cd20496ec124d8", - "libraries/freertos_plus/aws/greengrass/test/aws_test_helper_secure_connect.c": "99004b85bd8ffffb1fe6113d7a24cac09c394d1250d9d9c58d3858d98f96e472", - "libraries/freertos_plus/aws/ota/CMakeLists.txt": "bbccd996cd384cce21e8a89e8767d0353c434242c7f0eea2cb8899cbc9d77c46", - "libraries/freertos_plus/aws/ota/README.md": "b18ac6726e49fbd1f1ae96f8fc3551b0d9a226cd34d82503e3f2e641bf89b64e", - "libraries/freertos_plus/aws/ota/include/aws_iot_ota_agent.h": "b742809f8ab1e112e3fc43b5666daad95ccaaa10d79c34e69986e438a02b4c22", - "libraries/freertos_plus/aws/ota/include/aws_iot_ota_types.h": "57182b26616084fc42ba2b062e1d6e76466acdfef09f0645cd2a05ab766c8ea1", - "libraries/freertos_plus/aws/ota/src/aws_iot_ota_agent.c": "442ad0fa4d83b3565e9475ba3777e3e592a51b761547febccfaea43ddb2324e0", - "libraries/freertos_plus/aws/ota/src/aws_iot_ota_agent_internal.h": "dfd6ca7fb76631b5d9599070f91339a5ec6e259cd37e7ab912e5a42d4382fd8d", - "libraries/freertos_plus/aws/ota/src/aws_iot_ota_interface.c": "06f304e0659379ca35e293df481923160c1245a001c7343ea613530f9cb10a43", - "libraries/freertos_plus/aws/ota/src/aws_iot_ota_interface.h": "068a154bf5b8fca5b40bbde581839227c27b0c60e9bbaff7bbd3a64a92e07dee", - "libraries/freertos_plus/aws/ota/src/aws_iot_ota_pal.h": "c46e0c47c77368aa6bf23cd67eb5a44bce31552c6dbdf82fa937183439a0c187", - "libraries/freertos_plus/aws/ota/src/http/aws_iot_ota_http.c": "84f903d6f44293df041390a384a2aac2dd224488117ddcc4f0c15245322597b1", - "libraries/freertos_plus/aws/ota/src/http/aws_iot_ota_http.h": "31b163f629af2dcacfac4d2d7006c47a67ae80590e739d5e9ac95131edae2540", - "libraries/freertos_plus/aws/ota/src/mqtt/aws_iot_ota_cbor.c": "d72c60fc721724da9c96e952d326db64510c85bbe7e3622a8a9c218b2a3687c9", - "libraries/freertos_plus/aws/ota/src/mqtt/aws_iot_ota_cbor.h": "2ec1f8fc7211d684f84df8663e03b227bac0fd2c3ec672acf3e9dbbc7b3f7b08", - "libraries/freertos_plus/aws/ota/src/mqtt/aws_iot_ota_cbor_internal.h": "6216ff295ec1bc8462f586e040413e670c528c948fd7c913c94c38738ca0fc8c", - "libraries/freertos_plus/aws/ota/src/mqtt/aws_iot_ota_mqtt.c": "54e002b3f4eb0d786e3c1560c000722ea4ce31680b5a1fedafa578bba58284d5", - "libraries/freertos_plus/aws/ota/src/mqtt/aws_iot_ota_mqtt.h": "8c5875e1bdcc526808cbe568633d93bc91fb97f59abddf14b38c91bc12545044", - "libraries/freertos_plus/standard/crypto/CMakeLists.txt": "481befa1e33d2e1ebbacfd42083ebd9e4241905936132ec0d5f1c6161a9c21d4", - "libraries/freertos_plus/standard/crypto/include/iot_crypto.h": "979b169dd680d14602477c67d22f9827d60740faedbd472db66ffbde2d42d34b", - "libraries/freertos_plus/standard/crypto/src/iot_crypto.c": "c0931523c2818b313332964317ea4426b445fc76bae20859616a15ae85ea6b13", - "libraries/freertos_plus/standard/freertos_plus_cli/CMakeLists.txt": "e00100014f7209e35f71f54f5f8789c136ce62160ca07f6a414c989eca594136", - "libraries/freertos_plus/standard/freertos_plus_cli/include/FreeRTOS_CLI.h": "7de127b16025300d2f54a063aa4e122c464a060890875705e45cdcffdcbca295", - "libraries/freertos_plus/standard/freertos_plus_cli/include/FreeRTOS_CLI_Console.h": "d431af28dbc1110cd58d06a90c317413aa73386c800382647d9de56525940f37", - "libraries/freertos_plus/standard/freertos_plus_cli/include/FreeRTOS_CLI_UART.h": "63e0aaadf729cf0b0ec72457be88e054fec9366a54d2b20e5a1169ce12bee4b8", - "libraries/freertos_plus/standard/freertos_plus_cli/source/FreeRTOS_CLI.c": "702d1f733cc7f2f8ffab9e33c8b117c21a282b81de053e03f17cd9887fe2b517", - "libraries/freertos_plus/standard/freertos_plus_cli/source/FreeRTOS_CLI_Console.c": "cf12352c6959a994185ff186e949cab0736837b6a860e061b55dbf2b51af12a6", - "libraries/freertos_plus/standard/freertos_plus_cli/uart/FreeRTOS_CLI_UART.c": "bfe85e168f474dd85c1b04c25a7c451e86134f54e295179dbdbd650d09407515", - "libraries/freertos_plus/standard/freertos_plus_cli/utest/iot_test_freertos_cli.c": "337521d3f851419fd65b13f79e218728c4c8daa41b2ac801314c513879698441", - "libraries/freertos_plus/standard/freertos_plus_cli/utest/iot_test_freertos_cli_console.c": "af45dad1085f2c8466d751aa74779b86578fc5b3f50379654317716c1e498869", - "libraries/freertos_plus/standard/freertos_plus_posix/CMakeLists.txt": "2d110d1d29d9ef1dd3f73912e38a451f498c24711466787004f5a7624a0b680f", - "libraries/freertos_plus/standard/freertos_plus_posix/doc/Doxyfile": "71907a1ca6b1cae1114f2d16664148b74b6861e6f768c9ac04b1a9052f677105", - "libraries/freertos_plus/standard/freertos_plus_posix/doc/DoxygenLayout.xml": "6f6ef8c521e2943d9b596e7904bcd22a8f2d6253ce70fe206a030831e03fcd32", - "libraries/freertos_plus/standard/freertos_plus_posix/include/FreeRTOS_POSIX.h": "2018f496eb5d0d482c1d00e2881d863b3c3946224ec3165d773eb5448ca94f07", - "libraries/freertos_plus/standard/freertos_plus_posix/include/FreeRTOS_POSIX_internal.h": "fcd06b832232cf783e76f293417b238c97d7ae4b08b9a8feebf03de6521b86e1", - "libraries/freertos_plus/standard/freertos_plus_posix/include/FreeRTOS_POSIX_portable_default.h": "dff9f6642373b9002191f19cebf7c0b42829c28e72df35e239054d43509d62a9", - "libraries/freertos_plus/standard/freertos_plus_posix/include/FreeRTOS_POSIX_types.h": "fc8cf5e542d75add0b383577b5b7fdb8cae57cb3a2c64832c4c94b4b20553346", - "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_clock.c": "b170317d13ef4ac9badc1d00afaa87655f86e7b94e4bf5064ecb1621b6ee511d", - "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_mqueue.c": "5f7ea4afb1547c2e5006e873224de3bd69da039066ce4227278a50867ebd9de1", - "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_pthread.c": "e22feecee2e094755d6dc0aee7be28d1d8dcf72d13d98d5c8922fc407474e446", - "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_pthread_barrier.c": "43adaafd1338534907f5d0d841950320d8e01bb637b50ac0c765181c888e5892", - "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_pthread_cond.c": "3c1d23aefa4d415c025a89d0388b53ae6d0d128e34ed23531a450116cddecaf7", - "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_pthread_mutex.c": "d217516b0ba41c02d9b491d511a81ea3a73780de6cc0a6e527347fda7753064f", - "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_sched.c": "668a4cac8f3bf0407067db17aef8361a572bc7701421f8a57981f7a607877573", - "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_semaphore.c": "6479146228437651b99a82c1c0b6d987d1531feea3e9694e9a78642069f397d1", - "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_timer.c": "fc6f4fa34d4841b8722141f831be0191e33e8dad5b565bd22d5fe365defdece3", - "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_unistd.c": "803294f5e4d427eddcbe89849aa12981335680d4cbaad1b97fccac37fcf955ec", - "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_utils.c": "4a67ed8d61577fb4ff56a8b9811a5ce8729780c21cc14cbe9e19a23ec48a1fc3", - "libraries/freertos_plus/standard/freertos_plus_tcp.cmake": "1de04dd7ff790e1814052c328015e1bcea2a55d733326fdcfa821e6b34711c07", - "libraries/freertos_plus/standard/freertos_plus_tcp/FreeRTOS_ARP.c": "4f2c076ec6cf3940cdfe096b4bb8f3217445334ef81ab7e1e072e5f55f4dbb8b", - "libraries/freertos_plus/standard/freertos_plus_tcp/FreeRTOS_DHCP.c": "6b5919c513993634afb9f2181d92dae4329ca406aafb6e74e47096f8b0852fd5", - "libraries/freertos_plus/standard/freertos_plus_tcp/FreeRTOS_DNS.c": "5887ec00a696def4b106ae39a07f41c5de4c920d596f68addcdc1e578a78d457", - "libraries/freertos_plus/standard/freertos_plus_tcp/FreeRTOS_IP.c": "6b9d5cfd3f1b5ab53a42332e8e6e760c3333d5d5dce1c9049b71609f232aeb47", - "libraries/freertos_plus/standard/freertos_plus_tcp/FreeRTOS_Sockets.c": "491767834a08fc0f5f4fe63f82c8e0a68257ec3f41f8b20ee1f17fa7ec93b2bb", - "libraries/freertos_plus/standard/freertos_plus_tcp/FreeRTOS_Stream_Buffer.c": "ca7b92d9b0e955e6822ec041d56490e178a0553100a6f6ca69760c524826d69e", - "libraries/freertos_plus/standard/freertos_plus_tcp/FreeRTOS_TCP_IP.c": "cd4b51b2e2ce8eb5df4a27b532537ba10b8bf8b58919b55ea49e6b8fd6aa52e9", - "libraries/freertos_plus/standard/freertos_plus_tcp/FreeRTOS_TCP_WIN.c": "28014553383bebe318af5521ef1257e55c97e1166604f2bb784f45387907c233", - "libraries/freertos_plus/standard/freertos_plus_tcp/FreeRTOS_UDP_IP.c": "9ec064feefafc0358f6cf47b06298d5ed6f47a99f552e54d29e8fec02dbf99b6", - "libraries/freertos_plus/standard/freertos_plus_tcp/History.txt": "cb4b656bd8d919167aeb0e864b09773d1ef05faff44e03478a8f871d273b312a", - "libraries/freertos_plus/standard/freertos_plus_tcp/LICENSE.md": "508a77d2e7b51d98adeed32648ad124b7b30241a8e70b2e72c99f92d8e5874d1", - "libraries/freertos_plus/standard/freertos_plus_tcp/MISRA.md": "c2f61079e65ad438c7d74550a1bf8958457da9bcd65861aa6820f7ac29395a4d", - "libraries/freertos_plus/standard/freertos_plus_tcp/README.md": "6f0682d3ba2c8bbefd697542d72887fc399b539c8ef1214023bbbe0958faa012", - "libraries/freertos_plus/standard/freertos_plus_tcp/ReadMe.url": "6c821ec481c65c354d181c49e519d0dde0def21bde8e85e7350bdb87a946941f", - "libraries/freertos_plus/standard/freertos_plus_tcp/docs/doxygen/config.doxyfile": "29f6b7911088cf40981258f7f89c55c73ec613eaf9d0bffde3cec7dd37c342b5", - "libraries/freertos_plus/standard/freertos_plus_tcp/docs/doxygen/layout.xml": "555a70789f54c525456ad9d30730614fe7119afb8b81dd8f8067af28dd14f66c", - "libraries/freertos_plus/standard/freertos_plus_tcp/docs/doxygen/style.css": "e3d3b4438744aa4d547bcacc6e64f3fcfc5057b476c5237e5107e6bbe0aac72a", - "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOSIPConfigDefaults.h": "6e9f2c4e54f34106aa02f7b5a4e9e4bc9e83c8ca094f01ba68fb8e0094d3ea6c", - "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_ARP.h": "5cb783b4c9780bbbe3088f127f01416e60fff55200fdc381cafddd9c301b5ce5", - "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_DHCP.h": "3dfc34f27ea7ab5a983d23bcf70a540b0e43e9eb69a897370f5b102dcfc1699a", - "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_DNS.h": "ee451b87a6cbbfed394949f519e210698ebcbdfa175b28f9ba213ed8c749a79d", - "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_IP.h": "6ef358443a2ab3380512959b48927efc0a65104422b6c93ce2cf1170dab7570a", - "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_IP_Private.h": "529797d2f8c10dfd4a507425b7a34a6715825ba35896e7d24888ed0f5e614c45", - "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_Sockets.h": "3be94b3b9f7d8ad5360eed1bb090e3ed1129773175b98d2ea53fd9aa4ad87da9", - "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_Stream_Buffer.h": "adfddc7e633eb0bfaa52c57a1c8959dbe72752e4e131e8639d612c454eea0ce6", - "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_TCP_IP.h": "53102d240e6db8963fe92439d42883aff53aa2938db67b324e8b7559ad98d212", - "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_TCP_WIN.h": "c4f9823fb869daa7749f926877c279fe630e237a6169d5a6720dc38c8416c176", - "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_UDP_IP.h": "46658ce417e0679a4a6eb7ca9519d7c48faee18ff9ecf88266e41e0c53a772ca", - "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_errno_TCP.h": "bb57d818bdbfd48e029ffc98261ae9550a1a7d0d3c82306ed03300434be413e5", - "libraries/freertos_plus/standard/freertos_plus_tcp/include/IPTraceMacroDefaults.h": "93b8efa7e78f9bfff5cdec36374da624669eb64804867702caa2038eecc9c81e", - "libraries/freertos_plus/standard/freertos_plus_tcp/include/NetworkBufferManagement.h": "8a0966f8bc5b5cadc810f4cbe5642b3a2b358ce65f6cecb8d3b8447a04944765", - "libraries/freertos_plus/standard/freertos_plus_tcp/include/NetworkInterface.h": "41ecf68564c9644e0e0fbeb3716a918d92caf741286d1f5a55eefcb4c6a9547f", - "libraries/freertos_plus/standard/freertos_plus_tcp/manifest.yml": "fc449ed06157bdde04ed0e3539614d0feb382c2d04b1793c8a6debb1ac6ea7bd", - "libraries/freertos_plus/standard/freertos_plus_tcp/readme.txt": "650a32b9db6e75a5bddfded2e44b5e137a9f9ba76124451eadd452b00c3c8010", - "libraries/freertos_plus/standard/freertos_plus_tcp/tools/tcp_utilities/include/tcp_dump_packets.h": "8a1850420f055e211ce0ed8588d3576b004dd857e939d5c4fc9d41c91da99015", - "libraries/freertos_plus/standard/freertos_plus_tcp/tools/tcp_utilities/include/tcp_mem_stats.h": "2c669496405f8105b321e1a145da761c78bd036d1eebfffa0c47d57422d60441", - "libraries/freertos_plus/standard/freertos_plus_tcp/tools/tcp_utilities/include/tcp_netstat.h": "12e17684ea130b1540e58b99e7c767a236d33c740baaaa09f0e4ea668bea9717", - "libraries/freertos_plus/standard/freertos_plus_tcp/tools/tcp_utilities/tcp_dump_packets.c": "16c618091889b2f74a208e3f331ed81fada4f39c8c378f085f25291b3cb40146", - "libraries/freertos_plus/standard/freertos_plus_tcp/tools/tcp_utilities/tcp_dump_packets.md": "b516c055037cb3e626e020569ea017f45f67b2c6a315539670807da107e04e62", - "libraries/freertos_plus/standard/freertos_plus_tcp/tools/tcp_utilities/tcp_mem_stats.c": "85e539a88110f923ede51a85fd514ce0362f363b27384227968bacb700f02f7b", - "libraries/freertos_plus/standard/freertos_plus_tcp/tools/tcp_utilities/tcp_mem_stats.md": "5e3c6c46e2cc64f7fed92c9e4fa3cc06ca9a64ac79c8ee62a3ef9485c7f2b6f1", - "libraries/freertos_plus/standard/freertos_plus_tcp/tools/tcp_utilities/tcp_netstat.c": "7264ef9da59ca8e7e99f239bfc7190a02dc3007dcd67cf0a42a3b20352050874", - "libraries/freertos_plus/standard/freertos_plus_tcp/tools/tcp_utilities/tcp_netstat.md": "a4d43f8c2e5eccf1e8b119b9c2e0152404ff08851f1cfd0d25f48170fed2daca", - "libraries/freertos_plus/standard/freertos_plus_tcp/tools/uncrustify.cfg": "55c02144fdaa3d62e03ed97e3e89a54b67d9433a5320ec02ec82e75344b21656", - "libraries/freertos_plus/standard/tls/CMakeLists.txt": "cf0ef0baf3fa24b73cc492a69a82e6b6f02f1aa0b413aea63e48795c37ea7f77", - "libraries/freertos_plus/standard/tls/include/iot_tls.h": "2bffb5b57ea555a9d3f351d75018468c165ae56239147e495844bde4dedc73b9", - "libraries/freertos_plus/standard/tls/src/iot_tls.c": "f936f93d282e980d3b84dbd2939ae6422d3aa53602b62a0d436983a4e1056a3a", - "libraries/freertos_plus/standard/utils/CMakeLists.txt": "c26d41b8c622dfda9f55c41d6057415a4724ee7c5c569762e3d0297eb1c8472e", - "libraries/freertos_plus/standard/utils/include/iot_system_init.h": "625f3f5949c615e5726a88dc19da2ff64c836e54520d749b6f69acc7684662d3", - "libraries/freertos_plus/standard/utils/src/iot_system_init.c": "a6fd99b93309c8d29dba1165d108716462cc23cd4de4fcdba8963a865f5637fb", - "libraries/logging/CMakeLists.txt": "2c536c9a42538b4866d98854dc8dcb1489f3cd1843d5dd87a6028bbbd39068ae", - "libraries/logging/include/iot_logging_task.h": "4c7b26e1069b21b1261ebc75f9b43b92eadd53e9a40cf3112cce83a452a3d53d", - "libraries/logging/include/logging_levels.h": "810b8c4754dffa9677db0313abbd9eac6cd14b67ade45e1441e0aeb91085c31f", - "libraries/logging/include/logging_stack.h": "5c34145c883e4bdcfc3499526ab6f3a112b7cd0ee7086a71daaa3bc33b5e7f49", - "libraries/logging/iot_logging.c": "b0f69225f30e08ff4735369938cdbbfce430163bf5ef2a594b89e5da1db603ae", - "libraries/logging/iot_logging_task_dynamic_buffers.c": "5222bf2e11b6b768bc1741fea0e841356d04332e5de8af18c1cccb378a31ecc6" + "freertos_kernel/GitHub-FreeRTOS-Kernel-Home.url": "29a615679aaf977693b52195bbbd531b884a82f3170e532c79c88faa026839c6", + "freertos_kernel/History.txt": "ab1c1807466c04b0dd0fcf5b3cda48a0bd8ff65fdf70a5e59e79ffbdbd8423de", + "freertos_kernel/LICENSE.md": "508a77d2e7b51d98adeed32648ad124b7b30241a8e70b2e72c99f92d8e5874d1", + "freertos_kernel/Quick_Start_Guide.url": "367a817538b81e233c897edfaeb14a4650fecd2e090a0d4d285f057d2466390f", + "freertos_kernel/README.md": "5cbdd937c3cb7128a4663a80e6107ce75bb941dff635ec4ad436fcee6ac8094b", + "freertos_kernel/croutine.c": "9ea626b0c7504013abcd0dad620ca51726669cba6298af17534c554280f24855", + "freertos_kernel/event_groups.c": "dbdf182fec562a6bda94d8f557793a43d7c932d06401e75f65f31a2c395a9428", + "freertos_kernel/include/FreeRTOS.h": "ccf4cbe12e86f1a9cf6faab16933f2f0e1db7c4e886e526b05a3fc529af41a83", + "freertos_kernel/include/StackMacros.h": "9f53d26bb4c4919f08663629298ec24217364e9ef385bfc57e8c83c2d37bf1a7", + "freertos_kernel/include/atomic.h": "3e58bb23ca948617cc095e2c42cbb55510704cb46861f31cbb33c1375ff8d480", + "freertos_kernel/include/croutine.h": "6c5c0aa43512d101c88cc21c0d1828ecd6e642bbbb7aa1b6fa1e29d4e72414d4", + "freertos_kernel/include/deprecated_definitions.h": "65660fffd1fc0d9d4d56fdb67ce35ea34a63eab40000e7a460155f8770dc56ee", + "freertos_kernel/include/event_groups.h": "0a21c7c0a10b9f9dc037fc097bbd4bf5a013dfdbfd85d7bc360fc8a8f9e663e1", + "freertos_kernel/include/list.h": "3fdce838fec38d30a53ac4e522dd8e20c8cb2dc5372e547fa7f094a934e36fc7", + "freertos_kernel/include/message_buffer.h": "bb3516838a6b16e63cdd5b2c07cc6950d97ae9eef9767da0fecb7251a984b514", + "freertos_kernel/include/mpu_prototypes.h": "c12eaa119d4627efae78596bcdfbbf5aac86855e6e78256e1feeee7019aa6f22", + "freertos_kernel/include/mpu_wrappers.h": "ed0c05191714cc61faa6e9e3d850f49c47c72e7f8dab1519d07fc61fa47b80f8", + "freertos_kernel/include/portable.h": "459927375c3b204805f9c539987460f322f8cb9948b04245ab4f91a82897407e", + "freertos_kernel/include/projdefs.h": "87c9907a9bc841cbba020246f8e7a1ee823d5c29aebc6c619e31bd13f2c451e4", + "freertos_kernel/include/queue.h": "f39e8f18161d1d7b0040d76946a801f5ccdf1efeb50ecdb473b6bc511747d748", + "freertos_kernel/include/semphr.h": "354e25ebf8564b60b2c796e1ec5c35af67659c9501d7dee8427cbb93dcdaa9b9", + "freertos_kernel/include/stack_macros.h": "a1c840f730026c14c722284d773bca0a06568a752278ee71fc7dffdbdd78c57c", + "freertos_kernel/include/stdint.readme": "2539107ae4d69ccbb106e7742589bc97d3c97e08222a9bef555a006c4de606d2", + "freertos_kernel/include/stream_buffer.h": "db74b388621f5a00da11aabc66e60ccdbdfd779f526fed7b536b5127ea2c9217", + "freertos_kernel/include/task.h": "b734313c3c29ecf83b7dc7d625387e6b442ce6e171d98e1a2b93d18c6980f23d", + "freertos_kernel/include/timers.h": "ef6f2fb0919545e0e8522ea9fe1ed68d1def835b825aada9a1311c213480601c", + "freertos_kernel/list.c": "32f96f5d99d4be5c9b526f2bedd3afeca3be5daaac981e8a862dcb23df566c6c", + "freertos_kernel/queue.c": "5a0a02733555d666dbff70d8d61604fcadade3aa46c8a46913c411cb1c6f051c", + "freertos_kernel/stream_buffer.c": "8f5ba61dcff8f7b1cf0c9d49ce92860c2dc9b01c7bea53c692db778d31685639", + "freertos_kernel/tasks.c": "b7ceb4615978b698a45bb3715080fee61b2887db2ede57b6f70a58c32fd5ebf8", + "freertos_kernel/timers.c": "1be5fd0558212771aae3359deb8f3e602a803bc7ca8400e447358184c7da5d94", + "libraries/3rdparty/CMakeLists.txt": "67a74829d65a7ec82f28fc42ddb04e76f04b8448bc1f54c6d0bb157f2083f42c", + "libraries/3rdparty/CMock/Gemfile": "4694d0e0e82570ff1a0dfa45307e3fa6706738c9e7e387a89788f8da589d4bac", + "libraries/3rdparty/CMock/LICENSE.txt": "a228c2871b9a779a6542a49470c5b567f2806dddcbcf90af861bb4d39291626c", + "libraries/3rdparty/CMock/README.md": "7e5eda88c3a355bad26c706daa6350186c89fe1db148697192be99fcb38aa142", + "libraries/3rdparty/CMock/config/production_environment.rb": "f349586d2ebd6d949653f283e0d634776f5c669990b1dfc3fe2c009a401ff3a4", + "libraries/3rdparty/CMock/config/test_environment.rb": "e3e267cc37e6473ae3bd4e47326d0374762930ff101b82cc1b9c2fd607d77456", + "libraries/3rdparty/CMock/docs/CMock_Summary.md": "52b9bbc61b36b9e89e67556390d577e438d3bc503cc4bb13cfc0758d7d602c91", + "libraries/3rdparty/CMock/docs/ThrowTheSwitchCodingStandard.md": "a1838b8c9e20ac3c15bf96742b716b6621c0607c9273ae0f92a6769e3aa45f41", + "libraries/3rdparty/CMock/examples/make_example/Makefile": "4180bf84b4a71086dcdd9e5f622c63be705981f8e98e311d7ecceb44940c3ea8", + "libraries/3rdparty/CMock/examples/make_example/src/foo.c": "0bec016ce8f7d6033049664c12cfcc5c0099e638fc6395e753b4d36ea2808d72", + "libraries/3rdparty/CMock/examples/make_example/src/foo.h": "e987f3bf49f430e2a9cb70bdd7105f8945e028d1598f361b30fe87a0585d97a3", + "libraries/3rdparty/CMock/examples/make_example/src/main.c": "23c00ca8f9cd5d89107f26d0804e1a2a6f8840941462ddd616f0fa33da7dd0c1", + "libraries/3rdparty/CMock/examples/make_example/test/test_foo.c": "6d2fe8d7ece7f0f8426fe684896c8bf76d15ea35e56add62d59558b47ee32347", + "libraries/3rdparty/CMock/examples/make_example/test/test_main.c": "73baf6160697615a9af98a184479a28e92d42fb82c0f310efea1b105910a3b0b", + "libraries/3rdparty/CMock/examples/temp_sensor/gcc.yml": "5c5d558eba12c2c31432472acf7e90559bbd351632f4cb80c3ee621e4e65969a", + "libraries/3rdparty/CMock/examples/temp_sensor/iar_v4.yml": "f5722f968d75bbe9af61c0ad0f01b6b98afa1a08185526ae49ba121bac937ce7", + "libraries/3rdparty/CMock/examples/temp_sensor/iar_v5.yml": "bcf8ab60e79e586b628e8c0aff5c50011dd3db2695468b2ca6b8c25d3783e506", + "libraries/3rdparty/CMock/examples/temp_sensor/rakefile.rb": "2d74c10170bd68d2d064b6504893a9a5e73f878a2a699979fe8fccd1a70535f1", + "libraries/3rdparty/CMock/examples/temp_sensor/rakefile_helper.rb": "98100d1e2fb44baa2ec47f7ac61d1190438e42e4fc9994f6b9590c952e1a7336", + "libraries/3rdparty/CMock/examples/temp_sensor/src/AT91SAM7X256.h": "284e49294ecd18da7c0b4abbf825cf8edb0f68884d334167c1f755b8528b34f8", + "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcConductor.c": "b14eb5f4196976d82c9501184c0496ac5c071ca9a993ddab0779faea95810f44", + "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcConductor.h": "961bcc853beb286a6ed95ccaf1b48337e1e36b8e543ebb60ce9a56b80238d8e9", + "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcHardware.c": "e9aabd8f076c0d1738d6ea6294c0e16f15643ba19483b1ba6eee861f02cbb9e7", + "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcHardware.h": "af2841747b2659b183891c9c4c00a2b7c065b51a8b958c35d4a6be8564326e10", + "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcHardwareConfigurator.c": "06b303aab471c751073c25170c8b4bc5f52cd89eb52a29a0db32946975bafa6f", + "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcHardwareConfigurator.h": "2ac7b673358582f4df15beb5956cb9f66b8c56882ddb1f8508314d96459aebf7", + "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcModel.c": "885c0a3df693def8de467cc9d9cbb503ba795ffe379d65de02409f8fca2fe360", + "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcModel.h": "3ea12eb954305556617507aa8983f26fe0cb7afb7c8afc71341056e6d8ca23dd", + "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcTemperatureSensor.c": "301cb0b59970bc21f85b068d103732e4dcb55cdbb74536a242a2c45ea8151610", + "libraries/3rdparty/CMock/examples/temp_sensor/src/AdcTemperatureSensor.h": "2fddbdb25206928f3c016ef362174caaf735d683da8e246f8d01f191d3926b73", + "libraries/3rdparty/CMock/examples/temp_sensor/src/Executor.c": "0cdf97b9afa1e7f2da8580b93a19fc536ad83ff4ff5ad1e42013e795af5db025", + "libraries/3rdparty/CMock/examples/temp_sensor/src/Executor.h": "11a373abf8479822f68c5ba2c244c922df6366047531c7953b1a257833075a7f", + "libraries/3rdparty/CMock/examples/temp_sensor/src/IntrinsicsWrapper.c": "95796f352948558443ea6000f9b1237d5b961d2275d12d7b4d33c6d05a4b90d6", + "libraries/3rdparty/CMock/examples/temp_sensor/src/IntrinsicsWrapper.h": "89354ee37181c2effe24d952bd3e4c7f44f7e02f8a85fe08debc64b4fdef3a4d", + "libraries/3rdparty/CMock/examples/temp_sensor/src/Main.c": "23b5e3b20efbe81415f4a8c21a47c767d6560e05e59b1a6b0220e5e4ae2503d4", + "libraries/3rdparty/CMock/examples/temp_sensor/src/Main.h": "6cbfb303c81f28a5e0b5cbb1fc44a860310af5f9c83fd5391b81c61ea4c6203f", + "libraries/3rdparty/CMock/examples/temp_sensor/src/Model.c": "8d62e7a6d628d609ffcda11085b09ee0f8fe18a1c527d8fcad54810a879cb705", + "libraries/3rdparty/CMock/examples/temp_sensor/src/Model.h": "409578c18146e8a728d4a0da93ed34d65880fc96dac39c2786a442e6ff47bb31", + "libraries/3rdparty/CMock/examples/temp_sensor/src/ModelConfig.h": "118773cc1bbaf51497b9e56fb3a65de4479944973565283223241e73abb34fed", + "libraries/3rdparty/CMock/examples/temp_sensor/src/TaskScheduler.c": "ccfda6443fa3c524f00d5810dfa48fa23e12608cf8e6dde46e5bf10293de717c", + "libraries/3rdparty/CMock/examples/temp_sensor/src/TaskScheduler.h": "b6e6f8c61bdd97ee32efe3a5b130c68379978ac126dc9695681de1a4393b0e14", + "libraries/3rdparty/CMock/examples/temp_sensor/src/TemperatureCalculator.c": "8ffc3c06a3449fd560275736c5cc3202137f00d0513e651304c836fd78128a56", + "libraries/3rdparty/CMock/examples/temp_sensor/src/TemperatureCalculator.h": "bfee490f7a59b6eedcd357c99cbff6be20b33b4aa96d54789aa420f69f3ceb33", + "libraries/3rdparty/CMock/examples/temp_sensor/src/TemperatureFilter.c": "fb6997e829daeefe1fa89a5febeb8aab8c9a9adfafb5739f60f786c69b57a3ea", + "libraries/3rdparty/CMock/examples/temp_sensor/src/TemperatureFilter.h": "0731c950b85d436e651737cca0ecff430edea68d62599e27167e7c5a2a57d983", + "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerConductor.c": "b10f5485f4a884019257dcd143dddfda528af77b1f8b005a40b2443020ef67a5", + "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerConductor.h": "53deff5a2ce521b48c69e1d85641e2c7da7d0bdbd1de48f622cc1a7df5efd177", + "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerConfigurator.c": "145397008f450ec09b8bd010b02430c3becddc92a7fcbe31c06a5baf99e32105", + "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerConfigurator.h": "55e7e6f42f76dc2c9c60137be3b4a4bfd3e9e96e4ce41c2300221bcf8fab24b9", + "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerHardware.c": "5085266579205f2be126cc0e5f34c443469a3e5da53efd0fa2d95a7653a98803", + "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerHardware.h": "abddafeeb43ee8cdc31389263b8826f3ccf6a20573ca4702dfeb537b00a04104", + "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerInterruptConfigurator.c": "596665665389de910b1dbd15c292f141a8e64a2c4a0164a7959121bed2467645", + "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerInterruptConfigurator.h": "5a7adb509ada4640fdccf739be3de8abb470b41bcddb9a9834e9b238a9fabd02", + "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerInterruptHandler.c": "7fab66be3e4d5c430a1dfddee56559ba55ab4cd0d448c583637072e9dc9f10da", + "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerInterruptHandler.h": "5cc7ecbd35069059f0fb2d516f8b63929e0a4d0fa00e53b593f0827d5f637d29", + "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerModel.c": "315b80af627d601b85c203ad389f455d5a010806ea113fc410c9bb5566cb7966", + "libraries/3rdparty/CMock/examples/temp_sensor/src/TimerModel.h": "8946208aac57141bc8078bae72461ce1b0afcf9509eb7c9dd52d7643bf3c99da", + "libraries/3rdparty/CMock/examples/temp_sensor/src/Types.h": "342e458d2f13f4b2f42ac03133f005635bd4002ae446f5aa5006c73f4160a3d3", + "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartBaudRateRegisterCalculator.c": "a0a5c91867bd150cff7d8d1a25e5e3355a780421715afa1b9b7ea747612b8fd3", + "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartBaudRateRegisterCalculator.h": "cfe9a2cd19135f1c1058748f6c82be18331e35a7796a8801103458b2c36912e7", + "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartConductor.c": "3536b396eddfd8d605ac050c18fd150764031ed873e18362fb0ebc34d9d7dc3c", + "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartConductor.h": "58ce401a82e272c72f0d9cc81310a103d6bebd9565d8ba783d8a99a014a17aad", + "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartConfigurator.c": "d4805a5c993e1c0227442f926bd9a28dd1d8af59fdb93c35fa707e14d77baf09", + "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartConfigurator.h": "95eeabe4b7a99b54cf49531930b0a4be7fe812420c53dc1b730dec7f08e2d1c0", + "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartHardware.c": "97db4fe3c762e48593838b8ff9ba20e08ce02ceb39bffa592b8691d850ecfe0f", + "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartHardware.h": "99fa878f31c0b2f5d91cc7646ef25823c38a5c78a747a780d4c25754f448af0e", + "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartModel.c": "36d389273df8ac7d3b28a3490a511c1be2c117d73d9f7a26dd7d34af5c6cd5a7", + "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartModel.h": "c367f4aab51341ba2dd1780bad6b7cf59c344009505695b608b734b4711592b3", + "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartPutChar.c": "2b2aab187d2b818ab28750a0676298205a7f7938ebffa440aaff99f3bc37002c", + "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartPutChar.h": "557610200557eb94f1a7f5d7a1a7d26bd0827f5e2b06749353dfa4fae73d4439", + "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartTransmitBufferStatus.c": "7924adbc923cd9eb3bcea5877defbacb3ec16a03de29e7327ff064304a914505", + "libraries/3rdparty/CMock/examples/temp_sensor/src/UsartTransmitBufferStatus.h": "955b1a7e0f4de642f8bb6083b8fa8c3f4d75bdc4c378794aac6dde049410d42f", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestAdcConductor.c": "9d22203689e18bdb6daf3a8aee7d17438028deb1d924731a0597c13743616d88", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestAdcHardware.c": "b3b05e87ac62d463ef489eb2e8aca41d2b6829ef8edaab27622c9c4889a59dba", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestAdcHardwareConfigurator.c": "58333e4681ca8a34e98b11129deebc653e44e3587b03b6b7f523a80ace169225", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestAdcModel.c": "dcf55240bd2ce74f8e3bcc28a98ed8037d51375ade9ebb1d61e882b41e11a9b6", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestAdcTemperatureSensor.c": "f5178bbb8605872e09608baff9b049cc826afa278bc1a125389255e786131f8f", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestExecutor.c": "db1bc8f44e9183b2a7909c0c0b8fac6b25b37d4aee0f47c9ab181500cf384ac9", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestMain.c": "67944d7590384483ecb8b1c06cdc9426e4c78bdfa99886f4d24f9d07e2aa84c0", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestModel.c": "1720d2acf16537a03ff8b6e800f04c46312c9f17985d856f3cb3f64309a869f0", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestTaskScheduler.c": "4efcd2cc31f7c3737f8a0143faf05f370466cb7acf75f0d15f7d661f9303472c", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestTemperatureCalculator.c": "f0b725debcc365c16a055371f3f48534d3f30bac75804cc9c5838850a8bb91c9", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestTemperatureFilter.c": "ffc624388daa2322ce339cff9445abf37cd2372534db356f57821b9e49874761", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestTimerConductor.c": "7d2d58e797a65e44698e30cdb79cac7e94fb96c8e95623c3ab8f9ec0f9078809", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestTimerConfigurator.c": "51748b3199379ebd5797c4da7bdefed444aed398ae36508c098c3f00a2a4416c", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestTimerHardware.c": "7ab489c8cdf7d8d0421482a1a6ef7b1f8663e38453a140e9a5550d1c67844170", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestTimerInterruptConfigurator.c": "7f8eb3100b9091d2996c8f75459659e8ae0c5a75f0d5ee08e3649b17f3394cce", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestTimerInterruptHandler.c": "0000e221012abd79eaf668188923275b7e7e12ef297b15b2165e35440c0f1eac", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestTimerModel.c": "cee4214bb0cf367910562488f448014bc802274d2894bc87ad9fa49098a99add", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestUsartBaudRateRegisterCalculator.c": "729c0d4162bd09ac4514e2de1f70e1b0b4fb05ee125dcfb91314aa40986e8235", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestUsartConductor.c": "ab351f7a74ba445200ccf3d851122fb86531e8511d8cbbbfd1d70b9ccd4a93a4", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestUsartConfigurator.c": "719758e045571b2c532007e37cfe9939eddcc850e069481524f5d4b17d9d399e", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestUsartHardware.c": "c29fa69264fd62d7a466a95de9c927e94119b366ecb1d333be47c60de6183fa1", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestUsartModel.c": "5ab9a684792f271e587d4e861de5c3dc90439dcc4670d7a06da8bd078161a2df", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestUsartPutChar.c": "cde5d54b2acf09a6caf86e360c9a2fd40fb6ccdc8fcfe78d4b10ca7c34d95e9e", + "libraries/3rdparty/CMock/examples/temp_sensor/test/TestUsartTransmitBufferStatus.c": "d66b41fefa7200f926652c67cc3797b6143b321e7be5eefb099caaa4cfe2af37", + "libraries/3rdparty/CMock/lib/cmock.rb": "2db133af7e8c2782b955c5727fe806149e29e1f6f6c24f0edb06bf0e8fb990ce", + "libraries/3rdparty/CMock/lib/cmock_config.rb": "d1f169fd7570f897c7025f90b69a3b563a0053013c6bf9701dce79c66fd8b0c7", + "libraries/3rdparty/CMock/lib/cmock_file_writer.rb": "00952d06256e5c4f15d12798124d1924cdd9ddc0767f8849bd4fdd5da27a0796", + "libraries/3rdparty/CMock/lib/cmock_generator.rb": "efcad21dc935182dfaad8798b5311c73457e6ec7289990d60273ccf8b49f9e88", + "libraries/3rdparty/CMock/lib/cmock_generator_plugin_array.rb": "cf79e99a143bbffa19513c552427758151dbf5bc4498872d55240a301cf81e62", + "libraries/3rdparty/CMock/lib/cmock_generator_plugin_callback.rb": "af43da2e2327b72cc5c4acf54f2acaa851e050dd0fdc295328b04f0daad5e738", + "libraries/3rdparty/CMock/lib/cmock_generator_plugin_cexception.rb": "7ea5018ce83d734f587e16754f09508d98a6d7ee9e35ae4d77f795c64d817091", + "libraries/3rdparty/CMock/lib/cmock_generator_plugin_expect.rb": "24e589d18c6adf83d9efb6fb466aaa6936566ac8f3c8fddbdd4031c015013be9", + "libraries/3rdparty/CMock/lib/cmock_generator_plugin_expect_any_args.rb": "8156d254e07315f04e7ae692bc6e90fa0f3418122e4048fe888ca2a08a5e2506", + "libraries/3rdparty/CMock/lib/cmock_generator_plugin_ignore.rb": "040a49d79fa8a39a215105b5e1333ace4e858d84db305e7d2addd71fbbfa3645", + "libraries/3rdparty/CMock/lib/cmock_generator_plugin_ignore_arg.rb": "85bb085311132867f962969f4757346b950497bf1ef0fc6bf856b30fa76d879d", + "libraries/3rdparty/CMock/lib/cmock_generator_plugin_return_thru_ptr.rb": "1de81b18418f28c42c3cece2cdac389f0ca106bb6aff0cd148e60e3666017161", + "libraries/3rdparty/CMock/lib/cmock_generator_utils.rb": "ab582b61a17547a861f2623c13a22b2db5c985bbb2d280b4036978f490550ecf", + "libraries/3rdparty/CMock/lib/cmock_header_parser.rb": "88e194b0f99b8ed412840d564d89e8f9f87f6b81e81998e64f37e512e39e4eac", + "libraries/3rdparty/CMock/lib/cmock_plugin_manager.rb": "ea1f967c58ad0b7c4d5770f73a1c8a0e2b2c3316222007ce47975ea12037ab1e", + "libraries/3rdparty/CMock/lib/cmock_unityhelper_parser.rb": "9c345fb34efc38ee37787cf6d33b161a10e819b18e1f8f88ab855a58b1bda1eb", + "libraries/3rdparty/CMock/meson.build": "f476d259cf456982649c5dba0c88070257da77a71316eb3403002a7d50139239", + "libraries/3rdparty/CMock/scripts/create_makefile.rb": "c03914eea03a12c2086ab042e5ea60f3375ae2742b32fb98812493e8ca015d77", + "libraries/3rdparty/CMock/scripts/create_mock.rb": "995d1551fc08f789e8d036ac378014ab1fbce43aebd4d84e18d7c66585571f65", + "libraries/3rdparty/CMock/scripts/create_runner.rb": "7fe06ce7115cc57a07a2dfac985dc29ffffbefdd94ef57e560b78d22a0628c23", + "libraries/3rdparty/CMock/scripts/test_summary.rb": "345e9fb68e4b3c49c36022a7e17d0b704ce1dc0a9adfde7bd0281084c6db4bee", + "libraries/3rdparty/CMock/src/cmock.c": "5bdc4ba9861d73b950646a3f5ce6ed15e7cdbe67a17c3c625316979236ab1e49", + "libraries/3rdparty/CMock/src/cmock.h": "1e80437b68da381104b8f6df528fa5a136917a35e45ff0eaac117f2a22ae8fea", + "libraries/3rdparty/CMock/src/cmock_internals.h": "4df4b62d2b13a0b6541d986100b9ec6b261b882741834ef2ab0d51a0afa34e00", + "libraries/3rdparty/CMock/src/meson.build": "a04202d0f04fadfb7a766d041f92fbe0b858d5b2c7e1aab03c7538d77ee2b823", + "libraries/3rdparty/CMock/test/c/TestCMockC.c": "7beed4e807a064045a2f00bb149af817483fc70331aedfaa0d2934d3b94f993f", + "libraries/3rdparty/CMock/test/c/TestCMockC.yml": "7457da36df8102d71c336ca384702879161097ff542380bed78cb5446984ae4c", + "libraries/3rdparty/CMock/test/c/TestCMockCDynamic.c": "eeaac501c9e65e166ebd11b90c5275c67597e81e6c9c3156faf006751023495b", + "libraries/3rdparty/CMock/test/c/TestCMockCDynamic.yml": "4755d85389465ac56733780ec7da93965dccf5eba935195acbbb7de251c6048a", + "libraries/3rdparty/CMock/test/c/TestCMockCDynamic_Runner.c": "ba26744cbf8c4f1ea7de6ca7254700bf1e16ae57682270dc4d94393ccd501588", + "libraries/3rdparty/CMock/test/c/TestCMockC_Runner.c": "465d91fe9d981509a92267d0471fbb3e412a88b6f7d50437fe91e47ef6d69e8f", + "libraries/3rdparty/CMock/test/iar/iar_v4/Resource/SAM7_FLASH.mac": "8ac360d36256589216b144c525d510af24457ef763becd14b137f63e953cc17d", + "libraries/3rdparty/CMock/test/iar/iar_v4/Resource/SAM7_RAM.mac": "df15f8e476e1ca1b8d3141cfe0c801881939e70cefca237a98d804742cccdcfe", + "libraries/3rdparty/CMock/test/iar/iar_v4/Resource/SAM7_SIM.mac": "6177e42e1a0a493976fb4d196b65cb1257e045db281ad48569b4b9ee6d9f37bc", + "libraries/3rdparty/CMock/test/iar/iar_v4/Resource/at91SAM7X256_FLASH.xcl": "8594f9522b6ae41e96ab7b848dd7e4024876f7882d95f60a8bb6577ffd154605", + "libraries/3rdparty/CMock/test/iar/iar_v4/Resource/at91SAM7X256_RAM.xcl": "713104cf6bf984663d5227b3ea6fe1d045413630b5a71404b2a2a7156346ae9b", + "libraries/3rdparty/CMock/test/iar/iar_v4/Resource/ioat91sam7x256.ddf": "f23d06dcacffa6d544f4a560a4692bdaba7b918b488b810db928b418a4bbfd88", + "libraries/3rdparty/CMock/test/iar/iar_v4/cmock_demo.dep": "5157f2a91a7169b63aa30424a220053a8983194e6145d14f3a39bfa2e63175ac", + "libraries/3rdparty/CMock/test/iar/iar_v4/cmock_demo.ewd": "176d8abee2d57ee30575952da2aa2bfa4dc851b908e44df728b6a4a2c222fd8c", + "libraries/3rdparty/CMock/test/iar/iar_v4/cmock_demo.ewp": "ffacbcc9ee4b092f01af22ee7bdcd34bff44043cd3c903ff9530912b0d4eaf0a", + "libraries/3rdparty/CMock/test/iar/iar_v4/cmock_demo.eww": "7b5fe1867f77d1c6a09c591e3c4705a20ec0102a10e5049aa3fdb1989596e23b", + "libraries/3rdparty/CMock/test/iar/iar_v4/incIAR/AT91SAM7X-EK.h": "41b4cd1cbc547b10818daf44adeb335a7dcd6846b229195c156be0be9b1cc056", + "libraries/3rdparty/CMock/test/iar/iar_v4/incIAR/AT91SAM7X256.inc": "5f7c307376baf65d6ae5e16bb23b7d9374b713c7a8bd963240418dd026f5cd79", + "libraries/3rdparty/CMock/test/iar/iar_v4/incIAR/AT91SAM7X256.rdf": "f7a13e637d12010564f884cb25ca152909f5cf056fbd87b8f837e6e999305411", + "libraries/3rdparty/CMock/test/iar/iar_v4/incIAR/AT91SAM7X256.tcl": "959dfe614a39ca1c47aa5e42d10979bb939c4c0464cc01f3d395a17baa2759f8", + "libraries/3rdparty/CMock/test/iar/iar_v4/incIAR/AT91SAM7X256_inc.h": "cf75fa42dbdac6d2e055ee6a1b4be6c3fda982bca36832167dbb3338c2529ea0", + "libraries/3rdparty/CMock/test/iar/iar_v4/incIAR/ioat91sam7x256.h": "df4353041f1daef07fff13afedf5c82b6502ec3f27af4b7943a409dbf27bcdc4", + "libraries/3rdparty/CMock/test/iar/iar_v4/incIAR/lib_AT91SAM7X256.h": "d500574f73b3e2c0e026d600f9949f680270aa9e78c82b0250276c75edbd79b1", + "libraries/3rdparty/CMock/test/iar/iar_v4/settings/cmock_demo.cspy.bat": "0b95a0e1455c0947578eb48f8e77dc4303c672208d92a29883061115dfd4740a", + "libraries/3rdparty/CMock/test/iar/iar_v4/settings/cmock_demo.dbgdt": "16333ca6fc95ee3c09e1d65fb546fd714e1039a2d83a7ab88d5113f7b92e89de", + "libraries/3rdparty/CMock/test/iar/iar_v4/settings/cmock_demo.dni": "36b4ad5d2c76a305040b922a7b27d4d36f68e3ffaa13ca327db77b7f82280e6b", + "libraries/3rdparty/CMock/test/iar/iar_v4/settings/cmock_demo.wsdt": "1502e8d1c367c132f62906a92a931ced79057ef818fdc502900ab6fa092681a7", + "libraries/3rdparty/CMock/test/iar/iar_v4/srcIAR/Cstartup.s79": "73b3a3034252453843ce316daae1cc691d8289a6943105718c04e5864b384110", + "libraries/3rdparty/CMock/test/iar/iar_v4/srcIAR/Cstartup_SAM7.c": "15857d19064c45c733ffc3c3de66b9f987bdd44b8e1d29b3ae17a355faaa3472", + "libraries/3rdparty/CMock/test/iar/iar_v5/Resource/SAM7_FLASH.mac": "8ac360d36256589216b144c525d510af24457ef763becd14b137f63e953cc17d", + "libraries/3rdparty/CMock/test/iar/iar_v5/Resource/SAM7_RAM.mac": "df15f8e476e1ca1b8d3141cfe0c801881939e70cefca237a98d804742cccdcfe", + "libraries/3rdparty/CMock/test/iar/iar_v5/Resource/SAM7_SIM.mac": "6177e42e1a0a493976fb4d196b65cb1257e045db281ad48569b4b9ee6d9f37bc", + "libraries/3rdparty/CMock/test/iar/iar_v5/Resource/at91SAM7X256_FLASH.icf": "d37f75919b1793bac86891e7fa9a9142ae83de351d5ef169af909ce770ae6d01", + "libraries/3rdparty/CMock/test/iar/iar_v5/Resource/at91SAM7X256_RAM.icf": "170c34f5e702138b2b20cb696a482886936cdad8eaddb18c6c84abc5facf0a17", + "libraries/3rdparty/CMock/test/iar/iar_v5/cmock_demo.dep": "0a869be5fc1a6ba0991c5012d8d4bf21ecdaf35ce23ff2207bbe35fc72b7acc2", + "libraries/3rdparty/CMock/test/iar/iar_v5/cmock_demo.ewd": "5ebda13f0da843a1a4343bdb77c728d72ffcf8356a48eb6e3d5527428f6a1ba4", + "libraries/3rdparty/CMock/test/iar/iar_v5/cmock_demo.ewp": "019d8fe92e6206e06b9fc46938e2ac19d9b8d9e27186f4ed05bc9f1f4ffca31b", + "libraries/3rdparty/CMock/test/iar/iar_v5/cmock_demo.eww": "252dbeae342d9ad0c34d7f4a622dec74a5f400c08ad931771dc418dcc8aea7c3", + "libraries/3rdparty/CMock/test/iar/iar_v5/incIAR/AT91SAM7X-EK.h": "41b4cd1cbc547b10818daf44adeb335a7dcd6846b229195c156be0be9b1cc056", + "libraries/3rdparty/CMock/test/iar/iar_v5/incIAR/AT91SAM7X256_inc.h": "7fbf38b71f042bd3130dd7a0cc6e55130eae320e4fe705e078e5f9144c6e03b1", + "libraries/3rdparty/CMock/test/iar/iar_v5/incIAR/lib_AT91SAM7X256.h": "405c0c979b5c39e520624e0b5da725690c69f220d5985c6129b1be0bde3ff4a1", + "libraries/3rdparty/CMock/test/iar/iar_v5/incIAR/project.h": "431c8cdd8373916c97b6555fd0df183b4eed8799fe61397c5b9458d71e194edf", + "libraries/3rdparty/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.cspy.bat": "2e1acdf2e55863b5e33588ee350d4ea8325a79aef8f143a1d1e4dc9a20894ebe", + "libraries/3rdparty/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.dbgdt": "1967e4e174ca97638a540915477a6cbc829cf2d19bb4ad6046ebb43cef922619", + "libraries/3rdparty/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.dni": "e7db4742adcbe78483a5a2bd0510ef338a2ddddcca3b4587d493c54fec22a722", + "libraries/3rdparty/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X.wsdt": "bfd819154f05571882a5c70fa8e47aaf4a6be521b9ce321b086ecc8b3fad2fe9", + "libraries/3rdparty/CMock/test/iar/iar_v5/settings/BasicInterrupt_SAM7X_FLASH_Debug.jlink": "94a14185b32946b9295be7a4230afb5f71ddf87bff3e9f279ce4d82feabe98f9", + "libraries/3rdparty/CMock/test/iar/iar_v5/settings/cmock_demo.cspy.bat": "98d3f600ca83fc5e0e141e27f17c92b52b28997445a64d7f63cb4312f490a580", + "libraries/3rdparty/CMock/test/iar/iar_v5/settings/cmock_demo.dbgdt": "942572f2cb503a36b9e633642c54e72dc8bc929a41a9430fe62837ea3eb837c0", + "libraries/3rdparty/CMock/test/iar/iar_v5/settings/cmock_demo.dni": "35f715df5935f7b03aae4126e33e296bd36df32f86aa00d425a09e65ce1fb66c", + "libraries/3rdparty/CMock/test/iar/iar_v5/settings/cmock_demo.wsdt": "b5f6a167aa78028b09a439565dede111bf8119403c9f290367163356008807f5", + "libraries/3rdparty/CMock/test/iar/iar_v5/settings/cmock_demo_Binary.jlink": "94a14185b32946b9295be7a4230afb5f71ddf87bff3e9f279ce4d82feabe98f9", + "libraries/3rdparty/CMock/test/iar/iar_v5/settings/cmock_demo_FLASH_Debug.jlink": "94a14185b32946b9295be7a4230afb5f71ddf87bff3e9f279ce4d82feabe98f9", + "libraries/3rdparty/CMock/test/iar/iar_v5/settings/cmock_demo_RAM_Debug.jlink": "94a14185b32946b9295be7a4230afb5f71ddf87bff3e9f279ce4d82feabe98f9", + "libraries/3rdparty/CMock/test/iar/iar_v5/srcIAR/Cstartup.s": "f01a69400b4d52ad0202134d4d1eb2b2afb8b5b90f19cab527ef2c63354725a6", + "libraries/3rdparty/CMock/test/iar/iar_v5/srcIAR/Cstartup_SAM7.c": "ffffb70bb3424fb7537c766bfa1d0831154bbc455b10a7085ddfe6e5a51cd8e3", + "libraries/3rdparty/CMock/test/rakefile": "4076929f99d8fea975aa2311bf348a806c440e1e25d6eb38b0eb16af7bfccb7a", + "libraries/3rdparty/CMock/test/rakefile_helper.rb": "b9196d105d59f0794a18f7cefadde56bd791e8a5180be7aeba0a183137d380fd", + "libraries/3rdparty/CMock/test/system/systest_generator.rb": "f0dfa97acb5355b013f632459d91d8f8ceb0bff07e78a2b62c0f8955aa9fda77", + "libraries/3rdparty/CMock/test/system/test_compilation/callingconv.h": "f0d451838c94b20cb9df40827b1667e82719adf34bc7f848ce1ab330a95f5ece", + "libraries/3rdparty/CMock/test/system/test_compilation/config.yml": "55da291e818f575aaec65bfd678b9bc92badc2775bd012ea465d124bb03f6874", + "libraries/3rdparty/CMock/test/system/test_compilation/const.h": "452666930532c934d30c06081a1207422064421e2111ef3d774f60801c8d0298", + "libraries/3rdparty/CMock/test/system/test_compilation/inline.h": "faae36b96040414ffbbd8c9cd0ddcf1d918b5431ad81c12e391fe8b283ae915f", + "libraries/3rdparty/CMock/test/system/test_compilation/osek.h": "6283a1ba1ce53af3c73e246ec073497aec8d5da7e573f8474a45e1ccaf72730c", + "libraries/3rdparty/CMock/test/system/test_compilation/parsing.h": "f6f31c9b303aaf2948ed48cd6e8dcc0d7cef5bacc91b5746b11d432701911bd4", + "libraries/3rdparty/CMock/test/system/test_interactions/all_plugins_but_other_limits.yml": "23512e99944a08a4517037fddc6f13451118a23a19327270e7f0cde0a882643e", + "libraries/3rdparty/CMock/test/system/test_interactions/all_plugins_coexist.yml": "2fa3f85fa5bcfd432d7e82be741d3e4bce969182d3b3c4335ab2bac494a8b3e2", + "libraries/3rdparty/CMock/test/system/test_interactions/array_and_pointer_handling.yml": "afd7b725c51a0268b2fe582416b59e303c611a86af8359627a10483ccf4ac3dc", + "libraries/3rdparty/CMock/test/system/test_interactions/basic_expect_and_return.yml": "188b82892feac0f148d9b8d1edf9929e4145d8adb7ffc0b2752be3dfe5c620d8", + "libraries/3rdparty/CMock/test/system/test_interactions/const_primitives_handling.yml": "2610282b06d4b05f3f7e9b22254278648a29dcf1808f8206ac92d183ed7c7ebd", + "libraries/3rdparty/CMock/test/system/test_interactions/doesnt_leave_details_behind.yml": "5d39bdb3fb162c3664ed180754c6b8042c12ad7e29ccc65b42c312ccfeed322a", + "libraries/3rdparty/CMock/test/system/test_interactions/enforce_strict_ordering.yml": "85f9cc7ce2eb22b0da825ca8d6e38a05bffb69dab0e66c0e516753b74fcfe10b", + "libraries/3rdparty/CMock/test/system/test_interactions/expect_and_return_custom_types.yml": "361e10a02795595bf45c64b2026d9342fff1e4d0308fb5202413bffb84bd3b10", + "libraries/3rdparty/CMock/test/system/test_interactions/expect_and_return_treat_as.yml": "6601ab58a7b0719e26124b40d3aed2272a032f4ff3ae45da241b0b39bdf03ce9", + "libraries/3rdparty/CMock/test/system/test_interactions/expect_and_throw.yml": "18eb54309f69744598138a5b3f8ef4b898bbc3fb46b1a42306016d6ed566c1d3", + "libraries/3rdparty/CMock/test/system/test_interactions/expect_any_args.yml": "1348aa720acf85e117c6c23353f205b3438eac30baee86efeacbdc04f2645d27", + "libraries/3rdparty/CMock/test/system/test_interactions/fancy_pointer_handling.yml": "a3033a4e31bcfbf66126059476d9fdc7bdaa197a8b6568a382c93e373110abb4", + "libraries/3rdparty/CMock/test/system/test_interactions/function_pointer_handling.yml": "85c81773cf1dcf80dc84ccb433d8442aabde1b8635292819315287e828b93f63", + "libraries/3rdparty/CMock/test/system/test_interactions/ignore_and_return.yml": "4300c43c2e59a39111809e3e4571484e45146344a20d706a2c0c8618159fa2ad", + "libraries/3rdparty/CMock/test/system/test_interactions/ignore_strict_mock_calling.yml": "08c69a141af52960e0e9043d717ff5df442f7889edcd145898c0cade3fcc3e72", + "libraries/3rdparty/CMock/test/system/test_interactions/newer_standards_stuff1.yml": "f2073b808f4cc2d918612ff1c910fbc4a8ead998b12fcbc7608d430fe71d8eb9", + "libraries/3rdparty/CMock/test/system/test_interactions/nonstandard_parsed_stuff_1.yml": "23db82fdbc1643ed58a58c20a4154e75b8559509a3f827fb43e9c5965103e4f6", + "libraries/3rdparty/CMock/test/system/test_interactions/nonstandard_parsed_stuff_2.yml": "f51bae36303d532e357105195369615ab17560234efb1f0141973c2794ac0693", + "libraries/3rdparty/CMock/test/system/test_interactions/out_of_memory.yml": "4b4509e9c368fdec539be90daa164185175849afcf39c2d0a9c4d9ff9e423191", + "libraries/3rdparty/CMock/test/system/test_interactions/parsing_challenges.yml": "6f9a0d35489a6e6435211923ea43349e17cb68fc9652cb98511be8f74a78a079", + "libraries/3rdparty/CMock/test/system/test_interactions/return_thru_ptr_and_expect_any_args.yml": "64915233c5cb94bdff20cf89f650de58f278a214417bacf52129b67d67208cc0", + "libraries/3rdparty/CMock/test/system/test_interactions/return_thru_ptr_ignore_arg.yml": "cde16df22f47d782043ce85063cd7d53dcb3473eebd25631bbd18d7d87c38db0", + "libraries/3rdparty/CMock/test/system/test_interactions/struct_union_enum_expect_and_return.yml": "c926cca48cce1932fd57dc871187073cf3e35d12569369695a18a4a6fb7be3f8", + "libraries/3rdparty/CMock/test/system/test_interactions/struct_union_enum_expect_and_return_with_plugins.yml": "29f087a7f1217b3724517523dbf122bfe07277505549c465b1821df926b75c6e", + "libraries/3rdparty/CMock/test/system/test_interactions/stubs_with_callbacks.yml": "5e2cf62796105fa958e9528d3a30cff3a83c4f9d23385ab75a5939841647c486", + "libraries/3rdparty/CMock/test/system/test_interactions/unity_64bit_support.yml": "91a78d7f1216c1c18388116c169d2da0994351e61155fa6bb622bf16b635838e", + "libraries/3rdparty/CMock/test/system/test_interactions/unity_ignores.yml": "f6e9193481c9f0a5c5ab50833fea66da7bc34977b35a176fd613130ec883bf92", + "libraries/3rdparty/CMock/test/system/test_interactions/unity_void_pointer_compare.yml": "b92f86081c7771eca83efad7e38e071ee5bf8ce2e1a410df7d7af9c392486e6e", + "libraries/3rdparty/CMock/test/targets/clang_strict.yml": "4d477d7d7c1ffe0ce9175b89d4812119c7a0a79e924290e59c3dbd46b0975de3", + "libraries/3rdparty/CMock/test/targets/gcc.yml": "f012ab43326a37713fb72f33c0e03771fbbf4347e549de6cfdb476cda0ad9118", + "libraries/3rdparty/CMock/test/targets/gcc_64.yml": "0c0df186d99f01666f0d8145289179d86298c3671cdd7083c5e3c4a41625d5d2", + "libraries/3rdparty/CMock/test/targets/gcc_tiny.yml": "c9b57fd070a3e98fc3c237c9b3b99b31d0cf01cc0565b81812f57f68ca340714", + "libraries/3rdparty/CMock/test/targets/iar_arm_v4.yml": "fe0f205df28d23f4a940c1efce9e74ddd227427eaa55a70a283d8ff0722e45f4", + "libraries/3rdparty/CMock/test/targets/iar_arm_v5.yml": "7649d656896a709b2124b232bbe2d4911ae141617ccdd947e1f1541f23615bed", + "libraries/3rdparty/CMock/test/test_helper.rb": "7561fd77c8b7c6ec581d2e946db129893dd842d813801bd5ff6dfb42eb98cb19", + "libraries/3rdparty/CMock/test/unit/cmock_config_test.rb": "25ba1146b5fdf8ceca1c3fe385dd4a20f6e51a5a8b5ba83c8dbc935d9fa570ad", + "libraries/3rdparty/CMock/test/unit/cmock_config_test.yml": "2b1460d832657fe5f69b70b92a7bcd40edd42346aea4bab20043ffecd43719e4", + "libraries/3rdparty/CMock/test/unit/cmock_file_writer_test.rb": "88cf580634a0907f12b8068f1deefe7e90a14b0111d55da6d413f3827347b9d6", + "libraries/3rdparty/CMock/test/unit/cmock_generator_main_test.rb": "dececdef4bbc98f3fc6aaf40f10c3af850b03ac6e3fa627bd6e7350a96a41075", + "libraries/3rdparty/CMock/test/unit/cmock_generator_plugin_array_test.rb": "560f97841377b5ae6704cd4363e0d21c8883abcb7f5d2907608e6c0aa68c3518", + "libraries/3rdparty/CMock/test/unit/cmock_generator_plugin_callback_test.rb": "4d941ccc21ba7c3963697ae1266e24d565c887bc536fa639edb42dd58c287aa2", + "libraries/3rdparty/CMock/test/unit/cmock_generator_plugin_cexception_test.rb": "4a4bdfa48a17829dd1c3d58cfd4da6769bfde6bd592b55afc2685d24a667fec1", + "libraries/3rdparty/CMock/test/unit/cmock_generator_plugin_expect_a_test.rb": "a9e543df7153bb147b90a94b09b7a54182d8f3f54effb9cff15a0fd58aae4937", + "libraries/3rdparty/CMock/test/unit/cmock_generator_plugin_expect_any_args_test.rb": "56c461cd0c0dbd14dfe0eaaf55989077c04067e70c13e561e27634d027da90ae", + "libraries/3rdparty/CMock/test/unit/cmock_generator_plugin_expect_b_test.rb": "6c4179cb40ae3cc3d7565d8fac5d0396854000fe435b64d85b5efda87e49ecef", + "libraries/3rdparty/CMock/test/unit/cmock_generator_plugin_ignore_arg_test.rb": "c433e1db36e15ec882c9b555b7de2901d6f5e316887b2224d71f72e0a841b855", + "libraries/3rdparty/CMock/test/unit/cmock_generator_plugin_ignore_test.rb": "163ba76164e27a44b773a41bf99a898e29b4532f79c157f8994dd4e354dd1265", + "libraries/3rdparty/CMock/test/unit/cmock_generator_plugin_return_thru_ptr_test.rb": "62a488259440c6b8ae34ad9265bc2c9b2741498d0d0ed7f408ecb39935aa989b", + "libraries/3rdparty/CMock/test/unit/cmock_generator_utils_test.rb": "5cfb64fde1d437bbb70c35745a9c95ad5f1093eee2017b3db77b096526b0eedf", + "libraries/3rdparty/CMock/test/unit/cmock_header_parser_test.rb": "7c8e84c06144ae72ae3c5c70c148f3557c81440e4a3662283a0b77f120051197", + "libraries/3rdparty/CMock/test/unit/cmock_plugin_manager_test.rb": "510fe651508db42d428539b63fbf2aa5c2601ac4b5f1fe0d5d756ba4f03f08e5", + "libraries/3rdparty/CMock/test/unit/cmock_unityhelper_parser_test.rb": "e77b10af099223b17e9c524d0e6520a8d90ef878f9326d8729a3d0cab437d172", + "libraries/3rdparty/CMock/vendor/behaviors/Manifest.txt": "f6def0d4d599a6d17c7b0a6e5cc65824ba9312a85c4d9640f9f40f3a65fe6e39", + "libraries/3rdparty/CMock/vendor/behaviors/Rakefile": "be9b1156744f3cf65e64c075ae5385313ce59e5ac4178ed8c63371bc817d214f", + "libraries/3rdparty/CMock/vendor/behaviors/lib/behaviors.rb": "c818cb720cce5d3da2b1a1e09601f2329f8889cccfdaf4e7ad7482d2524609d0", + "libraries/3rdparty/CMock/vendor/behaviors/lib/behaviors/reporttask.rb": "6abac47d73976e719ef3b2e47ffde7e048a08044e807b8d5b3eca7ab18c3acd8", + "libraries/3rdparty/CMock/vendor/behaviors/test/behaviors_tasks_test.rb": "04ef3a3e45cd62bc102267a2919240a9a021438e0dafccf2d817234104426ba9", + "libraries/3rdparty/CMock/vendor/behaviors/test/behaviors_test.rb": "4240fa9b7f31dcff3c5509827ebed298d2c388f55b8701221874300e815d76e0", + "libraries/3rdparty/CMock/vendor/behaviors/test/tasks_test/Rakefile": "0c9e136971e8aeb54404b4827de1b85cabb5512a8aaf8f36929e052339144638", + "libraries/3rdparty/CMock/vendor/behaviors/test/tasks_test/lib/user.rb": "b5527ab1ec2cde94b51b84e785840a076ceb4df87f8c71a52eb9119a1785f1d5", + "libraries/3rdparty/CMock/vendor/behaviors/test/tasks_test/test/user_test.rb": "e12e02edcc9868ad43634427fef9873e7e6a03a6144d59ed302d1f40beab18d6", + "libraries/3rdparty/CMock/vendor/c_exception/Gemfile": "cb78daa14792e77465dd161b635ba85f7a143bf30e003cd8fb16b01b7a166f6d", + "libraries/3rdparty/CMock/vendor/c_exception/Gemfile.lock": "15f6fce88a07c7d1c88ca17351debad274a78337fe6149e84c1d098ba5afd8a1", + "libraries/3rdparty/CMock/vendor/c_exception/LICENSE.txt": "4a7d2fd8c1a6b383df443b91d716cca25809e901fdc2f473026c17f00a02bb5d", + "libraries/3rdparty/CMock/vendor/c_exception/README.md": "9420da200b2d36c4948268b25f82cac4a71d66c5e4ede3012d714d2ce30d230f", + "libraries/3rdparty/CMock/vendor/c_exception/docs/CException.md": "70fb5bb5fd31b2f2a3414f67dc55544af51afd2a16c00a50db2ca74f1c55df6b", + "libraries/3rdparty/CMock/vendor/c_exception/docs/ThrowTheSwitchCodingStandard.md": "a1838b8c9e20ac3c15bf96742b716b6621c0607c9273ae0f92a6769e3aa45f41", + "libraries/3rdparty/CMock/vendor/c_exception/lib/CException.c": "02ded3b989fe1828ba78ede51a3b8f0624fd886da7d714deab3919938a8e205e", + "libraries/3rdparty/CMock/vendor/c_exception/lib/CException.h": "7feecde43aa33b8c2d22cc49fb51cf7cf8e1af04d8ec3be80d469d3e19cb7a33", + "libraries/3rdparty/CMock/vendor/c_exception/project.yml": "a40754c9266fa0905e42dd4dfd67e8248a26714d7f9bcd46a9dd2f5f497fc1bb", + "libraries/3rdparty/CMock/vendor/c_exception/test/TestException.c": "08979f5df6d14e827a261103543f70d0ede73d801ec3b343058f812600f01d4d", + "libraries/3rdparty/CMock/vendor/c_exception/test/support/CExceptionConfig.h": "f3f9e263f9dc8779684e0171241597d583888f971b0c224e92c02665eca8bc98", + "libraries/3rdparty/CMock/vendor/unity/CMakeLists.txt": "7028a7282b2e5703e9222c7608a8d3e6ff5ee901b911614d8f993eb3006a4f54", + "libraries/3rdparty/CMock/vendor/unity/LICENSE.txt": "3ed9b51da86f52c729c96cc99fdde6444b2297c788a9cf4ad1d3649dc34c4985", + "libraries/3rdparty/CMock/vendor/unity/README.md": "0a81a08645acbaf71afff965d0c7474a6a31af9d46cc156b78f7e35687802322", + "libraries/3rdparty/CMock/vendor/unity/auto/colour_prompt.rb": "2f879fa491913d5c32312353c2df6288fbdae11d78f43264078eab4c561f6c34", + "libraries/3rdparty/CMock/vendor/unity/auto/colour_reporter.rb": "2e6fbc6a1718d1f755378a934526a5b4fe11ef045302ac1e1c251e927477d697", + "libraries/3rdparty/CMock/vendor/unity/auto/generate_config.yml": "85c5702a168e366148e8ec89df416eae888278a526c79459162c0f37641a02fe", + "libraries/3rdparty/CMock/vendor/unity/auto/generate_module.rb": "ee6d57c2470555f987fd3cdc368ac193458366653dca363f088ba1ccb43a0c87", + "libraries/3rdparty/CMock/vendor/unity/auto/generate_test_runner.rb": "11edb8f93baa042ff543cb8c1d06c7f87672cc172318c13f9c2d675dfd0bc7e6", + "libraries/3rdparty/CMock/vendor/unity/auto/parse_output.rb": "ad1910bfff4d778f1fc53c111588238ee003809eb60717fde6dce7cf854879c6", + "libraries/3rdparty/CMock/vendor/unity/auto/run_test.erb": "d281f5070bc3627e69b515be4d5be243d2d96ec84857deb84ae8c97fd6e4e6ef", + "libraries/3rdparty/CMock/vendor/unity/auto/stylize_as_junit.rb": "fd0c45171391cbd0bc63cd5d4499e89eb51d087cf9c6c5ac2d4127e3d56bd9eb", + "libraries/3rdparty/CMock/vendor/unity/auto/test_file_filter.rb": "a69a44fccafbb504635163793799aa59809035951d7f258547d64d4145131a60", + "libraries/3rdparty/CMock/vendor/unity/auto/type_sanitizer.rb": "ecc5677ac9820f343aca50893463602fca940c24daf07a4784b4e9e0801c3f4b", + "libraries/3rdparty/CMock/vendor/unity/auto/unity_test_summary.py": "e46350b7132f04a7bb339d47bcef11ae0cb9e74c2050d0d75697b33c253c2895", + "libraries/3rdparty/CMock/vendor/unity/auto/unity_test_summary.rb": "721818505aab3199a712e4d6f964c84b07720f84a8fcf504349b586f05e8cd2b", + "libraries/3rdparty/CMock/vendor/unity/auto/unity_to_junit.py": "0743f26b5ae67af204981293337f9cc9a8cb46c90aaa3f46f31fd9658ab65990", + "libraries/3rdparty/CMock/vendor/unity/docs/ThrowTheSwitchCodingStandard.md": "f0f000eb1fc32b3a6684da894ed816d09ba077ad85e65e44f1f7998da47ef178", + "libraries/3rdparty/CMock/vendor/unity/docs/UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf": "28e8687d90c111ee8c249a7748495a0bfe00a3f35231b026ac73eed01d32eb34", + "libraries/3rdparty/CMock/vendor/unity/docs/UnityAssertionsReference.md": "6024576af0c49ffdec47ae174d22314848a175052d9b7f89fc82794757eecb93", + "libraries/3rdparty/CMock/vendor/unity/docs/UnityConfigurationGuide.md": "493d4860d561e583d992367df0f0efba226961c1dba8fd2bb4d2889a7308224d", + "libraries/3rdparty/CMock/vendor/unity/docs/UnityGettingStartedGuide.md": "54193aa975c291e62682c65fe088b7f960bedf4b58e2ce63e2dc1696a8ca3f6f", + "libraries/3rdparty/CMock/vendor/unity/docs/UnityHelperScriptsGuide.md": "f8b89d36c0b901265fd3366f0a93045218c03adf501c240a5570bc68e22ceaac", + "libraries/3rdparty/CMock/vendor/unity/examples/example_1/makefile": "a6b1cba50764fa8f18ef16dd11f4f1e7cd90e614d14bfe7dc22239245751cb6a", + "libraries/3rdparty/CMock/vendor/unity/examples/example_1/readme.txt": "4d72d51f1a385cd4aeb594e4485ca2439d5b86247523cd2d2b89acc2173d8a24", + "libraries/3rdparty/CMock/vendor/unity/examples/example_1/src/ProductionCode.c": "9d6b0ae761f7dfc008d6547031ff92de63976f5621b6feef2a29614cec51b357", + "libraries/3rdparty/CMock/vendor/unity/examples/example_1/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", + "libraries/3rdparty/CMock/vendor/unity/examples/example_1/src/ProductionCode2.c": "c2cc0a76cb2ea145d3861bd9ccc467ac45ad3e8230d5075ed174ce3a5cd50a76", + "libraries/3rdparty/CMock/vendor/unity/examples/example_1/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", + "libraries/3rdparty/CMock/vendor/unity/examples/example_1/test/TestProductionCode.c": "33e4b165d437c376f2393da59be0b22a3a458ebbe94cc2b340159b71f2d8bb74", + "libraries/3rdparty/CMock/vendor/unity/examples/example_1/test/TestProductionCode2.c": "11387f2ecdc97ee3344c0df42123e73cae899702b348d5597e09e9760db267aa", + "libraries/3rdparty/CMock/vendor/unity/examples/example_1/test/test_runners/TestProductionCode2_Runner.c": "2c84d6b954a6810a7c509dc861ee0c18a562dd23a5dd7747ea524f0c1467d9a4", + "libraries/3rdparty/CMock/vendor/unity/examples/example_1/test/test_runners/TestProductionCode_Runner.c": "b6ec7bb984eddea80c178ecb30f6f772325a745ff9812a5e3f41f236c43e19e0", + "libraries/3rdparty/CMock/vendor/unity/examples/example_2/makefile": "da2bf7ebba3456dec77ef500884654fdcffeb514ecbb84dc9cf930821ec2e9ec", + "libraries/3rdparty/CMock/vendor/unity/examples/example_2/readme.txt": "a03bf4ac2d294a037189b42f7bf8fdff0bf50524857e3f8933eba76085f22f04", + "libraries/3rdparty/CMock/vendor/unity/examples/example_2/src/ProductionCode.c": "75136eec7a43d0dbe980dea19ec46f6e16c0da92093686e59f6143d8ae8b5bb7", + "libraries/3rdparty/CMock/vendor/unity/examples/example_2/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", + "libraries/3rdparty/CMock/vendor/unity/examples/example_2/src/ProductionCode2.c": "a929e7ef393ec5ccc53e3f885d663a1c8fbe5cc5f72a0fcad5c0d2f6cbc8b210", + "libraries/3rdparty/CMock/vendor/unity/examples/example_2/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", + "libraries/3rdparty/CMock/vendor/unity/examples/example_2/test/TestProductionCode.c": "7db7b7d9e7216fdc0814ff8bbecc37f40e573006207b47cfd8954469ebc9b502", + "libraries/3rdparty/CMock/vendor/unity/examples/example_2/test/TestProductionCode2.c": "332f23e940a9676504c84dc92d1a6cf72cd9204afe7f664c16b58ee7dbff312d", + "libraries/3rdparty/CMock/vendor/unity/examples/example_2/test/test_runners/TestProductionCode2_Runner.c": "14aef95de310f1e1381feaaf256ea94d0905a538311b5e3fdc944f927e75b287", + "libraries/3rdparty/CMock/vendor/unity/examples/example_2/test/test_runners/TestProductionCode_Runner.c": "a782491bcd8dd857b26a62df58e8671f1cb7641d6c0fe7f7853c079732ccd8e9", + "libraries/3rdparty/CMock/vendor/unity/examples/example_2/test/test_runners/all_tests.c": "fe5c0418201d70dc696b0db6acf60b2ea0069d74fa94fb96d7169b8752e00d17", + "libraries/3rdparty/CMock/vendor/unity/examples/example_3/helper/UnityHelper.c": "091c2466d25deffd8958332ad03d393ca1ec1b1f6150c16626d57d5901eb1b21", + "libraries/3rdparty/CMock/vendor/unity/examples/example_3/helper/UnityHelper.h": "a95bb6d3704c51637bb0855787236b41229e3836601ba97e88768f95779f3d4d", + "libraries/3rdparty/CMock/vendor/unity/examples/example_3/rakefile.rb": "7b3b7d271caeb7af887b08986c9922ec331c8515d654ffb3e200833aa9be809f", + "libraries/3rdparty/CMock/vendor/unity/examples/example_3/rakefile_helper.rb": "bfc4aca33ed7bf68ffebf686790ec0c9e7a7bd23527147e81c10f4fd2dc38be0", + "libraries/3rdparty/CMock/vendor/unity/examples/example_3/readme.txt": "2af5e731fb1db0ddf5c739f0b08fb2724e4acc7efb7ee0a02fe474a3e69d284a", + "libraries/3rdparty/CMock/vendor/unity/examples/example_3/src/ProductionCode.c": "75136eec7a43d0dbe980dea19ec46f6e16c0da92093686e59f6143d8ae8b5bb7", + "libraries/3rdparty/CMock/vendor/unity/examples/example_3/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", + "libraries/3rdparty/CMock/vendor/unity/examples/example_3/src/ProductionCode2.c": "a929e7ef393ec5ccc53e3f885d663a1c8fbe5cc5f72a0fcad5c0d2f6cbc8b210", + "libraries/3rdparty/CMock/vendor/unity/examples/example_3/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", + "libraries/3rdparty/CMock/vendor/unity/examples/example_3/target_gcc_32.yml": "2e61fc6bc7930929985f1ea1ec5d0019fe1d133c01555c86b01b20145fb6aaa4", + "libraries/3rdparty/CMock/vendor/unity/examples/example_3/test/TestProductionCode.c": "b0e815e2285b1730d7dcd24b400d15b4efccfe5e4776d96248a2165c2f0caec6", + "libraries/3rdparty/CMock/vendor/unity/examples/example_3/test/TestProductionCode2.c": "895f437abd40bd461fd86a3b8ed6bc02c5c283fc3926aafe53b473e477fa0a5a", + "libraries/3rdparty/CMock/vendor/unity/examples/example_4/meson.build": "673e6c3c44d3e9933df54d13f27d1b90526ec2c990709aabc0e62a40fb20bf86", + "libraries/3rdparty/CMock/vendor/unity/examples/example_4/readme.txt": "d16faba668694cacde12746c58ec512de301218543217a9644e4e269bee8ab0c", + "libraries/3rdparty/CMock/vendor/unity/examples/example_4/src/ProductionCode.c": "9d6b0ae761f7dfc008d6547031ff92de63976f5621b6feef2a29614cec51b357", + "libraries/3rdparty/CMock/vendor/unity/examples/example_4/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", + "libraries/3rdparty/CMock/vendor/unity/examples/example_4/src/ProductionCode2.c": "c2cc0a76cb2ea145d3861bd9ccc467ac45ad3e8230d5075ed174ce3a5cd50a76", + "libraries/3rdparty/CMock/vendor/unity/examples/example_4/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", + "libraries/3rdparty/CMock/vendor/unity/examples/example_4/src/meson.build": "61880caad3c43396a16c5b6bd5a856480c55c129bf1fc282b874a99c87ab6af0", + "libraries/3rdparty/CMock/vendor/unity/examples/example_4/subprojects/unity.wrap": "59d1f20c0ada120ee62ef1baf30be51ebaaf40d30b16e4da014f9d58023b7a8a", + "libraries/3rdparty/CMock/vendor/unity/examples/example_4/test/TestProductionCode.c": "f3a8fa16e599d6aa7a0c9cf604ea1d42ff5466244372e00543fc3b2e116f0d41", + "libraries/3rdparty/CMock/vendor/unity/examples/example_4/test/TestProductionCode2.c": "26c0ee5fabc061cfd32ae891ab16f4b985f306dfea1a939d00e89a3c1ae6f25e", + "libraries/3rdparty/CMock/vendor/unity/examples/example_4/test/meson.build": "0e5be2e9c4406bf144f41b04c56ab62872b5e1c60c47c1ec81679b3b65a6236a", + "libraries/3rdparty/CMock/vendor/unity/examples/example_4/test/test_runners/TestProductionCode2_Runner.c": "2c84d6b954a6810a7c509dc861ee0c18a562dd23a5dd7747ea524f0c1467d9a4", + "libraries/3rdparty/CMock/vendor/unity/examples/example_4/test/test_runners/TestProductionCode_Runner.c": "b6ec7bb984eddea80c178ecb30f6f772325a745ff9812a5e3f41f236c43e19e0", + "libraries/3rdparty/CMock/vendor/unity/examples/example_4/test/test_runners/meson.build": "a3552bd0a1d0ddd01dc5a70effa8582b1f1bf07b706cea47da4b512b040b06e2", + "libraries/3rdparty/CMock/vendor/unity/examples/unity_config.h": "a7038b3cd217dc3d9534ce8d4d58c842912ee63ac35718d4917a605635eb941b", + "libraries/3rdparty/CMock/vendor/unity/extras/eclipse/error_parsers.txt": "67e309b5e803a22ba22c347aa5123cbbe73edcbfe9950aa0fd74576a4add1a12", + "libraries/3rdparty/CMock/vendor/unity/extras/fixture/rakefile.rb": "7392cb66dfa0de3c644934adf64f4e03ff0a2a2128fd10f9df5600e9a991d764", + "libraries/3rdparty/CMock/vendor/unity/extras/fixture/rakefile_helper.rb": "8ff10722c9808c465e02b83f062d24ad47371cb09be32965d2ec455742b5e3f7", + "libraries/3rdparty/CMock/vendor/unity/extras/fixture/readme.md": "6a2e59367724a64ae4fcda3de28158006c72a0d4b30b9abeac15ba415fe9f145", + "libraries/3rdparty/CMock/vendor/unity/extras/fixture/src/unity_fixture.c": "c0ccd5532ff2f73c15eef21533d6bf292b2b6173bb6133e2308ab24c222ea8dc", + "libraries/3rdparty/CMock/vendor/unity/extras/fixture/src/unity_fixture.h": "73854da3d615a041ab114be64bb98debfa8b186ac9741682f3de4cabc153100b", + "libraries/3rdparty/CMock/vendor/unity/extras/fixture/src/unity_fixture_internals.h": "adf665b853438b5e35ffc72e6d0f1bd404a09188fbd4fc7c64c2eb30b25781ea", + "libraries/3rdparty/CMock/vendor/unity/extras/fixture/test/Makefile": "f61e0e71da2aa1e38d4ba244178ef7ddd976447bc57332e17ac62319e1765ee3", + "libraries/3rdparty/CMock/vendor/unity/extras/fixture/test/main/AllTests.c": "b90030dde0bdea78a78df99e177bba1aa6a162a21527027920e01abbe991e8f5", + "libraries/3rdparty/CMock/vendor/unity/extras/fixture/test/template_fixture_tests.c": "3ca4c500397fc3dd7370b419e7d4f7abb3a8b05deacaf72a4e2ccb396669003a", + "libraries/3rdparty/CMock/vendor/unity/extras/fixture/test/unity_fixture_Test.c": "6edfe13bd81264856f4bbe3d421ab40f1f47529e0a57f7b95b1b13155d51db24", + "libraries/3rdparty/CMock/vendor/unity/extras/fixture/test/unity_fixture_TestRunner.c": "cabed04e1b026bd8ae2b47f54e8777899c3564cae952e62fc59965d2117a3215", + "libraries/3rdparty/CMock/vendor/unity/extras/memory/rakefile.rb": "9f53e177b9066458d30e94c31e8ef8bb6f66b2eba7c86137d20ebbdab8e42787", + "libraries/3rdparty/CMock/vendor/unity/extras/memory/rakefile_helper.rb": "bf752945bdbc26c9d9bb4acfbe3bd4210c6d1e7b811af755024b9000f0edf035", + "libraries/3rdparty/CMock/vendor/unity/extras/memory/readme.md": "5cc935c39537f3a403a80b82c1ba24d6ba895275927a6b5db8362e233438a97a", + "libraries/3rdparty/CMock/vendor/unity/extras/memory/src/unity_memory.c": "7bc202de8e950466f713b2c3918beb824a10d33cd7df43058dd4676573fc2645", + "libraries/3rdparty/CMock/vendor/unity/extras/memory/src/unity_memory.h": "85ea1b5fa55bd59f03901fad4272a938a33696d9f0821d085ba6fc5463fb391b", + "libraries/3rdparty/CMock/vendor/unity/extras/memory/test/Makefile": "4530559b0cf8de81a35d3e5901aa3b5bdfb523cba3458bac37e1beebedde0e63", + "libraries/3rdparty/CMock/vendor/unity/extras/memory/test/unity_memory_Test.c": "64e492cafc7da28265299706ee3c663db66edf3c5556cb27f06039d1876f63d8", + "libraries/3rdparty/CMock/vendor/unity/extras/memory/test/unity_memory_TestRunner.c": "8265bf36612d73d5286303a4259b444e7e86ed011551c3be9f43be6a1804a781", + "libraries/3rdparty/CMock/vendor/unity/extras/memory/test/unity_output_Spy.c": "c18d6d3034a751915b3deb137b098eee14498a06b4f7bf8a8a59ffe4d260d4a7", + "libraries/3rdparty/CMock/vendor/unity/extras/memory/test/unity_output_Spy.h": "20f9beac9acaf917cbf2011fbae1e5b919c6876646ca48e02379b72a12f7f971", + "libraries/3rdparty/CMock/vendor/unity/meson.build": "96c3a2e5f3817783e7ed0a6fead1bdbd6e486d89da020a9071a4fd57efd809f3", + "libraries/3rdparty/CMock/vendor/unity/src/CMakeLists.txt": "d142a855d72394a3b5bbac8ec8162d64fa4705bd546ec2c95f82d19de862d8ec", + "libraries/3rdparty/CMock/vendor/unity/src/meson.build": "8323ce6255874c200d74a2dc6057c099b056084a59f679733ecdbec89d465ac7", + "libraries/3rdparty/CMock/vendor/unity/src/unity.c": "0fe7ab63c9ccde2a797a84d2f458a9981583e9c5ae702a3b4a1d521e97eee210", + "libraries/3rdparty/CMock/vendor/unity/src/unity.h": "cc15d99a35b6488fd3434bd60db51b99cc22fd98975991d3ec247eb31ff98cb5", + "libraries/3rdparty/CMock/vendor/unity/src/unity_internals.h": "90657c9162b5e5f8381806639a0071958bb9b3d42622ebef1a0857c9caf0ca9a", + "libraries/3rdparty/CMock/vendor/unity/test/Makefile": "7c04243c305b1edf102bde8b209a192d93ee7e4442b9a46c232e8ff20c5c522e", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_cmd.c": "832ec9c8c30fd374adea6620dd38c19c689047bdad0513984066e525eefc0723", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_def.c": "246d3d9bc73ccef28f7a70b8748d95cd31eb85b9874e6972d30be1f74000fb8c", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_head1.c": "ed31f2c63e4bb7ba015a5388429b34287ecefa098551e55ae5864b883c3cdad4", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_head1.h": "fc279a298e45f70a559d05132ae888973c8f5aad913c0b2d6d8425ccbde5c998", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_cmd.c": "b826f44458088555058b6c3b9c7ef15c2a5528c8efe01034d0f1debee06a739e", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_def.c": "1016f1162a3ea3be49dffd824e529493d2845860d1139cb44cc32f0fe0a0701f", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_head1.c": "cb7b253cefa315d7b4edaa386bffb63a728f3b33c869bf55ecfcd53d1e47eaaf", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_head1.h": "9cb779d98b40e5dfcf70db57f7d3deae6310cac80547140c972ecde585f56c18", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_new1.c": "4e5d73972dce4276dc688016eeb310e93ef96ea7beee0e6839092f0459798856", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_new2.c": "74418cfefe544ac366a043972648c31742b2a4652155507c93a1a2a38471a5eb", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_param.c": "6a8edda1c9b5a56d38e705d2d0341232ca9a55f1fb7383171475cb972c9b6c18", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_run1.c": "4e5d73972dce4276dc688016eeb310e93ef96ea7beee0e6839092f0459798856", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_run2.c": "74418cfefe544ac366a043972648c31742b2a4652155507c93a1a2a38471a5eb", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_mock_yaml.c": "763d37bc5a5edc7566bf6625dd38878aed8cc94a5cec8f6e23aee16e30bdaad6", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_new1.c": "983abee21894ba9fb5d667a69b046558867f9f16eaf546d259671f54dd4be626", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_new2.c": "9726bdaec7a5c8e99b4e6bbfc41b91c8687665bbafdb617be4514eadc30b023c", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_param.c": "7ab6834f8376908625b9999a4c5dad32ad65c8f3fd852e78b6d9c3bc871fc639", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_run1.c": "983abee21894ba9fb5d667a69b046558867f9f16eaf546d259671f54dd4be626", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_run2.c": "9726bdaec7a5c8e99b4e6bbfc41b91c8687665bbafdb617be4514eadc30b023c", + "libraries/3rdparty/CMock/vendor/unity/test/expectdata/testsample_yaml.c": "17714f87e28c7723608fdc832189965482404e3540e3f3ec55afa7f07054e0a7", + "libraries/3rdparty/CMock/vendor/unity/test/rakefile": "5dc9eb1c3ba23e040a3b413d613f252ab2b475ed741fa3690ecbce765e339156", + "libraries/3rdparty/CMock/vendor/unity/test/rakefile_helper.rb": "b3cfef74c49503599d02c4ca75a7fe72622b97c2ac217ebc853a9d545b419405", + "libraries/3rdparty/CMock/vendor/unity/test/spec/generate_module_existing_file_spec.rb": "41d0b6bf8255f97e4fbf6c4f5fb2dcc61d846d2ddaf2cad763c1f500b8a68727", + "libraries/3rdparty/CMock/vendor/unity/test/targets/ansi.yml": "371ad9aaf2dc447000f8d575b3c6372444cc318e890bb968e331a9d990d8aebe", + "libraries/3rdparty/CMock/vendor/unity/test/targets/clang_file.yml": "afbb70db8cc433aca8e6ea3d04d2f5142cc8bd1a8f6e421006038c9601222d32", + "libraries/3rdparty/CMock/vendor/unity/test/targets/clang_strict.yml": "336cc5344beccd0c3a6c83227b764c8945193b464600ba56ade14c3c44c98b27", + "libraries/3rdparty/CMock/vendor/unity/test/targets/gcc_32.yml": "734debdb4392b83942cdccfb31ca724a43b923617a8b45d86bf6a1fefa86a7e6", + "libraries/3rdparty/CMock/vendor/unity/test/targets/gcc_64.yml": "530851623a24956399add9f0c0fe18719eb6dc428c1bec03ae6b255a9d0ae972", + "libraries/3rdparty/CMock/vendor/unity/test/targets/gcc_auto_limits.yml": "fbd96dc8a94c4de70dae87ff378312b3ee07cb8219d6290af17d36e3b34d0f6e", + "libraries/3rdparty/CMock/vendor/unity/test/targets/gcc_auto_stdint.yml": "c9ec9f61987603d059d4509f4befe0744f5fa99a137d95be359ddd2c71443281", + "libraries/3rdparty/CMock/vendor/unity/test/targets/gcc_manual_math.yml": "3bd8b0d4eb9fa693f4cf74fdaf61e31183b85351c4e957577bc8497cdc8f15a0", + "libraries/3rdparty/CMock/vendor/unity/test/targets/hitech_picc18.yml": "7b2a4ea56f3125fd75bb7d8e9baf1f26706b206f98c6f88e4d4b4091361fc546", + "libraries/3rdparty/CMock/vendor/unity/test/targets/iar_arm_v4.yml": "3df93ad02fd4e1cc17d28a63f824881eee4f73e1db54e43ff36909dd2f5eabaf", + "libraries/3rdparty/CMock/vendor/unity/test/targets/iar_arm_v5.yml": "bb6f961bbf3cf2c4651a33bf415818726b4d609c05cb9fdeabe6dc7a94d47e6b", + "libraries/3rdparty/CMock/vendor/unity/test/targets/iar_arm_v5_3.yml": "bb6f961bbf3cf2c4651a33bf415818726b4d609c05cb9fdeabe6dc7a94d47e6b", + "libraries/3rdparty/CMock/vendor/unity/test/targets/iar_armcortex_LM3S9B92_v5_4.yml": "8835f98e84e75b920fb9e27c0ebcc9c11f14bff768b382441099a01cbf7a129d", + "libraries/3rdparty/CMock/vendor/unity/test/targets/iar_cortexm3_v5.yml": "70ba518b050162526cf5cfd3cdc90a00a6aad0d0ef65558612d384c855513d52", + "libraries/3rdparty/CMock/vendor/unity/test/targets/iar_msp430.yml": "527ef25ba8d5056a8b44fce38302895a1a8ed342331edeed69db067b831c8e7b", + "libraries/3rdparty/CMock/vendor/unity/test/targets/iar_sh2a_v6.yml": "b99162afd271d76014220cabda53ff3951aae6595b198520eba36ef095e57746", + "libraries/3rdparty/CMock/vendor/unity/test/testdata/CException.h": "1d815018f2b5c5973982e9e13c9534bb5cd96e6deea5b1f29b531233f476e843", + "libraries/3rdparty/CMock/vendor/unity/test/testdata/Defs.h": "9c7988c8f87c13251880be27117c9cd5d7078990bef9d34200a342cf26911bd7", + "libraries/3rdparty/CMock/vendor/unity/test/testdata/cmock.h": "ae873ab649d7ea46f2e23ee13cbac383c527d5935bc40b31dced6969fb4d235d", + "libraries/3rdparty/CMock/vendor/unity/test/testdata/mockMock.h": "bbf1b3aaddf02a21cdb52b7b58d2f74927d586d013ca923e25eb93b121bdcf47", + "libraries/3rdparty/CMock/vendor/unity/test/testdata/testRunnerGenerator.c": "721d2a8bef4daf1d4a61e30f8bf8bf1d263377c9f763f9129218d638ddac65d8", + "libraries/3rdparty/CMock/vendor/unity/test/testdata/testRunnerGeneratorSmall.c": "f32a9a46a78102474346c7516bdb0401fabef9ee8616d033237a4bc658e3357a", + "libraries/3rdparty/CMock/vendor/unity/test/testdata/testRunnerGeneratorWithMocks.c": "ea6887c98c35906e04e492cc06618294fef70f0bbbc9ca0cf1dd2ac3c14fe72d", + "libraries/3rdparty/CMock/vendor/unity/test/tests/test_generate_test_runner.rb": "841d599bc5addfc2f89c425031428c67ea7d32d09eee0fb9ce86bac6b12f8bf6", + "libraries/3rdparty/CMock/vendor/unity/test/tests/testparameterized.c": "76ea3bd9cd68cb88a0a3a5098b37f4669e382065f9f372ca9510c525609176a7", + "libraries/3rdparty/CMock/vendor/unity/test/tests/testunity.c": "26709a643b37d7a93310ceace6589cbdc3506638e83e411a77bcdbbb3dce3316", + "libraries/3rdparty/jsmn/LICENSE": "4675b94a50d2afe811c52785463c854f1156056632cce17cc7133939eac8ed55", + "libraries/3rdparty/jsmn/jsmn.c": "f91533b8c65ffe13d3389f18e6f74a09aec61c23bc44318f40135bc004b075fa", + "libraries/3rdparty/jsmn/jsmn.h": "f24904f8e9df0be61cd26430851f026ebbf7d85a4c856ef2c975e85f1cb304b7", + "libraries/3rdparty/lwip/BUILDING": "0a1c749c1f6f5f0ec6ad414cb7e591269519ae43246877fe509f1a5829e36e35", + "libraries/3rdparty/lwip/CHANGELOG": "20b9468a181659c87502589c5af5d47799f981971485d17d51fc0137d09c4c9f", + "libraries/3rdparty/lwip/CMakeLists.txt": "af867862797d65753179f66d3e8ee9cc3aa0cb75d29569cdc907614761ce89b6", + "libraries/3rdparty/lwip/COPYING": "8fb15ebdb19eb669e1d37fcd8e57a44c477fcc0e93a9ab0d181760965f94d5ed", + "libraries/3rdparty/lwip/FEATURES": "39a76615b5fc94b8fcc9236969f17b5b0589de89cf16dab88d0352e2a03fe196", + "libraries/3rdparty/lwip/FILES": "8cab124b0bfd686958adeb1e36e7f485b2c0411b75fecb28590cfd8c98bf00c6", + "libraries/3rdparty/lwip/README": "4df2502ceaad651baeab18f8a0a42600abf6958a42eb2a9bb9a8a00c6bf7a9cd", + "libraries/3rdparty/lwip/UPGRADING": "26796743baf56c6076c44a09785927bb123af20a5e86343f1dd4c1dfd083be0e", + "libraries/3rdparty/lwip/contrib/Coverity/coverity.c": "3eb4a92d33ab70f452c03348ce3b633fe218fe805886faccdcd95797eef5232e", + "libraries/3rdparty/lwip/contrib/Filelists.cmake": "590fc51ddb0af575d8c022ee8188df8e8651944f88bbd424c94f2ab11c508c8a", + "libraries/3rdparty/lwip/contrib/Filelists.mk": "ea49ada77ac4343f92ff36c199427cd40d1f5a04f84f19ff1b50d0cec65f096a", + "libraries/3rdparty/lwip/contrib/addons/ipv6_static_routing/README": "975561ddbdb26be17bbdc2d12fb6caffd82c215985f2a09463c366bf155321be", + "libraries/3rdparty/lwip/contrib/addons/ipv6_static_routing/ip6_route_table.c": "afa0fb5045d1b6fec69e158b6d5a04853061be9cd141e42e86e491bcb4762872", + "libraries/3rdparty/lwip/contrib/addons/ipv6_static_routing/ip6_route_table.h": "902a7b7cdbf0d232b8df1456fb4809cbeb36db0263c52ddbe3758a9682faa667", + "libraries/3rdparty/lwip/contrib/addons/netconn/external_resolve/dnssd.c": "94e43cfeea372e722b89f6856bbed669482141e27b654a1ae07e8017b426ff90", + "libraries/3rdparty/lwip/contrib/addons/netconn/external_resolve/dnssd.h": "c083f26803984773cbcf71ca83c2a6ab55abced7160ab7a29c4541c2c965e9d7", + "libraries/3rdparty/lwip/contrib/addons/tcp_isn/tcp_isn.c": "1cad9712add2b8b460f5d8da6fa811b86fdd3a565ccad0c589e8b7a50c5261c1", + "libraries/3rdparty/lwip/contrib/addons/tcp_isn/tcp_isn.h": "5593cb63e92665c4fc5380d84525990db565112d85f5c5b0118a1c09f678d5b9", + "libraries/3rdparty/lwip/contrib/addons/tcp_md5/README": "151eaff01b88ed8664e270dacdde434881e8c8040ea37b7f091340084a955a0d", + "libraries/3rdparty/lwip/contrib/addons/tcp_md5/tcp_md5.c": "f9e0f2d1e421eb97c869821cfb698d6728a318dda51433291e7efcfe9419e818", + "libraries/3rdparty/lwip/contrib/addons/tcp_md5/tcp_md5.h": "33a7897465b0a58309742912a55cb983d624cfe4824389072dbfdd6ad674867c", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/CCodeGeneration.csproj": "08be7ff6c6932c2a9cfe6e97557d4ef843dcaa9ca10facde33b1cea1e3a9ea9b", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/CFile.cs": "71f885b98cd0ba2ca6632ceb547d85b4a29763dcfd67771395722a6e665f91ed", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/CGenerator.cs": "f5b6aaea1ed850d8aac63b3617fad4fd6114638ea86e54da306d7d36b6bd8dce", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/Code.cs": "bb4c67f7b00d77ecf82e63989ded1f89df66ef351866a4de5ef3bdd05651bed2", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/CodeContainerBase.cs": "ee8281ce892530b2597441004f99409f1602a7ddd711d6d23582ac47b3f5500b", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/CodeElement.cs": "7c813f6a24fdc8cace9d659028c7580965a5731dc5248f5ad94308d0994916a2", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/Comment.cs": "c0d3e30a6e66a522f03e5c5eafaf7767104fa11b11b1db636c20ae207e80ab69", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/EmptyLine.cs": "ce23bfc251324526950e1b499cb7e1ba0e51bdcc43da9c311c6da9bc39a3e5ab", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/Function.cs": "2a86f450b1a3e7c228892508466d19fba7815fb7a4fbff9164f0899bb0f43c7d", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/FunctionDeclaration.cs": "81af456dd2a181184a5f4765087a69231cb1c41c968e560544bf6a3a072e126a", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/IfThenElse.cs": "33a6b618fd5adf44c4603493d479ef5bb0c0fc4528ce9788ade96eade936050e", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_If.cs": "a93397190469c79e4a1ab6f7ca86be5fa34a63bf622545211d6d2670c329f17d", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_Ifdef.cs": "dcc2ec42684fdf33941c422580ba4fb672eaf72af4ee22768720ba939b23c586", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_Include.cs": "4e6f18a41be22b75ebe01ce73c61fc00148fe9af1d23bd024ae9e7cf70a93e68", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_Macro.cs": "b10ee1a33ab13c70f22474718512ed554482f2e87617d6fe5ab99eaf8691b9d1", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/PlainText.cs": "9f6230df9d06345f6c76c2d2aeb7631ad91085f5fec03721d2c0724709bc026e", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/Properties/AssemblyInfo.cs": "37599227bf85cd5fbf21d695c5d5b4156c08e968310270bdb69ccadeeb890c27", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/Switch.cs": "89a17fcd8638ba1939e90d654ebea0fb289116f32cdf85e7b6c1bf96ca4b984e", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/VariableDeclaration.cs": "0908049f20bace0fedf39854620aff86d39039c8c7f2da2859ae00f755496699", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/VariablePrototype.cs": "362858ef52f27562968f2d07cb7f6ca7c1a5e04eb2a96eae866fc192ea168fd9", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/CCodeGeneration/VariableType.cs": "4155b469af638550ff8226eaa71b9d43160c2be9515e227e2954ff73a2235a5d", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipMibCompiler.sln": "0fb1b4c5838afaf26e2084aa358551c07aa60eee8293beeb5c5777be7db074dc", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipMibCompiler/LwipMibCompiler.csproj": "3e1ccbbc10ba31bf28e61e9f08916457cf249a6f55084d8a965d3a2b0b9b72f1", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipMibCompiler/Program.cs": "510a7695e81c42d2d38c25a6ce0519b450b1806d864ae47095d5c9b8fe6efbef", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipMibCompiler/Properties/AssemblyInfo.cs": "1b81fead7f0f8ce1324c33244a2b4881de5e868fa7c44680f4bdd416aefe1eb2", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipMibCompiler/app.config": "49f0226c179b7f7a5d1f4b7a2d01bcc6752e80944fd96927b60d773bd77075dd", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/IRestriction.cs": "4ce9b1841c83203f4f32135c8731879ddf51f26253a62282b7ceb2bfa1d08e46", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmp.cs": "fe3911d9575cea5567a1d2f8c00c304e87988a2e389bf3da2c568d3ace89ebae", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmpCodeGeneration.csproj": "bb073c52d2b1b424b17632fe5e0d94716f971361dcecf6deeb12af777880703b", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/MibCFile.cs": "b7a8974e02597d285fc730f944cfb4583f6c48b5d8f36e70fb06abdf799063c8", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/MibHeaderFile.cs": "3b13376b6ac40784485d23b1ef3bdda5f9143210a69ea100079a385efcc8d7ab", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/Properties/AssemblyInfo.cs": "154b6c0382a258ab328b6799a8bc55acef5defc114e0651e39e0926c544fda78", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpMib.cs": "be5945d415c3f484ba3679f73446c5e0a1949ee156d095e5c543ed1b6842273c", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpNode.cs": "817531e1d8cc234d96bdd7a3598fb8d1840ab2ba75b61c96cd13c9757fb00819", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarAggregationNode.cs": "ea220467112678069cad418a7c7d984d2da9cfc4bf0dd8b6e00cfd3aa3083e2b", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarArrayNode.cs": "a81138b14b2a06425e000d2a4b2e83c183d2c1b39530fa415ac8172279218c3b", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNode.cs": "e5564a84d5cb1fa1eacc5551141b76ac737b82a1cae9ba79e40bf359c443fb46", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeBits.cs": "a273a64f770443e0b26d53aed1a380f831bf3e1938396b570d691908338dfa2f", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeCounter64.cs": "6b061892e424c4e8237adae632676993faa567d3bdb3b59f0d43024d75c4934e", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeInt.cs": "e2c9c697e09e1b85dd6b4e21af10588c72cfceb495656f5089c3002dd279e5c0", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeObjectIdentifier.cs": "adcca7908d7ee6374f08ab6106abf52c1d55810f7266fe7d12eece011e46e76e", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeOctetString.cs": "5a3879a0d44aba0e26400d53fee40ac0fd42a51a0f32440e248a220a09b511a9", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeTruthValue.cs": "d092cae1b5eeb4c662868c178e1491adb832932b0cdcb627d6fa21cb56679c96", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeUint.cs": "716fcc054c0048615e0a9cbde400106c87e0f55dcda3f9f0f62f727f3c5bcdef", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTableNode.cs": "aae98581aa5205e4742febb20536670ac45537eda5e48c553d879f074508417f", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTreeNode.cs": "c2892b28d3c9fab25bab2d713c7fbb3b9c716d94561cbf84cd979f98fadbc798", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/FormMain.Designer.cs": "900f7135ced78b538ac59b43ce85f0fef6dbab6144d1c98b9e05ea5e64cb4de3", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/FormMain.cs": "60ae71b9f5ca42038a790f33eb0c31616a32f24148d86a653fea286d958b2b51", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/FormMain.resx": "b8ae1de569c06e8da5f0c1cbec88a9232382ba51b8558563353e4d648dd990b2", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/MibViewer.csproj": "2c2755db20fbe372e0b8a58dbc24039a8b0de9b03b4a3f7ba9800bd104acc405", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/Program.cs": "582d27447362b96d1bac405154d4a137a1eb729234e4c55ab0920823135fc97a", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/Properties/AssemblyInfo.cs": "dd2295c56779339b5a04082f5f5acfb428e67a4cc30a48fb0ab5596c2e3adc63", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/Properties/Resources.Designer.cs": "10f36528404675f98ca302c8d2f47d4cd914e3cbb1287bdd9c670ca930deed5b", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/Properties/Resources.resx": "4e124f5a7694ffe813c60601b1b73c53e47536b1f1c0e798d4d55bfc2ca3774f", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/Properties/Settings.Designer.cs": "f18a13fee4b93e15bdcc288ca2b102ad916618abbf6c0b8ef22d8078138cd913", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/Properties/Settings.settings": "baba99193fc1787141063b135424b476ff4151beb833883fcb594631f17c0147", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/MibViewer/app.config": "49f0226c179b7f7a5d1f4b7a2d01bcc6752e80944fd96927b60d773bd77075dd", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA-ADDRESS-FAMILY-NUMBERS-MIB": "74aecf2da295c9929c1c20935d48dab929c4c48b4ec70dd84ea054207b001045", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA-CHARSET-MIB": "171318805f951e9468683bea1fe7bea37491488a917030a51dffc5eba02b7908", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-ITU-ALARM-TC-MIB": "2171d34e8d8e742424f0c6adbc60b163b1dae5928a8d9e9eb8ea504995d694e9", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-LANGUAGE-MIB": "d0ae6af35e45722a22c7069523ff589eff0f050b539dcf47b855c3cfc9b1dc13", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-MALLOC-MIB": "5ce4b4857e936ca970478b2ef5ff2354ea1bd1baab511983fb3666cd9ae03133", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-MAU-MIB": "e28c569d8fe395a5cb3177a5df2adfeb8c57e84c4a9462e7dddd4e42902132e7", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-PRINTER-MIB": "954427ef5c22b525cec3ff2550b994afecdd84769b4f232871af0ff38effa559", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-RTPROTO-MIB": "c1906c8a2a42b3f2cb6eab0dbb14608c59661bd02998dcc0a28fe4ac0797868e", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA/IANATn3270eTC-MIB": "007a32634e83244600ff3a9cf5d891732126550f06257f5d2fec700cdcd4589c", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IANA/IANAifType-MIB": "511af70e38b199868babf6a1dbb64347daa3a76801a10227098775525179b7a1", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IF-MIB": "6377ddb359e4e16cecdc2a8fa95b7f32dc571f8670b22e2f8aaa243b5637d5c6", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/INET-ADDRESS-MIB": "db97536a82d2dc39daae4879a54095d5caa30761698f29231576046f8a51239d", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/IP-MIB": "14ac0dbb9254e4b8007f6f8d50b3f9faba0e20857cf5ab6c68ec71c804f76dd8", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/RFC-1212": "86b7136171cd3efd16909125a99a4892fd7d859d671391588b8e30fc0b942cd1", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/RFC-1215": "c96ea7bc5b2b05c361f69ce4dd637a7d8d5b97d60b4b7694539998a1a1c2ef57", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/RFC1065-SMI": "8094e15c0e24740830291d0203fbbb62b9c7fc47c3efed6a0cc10030609f11bc", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/RFC1155-SMI": "4e4c178793aa234504fde442ad527bc66ffface448b35f12e062e73c47d0f3a4", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/RFC1158-MIB": "5b437e2b5ad18d3db7c336446cd5c1fb1906ce21ff8967150e99c28e33fdde3d", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/RFC1213-MIB": "e9fef1a36e6c4200853a3e908bb0c991b2f8c5302dceff2b069a6597ce9215bc", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-CONF": "b96bd8fceb39587f126eb30248eaf4b9769a5e35714f1ee21ecc478d80272dda", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-MIB": "7fb972a35dae3e6bbcb9228b707a8eee3582719c8d11c4fcbd4c621fbc63e40c", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-SMI": "bdf7c016a12095cc429d8ef631178b940e2d27dd762ecc8ab601db74bfbe927e", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-TC": "0fbdb5e54efa9b5f5ee5ef19fd2106a2217927f00477d53d6ba9df16a632bd05", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-TM": "d2d09410594400a287eea430466962d83d656cf609e5d31392ad898a44435c7f", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/TCP-MIB": "e26faa91ce7d356cb6d83aa5a9daa47ed38e8ed94ef7208bf8b3cc6fca016554", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/Mibs/UDP-MIB": "c8de41eba6600414b492e0a513b99c37da4b0e20469fe35d5e8425e5bce0a47e", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/DisplayHint.cs": "b3f24f6953819d1db3db200899770988434b02e372d2d2a563edfbc3dad19978", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/AgentCapabilities.cs": "1eab4cc1c092d0339a6872ac3454fd1d8e0dcc1c5782f7b91c64262a6f12afc2", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/EntityBase.cs": "321a1ec630fb65757109fee736396b9245a80a7f5dd151fa0328dbdba6332854", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/IEntity.cs": "7232dbdc007bb45a8f8dea614ddff1c1e8494ef746bdd52b07ab64bba71e9fac", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleCompliance.cs": "628c0b0d90b1328bac86823b95ce078510409f2286d513ae6cded76d5d5d71a0", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleIdentity.cs": "5d7342d3905740369d09d0d18a9ed9fa06dd59014bcf08dce25ccfce7ffcaea4", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationGroup.cs": "39ffcd81f7ba9802fdb05a486b2396683fe60e3227b9e5e2e8066f4513ed122e", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationType.cs": "6ef1826c956e893376038a8a743b7e78c75a06e9d069e7e4255db53c768862e3", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectGroup.cs": "6574a6e4056f9fbed518f584a0d0f9ecb2631eed9224ba52e40bcab318e0bfdc", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectIdentity.cs": "904638f353d6488e2a1fbddb5a6c3bd76a874f17108efb212c0832e46af1a5a7", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectType.cs": "c3b54e130db6ea88d1c304fae1bb9cd79b30746ec5904775673c878cb18ffd14", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/OidValueAssignment.cs": "7ce81e1289eef3ec2d4fbaa2cf84fc5d1d55355e31fc4cda4924598c55c55470", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Exports.cs": "5ed3a5d9fabe8cde938ecf6c9ad77a26136e239eef3e6fede4043e9633ba3fbd", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IDeclaration.cs": "06c6f371bb6ec960f4d48ba24d75f65e827c705ff34779a42bae288b59e88e8a", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IElement.cs": "f106b41766d2bbd43213758c9ad45515dd55261e398773635a2d5f0a12eb9659", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ITypeReferrer.cs": "64f67129913339054225d6423596537033890a9b6b7ef8e547770a6007c1540a", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Imports.cs": "f125d095d6f80c60b9d329e22241b133bdfaf67a9abb50dfa47d2f0d99527007", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ImportsFrom.cs": "9d509b7cd576c3e0a9c7215d6f254bfe77af6e1aa5077985fecfd1c84fc8cd19", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/TrapType.cs": "61db3f0a2c75f61bf8e7bc05f1b4c43b3ea638c0de8112f795b19c66aedf20bf", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BaseType.cs": "93a432e574ebe2b418ac219c257243ca93444c965cc3bd98cdc15a680e00a872", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BitsType.cs": "cb2280707ace8c7cf1ace5f3479bdf6ff7bd0f530401d7346167984ff5c7a4ab", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Choice.cs": "8293714e9114900371790ed8d466c44ed9421752f9d13d70a92332232d35b982", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ITypeAssignment.cs": "110095915035ff4da95e82631a1b9720c8aec98220954d2ad977f2d713f75b78", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IntegerType.cs": "b82a91052415366bf55db02e07285e70d94c57e2338b469342969a7b3ddda7df", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IpAddressType.cs": "6b84597c58cf981694d096a158dfe0f7f6378d9b491b39e8c368f4cc850af07a", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Macro.cs": "922993e939e435a0c8c7169382368084988fe5efb0b766a62df66a603fab95ba", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ObjectIdentifierType.cs": "1cc6cbbf4a55e5d1c50ef7d31d6b65c0ead2544e19438433461785cf039299fb", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OctetStringType.cs": "1d87f07140c978e6161cd3f5f6ec332330eb680401298ecef87698140b36cb73", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OpaqueType.cs": "98d2a78598d798b1f30734ff5ac38906fe3f8b694732bae8a99f5c4caf6e75eb", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Sequence.cs": "dd213d0b822a7b42f486f9da1c5b5558ef1894cd0d62e1779555b1a3a94fe6e6", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/SequenceOf.cs": "bd61d745bb1cf6ffc690fd367cb8917bed82e6a10ed5410ef973b9e3758e495c", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TextualConvention.cs": "21259663b0c38aea4a5d15bdcea4ea67cd247c92d5bbc17372de9e0e323f3905", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TypeAssignment.cs": "4ceec51fd4ea8c19d7d4302812c66153abb7bfe4ae7619d40ebe897043f8de67", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/UnsignedType.cs": "b87b9fd790d32d9b228b71701af968bd623f5681f7e776e79abd8ed49289f7b9", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/IModule.cs": "a0111c3a29ce0a798caebf7176d52bccdce4d5a2c6df0c0bfab59ed161275544", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ISymbolEnumerator.cs": "ea45429a2f94a10369a2dc4ba4ac803d3b8d081b11c23eca1c1eab497faf2d7f", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Lexer.cs": "f9a8718339d55a167c4642c86e685856eec852f3e01a4aee032481c8f1576b94", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MaxAccess.cs": "f794a432573645b44938cda3894399ffe67da8d5e647e47abf80c83ebcd726d5", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibDocument.cs": "2e3ecbb52164913350151f012a8e1df822cfc6ff3262913a303237c122f65bb3", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibException.cs": "38b6f9de34b2495000f23d2cf5240575a1aa192f812a27dc645fa7ab341383b6", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibModule.cs": "8ed64591aecdbc369c0d37a1e237a2f5137ed293429b0a53ad57c16d20089f39", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibResolver.cs": "3302296c58b993cc345eb5dcaf4154d9bc9b1247e2aa5da8f0cca9ca074a36f4", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs": "26365eeb22893f16fd20e73bb3c9046fe55b4707360c3f2859d97e28ff20aa2d", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTreeNode.cs": "5f172090c3f0454b2d6f85545d582c1e55ed44eb28b96e94b893bf621462da6a", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTypesResolver.cs": "b5820e2bd4396a16573c8ddcf0310c2e5f3505b489abecc161297d0a4759b10e", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ObjectIdentifier.cs": "d1fc1048bb47d156f837fc7a7046a5b6b115d52c3b06118b6a35430f7323f6cd", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Status.cs": "18275342fc0e42915146fbe80dae09e61db3301815091d3b0f56a69dde833cdc", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Symbol.cs": "a22cc72e0518f5b8ac985a25103fccf3973de0c266a654481b47f74c89725ee5", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/SymbolList.cs": "900c1076b5a930244ab96f8794c4f24d6b99898b4bcfd7182f8e0ca7ce8451ba", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ValueMap.cs": "65fb378b6d830ff07891ace8a744eab54aa1dc32450a8d06460ab0e4c6006585", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ValueRange.cs": "5933376fec0fbc309baed04b3e79f2fa7ca11f9f02b53564faacc39ed17c9b3d", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Properties/AssemblyInfo.cs": "fb2f6e53df317f25617e2f6c24b30d02e2b70c434aec88989f468b12870ac013", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Properties/Resources.Designer.cs": "fb1e10e6b121eb4b14c98c1ddf28b1071584e7977dcd0970747ee5fd30180b45", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/Properties/Resources.resx": "cbe7a23cf57abea4beca57ac456d81e11a2967d92ecffbceb7e3d7eda012789c", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/SharpSnmpLib.Mib.csproj": "4427bc8ded4f2509d31bd2ff00db32393cd300399efddcf7131c244b72b8d89a", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/license.txt": "ef1f7505cfdff240e72602bc50ef1cdba37c681c84611cdf30e4371320c70942", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/SharpSnmpLib/sharpsnmplib.snk": "0421beb05de86fc121b4e64eb3d0e6f698299bd7e80ea4d5f6fc0c630b61b7f6", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/example/compile_udp_mib.cmd": "5533bbcdce1d5ade93f05145cb2e6bd6b915fd36e06586c55da3e159a2f31fd2", + "libraries/3rdparty/lwip/contrib/apps/LwipMibCompiler/example/compile_udp_mib.sh": "7496cdd8391196eaee063595dfb9a0d258c954825a748014556f93b53790458c", + "libraries/3rdparty/lwip/contrib/apps/chargen/README": "09b2017bcb4b99b712e3d803e76745afcadf1b3255361999129d0118c0a7cd2e", + "libraries/3rdparty/lwip/contrib/apps/chargen/chargen.c": "07444ca66879f803a304276f2e3cbd8d5863f7a705c91a741f9a84030f514238", + "libraries/3rdparty/lwip/contrib/apps/chargen/chargen.h": "265a136e0d8ba43970e3010640e31d62ea2a8df48711b3382d961fc134dda1df", + "libraries/3rdparty/lwip/contrib/apps/httpserver/README": "b2f76ca884fe0b4f59a2fb5f6c4debe03cc1fd0d5139a7bc9121b104dd83d3f5", + "libraries/3rdparty/lwip/contrib/apps/httpserver/httpserver-netconn.c": "4c83cb2c47044d9505b3295b2b0f2c5f5211e62f92327c6924d5e2c178bf1b60", + "libraries/3rdparty/lwip/contrib/apps/httpserver/httpserver-netconn.h": "b4d31cb3f85b7d671e1830b05e8e25858dc96300e94a92f04f4535bb7ac0ffdc", + "libraries/3rdparty/lwip/contrib/apps/netio/netio.c": "60e802a9ad9bdf747d1965e3a2e3cd465b0093d979b9c5a8f0ef50d4cedd06a9", + "libraries/3rdparty/lwip/contrib/apps/netio/netio.h": "74ae01b5361c9d2a448c32a5630d5dd24237aee743c5b0c9417befb29f0c8baf", + "libraries/3rdparty/lwip/contrib/apps/ping/ping.c": "f61accaf3c98435d9a00b2ffbaff14cb7d87229800a160316399b8addbf0fa39", + "libraries/3rdparty/lwip/contrib/apps/ping/ping.h": "b8738e6e4bc51b3f4dbdc6fd1671ac8af6f08243ac4f583518f86d7f63942cf4", + "libraries/3rdparty/lwip/contrib/apps/rtp/rtp.c": "2a902722a62af0e6b9dd6477ec24bec33b0cb26b0a3d9dace3698df93e5f197d", + "libraries/3rdparty/lwip/contrib/apps/rtp/rtp.h": "2e885934e7e92fda70db21ef7ab9995ad66d9d7a363aa8ebafb94b9c087550fc", + "libraries/3rdparty/lwip/contrib/apps/rtp/rtpdata.h": "ebb17e7bd13ec5d1a56e0ae1e17b481533028b6370446e72e9695ef3f0cd987f", + "libraries/3rdparty/lwip/contrib/apps/shell/shell.c": "a2246c5a6daeaca2fae2a325841c4bbab5ddde88d86b7d81f14bc110bbc7fc99", + "libraries/3rdparty/lwip/contrib/apps/shell/shell.h": "79f1ab8a52f397b0e20f7971848be468880d6a1c746ba9172b955d918cefb990", + "libraries/3rdparty/lwip/contrib/apps/socket_examples/socket_examples.c": "da28597bbdb0d157bbfc54025294cef76e3d5118a28e0e2ce3c87e6977cc2131", + "libraries/3rdparty/lwip/contrib/apps/socket_examples/socket_examples.h": "8b14fa347e738b6460ab249a439962072007c3d12008f0678aeacc5e65ddbe1e", + "libraries/3rdparty/lwip/contrib/apps/tcpecho/tcpecho.c": "99c3940d34eec794507448f52cafdb9704e952c8e4f5cfd172cacc60a0cf5591", + "libraries/3rdparty/lwip/contrib/apps/tcpecho/tcpecho.h": "443f85d08d310618d91b3d8b6e8205d74bf937ff08179457be6c8185a7bd0fe2", + "libraries/3rdparty/lwip/contrib/apps/tcpecho_raw/tcpecho_raw.c": "25364252e960ac1a32fb87da3b1005bdf5180991dd55a6dac783c4a99c07da09", + "libraries/3rdparty/lwip/contrib/apps/tcpecho_raw/tcpecho_raw.h": "544e404db6e6f2648e214c0ebe7c3a53c8361d1056d3b8270f9b858b5a2da7aa", + "libraries/3rdparty/lwip/contrib/apps/udpecho/udpecho.c": "af56f1b2b0627348fa1fe7b4a3ff0e2f3af9b363d04ae84ae689889764aa7072", + "libraries/3rdparty/lwip/contrib/apps/udpecho/udpecho.h": "541163b86e464dcbd1407fb9534b3ab65e94ad142d68b7cb20ad5bc0bf185c26", + "libraries/3rdparty/lwip/contrib/apps/udpecho_raw/udpecho_raw.c": "892368020c5e2cb57f27d995b0c9f661a7bf9ae91f9dfd9756bcf31f67e4c395", + "libraries/3rdparty/lwip/contrib/apps/udpecho_raw/udpecho_raw.h": "01bdd71bec8cf505abcf47ed0904893d29c301914aa6a16587e81bb34f562a93", + "libraries/3rdparty/lwip/contrib/examples/ethernetif/ethernetif.c": "2c5c2f73a3b18593d62d6657d697cf89b8fb99290b58c5dd345f8e6b6e01da06", + "libraries/3rdparty/lwip/contrib/examples/example_app/default_netif.h": "665f2be9a25016ba51d66f3358cf00f5e7237e66958e053947ea3566dfae5df0", + "libraries/3rdparty/lwip/contrib/examples/example_app/lwipcfg.h.example": "c348378390aab1d69f62711907c939a712cbb7b8221bd678f24b5511a3a73080", + "libraries/3rdparty/lwip/contrib/examples/example_app/lwipcfg.h.travis": "32d3301fbf2edf774262247a3d35cb6f524b2439a99cfb9d2f6b73240989890f", + "libraries/3rdparty/lwip/contrib/examples/example_app/lwipopts.h": "069714ec7c67b92600b430ef4256556396ed7cd7f9afd77959615b57ab27cd5e", + "libraries/3rdparty/lwip/contrib/examples/example_app/lwippools.h": "e4c0a1c8a6ae920a4f228397ccb6f57e59273a712f36881f73575a4176465e63", + "libraries/3rdparty/lwip/contrib/examples/example_app/ppp_settings.h": "aa1d53e47fd9010de46b31ea844f1797a762703ff72bc209b7ff378bc86275b7", + "libraries/3rdparty/lwip/contrib/examples/example_app/test.c": "ed602b6a250d834336a4016065a00766918ae4e7c43f72c7435f39466969ca0b", + "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_default.h": "f9b773c5befe36171b2206d4768abdebb443051bb67216a56bd85064ce279131", + "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_dualstack.h": "ab97d0142ee95361976f70a0736cf4bbcff5f29b67b38f8f5c192aa2f9814f68", + "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_ipv4only.h": "6536e85472a2fe6add8203c782bcb699c9b13640d407c3e61caa3e3aafe76979", + "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_ipv6only.h": "fc73ac500fce4b0f824f0826b9644dec856d629ed33b67272464d10f8b5918a6", + "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_no_tcp_dualstack.h": "c7ccfbb7c1bf3c7c2936cc07f3d0907dede5854c4b360cf35518df2de1638f44", + "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_no_tcp_ipv4only.h": "b90fe348deda454521f8483b983e90e1a1b56fd99c280b23136cb2f0c6b01065", + "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_no_tcp_ipv6only.h": "7694d824d5e09b3f0540437c329ea66fbdd2b0d2242097b420563f0a0f79bb77", + "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_no_udp_dualstack.h": "e7e5605fdf155743f3a3b028dea20d75172dd5ff8804cc8f5532cdc7d6a4e108", + "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_no_udp_ipv4only.h": "f42856c44980f6bc22fab73a93dcab9b1296d394eba9050d1892e6df4ff0b332", + "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_no_udp_ipv6only.h": "dfb09369b0301ebf8e9ef70835c993c2035dfddbc652f97df71d723ec94a2e9d", + "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_none.h": "f7458f019ade1e717f25bafc95dba6dd01650f5fc1d9c1ca78d9187247c67cd7", + "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_nosys_dual.h": "e6ea4019b9a6befd66881c6b1c0e1ef866718735144bf500f133c4be13b60495", + "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_nosys_ipv4.h": "a7f185d5efd1bdbc086b2566c0707ec8878e690a151f81aeeafd2f12fea65c7f", + "libraries/3rdparty/lwip/contrib/examples/example_app/test_configs/opt_nosys_ipv6.h": "760417b8349d2cf80b008ae946be9997eeb8b87b265e149772409c7e2b6080a9", + "libraries/3rdparty/lwip/contrib/examples/httpd/cgi_example/cgi_example.c": "7e96c5dfcb11e3fccd5f09a4b2a082ffdf0c28e1acbae0ed05aa375d4d89c935", + "libraries/3rdparty/lwip/contrib/examples/httpd/cgi_example/cgi_example.h": "4de91340505d6a16af89efb369a19dd78a1c70b6e68281b2282034dce3996820", + "libraries/3rdparty/lwip/contrib/examples/httpd/examples_fs/404.html": "093f7768e78b045d8bee613880ada36c5af27e738ce906e5ab35bde33ad2c55b", + "libraries/3rdparty/lwip/contrib/examples/httpd/examples_fs/img/sics.gif": "3b4eb378fdefac1e7dd6dbb6c84db20e1512463457626f5d991bf7c1ccb7cf63", + "libraries/3rdparty/lwip/contrib/examples/httpd/examples_fs/index.html": "d34254865305f1f175294b4b1591f1f4a54145c28937f4e3fcb7f771d0a5e9a7", + "libraries/3rdparty/lwip/contrib/examples/httpd/examples_fs/login.html": "ceb987842f3e0b0390951f2b163ab6158f9b56851a29a85e1fe41198bc2d11a5", + "libraries/3rdparty/lwip/contrib/examples/httpd/examples_fs/loginfail.html": "f327434741033801152fbc8957e5205346ff40fc5423aad1a9eedee764488338", + "libraries/3rdparty/lwip/contrib/examples/httpd/examples_fs/session.html": "d2a447b85ccfd0665801c84e50481284e99222aa2e375cd32a119e36eead8678", + "libraries/3rdparty/lwip/contrib/examples/httpd/examples_fs/ssi.shtml": "66af689acda23a61b558e3b0a474637dc93642abd09ff7f8259cae1d82d2c714", + "libraries/3rdparty/lwip/contrib/examples/httpd/examples_fsdata.c": "d232e6c54e0d953562b7a3f10e1be77c29f464480d53f392c19089e29c6cd949", + "libraries/3rdparty/lwip/contrib/examples/httpd/fs_example/fs_example.c": "83c272e37c215b5066f50acfde4b3ef82f7bceeddbe9af42af8ec15f450fa7b8", + "libraries/3rdparty/lwip/contrib/examples/httpd/fs_example/fs_example.h": "d6a5c86ee4a7cfab6b2c264fe46513c3b4198c569257313b7015107051bccbb0", + "libraries/3rdparty/lwip/contrib/examples/httpd/genfiles_example/genfiles_example.c": "6f64d995dab998ff93bc99eea4732f0f7a6cbd0bb298a6e287e710afb756d1c2", + "libraries/3rdparty/lwip/contrib/examples/httpd/genfiles_example/genfiles_example.h": "95f91a4c206c61a087602b6b6467c7843bc16ecaa1519e7a89a7af4a0680d85b", + "libraries/3rdparty/lwip/contrib/examples/httpd/https_example/https_example.c": "e5162ea135194df8c7f568150d1c4e27fe2c1bfc7b8d313267c7c3ab7e3e3b1e", + "libraries/3rdparty/lwip/contrib/examples/httpd/https_example/https_example.h": "c33fa5640d3a57b08d24438f689a9926a3a4f9dad638087ffb2ebdf486e664f9", + "libraries/3rdparty/lwip/contrib/examples/httpd/post_example/post_example.c": "afeca9d71f2d4c38c440e33cabc755d074dc6fae6acb620a15d153b69b860b22", + "libraries/3rdparty/lwip/contrib/examples/httpd/ssi_example/ssi_example.c": "43c3a9b2eee6862cbf664b02be787904fe271b9d8072c463c6f37fce8494aba6", + "libraries/3rdparty/lwip/contrib/examples/httpd/ssi_example/ssi_example.h": "24f5a96c12ebd03cbe57cd51361b03b16fde215ddd71fc6e84b9f9d715db6d0e", + "libraries/3rdparty/lwip/contrib/examples/lwiperf/lwiperf_example.c": "0c0573f71a0054d39259dc183c70e9cf13334da0c96e42d747c414813da4179b", + "libraries/3rdparty/lwip/contrib/examples/lwiperf/lwiperf_example.h": "bae2a72cd8ea69bb9edbec916aac623fdcb9014fa526cf5782892362e9a782e7", + "libraries/3rdparty/lwip/contrib/examples/mdns/mdns_example.c": "3dc0334bcf02df4985acc01295e18d8cf5e06323d563b893ab03dbb3b7f94370", + "libraries/3rdparty/lwip/contrib/examples/mdns/mdns_example.h": "81dbc1fabad8400e8656187d3d95b38f24dbbdf09615cc23cc57d5c7c7f9b209", + "libraries/3rdparty/lwip/contrib/examples/mqtt/mqtt_example.c": "1ba382439e356525964a554d073e98e504542799a539ed0c51d21955fc174c30", + "libraries/3rdparty/lwip/contrib/examples/mqtt/mqtt_example.h": "879c0f1adc062e7aef8ad74f5878db45caf215e37605009b95b09addfa428579", + "libraries/3rdparty/lwip/contrib/examples/ppp/pppos_example.c": "f6fff7881756a568b8dcd14d00ea31da6fdb1053e387c284ea62f990dde26c70", + "libraries/3rdparty/lwip/contrib/examples/ppp/pppos_example.h": "420338e076895dcde27c1a82c9f49859a9fff9f2de6b9bec67205e340a0ed02f", + "libraries/3rdparty/lwip/contrib/examples/snmp/snmp_example.c": "212d5b982d925546218bba71f345dc276206eed4e5e79dc248bfbf86a05a49ca", + "libraries/3rdparty/lwip/contrib/examples/snmp/snmp_example.h": "0d4b04fc829cfbdfd70f814465ab078fa0681d8b2e66930ff6c8aace057057fd", + "libraries/3rdparty/lwip/contrib/examples/snmp/snmp_private_mib/lwip_prvmib.c": "b6fa62af506a8f289fd3f497b2330e10df2c1292d8b6943399d418926eca7184", + "libraries/3rdparty/lwip/contrib/examples/snmp/snmp_private_mib/private_mib.h": "82f435e21bd31c391eb98ba54bf3fe7302765f8a0ce878f3d08ee72888d0ffa1", + "libraries/3rdparty/lwip/contrib/examples/snmp/snmp_v3/snmpv3_dummy.c": "a244ad2d8b4edc25a535532edf149515e0c4432a0297d97a569e4e4ae4d92c1e", + "libraries/3rdparty/lwip/contrib/examples/snmp/snmp_v3/snmpv3_dummy.h": "b9141ab62dba28d06fc60871142a1ba76ea587ff52ac80f6a6d35be22e040217", + "libraries/3rdparty/lwip/contrib/examples/sntp/sntp_example.c": "3e9ed5205335be228a68138724c76ea1edb5352bdc7fb0431676abd45d868522", + "libraries/3rdparty/lwip/contrib/examples/sntp/sntp_example.h": "c2f0cd2b9b4b66eb66768106b1f1044150fa2a1492aa41c28c455084f2a82fcb", + "libraries/3rdparty/lwip/contrib/examples/tftp/tftp_example.c": "d3f03976207e246c2fc805b7af8f5e2ce8747b9f47ef9418898058b33304491e", + "libraries/3rdparty/lwip/contrib/examples/tftp/tftp_example.h": "b31f68d059a53a7706b52d70e20581d0357233a279fd252c8f1addaf5cb01b73", + "libraries/3rdparty/lwip/contrib/ports/CMakeCommon.cmake": "6239bc22cac63209eda9dc963dda2ef6521a31810643557679a30c46a5cbe18f", + "libraries/3rdparty/lwip/contrib/ports/Common.allports.mk": "b5403e85c25cde53176ec5d07a51cca9126a740e86ec8edcc3b280a5d916d52b", + "libraries/3rdparty/lwip/contrib/ports/freertos/include/arch/sys_arch.h": "4ad62d7eb8ac49482dff4423084c16136eaaa6bdc866624f327a9cdaf8253386", + "libraries/3rdparty/lwip/contrib/ports/freertos/sys_arch.c": "3b2d57360324ae1bf4d05ee9f665e8e79ba013dece0bb5ecae1e39ef53092b03", + "libraries/3rdparty/lwip/contrib/ports/unix/Common.mk": "23ceba07dccc4216ab2e24e5551c3174e0a4218927e4dede5e230ad035c76062", + "libraries/3rdparty/lwip/contrib/ports/unix/Filelists.cmake": "e3da6dbc6e546de190efce5b72ff406136760574b9867581815271ca47cbf87b", + "libraries/3rdparty/lwip/contrib/ports/unix/README": "46e93c0e43a42fc501971d55a0c30a9bd3aebb717b981542453ee0304a161e2f", + "libraries/3rdparty/lwip/contrib/ports/unix/check/CMakeLists.txt": "02cd198908ae4acb2f59d69e96e085f5a03cdf828bbeef0f1f00aa36c0e1ea25", + "libraries/3rdparty/lwip/contrib/ports/unix/check/Makefile": "0d499df19f471bed11318952826ba93fb05a9b8ac3b2c8d3d6b2f4122466dca2", + "libraries/3rdparty/lwip/contrib/ports/unix/check/README": "2ea7ec20655072c5ddf35c19d979f9d0f3499ba088aef7f9c2567c7b839293f5", + "libraries/3rdparty/lwip/contrib/ports/unix/check/config.h": "def89e5147dc4085b7e87e02db5e09325a22299c579c693ab160cb7a9382c0f1", + "libraries/3rdparty/lwip/contrib/ports/unix/example_app/CMakeLists.txt": "553a751a9ba61905aa44f30562e3a1afe4b4b86c6f360ea6abf6cdbe439137f9", + "libraries/3rdparty/lwip/contrib/ports/unix/example_app/Makefile": "d41510732b8f316b57e5955f018658e0fe3c672852e21b5a88b99b20ac1efdad", + "libraries/3rdparty/lwip/contrib/ports/unix/example_app/default_netif.c": "c468c28efc19869aa507e7d7d650cecbc6c6bae84ed5b3dd5946fde49e8ba254", + "libraries/3rdparty/lwip/contrib/ports/unix/example_app/iteropts.sh": "7b79dccb7238618d1c4b13c4ecb02a04dc520c5db546bcd65a5a5c1892b884ca", + "libraries/3rdparty/lwip/contrib/ports/unix/lib/CMakeLists.txt": "abdea1102dc51c0177a5df9bfa0a6f44723241290f7605be8699a78221af10f7", + "libraries/3rdparty/lwip/contrib/ports/unix/lib/README": "3a98da8c3a5c024565725a6153a500b5bbc779d6a6aec147c24efe733469d224", + "libraries/3rdparty/lwip/contrib/ports/unix/lib/lwipopts.h": "a00b9de59e0433344838928892b2e121d1633fb7dac660dd0e27dc00f05e9cb5", + "libraries/3rdparty/lwip/contrib/ports/unix/port/include/arch/cc.h": "87ca52825c775a18d1a8f5d6c2d747dd6739ca1784b39e34952d3151379722cb", + "libraries/3rdparty/lwip/contrib/ports/unix/port/include/arch/perf.h": "9c170fada00f4f1c98762aab95a0ce2a28399e7ddc0177515fb35cb41763ac31", + "libraries/3rdparty/lwip/contrib/ports/unix/port/include/arch/sys_arch.h": "e9e06bafa5d614223b2b1a90908abffae3234b715aa904e9cb41d10f099d36df", + "libraries/3rdparty/lwip/contrib/ports/unix/port/include/netif/fifo.h": "6019f26220b706579656977a469f76b252b55ffd80bc7a1f0c9196e75dd81e79", + "libraries/3rdparty/lwip/contrib/ports/unix/port/include/netif/list.h": "6543fd9607041979170f8f5a94ee4033562048d5614dd472eec590c9145c782b", + "libraries/3rdparty/lwip/contrib/ports/unix/port/include/netif/pcapif.h": "60a0a33bc0237a4cb5c153385946c07f3904cfab9c0e5c0eb00400d3f0f24be0", + "libraries/3rdparty/lwip/contrib/ports/unix/port/include/netif/sio.h": "ddea825927d4fdf7c8d3eed5773013d36fef11f395025cce7420366c5831e8ee", + "libraries/3rdparty/lwip/contrib/ports/unix/port/include/netif/tapif.h": "d238b3d91165a00e1b3bf7757d073a4e4dcc4865f8188ae380ae3bd26de87152", + "libraries/3rdparty/lwip/contrib/ports/unix/port/netif/fifo.c": "784d147f4b67617dd04f66ac368cd6173d7d4e4e811980da465eee3af5223747", + "libraries/3rdparty/lwip/contrib/ports/unix/port/netif/list.c": "f13548f5dd67df2f9a26a1e693866c0679ac7489ee4d4c0f690890e31dfc554a", + "libraries/3rdparty/lwip/contrib/ports/unix/port/netif/pcapif.c": "8b1f7ff5d8b50de16284ec4ea5d41519da45d1b6ce47c53aa2541e7d59cfefee", + "libraries/3rdparty/lwip/contrib/ports/unix/port/netif/sio.c": "b712bb07d7675ae0b46d4a41ab2e25e9b08a025e037da4da6dd771a2ec04144f", + "libraries/3rdparty/lwip/contrib/ports/unix/port/netif/tapif.c": "1063ad29acfd2791724906ae027d4ad2c631ab05a7b45d112bac861f231e0fc9", + "libraries/3rdparty/lwip/contrib/ports/unix/port/perf.c": "53aa582030c38f3ce657545165a08c96d79fa0f4a51713347afc455a2e6d7b6b", + "libraries/3rdparty/lwip/contrib/ports/unix/port/sys_arch.c": "69ea0f747767e9882c295b89361c9591548be0e0ccd56e12d008163b78153570", + "libraries/3rdparty/lwip/contrib/ports/unix/setup-tapif": "ebc504a3c9ea4066927984556b7cf877e86991379d30c97f650330f7fa8d736a", + "libraries/3rdparty/lwip/contrib/ports/win32/Common.mk": "125f92a764ea01ab3a7b930146a530d9e5397c3c09584468334213968ba087c5", + "libraries/3rdparty/lwip/contrib/ports/win32/Filelists.cmake": "ec2eef7b170a1131530b6a0a31e43cd90caac4886010f0c744ca5de671479ac1", + "libraries/3rdparty/lwip/contrib/ports/win32/check/check_stdint.h": "6dfd316c7768ca286bc36dbd5c26a870cbdaae81c95ed41955af0ffc777a1d00", + "libraries/3rdparty/lwip/contrib/ports/win32/check/config.h": "6508f04b8d148dba8c30e805bd9204519e9ca540d71342df3531f6f62722c6a5", + "libraries/3rdparty/lwip/contrib/ports/win32/check/stdbool.h": "fc341d8b377004ef43ceb4c032c3028578dd24be7280be0f4b0da16abc213d55", + "libraries/3rdparty/lwip/contrib/ports/win32/check/sys/time.h": "5af2327d51ef0e3fcf6b1baedf94650ebd02f532d3535a63dc71cc23b23976af", + "libraries/3rdparty/lwip/contrib/ports/win32/check/time.c": "deabd310fc35ff3e2522b9576d7831d4b5289ab8a35b01a36bf8a2462fa64c6d", + "libraries/3rdparty/lwip/contrib/ports/win32/check/unistd.h": "44c5982f2057234bb630714bf4b72b77baed93a8d34ae4b490055d9ee4bf593c", + "libraries/3rdparty/lwip/contrib/ports/win32/example_app/CMakeLists.txt": "c9f74e74a6e2830a68215138c0aa42b8f3d84117210ed0545b253bef5a1bc15e", + "libraries/3rdparty/lwip/contrib/ports/win32/example_app/Makefile": "ff08d73a3ec755ee05d58d01e2bf3384e595e0543649f6160ced2feea62e552f", + "libraries/3rdparty/lwip/contrib/ports/win32/example_app/default_netif.c": "30d0de74b2668a58825c3a67249292fc655965041111705f99a77bb8c46a4621", + "libraries/3rdparty/lwip/contrib/ports/win32/include/arch/bpstruct.h": "2bc6a0eedb9cb3cfd0a593deaf06d52fd4359275ac9f136ba6e94a7da19048f1", + "libraries/3rdparty/lwip/contrib/ports/win32/include/arch/cc.h": "b54d6c7ee3d893acb7fe2f8426f15d487d4146415be8e4514aed2b159d3a079d", + "libraries/3rdparty/lwip/contrib/ports/win32/include/arch/epstruct.h": "962c890c81ed4c2467086be787b5daa10023eac09a6d9953f25c28e7e2346f19", + "libraries/3rdparty/lwip/contrib/ports/win32/include/arch/perf.h": "8854a0e22cb2b980f95c92fafd1f0f5293ca4621f841e86fec0112aebedf6c02", + "libraries/3rdparty/lwip/contrib/ports/win32/include/arch/sys_arch.h": "77320f24c243a19ea97c45ecfc2a1bfec9e1d4a23353a8fbdf546d87cd1809fa", + "libraries/3rdparty/lwip/contrib/ports/win32/msvc/build_coverity.cmd": "b6a430ac998b4abebc9bb4b0303cb50c285050c9d4f582c8a9f4bc87da373c53", + "libraries/3rdparty/lwip/contrib/ports/win32/msvc/libcheck.vcxproj": "5456fd66266a384bbc9f720f37db626aa3ee69fdf7fd1d593877e44fc7abb3ff", + "libraries/3rdparty/lwip/contrib/ports/win32/msvc/libcheck.vcxproj.filters": "3419e9d81bf7020fd0bb2d5ef83afcfa62fa6841a9dfa88cf747744bba0c93aa", + "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwIP.vcxproj": "8e804d504676855f987aa14dae40ce3bbe7d40f0147a70e6d23ea1e3c85483cb", + "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwIP.vcxproj.filters": "44c772b1f2f6e3a972f18c3ae8b201c21b86c1c96f4f2521eb1943d050b61556", + "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwIP_Test.sln": "bdbe2d92dcb53276477d49bbcc97bc37cb6bf4ba8cc04c9fe726f89991d66643", + "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwIP_Test.vcxproj": "c15807dac7ae4523a5bbdd89e018e56a5557c97dc8850fd251080df4a42c7e4e", + "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwIP_Test.vcxproj.filters": "436cd664d2cff5d2bfe183014612080c5db31baf391f48abaedbc2c1a2a3778b", + "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwIP_pcapif.vcxproj": "71dd4e10a28aedc4a94374dfcc111479eb592a3689a35b660c694a63016b268d", + "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwIP_pcapif.vcxproj.filters": "da07818456b7c0200576013510cc1b1572946446eea7e8b4b36c6fa95d7c04ed", + "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwIP_unittests.sln": "eae7eb889df8e3c82fdacc84de7e25854f23bbe4659f255381399423415aae71", + "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwip_unittests.vcxproj": "404a46e5f20505743126a197616c21601a6dbc9b75c028cf6b26fb94a7a59226", + "libraries/3rdparty/lwip/contrib/ports/win32/msvc/lwip_unittests.vcxproj.filters": "68aafaf14d827a55daebf4d1dfe5524ae0cacfa1a74196ba41b9c29421ba4ba2", + "libraries/3rdparty/lwip/contrib/ports/win32/msvc/makefsdata.vcxproj": "a48080a571420e1a5d80287ee48e36a4a76d72e2b7edc221c5edc75331822d56", + "libraries/3rdparty/lwip/contrib/ports/win32/msvc/makefsdata.vcxproj.filters": "607321cc4880ab4f3abf764cc0c5ff68ab4aa70ac493ddf9182ba7658b064db9", + "libraries/3rdparty/lwip/contrib/ports/win32/pcapif.c": "29e053329bff40164faec9b7f7a8c241ea3f2d98e29c2591550a315b6581ef08", + "libraries/3rdparty/lwip/contrib/ports/win32/pcapif.h": "a19fe4f3aa7928d00c2c2800a8fd4ed85a3cb33db8dcf01d3243683c43817d10", + "libraries/3rdparty/lwip/contrib/ports/win32/pcapif_helper.c": "68e2456c98f67ae98a4001c20c2f8ed2dd55427d48087bf13ef88c00fcf07ac7", + "libraries/3rdparty/lwip/contrib/ports/win32/pcapif_helper.h": "2c5693fba9a2db77704cfa4a062675e2bddb6844f8187c28c4a93dc95d362752", + "libraries/3rdparty/lwip/contrib/ports/win32/readme.txt": "829c6e4c86389fb33116d765531ef74b7514569c4c87b613ed5bde5940d9352a", + "libraries/3rdparty/lwip/contrib/ports/win32/sio.c": "305985ed399195d0e7e3a8813bbedb112f9f6cf523f484610fb7b6ad093cb6bb", + "libraries/3rdparty/lwip/contrib/ports/win32/sys_arch.c": "1ffc55af07e4293c35a206d9af3c0269e005f733c9a0d6fc1c45da08767c9ebd", + "libraries/3rdparty/lwip/doc/FILES": "7e411f98dd0b535f78f1cc4ca81bbd596ce704a233c24933c247d11eb4a07662", + "libraries/3rdparty/lwip/doc/NO_SYS_SampleCode.c": "0dc59b5572d2d9576f74ffe0f62791e055839e948ea174ec75ae617742c5b6e6", + "libraries/3rdparty/lwip/doc/ZeroCopyRx.c": "cbabf596cfa079b493582ec1431d9885c68bb2adf5c2cb897730d7ed03ce852a", + "libraries/3rdparty/lwip/doc/contrib.txt": "7a032f6f39a904b822791001f7091fc759bdae67659b39424d46382293450220", + "libraries/3rdparty/lwip/doc/doxygen/generate.bat": "edc28fe50dc150fe0ddba1369f05511a5437a4b873233d75677a9930dbf580be", + "libraries/3rdparty/lwip/doc/doxygen/generate.sh": "d5134949019de866042b12d7855892036790036b5f12a3d53ea477babc3e8a7b", + "libraries/3rdparty/lwip/doc/doxygen/lwip.Doxyfile": "448e81969aeb8c95163560a9ada25965df9e508afd3ac15f1220bd1ee48e0f95", + "libraries/3rdparty/lwip/doc/doxygen/lwip.Doxyfile.cmake.in": "c08e8f9b8c60bd528a5ed3162708e4e3cf052c7497417602ba2fb36426e587ef", + "libraries/3rdparty/lwip/doc/doxygen/main_page.h": "5520224df4911884cd57757dc146e4c1289365e1b4c24c4fa6755392188c3371", + "libraries/3rdparty/lwip/doc/doxygen/output/index.html": "65219746dcce33cff1833a9629610bcce0ce9aa100ec5d54fc808d143f54ba2c", + "libraries/3rdparty/lwip/doc/mdns.txt": "230cf15e5613c676dc7035bf1b61d9294a92e2ff31419904dfacab7dc93ac7c3", + "libraries/3rdparty/lwip/doc/mqtt_client.txt": "af683b0d30f5896ae89cf003962e39cd3dac04e8b4802ae39e9cb143d345b357", + "libraries/3rdparty/lwip/doc/ppp.txt": "a7b55cc1c17b4177bc43bd0769ad5a0a795046c4ef5717fd63655229eb9100ea", + "libraries/3rdparty/lwip/doc/savannah.txt": "f895abd236a811a976d182b36e2c18cfb657078df74b50d2f98cfadd35ad192b", + "libraries/3rdparty/lwip/src/FILES": "05faeb3c86d87e76ba9366ea01db86c00977e5d811c57c6dde081ca9ec6fec2e", + "libraries/3rdparty/lwip/src/Filelists.cmake": "b1bedb02aeb601f36ed5b3dbc20606d9697db4427167cce788936b4233871512", + "libraries/3rdparty/lwip/src/Filelists.mk": "a750091212a64e856461256dc27fd749f7851780bf70ca3b67751afe36f2699e", + "libraries/3rdparty/lwip/src/api/api_lib.c": "c39b73d197e840ab1648710530595ad1fbf234872d89b327b2bc259b74252e69", + "libraries/3rdparty/lwip/src/api/api_msg.c": "cc903062accd85a9f5ff849e9d059e1cdc06d536109ef0ed1fb31e53fdb7908f", + "libraries/3rdparty/lwip/src/api/err.c": "5dd20e93a89f5cf4492e6cc3de49a5b6de6a9b15136963cef2a08a5e411a1f15", + "libraries/3rdparty/lwip/src/api/if_api.c": "eb6c944f66d0daf48306b308c5dff528b167f1284edbfbd87930c48d2deeba7b", + "libraries/3rdparty/lwip/src/api/netbuf.c": "07170f98220de0017468b552e59f16d184d32ebc502dfc819ca2e7e4deb56a1a", + "libraries/3rdparty/lwip/src/api/netdb.c": "6f0211709009d8562fee260ebdb958f12693eb490d3ef8837b0e8dba6d4a1095", + "libraries/3rdparty/lwip/src/api/netifapi.c": "d8426d620c4556c1f8cfc68aba0e91c8e7bbe214a13fb877f364041f9bf8ec34", + "libraries/3rdparty/lwip/src/api/sockets.c": "1b861f167324ad671ba3548cf55caecb01e355eae4eef3e6e58a6f6346d83235", + "libraries/3rdparty/lwip/src/api/tcpip.c": "826705504f016884a70c903b86c988335dfae963556664688ddfc1191d9e416b", + "libraries/3rdparty/lwip/src/apps/altcp_tls/altcp_tls_mbedtls.c": "1ec063ce024bc31ce247906a2d6e89a9c6e6c4c65a0960a0f7094c08615a8335", + "libraries/3rdparty/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_mem.c": "45a0cd3bb15895dfdbfc5723d31e268549a89b1b730666e13f0f9ecdafbde9a8", + "libraries/3rdparty/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_mem.h": "e145466f175096ce419c0e6e267353b3f8af174c0135a1485305ee79c71ac9ab", + "libraries/3rdparty/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_structs.h": "51238ee0fdc56828904a777ace9864f907790c1bfa29be847b146b6b58f55fb8", + "libraries/3rdparty/lwip/src/apps/http/altcp_proxyconnect.c": "e9fe1a344f0faa9814ccd8a17b8cd69cc7be90a74fba6d8643045eb6198acdb6", + "libraries/3rdparty/lwip/src/apps/http/fs.c": "91cee1c0dd66b171e7459ab2d5d3d89483d13f9fb5d5fa77acba80bd68cd8534", + "libraries/3rdparty/lwip/src/apps/http/fs/404.html": "093f7768e78b045d8bee613880ada36c5af27e738ce906e5ab35bde33ad2c55b", + "libraries/3rdparty/lwip/src/apps/http/fs/img/sics.gif": "3b4eb378fdefac1e7dd6dbb6c84db20e1512463457626f5d991bf7c1ccb7cf63", + "libraries/3rdparty/lwip/src/apps/http/fs/index.html": "d34254865305f1f175294b4b1591f1f4a54145c28937f4e3fcb7f771d0a5e9a7", + "libraries/3rdparty/lwip/src/apps/http/fsdata.c": "71eeb2b3435f2d46200bdd64fbea09301ea56f41ee64660740d893a2621ad192", + "libraries/3rdparty/lwip/src/apps/http/fsdata.h": "44df92ed526d0d6b1c374fdd97a96b3f5eb188c7d1084e32fcf420a8a23e3d0f", + "libraries/3rdparty/lwip/src/apps/http/http_client.c": "767525ee96ebfe467e3cf71a1e947d9e2e15f8ec4bbad5c2a353c2f31da418b5", + "libraries/3rdparty/lwip/src/apps/http/httpd.c": "0c83baecd0a5418decdc8577bd719f8bceff3b6a2475bf52af800e54e0dd0583", + "libraries/3rdparty/lwip/src/apps/http/httpd_structs.h": "392cc349b27b067284a51bf767e0685ca4ec8787485d10f2740128364660e4a0", + "libraries/3rdparty/lwip/src/apps/http/makefsdata/makefsdata": "660649c3cd0b5fa548baba63db7c8218aa13269825d3cdec0d4ad577d1338b20", + "libraries/3rdparty/lwip/src/apps/http/makefsdata/makefsdata.c": "1c1bb5c514ebff1e8da8d24967fa00ddde1be219298e67e4a77e399c21f25c53", + "libraries/3rdparty/lwip/src/apps/http/makefsdata/readme.txt": "033f3db7c66384b1da4c0f3251b6f7e21342655a9a3996edbc0fe87d37296838", + "libraries/3rdparty/lwip/src/apps/http/makefsdata/tinydir.h": "0d1716fa784db3441d241ddec4f75c2dbfe5d6aaea2f091eec7fe070c18d443c", + "libraries/3rdparty/lwip/src/apps/lwiperf/lwiperf.c": "e13887dfc67f0bf9034531165d635979833785aa6d1e4aaf983fc819df1499c6", + "libraries/3rdparty/lwip/src/apps/mdns/mdns.c": "c48c2cac0c08afe239f1e716db48b9c77287a0228a7fb69cfbf55ec823cccd7b", + "libraries/3rdparty/lwip/src/apps/mdns/mdns_domain.c": "fd8663f64e25bb9367451a39ac6c6d8b216d25f5e6c6087d541ec2d64dc21685", + "libraries/3rdparty/lwip/src/apps/mdns/mdns_out.c": "64069a359a63fa144462c5579f275ef3a6e338de3b52a13008429c2d12a7f28d", + "libraries/3rdparty/lwip/src/apps/mqtt/mqtt.c": "a99dfb19dc99160dfb19e6be8a43d4ffdce01a6279dbf88ffc047becc2c77e52", + "libraries/3rdparty/lwip/src/apps/netbiosns/netbiosns.c": "49c51ffdfc4e410761ecf3fe7eb3e0139f1a655a25c069d1b2d2afbdc7860e2a", + "libraries/3rdparty/lwip/src/apps/smtp/smtp.c": "9d4043f779d2f594423298c8408b02fc187640ff7f0fe5e902f53a61b76d2120", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_asn1.c": "d8bab135914260bc8cb3810be04bb17dd6dc58abfb46a063cd2930f5dfcb9a92", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_asn1.h": "87bc7b07c8c510b17134ab05a22ee675c9c48450169dc99e600be2f331a27f54", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_core.c": "e5677cad8ef17bdc5b38a134756accc1821fe079a1cd8e83283f08b3d4b52080", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_core_priv.h": "e486ddc80307a3399c3547855adc05c9ff9040b0b9be237c0af232db6bd00abb", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_mib2.c": "1695042f8e26a8c2a830c6c7df35ef7b084fb184b84638e56eef46c4faa3386f", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_mib2_icmp.c": "1072cf5d410a39b540ecd09554e98b264488a26f90628f67ccdc9368d3b5a179", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_mib2_interfaces.c": "4998987c9ba42a8808b317dc4a67dd8dd761371d358f3ad4a43fd704b6cbb330", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_mib2_ip.c": "e4121927b1b42e2f8ecd6ff4b72449a9ce2fb6750ffaeb63598b719920ea3406", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_mib2_snmp.c": "bb5d3ced0dbd9b11cef0bc337791cd2cc4c06f7562e1d4b351e0043388a5c816", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_mib2_system.c": "e4454c37018aa43bf95368dd5abbb0a18306be4639d79af0c4e2247697483b36", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_mib2_tcp.c": "31829ddc6f5ad49e1f4c5b4bee0c51911a3fbbfba2553fb601e30ff4a7d0c5f1", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_mib2_udp.c": "490f18bce9e02d6350b978adbc882323d7ab43100c0072656dab15fb18033318", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_msg.c": "23d3488c435784fc9ec9bb196da4e0dfb2ecce4a8c28a0358273571e417d12a6", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_msg.h": "1ddd054f74cea2c6c595b22228461578114d381fe82f86c96c9cf85cf5dc8dee", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_netconn.c": "2c44422bf05bbbd8aa7705d0fd408f7e9afd8e1a67b366af403e34257e9c42e6", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_pbuf_stream.c": "9d2dc736dc4d30db370f4f0e0d02ab78b57c240cecda6b77796017ff56bdcb20", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_pbuf_stream.h": "22630a24db7edbcaf482b7975765e7df0860f141e9bd9c48083e00af0b7eeba7", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_raw.c": "2c5eedb6d972f6313575f837d0e9c33e129fcc43498d180eef6c80c8c4a85c73", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_scalar.c": "065919819cd402d35c925e80f7732c70872d78faf69f77964e6b75c26be7563d", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_snmpv2_framework.c": "9e0e7a9bee3cd1e55da9398f16e47f5e83395e8979221f0d64809f06c1230994", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_snmpv2_usm.c": "b1825260c0a4b860d33a258f4d6eec789876c62a167bdf63b67d0edcc6c0c5c3", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_table.c": "72546d138df585ada6fb1d854b65f7d54d81e98bed5dcdeab79c8c043704e116", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_threadsync.c": "8acbd0cab2bc51e0c8afe971ad1f670a6766217f9bd3b72a712adbcd7848809a", + "libraries/3rdparty/lwip/src/apps/snmp/snmp_traps.c": "de7a680466a50fe625bae6bc37f051c3b2a01c0a21b3bb907966838c34e778a0", + "libraries/3rdparty/lwip/src/apps/snmp/snmpv3.c": "9dec4ef75e29632234089a5593cbd27f9dea972f0829f07bd15c84a14f947ba7", + "libraries/3rdparty/lwip/src/apps/snmp/snmpv3_mbedtls.c": "7dace5c3961dbdbf6b2085c4403e83aa6666d0ba1a8d0c70709873af5c6609f3", + "libraries/3rdparty/lwip/src/apps/snmp/snmpv3_priv.h": "f7027abe4f437bbd639ec6703cc9549ce6f0881cee0e44c461de686feef02d2b", + "libraries/3rdparty/lwip/src/apps/sntp/sntp.c": "5130700b19c4ef61a578c5c19ceb3b18e81f7b1349d0511577552789dd8116ed", + "libraries/3rdparty/lwip/src/apps/tftp/tftp.c": "1bc301146ca1b3824b0d2e56ea75753df2201777d653e6b2ce3d6e93461e9765", + "libraries/3rdparty/lwip/src/core/altcp.c": "3c6653588772a62efdd11ceeffa760847f95d8ec98889c7551e9a1eb8326f8cd", + "libraries/3rdparty/lwip/src/core/altcp_alloc.c": "90db26c801a4a6466e188e8b5a6b8d2aac2e6f39b4ceeb0f825e7b35ae1786c7", + "libraries/3rdparty/lwip/src/core/altcp_tcp.c": "786830cd6edb63dc0c18a34db6e539058ca499f74fa9020d0808df7f07d232cc", + "libraries/3rdparty/lwip/src/core/def.c": "43723472fe2eacb50102403d7410f3c99c1dba7a37406a761c6a384e3a231ebc", + "libraries/3rdparty/lwip/src/core/dns.c": "94db6c8cd89d6f99189eb19817bf69959a5b2dee25bd0cb5d7bb5250901ed799", + "libraries/3rdparty/lwip/src/core/inet_chksum.c": "9f73e859881dd5f24ed5fbb5099bb041aa7d93dacbc7b28e3ae23c0cad5dcc92", + "libraries/3rdparty/lwip/src/core/init.c": "4b9d5a1d04e5937b49d98e23908821e09ca6308f6e8e4cde384adc22e72a4ec1", + "libraries/3rdparty/lwip/src/core/ip.c": "82d0fc6b45c6d1af88bdece3229fc9821274263c261369de4f81b8d6c80751e7", + "libraries/3rdparty/lwip/src/core/ipv4/acd.c": "c793e2cf2ea9a1c4a6bcc0e2b4ec05766c7fe0c153d1bd19b25d6a56b711ac40", + "libraries/3rdparty/lwip/src/core/ipv4/autoip.c": "225b55a6533ec9cf741be0bfcfa947da7ef7dd20b9fd6597bdcb40d7d0ae668f", + "libraries/3rdparty/lwip/src/core/ipv4/dhcp.c": "6841841a9d11133387f9d879aabbdc2c710b5a22e5604526d4ced605845e4d10", + "libraries/3rdparty/lwip/src/core/ipv4/etharp.c": "b391a21bd5d7b69a185c20ad220d52fcd3b4ca7b5452f69089a9258780ce86ac", + "libraries/3rdparty/lwip/src/core/ipv4/icmp.c": "3072098d2bdcc364a1ff79493c5bb6c26470226d3dea98c6a8bb15269a3df0ec", + "libraries/3rdparty/lwip/src/core/ipv4/igmp.c": "7e541cb6884e4cd1605e7edc8652596b7edbafb5430487720fe4eae2ee3bc1a4", + "libraries/3rdparty/lwip/src/core/ipv4/ip4.c": "b22c7f868b3c19c3e187260cf47cfe06d254191f3c2c051f0e934151e5d86e70", + "libraries/3rdparty/lwip/src/core/ipv4/ip4_addr.c": "44d5dabfeda2558860fe831107040148f111b20bf372dfedaa370086e0aa588f", + "libraries/3rdparty/lwip/src/core/ipv4/ip4_frag.c": "dd03b42a7d02f00a1c9fafa8c83548a8b2aab19dfaa136451120ad10d964b68b", + "libraries/3rdparty/lwip/src/core/ipv6/dhcp6.c": "1bd204acd3d3ea0c01ffc0476c6aa4cf3fda7b862561ab4c31ec4b185fc3d0ba", + "libraries/3rdparty/lwip/src/core/ipv6/ethip6.c": "548b460688f824015b5b30401cf907828f1dc088a8442d8ee43e4049c1e1401d", + "libraries/3rdparty/lwip/src/core/ipv6/icmp6.c": "59fac03d674da3806b091bc2b285d8276378e3f9ff6ab2cc0c2cbe3241d5e350", + "libraries/3rdparty/lwip/src/core/ipv6/inet6.c": "3f7676e46413586fc3d07438b51c0dcd46bb3ba24644892362cf47f84fc15390", + "libraries/3rdparty/lwip/src/core/ipv6/ip6.c": "2496b4b1f5a5bdcf158141c10a216ec11c3ef0bdc7b01c82eb59cc7c08d6be84", + "libraries/3rdparty/lwip/src/core/ipv6/ip6_addr.c": "fb4be0a5b3b048bc4b9ad1b4a18ff18f56c80c0337bd4a88fcca5f029872f46c", + "libraries/3rdparty/lwip/src/core/ipv6/ip6_frag.c": "762b56b9e8f5cfa47129b74189ee9dcca53f4fa6a8e3c801896fa017185a7653", + "libraries/3rdparty/lwip/src/core/ipv6/mld6.c": "14a863d902369370ba5c66777e6241f6f8a5be5c54892dd8904fdc6daa4491cc", + "libraries/3rdparty/lwip/src/core/ipv6/nd6.c": "ee4f3c86ccd433d502bd405b6dd8d82cb8cd3e38ec49361e980ab95b3371af2d", + "libraries/3rdparty/lwip/src/core/mem.c": "b15257ccf032eca75ab4bc885cd26181120efcc9503912e5505c025f40af20b4", + "libraries/3rdparty/lwip/src/core/memp.c": "91ca3a00487d61849324ae571ac9ede550a879365c557aba38667ace122b6c00", + "libraries/3rdparty/lwip/src/core/netif.c": "f3cdece0a08a768949dcc756c4556d4ce495fd5ed9e571704834996471191642", + "libraries/3rdparty/lwip/src/core/pbuf.c": "1a73a2dba7a2a39571c1a55918eec3a1437568002f96bd59d3d8c85e5c4d7542", + "libraries/3rdparty/lwip/src/core/raw.c": "59a74c74b9ad47da73b1d1f5d64729f6a74d55194022f914e9fbc0acdad922c5", + "libraries/3rdparty/lwip/src/core/stats.c": "a18b76cde437213ca9f00137bdb61adb00f6f931fe28c40c81f811a5e674caea", + "libraries/3rdparty/lwip/src/core/sys.c": "86e336dedec36e042aadaebe93c8be944675210841ccabf180200e82c91b0f8d", + "libraries/3rdparty/lwip/src/core/tcp.c": "1a3629a48a20e647cb795bfe78914d7179d7336bc5148bec69c5d50c2e98cb60", + "libraries/3rdparty/lwip/src/core/tcp_in.c": "66ce1fb10e6d63c2e2db8b1d39149ecc9a20a27fcea53b6d88672d24b8eb86ba", + "libraries/3rdparty/lwip/src/core/tcp_out.c": "f18c88265cbefe20123ecaa30afcb423559805793e8f4a911e50adbd06d6e411", + "libraries/3rdparty/lwip/src/core/timeouts.c": "930bcfaf5b12b97f975fca7b8c2f7ab999cffa37f7c840ea91b340aa4ef62115", + "libraries/3rdparty/lwip/src/core/udp.c": "8e9a31ae52ca28eadb76c131a84d9a84443badcf38eb1dec52473ff5cc578f49", + "libraries/3rdparty/lwip/src/include/compat/posix/arpa/inet.h": "8b3edc25121de40cd1c3338d5d68be93091f0713ee8a23eba9789f14d41e0f6d", + "libraries/3rdparty/lwip/src/include/compat/posix/net/if.h": "b1cc52bb828e7cc23f070269a60a6ea33f3fd828190b0248f4cd589f06fcab6e", + "libraries/3rdparty/lwip/src/include/compat/posix/netdb.h": "ec3cb99596ef6bf11b39870541bf6607a7cff6011cfef99bf5d53f2abed05948", + "libraries/3rdparty/lwip/src/include/compat/posix/sys/socket.h": "8b3edc25121de40cd1c3338d5d68be93091f0713ee8a23eba9789f14d41e0f6d", + "libraries/3rdparty/lwip/src/include/compat/stdc/errno.h": "9fdac7c52c9fe0cfdf50f96eae29c5f341a9afde5a56166d21500c656a8a0728", + "libraries/3rdparty/lwip/src/include/lwip/acd.h": "234774b46c5e5dd152d2374aa6e570201a71662c0b0a940eae1e96f5321f6355", + "libraries/3rdparty/lwip/src/include/lwip/altcp.h": "03f1df1b3e703b4717a272d272ed32b8f0949ca1dd2f1e3f91fdc9d9ff4fc8f6", + "libraries/3rdparty/lwip/src/include/lwip/altcp_tcp.h": "e6b325b516d9e2af49b3187e01cd324066ef2c6508a2d9c06016fc0570148d43", + "libraries/3rdparty/lwip/src/include/lwip/altcp_tls.h": "be69627d2d3809dbb791e89cd551f13b8d0ebfbdfa9ffc3d74a00bf3b9f81ce2", + "libraries/3rdparty/lwip/src/include/lwip/api.h": "39a93870e9151ab0a4a70c007c931cf3b642b0704eee43aa662aba9cb9d14f4a", + "libraries/3rdparty/lwip/src/include/lwip/apps/FILES": "1baacff539b72c79be4fb5491be4963f0103557286405b3b4b4dd3396bdb0196", + "libraries/3rdparty/lwip/src/include/lwip/apps/altcp_proxyconnect.h": "c4b47d012ce46a6aa25d4038ecfe0844b0f3cdfe40e6234d622de298aa48ab13", + "libraries/3rdparty/lwip/src/include/lwip/apps/altcp_tls_mbedtls_opts.h": "7fb4fef6a302f23316bad885be4d108a9227377c00948df5be82c9a49fefb0b9", + "libraries/3rdparty/lwip/src/include/lwip/apps/fs.h": "e99ffa827fe8179b4c14c43e352aa88eb635eacf4c8ae40d227211bffd72f927", + "libraries/3rdparty/lwip/src/include/lwip/apps/http_client.h": "54c304f5f3264f555af454f0e14a7ea8610d7cdf4d1424bb79dd7f5159838bbe", + "libraries/3rdparty/lwip/src/include/lwip/apps/httpd.h": "4a5c1213fe0fd2082a8aed3084f4d282b8c51c3c464d140306cdce0f21c30b9e", + "libraries/3rdparty/lwip/src/include/lwip/apps/httpd_opts.h": "597f594dfe74f60b54f94956e18881ba80001c2717e7a96a73bac41344bbc7fa", + "libraries/3rdparty/lwip/src/include/lwip/apps/lwiperf.h": "ac35572131e102c96feffba4bf2788b841f0d162cde1af3d9b7914e11540b9b9", + "libraries/3rdparty/lwip/src/include/lwip/apps/mdns.h": "f0727b65bc6d136e5bee1c5ac52aeaeebdbe2f79a555d73ec19fe541eca93583", + "libraries/3rdparty/lwip/src/include/lwip/apps/mdns_domain.h": "6fd124cb463e07bf6ee81aa816db0cc86204c739f57e98be2f31691fea9bc456", + "libraries/3rdparty/lwip/src/include/lwip/apps/mdns_opts.h": "fc2060b24e899671a57343e83e2f116a179e64bfe3b83555c01929d7f4eeef37", + "libraries/3rdparty/lwip/src/include/lwip/apps/mdns_out.h": "2bff804ddd536e3b1daa97d6322a5279aac56288851de1f277c9c131f16dc365", + "libraries/3rdparty/lwip/src/include/lwip/apps/mdns_priv.h": "6c7fc358681e2ab448e045651157acf898bcfca72ab28646c375881d2c2971e4", + "libraries/3rdparty/lwip/src/include/lwip/apps/mqtt.h": "2fa1c2440833a82f07a5a362616833372f09a9006c7b099e813a48f12631599c", + "libraries/3rdparty/lwip/src/include/lwip/apps/mqtt_opts.h": "b8bb920a04472488f3fa1371cbb9c934bfead7cc8ba7f06316da4bdb2e354feb", + "libraries/3rdparty/lwip/src/include/lwip/apps/mqtt_priv.h": "e4903b34c12c941650045977e2629d41b1ca8407e48dc28d9ba36382825bb2d9", + "libraries/3rdparty/lwip/src/include/lwip/apps/netbiosns.h": "438a8e5cb80794959e0ebb0989a8d0615dc8d2d737fa97c231b10d4040e8f715", + "libraries/3rdparty/lwip/src/include/lwip/apps/netbiosns_opts.h": "c4dcff3906dc65cbe88d4fd6488f24a4eb1659d11fc7ec8cf7eef7eb3599b82c", + "libraries/3rdparty/lwip/src/include/lwip/apps/smtp.h": "61d670c0c914cc4d39f6c9e4661a1ac5e2b3cdfc45bb972b35cbf7ad3ea3d569", + "libraries/3rdparty/lwip/src/include/lwip/apps/smtp_opts.h": "6f3e0517c42b198078615074a72d8d158304264c8fa56a1dea79636bdd1898be", + "libraries/3rdparty/lwip/src/include/lwip/apps/snmp.h": "ae5a3b816e4920b0cbb4f79bd7b82a1dbc21378c834f15709db32282dccf898f", + "libraries/3rdparty/lwip/src/include/lwip/apps/snmp_core.h": "226888829e92f37f5e34e04f8472c2bc00f16817f41253288b7746eb1afeeb7a", + "libraries/3rdparty/lwip/src/include/lwip/apps/snmp_mib2.h": "dbc21ede7c6c4ac282b845aaf40961993a94b3ddb80a85e8aea66c9f6c5cae03", + "libraries/3rdparty/lwip/src/include/lwip/apps/snmp_opts.h": "fcd7d37a9418f6b25fc367ad1252c193a62915099b5bbc9f6693f0526d915bd4", + "libraries/3rdparty/lwip/src/include/lwip/apps/snmp_scalar.h": "f88ed96f2010bb383af723c50f8e0b93a9a5d566599ef0f35c11102124805c09", + "libraries/3rdparty/lwip/src/include/lwip/apps/snmp_snmpv2_framework.h": "8397074e6d74aceb6430e077537eff4330f6c712d00647a13f2832093a7f9eeb", + "libraries/3rdparty/lwip/src/include/lwip/apps/snmp_snmpv2_usm.h": "ddd777bac19a3f0c6823854f121e52e1c16a9f788540e1f172920b45a01713bc", + "libraries/3rdparty/lwip/src/include/lwip/apps/snmp_table.h": "1d0ef0508b2a00f55e6a90c27d484e526a2db5cde41c13b2aafcc6f2c8d7e25b", + "libraries/3rdparty/lwip/src/include/lwip/apps/snmp_threadsync.h": "cca3712f8a796bc481ca8be54c61407f5be5661acc10c95234ba4c31ef6a4996", + "libraries/3rdparty/lwip/src/include/lwip/apps/snmpv3.h": "7d1be4c7469ae8108d3657433f965c8884e66475178fee2a474fbbf01aee3fe0", + "libraries/3rdparty/lwip/src/include/lwip/apps/sntp.h": "c7b56e4653387585d4d5073c1917f93114027ccae13ef842880441477b471653", + "libraries/3rdparty/lwip/src/include/lwip/apps/sntp_opts.h": "e19e34bbe7f97d3f626b5975d1182771683cec15957b3415d4d674ef9489ada8", + "libraries/3rdparty/lwip/src/include/lwip/apps/tftp_client.h": "afe8265f9b7c7746c5bf86b5a739e1eae6c064c7af7e116959a7b52c66064ed3", + "libraries/3rdparty/lwip/src/include/lwip/apps/tftp_common.h": "76b2fb20cbe1212c6e691e9216ced22cc959f602ce76e0fed06dd3c474fb6f31", + "libraries/3rdparty/lwip/src/include/lwip/apps/tftp_opts.h": "185e13e074f0ca14271e187fe15fbe8411de355d55ec6cd4fbb5b271776f8479", + "libraries/3rdparty/lwip/src/include/lwip/apps/tftp_server.h": "627e19deb28320005781f9052d090aa6fc7d5785ccb0a4315c50beee4180d0c8", + "libraries/3rdparty/lwip/src/include/lwip/arch.h": "eaeacbe7eedb71d3d72ebd50075a3d8658c98a6e3d896626e77fb77bd489a89f", + "libraries/3rdparty/lwip/src/include/lwip/autoip.h": "754d9d41176e55a09124b09fa19fa3bac9b60332fd2d80e05bc03670d8fd2e0a", + "libraries/3rdparty/lwip/src/include/lwip/debug.h": "23a140dd9efdf8ddb8fa3e97697f09670d8d23ea2f1b58f1b45ca639e0f6f515", + "libraries/3rdparty/lwip/src/include/lwip/def.h": "cc272d004c7273c8919ece52759c3142f9a74d0560f15790b698b927020af383", + "libraries/3rdparty/lwip/src/include/lwip/dhcp.h": "f7e032cfb3cd931b73205069fc4cd42ff9429fe9a4f6c5175e1dcd4e89a07209", + "libraries/3rdparty/lwip/src/include/lwip/dhcp6.h": "dbac3f610e3e76547691af73a667bd5fd6564a7fbfa5ac382ef77604938d4afa", + "libraries/3rdparty/lwip/src/include/lwip/dns.h": "962c462c90afd41ed010b961f539c11b2baba3e8a6bfe584f331a5e4d43c1b05", + "libraries/3rdparty/lwip/src/include/lwip/err.h": "af26b573fc5c6a31877fdcde35e15382ac0c8b01f35af3f5a4429f9cf5dd323d", + "libraries/3rdparty/lwip/src/include/lwip/errno.h": "79dc6e03887ccf301e01a5129d1a732e21fb05308a8e38f04ada44e0928c075a", + "libraries/3rdparty/lwip/src/include/lwip/etharp.h": "bd50bec728d92dbd790a1504e52f42e4e1bdd018380c2b116f0dd8d3ed44e3f9", + "libraries/3rdparty/lwip/src/include/lwip/ethip6.h": "7a7e744ae373a720261be3651adaa0f35ff00ebb1bcf38e5330e371ddfd162b7", + "libraries/3rdparty/lwip/src/include/lwip/icmp.h": "84f63c9fbc6f6d66ef437f834279c25c20bfa78834eb0ee347c70377f7f8d8c8", + "libraries/3rdparty/lwip/src/include/lwip/icmp6.h": "f790cd444ecbe2e605b2f1a1deab3e6e9662ba6e87fd47b401912c5a118ee836", + "libraries/3rdparty/lwip/src/include/lwip/if_api.h": "6f6945cccbf0721180ddc7ff589d9f7b47f825ce62ae8b3cf6c186f5d2750822", + "libraries/3rdparty/lwip/src/include/lwip/igmp.h": "abf5ff1e19ec61690b6e8d55c8ee11afd1556b77c8b0fc452d5eb490810cc27f", + "libraries/3rdparty/lwip/src/include/lwip/inet.h": "2b8eb02e6708f3725d8c09967d316940ce82fc5e05042b9ce42e2d0530fe17c3", + "libraries/3rdparty/lwip/src/include/lwip/inet_chksum.h": "df6720f78e47afde2315d6a9dee1bb5b26f76692ce3e040c574409493435c933", + "libraries/3rdparty/lwip/src/include/lwip/init.h": "0696eeb90c80b8e1e47c03a90de54f25a116c0a93a2c0e6118ad68d427eb365e", + "libraries/3rdparty/lwip/src/include/lwip/init.h.cmake.in": "38df819f1ae753f240e9adb27398c14d6cf3e2e9065547a8ceb7694a9d132216", + "libraries/3rdparty/lwip/src/include/lwip/ip.h": "8b27813c2810b0564585ec06b1e1124f7dca28436c64125df15d496b1bf5627e", + "libraries/3rdparty/lwip/src/include/lwip/ip4.h": "188a62765c765fb07cda26a695f17c9c1674c0da7539c71e4d8f79b3f6f6ba21", + "libraries/3rdparty/lwip/src/include/lwip/ip4_addr.h": "373faa87a644cedd25874acfbaeea0349b34448fc2dafa5d0853d945e46a6fe8", + "libraries/3rdparty/lwip/src/include/lwip/ip4_frag.h": "8b0bb67655cba6da8cddc360e655c711553ad35e6306dbae618637e80be9911c", + "libraries/3rdparty/lwip/src/include/lwip/ip6.h": "7681c2948f700aa565c387ca20654f7322991ca15de7fd4e8f342a8ce44abe57", + "libraries/3rdparty/lwip/src/include/lwip/ip6_addr.h": "1dbc5e8ddd4c379303d4a3416f628063f0814814d365cc20dad5d89e0baa4070", + "libraries/3rdparty/lwip/src/include/lwip/ip6_frag.h": "3ab1bdb9220a3c87c8187fb26b1150cd03c4401b0a0c6db2ea4a22674141dd3b", + "libraries/3rdparty/lwip/src/include/lwip/ip6_zone.h": "951a5aeae08562dfc4a3bcc72de9952ac0045126a1cef9eedf9c6881ecb91a03", + "libraries/3rdparty/lwip/src/include/lwip/ip_addr.h": "9c309963b0679348d102e23665ced46740dda427dc23916d6f0434dd6170ae0b", + "libraries/3rdparty/lwip/src/include/lwip/mem.h": "416f961f338a0cba460494ebfe2527b7cc1fc5c18f489711e66af7dd76b7a223", + "libraries/3rdparty/lwip/src/include/lwip/memp.h": "79dfd019219330cf08deb1360483eb7d1da7a1a7a304034ef65ad52feefba1ef", + "libraries/3rdparty/lwip/src/include/lwip/mld6.h": "026348d23012aa1c2210ae53f2a5ddf3a273cf004ef597a1861266a01d4ca86e", + "libraries/3rdparty/lwip/src/include/lwip/nd6.h": "79fa57b4bded6763d38f5e4fa56aa2fac8117bf76ffc69869e05357af88951d6", + "libraries/3rdparty/lwip/src/include/lwip/netbuf.h": "1aa92014d8919c5073b5123c92881e00b0c507ca485667ccdebbf31afa214ff3", + "libraries/3rdparty/lwip/src/include/lwip/netdb.h": "582518497fefd57cd1d227947965c71b1dc16846add471af0fddfbb461c7aca0", + "libraries/3rdparty/lwip/src/include/lwip/netif.h": "cf6f1092f7c2748ae5aac89952e3a88903d43efecd040c9b479ba633386bf971", + "libraries/3rdparty/lwip/src/include/lwip/netifapi.h": "2c087eac81246ac74e3ba2c3922de0612890587f0cca7c1360f379a57ab45518", + "libraries/3rdparty/lwip/src/include/lwip/opt.h": "e411d94f8f45ea91aafec5e6ecfa198ad579e704de5a9e553e17f9a161584fd1", + "libraries/3rdparty/lwip/src/include/lwip/pbuf.h": "a4c632569405474706546d58f4ff044abab958e3fbc9d479f637066022f37d7a", + "libraries/3rdparty/lwip/src/include/lwip/priv/altcp_priv.h": "8b1c271129eea8f8d125ee8e653e143d5099683c2fddb9bc64524fcfdadcabd1", + "libraries/3rdparty/lwip/src/include/lwip/priv/api_msg.h": "e2458063868f0813bc26f41709bbf78d994760e72667b646b88f15e16e235f48", + "libraries/3rdparty/lwip/src/include/lwip/priv/mem_priv.h": "c90c9b64c8ea95c05d5b8b10d706acb53b6cc124166e8dd85b397698679f7920", + "libraries/3rdparty/lwip/src/include/lwip/priv/memp_priv.h": "37aff2894bbe25f1888e43b96be80f4c1a43a24867c0fc9aceb4093328682937", + "libraries/3rdparty/lwip/src/include/lwip/priv/memp_std.h": "86cdf1d80f2716a07011dc763e5fa614cd2b555382cb7d6750176116def67a0f", + "libraries/3rdparty/lwip/src/include/lwip/priv/nd6_priv.h": "0cd4756c17109d6d01c07ef35cbc527954a1cd926065432a715578590b8dfddb", + "libraries/3rdparty/lwip/src/include/lwip/priv/raw_priv.h": "0b2b019a55fab8eed89d668f13402778835117fe472464046472cd04b93c2bb2", + "libraries/3rdparty/lwip/src/include/lwip/priv/sockets_priv.h": "2efcf39c42b1a7055628461915d42521a4df3cb285b6f5635a5c6a961aff4f93", + "libraries/3rdparty/lwip/src/include/lwip/priv/tcp_priv.h": "547929dbf334d846444094ecb363680bf90320b198ac1e49027fda4049c07233", + "libraries/3rdparty/lwip/src/include/lwip/priv/tcpip_priv.h": "13fb2e7159ebcafc4ddda4961a9d70b2f8182f9e201aa990cb9148d8897bf598", + "libraries/3rdparty/lwip/src/include/lwip/prot/acd.h": "25ef5a9bfe37edbe5fbaed0a985c2ac0b4e928cd90b69941b46c533e7765cf7b", + "libraries/3rdparty/lwip/src/include/lwip/prot/autoip.h": "a0b78c818f6642e68c1d9c0b5c3ad12fc6595b66ac5ae41724c52decc6de760c", + "libraries/3rdparty/lwip/src/include/lwip/prot/dhcp.h": "bc74edb6abff7b5182e04e2e588292401ecba3875bb6673156b026a5c391dbc4", + "libraries/3rdparty/lwip/src/include/lwip/prot/dhcp6.h": "72c645a6153694229ca535f044af2d1520ebc7860baa98121747218a08c2b74b", + "libraries/3rdparty/lwip/src/include/lwip/prot/dns.h": "34049c0f7f489aaec12d0589dc51ecfb24408dba422f605d8deb207c44d02b8f", + "libraries/3rdparty/lwip/src/include/lwip/prot/etharp.h": "55164c0d047f1279982fef9681491c8811f8482976aff7fab9b63a9a589ded76", + "libraries/3rdparty/lwip/src/include/lwip/prot/ethernet.h": "42fbc05a563d3ad242663b7d82601bbae6c6d9c16a6da5b35b51a02799206303", + "libraries/3rdparty/lwip/src/include/lwip/prot/iana.h": "745c2d70a5d4839e3df5a34f7e37b83bcc7fe58f39eba1d2f5e238242d74c878", + "libraries/3rdparty/lwip/src/include/lwip/prot/icmp.h": "931d46a3e775efcd6076263e23eb564b612913b7c11f7b5d009e94fefeb20f28", + "libraries/3rdparty/lwip/src/include/lwip/prot/icmp6.h": "8d3bcb5d37b0ad3f73102ed2ab3c2b52a42492508d012d41d5b2233827232fdd", + "libraries/3rdparty/lwip/src/include/lwip/prot/ieee.h": "ec85a505aba178178743b34429f463a41ac43d3750d63901c7e1273dcd0a2ba6", + "libraries/3rdparty/lwip/src/include/lwip/prot/igmp.h": "9adb3a0b03feff302b057020aa860fd958f6ef4528225014c104bd4175ebdff7", + "libraries/3rdparty/lwip/src/include/lwip/prot/ip.h": "eb5371e5ac58467253d813bc58726e317f91abadb10336497de0d64645ec01cd", + "libraries/3rdparty/lwip/src/include/lwip/prot/ip4.h": "033570c0b7657f5475959f7b74d9e23c6f8e81498495d5b23d8c2eeb0640d7a7", + "libraries/3rdparty/lwip/src/include/lwip/prot/ip6.h": "c0514e97f153f2e5cf514e6f1f4350fd2cbcb7073ebc05495b436c638bd32109", + "libraries/3rdparty/lwip/src/include/lwip/prot/mld6.h": "9601cee67b48c4b7cadb75caf3d83c05f5409d367341af70af7e7e4f46f173f8", + "libraries/3rdparty/lwip/src/include/lwip/prot/nd6.h": "50cff239fdb433defe12f7e35c4f2964e42ad7bfeab15d3b274a59142c4d558e", + "libraries/3rdparty/lwip/src/include/lwip/prot/tcp.h": "db67bb5ea0517a8cd9e30ebf655743f69ce05e77ca6e4a113e8c60e69bd7c48a", + "libraries/3rdparty/lwip/src/include/lwip/prot/udp.h": "b56daa8ff1e8e52cdd4f720297f07af2a96feea254db86768e20e157d7ce2784", + "libraries/3rdparty/lwip/src/include/lwip/raw.h": "e9efc60e31f2ff39a98b1367968ac724fc91ecdc115a74fc44813b761f02caf7", + "libraries/3rdparty/lwip/src/include/lwip/sio.h": "b6555ae90164d0b66e2772ec3444ebba0133927e4f47b512b570819b66912ce3", + "libraries/3rdparty/lwip/src/include/lwip/snmp.h": "1f90da65829c29545e9562ce5355d1799ea36cd901ed8ea9faa8e1ef3d7c2ece", + "libraries/3rdparty/lwip/src/include/lwip/sockets.h": "7962d403d886cc9342ca66f4696bcada1bf2ee4c49e1cf7196f8525710368cf2", + "libraries/3rdparty/lwip/src/include/lwip/stats.h": "295e3f2f9be188c05a90c2bb7e57a250a07e5ca7c54bdd31a50309da82cc5874", + "libraries/3rdparty/lwip/src/include/lwip/sys.h": "8ae6002810cddab1b112cbe886f331f5019c8bd43d98446f644621ef907f9f60", + "libraries/3rdparty/lwip/src/include/lwip/tcp.h": "eb514477b21ed78dd4d527f4aea3bed5585200e285b85c666689b9c43b77a89a", + "libraries/3rdparty/lwip/src/include/lwip/tcpbase.h": "cf4b048f3bc228ab364cde15eb6be5eca961fab09036c699c2c4b1437ab90aff", + "libraries/3rdparty/lwip/src/include/lwip/tcpip.h": "c772dbff8e46a86ffa65ec62e5b304e75525b6bcfef94917fb7de1045449f603", + "libraries/3rdparty/lwip/src/include/lwip/timeouts.h": "a383b43e3ba021d06ff3791d223db46cb3385e8dcdfcec0221ef2a006243c022", + "libraries/3rdparty/lwip/src/include/lwip/udp.h": "f9783bca6b68b10c229185559e0ae7e79bb793e1d6c244c7b26408516187f1f8", + "libraries/3rdparty/lwip/src/include/netif/bridgeif.h": "39d409d880187e2a7b372ddae2b1cfc004b88a0dd786dbe9070945420b8e42c8", + "libraries/3rdparty/lwip/src/include/netif/bridgeif_opts.h": "bc6e5f0677c621a5a8adb315e1cdb06210e1391efea6d308684103fd38edfe66", + "libraries/3rdparty/lwip/src/include/netif/etharp.h": "2e1ab81eced65420cdee5940d2e547cae7b0fa70088f452692363676ecfc66dc", + "libraries/3rdparty/lwip/src/include/netif/ethernet.h": "1dd88263e583593e47f7c891680d67838287160551b8c06562c9feca1ddee443", + "libraries/3rdparty/lwip/src/include/netif/ieee802154.h": "02f21d8b3e143fa77d8fa3f0d3db9ac1683507436ab441a61d5012ddb6037699", + "libraries/3rdparty/lwip/src/include/netif/lowpan6.h": "538ac2429cedf9193b6538998f3ba5bdd003fbf0840fd03b46d4ad5bcfaa4c20", + "libraries/3rdparty/lwip/src/include/netif/lowpan6_ble.h": "5c40e2a9640810cebaa8a0e501913cae093368da21f1226e9476b078f34f247f", + "libraries/3rdparty/lwip/src/include/netif/lowpan6_common.h": "eed0a8f45ea6e62ba4238d6bc139a1bef5fe625ec7527b52856fbf885c12f8ba", + "libraries/3rdparty/lwip/src/include/netif/lowpan6_opts.h": "fc57628292ff0ccece9770a9c101b992f350c55088af2bb364246fbcf6f3f024", + "libraries/3rdparty/lwip/src/include/netif/ppp/ccp.h": "b6e681ffe6855a6772c6d0a9077f144676c30db0c9ec0ea461e816f7647d6d43", + "libraries/3rdparty/lwip/src/include/netif/ppp/chap-md5.h": "f67cd93664262575ded862c17bac7c1003e2eb690224b89ba2b0cdd221c2f725", + "libraries/3rdparty/lwip/src/include/netif/ppp/chap-new.h": "f7bfb4e194fedcd1e6d499320826ecca7f14add5170c8fb7d4832b8e831bc2ac", + "libraries/3rdparty/lwip/src/include/netif/ppp/chap_ms.h": "77316bd6366248a0d0715e19e231667c1564f3ef081dc3ba839cd673a5d4984e", + "libraries/3rdparty/lwip/src/include/netif/ppp/eap.h": "42589e98b4ff8470c0e9a1cecc45fa30e79e2c1c3452fc46e2a88b6ac617dfe8", + "libraries/3rdparty/lwip/src/include/netif/ppp/ecp.h": "4936fccc29a900ced5b67906f97f192ea634642b6a003605dc1cb40d65d011f6", + "libraries/3rdparty/lwip/src/include/netif/ppp/eui64.h": "fc79081c31fd7333b0e2b3cf61c870727a3b066d82482c894b02c81cdbf464c7", + "libraries/3rdparty/lwip/src/include/netif/ppp/fsm.h": "8751104f5cdeb3ace720744016431ee2d704983e8a94de7add0830e63dfdef0e", + "libraries/3rdparty/lwip/src/include/netif/ppp/ipcp.h": "60bb47d15951954c865393be49b64f6daecc966f7146aeee187530a111d9008a", + "libraries/3rdparty/lwip/src/include/netif/ppp/ipv6cp.h": "69de1cc233f9ec05312a6cd4d5b558d91d04e39626ad6f9e0fbc4ee61a5709d0", + "libraries/3rdparty/lwip/src/include/netif/ppp/lcp.h": "0278457347c50aeaa4636124d0265fb8064511f461de2b3ff7fa51e3dacb0345", + "libraries/3rdparty/lwip/src/include/netif/ppp/magic.h": "b19a254f135449982830685df31b948e0d5c7e44ac5875efc8d1a3ef20a3aff7", + "libraries/3rdparty/lwip/src/include/netif/ppp/mppe.h": "8dd28c994f67ca45b11586ecc195fabedd5d51efa0bd99872336d82886477c9f", + "libraries/3rdparty/lwip/src/include/netif/ppp/polarssl/arc4.h": "970bc9075bf7aef36f4a225ba8a3dcb89c16a1948016f3521ca4a7609b7ba284", + "libraries/3rdparty/lwip/src/include/netif/ppp/polarssl/des.h": "f0a3ea812ead16f7d8fba08115429b5bd7deed1d9ffc6dddf66ec44b1d95ef0a", + "libraries/3rdparty/lwip/src/include/netif/ppp/polarssl/md4.h": "d1982ff627c1176d03c60fa8ae307af09626a2655e08525a146019276edb9058", + "libraries/3rdparty/lwip/src/include/netif/ppp/polarssl/md5.h": "1962ff0d88f8a7efbb6c8592eb13154129cfc7012c8cc22be7981df35e3c8ba4", + "libraries/3rdparty/lwip/src/include/netif/ppp/polarssl/sha1.h": "2951ad6ae5b5797112ae1899cd814536c445334bf59cbd91bf5414db0613980d", + "libraries/3rdparty/lwip/src/include/netif/ppp/ppp.h": "58175d5f9fda4d88bdaab4f1da12da692dd9e732ee0c51d94319b3461edd01c2", + "libraries/3rdparty/lwip/src/include/netif/ppp/ppp_impl.h": "9a216f46049edfb333551cb4e7213ad537b0570c3211f0029b32bcd0c39cf62e", + "libraries/3rdparty/lwip/src/include/netif/ppp/ppp_opts.h": "ea99faa10a07d3e414696465ca06ba420c585cb9a683e20e8f3f24f80e03fe5c", + "libraries/3rdparty/lwip/src/include/netif/ppp/pppapi.h": "f1520293792605ad0f0c78c93a5907d478affbebea8d6be1b0f8a8bdc9c4b427", + "libraries/3rdparty/lwip/src/include/netif/ppp/pppcrypt.h": "954943c6c1286c707c0f1182428eb514dc8cf87a704a4e8f26a926553f260d58", + "libraries/3rdparty/lwip/src/include/netif/ppp/pppdebug.h": "fab025981023c13721fac50978c5416ce2c9a0f40db200ef78ce4cd36d3b9b63", + "libraries/3rdparty/lwip/src/include/netif/ppp/pppoe.h": "fb57591c5679950f4af58b17427271aa3554b9f8e49cc59d913f79de0bf07363", + "libraries/3rdparty/lwip/src/include/netif/ppp/pppol2tp.h": "ae9a819aaf816ae4ff25c35bddaf7c10654a54b95451b247fd5d2824229d3cf7", + "libraries/3rdparty/lwip/src/include/netif/ppp/pppos.h": "c225fffa8f85bc170992cef05d8d7350c86d2b3ae3d55951d71e35c9fcc2390d", + "libraries/3rdparty/lwip/src/include/netif/ppp/upap.h": "7cf555545ed20e7d7897ed935c6333e77d629b1862e4e2136df87ebebfcb3907", + "libraries/3rdparty/lwip/src/include/netif/ppp/vj.h": "d6c9da89224974d8486dfa0082ecca0d487715df65a37088db55e7e51c745a14", + "libraries/3rdparty/lwip/src/include/netif/slipif.h": "f58cc6842251be4358904b2475021fc2da592de3756fbb358b615b0173efd791", + "libraries/3rdparty/lwip/src/include/netif/zepif.h": "7b3a4c9094483c14eb3c4da651874aca325e3927fde02eb28e226040deef4714", + "libraries/3rdparty/lwip/src/netif/FILES": "10564ef1c25f4ca37518cc705b3cb27b206cfea82db6a9601ad416aeffe560dd", + "libraries/3rdparty/lwip/src/netif/bridgeif.c": "863a91f68fad44e603ead49d9398b1ffe3137588324c762fcb332c0e47ba85c9", + "libraries/3rdparty/lwip/src/netif/bridgeif_fdb.c": "dcbd424f88425943409f2aa54a93fa09afa19473444d005a6bdbe3aad85503f5", + "libraries/3rdparty/lwip/src/netif/ethernet.c": "e1c1b7ceabe5ab707e6cea7565384fad597c1035ff17883a8a8ff443473f89d3", + "libraries/3rdparty/lwip/src/netif/lowpan6.c": "895c236b64b09f113ee6b5b1513df69005a4405d8fa403df9c31b73080912cca", + "libraries/3rdparty/lwip/src/netif/lowpan6_ble.c": "813e98990f440b14ea66282d1b490447812b66268ecda7097a265a6ec78f5ef5", + "libraries/3rdparty/lwip/src/netif/lowpan6_common.c": "94372df9235c9fe1b08778c3c31234181e27d16e60e7e542d7005181108a7fe6", + "libraries/3rdparty/lwip/src/netif/ppp/PPPD_FOLLOWUP": "d4e0485a2936de3201dca8dc10068534fff399f8eadbd31684f36babc4b094b7", + "libraries/3rdparty/lwip/src/netif/ppp/auth.c": "fe2afed36bdba441463e4e5211395614e9d7685eb1760d5d84137baf58a42dc7", + "libraries/3rdparty/lwip/src/netif/ppp/ccp.c": "88165e63b1a7b6c56f4e952544a2375c6033ac4c2e0ec4779d145322d951ee94", + "libraries/3rdparty/lwip/src/netif/ppp/chap-md5.c": "9f099cddf6fa7931b962fda6dc1d1df5eecf8c94881eda29a63d1abafe317ec2", + "libraries/3rdparty/lwip/src/netif/ppp/chap-new.c": "658070df33b3242b150efce6059a9998c15f5f9192ae06b4cd5e7cffa55384a8", + "libraries/3rdparty/lwip/src/netif/ppp/chap_ms.c": "d3940e2add91c8a721b32f1e04bbc88add012d7146dda03744608f31ba6666ec", + "libraries/3rdparty/lwip/src/netif/ppp/demand.c": "b07dc6e971fffe70cd73f4ff6733655989e34dbee3fc6c2dfa164fadb6578975", + "libraries/3rdparty/lwip/src/netif/ppp/eap.c": "74d26511e05f8b39b4b5fa04722da2bb620e661ec630a5c8d7cc433b5bef702a", + "libraries/3rdparty/lwip/src/netif/ppp/ecp.c": "b6736696754a289ea5464f7386d05790365b873c0ed0123692bebc4ebb18e6eb", + "libraries/3rdparty/lwip/src/netif/ppp/eui64.c": "531be9bfa9c33e0abc4452b976ca4ab60f8f0ecc92d9af91121551250810cd4b", + "libraries/3rdparty/lwip/src/netif/ppp/fsm.c": "fe71b4b142a07c13ef69ff3e344ee3508b44c0471a62c47ec6ec585f250fc940", + "libraries/3rdparty/lwip/src/netif/ppp/ipcp.c": "9ea7ec074416030a39589392d62adc451ab2c78c61c506cec7674436f085fa90", + "libraries/3rdparty/lwip/src/netif/ppp/ipv6cp.c": "707b3687113f9e8fdf4230a1a750be60aa05deb081e0ece81317cd49b718831f", + "libraries/3rdparty/lwip/src/netif/ppp/lcp.c": "dc39acf562d7df70fb1eac8d7f8218dfb9d592498638325e9fcd4d206f97eb06", + "libraries/3rdparty/lwip/src/netif/ppp/magic.c": "aad196f6945d3b80b158b5011d4eb216a3e1766b73abcd9c19728bb8b8e3e3bb", + "libraries/3rdparty/lwip/src/netif/ppp/mppe.c": "f209f08e59f0e9ed5d4b736a7534e6c0df726b2d14cac07dee311017fa2a0a41", + "libraries/3rdparty/lwip/src/netif/ppp/multilink.c": "78920d813d0b638e287e5f15527886cfd53d5ea9a61cb6b325b6f8b3841e4bc5", + "libraries/3rdparty/lwip/src/netif/ppp/polarssl/README": "242dd0f7c45dd7fafc37e2caa4b1e0609e1cd9a61512d7772d58c41f7a7e7c95", + "libraries/3rdparty/lwip/src/netif/ppp/polarssl/arc4.c": "7d844ec4f6e88a788e17419d4525a07611851fe793e0bb52c7e24a1db5d2d6df", + "libraries/3rdparty/lwip/src/netif/ppp/polarssl/des.c": "4b2c48659036ad89adb2d08a2b54dc30fba73759a6a5ce810e9c794f7b4aacf4", + "libraries/3rdparty/lwip/src/netif/ppp/polarssl/md4.c": "9110b56e9b926edf560933b76d1bb1ca7e9532134773ddcb04bbd57db646e209", + "libraries/3rdparty/lwip/src/netif/ppp/polarssl/md5.c": "9bd07f764f9104538474c69838de131538f0a500952b8b24f32b758e23d91b4d", + "libraries/3rdparty/lwip/src/netif/ppp/polarssl/sha1.c": "844114b4c45f689aaef64df2bf8b445e6dcea9c52bb4cb485c18d0fb68e04d5b", + "libraries/3rdparty/lwip/src/netif/ppp/ppp.c": "c585c38d73eb2a2c27905acbc553acfad2d267e95e921f34295d2c344da677f4", + "libraries/3rdparty/lwip/src/netif/ppp/pppapi.c": "269bade48fe467119d59b3c33f8f42423c1b162d9e4cdb4c4da36bd87bcbd246", + "libraries/3rdparty/lwip/src/netif/ppp/pppcrypt.c": "02b12e7626078be9591237fe84ae000514a2cfd6f0653c890b7b75ce20cada8b", + "libraries/3rdparty/lwip/src/netif/ppp/pppoe.c": "7d658e3a24ed904c9ad9d393eb890f31326ae1fe8411ad7a036a0550e635fdbe", + "libraries/3rdparty/lwip/src/netif/ppp/pppol2tp.c": "18e83285eedf633c840db6a55077ce2cc902f19ab143c323c659c85ad25b8695", + "libraries/3rdparty/lwip/src/netif/ppp/pppos.c": "aff653829d77edb3e2ee197f1e4b3ff5e392e2f8e81a09a366576ab77a627e0d", + "libraries/3rdparty/lwip/src/netif/ppp/upap.c": "6944042740a916f6375d57437803e65839efbc901ebbb6cddc42c0a22c1eb33e", + "libraries/3rdparty/lwip/src/netif/ppp/utils.c": "fbc12cf311073c72d872ad5b382133c69144100b720c222e5331031ab30b6cec", + "libraries/3rdparty/lwip/src/netif/ppp/vj.c": "f70c1ac07ddaacf59f6b7ad28b1b657d645c5357ad8c4a7c449157d186fabefa", + "libraries/3rdparty/lwip/src/netif/slipif.c": "6e33b2aa2794b9baf67e8776b2c6e61b5e92725ee679067a71494dcb00071f34", + "libraries/3rdparty/lwip/src/netif/zepif.c": "374cbd2d942ed680a66bf6f36080ba2e7313bcd037a3380d6a7a53dfa3d75099", + "libraries/3rdparty/lwip/test/fuzz/Makefile": "0276ff5837ca4fe0178786ff2b1e1ec1c1ded76116c1800be97102c55780b3e2", + "libraries/3rdparty/lwip/test/fuzz/README": "e0aa244211046d73ed11c7150a8429b020f7ca958f4f45e61bdeb41c27663d2c", + "libraries/3rdparty/lwip/test/fuzz/config.h": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "libraries/3rdparty/lwip/test/fuzz/fuzz.c": "743d5ae304d1fa2f1e93fc858e2f97c8e822c266a236cc104b9dbb567fe1c98b", + "libraries/3rdparty/lwip/test/fuzz/inputs/arp/arp_req.bin": "90136462593149d9a7367a3ff8224baed060c562464aed70fd73a3a2eb56e054", + "libraries/3rdparty/lwip/test/fuzz/inputs/icmp/icmp_ping.bin": "8b136902714d3318066a465c6bbb659fb53290ffde7b4e44ce91cb51f8457cf3", + "libraries/3rdparty/lwip/test/fuzz/inputs/ipv6/neighbor_solicitation.bin": "2c4c8e93785f654e678a9309d7f8f142df493b5d923fc1d9770da99143e7166f", + "libraries/3rdparty/lwip/test/fuzz/inputs/ipv6/router_adv.bin": "efe0fa3a120d28ef1f8242fbf6e32722f072922cdf323268c7563c6f553192f1", + "libraries/3rdparty/lwip/test/fuzz/inputs/tcp/tcp_syn.bin": "f45051b6f9215e7c539982b1f3ada384c5d87da7f98aabc891c4aa069cc8fc73", + "libraries/3rdparty/lwip/test/fuzz/inputs/udp/udp_port_5000.bin": "1f061bca04aed291a4cc2212f925804c59fa1f0a4057931ae1b909b5723e27d7", + "libraries/3rdparty/lwip/test/fuzz/lwipopts.h": "f172aa424517abfffe32d789948126d4af82c588e7528d3f81a118ba32f4e103", + "libraries/3rdparty/lwip/test/fuzz/output_to_pcap.sh": "3ada800dd24ae2cf4cb41f0065aca8a78c29c6ae21271129ad8fe8fcf7f9dd25", + "libraries/3rdparty/lwip/test/sockets/sockets_stresstest.c": "a4f9ef34fa16d6afc0055ea68aeb9224ca2d0702adac56ec3dc0523544e4cb0a", + "libraries/3rdparty/lwip/test/sockets/sockets_stresstest.h": "b0f0b91e41ad2f86fbb0c889d9d0d38d6a3bd258d2dd5e0a3c5ac8a1ab7ac024", + "libraries/3rdparty/lwip/test/unit/Filelists.cmake": "3320870eff853e33d137578eb6fbae190e4e45b0fcef6f67ca30a881f569c00c", + "libraries/3rdparty/lwip/test/unit/Filelists.mk": "161801b0b6cf9decd2b2715e8d52e4697c6e969bb2e0cc95020eb233817429d4", + "libraries/3rdparty/lwip/test/unit/api/test_sockets.c": "57c81dfc3d13443232a95eeb4bbf7c8015b420e2e234e3448cfa747d798540a9", + "libraries/3rdparty/lwip/test/unit/api/test_sockets.h": "a9d4ea42dfdd6b976481eb6924b07f296b07c664ddf001b279609c7ffdf4e753", + "libraries/3rdparty/lwip/test/unit/arch/sys_arch.c": "b2e5944a75afb79466b993bccb2b554889ee9a1a48c0117749972199fca548e6", + "libraries/3rdparty/lwip/test/unit/arch/sys_arch.h": "8620ba7c2497f07926dd9b829753027ed477029e101a2c36079e506442b9e033", + "libraries/3rdparty/lwip/test/unit/core/test_def.c": "9df928c75ce8055b16642f53435a8cbcde5821916a3012e66caab98f305b9ebd", + "libraries/3rdparty/lwip/test/unit/core/test_def.h": "60e5dd455f893eaa2365fd2c5ad01d7adfcbd6ae4459a975a9abcb1e54746db4", + "libraries/3rdparty/lwip/test/unit/core/test_mem.c": "6f3e9d6a5c2e79b87d49bf17b068ce9f9965adb17be74355e25ac843b5f0ca1d", + "libraries/3rdparty/lwip/test/unit/core/test_mem.h": "54e2e3a94257fdfdbb31dbd686aff96032976894f9002188c3817f14d2ca1d00", + "libraries/3rdparty/lwip/test/unit/core/test_netif.c": "034ce07a28143aa81f6472f5ef8b22bab2d1dc3b358c8b831104a67ac1306593", + "libraries/3rdparty/lwip/test/unit/core/test_netif.h": "66ea5e6b4b2d405fa9492f044eb84e5043c399919b8b6b06d712e7ef5750e791", + "libraries/3rdparty/lwip/test/unit/core/test_pbuf.c": "7b3da0e82a0b44414c30e65a5c976ae58f57cbb01c7c7011fe1af3298e7543d9", + "libraries/3rdparty/lwip/test/unit/core/test_pbuf.h": "5eb3d4655112e690f0f1ccf1f7e7dcdde85a87d28fc903a1d89c8df14e738e73", + "libraries/3rdparty/lwip/test/unit/core/test_timers.c": "ab9cb9ebb9c1fbe4970a11453dfa1f29bd5fd90dc93b8561135713eff9394424", + "libraries/3rdparty/lwip/test/unit/core/test_timers.h": "56be4e53bb381b3fa2b9a28c57bbdfcdec04de3b441636b6688345198a42d48c", + "libraries/3rdparty/lwip/test/unit/dhcp/test_dhcp.c": "bed979fae13fc0698800b0b31d40c549175d60911aabc676793b85774421d022", + "libraries/3rdparty/lwip/test/unit/dhcp/test_dhcp.h": "8a2dac3d647bb143830666306cd87761c32f2ff033e11a58faff86a8e9a09a41", + "libraries/3rdparty/lwip/test/unit/etharp/test_etharp.c": "6b03c7393a9fae73ea757dc979cebea892c6367385a6eeb460f55085802d9b0f", + "libraries/3rdparty/lwip/test/unit/etharp/test_etharp.h": "b146eedd105d24070de6c9c42520120922cec7ed31e1b7c93305b471b9f9dcd8", + "libraries/3rdparty/lwip/test/unit/ip4/test_ip4.c": "f71eafadc1ebd8bfd90c5bec2cec9b423c838933e35212ddc25574935284269c", + "libraries/3rdparty/lwip/test/unit/ip4/test_ip4.h": "7638fa112bc0b0557aa87f5877b86d60c08a6675e456c834d67a579e9d8b372a", + "libraries/3rdparty/lwip/test/unit/ip6/test_ip6.c": "7f8add480419442841f8de72abe1346a2810d7e13cb0fea777b48154e3ccb6f9", + "libraries/3rdparty/lwip/test/unit/ip6/test_ip6.h": "1f4d745b8767e8f376e7b54a5b732e8ab4a19c1327b9484f25989159eb0a7320", + "libraries/3rdparty/lwip/test/unit/lwip_check.h": "9891cac2ce125e4e9e9459fcb9508bb58c6d0bed1caefabb188745230b9d4dd6", + "libraries/3rdparty/lwip/test/unit/lwip_unittests.c": "34718e3db1c2787ff462b5b64795c08b3d2d5f196f2ace46b041718ccecaca4b", + "libraries/3rdparty/lwip/test/unit/lwipopts.h": "143de1b8d885467b9690cc0756433b1a5b91150267922c997dc61492ed7a213c", + "libraries/3rdparty/lwip/test/unit/mdns/test_mdns.c": "ba2188e3d21678d88453e29a6c3324bb41f8aff218cb75283ad8673c702e4448", + "libraries/3rdparty/lwip/test/unit/mdns/test_mdns.h": "4226b64bfb4d48147cfa72df6dde6be9bd4a8e5e6a8e9aac8969840bdb9f87a9", + "libraries/3rdparty/lwip/test/unit/mqtt/test_mqtt.c": "491b11cfe15ec6a201d335cb0c07e70775793adcfb8d5966e1272dce389453ab", + "libraries/3rdparty/lwip/test/unit/mqtt/test_mqtt.h": "30cfa02308c9535517042384f8d15a0024760fd953d232e6562c99c8270fde92", + "libraries/3rdparty/lwip/test/unit/tcp/tcp_helper.c": "ad57ad66ed726f3aba92dc745b97fc5bca83ded304a4b3b2e41d22ab1bca9b21", + "libraries/3rdparty/lwip/test/unit/tcp/tcp_helper.h": "11f779ec9985e65d1048d4dfed44e3ea322aab50d720ac428be4d515e2850f52", + "libraries/3rdparty/lwip/test/unit/tcp/test_tcp.c": "486e68152c03aa0470e3a9c650e7a683cef328721d402b5af5c8f72cbd019b16", + "libraries/3rdparty/lwip/test/unit/tcp/test_tcp.h": "831ecc56ea4f5d6a4af9ae1e38fececcce696a51557c4a88618ca935fdac9690", + "libraries/3rdparty/lwip/test/unit/tcp/test_tcp_oos.c": "eed061425068f48f097378a46a36e1a10a9371e0bc0dba9de3880b15803e82c4", + "libraries/3rdparty/lwip/test/unit/tcp/test_tcp_oos.h": "219807f25b0116f12b3c852c8ad5d00c52b2920a220555a3388880b3a20220fa", + "libraries/3rdparty/lwip/test/unit/udp/test_udp.c": "8a34d49579c87b0aad6b0c5251ddec2d4e9d28c05cb3c437c9a6a74be4e9b403", + "libraries/3rdparty/lwip/test/unit/udp/test_udp.h": "6d311b4a541280aa4573fd0483556d9f3b05c20907a0b297d1e3a6de1f945563", + "libraries/3rdparty/lwip/travis.sh": "79cc9d98bd2beb37dee0b43fdb4c480d81c2b87f9968382a95fcd44217f4ba83", + "libraries/3rdparty/lwip_osal/include/arch/cc.h": "54bd7fbdc6d58a07710d31dcdbb3374b7fe49bb746e8d2a56515e98597a5200e", + "libraries/3rdparty/lwip_osal/include/arch/perf.h": "ee864fcb154cf5c938ebb77583ce7bdf69e56fa29c79098831815d022a2617ec", + "libraries/3rdparty/lwip_osal/include/arch/sys_arch.h": "b2798f66afa193bb065e73333b7cdeffc4ff7e37fa97a0cc6b9436fcc99defcd", + "libraries/3rdparty/lwip_osal/include/lwipopts_freertos.h": "7956aec019f851740b7ffbf7f365da2c075f112791d04cb1268ff6af5091a5ab", + "libraries/3rdparty/lwip_osal/src/sys_arch.c": "a133503424469c4dca161d79b668573983874ce87d1e26e563d49baac59dfd64", + "libraries/3rdparty/mbedtls/CMakeLists.txt": "dee4be32fde393a778af301f0408e52b5170678d6e41f02d5c0ee3627dbd5fd2", + "libraries/3rdparty/mbedtls/CONTRIBUTING.md": "2c1db90523cdc83b6a997fc9ba031db30da38fff2f0ee71923eb1a19d0470778", + "libraries/3rdparty/mbedtls/ChangeLog": "2e522b69da00e32c6b352bfe769e029a759d22e30358a1181d56ab5ce55bd909", + "libraries/3rdparty/mbedtls/ChangeLog.d/00README.md": "b53130f5c90c487805fd17066c312c6635e3bb75b4bcc8fe2f58924e01953ae2", + "libraries/3rdparty/mbedtls/DartConfiguration.tcl": "8e988a7b3b90bfb02dae6e8b584f4ec4d2cfb08d567e06de50ba576170925442", + "libraries/3rdparty/mbedtls/LICENSE": "93ffdf17d6585eada49caa2429d21d192f8a7894e57e00c7432953cf07bae44a", + "libraries/3rdparty/mbedtls/Makefile": "49cbae34739c746bfe88ae74195dba13d4dc61f4989cccb80248d759bb3d92fd", + "libraries/3rdparty/mbedtls/README.md": "91779fd2c549520291afe07d3d76ca9f87d597399039a50885c1c5270c20bd59", + "libraries/3rdparty/mbedtls/apache-2.0.txt": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "libraries/3rdparty/mbedtls/configs/README.txt": "689a82e35eca542b4a7ae6954d39ab41830edd8b7d6fea29990bba40a2b97a9a", + "libraries/3rdparty/mbedtls/configs/config-ccm-psk-tls1_2.h": "17cd4f272bf4e642509190b26d4f05a7e6b779a4c7925ef3ce5dde2584085d22", + "libraries/3rdparty/mbedtls/configs/config-mini-tls1_1.h": "195a84aaf9df7e7b1d0c637bcaab59e1ef3f415e9f6cf7529dfa24b7a8841643", + "libraries/3rdparty/mbedtls/configs/config-no-entropy.h": "796c70839805147b6d558704d2bdd63715aeb81e7bb028411ad443620f9dbf50", + "libraries/3rdparty/mbedtls/configs/config-suite-b.h": "4e08827ff19a0320623db6452dd216027d121b6d736e7ca56768fdeb34fb77cf", + "libraries/3rdparty/mbedtls/configs/config-thread.h": "6006363562eb48d203eace4ef6f081d8062d1372bc7d4044690365c121c14c5e", + "libraries/3rdparty/mbedtls/dco.txt": "53a0a460f8eccb279580aa16013c5f98936eba73554d267632f5ea83d8e890b1", + "libraries/3rdparty/mbedtls/doxygen/input/doc_encdec.h": "dc7ce45660ff78bc0df0649cee3933746b20aff0cccc03adfc087c2ad607bdea", + "libraries/3rdparty/mbedtls/doxygen/input/doc_hashing.h": "d8e1c36434ef523226b3accc24789f28832ef2fb14c39542b0e4d832199d8751", + "libraries/3rdparty/mbedtls/doxygen/input/doc_mainpage.h": "308d2c0d3a7c886b9e1eeb3eda428873b9b38316ce7f8d64e80969eae240fa9b", + "libraries/3rdparty/mbedtls/doxygen/input/doc_rng.h": "73604d2736b96ba379c5137c71f6ed8d48990f1b62f1cf39a4efb6e3949b115b", + "libraries/3rdparty/mbedtls/doxygen/input/doc_ssltls.h": "954bd3c8ee0e02162b703bac98b8762d6f4f6c32722f2394b9c590aff07ac563", + "libraries/3rdparty/mbedtls/doxygen/input/doc_tcpip.h": "62c48fc7bd84be5fa7b4afb3143cdf0a505e7bafb7eded854bc463c7adcab139", + "libraries/3rdparty/mbedtls/doxygen/input/doc_x509.h": "208b9e370322f5d0bd86931a80727df00e531ac07e6b2cbaac4219c3cc294074", + "libraries/3rdparty/mbedtls/doxygen/mbedtls.doxyfile": "b280ec7299d796f58e5fbaab268d43bde848896d6384172067984b1723c1b3f4", + "libraries/3rdparty/mbedtls/gpl-2.0.txt": "8177f97513213526df2cf6184d8ff986c675afb514d4e68a404010521b880643", + "libraries/3rdparty/mbedtls/include/CMakeLists.txt": "8b33005b219df3410d10c8354b6f2032559669a7e1ae0dc2e2e768d7d8c6ca34", + "libraries/3rdparty/mbedtls/include/mbedtls/aes.h": "afe879a45b4777dc048cfd031a7cdb23dbff6f4d3fa33bd95b36e7308a5cbad5", + "libraries/3rdparty/mbedtls/include/mbedtls/aesni.h": "d3edc71b465aec7282da21939ea30993d9e11bd708f141a3ace007a53d41ebd9", + "libraries/3rdparty/mbedtls/include/mbedtls/arc4.h": "085e0735863b42f5e07d85fdf8c7b0ff0d2eca923338d28aaa8752d3984d044e", + "libraries/3rdparty/mbedtls/include/mbedtls/aria.h": "a57f8a8ee2d566c917d1ff829591680e10c26d50ae52bf19e4e816f04ee98770", + "libraries/3rdparty/mbedtls/include/mbedtls/asn1.h": "8a9664fc53c831357498d8ce0bef2369aa54568a178adb6304ce44722921c950", + "libraries/3rdparty/mbedtls/include/mbedtls/asn1write.h": "bde4ce9456f06efeeeb0ec00484cba52bc5cd529737d4d3da4a86b09d71f53ae", + "libraries/3rdparty/mbedtls/include/mbedtls/base64.h": "bc0d4d9a7d9cf93067270cbd7c40e78555305bef808128548357318bb69d34c0", + "libraries/3rdparty/mbedtls/include/mbedtls/bignum.h": "d8fecfb2b7a680496943dd69cc5d24f644087e9899624a34d3a90c45c3964e93", + "libraries/3rdparty/mbedtls/include/mbedtls/blowfish.h": "0f0397bedb92cf2a18e6377d96ec5ff0d5463e364a5f6ea7511175b59c53b3f4", + "libraries/3rdparty/mbedtls/include/mbedtls/bn_mul.h": "0decf2f87eca52b0298d463b7727d645ab0474243948ff363e200bb4a42cb700", + "libraries/3rdparty/mbedtls/include/mbedtls/camellia.h": "837815e834c054206decffcd1b8f6e7da66ed0d13bac1b33d55b9ff8a64dd0d6", + "libraries/3rdparty/mbedtls/include/mbedtls/ccm.h": "0be6743fc288b4c4a662dfbe7a88803a9ba3e5edde0417d180448db1f99fa339", + "libraries/3rdparty/mbedtls/include/mbedtls/certs.h": "c21b771ccea08030595d2d626a76d92c3333b0ff2310863d298ae3c36bd12748", + "libraries/3rdparty/mbedtls/include/mbedtls/chacha20.h": "bb636ce04b9f415b29f5bfc8a2640463b4c92e5d96e796aeef829cf91e8b4e88", + "libraries/3rdparty/mbedtls/include/mbedtls/chachapoly.h": "f957183bda10fbdc0e47d0b4ffd6a16eb70b53be2e257e3cc31f2758b174b588", + "libraries/3rdparty/mbedtls/include/mbedtls/check_config.h": "0734be691cacb9eef35854c3a1920d7b96cae0247c1f6e6d7a69727c21d4f145", + "libraries/3rdparty/mbedtls/include/mbedtls/cipher.h": "d84b8a5351e29e0660849c4c06f9cda2a950536932378562fef99d170ac00a23", + "libraries/3rdparty/mbedtls/include/mbedtls/cipher_internal.h": "1c1aecc1d4615c8c7493afb0bf28298b8e297c4749d5c129ba002b3bbf6a367c", + "libraries/3rdparty/mbedtls/include/mbedtls/cmac.h": "a6173e959969ceda1b5b2d1876190bd115eabc08a8cdcaf67f29fbed1bf66c47", + "libraries/3rdparty/mbedtls/include/mbedtls/compat-1.3.h": "7c99033d89833c9deceff34e3696dd97f356d20c70fa77e11fcacc19581d45c8", + "libraries/3rdparty/mbedtls/include/mbedtls/config.h": "8ed7c7121f225a2369fd2a9fee1a5ebd72cb2bf55dffa1c6d783f5a52f79d536", + "libraries/3rdparty/mbedtls/include/mbedtls/ctr_drbg.h": "bdd4bcdc67aebb1cc914ef4619424c0708b1f6ba4583152c2dd9cd26ffc27883", + "libraries/3rdparty/mbedtls/include/mbedtls/debug.h": "87282e3299ab2aa3cc7d1b51d7376e51dec55f7fc0bfc9114fc7b69723fb94b7", + "libraries/3rdparty/mbedtls/include/mbedtls/des.h": "a76bd9f372379c4c4380519504c3f0ba3ac85ce2544cf3ad7d6d420325e96fdd", + "libraries/3rdparty/mbedtls/include/mbedtls/dhm.h": "10fb937d5f760ce8115a16e628c329e14c6a161c33c6b2687b948d30bdc1d2ed", + "libraries/3rdparty/mbedtls/include/mbedtls/ecdh.h": "45fe53a83a6371b726c44750e8daf09bad46acdb6c5d5a27708784098c5ac09b", + "libraries/3rdparty/mbedtls/include/mbedtls/ecdsa.h": "a1977a2670f9373da4e525a78262910b733516a250e8ae2146c2112511d6cf0f", + "libraries/3rdparty/mbedtls/include/mbedtls/ecjpake.h": "577582b5ed14e4cfbcb7f84c8d0ea10b383e6811849889d6f0dccf06e410f03d", + "libraries/3rdparty/mbedtls/include/mbedtls/ecp.h": "4d6eb93618209c48a4147814dc4a8b151387198bd2957858e0a044b119363fdf", + "libraries/3rdparty/mbedtls/include/mbedtls/ecp_internal.h": "cb5bd5834222fcf5ebda17867d034f3b3ee0cb6a01ae05e24150d7d7da9b9056", + "libraries/3rdparty/mbedtls/include/mbedtls/entropy.h": "d15e7d90bce63253e5c5c1238659d0ee917a8502246b920ce942b3797dbe327a", + "libraries/3rdparty/mbedtls/include/mbedtls/entropy_poll.h": "a6b0c4a9d45b7fb2e535ac070da0c8fdcb7ddca7d3c221966b9223d601cc2770", + "libraries/3rdparty/mbedtls/include/mbedtls/error.h": "f8fb48cc215dee818166dc5d960961e62f822d8a4ea59540c5e36fdbfa5895a2", + "libraries/3rdparty/mbedtls/include/mbedtls/gcm.h": "28df84fc052aa6ba9bd8aac7e5d88d20b719e4ac31cc98107c09fc320d457648", + "libraries/3rdparty/mbedtls/include/mbedtls/havege.h": "5736439257a124ae54a1278635d8ed377af6b67ce1bf923bbd90ca051a35ad78", + "libraries/3rdparty/mbedtls/include/mbedtls/hkdf.h": "594d8ab95a102b92c716d8858217769d49db34d00d9b45a77443787fe8edebe9", + "libraries/3rdparty/mbedtls/include/mbedtls/hmac_drbg.h": "488f5b8c997c5ebfc0a6eda725157a9ffb7c0a833079d1b00bed86ae3ec31bdd", + "libraries/3rdparty/mbedtls/include/mbedtls/md.h": "d6e92adaf9be894f23db4c9b33ee99e42ec5c7aaeb9c542840385346f2ae1070", + "libraries/3rdparty/mbedtls/include/mbedtls/md2.h": "e5ba12832916893a33d3ac31bfb3479e9fa04ec17924dd0eda42490822bc017f", + "libraries/3rdparty/mbedtls/include/mbedtls/md4.h": "9dcb47bd1bfba5c29fd725460c41156cb844efcc528d9055b5721c7f55fa6e6e", + "libraries/3rdparty/mbedtls/include/mbedtls/md5.h": "62237ef21805f7096cfb1a85bd477d9fc2f8d693c00e8b7731d48cdca39a004f", + "libraries/3rdparty/mbedtls/include/mbedtls/md_internal.h": "b502fdd7d71adad3d0b5a4e44d773c1c00115a90364127fae247c5f6b9f89a78", + "libraries/3rdparty/mbedtls/include/mbedtls/memory_buffer_alloc.h": "33c023938684f17e4cbae1bc373c13a128a733b8d26d26e2a94ba381eceab080", + "libraries/3rdparty/mbedtls/include/mbedtls/net.h": "1b02c8a4566d032837d979b9e7d321289d396fe8af79ab6d848117e82d79e924", + "libraries/3rdparty/mbedtls/include/mbedtls/net_sockets.h": "4e470ea94c8e1ff165d73fffc82b70431e74b755d7fb6f3911b49b9ca84566aa", + "libraries/3rdparty/mbedtls/include/mbedtls/nist_kw.h": "2e29d722b60a7672a0327024e105967569e6bee398c17fab5ed5c06dbfc9d919", + "libraries/3rdparty/mbedtls/include/mbedtls/oid.h": "b2d36fe414b36a0a7389b0d38f038a2fd755457924d735a6c7972c568694222a", + "libraries/3rdparty/mbedtls/include/mbedtls/padlock.h": "d57ac9ffe314c169d8d418c4f61af0ac7a399a8c3c8929e240761dad04c4ba0b", + "libraries/3rdparty/mbedtls/include/mbedtls/pem.h": "8784957cb6512857cccc7d5ef986ae76c7f2cbb4a794efb98e92e7c0e87eeab8", + "libraries/3rdparty/mbedtls/include/mbedtls/pk.h": "53379ac98abd79587fbc19a52bb4df5dc0cc43acbadf3e15094c89e20d6bd91c", + "libraries/3rdparty/mbedtls/include/mbedtls/pk_internal.h": "99aa7f920b6f814d39e1a181079cd187d2fdea7bc9b614dd7a47297b9820a4a8", + "libraries/3rdparty/mbedtls/include/mbedtls/pkcs11.h": "bf6e84c4dc79dd2c06d4118aafb5747bf0ff3e5235de380fb4b336def147888b", + "libraries/3rdparty/mbedtls/include/mbedtls/pkcs12.h": "001d788141f5662a2b94239108ae3c47b0c9371c9f7b74a5df48c29fa0f38cf9", + "libraries/3rdparty/mbedtls/include/mbedtls/pkcs5.h": "c99933a513bc276664bf9ae1deb5fe246b1f68f70c4fc9cc1cc322f50b0218e7", + "libraries/3rdparty/mbedtls/include/mbedtls/platform.h": "b4a6e5d57fe86db1c1d095708845e0c672ff7a477049a6d3ed1d051bf1983d42", + "libraries/3rdparty/mbedtls/include/mbedtls/platform_time.h": "4d1720c2450ea4ad25300d9d6f4594b1866a9548d536a8d76ea9b58344b53e51", + "libraries/3rdparty/mbedtls/include/mbedtls/platform_util.h": "a33e1009eb1fd54b07a85b1472f6c2b1e9b292169661f5be5dcb23b1a4fc4e19", + "libraries/3rdparty/mbedtls/include/mbedtls/poly1305.h": "7656d74786e7cdaa8a59f50e70f99787432aa4d9e474a3b2a17932351c762259", + "libraries/3rdparty/mbedtls/include/mbedtls/ripemd160.h": "0ded6338aeac3feae27877cd3afe681d8a39c6f71421596d7dd455ade5e9296a", + "libraries/3rdparty/mbedtls/include/mbedtls/rsa.h": "cc737a6c76d0761d6d7c83efeb24c1d71328c062f7dcffd981571f365692dd17", + "libraries/3rdparty/mbedtls/include/mbedtls/rsa_internal.h": "af3f06e7b2b97ff7933a1514bb792dd62bebdd6675904d8cf7773ff950698d9d", + "libraries/3rdparty/mbedtls/include/mbedtls/sha1.h": "8c3a4c80e666a29826d879452703d263b2e62beed8c53e629ca526d0e899b524", + "libraries/3rdparty/mbedtls/include/mbedtls/sha256.h": "f814b5f1a6c5e8cec0815516d5b90d78bc008d8066f10537585a43a85f0614c8", + "libraries/3rdparty/mbedtls/include/mbedtls/sha512.h": "da3c21d6a24dc9dad572af9a77c9badc78746e5d839b72a47272b32b8a8783e3", + "libraries/3rdparty/mbedtls/include/mbedtls/ssl.h": "a4bf39c2fd17de235b9d0f5a99e2c532d938867350d5cb2d760118bc451771bd", + "libraries/3rdparty/mbedtls/include/mbedtls/ssl_cache.h": "b9c520e99b305cba100f67e5bcc876ef5a76b22187cd66359e83cb0e63b64ab8", + "libraries/3rdparty/mbedtls/include/mbedtls/ssl_ciphersuites.h": "7b05415e913dda6de714ef6626404837b93b13f33f0bdad2d5b1121b0066dbfd", + "libraries/3rdparty/mbedtls/include/mbedtls/ssl_cookie.h": "0a8daefcff1065c08d56d996cf72467d55c741be03972edac76dd7f946ab02d1", + "libraries/3rdparty/mbedtls/include/mbedtls/ssl_internal.h": "1cf923bd9226d7a43445b4b811e8d99ceca3882952717b96978b992a4a89a08f", + "libraries/3rdparty/mbedtls/include/mbedtls/ssl_ticket.h": "90f71f93fe2dbe4473ca61fca9244178af8bf6c2e17ee1e2a10c8f9f8bd91fb4", + "libraries/3rdparty/mbedtls/include/mbedtls/threading.h": "facbd8ea4a2fdfffdf0f6a8f62d950e32e2195e5b0969531001db5603885c76c", + "libraries/3rdparty/mbedtls/include/mbedtls/timing.h": "5b7ea9cde317563fbb096e358df110b334c7cf4140315e39ee21ed664f309fb3", + "libraries/3rdparty/mbedtls/include/mbedtls/version.h": "b565609959075c6002c1a41b2313b7dca626997108d3b2b4a51f167dd96d41a7", + "libraries/3rdparty/mbedtls/include/mbedtls/x509.h": "46bb20a5fabb9796b6ef0f8bd7d05be822175f2170282adf723eb05645efae0f", + "libraries/3rdparty/mbedtls/include/mbedtls/x509_crl.h": "917edd8a8f601620e3bcf81812c447a9ac569b31d6f31c87eeb92f0c3d35ed6a", + "libraries/3rdparty/mbedtls/include/mbedtls/x509_crt.h": "76e2c7883d145a8e28f2266b86ff4d59ff675d05a21b5d00ba2165590aa9f426", + "libraries/3rdparty/mbedtls/include/mbedtls/x509_csr.h": "9fba654b535fda22f1536f1fc8dfb9315d0f0a9f0ffd573836b462aa2308922d", + "libraries/3rdparty/mbedtls/include/mbedtls/xtea.h": "a8d4f19d9a4a697a0b64abe0ff6fbd67ea4edd711042c96fb29827c5efdd48c6", + "libraries/3rdparty/mbedtls/library/CMakeLists.txt": "a8ce844760611a9f8ee0f818d8fbe9ffae91eb0116a7673e8f7271ca11106785", + "libraries/3rdparty/mbedtls/library/Makefile": "fc602ac24e6bf784399d4b65ceb26b55b442878d5f6d340fe632c41b8321f3db", + "libraries/3rdparty/mbedtls/library/aes.c": "4288fa23a5979c8c57d4df396fc95a14c0c2a11c28a6476b17a1c3dad701112d", + "libraries/3rdparty/mbedtls/library/aesni.c": "a4c2cdddc15fcba198134651f5c291f7e57156823ba530fb8dc686d7ecdc3c30", + "libraries/3rdparty/mbedtls/library/arc4.c": "8857548e90924c9ab082c65bb4a997a9475d79c3497fffb523b70d61fa37aa75", + "libraries/3rdparty/mbedtls/library/aria.c": "8ebc8a8beed52d2ceeb869c8988b5366611ca7b96e234ca4dadd8667ffef23a1", + "libraries/3rdparty/mbedtls/library/asn1parse.c": "0a4aa2abcff3959e39fbccb16d145ce945f5bc5c95bc74dc591feaaa58be99f2", + "libraries/3rdparty/mbedtls/library/asn1write.c": "eafa624d131d994e903e7cca49475a2745d8eba0ac49d774a7dcfb8740aca051", + "libraries/3rdparty/mbedtls/library/base64.c": "182a41b5fff7be8fe584e092bba447cca9e0d712000a058668ba61075cbecee4", + "libraries/3rdparty/mbedtls/library/bignum.c": "defde21b0ed83fc210f1ccd87b1273826eb5f9e9787f87c8c69fb9245e0a1fb7", + "libraries/3rdparty/mbedtls/library/blowfish.c": "9bea5b2b05297123ce707192a349570b5c27dc549f472138b68554e3842b8e6f", + "libraries/3rdparty/mbedtls/library/camellia.c": "df18194fa3f9d3297312d511de43bc0f02b555d37fe24bbcd5fbb197c87f5dc2", + "libraries/3rdparty/mbedtls/library/ccm.c": "b263c34eba5832c33c4e2d09d73d73a2984169c9c048bc0fb9e12f07174fcd68", + "libraries/3rdparty/mbedtls/library/certs.c": "2178d5a922f92374bc1af0cc6a16dd97b6de872ea79afac4250f496d122a7ab2", + "libraries/3rdparty/mbedtls/library/chacha20.c": "33f955bd6872432912645c577725b14a6e513ac984347f3f8970a726b425df05", + "libraries/3rdparty/mbedtls/library/chachapoly.c": "34b37b2b02d17e86b63bd04e661c3448365344bb86b51cc3845ed1c761d55eb7", + "libraries/3rdparty/mbedtls/library/cipher.c": "bf2c957f5ad6e1cee14d0e69ee377ec84ffdaa1a2e7f02366a35c7776a26a8fc", + "libraries/3rdparty/mbedtls/library/cipher_wrap.c": "453c1e854cdf198c7aa661c9009bae89d4c01e81fde078e4e7deef8e6d2084b6", + "libraries/3rdparty/mbedtls/library/cmac.c": "b3c0ef2a64ffab706789e2037f8096c2504d9c0c28560dd996490fb2f8b75704", + "libraries/3rdparty/mbedtls/library/ctr_drbg.c": "fd0ac72baa6ab437be735dbaa02a3345d8ecb24dd8eebf9c0b575cde0d405c5c", + "libraries/3rdparty/mbedtls/library/debug.c": "78472dd80e0848e51a13de98c45d2e14060c1d5e2ff992d94f24988a7a065c92", + "libraries/3rdparty/mbedtls/library/des.c": "2061c8155e25ad8193c0fb209aae0cbd5a870cb64b604acdad9c79a4c761b3cc", + "libraries/3rdparty/mbedtls/library/dhm.c": "f3937f90752fe8cce08bcadb4f20f255684af8edd76632d27b9057cb8c4526d4", + "libraries/3rdparty/mbedtls/library/ecdh.c": "492122e6d15860ed9b0740b3ecc15dccec77c981d6cf9c319e3029d503f14568", + "libraries/3rdparty/mbedtls/library/ecdsa.c": "eb152dd835353cb7458cae1ddf80aa80a5d99e86d34ed4d0e3e7fc125f7f93fe", + "libraries/3rdparty/mbedtls/library/ecjpake.c": "f469f34c65278b30e4dd39c47fc82a105158f0eb07cdea5c33a02e60095d80f8", + "libraries/3rdparty/mbedtls/library/ecp.c": "39762c9f571179332e0b9412cf7c4772fcc2c9b6d2f07c7a6ffccc72bcb74f84", + "libraries/3rdparty/mbedtls/library/ecp_curves.c": "2475a5f0b2fd848c8c86366a0df11c1dd8228f532ccfb454518e1dfd43d5bf8c", + "libraries/3rdparty/mbedtls/library/entropy.c": "933a22f938ef9d3bf1d782b264358e480b9d37e2ee9088fca4fb1b86fba1a828", + "libraries/3rdparty/mbedtls/library/entropy_poll.c": "0a88fe1c876ad3b086569517f275e9b5d4ed7bcb646416517aed44fe2600d910", + "libraries/3rdparty/mbedtls/library/error.c": "fb2c8f00f5ad85f8d8e109adea9228d029fc7ddffb54afdbc013c963f3161ac7", + "libraries/3rdparty/mbedtls/library/gcm.c": "50b47d680006b95bc3bcfeecc01d8d67531ef1c33f15f9ae2b2961ac7a1407b7", + "libraries/3rdparty/mbedtls/library/havege.c": "1cb6a90ed86fc2fca20b5116f3a1a31efa8ca627cb60e53bb80e2145ea5d8602", + "libraries/3rdparty/mbedtls/library/hkdf.c": "c08d6825b64bc78d042a8f01494b708757e44636719e17f260362f15146bbff4", + "libraries/3rdparty/mbedtls/library/hmac_drbg.c": "ca8eef1422406a1098fb9e85b39075db0c742ed7add762365668cf3668a2f810", + "libraries/3rdparty/mbedtls/library/md.c": "cbb194d941c0793bec8903a79b37ca4e1df8f3c2e1d744dfb75a4005071b2eb9", + "libraries/3rdparty/mbedtls/library/md2.c": "8a94a7f0b8e218f24bb0c9c75b7b97c9708525abe0e6367e95f19575efadf77f", + "libraries/3rdparty/mbedtls/library/md4.c": "9913e7e79624592bb95b9596c46865beb1863c3e434bb926ec25a4f26e8c7b44", + "libraries/3rdparty/mbedtls/library/md5.c": "d22e001ad3ac40571ee8ccd6a28534b3a717b85ac3f957736f625650055f01af", + "libraries/3rdparty/mbedtls/library/md_wrap.c": "58f3d626cc386ad4fa460299fa6d1e6038ba17110f4a4832a5a6228dbda42f9c", + "libraries/3rdparty/mbedtls/library/memory_buffer_alloc.c": "12cb517af657889e1ba674f29e06f074f487b1a7ed3cd8b73901431c5c7a08af", + "libraries/3rdparty/mbedtls/library/net_sockets.c": "a068a43b8237298dee876ca04c766eee6821c0dbea29dc8ae94fa1f21773ee46", + "libraries/3rdparty/mbedtls/library/nist_kw.c": "207e85cf70628bdff639648a6598882b5d03c7b0ec52ae3ecfeced1976f6b7ae", + "libraries/3rdparty/mbedtls/library/oid.c": "b4556e0bd537526dcc1ee5cd2dacfad5779094c56be58260acf4d7e7b139c3a7", + "libraries/3rdparty/mbedtls/library/padlock.c": "10a9521ca248e65a725a7af981ebb6cab79577105476fe872b69c3e743d2faa8", + "libraries/3rdparty/mbedtls/library/pem.c": "248ca954d52ac579d710879adbb51f0809b5f8f0e422c0c86adbed42fa51658e", + "libraries/3rdparty/mbedtls/library/pk.c": "32fe9ef24ed691e8ccafda68b97b5f89fe02a71448bf7a28cf120b4110b05b9f", + "libraries/3rdparty/mbedtls/library/pk_wrap.c": "99ed73e81a582dae47aa9bffb36dba44a9aa66616ef63de57811163654491fef", + "libraries/3rdparty/mbedtls/library/pkcs11.c": "8e1b5602b7ef1b7e26e07de027f4a0286842a99dad48f4b13e251b0d6167b10a", + "libraries/3rdparty/mbedtls/library/pkcs12.c": "cb02bffaa8196a9c237a09c7e3d24965c96dc6408dccd6bc544b85f3864802f1", + "libraries/3rdparty/mbedtls/library/pkcs5.c": "3a0ebf774dad943fe26adddd2e9868b947b91c946a7551eae8046a70467b97a5", + "libraries/3rdparty/mbedtls/library/pkparse.c": "e71ff552184fab608af6d56575dce97cf9ecaabdd538b86d0e953b76fa4dc3c6", + "libraries/3rdparty/mbedtls/library/pkwrite.c": "8430dce4584f33cfa22f3964000c1fbfa0542dc8b1cd70609585e0bd98508a25", + "libraries/3rdparty/mbedtls/library/platform.c": "e4f3ceca9b62a91e8d66a9f96190714de3f34b1601e37c6a5e89d340c9e97ff7", + "libraries/3rdparty/mbedtls/library/platform_util.c": "cc2effcae747df6da0dd13b4544f2e285b800a800b99b0f051769be89fa12f44", + "libraries/3rdparty/mbedtls/library/poly1305.c": "8a586ed4fbf51f9af83fbf2d916cb777bbd0d715d697ed1cec65529a365e6a62", + "libraries/3rdparty/mbedtls/library/ripemd160.c": "d017586c9f1151db9092f0e60fb7359fbb268860b9eb16b26a87c129214178b9", + "libraries/3rdparty/mbedtls/library/rsa.c": "8dab05d8fb547fbf74994f113bab1596986b0ede99c979fbd197fdc28397f985", + "libraries/3rdparty/mbedtls/library/rsa_internal.c": "eefbf7959d243da766be010948fdebaa2977a95e61fa09affd7193cf24992687", + "libraries/3rdparty/mbedtls/library/sha1.c": "6231c521eb5616169e23a0fd42aa663e3e49d3594a298560cb36c1ffff248d2b", + "libraries/3rdparty/mbedtls/library/sha256.c": "ff9d0a3df9e100efb6ba6106668b8a01aca1a602890dceeecd55e40ab29b4ea5", + "libraries/3rdparty/mbedtls/library/sha512.c": "b151586e8847454378b0d82207602f6937d022aa1d13e3e6d69e67a18f227c5a", + "libraries/3rdparty/mbedtls/library/ssl_cache.c": "1ad5d0fea8b1bce083a2ad96ff247f6b16925bb53516b104d806a6e65aad4f43", + "libraries/3rdparty/mbedtls/library/ssl_ciphersuites.c": "a9efaf43f2fc044307f9635f4ec32fd03bd6760453b76c12cae616209bc3d93b", + "libraries/3rdparty/mbedtls/library/ssl_cli.c": "b4d3241fe384c481d4b48c94ea0101fec0ad83fed3301d3b7fc10be3949d5952", + "libraries/3rdparty/mbedtls/library/ssl_cookie.c": "8b54041acfb97d5b345829fa488b307dc9a4a6ff83fdf330832599b6c3f9d3cd", + "libraries/3rdparty/mbedtls/library/ssl_srv.c": "cf15d011fe5b0ae8776cc6e289bb56f082fa76bce32744ad761aef0b83bc0311", + "libraries/3rdparty/mbedtls/library/ssl_ticket.c": "f948963c63f2bb90226833f23727be77a787e45abe9f2d52de11bf74f60a6392", + "libraries/3rdparty/mbedtls/library/ssl_tls.c": "23d3d1ca67cde6195e6dd662b86c6ddbba38d9038c17503bf076b35b63110286", + "libraries/3rdparty/mbedtls/library/threading.c": "b11bc522e0b1d45783d4d3d5ec31390cadffaca662dddbb44de7113292d0deb1", + "libraries/3rdparty/mbedtls/library/timing.c": "f516ce5e42b8ca5cffa36232323c8c6a7e594ce0641942810dda6534e41793d5", + "libraries/3rdparty/mbedtls/library/version.c": "5b567a3354bd2f3a56e618eb7b2c4606a151d3a469fb4293d47fe9b6645259ee", + "libraries/3rdparty/mbedtls/library/version_features.c": "a409a8a52bd3780837448a27fc1495878b745d96057cbd3af2ce2c71f6864494", + "libraries/3rdparty/mbedtls/library/x509.c": "4d0883ab99fd117d196bf666fef23742b6149be882a9567ff6deb728e8a2ff0b", + "libraries/3rdparty/mbedtls/library/x509_create.c": "c11f48a5df30ff6db074af8d3ac11277e021eb5da8169512571933d69944378b", + "libraries/3rdparty/mbedtls/library/x509_crl.c": "3f4338fd6920eee4b615108ae1d3bc7387fc4131a8cd7f297a6e0bcc57f7f08e", + "libraries/3rdparty/mbedtls/library/x509_crt.c": "9758f8a5dd1f2f1a952d169bcb7175886e11c9138ba8fa937bf71eea098539c4", + "libraries/3rdparty/mbedtls/library/x509_csr.c": "3949dc1f20dde7e8b484452fe4902bb58ebea3745f7a46eb0b59514d17fd4c36", + "libraries/3rdparty/mbedtls/library/x509write_crt.c": "7476466c419a3af8d68bfedebbcb71fe05cf20fba164f0cac31b83b6ed67f95a", + "libraries/3rdparty/mbedtls/library/x509write_csr.c": "642ca33facc02e2296c5514a79650df10aff717b306c6b6cb8e5f52455237cf7", + "libraries/3rdparty/mbedtls/library/xtea.c": "27e37318e767f4d44d0b94aa29c981bdeff6466350448d841a5219b6ae3035b0", + "libraries/3rdparty/mbedtls/programs/CMakeLists.txt": "528503fbcec620728a53e987437e5f04f34f9b604a6d7e559156aaab2a8502a4", + "libraries/3rdparty/mbedtls/programs/Makefile": "30cc7e78c989ba44369e47654e111271ffc331e9f79c85e391336a0ad161c7e4", + "libraries/3rdparty/mbedtls/programs/README.md": "12ae86078bd2791074cec4dff2652165a027fa9191413e92d06e7f9ad7b0ab81", + "libraries/3rdparty/mbedtls/programs/aes/CMakeLists.txt": "fdd4153e4a452b98eec8fe330cee8766412d6931858938704bb808a1fb722980", + "libraries/3rdparty/mbedtls/programs/aes/aescrypt2.c": "07fb23a1012f9bec71eddce863841588ed4d3bff81aaa425a26c76170958e10b", + "libraries/3rdparty/mbedtls/programs/aes/crypt_and_hash.c": "d149964a671a06e2292a8102b7af9f4341e86528ba9f5e4f990eb8db8fca2b76", + "libraries/3rdparty/mbedtls/programs/hash/CMakeLists.txt": "e969c3ae5259aefeeeaee32b21b401484dff7f651450da1e765fdee2c96b6daf", + "libraries/3rdparty/mbedtls/programs/hash/generic_sum.c": "8ba66f37d4f77b445f3a2c45fba89b79b1df35f9fe6e90e8e1bea7955af464f7", + "libraries/3rdparty/mbedtls/programs/hash/hello.c": "453c9cbaf91147be405488b27bd237c99abcebdc5a71798efd7655aa0172075b", + "libraries/3rdparty/mbedtls/programs/pkey/CMakeLists.txt": "76525ce3dcf9b683076bad9e69baa6fafed3f8076e3c42596175dc55ed2c27f1", + "libraries/3rdparty/mbedtls/programs/pkey/dh_client.c": "37f820445864fc8b1a68654ca6f91724b0603957331e4bfacb097be5c746c1f6", + "libraries/3rdparty/mbedtls/programs/pkey/dh_genprime.c": "915cc30c8da0c190f04caad436b9890cbbcfb4b589162c65f6378fa0f8020070", + "libraries/3rdparty/mbedtls/programs/pkey/dh_prime.txt": "26f568b6b7e200f0c8f6726cd869e5a529d22bdcc7b33a9cf0bb6c0f4acd65a5", + "libraries/3rdparty/mbedtls/programs/pkey/dh_server.c": "7226eb0e9d33612677de7a6f4c8ab201e5ea5a32ac5595541f8907dad93d877e", + "libraries/3rdparty/mbedtls/programs/pkey/ecdh_curve25519.c": "ef83d50a3fa09279ace35b15898b98eac7ffa21eb8c61766053733a89b38cee0", + "libraries/3rdparty/mbedtls/programs/pkey/ecdsa.c": "3e8d188bb157d5d5062663863d712f50b2bcec674f5652bdf6d17813b774d69d", + "libraries/3rdparty/mbedtls/programs/pkey/gen_key.c": "5ac3aaa1d6af7b158d3a9abb40a2e63c6f3969479da3bc78c58c98e63aa36663", + "libraries/3rdparty/mbedtls/programs/pkey/key_app.c": "e95bebe5a6fda6e52e78ee5470e952d920d0fe860dd6283b63cd2ae65943057c", + "libraries/3rdparty/mbedtls/programs/pkey/key_app_writer.c": "7f3c6557a2af4424aec05f6a1b5a4290a28a272c97f016b4836b667995b7e93e", + "libraries/3rdparty/mbedtls/programs/pkey/mpi_demo.c": "af0877b749d4f568a2adbd64537585a726b02b343152fb3e8f5ab9c320328e72", + "libraries/3rdparty/mbedtls/programs/pkey/pk_decrypt.c": "ab47d6b8604d55cb56da97217bc1bddc2e4834800e93321c2b9847fae71c7a5a", + "libraries/3rdparty/mbedtls/programs/pkey/pk_encrypt.c": "0b73cff0c70fe30f1282a07ebf31f45081b215282efe9c7919b4e60b0365e12e", + "libraries/3rdparty/mbedtls/programs/pkey/pk_sign.c": "999c552ee3551661812167b84a94631bf1181a5a5b7c99bff2df0cd672349fca", + "libraries/3rdparty/mbedtls/programs/pkey/pk_verify.c": "e0dbe1ec0a03feded597a0595ebe9c44cf99afff76161635f8ec6fe3ff3a5ae5", + "libraries/3rdparty/mbedtls/programs/pkey/rsa_decrypt.c": "cb6445efb6fefe8ea0685dc89eda7d828b2c26d2aa13a03ec85c7cf7c79a135c", + "libraries/3rdparty/mbedtls/programs/pkey/rsa_encrypt.c": "71bf473bd2c82d6bf2978df35b943674e293a180f211d952b1a7c6f267432adf", + "libraries/3rdparty/mbedtls/programs/pkey/rsa_genkey.c": "0b4fd5ed309a07386aa1c7f71fa55453f18e36c469f00a87caef16129a3d0006", + "libraries/3rdparty/mbedtls/programs/pkey/rsa_priv.txt": "53507af9612ca19196c322d264ca42b65ac4ed92ba9e2f43cd68cd2db51c083e", + "libraries/3rdparty/mbedtls/programs/pkey/rsa_pub.txt": "bbfea547c88fd479235e5c6342742850e9586afb028b44bb298f5e81e3e57f70", + "libraries/3rdparty/mbedtls/programs/pkey/rsa_sign.c": "7699ffe49744c2009ae2d631f37feaaf5b722c52c9965b260ec08cf409422101", + "libraries/3rdparty/mbedtls/programs/pkey/rsa_sign_pss.c": "d5045b2c3ea8e6b9d83c2afeb975e1947dd8f37e5b7e658625020241152c182f", + "libraries/3rdparty/mbedtls/programs/pkey/rsa_verify.c": "56a5896170c30c30bd48f56aebb4ff617b43383738c5df0eb6b671ddca88a40c", + "libraries/3rdparty/mbedtls/programs/pkey/rsa_verify_pss.c": "c35e2f3f49e09623ecfb3eba0abb6b14637c00225df8ffcb9adf48d21dc7e04a", + "libraries/3rdparty/mbedtls/programs/random/CMakeLists.txt": "724c3964776475b96c439cdc33c67586c05c67b340eab391f940478fc29844f4", + "libraries/3rdparty/mbedtls/programs/random/gen_entropy.c": "f4737f38560b09b86c90920b7e3eb2e3f4db679fafd115932fd1f3a0eaf35381", + "libraries/3rdparty/mbedtls/programs/random/gen_random_ctr_drbg.c": "975bc5af04cd4627fda64ceac00683eb2dc409703cb602e5d9d1016b9180b371", + "libraries/3rdparty/mbedtls/programs/random/gen_random_havege.c": "cd37f67973f6e45f82694271f711b01f5edec459b5cf3e391b2b52205f4984bf", + "libraries/3rdparty/mbedtls/programs/ssl/CMakeLists.txt": "677057e1f24c7e0024bd05457014e3b99bc3ac6331f561dd94e481de45663b43", + "libraries/3rdparty/mbedtls/programs/ssl/dtls_client.c": "6ddc5fa57080d881fe1fa02b4d3a8702a1c300ff2cd9b98b6361d5660e335dbf", + "libraries/3rdparty/mbedtls/programs/ssl/dtls_server.c": "a1b6dd4214442c0e141248e278e71895ec903981b2042f28e1b703c3cf6c4ed4", + "libraries/3rdparty/mbedtls/programs/ssl/mini_client.c": "115cdcfffbd5388b3e6e0407781d315808e377cc682b368888cf408d43910bba", + "libraries/3rdparty/mbedtls/programs/ssl/query_config.c": "efe88fbc301d1dd35b8894a11a6e8971d99684815341aa729caecc7811924d55", + "libraries/3rdparty/mbedtls/programs/ssl/ssl_client1.c": "6f05a7f847950f4bf76eda14cacb14ddf645c38d642efa6ab4b0265e09cc3af4", + "libraries/3rdparty/mbedtls/programs/ssl/ssl_client2.c": "f2f0623ffe362b497157e4fa18c6913893e2d7726ee143d7985226d503935644", + "libraries/3rdparty/mbedtls/programs/ssl/ssl_fork_server.c": "8a4f1b22ddb878f1ad53c1a2947057c90eed9517221fb555cf6096c6bbc737b7", + "libraries/3rdparty/mbedtls/programs/ssl/ssl_mail_client.c": "b54e75773e923e4ebf48ec0ea89d7e4b4a1ef0db0f35a7621c2710a4932892e6", + "libraries/3rdparty/mbedtls/programs/ssl/ssl_pthread_server.c": "ffce413b900cdc0b5583d81382a85976796ea6ef60843e661e950bf15c88d428", + "libraries/3rdparty/mbedtls/programs/ssl/ssl_server.c": "5b3a413da632bec17f02940630bdb81000fff45143c77c581d42c62d183e7e6a", + "libraries/3rdparty/mbedtls/programs/ssl/ssl_server2.c": "471da8a6185b4c862cf7e468803c58b1dbcf609d9c15db1bfedf5bd6633f5a5d", + "libraries/3rdparty/mbedtls/programs/test/CMakeLists.txt": "54e985b61218cc5839e244563cae4e8aa1f99524266024d7ba01e5fb203766b9", + "libraries/3rdparty/mbedtls/programs/test/benchmark.c": "ad617ca373dfeab4ad2ffe66373f1ae58940d5a54e6d1461072930c8630caefc", + "libraries/3rdparty/mbedtls/programs/test/cpp_dummy_build.cpp": "698ccc1d8d12fe15ca8121b309ae098fe54299f4cbd9acfe97f7aa1bbc0382a9", + "libraries/3rdparty/mbedtls/programs/test/query_compile_time_config.c": "be5c728ab539767b2a26ce16a7efa87af4bc2e675571dd35f30e5e451b74af12", + "libraries/3rdparty/mbedtls/programs/test/selftest.c": "82ec5c01212ef1e2637ccdbd4f3fb44186d2f09962ba0e9657e330c456200efd", + "libraries/3rdparty/mbedtls/programs/test/udp_proxy.c": "54dd04cd48fdfc8324e1b238bce7e21400c85ef021ac3c32d168fbe2e20882cc", + "libraries/3rdparty/mbedtls/programs/test/udp_proxy_wrapper.sh": "a04ac0c08a0de9b716a6cded205a70825129088a2ca3510e0d1f5660c230d9ca", + "libraries/3rdparty/mbedtls/programs/test/zeroize.c": "8e48487f88e64c421ffd547ec8823a51b1e6f164a9f4c5ffcc8264b86462ff05", + "libraries/3rdparty/mbedtls/programs/util/CMakeLists.txt": "ea1ba02324edbbbecddc8bd1ac421a2d43c886c1cab1a01e1cd912ee27faa944", + "libraries/3rdparty/mbedtls/programs/util/pem2der.c": "501aff1215277aa2f63a8bd25430ff14ee9295e06f8fc2939022b700bb4242cd", + "libraries/3rdparty/mbedtls/programs/util/strerror.c": "a17425f629beb5261526799c5a3c6a27646956f6dd879a1beb5b7e8511aac32c", + "libraries/3rdparty/mbedtls/programs/wince_main.c": "806fe561b03ad9728a9f4423f0400d599c98a057276472d1490a6905c605a208", + "libraries/3rdparty/mbedtls/programs/x509/CMakeLists.txt": "4b68032428176f68769fd51f6856f3da57758fbbf532dcd6359f47001efaef41", + "libraries/3rdparty/mbedtls/programs/x509/cert_app.c": "456fbf1a459ed0f7fa5c7ab9e324a31171441c7209567d3cf61d623dbfe0c60d", + "libraries/3rdparty/mbedtls/programs/x509/cert_req.c": "e4c3aa98d15294115142ee621dc7e1e80dfcd629b9b171b9a262f16e01d4889c", + "libraries/3rdparty/mbedtls/programs/x509/cert_write.c": "cce5c3cda9df4e824b91508bdf170ec5af74b756892efaae0a982d3e5ad529b4", + "libraries/3rdparty/mbedtls/programs/x509/crl_app.c": "4de4afca0e83b78d135a8da399d132414c7122b10f298c7188818ec149ff6b6e", + "libraries/3rdparty/mbedtls/programs/x509/req_app.c": "cdfcbf7ef0eca953642ebe0505456b613c0ccc9a721861d83d28d9f84e16c8d8", + "libraries/3rdparty/mbedtls/scripts/abi_check.py": "e83df5c3bb791a7a855082b4c16dfcaf85393c59aeeb307e290d4e49c6535c38", + "libraries/3rdparty/mbedtls/scripts/apidoc_full.sh": "40fdeb98dde820cd3ad45ee8adbb69c6e8de3ef1861943054b2a573c0db62783", + "libraries/3rdparty/mbedtls/scripts/assemble_changelog.py": "5baba802fd04d2c7d2d070cfbd8dc1172fdae60e14dc2c79bb60807195273bb9", + "libraries/3rdparty/mbedtls/scripts/bump_version.sh": "800dd8c11a883058bf7dcaa01130736c21a4183202075b99d3977a5c558fe600", + "libraries/3rdparty/mbedtls/scripts/config.pl": "b6189d7c5bf3d61b86feacb73903cc2b2a7ca1af35f53d2b2a208e315750bb71", + "libraries/3rdparty/mbedtls/scripts/data_files/error.fmt": "da9c7207db0d53c7f65a5adc4f3d5b182e6bb52ebfb56b23c2ac3032aad4790d", + "libraries/3rdparty/mbedtls/scripts/data_files/query_config.fmt": "66aee385189e99ee5de28eb157e226660cc658d9b122dca896d07b39e5c73a2a", + "libraries/3rdparty/mbedtls/scripts/data_files/rename-1.3-2.0.txt": "2366f726f5f76d66158a187633ba24187f06fc6126af1685b16ef26965a29d11", + "libraries/3rdparty/mbedtls/scripts/data_files/version_features.fmt": "791235bbfd7737683a4c462388a31f0204a716562c9bb4c19fc33d6a68496187", + "libraries/3rdparty/mbedtls/scripts/data_files/vs2010-app-template.vcxproj": "70eaa8c071a05964f866abb19547f178d03a017d09546c191f93b33bcfc48d2a", + "libraries/3rdparty/mbedtls/scripts/data_files/vs2010-main-template.vcxproj": "2aeb88995c4db9539137130d44e7f712e03741465205d41be68d429c0868b769", + "libraries/3rdparty/mbedtls/scripts/data_files/vs2010-sln-template.sln": "f6ccbb56dcd55c1002967c379d07e9af4c8137bc5d4e25b1b48fad1102bc063e", + "libraries/3rdparty/mbedtls/scripts/data_files/vs6-app-template.dsp": "71e0444b6ab5ab8fe016622063b72392eb29f2255a6f4b527308f03a14fd63d1", + "libraries/3rdparty/mbedtls/scripts/data_files/vs6-main-template.dsp": "32d89bf331081f828e4008a2a1853688dc63fc2b3018f527fd2e221d31c8d111", + "libraries/3rdparty/mbedtls/scripts/data_files/vs6-workspace-template.dsw": "5ee39f91104b06bbbe9014b59d53f30f0cee435aa6edd225eaa49942d141afe9", + "libraries/3rdparty/mbedtls/scripts/ecc-heap.sh": "e50d98a5b3b49024b7c060b3d3b9cdf77cae88b7e05dcc93914a5e33deb2e40b", + "libraries/3rdparty/mbedtls/scripts/find-mem-leak.cocci": "1676446b4832d534795b4338b08261fc570fb3a66de328a05da1976769a626f8", + "libraries/3rdparty/mbedtls/scripts/footprint.sh": "0c96cf5e5e51695b85507203a90780e5555a4406abc729793d029c32e9115f57", + "libraries/3rdparty/mbedtls/scripts/generate_errors.pl": "4f551a92b6507c32bf63758c7e037e261762d2ff3ec5b99b7031f18f5956cdea", + "libraries/3rdparty/mbedtls/scripts/generate_features.pl": "351e88f3affe5420d7bd579d2224c2d7c60ee7bc707b58ecd0cb92dbaa4fb09e", + "libraries/3rdparty/mbedtls/scripts/generate_query_config.pl": "4fb047403424badcfb2b2427aaab2a160330f1aee8281e00e18988183afa4c2a", + "libraries/3rdparty/mbedtls/scripts/generate_visualc_files.pl": "5947fa422abd780e5b28be0670a62d5839e1e8d2b6bb5f073d6de8ac91f7be53", + "libraries/3rdparty/mbedtls/scripts/massif_max.pl": "2cee4491ee2ad543bf9bd3750039a74b865ebe4bb1564f3f08c40c20b3438f98", + "libraries/3rdparty/mbedtls/scripts/memory.sh": "0538949b51fb715ec37f6c68fdfa0abe7484f334d9f5ae221f51ade08cf46011", + "libraries/3rdparty/mbedtls/scripts/output_env.sh": "b370d9067b47164afb47ed57adfb7c6f1d1ee4868f172bec432e29e7cd5f02a3", + "libraries/3rdparty/mbedtls/scripts/rename.pl": "9629332866733098f5b92fdf63ec6eb3a98a57e974742e1d4dff922e42ca79c2", + "libraries/3rdparty/mbedtls/scripts/rm-calloc-cast.cocci": "6333b31d5e254449cf8e9127da47cbc5cdd341c14e93d06aa485952ac7987d29", + "libraries/3rdparty/mbedtls/scripts/tmp_ignore_makefiles.sh": "fc2fd053da9c0d55f854d9bfa60e4ae783155993e42c9d2af2c53bd8ecb54d55", + "libraries/3rdparty/mbedtls/scripts/windows_msbuild.bat": "3a8e5605e23fedf7abbc3d4efe42c9cad06f919a590b94a2e578ea29a5a5fe65", + "libraries/3rdparty/mbedtls/tests/CMakeLists.txt": "753aeaf0e7c2e94960cddda69e11b33e571247e79fd1b25428278df9136c5078", + "libraries/3rdparty/mbedtls/tests/Descriptions.txt": "946e61cc0c477b1866d977ca0c8989b84c062015e38879d4cb0b91a24504732c", + "libraries/3rdparty/mbedtls/tests/Makefile": "2eb90437d5ab9fd430122f72321fd420d77e107a12e7ca0cceb3c46034310384", + "libraries/3rdparty/mbedtls/tests/compat.sh": "af6980efa632ede84a5a63fea52ee1012e021ad0a315017d290798ae66fab322", + "libraries/3rdparty/mbedtls/tests/configs/config-wrapper-malloc-0-null.h": "a9935dbfc19cfa41c4460a0abeec578c02dad79d50a583235ef22625698be165", + "libraries/3rdparty/mbedtls/tests/data_files/Makefile": "ad5990d3bbcf29521e7f630c7b8cb20aafd10c9786ccaa027514df0cddcd37cf", + "libraries/3rdparty/mbedtls/tests/data_files/Readme-x509.txt": "8d472178fccae62cb49fd37c5e4792d48277f58aef9d7415a8db335e7dad8360", + "libraries/3rdparty/mbedtls/tests/data_files/bitstring-in-dn.pem": "a56cb4555c1b735454efe2ad7fe080ba9df5df0119aa6b3ba385ff6148ba895e", + "libraries/3rdparty/mbedtls/tests/data_files/cert_example_multi.crt": "7e197f7d2400a69059756db678f0ededc07566fbb3f0b25f235a496827e1cd5a", + "libraries/3rdparty/mbedtls/tests/data_files/cert_example_multi_nocn.crt": "70d06e5a114da637d37d1f733f7f7b1ea99d2ef4743d02c3710fe6d81089d699", + "libraries/3rdparty/mbedtls/tests/data_files/cert_example_wildcard.crt": "2716a0cc21c9a5678b0ad5075ba1a211d7e3e2b621444e3156f901cafad027f6", + "libraries/3rdparty/mbedtls/tests/data_files/cert_md2.crt": "dca8fddabcfba841a9c02e2ef71f2f0b8e553531e8342bb37a47bf723710d4ee", + "libraries/3rdparty/mbedtls/tests/data_files/cert_md4.crt": "c8cd9e7909929678b60d9cfed28b8a71d56e2c8ac05f7be4da480722fd8d086e", + "libraries/3rdparty/mbedtls/tests/data_files/cert_md5.crt": "6b58c44889984514f7f18583138d831a8748ab0b193dabfed9e23bcd2962a3c8", + "libraries/3rdparty/mbedtls/tests/data_files/cert_sha1.crt": "d09400b2d5f1d189ad1c1745a5dcbfbf0c9e8223e57ed02522bc87ce3d092528", + "libraries/3rdparty/mbedtls/tests/data_files/cert_sha224.crt": "fb968a970027efd0317e94b50e2fe9e515a0404dcd73ba7ff86cfcd1d60adbd8", + "libraries/3rdparty/mbedtls/tests/data_files/cert_sha256.crt": "ffe3451b0aab5d89707e3dd706538c7df268609821f9ac71fbae804fae9ad74a", + "libraries/3rdparty/mbedtls/tests/data_files/cert_sha384.crt": "34c4d6e82b7ddaa6ba01cd9b6f0c3caf3dbaff320b47f770b6e939524d99e5d4", + "libraries/3rdparty/mbedtls/tests/data_files/cert_sha512.crt": "576836345a9ef43b29f33eaeb64de06f9bf95b052ac72463e7f1f77f6f9be0fb", + "libraries/3rdparty/mbedtls/tests/data_files/cert_v1_with_ext.crt": "441bbf74490e5e3c271770ba6907ceb8315ba3b3880203ae9ffb6c345b4f56a0", + "libraries/3rdparty/mbedtls/tests/data_files/cli-rsa-sha1.crt": "866a735d2f8e4913cbffd83d7f566f243e122ae4589f7440a8fe44da35b1cda8", + "libraries/3rdparty/mbedtls/tests/data_files/cli-rsa-sha256.crt": "0c9f037835a71595ce7e450b2b478852a3faf8f20ad8c680c9475d7f5c82355c", + "libraries/3rdparty/mbedtls/tests/data_files/cli-rsa-sha256.crt.der": "54583e3f6b904cc7d15940b84510df367493e85b74e273b0c7fa06e9cbdf762a", + "libraries/3rdparty/mbedtls/tests/data_files/cli-rsa-sha256.key.der": "c9af85bb77cb430f57ee1012b3af2aaebe8ae7263a618f19236a09b686e5b615", + "libraries/3rdparty/mbedtls/tests/data_files/cli-rsa.key": "660d13287799f69599adf0aff1db46ee42b4c492b0f153f620f89a639dcb8f7d", + "libraries/3rdparty/mbedtls/tests/data_files/cli-rsa.key.der": "c9af85bb77cb430f57ee1012b3af2aaebe8ae7263a618f19236a09b686e5b615", + "libraries/3rdparty/mbedtls/tests/data_files/cli.opensslconf": "93f28a0072b7049e317380f80080256d336381b5dde799b6560edf5b9fda4bc3", + "libraries/3rdparty/mbedtls/tests/data_files/cli2.crt": "e36c9f3a7036f6f5c7853c772a6b519f03c285f7e533af20ab2b95721c2179fe", + "libraries/3rdparty/mbedtls/tests/data_files/cli2.crt.der": "d2ae3024ffc46e785163539a421eb7eaa046126505212937863d510493e6dcbc", + "libraries/3rdparty/mbedtls/tests/data_files/cli2.key": "f3c47ba835345e9072b0f79628f2d1f539f79749b85afb92bfade5761fbd6757", + "libraries/3rdparty/mbedtls/tests/data_files/cli2.key.der": "557e06381c7e6448cd0d98c664172f6c143dd93cbc0e0d54561bac06fe86c62d", + "libraries/3rdparty/mbedtls/tests/data_files/crl-ec-sha1.pem": "28e158dd3910193eab15911cc39694544a8b0f5bc766e3e1da67f4ac434f9392", + "libraries/3rdparty/mbedtls/tests/data_files/crl-ec-sha224.pem": "907bd1ee58240b7c072e91676f0ebc9702a04d433bffd2384e69c05f6a2879f9", + "libraries/3rdparty/mbedtls/tests/data_files/crl-ec-sha256.pem": "929e7b1adee89d708c200ede454138ad787ebaf7b6de476e1d4faf3b1298dea4", + "libraries/3rdparty/mbedtls/tests/data_files/crl-ec-sha384.pem": "acba589402ef11c7e0cc2dada88d280770644029253b864779fdc5993ec4504e", + "libraries/3rdparty/mbedtls/tests/data_files/crl-ec-sha512.pem": "5e375a364c072b4ecefa09bdead1688a246ba0564be8dc87cd95d23d4876a4b0", + "libraries/3rdparty/mbedtls/tests/data_files/crl-future.pem": "c5c94eae1aca9509707811469e93f3acb7aac48847a2a0e2d9e74b56bb2e43ba", + "libraries/3rdparty/mbedtls/tests/data_files/crl-futureRevocationDate.pem": "9b87e8301b06cafdb544c6c5ff4a2736608ce6d2653e315c67e25272e3b5fcc6", + "libraries/3rdparty/mbedtls/tests/data_files/crl-idp.pem": "5de822f1b4f62cf742ae8b1a93acf160b988e8ba50450999d967ef3871b83a13", + "libraries/3rdparty/mbedtls/tests/data_files/crl-idpnc.pem": "ee36535dd23db1177ed5a52a409aeebbd9931d69da353e35f71e41bedfac52e7", + "libraries/3rdparty/mbedtls/tests/data_files/crl-malformed-trailing-spaces.pem": "93a6e9fde6b830aec66889e35af36c7a2b6d835992ac463ef73deb28fa5c54a6", + "libraries/3rdparty/mbedtls/tests/data_files/crl-rsa-pss-sha1-badsign.pem": "129c391ec45028057e8138f036e9864ec32a0189ab7432efb08478bee5f73880", + "libraries/3rdparty/mbedtls/tests/data_files/crl-rsa-pss-sha1.pem": "edc1bffec8a145087e6f66360584897b060a0fd3582f0143576f643ce0fff637", + "libraries/3rdparty/mbedtls/tests/data_files/crl-rsa-pss-sha224.pem": "637b7a8d60309f66f89a9ed9201ffe7618aa939d66fe630540f17e1704b923d4", + "libraries/3rdparty/mbedtls/tests/data_files/crl-rsa-pss-sha256.pem": "a1912cb8804562ae2dbca1ae10db45b4180bd70f56fb1134534b396234e5b247", + "libraries/3rdparty/mbedtls/tests/data_files/crl-rsa-pss-sha384.pem": "5d9144f238c0aefc2d0bf5293c3ab09203ab12919fb6173ed634d8e42bfdbb54", + "libraries/3rdparty/mbedtls/tests/data_files/crl-rsa-pss-sha512.pem": "7df28c03ec8286a8d00e3dcfa545a02d7885266dbd349c3c57e29a000478c6bf", + "libraries/3rdparty/mbedtls/tests/data_files/crl.pem": "07de7d8ec2532782314fef2d0fe7874df39afe551307873dc9acf862775c5bce", + "libraries/3rdparty/mbedtls/tests/data_files/crl_cat_ec-rsa.pem": "35249d4f945676d93b16bd9f15c7456ce9d774b52b524792497dab97b0432cd9", + "libraries/3rdparty/mbedtls/tests/data_files/crl_cat_ecfut-rsa.pem": "a62d024a1b8d82fc4011c4b3cf12b19598d8be72d4a10927f38f14da7710965d", + "libraries/3rdparty/mbedtls/tests/data_files/crl_cat_rsa-ec.pem": "a5fad1b53645e107a3295471cfa65631abc2718e0cac775cf97f519fe31a4c1c", + "libraries/3rdparty/mbedtls/tests/data_files/crl_cat_rsabadpem-ec.pem": "9b930fb641b1f042f873cc141eee7d29595aa2260116795af4d73517ad62aae6", + "libraries/3rdparty/mbedtls/tests/data_files/crl_expired.pem": "1c84a41b8da15aa1124f6479adfa6cbf111cf8a391a0dc7a2a9a940c30d3a5ef", + "libraries/3rdparty/mbedtls/tests/data_files/crl_md2.pem": "63f35ba431a5b98a8cccff50370f2a983052c0db8a244cc04ef37e4fca85e2fa", + "libraries/3rdparty/mbedtls/tests/data_files/crl_md4.pem": "b685416723dbad577b8e42b6bfa10f980be09805ca591c69c64d1b8a09b177e8", + "libraries/3rdparty/mbedtls/tests/data_files/crl_md5.pem": "8a3d0a4a56a6f8543f50059a6ac0d7a7d0c3fa3525d5f82bf68861e59f57f3f3", + "libraries/3rdparty/mbedtls/tests/data_files/crl_sha1.pem": "f98c02f1ec6a5a2f63fda160f8a7128021bf8b791b460d3404b171a57224051e", + "libraries/3rdparty/mbedtls/tests/data_files/crl_sha224.pem": "1dd5ee3c9d4efe7aacd278b933c613b901bf35c9d9fccad7b928a3ac1b3a301c", + "libraries/3rdparty/mbedtls/tests/data_files/crl_sha256.pem": "6003430f0ae6b4338aca8d19d431b5f7e1e7168f55d02b55b81597eadcf5286f", + "libraries/3rdparty/mbedtls/tests/data_files/crl_sha384.pem": "95cd5a37e5bcf335efa400e13b50cf0c4c2baa470501bda1110624b805fbdf82", + "libraries/3rdparty/mbedtls/tests/data_files/crl_sha512.pem": "091fe29daa3919c518c0590a48f86d690b3f1aa24b3650d58347c00dde61acd4", + "libraries/3rdparty/mbedtls/tests/data_files/crt_cat_rsaexp-ec.pem": "9d7b3df09c803ca77f07720a9dbef99c0bf76ef00212e75fe7f9fdfdb30c3f94", + "libraries/3rdparty/mbedtls/tests/data_files/dh.1000.pem": "e5fa5946d438a33a41573170681d5edd37028ab561774d3cc141fe6962aa4c2b", + "libraries/3rdparty/mbedtls/tests/data_files/dh.optlen.pem": "0a3b1ad06c9aa232f407da2c9557ebb252e35e8df7fa8b01d67be96633182e6e", + "libraries/3rdparty/mbedtls/tests/data_files/dhparams.pem": "93108f830ce1ffc74ccc5c0c45d74d29e2f4e0257bdde8b7d48875eefc12a1ab", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/00.crt": "558609858840dc17a9da804634afbf99424edb8db59ad99dce3687691785be67", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/00.key": "cd88d1232e351058359b9aafa390509951c1a0c6b00b7da285009d910e83ce1d", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/01.crt": "d5a0f0ff62316c2704cce682a6640c78792325d224fd41241dc11960a2a9688e", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/01.key": "c20a5c6eb77c8cf63543107c06dcdae2b49f01622e2d10ce6dc09e59397dcbeb", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/02.crt": "1869b8a995dd86666cabbf176e522db7757193f98543effdf188fd5fe569fa17", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/02.key": "14e626f8c189a5ff349d8efe35d7c357b75c59c1c267526fcac878743aa53d78", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/03.crt": "f3be18625e10235fef73c6de3c4fe1d62a207a2826f87d02749f2b3ea3aa858d", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/03.key": "a04dcc41508c378372d26098665de22c83a63a76ccd1c2533eebe1bf1b9555a1", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/04.crt": "de78b79629f7a6ab401a48d61339d6aedd2f6a553ae4c8c36268f71b0d24f9e7", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/04.key": "28befb1d41f11edfff3c447914acf25d2f620009c184ecd75c6a1a120b24f76a", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/05.crt": "af5679a5655a6db92618c0b103d2e69e869e6effc917df13600754a2cfa2c259", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/05.key": "39e58ffd6ccad062dcbd4b4e3cb1ac31aa27eb378fea6e302de2785c0becd276", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/06.crt": "aaba17838cd6669deef4cca0f0e0b504e8fcaf57e54d19d501a9edf9d8361884", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/06.key": "4c48922433ed3ecd9df09a530a094eefcf61aed3a979c50c138a260a9fcba808", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/07.crt": "9ec6ff17c6f0c030cc25712329f31d0ec3fb7f887ee10ae130ab888693ec6c1f", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/07.key": "54e16d5b34cef77bbc747ea32cdea3a512ddfd0c97e0a2856f2e9fbb8224d3b2", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/08.crt": "2570b5067bee9ab0ac87a7a49d9460120e5e06d85204472a973c1e2d748b5e18", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/08.key": "eb9dc2fb50847a846ad4f36e87c8aab98964e3c4cd3cb5a270158a2352022ee8", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/09.crt": "dcc49f4d753060f11ac645a661e2fafe122f33646acc808d472678ac824ae167", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/09.key": "ea99373ba8ef0158a51790aeac4a17fc02929be89a2a41b509c1be7fd6cc7310", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/10.crt": "094319da4d3a8702483b88ff111fef9bbbf9ea6452deb2421820ac0408aae81e", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/10.key": "74414a3cebefd13ab9d5d6a3b0c2895c39f04deedece9e9b564041d448b49a71", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/11.crt": "16a2d5c046d9953e6782cf6c1fb9f12e4c2e5af2be0b45aeb95292e36b2782ed", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/11.key": "a969b40ed5608775d422fd77636b57c8ae7f7445aeaee4bc36171d37287d6232", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/12.crt": "83def2adceffbce4e823b26d30aece634f65234ff30da599327866180a5dc21e", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/12.key": "86213c8881730842dd39b5beb18eed0bc359576faebfd9a3284e82c9b917985b", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/13.crt": "61d4ecefc25b47d22907effb3b2777db2a92fe74a5da1e45982593de0462c37c", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/13.key": "3adcac5db34bac9243e241cd3d411c408c40c072a0640736e641b2f5770fa22b", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/14.crt": "f69c6bdc9f951170183aeb916efc9b33a6f4c393c3431c014b2cf066f0d4ef73", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/14.key": "e2be9d236ea1d90882d8bbb1863544a3e765ac0916870ded784d89a660d35f42", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/15.crt": "e7ff71176744b78d63e305d665f9bda2ce6a052bc774c72e59473da94e86a687", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/15.key": "25f574ba3a37d6edb1b05352976cea0f8e5d42dd222fe86d30fc640daed78c86", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/16.crt": "95dc0c5c32c7b8cec9f3adfe98838b7de74187ba79f7e228e0b8088d85e01b45", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/16.key": "f78786f4534f25e2effd19746c481f8c795347eb700bf0584a046354054430e8", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/17.crt": "c07d3fa651f1b8e3b0fd9c3841ffeabab1a17f8a76f735b45c1c14dcf2f2f7e8", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/17.key": "cc1e209a9cda5fdff62cf61628cdfff437a7301e483ff0bb339c544d6a420b26", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/18.crt": "4ece74c31247ec25e9275064db5a9438b2d134b48318f0a2b2b0b9a49ac85982", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/18.key": "fc91156511ae0f490825d3c170a2a708f2b0c8107124bc0fa703dd19c12695a6", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/19.crt": "8cb73807d9c53caee9487e713232ac69694092ad5a6d51ff8db37bb9dd56cde2", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/19.key": "5ceabbe6c1af30a28ec8d0d58a4911ab557304e5fb84a90e7a1cc48a33f576f3", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/20.crt": "09bb73126d3698ab939d469f075b425b4172d45b160743cfc50c137f876a6cd7", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/20.key": "a7fc55a3a918fd5b46d9ec2c166a226c361e1e6bc5ac39a33e97c1d664a17715", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/Readme.txt": "89a5cf249f1f1db829a748a9e051ecd9014d448f1f6083000f7a63ce7e7006b0", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c00.pem": "558609858840dc17a9da804634afbf99424edb8db59ad99dce3687691785be67", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c01.pem": "fe9151449a7925f644a2de6d4c242bacdd4e01f0182805a3a09fbdb5a887230d", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c02.pem": "5d259cda21032c86b9dd371264577a4ec6b8f0d652729ba0aeefe99ee8cd59fe", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c03.pem": "0f7bf5e1070c69e6dbf1755889f62b92a329e67233f91407cef9bf934d8cd224", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c04.pem": "45a06b9e7cbf5e5a83725f5e524cf905bd8710dc6e20beabb3ccd5212fdb5232", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c05.pem": "f73789e296878cb979abfb9c0829da492b4729cdd3d28ae2c06b6e7976ca0154", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c06.pem": "07077d1c4a9a444e187e4a9b00cce1acd5ac8135ffe8bce9ca03e334f680692f", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c07.pem": "a417f92841ad64c79207afe8f858d8d4acf44a658451869b2b700cfe4c80a0c7", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c08.pem": "14171c21db9d34cc0984f1f865cfe6cbda9ce3743df4dd2d159767e8532fb016", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c09.pem": "5912ee75858880857a48f1b4b1f5f5bcebe0fe41642198ae0a0853d56c8e9157", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c10.pem": "cbe574373c7d1989baa1b67249ddbd467f1f0882fe68c61191160ced32b607f3", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c11.pem": "8194cd820d069233b2ff62126d19e0e2704030acf20b8f424b39bbc8470d7fa7", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c12.pem": "338b7d86776b4e92e14fa9fa59e2eba86c8f7cc35b0fb79c1d0530088440c9e8", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c13.pem": "389cc52f557cb4fb23926dcbdb4f905ea8cf241f7807321caa90f1c11f919aa5", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c14.pem": "b9acf4c1a26e4a88fe206300987f4a377770e74cc6e524f36a46313f48cd896b", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c15.pem": "703fc1e8838a0fff288d2c079c01d63724ffa3a65aba80e3a985bf8768f5e462", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c16.pem": "569fbf14527ef2ae42de5834d7b210539b040603bee91422b06167843a0e6729", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c17.pem": "c1f325141c11a37292eafcde2a310c5cefecb1062a5e282376105d90851debf4", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c18.pem": "e16bd5f39ef8013b0c48843db8334a450154f75dc3bca0c36021cc752369db38", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c19.pem": "f7896c40eaf4afa3781757083f2aae5239e9ba164da488bff63cac87ad2417e8", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/c20.pem": "18a64222ea63f7b80b3b3a844a61065552712fd528edcbcd4f1cb8076a928ac8", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/int.opensslconf": "5db05d936789d8a7433abdab86a8925679b1467a23ebaaa6293f1f3287c53766", + "libraries/3rdparty/mbedtls/tests/data_files/dir-maxpath/long.sh": "86c14d0a1b264c69e5bac26fab7904d91146842eb7c0c7d71257fb32265afe86", + "libraries/3rdparty/mbedtls/tests/data_files/dir1/test-ca.crt": "d123b3e7e890c87fd8c7db00b464ca70755bb7aea105432f32e0d4e7724ae4e2", + "libraries/3rdparty/mbedtls/tests/data_files/dir2/test-ca.crt": "d123b3e7e890c87fd8c7db00b464ca70755bb7aea105432f32e0d4e7724ae4e2", + "libraries/3rdparty/mbedtls/tests/data_files/dir2/test-ca2.crt": "69ccb7250fc0fbc1b479dccd70d2561e33255086a0f4e4a8672f92e0cc8e754d", + "libraries/3rdparty/mbedtls/tests/data_files/dir3/Readme": "fac09c08823cd79f534a5f5ce76e05ebda64be718f6457d44e84928231f17225", + "libraries/3rdparty/mbedtls/tests/data_files/dir3/test-ca.crt": "d123b3e7e890c87fd8c7db00b464ca70755bb7aea105432f32e0d4e7724ae4e2", + "libraries/3rdparty/mbedtls/tests/data_files/dir3/test-ca2.crt": "69ccb7250fc0fbc1b479dccd70d2561e33255086a0f4e4a8672f92e0cc8e754d", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/Readme": "2bbd3bb85c7080f5745b528ce02b75b5a64aadfcde3cabcf06e7cf068b5f9246", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert11.crt": "d4f47ec1c0d4839eeae9ee8046bda1245b4f714f1a4753eed290efb4a6fa9903", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert12.crt": "e72d7bec40aa781c3c32af83ddfa072b0b0d2bd94a592754b1b05ebe34ec439d", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert13.crt": "55cc6168c43c0b72c7d01248b700a87cb08deea3b35e0e23930606e717b5e5ab", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert14.crt": "92d0c971e08161ca0ee52d3acc16287e31d24d1d3f2697490ef1f902588f3385", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert21.crt": "2d6c5926bf8f606b39933d88f95c3542c6cb7376af2201910c6aeff3e53224c1", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert22.crt": "8cf8a7f8e55e7f533988f4dbb0fcfef8b42f75c94a5fe06371b6cecaf5efd1e6", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert23.crt": "1d7dd79328c314c46169974f94269305263f4f3953e611f6965c510987a05516", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert31.crt": "09ae249d2d0f85a2d7cbdbd7ada36ed1b211ba009d3e48a82596f753c89fcac2", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert32.crt": "8cf8a7f8e55e7f533988f4dbb0fcfef8b42f75c94a5fe06371b6cecaf5efd1e6", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert33.crt": "e9aea2a62046c54110003c435c42454898ad6d3172e86be5c15fbdf845b047a7", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert34.crt": "5d8e5d9b45730b99ad6f0a695290996253fd09cadee34e6d093ed22b575b5d7f", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert41.crt": "80b0b7c00c4ed0e6281406b0182ae723ee28d0ac83ab916cff5a1bf40fef3634", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert42.crt": "5fbef827479243ee08633a600e8c14dc43d0454b2475e506aabea78f5a68d57d", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert43.crt": "e9aea2a62046c54110003c435c42454898ad6d3172e86be5c15fbdf845b047a7", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert44.crt": "bc1d4a8da29b153ba628b442901a08ea844040a3226f197162fae6b42a35efe7", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert45.crt": "3f38723bb879d875f42fe7e9d798e5618b0e7f90fa0df85e47b0f8b04b92bfa5", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert51.crt": "80b0b7c00c4ed0e6281406b0182ae723ee28d0ac83ab916cff5a1bf40fef3634", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert52.crt": "5fbef827479243ee08633a600e8c14dc43d0454b2475e506aabea78f5a68d57d", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert53.crt": "e9aea2a62046c54110003c435c42454898ad6d3172e86be5c15fbdf845b047a7", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert54.crt": "8f94e2b812adb33986cf91b4efbd064755518b76d3814ca1bcdb9f5e0dfe2690", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert61.crt": "09ae249d2d0f85a2d7cbdbd7ada36ed1b211ba009d3e48a82596f753c89fcac2", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert62.crt": "8cf8a7f8e55e7f533988f4dbb0fcfef8b42f75c94a5fe06371b6cecaf5efd1e6", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert63.crt": "6fdac8688e057f8531bc120b3ab9d6e288cfdf19f4d7d982746aa92c634e4b7f", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert71.crt": "09ae249d2d0f85a2d7cbdbd7ada36ed1b211ba009d3e48a82596f753c89fcac2", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert72.crt": "8cf8a7f8e55e7f533988f4dbb0fcfef8b42f75c94a5fe06371b6cecaf5efd1e6", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert73.crt": "0de79dfdf640b6cc736061799f6c1fa1a7d8aee09eeba43e11285375f7a15fc9", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert74.crt": "93de8e5ac8d25beaef072a43e5fd1767e6937831d745c62345dd8d6efb301154", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert81.crt": "0f4c48d44ef2863bb063e76c25608250a2817aa3270161e6c5cda322a43b3919", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert82.crt": "9de3b7854f7f803d98703f98b47dcfd0022359be5bb8fb4ba4f09cb68afb50a7", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert83.crt": "cd92f55a61ed691c23cc268faf7f4d6070a8a03cd3989f915453a6e51542eb19", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert91.crt": "6e4b75377ad27118072f6fe98239f609fad9f97b3de5b333a917e95c9e59028d", + "libraries/3rdparty/mbedtls/tests/data_files/dir4/cert92.crt": "e5cbf36cda413d2659ff53121cf1163099b4275fd3f77c3ce6427a9f0eadf1ea", + "libraries/3rdparty/mbedtls/tests/data_files/ec_224_prv.pem": "2c5f6e9a1466fd74a1ee2eb5f185abe903bbd67633a3bb3425ff951a5a17e181", + "libraries/3rdparty/mbedtls/tests/data_files/ec_224_pub.pem": "21679b5df0af750c766616866c695e8dcb93db4501d19a6febac7ff599d88ec1", + "libraries/3rdparty/mbedtls/tests/data_files/ec_256_long_prv.pem": "edbb78411c53e20a480854bd1c55e26668310d1729a0d7ce448138abe51dd763", + "libraries/3rdparty/mbedtls/tests/data_files/ec_256_prv.pem": "0405a70b26333c2555e31ae665c0a5f37c6cd0e38edf5695afe3638743bdd903", + "libraries/3rdparty/mbedtls/tests/data_files/ec_256_pub.pem": "77b4f55e6a1ea1db4c72a71efb973892ac4a2015a65be470d274da811d9d6cc6", + "libraries/3rdparty/mbedtls/tests/data_files/ec_384_prv.pem": "ed3a69ca0c5f4c62fa2c7b64951a11d1378abb72c3a3e439d7e06a9ec82c2075", + "libraries/3rdparty/mbedtls/tests/data_files/ec_384_pub.pem": "436ec39c20378dd1ae41765df9937e0138f4d724beec8062d4834e03da8cdb1d", + "libraries/3rdparty/mbedtls/tests/data_files/ec_521_prv.pem": "ecb4bed1990396b35f4cc0d3e2fa99b4e3876c89bdd05b691e0c02ad4b43b73d", + "libraries/3rdparty/mbedtls/tests/data_files/ec_521_pub.pem": "20eb17b9dba162bbb2e6055da194b23c91ec71caa47bc022f74f239eb8c0d711", + "libraries/3rdparty/mbedtls/tests/data_files/ec_521_short_prv.pem": "f82aecefacddd06e07012fca5751cdca618487c0b97ade4354e082900cc061c2", + "libraries/3rdparty/mbedtls/tests/data_files/ec_bp256_prv.pem": "0777db4161e8fd9cfcb0833486ea2992f1e173c22b53520e60799a905b05121d", + "libraries/3rdparty/mbedtls/tests/data_files/ec_bp256_pub.pem": "6fdc2e11f20df144d0b30a8227efddc13c13bc75a8ee7c3cb0d39a6dc7bdf9b8", + "libraries/3rdparty/mbedtls/tests/data_files/ec_bp384_prv.pem": "a72bd58d95029d0d6ab68219a29a25f107e235feb0543df7867e28e2a94f881f", + "libraries/3rdparty/mbedtls/tests/data_files/ec_bp384_pub.pem": "f68679ce7aa4e93e9f3acecfa9458fdc6f87a8895d0ea22c477db93c53226723", + "libraries/3rdparty/mbedtls/tests/data_files/ec_bp512_prv.pem": "9873530d30669de09947d05a9a111a38cd81376e2f97726c42250b958c6a1a0f", + "libraries/3rdparty/mbedtls/tests/data_files/ec_bp512_pub.pem": "31659f83a80457d707177c9436a46b4154ccd1c01f01c9de4685a7f8b59245cb", + "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8.der": "fd7e1a365af2323008b0195ec77a95ed9e59104fdbfef1639cb7022ee09c9a01", + "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8.pem": "c6bbe5affbf9a953c8d2124cb80fb48c2e9344b796d328e8c385a1aea5edde64", + "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8.pw.der": "a1e9f7ca94578cb5d21b71292c3a56a6e147751924b67820dd9aad9249b5ab47", + "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8.pw.pem": "d58913cbb587fca417bcbd8c2ec09c858206cee88de3a1351aa8601791066c82", + "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8nopub.der": "22d2162c7b342417c33034ac3aa56f79c01b9874a2df694db9ebd95542380ae9", + "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8nopub.pem": "9587d1d0e4c45c1601faa4384e1bd5634a37f4a86ba4fd85fbd7fc85ad110d20", + "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8nopubparam.der": "2a3381bab277bbca12f4b909335f7a1c13e46c19419c03b18a93be671bc6fe55", + "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8nopubparam.pem": "729ada4d58b82f741acfe7af2649b456c6b2c9f7297d202b83a0680ba4004685", + "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8param.der": "c4352a035ff6e0afce8f8b5f8358e10a871c373f93f3fef3b247245d8ba4d509", + "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.pk8param.pem": "609315a12cb3e58ab934a59c30bef3c835e835bc44244fb640d659f66b82dd8f", + "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.sec1.der": "c5eca7361e00be801678a707c5ca3c3b0dd588fbdfde82f1d29a410868f1c5c5", + "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.sec1.pem": "e4717c4b0e7e29eda161a63f5d778ce42e87e99e2ce8c440d209949f8fa49647", + "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.sec1.pw.pem": "23052547d6b30dfdd3831b5b38c5b11be5bfc90afabe5638b7799a1fc6c67d01", + "libraries/3rdparty/mbedtls/tests/data_files/ec_prv.specdom.der": "4ac48937c8eea09c6f541e8b27b6576276224301ff1c6a6781f3636604540286", + "libraries/3rdparty/mbedtls/tests/data_files/ec_pub.der": "f1b8c5f2626c5a823450e704ad8f7e47efbb3bc648855e0e3ecc471e6c7ff0a8", + "libraries/3rdparty/mbedtls/tests/data_files/ec_pub.pem": "85c0df2b3eb7e7149ea7ea1cc614f7c6acde945ca5264c2d5ec48a23a3c25419", + "libraries/3rdparty/mbedtls/tests/data_files/enco-ca-prstr.pem": "9d6be316630c2d1b2af5f07a0484b39b3ea0d001e2152436e0d3d6881809ba49", + "libraries/3rdparty/mbedtls/tests/data_files/enco-cert-utf8str.pem": "83a7513ea4c9e312e624d151ec1cb2c8cac2ae0db46d5bce813ec5b5d734d6dd", + "libraries/3rdparty/mbedtls/tests/data_files/format_gen.key": "dca1b0916b165817b00f17cca5baabb6cec36da42915d10dc1cfef66e8956c36", + "libraries/3rdparty/mbedtls/tests/data_files/format_gen.pub": "76b4975658959d263f2d4a4dfdd234151bbaa986dd0fb3127e30d67bb3d5db47", + "libraries/3rdparty/mbedtls/tests/data_files/format_pkcs12.fmt": "faf2b10722fe00c42cf53ecb3f73a926237da099f488dac79beeac62d45e4051", + "libraries/3rdparty/mbedtls/tests/data_files/format_rsa.key": "4be0c523a0e7e848d00bfd0f14df939cad57cd23fddbc88f637b8dcef84844d9", + "libraries/3rdparty/mbedtls/tests/data_files/hash_file_1": "975d0c620d3936886f8a3665e585a3e84aa0501f4225bf53029710242823e391", + "libraries/3rdparty/mbedtls/tests/data_files/hash_file_2": "11fcbf1baa36ca45745f10cc5467aee86f066f80ba2c46806d876bf783022ad2", + "libraries/3rdparty/mbedtls/tests/data_files/hash_file_3": "9ae4b369f9f4f03b86505b46a5469542e00aaff7cf7417a71af6d6d0aba3b70c", + "libraries/3rdparty/mbedtls/tests/data_files/hash_file_4": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "libraries/3rdparty/mbedtls/tests/data_files/hash_file_5": "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0", + "libraries/3rdparty/mbedtls/tests/data_files/keyUsage.decipherOnly.crt": "b704f88c55cca613eb99d8669eec61d5ccd8d17d79b3873497fc9819869a9289", + "libraries/3rdparty/mbedtls/tests/data_files/mpi_10": "a8a8e03559b9d8bd1ab263ed74f56cfdc255bb1f4d68c6d75740574aff1d47ea", + "libraries/3rdparty/mbedtls/tests/data_files/mpi_too_big": "1df9e1532ab98dc1592bad8cdc8ddb439820ee7be4fdd5bf66e809f04dd50702", + "libraries/3rdparty/mbedtls/tests/data_files/passwd.psk": "ced9f110932d025ad3b20f9f8a711eba701f83d4b776888b2f310b9a15566cbd", + "libraries/3rdparty/mbedtls/tests/data_files/print_c.pl": "ede2a97f4090ecba0574cf6259b8a7ac14ee72582a7f9d3818d4618e76ba737f", + "libraries/3rdparty/mbedtls/tests/data_files/rsa4096_prv.pem": "fe1368dfb5816c1697ff7842aa4da44fa0961aac16dea803f7b0b1af922f692f", + "libraries/3rdparty/mbedtls/tests/data_files/rsa4096_pub.pem": "e3afcd3274efeb06a3354eb8346a20f3cbcb58025b8a11cb485e896507c4fc64", + "libraries/3rdparty/mbedtls/tests/data_files/rsa512.key": "799d813958afdbab03c10fb91df109f7d7ee0d9affd2282cf050600d50b97d44", + "libraries/3rdparty/mbedtls/tests/data_files/rsa521.key": "4bc698df7312e5ea0a9bda75bc876d16a25a30dbd6d34483b3252ce8224ddf2d", + "libraries/3rdparty/mbedtls/tests/data_files/rsa522.key": "aa458ff31c66c8f7af7c6f07418ac9479bc9aad4d8d1e5128f2d7455ca52eeed", + "libraries/3rdparty/mbedtls/tests/data_files/rsa528.key": "614f9aec7348a481cb5477c47c3bf76d6af8f4a5f21cc875a8efd026c3bdb085", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_1024_3des.pem": "2c387321062ad20d5eff5ec30ba57cde1b1788253e315cf3fef64d896dc6141b", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_1024_aes128.pem": "5032455d9ae5bd96fec4a14b409d122101ad3f074a29b6af28f67c7081a82366", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_1024_aes192.pem": "2628892185635e4f459444f7f5d17dc9f3b0009095d12a11c634bd3a333e4aed", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_1024_aes256.pem": "5dae5ea1714082b515a073ec930d9ffb3294ca2a12a66d131cfb5b35489aca78", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_1024_clear.pem": "0112d73365e459106014ed440d6ca6d45f234370939790e21e9267bfb073bdb4", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_1024_des.pem": "08e9aa7dbf581581131532213ede5f76222efb3c5df3e1d8e9d21f77ffe97be4", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_2048_3des.pem": "7576eec37b28007c0fecc1023ffc0cdd51c5b0964f9d02aa1955774ba9f06fcb", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_2048_aes128.pem": "ee8bcbff13d7f58c5bab527d72b793fbf2085a568ea25af446017f214531dd17", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_2048_aes192.pem": "d24c88836bc1c4cd35734e9fc252ce95f07cf4ef3eb45726ada77b82e3177bc0", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_2048_aes256.pem": "182681da70e9eeb1d1508ef4746763fcf14da6eebd414bea090717c0f830e52d", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_2048_clear.pem": "3e79c3cb57eb569c4271f69b90b3f9475b02d32b835c91f29786a02d5c04a510", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_2048_des.pem": "42183ce524fc60c316f9eac695c30e758d295a0c8013788053c6c43a6ac7fd36", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_2048_public.der": "f9020011c92bc526c75ec849ed15ca63c12d64129cd6b3fcbc5e4fbd9df9b810", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_2048_public.pem": "3c28eea66473c3d3ba126da0c8d7af98e00d1d2f8e7d00a7c55e9a2c5119a850", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_4096_3des.pem": "a5314e0d8e9ae1e34afe514d9219d507c1f018156bbbcd9ec36a5a935f8186bb", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_4096_aes128.pem": "7d544b8d1a6f552c90e4db19d84744b316469d8d6a4eb31e6ce9c6abd8e87e57", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_4096_aes192.pem": "1a05e9f1f7152126eb08dffba59841ee525319b46861ee3ed526c687195bc95c", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_4096_aes256.pem": "cc66bcd61806a601f33ad93a47a53f4785470e2fcb3ded30a77611b1876cd05f", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_4096_clear.pem": "c6ecb3e03f0920f35453d72490e1139f11ecc38a19bd6a1cd89e9004779a372d", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs1_4096_des.pem": "cf6d0a97cd7750310bedd61e505ca57cbe585c33f6f649426e661551a37ea44b", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_1024_public.der": "e0e4deb81619f62ce2f76795a2f1c49c53c641775c66ae5fbbfdfca7f459442d", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_2048_public.der": "b6cc4647b75d49cfdf45b23ce11aa981f122bc37dfedb0c34cd9cae1835a865f", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_2048_public.pem": "484598e3aebb140471ac33f1b7ad5b404b2264565c0bc3da4d0a5a2018efe004", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_1024_2des.der": "1528b3dba6da80e638cdba8f5b6c078d2012a478e7bd46b6337b2fd362afebcf", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_1024_2des.pem": "7af1096ceca43dae032b481d883e553fba9f222fea125144add0be3b990ee190", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_1024_3des.der": "07a45d24466d4451387f3c11631fee2a7a569d799b6bad4a6ddf8f833e75699c", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_1024_3des.pem": "1971878eef033bd7848c08b815398671a58e8daad5ed01c4afb13205199126d9", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_1024_rc4_128.der": "e37a91a67712970039dc97fef17d876e98095a42f98022624d1acbc7109dd84d", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_1024_rc4_128.pem": "80171741dd3fabb400c2b3e913c1ef2ad24e542f40ee8cc789c41a82958ba969", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_2048_2des.der": "5408d3b730a49b89454651bb2fa431b67215fcdacd8548af5914f1ed0bb786cf", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_2048_2des.pem": "50c2f177ca4d72d06bef23514df39c1d59ac317b7905eff5d73452f22b5fcde2", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_2048_3des.der": "20f9635cd74121e7f40099585ed44e3df6fad7d27b594b71e4a4cb7f931802c0", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_2048_3des.pem": "cde352fa9773ed8fd8888f9bb69d33a1b9dd13dab18f58620f9106b27d603c7a", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_2048_rc4_128.der": "993453b973c65b34d97e7bb1179f9d53e05def19ae6ff1bd33f1cbd85b8d44a3", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_2048_rc4_128.pem": "9fd1378fff6967d5fb74c26cfe5e311e9f1ecd3d8041bc195b1f94caa8ea003d", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_4096_2des.der": "0135bf69430620321b84534a898ae23ca651318a2fbf4f847ee4d8a98511e5e3", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_4096_2des.pem": "7577944396863a97be6fae436361303947778616d165b687b319f9353e80d4dd", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_4096_3des.der": "14900c8e0500418775322e7d7ee4d666c0dac142630479fc9b3788c9c899968d", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_4096_3des.pem": "9a37049edb24ddbdaa1a65cd374068bca32d0049048e88c8c6e38094924213d6", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_4096_rc4_128.der": "a0b2115bb99a823eeb0e0c9e29786bd426c2e4ab192680030cf36866f7300ff0", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbe_sha1_4096_rc4_128.pem": "83e49de7ad3ae1b312f3473a435e14448b5627c5bd0e029ce8917693d878acff", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des.der": "377485165326983aa5a84efeafbaa2ab2bfc6b2ef26b7d0cb0ac62a6e76c4333", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des.pem": "4a89853da284ffc3faa351fd7590af5cf161818c1751140317c63dcd66e759d3", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des_sha224.der": "c7595eb54ad5ee1124767a49156fc1279d3bd63d1745f16666e0df2c88c82612", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des_sha224.pem": "085440d612122680999baf05e4efe8a196f5c39422a2a6c97093e49ddd93f911", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des_sha256.der": "420f7d15d7123478b22d2a0cdfbca16a65809e9e98c4daa1bcf168f348e7f971", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des_sha256.pem": "0c9768289c6b43939c29b864bb984b42c9011c88fa8494f3856ad284fa5edf88", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des_sha384.der": "212264f9eef95b72eeb5777b95e0a042e78180d6749f79938c58bc70d928cdd8", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des_sha384.pem": "740a53af16f5499b17a9b2e59e839f2b95b3669238d631ef06aed63cf8135725", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des_sha512.der": "47905380c77231834a773dccdf06c376fc294a1e13b59f6727196db570f4319b", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_3des_sha512.pem": "7533d5a146e37001dc57d1f53e8a38182e3925747bf02a1667331332f584709a", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des.der": "09ce34140f0fca9c73c786a90c883351dcf2c22713538dd70af33024c0af0860", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des.pem": "708e7466c2c45ba4681528d62b598a708480eb8fe8b28025e53cf340bd12c55a", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des_sha224.der": "9172bd5c29dff754d8b2dc094fb402c0db98445f77beb99865513badee29ebd2", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des_sha224.pem": "7c80e405d73324a7145ce944f1101275ccdaa2d33dc67d5a5c8e0ad53299709a", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des_sha256.der": "aebdbc8324265dab166be334ff9fa2d4201bfd5c8b70d0907878451ad4d8fdcf", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des_sha256.pem": "98162c6a985e733250cdb9a717c57560ea48ae804800020b997bb9cc633f81fa", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des_sha384.der": "fcf617efcdabb117988a32e5ec0291bfca9116212412d0343bfdd077aefd7a65", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des_sha384.pem": "8653bc8407ef8d9f96b46b1ee6342210234eaf4b5a947acb7807d9f79853a3f5", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des_sha512.der": "1459b5d3cbce943f56f01d69ee2ad2f40877638be699486c8805e7ccd01cf8fc", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_1024_des_sha512.pem": "2d7a6c0e119bce4a94717956ea740989866046bf318454c5ea501975e2c16094", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des.der": "6cf06096fc2e23a82f4f70a7197efaf8f148e02ad450cc8ac7a9f3dc4334d85b", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des.pem": "d15cba2d636473deca31d86aeecb0197c966f179910b3b86e92736227146752c", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des_sha224.der": "95bff3dc143382f6c5de5baf2f72e3f41a0da2ef308f613b25312034c3740cab", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des_sha224.pem": "a14337e04dc979d9a3bf67a7c14376568b158249cfd904b91f863f821d811415", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des_sha256.der": "2d502dda0c522d92ccb5b946ea29b8733e682cc4298cf4a6eeb5f0edae0e2109", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des_sha256.pem": "f2c46ab52e1f0d2eea7b99dcce07fef029472bd43444dec83a24da7517616fcb", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des_sha384.der": "5f9b98613a34b6637f556c963bd6bdcde74bddfabf0a6dac048109f63c0d75ac", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des_sha384.pem": "df6de7e2ed97fd20b4476d15e849ba8a03449b2baf8984c4660fbc45e2fc3154", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des_sha512.der": "036c8d1d5a030658232b2ec50f68f97824543bccfe7d7216283ccca076eced8e", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_3des_sha512.pem": "948f06fc1775e2ef3ffa518bef5b047801cd0c6ad5515285451704ecd873280b", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des.der": "715566f5d9b2734d7713d563907733bcb6464108d9d3acf2f8cbb7c85de5fa3a", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des.pem": "8d94de2021aea75f8c2be923b10dc2dde5ae20611ac59d11e1a33d020c656ef5", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des_sha224.der": "d277d326771d241ed17154ad594359c0228cc350863b876a4c6b15ffcafaf97f", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des_sha224.pem": "65cfceefaf228bcdcd2c4132b27bf14f59bc006dbb00e6cc315340b971f03a10", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des_sha256.der": "6fabb1625c1548fb83f9b4a0fa4556c4c558a7a361453f1a700c2182fee3d5a3", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des_sha256.pem": "87a64aef803b3f878b21441d4363bd92d339f67c3cb0018dafd3a1d2d01935b1", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des_sha384.der": "5f409c99efa3c088f97b01e5db813ef9d87ab2d014a6c2921dfc4b2ef673e0cd", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des_sha384.pem": "68955f866f9fd9b804d128d862a5180e64903bba63b36184ebcd61215078bee1", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des_sha512.der": "a51ad7c84591007089e60fdbb05d8cb164a107bbabaac40ee948d9bafe4c7e34", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_2048_des_sha512.pem": "f6bc393737cd3757742966fb7db6912f1e817c2fabdef1f812828c2d5f374387", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des.der": "4b3d847ceb28e1527398013d84b7e7a3ee4fc0225bf6d91ae170f376b4a759a8", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des.pem": "9736c1fd60bdcb63665cb2903a6eec86df2f72c59c82d54eddcc7bb58f4b6e5a", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des_sha224.der": "066799f295a92258bbf8299612ed784127b66ca64ca112231c6cc7b2397038d3", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des_sha224.pem": "d905f3b6b08e38c7d303c90648917da59e0bb03ed7fcbb25b9093f8b2cb1ae41", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des_sha256.der": "2d1c28777ed1b84414d8c17e0be1a667cd46c98e8d10dfa6aead383c503688a0", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des_sha256.pem": "f1523efc7496c198189d9f37298dda2e410ce28af16281e851d4c39a9ba49668", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des_sha384.der": "46c062c7390225dbf7a8ed6f2837a8a37e724986b82c1e64490acf49ce783ff3", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des_sha384.pem": "c899858881141168e0daf871d54e201ce659548fe76efda6cbf8be8c43a75dc5", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des_sha512.der": "9c5b6f7b10e2a73a7bdff474cda5301a6b04ad4858268d2d37b36e24925e0b94", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_3des_sha512.pem": "7380b0697efe46ee612f70660d9465831e38aef10d1264d55b9b615373b1e282", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des.der": "d1397b7bbc76dad97529e3b1c59923a732e19cc3c7caf099149adbb57536d0a2", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des.pem": "0d6a32350b7caf5e179cc7acfa18a1918897494cd617f1de067bc0d250a00f38", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des_sha224.der": "e83c88036a7d70d2721db82c98d4737dc3cb7fa7550b0afdfd3313e6ba36ea9e", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des_sha224.pem": "94fed3e23676ac1d14652e6c9c9238fecade01cc1838fc8f2abffe15e53ef160", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des_sha256.der": "d1a828ac6fd4a259887053f315cea37e9324b789c8c6263cf73df6480cbfacb1", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des_sha256.pem": "b583d5be7de2d3a854527436ac421da0f10ce1307be213e5eb0c24fcf814a826", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des_sha384.der": "80186b3273d329fb9b48aa970011c9c6eed4082727b273c5c84561e315c89eb5", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des_sha384.pem": "ef178d8836c7f8b6d5e24b495d1b2ee842b22eed17f55a51b8186ccd8eab7ef0", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des_sha512.der": "f39817b0f863684080545ada28a90bc6c59fee310c36f69b083ff53dff1b570a", + "libraries/3rdparty/mbedtls/tests/data_files/rsa_pkcs8_pbes2_pbkdf2_4096_des_sha512.pem": "8778569cfdb0b38397064f2f01a64e0e3168a70f28dacf7a0e43b39714545e58", + "libraries/3rdparty/mbedtls/tests/data_files/secp521r1_prv.der": "d5575481be80df94b1ec0361cdb142239dd3fb04100247d78934d5a66b5083f2", + "libraries/3rdparty/mbedtls/tests/data_files/server1-ms.req.sha256": "eb6640edc8144b2300988f9dad2b5c0b1c6a7d429bbe8bab31aac8a7b5cad62d", + "libraries/3rdparty/mbedtls/tests/data_files/server1-nospace.crt": "a62cb8ce57a683677156ec67e8a6cd95892cac5d67851f29b3b7cce2be39451b", + "libraries/3rdparty/mbedtls/tests/data_files/server1-v1.crt": "b3c2327c7758342520e9cb485d788d0f475373dbad95790aaee5a4eb5126886e", + "libraries/3rdparty/mbedtls/tests/data_files/server1.cert_type.crt": "5fbedc50290f06c2c68b4e9df688670cb43b129b8f1289dc7a6d69160ff34bf0", + "libraries/3rdparty/mbedtls/tests/data_files/server1.cert_type.crt.openssl.v3_ext": "9c3314a4b2070dcf77c74ce90f5dc5928dd4e608900eb24097e1c1647daf5790", + "libraries/3rdparty/mbedtls/tests/data_files/server1.cert_type_noauthid.crt": "d557ca07706519d45aba576e8f2a4d306918b8d7df05c094411d9a38263db7a3", + "libraries/3rdparty/mbedtls/tests/data_files/server1.crt": "65daee0ad2689c420de31254b1a4d2cfb3805523bc8115eca806758c3995b7f1", + "libraries/3rdparty/mbedtls/tests/data_files/server1.crt.der": "672eab1bdf7167c5f00dd4be04137d22af719ebd3d9f58e3af8974e878c7a700", + "libraries/3rdparty/mbedtls/tests/data_files/server1.crt.openssl.v3_ext": "4f2671d996028c6f498feb04696c6634457bdfa89cfe297dd984c5e35955e042", + "libraries/3rdparty/mbedtls/tests/data_files/server1.csr": "1def45bcdca8b2e73533a8e11fbf79e54ebebbe7e2bef2802f3d080f5a7232fd", + "libraries/3rdparty/mbedtls/tests/data_files/server1.der": "fbd74fde74fb949bc221997ce1a557364f02217bb0a21e7ddbb9b3f29b26c491", + "libraries/3rdparty/mbedtls/tests/data_files/server1.ext_ku.crt": "cf7fd376acb30711d50f3c1f6235c93cd290ba2e839d5115ff4c34d9f29c694b", + "libraries/3rdparty/mbedtls/tests/data_files/server1.key": "469e1de4e72db7ddea4f5f56db4974a612da0f403a8a35464e52d53c60fd61bf", + "libraries/3rdparty/mbedtls/tests/data_files/server1.key_usage.crt": "de236ad3db13eb4eaced13d19df87b6b764425c33e832c631b4398b232a5977a", + "libraries/3rdparty/mbedtls/tests/data_files/server1.key_usage.crt.openssl.v3_ext": "82e5e7d5c89136c6e52683b12507fe6009aa293f6cc700bb3ab863db5538b2b9", + "libraries/3rdparty/mbedtls/tests/data_files/server1.key_usage_noauthid.crt": "1bdb38d82ab5621c270cd38b70b60c29020102a7eee4e681888b347e81552623", + "libraries/3rdparty/mbedtls/tests/data_files/server1.noauthid.crt": "69b3d572084b8f571aa6dc1111cd80089216a1b91c150fde8ba6dcb4bf5ab931", + "libraries/3rdparty/mbedtls/tests/data_files/server1.pubkey": "1079e8fd1cbdd5fdb58009c8370aff59fd60e25bf747f96bff48f2efb562489e", + "libraries/3rdparty/mbedtls/tests/data_files/server1.req.cert_type": "164c2ec94c93ee5c14cbe6dd5f801de7564671a982f0d63bfd710e68df1db18e", + "libraries/3rdparty/mbedtls/tests/data_files/server1.req.cert_type_empty": "c6966374ba5e05cbc9c37631d9e0cf4f97bf287f74baa346345257627a1e21a7", + "libraries/3rdparty/mbedtls/tests/data_files/server1.req.key_usage": "b98a58030a1018b879c2e09fb8fb60f1b4c00cafd09127f1c9fe41140214ab26", + "libraries/3rdparty/mbedtls/tests/data_files/server1.req.key_usage_empty": "f570adcdc5fb07fdec4160d7a9e487994b5934ae30f4c9c0ebe36ca0c08182f8", + "libraries/3rdparty/mbedtls/tests/data_files/server1.req.ku-ct": "a1726757d49c144be980a5298af76f9ef3f885818b748f1afe1d0a642deccf62", + "libraries/3rdparty/mbedtls/tests/data_files/server1.req.md4": "c714030bc56714e45b9b8ffaa7538f4c357de2ae6bbea3c4419f65753a8a6300", + "libraries/3rdparty/mbedtls/tests/data_files/server1.req.md5": "be709c92fbed76cc46ae4e2b12ff1b07bde09372debc92108c6202c19a555eed", + "libraries/3rdparty/mbedtls/tests/data_files/server1.req.sha1": "4d8864469be7a1ff0577a864266d16ccbd1a894ea0836f8b634e62385a499b6e", + "libraries/3rdparty/mbedtls/tests/data_files/server1.req.sha224": "f8e0827e76f1c3662b76ba5d9666613eef410227838ce490cacdc56b0d2acb47", + "libraries/3rdparty/mbedtls/tests/data_files/server1.req.sha256": "a567556759ee5eb2d5885c04542b316676263179a7a1a2c86c4264bf32edbcdc", + "libraries/3rdparty/mbedtls/tests/data_files/server1.req.sha384": "a4416ad2b88b5698deec33882b31f40afe34ddaf77779966cbdd59c2ff6f410f", + "libraries/3rdparty/mbedtls/tests/data_files/server1.req.sha512": "c88adc24936119330d1e505789e7d9b35172343343b36785f982ba8219fc73af", + "libraries/3rdparty/mbedtls/tests/data_files/server1.v1.crt": "6517ab0cd96cd21c5013127ba7f259898c3f81aa75b7b6cbfa9f28db1630fc4a", + "libraries/3rdparty/mbedtls/tests/data_files/server10-badsign.crt": "45095f812487f755d770a39b79232c8e89ff7f6a090345f961bd3639ae284ecf", + "libraries/3rdparty/mbedtls/tests/data_files/server10-bs_int3.pem": "922cae9082d65b87c7e1e5f9f54981addc185de960a01a0c61b1047ba7cb7eda", + "libraries/3rdparty/mbedtls/tests/data_files/server10.crt": "9d39025aa8aa0f7148ca6c7ae16fd89a44e4b51621848deee20b54c76d4ad891", + "libraries/3rdparty/mbedtls/tests/data_files/server10.key": "603c53edfff74463bfa4f9e195377224f6980aef4f86c4428a4b119bb440277f", + "libraries/3rdparty/mbedtls/tests/data_files/server10_int3-bs.pem": "5284c74b547da5d8a09a99a8d2a18836ab514c6ab7670dea2eda9ed66b4d5fb7", + "libraries/3rdparty/mbedtls/tests/data_files/server10_int3_int-ca2.crt": "958c6953649d3315a942ef358615ba7a1bc6fc5414f7f1d17b90d889ef05293a", + "libraries/3rdparty/mbedtls/tests/data_files/server10_int3_int-ca2_ca.crt": "9da80f4918ea65e1667953ab1cce6d9191d26062cfdd401309bd8ace9ee1abab", + "libraries/3rdparty/mbedtls/tests/data_files/server10_int3_spurious_int-ca2.crt": "8505ad8872067838ccde5769ad744b1cb5a32f9299f1c34b309c4367788b56e1", + "libraries/3rdparty/mbedtls/tests/data_files/server1_ca.crt": "1b7ef4238b3f2b42e28ac470cbfe3039d77fa2f857b3503b4816cef7d4d57b79", + "libraries/3rdparty/mbedtls/tests/data_files/server1_csr.opensslconf": "58419c7a63d6f55ba0aabb18b6171c07d8a0ebaa0922eb9a709706ef08be2f18", + "libraries/3rdparty/mbedtls/tests/data_files/server1_pathlen_int_max-1.crt": "f115fe091d7615e1953d51767d1b1a4516aed46c419a059534c1def4dbf381a3", + "libraries/3rdparty/mbedtls/tests/data_files/server1_pathlen_int_max.crt": "841a694f5f1860ec2f6fa597fb16d5f0cca451ee8cd9e657e976bed6cf12b2cd", + "libraries/3rdparty/mbedtls/tests/data_files/server2-badsign.crt": "58b06c4846bf41d63dc20575398c53614cf00f5e688ad6d39e1bdacc51394c5c", + "libraries/3rdparty/mbedtls/tests/data_files/server2-sha256.crt": "91ea0c42112d1b04db1a912fd4cfe97f5e3fe19aca98572030463e57e926a12a", + "libraries/3rdparty/mbedtls/tests/data_files/server2-sha256.crt.der": "80cbc316aa58f8be722fd26b3026f077e61c82398599f9f719eade4bcd98173e", + "libraries/3rdparty/mbedtls/tests/data_files/server2-v1-chain.crt": "49e6698e16cf96a54148d9a0c26644d9854690542c2af01eca25ef23b4c8c8e0", + "libraries/3rdparty/mbedtls/tests/data_files/server2-v1.crt": "c906914b53a430b9fc1e91fcb825f6f4d362cdb59e262fb36e63f958a7dd412d", + "libraries/3rdparty/mbedtls/tests/data_files/server2.crt": "fa79509dfeee01f07bae293374f6e85754489a9e2b10411b94b436dd7121e750", + "libraries/3rdparty/mbedtls/tests/data_files/server2.crt.der": "ec410cf1ce5137ad9d36e78606fd8bae6f01afdd7fd461d04bc4a4bd7d82b063", + "libraries/3rdparty/mbedtls/tests/data_files/server2.der": "ec410cf1ce5137ad9d36e78606fd8bae6f01afdd7fd461d04bc4a4bd7d82b063", + "libraries/3rdparty/mbedtls/tests/data_files/server2.key": "5d061d8e92c246e465654ea6eef75b0667cc49cfb8f76d3b4c2f2517861f8b1e", + "libraries/3rdparty/mbedtls/tests/data_files/server2.key.der": "1820853c99779f8e6b847a9ad7fceba765515f1e6ce991a96b7420d0299334fe", + "libraries/3rdparty/mbedtls/tests/data_files/server2.ku-ds.crt": "8310936407cf3431caf33434d46150c64671a6772a7c029b709c454b36bb392a", + "libraries/3rdparty/mbedtls/tests/data_files/server2.ku-ds_ke.crt": "2efab0f798baddbb50dd74494bca3a3caf873b274cfe21ddc8f9e289c5bfdc91", + "libraries/3rdparty/mbedtls/tests/data_files/server2.ku-ka.crt": "37de57e68c4368c507a9fb73e1c63c9d4e2aa37fb768b4dda3ebba00c30f31ad", + "libraries/3rdparty/mbedtls/tests/data_files/server2.ku-ke.crt": "d1e6a649f41bd76c065bfd17197b4ccc01ded1699a4985017c35bf6573a892a4", + "libraries/3rdparty/mbedtls/tests/data_files/server3.crt": "c63b6a289040359e7403a0a93c20438f24839224b50c229f10c704b553d6387e", + "libraries/3rdparty/mbedtls/tests/data_files/server3.key": "2a67c4daedc10b0f4bad16f06a30ab5b9f401a541fb61aa4451e23479bb75d7c", + "libraries/3rdparty/mbedtls/tests/data_files/server4.crt": "00f8a69ef60c9f8d58b4803905dcc90bdfb7b8c08e3afbb5e0c942ff7085d263", + "libraries/3rdparty/mbedtls/tests/data_files/server4.key": "ed155b755deaee3b5b8dcf271b4c82368f6b143ede5a0699d4442214c0be7361", + "libraries/3rdparty/mbedtls/tests/data_files/server5-badsign.crt": "cdb30a275aa4c2e523cdac2e586a6290bd25601e09b2106648dffd651b28fe72", + "libraries/3rdparty/mbedtls/tests/data_files/server5-der0.crt": "e234e102cd8de90e258906d253157aeb7699a3c6df0c4e79e05d01801999dcb5", + "libraries/3rdparty/mbedtls/tests/data_files/server5-der1a.crt": "558f71b5b97986f1a01980d7f048139d2d0fd2644e417c17445651705d6bde43", + "libraries/3rdparty/mbedtls/tests/data_files/server5-der1b.crt": "2d839fed289ed103741b6f167672435908a6a65a0c6fb5d379678c7db7e272ef", + "libraries/3rdparty/mbedtls/tests/data_files/server5-der2.crt": "833a6dabab7e34b432e3cef2571a3592944325ba3c0c8c4999ded1e4d6e1b8da", + "libraries/3rdparty/mbedtls/tests/data_files/server5-der4.crt": "2acb5b3303360adefc566ba49475a8fd4cfee3b210e42dff654aecea892fb46f", + "libraries/3rdparty/mbedtls/tests/data_files/server5-der8.crt": "3c0ad673bba53faa3b0fc08b80f8c544afec08edc108093154b0bc716aaba28e", + "libraries/3rdparty/mbedtls/tests/data_files/server5-der9.crt": "1f85bdc8ebcd356b1721104c28154a3eb25a4fa8a659d7d9e608845a895d3792", + "libraries/3rdparty/mbedtls/tests/data_files/server5-expired.crt": "c74d074aaffbdc1cef6317e75972967108a5c1a01bdff20bf2c1a2b197515310", + "libraries/3rdparty/mbedtls/tests/data_files/server5-future.crt": "da9311feb63e909fdec49a1e0f6b77776e913c4bb12c064efaa1e28274426b1c", + "libraries/3rdparty/mbedtls/tests/data_files/server5-selfsigned.crt": "599f9beeda983e34e4ee133a9b3f4acf2a7d46dbaedf1b09feb2d3e4e50bca8b", + "libraries/3rdparty/mbedtls/tests/data_files/server5-sha1.crt": "011601f71e5332a28e4fc5149ff728dea7f125381a3d3d90d674d0099abdb3f0", + "libraries/3rdparty/mbedtls/tests/data_files/server5-sha224.crt": "372aaaa32a6852f364c0469b98ee71ff0d09ff70d50ace53f8013c3459160672", + "libraries/3rdparty/mbedtls/tests/data_files/server5-sha384.crt": "98143dac0386ec2fa472763c9c91c4395f54150a229fdf60e6d0bd12965f55df", + "libraries/3rdparty/mbedtls/tests/data_files/server5-sha512.crt": "b4c3ab59b7441ac6795009876df225a6472f7058f381d45be6c18bf94b17484c", + "libraries/3rdparty/mbedtls/tests/data_files/server5-ss-expired.crt": "34134401a22e37243d82873772b1e1ab56cba406df1ebbed9410416bf0fafbbb", + "libraries/3rdparty/mbedtls/tests/data_files/server5-ss-forgeca.crt": "4c1bc4f3305b3c115c7426c15b8f8f3a481650619aa91f779ae181c46589d7b4", + "libraries/3rdparty/mbedtls/tests/data_files/server5-tricky-ip-san.crt": "629ec9d2ca7cac0cb01affb7ffc29684060119a01fce81873d302e1b5e69fdb9", + "libraries/3rdparty/mbedtls/tests/data_files/server5.crt": "4dd04599f24f848cb8ffefa86d3f0452cf32b5471755ba569cd78150e8da960d", + "libraries/3rdparty/mbedtls/tests/data_files/server5.crt.der": "e234e102cd8de90e258906d253157aeb7699a3c6df0c4e79e05d01801999dcb5", + "libraries/3rdparty/mbedtls/tests/data_files/server5.eku-cli.crt": "2dfad57fc6830ad24fd5d5515398f58a5f78303130a122cb50c49225f5123ef8", + "libraries/3rdparty/mbedtls/tests/data_files/server5.eku-cs.crt": "b292617d34dc97975a3e598b56ca430c58b599d96cd2b67450cc5b2c79db052d", + "libraries/3rdparty/mbedtls/tests/data_files/server5.eku-cs_any.crt": "9ff857aac63ad4cfc0462e803394f246b506fa8174e3d9331cc169f91b0af99c", + "libraries/3rdparty/mbedtls/tests/data_files/server5.eku-srv.crt": "13701edcd8ae8d9835c7600415630d62fa492e6d89aa3a2552eb81e483ab5b0f", + "libraries/3rdparty/mbedtls/tests/data_files/server5.eku-srv_cli.crt": "2c70618c65d92d0185bb38cc182297e286b4926def85edab3e317d282b075e21", + "libraries/3rdparty/mbedtls/tests/data_files/server5.key": "dc05ad588945ee5771ea24f4970b79e020acfb9c45c6de9d7975b440394f4938", + "libraries/3rdparty/mbedtls/tests/data_files/server5.key.der": "916591fe3a480392ece0f0259cae9cdbc4178acd63863dfb5e8a135e5aa5fed3", + "libraries/3rdparty/mbedtls/tests/data_files/server5.ku-ds.crt": "0ecf0110cb4ffecf3de743a5effa1cbdc26fb3dc9a1bc41746f1eeddfc1712db", + "libraries/3rdparty/mbedtls/tests/data_files/server5.ku-ka.crt": "b8189aab81f627ff45c0d88445a019d7267b0a3b0b44e75a8c7de8e729333034", + "libraries/3rdparty/mbedtls/tests/data_files/server5.ku-ke.crt": "f72f8d5333e73048ee506e1b3c76f6f8cc06158871a409ba93a15788da867171", + "libraries/3rdparty/mbedtls/tests/data_files/server5.req.ku.sha1": "fc5f1a4d33ade85706572ffe9c6d3e3d3084b7f68f82d1a2626b94349b059987", + "libraries/3rdparty/mbedtls/tests/data_files/server5.req.sha1": "4e252af88001daf597ba2bbbe7f5d0f2d0d0d958df49aba6ceb8595406fb536b", + "libraries/3rdparty/mbedtls/tests/data_files/server5.req.sha224": "e89fd34106cd5505befd4a0df08efa72605770d12d9592de71995f0d258929c9", + "libraries/3rdparty/mbedtls/tests/data_files/server5.req.sha256": "3067b803538b7310eceabbe2588d4a3630461b324cfab9e8462cc6e6be7f9ffa", + "libraries/3rdparty/mbedtls/tests/data_files/server5.req.sha384": "3422248ca366da250d91c237b48281ee186dc4ff1ab2865c870346bf41c36601", + "libraries/3rdparty/mbedtls/tests/data_files/server5.req.sha512": "264839b2aec27ccb1f4ed1770c10e4cc8f849f6d1098196e966691b55b9a3e15", + "libraries/3rdparty/mbedtls/tests/data_files/server6-ss-child.crt": "dc7646970447182dff4e8fcf030d649bef0d9eb3300fb0cd3f4909cc6621365e", + "libraries/3rdparty/mbedtls/tests/data_files/server6.crt": "e0f621487e85868e8377a2f41e4cd6fd135ff43c7ad36806c2edb9f1322f3fad", + "libraries/3rdparty/mbedtls/tests/data_files/server6.key": "2c6ba41ff6fa21bd12f3905eae7e39a7c45f26dc35b14e7761342dc50589ea6e", + "libraries/3rdparty/mbedtls/tests/data_files/server7-badsign.crt": "da4e459260611030752aa4edc491e3522d431566183fda7a14adcb1df1bb5f07", + "libraries/3rdparty/mbedtls/tests/data_files/server7-expired.crt": "c89a494df24636a1a78e74c1ba95cbb4bd15e7995b12a443565c7c4c0df22d5b", + "libraries/3rdparty/mbedtls/tests/data_files/server7-future.crt": "4e7c3c756e04e1b125920b9d1ac768205080e329b68e865861af0bcba59fd4bf", + "libraries/3rdparty/mbedtls/tests/data_files/server7.crt": "16a50e25755765652cb577f39fd20b90c48cb1ffef614826d97c16a9bb9834d5", + "libraries/3rdparty/mbedtls/tests/data_files/server7.key": "603c53edfff74463bfa4f9e195377224f6980aef4f86c4428a4b119bb440277f", + "libraries/3rdparty/mbedtls/tests/data_files/server7_all_space.crt": "9176e45bdbc71a9e3305d4aa723bfd577109732294894fe474d581daf9a9978d", + "libraries/3rdparty/mbedtls/tests/data_files/server7_int-ca-exp.crt": "88be293184fe59904bd35049c82c5cdcccc3ea49c3d8067a5908ceb52d1808ea", + "libraries/3rdparty/mbedtls/tests/data_files/server7_int-ca.crt": "ced5f0929905dd533928c1ca10c725e230e265b099a737c6dc108b5cd4efc272", + "libraries/3rdparty/mbedtls/tests/data_files/server7_int-ca_ca2.crt": "5550b67bd40ece1b08e197e32905fbec81ba858e1490af374684636db0eef6a2", + "libraries/3rdparty/mbedtls/tests/data_files/server7_pem_space.crt": "5b9a16ae6767cbc8f9aca55bc1c47f9146c10f8d6a1b602526cf93a40c0058a2", + "libraries/3rdparty/mbedtls/tests/data_files/server7_spurious_int-ca.crt": "8f1c815e02fe3a53f6b460271cb9562858e5cf6013d155c939974ca852974720", + "libraries/3rdparty/mbedtls/tests/data_files/server7_trailing_space.crt": "b82ed11055d227c7bc0a0714312279879ca63230eb3f1fd8117dca9c90d3cd69", + "libraries/3rdparty/mbedtls/tests/data_files/server8.crt": "3b86f7b1212e67691abba3aab02b69b91e2061e92c1c88df6d6404b6dd748ba3", + "libraries/3rdparty/mbedtls/tests/data_files/server8.key": "e8dfd0a91df11fc13499c9a63ab457861283667c44682c2ed10329b0e406c460", + "libraries/3rdparty/mbedtls/tests/data_files/server8_int-ca2.crt": "737c208b5a67aa359c7e87834847974ca6aee747a70f5ea1b41a78689865c08f", + "libraries/3rdparty/mbedtls/tests/data_files/server9-bad-mgfhash.crt": "b943fb9e78c9ca61cbc69b2f00498916594612d998e407def1245e82fa1a7b11", + "libraries/3rdparty/mbedtls/tests/data_files/server9-bad-saltlen.crt": "7f96c87d95cc483303109653f2f678ed9a20afef6eb2e20dc8e06d35294b4ca6", + "libraries/3rdparty/mbedtls/tests/data_files/server9-badsign.crt": "b03ad81eb75230a5d415ba3294306bed0e5ee9c0752f4fe50a547cf579f92a65", + "libraries/3rdparty/mbedtls/tests/data_files/server9-defaults.crt": "10d1418f03ec088cd9dd0eda38613f1b8aec31fc1789a98784e827311a6217d7", + "libraries/3rdparty/mbedtls/tests/data_files/server9-sha224.crt": "1cb614d26ea2c106ddc50a63d25464b5f731105e1c038107ffa1a8d0113c1ffa", + "libraries/3rdparty/mbedtls/tests/data_files/server9-sha256.crt": "1d479c40bdd65a551bf29ddd30d681e04ea55467e7c39cc762767b64ebd9dfce", + "libraries/3rdparty/mbedtls/tests/data_files/server9-sha384.crt": "2e22374c8a68ebbbe5df9abb61cf3b57ced80f600bbc51b1480b4f46a6fc22c9", + "libraries/3rdparty/mbedtls/tests/data_files/server9-sha512.crt": "9500e7d5a18f802c0ac070ae5a0be82e84c33b54f27ff096cc18174952157044", + "libraries/3rdparty/mbedtls/tests/data_files/server9-with-ca.crt": "6668d0e32f88b35ed05646b35aa04a56afb5121528e1cac22b01641bf253e192", + "libraries/3rdparty/mbedtls/tests/data_files/server9.crt": "8d3a4319e7c4009461ff3a1fb013bef98872d05c714651e04d470220d9f1268e", + "libraries/3rdparty/mbedtls/tests/data_files/server9.key": "41227afd38ca676c904ae59589943b5f57576e72b72c98d8f503f57c8ce70552", + "libraries/3rdparty/mbedtls/tests/data_files/server9.req.sha1": "0711bf87fa40e92fe655f4ca17a11b712e2f31da7b7ad4b4745114db520fecd7", + "libraries/3rdparty/mbedtls/tests/data_files/server9.req.sha224": "6adc1a5b3460980248f4a0291456c61e9045a07458c3aabeee6487dc2740a19b", + "libraries/3rdparty/mbedtls/tests/data_files/server9.req.sha256": "e46e01e6fa8ce9c758b1138286ee6b766d0332283fcaf69395aa606c96ba64f2", + "libraries/3rdparty/mbedtls/tests/data_files/server9.req.sha384": "b767dd39d999e3f07325521e7b0b0a5024e9b69fc0dac6bb1840dc302223f06a", + "libraries/3rdparty/mbedtls/tests/data_files/server9.req.sha512": "1a94e92f3d6a284f1c5a7ff48c31b496a85c0867eda5e5111ed6df150515afce", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca-alt-good.crt": "409b7203b6d92795221b303e79bc734894edb065987d57583da537da03732141", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca-alt.crt": "f788c9127699eb9430855561870d6392e5d6c7906e5e8cb6c216b8bf82501442", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca-alt.csr": "a4e161b4492641d2cbbb83254640e244ff0f47b4aabe175f96a8605d1012bf2c", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca-alt.key": "f3a266be97499730ffc421332f58ccd4819993a882a30e55519927cb25c4488c", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca-good-alt.crt": "7e3b5d9ef012b53937f4035023b6edbf308452ec0c064fa8aaf1df46076e4ad2", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca-sha1.crt": "b9b77eabdfa7a0d01e7949778e4c2852f387e4cdc163420c3967d46fac6aeb94", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca-sha1.crt.der": "d2d3e6d9d8f19ad1511dfbcf3847217c5a3f3b42837d1eadfe75485fca944fce", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca-sha256.crt": "e103df1a2629fab1f0811f7ac64f03900a697e8e7a84dd69deaeed18d74340b4", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca-sha256.crt.der": "1ccfd719021988e76a7f5f5425b802302f910dc5a19045ee4096ab7c5e7ff633", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca-v1.crt": "c20e614640b774846bf8362715f8bee134d330c6ef17278386d265fd02c7c895", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca.crt": "b9b77eabdfa7a0d01e7949778e4c2852f387e4cdc163420c3967d46fac6aeb94", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca.crt.der": "a34cc17e86a8ea89113cd1b193adc2ba80559a8158bdf52c7186ebda8cbaf3c8", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca.der": "d2d3e6d9d8f19ad1511dfbcf3847217c5a3f3b42837d1eadfe75485fca944fce", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca.key": "ea70a2d032b80892abf2fee8676258701fe47a78c31e379fc73542925a783f06", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca.key.der": "77ffe88a785127deb761570bf12fe72fb52bb791e9e4fd5a821b92737d814ee5", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca.opensslconf": "00e1ca126a65a76d040ee79ec865b37316010c6a777c6d39b1f4630a42f15c3e", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca.server1.db": "486b555d2ce9c6d70ccb875c08c87a5fd4bf3dd8d0a268a662715b71db03553d", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca.server1.future-crl.db": "edf89dc30010a965cdf2e80eec29bfaeece5f878c16e4874e9f786f70c0a8864", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca.server1.future-crl.opensslconf": "a4a23cc77fe57f28fe36d4cc613c9d8ab267677f108ec2a70850971627a063b5", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca.server1.opensslconf": "4c84429c44ca052fa17128e689edcdb73072c37ec683fb9d305d60b5c3c10ac1", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca2-expired.crt": "84a47b1a228e8195e7880bda80e41e5f5e56a138f63b6f385c16b4438cbadbdd", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca2.crt": "e75fcd2da099aae03c1f6f5b6e96e3a3b635dea7303a7271803b4ca2f263e9da", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca2.crt.der": "529e5ae24dfcb7f56e6388d6c4be7f9db2e4282c475f622493b1ac777dae0760", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca2.key": "72769bdc9f54e0f2c4a8856bcc4545fcc769ccd77d26f7e35fb3f64419a7df35", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca2.key.der": "d6a5d0b3c94857d0a42032fc9ccc3dc8056403d6c893298f99541972238986f8", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca2.key.enc": "18b93a1c675861bef54a47c044d4431133b5e92c54e433e1d114fbc43871ef08", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca2.ku-crl.crt": "0058d9988640708360c03342a06868b9f0111ee5c8d31bde3f6c163208918042", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca2.ku-crt.crt": "5d529c056aea0bc219f0ea9b7c0deced33571dc0b7939c86b995134f3db19b52", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca2.ku-crt_crl.crt": "2b63ebb849edfd60f449bdf8e334341f2db337f9a8b7cfe21912e01aa4ca05be", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca2.ku-ds.crt": "4a98027dd3b7fbbd5b593a5fdf44e8aaeb476fe4078ca789015965f26b91f710", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca2_cat-future-invalid.crt": "0c61f7c05dc549c8007140d2329488d49966145a023fd19969675eff7df13a5b", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca2_cat-future-present.crt": "83e58e6f98aa25dea60db91ff4c5973cf01fa14f282fb66e11e725cebba456f5", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca2_cat-past-invalid.crt": "f65a2b4cb1c4fceaf26afa3177de2bd21bfc5ab075566f1ea13e81889539bec8", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca2_cat-past-present.crt": "8edfcb79e78122a953bebf1dfa78c69798d0fabd7835cb499fc12b9eb7edb839", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca2_cat-present-future.crt": "b39592be0ea2f71b8a36f197001cef05ecf9455e0f3a85abe1267ecb37b00290", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca2_cat-present-past.crt": "40ed90361d82c9dd008b5eb7dfc909c6a3bb9d42c86833e41a582d4ee12fec35", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca_cat12.crt": "ce16edacc0ff4c43d20005b8c31590a487dcb6bc725be87f83a14fa431f47025", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca_cat21.crt": "a52cbc806866c3f738c8bceed914877b1527c2f006727d7953f7960a367e9454", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca_printable.crt": "5aab65196cafdd30de7d537d9d6b99d98afa0d3492bef1c4f1f166dfbc3ac029", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca_uppercase.crt": "9df5f9ea50c0199e3e138ad4dbfb6f06c0867347a2c1f64230806455f073aa68", + "libraries/3rdparty/mbedtls/tests/data_files/test-ca_utf8.crt": "dc8b6956c671569dae6923c19cf743868fff67ad61f81d3eebdb73e4b40f5ba1", + "libraries/3rdparty/mbedtls/tests/data_files/test-int-ca-exp.crt": "a589337c4557cf2b2363df7a6af92cfa942b4ea00b7a17ea549e21159052fbe5", + "libraries/3rdparty/mbedtls/tests/data_files/test-int-ca.crt": "0c4225974cf3819eea282d0352387629070479b0d7182f4407920984e82b895d", + "libraries/3rdparty/mbedtls/tests/data_files/test-int-ca.key": "c9ce39dd7a23fbf4f10368519fa23bd4a34f32d6015dde5c4042ba477410133a", + "libraries/3rdparty/mbedtls/tests/data_files/test-int-ca2.crt": "62a6a1e32f2d1d25d9757acdaa1c24694ad257f23becb5c2e628e52aa26d4312", + "libraries/3rdparty/mbedtls/tests/data_files/test-int-ca2.key": "97ae364e686400105ed7ce07168ba7d64b7797e27b577ce6e1952e01f3ebcb0d", + "libraries/3rdparty/mbedtls/tests/data_files/test-int-ca3-badsign.crt": "e76023d311aab1e0882e36764789f1dc6f007d0220fc455fb282e96c46744997", + "libraries/3rdparty/mbedtls/tests/data_files/test-int-ca3.crt": "75575083759249bcfa4fd2a562b72b2503c0be2bd7dc1df22f9cee9d2bfd8ad5", + "libraries/3rdparty/mbedtls/tests/data_files/test-int-ca3.key": "8f54c3d71e1669ec7f3f2a1fa835a96b215ff69fae9a7e7081780569ba8e10a9", + "libraries/3rdparty/mbedtls/tests/git-scripts/README.md": "5cb58f97bbf4d2600ebcfd9fe31d7db5f85f346fcaad052f36a09bc3d31000de", + "libraries/3rdparty/mbedtls/tests/git-scripts/pre-commit.sh": "f23674694149984f480e253528d208f192f7f4459472f8ae11ef0f0ac753b06c", + "libraries/3rdparty/mbedtls/tests/git-scripts/pre-push.sh": "13958629764dbd9ae9ac2c02f50c1f9e135b6c3f273ca90c74025c9efdb65389", + "libraries/3rdparty/mbedtls/tests/scripts/all.sh": "071a164010e99f1fd94894071f89680c33082d82afafeb21b5042aa78e5108a1", + "libraries/3rdparty/mbedtls/tests/scripts/basic-build-test.sh": "f948f4c0a39e6542880a9a16f1b9140545475224a2ec792058fc82749c235411", + "libraries/3rdparty/mbedtls/tests/scripts/check-doxy-blocks.pl": "c4748b2bde10d25554a0cbc0fa255d2b46a7dc9846b9ead54cd1e6c4bf2a09aa", + "libraries/3rdparty/mbedtls/tests/scripts/check-generated-files.sh": "e6c811fd663403a6aa9067def43f6f3a5335999a14fd4991bd2b3c891c3e66e1", + "libraries/3rdparty/mbedtls/tests/scripts/check-names.sh": "4298cf33adf30b25e022a213a279aaa5cb74d25da7be3660c89e02c91658c217", + "libraries/3rdparty/mbedtls/tests/scripts/check-python-files.sh": "f6e4aff8d6441fb67671a2578ab6f1d5ce14f404fc094f0233e82220ca467ec6", + "libraries/3rdparty/mbedtls/tests/scripts/check_files.py": "2b1057d5942e9642cb51cdc768f886d26a1670d8d3cd8c936b52f98dfd4e497e", + "libraries/3rdparty/mbedtls/tests/scripts/curves.pl": "4ea7fe6fbaa6ce45b6d57df5f2b308457b1f534e75d5d85c89fa8ae2a0770e52", + "libraries/3rdparty/mbedtls/tests/scripts/depends-hashes.pl": "f70f078e9bbe7deee7fe21b9852137ede88757765b7e01ec683a949fa7a9d6ab", + "libraries/3rdparty/mbedtls/tests/scripts/depends-pkalgs.pl": "f0683ac4044eb07846cc34c321a48fbdbf3e379666c1d7730575fe8867a32c03", + "libraries/3rdparty/mbedtls/tests/scripts/doxygen.sh": "338d23b928bb53b59004360e8b9e7c78fadf1fca23e4a76346ad8dff99f1f1c0", + "libraries/3rdparty/mbedtls/tests/scripts/gen_ctr_drbg.pl": "903d8741d2ee28840ea72eafd428a9c7676efe52ff96e1643f85714a7a353c08", + "libraries/3rdparty/mbedtls/tests/scripts/gen_gcm_decrypt.pl": "8f9e3dae4a67e4d58f86d31c19f3a0826f97c35893aa61a40acc173d19f760ac", + "libraries/3rdparty/mbedtls/tests/scripts/gen_gcm_encrypt.pl": "2287646833c199f3bb873e8737d82f9e270826401c15bc346e6804ea100401fa", + "libraries/3rdparty/mbedtls/tests/scripts/gen_pkcs1_v21_sign_verify.pl": "3605d8b88c1efaf4242a63400d6e0cebed207028d455e3d18d29e94bf3da7ab0", + "libraries/3rdparty/mbedtls/tests/scripts/generate-afl-tests.sh": "ed67c9051896567d42a343a412e4b1be6e644d5174cee0c6fa0ae73ba232db15", + "libraries/3rdparty/mbedtls/tests/scripts/generate_test_code.py": "e024916298f748d4df2f11b00aa8fe3678769b51d37618636d96e092f7e363d5", + "libraries/3rdparty/mbedtls/tests/scripts/key-exchanges.pl": "36daa81f400913d98a25da9fe672ee9db85569c6e1b35de98e9d89950f711c8e", + "libraries/3rdparty/mbedtls/tests/scripts/list-enum-consts.pl": "de80aa6219ad68e81dd36c23d77a06ea28396238e05cb0a8a4b9160109d4202d", + "libraries/3rdparty/mbedtls/tests/scripts/list-identifiers.sh": "b820d00a5c939c6d4bbbd808833fb443a0239abd4e1baffd6e0c878276b8acbc", + "libraries/3rdparty/mbedtls/tests/scripts/list-macros.sh": "ff23c7e511cc2e64a68d6bb7a37b02d2aca869fa547502866e4412489bd929a0", + "libraries/3rdparty/mbedtls/tests/scripts/list-symbols.sh": "641d6e6413ed422785b8f52e49f53f5fb3939569152bdaaaacdebad8fa67d0c9", + "libraries/3rdparty/mbedtls/tests/scripts/mbedtls_test.py": "5df6c85e0620fea1d0d6c87c15e46dcf58b8fef9904ccb0f4838d9c86da6038d", + "libraries/3rdparty/mbedtls/tests/scripts/recursion.pl": "b7024fc95493f9ebce6cf2cd017c8756a7da0566fcc23a46425fc88f7e9528cb", + "libraries/3rdparty/mbedtls/tests/scripts/run-test-suites.pl": "12bcb8320609a55ea8942480ef7e9e73b5a640eda594547c751c85c0fe6d208f", + "libraries/3rdparty/mbedtls/tests/scripts/tcp_client.pl": "2b03f0835a0aafbd6d50f1014f9ff57fba53c538590081b52ece9e52cf78544b", + "libraries/3rdparty/mbedtls/tests/scripts/test-ref-configs.pl": "1c8e34ab3666901668cbb89f5d5be876cebbee6e5aee2f7d57dc08c2333ed64f", + "libraries/3rdparty/mbedtls/tests/scripts/test_generate_test_code.py": "0d8b6ff7553eba6b17c1085a30e8b6a376388e7091541feca5c48ea10144096c", + "libraries/3rdparty/mbedtls/tests/scripts/test_zeroize.gdb": "517e0ee83bd5a2cf1fe848d7d7d0284e47f4719cc468688deac2a6cac91e6b3f", + "libraries/3rdparty/mbedtls/tests/scripts/travis-log-failure.sh": "9e9bd2f57c0ce56393060559ea70ec3b16465a6af0eb152aefac8f226830bc51", + "libraries/3rdparty/mbedtls/tests/ssl-opt.sh": "ca3e4e1c05cc3621cb16c00a0b6ac198f6e079db3beb5c011e017caef6d949dd", + "libraries/3rdparty/mbedtls/tests/suites/helpers.function": "9d8ea2040ba123bfaf8e5c63b3462d905c3bfc33172174a5033c2ba793ca291b", + "libraries/3rdparty/mbedtls/tests/suites/host_test.function": "a033ae4aa02551ce619af1ed070e32b37e13bfc99e5d9ef9476e96f977ea790b", + "libraries/3rdparty/mbedtls/tests/suites/main_test.function": "4af28424403a3a1e0b2fc7f1cf51e8c015658b87296d2adcde863178a70dc4a3", + "libraries/3rdparty/mbedtls/tests/suites/target_test.function": "ef13abb504d8c88266c0d453a3f918daf2a275bf523d1258c5f2cefdc51b96fa", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_aes.cbc.data": "48b7bd70a700c75132cfe1b67fcc93e0d27c7da5cc16903ab67036c58d7d72a3", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_aes.cfb.data": "446c03b719b839834d92996a3dc3d85c0909b079fd7fc48eab1a74ea025de5bb", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_aes.ecb.data": "790180492878f22a4741e57bd4a397d6ab0130c420b4433a3dc53ba8c62d99e2", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_aes.function": "814609d814566e6b67112d3ff3103932366113fb390bc81f3933a28368b26763", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_aes.ofb.data": "5a1aa338d7dd051378c7d44074b29bc1c709d373b89dc856d3d7a345feff2830", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_aes.rest.data": "8886e8458eadf180667a0f46b0b1d4f420ee4b7bf6065420bc5da0d10dca8aba", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_aes.xts.data": "7b0275e8c85574740cd7e8e343ac39933a4220567a6a4fd601ad92906104a5cb", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_arc4.data": "578845eae4e63591029996b54e83aee7ac3212813ea3ed2e3dd095682f074ed9", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_arc4.function": "6d51696599caed1e3d3959c7b4dbe0f571f944a80d2dbacbe63c70e7906d1898", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_aria.data": "07824eaf3ee8b8f61a3df6d45b38210b0a8219ece1eb46094e600abc2fcfef71", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_aria.function": "898e11e4f5b0530d2e2c7e4acbbcf6a25ad59734e3f7c5839c11cd1d92f6736c", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_asn1write.data": "b11c47017d072c185357e1359403fabedb32c0727be8ee3d96b5b0602fd04c25", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_asn1write.function": "ee6eeff25f9410382cad38e6eeaeaa5eff90f9136e1bdebb1afa360c6b4fde97", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_base64.data": "871b00c72061ca46f850be9b9df546c18b69e5c18e4eb7b6183bc63723998bd4", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_base64.function": "e7f0fd3148a3cb82e0fed0bd91113a42cd2200fb816fe79e5d719ef3eb9388c8", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_blowfish.data": "6610609da22905fccfc33ceed0dd7621cdf692f95a9b5d1ba7608eecec4a28eb", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_blowfish.function": "8a59bed4711b3820f725210b6e8b0a0061c1c7bb2c49d9c2aef37da969a89a47", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_camellia.data": "3d38d77a108a94bbfa676f471d02cf99d05fb56b735a3470b28bbdf434bbeba5", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_camellia.function": "371c06424aa04b098667611fbcab3a8f177f7e11ae7cd5245fef3fa84bb4a466", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_ccm.data": "4cb0c0a5071230f38627bd90fb2002508449d178854ca227c59118d6d205ea62", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_ccm.function": "f8128164e537a07c5c4013c2d7a2b3e21a77b9b5cdf100c45e19a34690741209", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_chacha20.data": "8163769ce72adeea70077290eb57d3cb5b0ca20a8998c67b692588850b827099", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_chacha20.function": "7595481d6a34b66791357923dfe0981f552cff27ab2b4385efc1ecc91de15c67", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_chachapoly.data": "c6099c13799bec5a7a802c9ac405b020aca50c4e98d6e8fa3c3b68d8120fcac5", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_chachapoly.function": "6659143a685668d432415c0803cbe9cf27030024fadaea1af5b81b16bd87579b", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.aes.data": "7b6631fd7727a53a6f3c264a1fcdbf99e62551b1a9f36cd68ee10b15eaa889c6", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.arc4.data": "80d8a4a33618ff66ec39cc9a73c02021142d4efa444d8c9f86b8223e198d238c", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.blowfish.data": "04a5fef9e21db1c64e8436028d2ec2db5bc46d9e2fb3dbac9416287b40d200a6", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.camellia.data": "314abe489a8bb4b944e158dc3c730b63d52078c8c9db2b974dfaec818f7584fa", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.ccm.data": "cde33abc7ae2aab86b3a08cfa1b2e96f306f01d276b9ad2df879b7dc992bd3ca", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.chacha20.data": "6e31de18006c045b6718b2b40911036fbda16f2d1e62f21c986aeebbac5194ed", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.chachapoly.data": "24688dd7cc2ff0c16bd22dd07124c1b7ecbba3e9509cb91eb566644351dbfde1", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.des.data": "06a94dcd718688eb443999f3374e4da1f00150ea64aad5ad8c2179b26249161f", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.function": "bd5fe38e886e705b6ffc0abf3ef479f6d94497a68a82022becac44131d0401c5", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.gcm.data": "32da5ca9431f8f98f47d3dc48cff64863dd85e8858637fdfe14ec58d611c395f", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.misc.data": "68bc609d5bfba474629274cad78555a198233100c045a828bb44f764a8902594", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.null.data": "426b27e3a22860b47c05c919749b80d08934160da3dc51867f293718292d5b7d", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_cipher.padding.data": "c1f9824657b118e8e797db09b3f7833eb1444b82a287e0d4b9f22a99d79ed776", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_cmac.data": "947b56d2b8ab4e11faa5248f764634173e4ea02f1a9b2d2b10a957d7e38c9ce0", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_cmac.function": "c6629890da1216133a6baf3d14b4d4f72082e156fb41f047d0bf99c066a26239", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_ctr_drbg.data": "76d866177700768f84ee5f5fd2e844834137205ca7d51d788b5bdb6f42ce35f5", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_ctr_drbg.function": "e1e6998d762340945f60a772e213743ec283b4588254e166160844ae172ce57e", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_debug.data": "d2203e242b911715b3a13c9ff60f09a52aeb8947d5d012962262c041fd0f426a", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_debug.function": "18f43709e2a31b7e871cd1de2d4914a47be901f684627e60b47fce6e14f249e9", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_des.data": "99b98d62dd402a10916164d05b963d868b27fc4e61c324f3d183a6e95a6c6ee2", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_des.function": "471881a2baf2de59882234adb3fe0c3f089a43b71802bf7f89f3fc6ec50d778c", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_dhm.data": "9028eefe36def9c04484c4e8ac1f58b5e5dec97505d8e497162ca2d3447c3680", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_dhm.function": "e2de1a546db80b8690aaeb9e5dbd389961464aa1d3021e9eb847763876468ee9", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_ecdh.data": "d57d20ae4d9ac83eeaa79056b0d19fcc1cedb9eccb0c752bf69cb9ee132fa932", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_ecdh.function": "e823742ad8764e178f68c38bc246c9ff07d798b83191a77a4066fd6a99b4b299", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_ecdsa.data": "999f237e9c80dedf3ab1857a6091ebc4ca7590ade23284e047e11d7900cc4469", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_ecdsa.function": "825ca556f1c278cbfe8fd14d61da2ef1394becd0831f0630ca0a8ad3fd42f9fd", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_ecjpake.data": "75c1f08c6f47401c222ea7dbe5ecefe738fbcde941f2322ebdbc7dc764bbac42", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_ecjpake.function": "541c3ae8847f680443ca7a3900ea188b26b3698d8c99fa0a63d7cfa21bf5a050", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_ecp.data": "d9f2b23fee390e4c5f3305f793e51e6994b155b22be9fa34808525c06a56f327", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_ecp.function": "8e643a6cb9e2e6f004ce10fbbfcae7be257ce2b56fb06ac888cdc9f326708cd4", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_entropy.data": "744ba90615f31418d5f450a61dffe38dcceee80222db9a1db7b789e199fa244f", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_entropy.function": "166f24440b92410c0ff58440e4ee172ae03adce2be711aded189f7dbc7fb328d", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_error.data": "52dcf2be05c9a615b859e0328cfc142b109bebdf5de499ee167f41bd02885cd4", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_error.function": "36e0e8637fc05a1a5efc1ad227e042e4e95d2ea1141b5739ebd97016e45e8ee1", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_gcm.aes128_de.data": "1efc1051eb12466eb65428af634140e9a41ac5acf5ec4cc3b5b8ae0e3589e300", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_gcm.aes128_en.data": "2dc4d3ce56e613e6169d481a9b26fffddb1b763ec9fba78f446300e658b5294e", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_gcm.aes192_de.data": "5cbdead079fc4c269ef4322623179b2e60ddfb1b4390cabf5a43576fb614792b", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_gcm.aes192_en.data": "3877cc2a6f10824214508427d824493ac6b8df3ef26143bf2ad95356f49df46b", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_gcm.aes256_de.data": "b581d09e17f5db4914a8678b41ca3611e9c887358a0d8b0b3cd11df1167591a8", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_gcm.aes256_en.data": "fce4bf28915e0c3009b0b4b74da0155b6c2e2cd7aa16b1087bffadcc3e33981e", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_gcm.camellia.data": "4aba96c85717d9e7504f4664b55f47bf8703d5066518d76946f70a6ab3831afa", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_gcm.function": "9fe71a7f00bd7110beaebf3d5c0380d70c40a9ca353bc38eb79956e7473017d4", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_gcm.misc.data": "0b41ffc8013b88064041ec52ee71b346a1f596797d325be23fe88ad6cde6ae0a", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_hkdf.data": "3670baeb5ba65736d7bc42e010c9a58743f6088a5b5c792a10dc1636e5e613c1", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_hkdf.function": "d473ce6532e44d37a45cad36d0f1b071bd9e8eb526740b3fa367eb86496a8a87", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_hmac_drbg.function": "53fb9dc095657edeef3be66e5e1862258f267c99a7a0d340119f65d43f09e0b8", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_hmac_drbg.misc.data": "fb7d852effb65f797c59f9f169cd54226389bb0ebd8836e969b095b4a2ca40f6", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_hmac_drbg.no_reseed.data": "f87612071538230adf2cb2eadbd169032c870c86d7ad321287947da4b0cbfd3a", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_hmac_drbg.nopr.data": "ea197b2bea57bd7715ae41212c2c09904c3d6a95ff150e64a8d93ec5a2db7866", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_hmac_drbg.pr.data": "d23eb1828c7db2a2fe39790bfbf04198c215822280bc3708c186769cb6a65e83", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_md.data": "c54e26c6922d0730e2e7096c3575c0b2001999932b2e0edf6c53ae4d81e32e01", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_md.function": "21b374bece408f3ca6f6202fb9a480dd06279e11101648827abd9908cf9c0033", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_mdx.data": "dfe8fea65aa67aee073e4475ed847be8793b72878bf68ebcd3107cf74de162d0", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_mdx.function": "97f071e3024351a1a440b9699c8618b2c0d74b3e3d8275b32ff052d884b296ac", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_memory_buffer_alloc.data": "c03d0445d0d702b8bdc178e67b14479b09e7ddbf89884e64d3b557ed9f08e770", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_memory_buffer_alloc.function": "3b23941d18171c2a0d2ad8d0baafdd4616df7f05ec102d6cd2f9463cd327d7c9", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_mpi.data": "825de92647ae59dc2813896dd2386c0cb4b29ff1725736ee04c465be0578665f", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_mpi.function": "2f9f034e65fae011818ca834655b52fb7494c4e480ad3778b338ffa74b8062ee", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_nist_kw.data": "c6ca21ade49eeb1577efd2c0e97f13a150bdeac7fe7c078cac869dc3eac324c3", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_nist_kw.function": "778b0257d8dba1a0b3e23d8c1cd2af8c0f27241f90c927b0a979c21a4baa57cf", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_pem.data": "68aabb6911a63e45181ac774cfd0b3830874f4122ae26dedc1b7ae58860a597c", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_pem.function": "a4f8e7937f721c6987672c451b853891dbd1e1a7916a5ba9d8289be920c38b12", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_pk.data": "4bf2ee81b7786e7a0cfa0f2458c309cae4e57359be8f2762a6a285bee630412e", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_pk.function": "d737a0b4314c3f0b827949088d632a46c206ec9961b924ba42cfe521aba60643", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkcs1_v15.data": "0567ec6c611cb0fce56b5de4d872070fd83c4d0a69f7c6c8ae1379b59bbbbcd6", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkcs1_v15.function": "018ae0c21a5bd71403109f327a53db3c65e3b510074615299af0366a94f74b31", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkcs1_v21.data": "b744ee7b5a9ee3aaff33beba47966c481a3e04a13a141e0597918d41aba2e65b", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkcs1_v21.function": "742e6aec71efff5d1e7dc959ec2c99b9ce6982684c9fb236fcd8dd433fd4c503", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkcs5.data": "e07bfc8f3a1d4b64d7ec48817271a9e8efb15fc7afd38fc2d113e3cca6ff2324", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkcs5.function": "b270e4910766fef26639d55a46bacebf835f81722d1aebb87e0e96896522d314", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkparse.data": "724b70c9cb88ae8a0340de7bd0fce0a375d1110fcc55a8f91c34b5ce6c01eec1", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkparse.function": "2923568d57d5b9035c07d35b2680f33995f0bb680d95e4bf051c15d99481df87", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkwrite.data": "f8a8298c71f150c92cbb03e1d4f1d3e44f9250830254ae9d53ea60190ca7c00a", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_pkwrite.function": "8173093c4a9304683c04b153a1a859b6864617990d5993cc0a6a89e4d1442b82", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_poly1305.data": "8400f29de180cb267c3d859751a5fcacb7229ad74d01f4f3510b816c31cbe28e", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_poly1305.function": "1d11c12b107ff5a5fedc17f884319ed2448dfd7653c1a75539b501557004e20a", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_rsa.data": "0dab4e56d6a60853b51ffa68f3877ff837158540af482653552142628566141d", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_rsa.function": "9d9de755301c97415442bc4c04eb6f218afbb0c7ae3bb823787da7d357350989", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_shax.data": "3cb81f31f418afbb599ba2a4ebba448118258529b54dad4efc4ada9a572f4071", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_shax.function": "42bf445bb76dc2a4d670ada1c6f596f9af021ac91cdb289013098eb8aa7e7b6e", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_ssl.data": "b1efce35b0a401eea4efa281a45adde4990cbc7842115e45764b04634fc23b80", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_ssl.function": "e2cf91110ab2c874f92145f930fd14cf6e2b85012f9b2f842698214eba989fcb", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_timing.data": "993181c28e523e656551f6609a01e84147eb38860acb9390f0a6e3335043652b", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_timing.function": "0b011ca1d13031e56211afb7dfb55ea4e8a1f9a0e46797dbe47dc12b9426b4d5", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_version.data": "d0a5d0fa4b0ab50162d7b59c6f54fc4957be0826653320a02bf0c82612c42ffd", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_version.function": "8b98758e5787c5f515673b17aad2f472b9068b6763ac9aadd8e0bf834c327f78", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_x509parse.data": "5ab86242589441ab2c39fe18b20b0fb0154d83820312dd9cf8d70466c4e8786e", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_x509parse.function": "1eac39f6b7be1f527fc4fea4cdb92bd4d67a3141311ea766a43ea276a32f7d43", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_x509write.data": "e60de9c4eae061cf290becd9d18b41fdd481eff89ce881eb0e3b7a8609568390", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_x509write.function": "f3b3fbcd616ea3e236d2f9356898a28c7cd5cbbf39744b9c8ceda1965e8c5be5", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_xtea.data": "017f8dd2c0679813a57da016c74cb64885e30b8e77407a2943404fad7088f8b9", + "libraries/3rdparty/mbedtls/tests/suites/test_suite_xtea.function": "f66b9841ed246d5eb49127bdbd987c872bdce3528a11898a5910015f908e856c", + "libraries/3rdparty/mbedtls/visualc/VS2010/aescrypt2.vcxproj": "043417123026fb4ecf7feb7fab9e0de963267db1e99a2f84377e32f237b8045b", + "libraries/3rdparty/mbedtls/visualc/VS2010/benchmark.vcxproj": "34cee46f91829888dae67a0bad640021ae3dabbed980e48e8f44b06d243c74fe", + "libraries/3rdparty/mbedtls/visualc/VS2010/cert_app.vcxproj": "9580c3f083cd393a5e2226e7fde83ded1bba1d4e8808cc28d31d2eed572cd9f4", + "libraries/3rdparty/mbedtls/visualc/VS2010/cert_req.vcxproj": "bca5bd8f551c2e14e1acbaab71c19158d40f2d5f3e9db3098574941445480c11", + "libraries/3rdparty/mbedtls/visualc/VS2010/cert_write.vcxproj": "65e112c3cb0b0faeec340038348ca5e00129855ef5a368276b98532fc4169f9c", + "libraries/3rdparty/mbedtls/visualc/VS2010/crl_app.vcxproj": "dde58959d674e5207bf466f17d8e1dab12c6576c876afb460e262d65bd94d211", + "libraries/3rdparty/mbedtls/visualc/VS2010/crypt_and_hash.vcxproj": "be8bca3061c6a08afb42d28955b900ec657f3eee992b3f6cf1466d3de530598e", + "libraries/3rdparty/mbedtls/visualc/VS2010/dh_client.vcxproj": "23b585cead69c28cd5f5d8f2422ce1303fc3d5d9cef4c8ff5369bb4a47380a58", + "libraries/3rdparty/mbedtls/visualc/VS2010/dh_genprime.vcxproj": "b68c83f7806600023c07f99b55d96b78c28e1da33084ee8c7761a09254aac871", + "libraries/3rdparty/mbedtls/visualc/VS2010/dh_server.vcxproj": "7668df571d04ac9f506d81dcedcc7989e4fb37b53c671022f5e1ed2142406935", + "libraries/3rdparty/mbedtls/visualc/VS2010/dtls_client.vcxproj": "cd0e324e374771c8fd81d1b712bd9746907d4adb2a0306f41083cd5233646400", + "libraries/3rdparty/mbedtls/visualc/VS2010/dtls_server.vcxproj": "aee3d1aa6d02766251abda965cd1e7d319f89b28857c51cd52b6dcfd56cafe18", + "libraries/3rdparty/mbedtls/visualc/VS2010/ecdh_curve25519.vcxproj": "cfefecf91e435b351c1827359c66288b552b8d718f559ee1232315b4e2939d13", + "libraries/3rdparty/mbedtls/visualc/VS2010/ecdsa.vcxproj": "c7e955ac8bbd73184fe2b780a037f332939f16f82f4a4fe80f2e7c35680f8fca", + "libraries/3rdparty/mbedtls/visualc/VS2010/gen_entropy.vcxproj": "aee08d42d11354169db4d4ced618439152eabcc463245599ffabf99ee415827f", + "libraries/3rdparty/mbedtls/visualc/VS2010/gen_key.vcxproj": "61ff766c46b082fe2d67278758c1d660cd77e1ec3794302b6753e7e878ff4f25", + "libraries/3rdparty/mbedtls/visualc/VS2010/gen_random_ctr_drbg.vcxproj": "29faff037f31c0b46ad6b27bb7a3f7655a22f9d4c9d217851b929c3b8c88d289", + "libraries/3rdparty/mbedtls/visualc/VS2010/gen_random_havege.vcxproj": "2d2beea10745cdc4e30a344ef9e45685a06178ed1d1941b71dbea7a070329b0b", + "libraries/3rdparty/mbedtls/visualc/VS2010/generic_sum.vcxproj": "7fd50ca75ef487a1ed27104ef13c904ad004c2b8bbc02d36797d926eca0394df", + "libraries/3rdparty/mbedtls/visualc/VS2010/hello.vcxproj": "01909abbd4aa403ab94e7b90d2a06a3386ee0477f90f3758014e4b3efacdb46f", + "libraries/3rdparty/mbedtls/visualc/VS2010/key_app.vcxproj": "596766dd8fc0b019fbb13401d9440a8aadd9829aad005a17c3d4d0c1c9eb0be8", + "libraries/3rdparty/mbedtls/visualc/VS2010/key_app_writer.vcxproj": "df9075ea39ade11af038a75b5ce028c1700509efb2045be029f0ee770293a11f", + "libraries/3rdparty/mbedtls/visualc/VS2010/mbedTLS.sln": "7441c19db10b4a8d5103c8d7d80d08561787b559dc07e2c7021526951c24cb12", + "libraries/3rdparty/mbedtls/visualc/VS2010/mbedTLS.vcxproj": "bb229c5d7f7c7b9251402659b893aa9ffc467b89f17ba25d18f2a42c61ad401a", + "libraries/3rdparty/mbedtls/visualc/VS2010/mini_client.vcxproj": "32465df45b9ae4f08cf61060171ca5937210479a05a3de0e23f879e727855357", + "libraries/3rdparty/mbedtls/visualc/VS2010/mpi_demo.vcxproj": "27ed3a0fa397ab79b6caf824f560a0915615e51249813b5ecccd72b779c757fb", + "libraries/3rdparty/mbedtls/visualc/VS2010/pem2der.vcxproj": "ed28151a49e03835ed5fc94d15df5473bbdaf05ea382e13a247d7e4631115666", + "libraries/3rdparty/mbedtls/visualc/VS2010/pk_decrypt.vcxproj": "2f21f6eb55916f2ae34786f7fa4cf0fc67d9ed5a070bcf690feb5e126c30423f", + "libraries/3rdparty/mbedtls/visualc/VS2010/pk_encrypt.vcxproj": "59a5ac8fda4823a2bc0a18e2f44f9ca9c16c1a4677dd393c34fa276f0988c6c3", + "libraries/3rdparty/mbedtls/visualc/VS2010/pk_sign.vcxproj": "074e424d129819722963606b7ae22a9ce156f98c3c73e8b711dd0d10bb3a5ffe", + "libraries/3rdparty/mbedtls/visualc/VS2010/pk_verify.vcxproj": "42bc1c83134a2b9c4d6e82cb86d6690b27aad36bc63734dc2b7ccb6923f33a21", + "libraries/3rdparty/mbedtls/visualc/VS2010/query_compile_time_config.vcxproj": "24fe4c0e40eea1dc83caf05cf6b21aba63f852d06eebf2148ecd22bee036cba8", + "libraries/3rdparty/mbedtls/visualc/VS2010/req_app.vcxproj": "77d1008065a894f9e7cf2b66119e6fa25109d670987d9dfede21ddd51493e3ad", + "libraries/3rdparty/mbedtls/visualc/VS2010/rsa_decrypt.vcxproj": "042f0dd2e60edd7f93ea561430e685691d917039639968e28a5911214763cbed", + "libraries/3rdparty/mbedtls/visualc/VS2010/rsa_encrypt.vcxproj": "90c6fb6ec43949f0c5046b9b6f5b1e096b848f1dcfa39b8f2422f772797cb65b", + "libraries/3rdparty/mbedtls/visualc/VS2010/rsa_genkey.vcxproj": "1f1c10d55bfdb19df26e142746c57764d1cd33a6cdc9633421e7a74a2af3c0c0", + "libraries/3rdparty/mbedtls/visualc/VS2010/rsa_sign.vcxproj": "a52f6dfee4063e6019de15aad3e80afaf12cf8a3802b4cb6a228bdbee765dfa4", + "libraries/3rdparty/mbedtls/visualc/VS2010/rsa_sign_pss.vcxproj": "0aa419945b0e791d9a52832c4994d09a763db3f69e0b7438b104d72524626565", + "libraries/3rdparty/mbedtls/visualc/VS2010/rsa_verify.vcxproj": "be38b7d95906fec9e03c1edd94696964d5b19cc07e7225d856f11c827a8a997b", + "libraries/3rdparty/mbedtls/visualc/VS2010/rsa_verify_pss.vcxproj": "1cd735720dfc3d49fcd73266d6415450552e8849cfeae92a6c3b69976defe7f8", + "libraries/3rdparty/mbedtls/visualc/VS2010/selftest.vcxproj": "3cd55a43710848fe4fb93f9100aafee8a9b55b9ad2c3fc5cb7fd55c8f28259e8", + "libraries/3rdparty/mbedtls/visualc/VS2010/ssl_client1.vcxproj": "2ac345d74bacc5571ae3ae589cfd4eb4c014de9bbea70a6ecd4247147f768073", + "libraries/3rdparty/mbedtls/visualc/VS2010/ssl_client2.vcxproj": "8d149c88bb194d9f58f36e6fc4c75a9c1506e41583c77c30522205d76e080c84", + "libraries/3rdparty/mbedtls/visualc/VS2010/ssl_fork_server.vcxproj": "084f8a23607a2ab7ad8287c666a4d9dc4bf64a587aae161112cee1386cffe8ec", + "libraries/3rdparty/mbedtls/visualc/VS2010/ssl_mail_client.vcxproj": "6e745dc8d478c49096fb69ba23c93a90509af3290bae804732cbb537e735c929", + "libraries/3rdparty/mbedtls/visualc/VS2010/ssl_server.vcxproj": "e7915db39ed4e284ff456dc480e06553714d5675ac705dfe6579174db5be83cd", + "libraries/3rdparty/mbedtls/visualc/VS2010/ssl_server2.vcxproj": "9ad201669aedeb9cccb9ea637785711a40c12f11c7d9af3381a09a490e4079fa", + "libraries/3rdparty/mbedtls/visualc/VS2010/strerror.vcxproj": "fe12f430b31f3ead1fd255bdb8be4c5d52d514a45368ee7031a2a5830648b716", + "libraries/3rdparty/mbedtls/visualc/VS2010/udp_proxy.vcxproj": "f2b043d5c3cbb825ffedb24cb67142bb3476aa1bb0e5c945499938a393364f44", + "libraries/3rdparty/mbedtls/visualc/VS2010/zeroize.vcxproj": "e2897300a0d3391be518af3fde0cad4ffae8664837f357cb0186843d20de7f13", + "libraries/3rdparty/mbedtls_config/README.md": "dec5f4f70730361ebe2e653ac748bda384760382f7d7afb8dd70876113c5dba5", + "libraries/3rdparty/mbedtls_config/aws_mbedtls_config.h": "9d61ed03d900438108379718d3429771377913119e0f23b19ec2249ebd2bd00b", + "libraries/3rdparty/mbedtls_config/threading_alt.h": "cab329f93a556fb6fefb28b5d5d2bcc05df70e6be7e67c107c74fff0c3354e66", + "libraries/3rdparty/mbedtls_utils/README.md": "e330a21d504573dae72d764abde401f6378db3852d67be4e8bae291d6ef1a99b", + "libraries/3rdparty/mbedtls_utils/mbedtls_error.c": "906e1e5d8f464f2c8827fb83f7a249785de36ed1f034d225370a3ba211c2cf5b", + "libraries/3rdparty/mbedtls_utils/mbedtls_error.h": "ed6e816433e7e9aad9614cf1a2c04a92e081f803fc1665485a1c56caf06587e9", + "libraries/3rdparty/mbedtls_utils/mbedtls_utils.c": "e6eb0721fdb03edd8345cf5639b21d724fd05acac3bb5ef945e3cb5e158781a6", + "libraries/3rdparty/pkcs11/CONTRIBUTING.md": "400098f5776f8d6289aaa5517f2d33fbc28d98d9612ccf3d4cfc85713d674d95", + "libraries/3rdparty/pkcs11/LICENSE.md": "9bcb0c0cb10c9dbe5090ea05b35ac12160a295c2704b178b2c661c10acfb96e8", + "libraries/3rdparty/pkcs11/README.md": "0e2538782b336a90335524fd19be0e2e21cbd197f161a2aa8f0fc82993eb1609", + "libraries/3rdparty/pkcs11/pkcs11.h": "8bb7aa1aeaa328b6a39913070d6f3d2bdeb9f2c92baf27f714fbb4cbefdf4054", + "libraries/3rdparty/pkcs11/pkcs11f.h": "a85adad038bfc9dad9c71377f3ed3b049ba2ac9b3f37198a372f211d210c6057", + "libraries/3rdparty/pkcs11/pkcs11t.h": "5b58736b6d23f12b4d9492cd24b06b9d11056c3153afc4e89b1fe564749e71a2", + "libraries/3rdparty/tinycbor/src/LICENSE": "3c6ba0b5bfa7830505301ffb336a17b0748e0d61c4d34216e9dc98f10e40395e", + "libraries/3rdparty/tinycbor/src/README.md": "6d6489fb7bfb247f44438f1e73e2f24db38ac3d4b586eeb31d60091a2a6b830f", + "libraries/3rdparty/tinycbor/src/cbor.h": "0fb03658e551dda420c7bfc54cc029c1dea0c9cd906aa23c79a112934f3c5a53", + "libraries/3rdparty/tinycbor/src/cborencoder.c": "bb6539de51904920d2dbf9fc46881a7c7f1f1b27dbf0031ce4873fcefa1627ac", + "libraries/3rdparty/tinycbor/src/cborencoder_close_container_checked.c": "fee715bd5a28e19d7451ef973bd20d08fff8d82a5e59efe6aa89cc738368bf32", + "libraries/3rdparty/tinycbor/src/cborerrorstrings.c": "d2c611466a5702fae92c459844bf9495d90a2fffc1efcd847f188a06feded5b6", + "libraries/3rdparty/tinycbor/src/cborinternal_p.h": "5a58680dc3e1b58220f9e76e18b446caec57f1af75c765116700d60ec105c055", + "libraries/3rdparty/tinycbor/src/cborparser.c": "1decbbb7145a322de9dffd82e7319ac18b84fd0a4c480b8b36f1459aacdb1693", + "libraries/3rdparty/tinycbor/src/cborparser_dup_string.c": "95cbbfe5d49ad5afc8684df17cee7c0b016118da659be49a0230c2a7938cae5a", + "libraries/3rdparty/tinycbor/src/cborpretty.c": "04663de61f37618a25d7509a518e3da4764353b666aab42148181ac83af07406", + "libraries/3rdparty/tinycbor/src/cborpretty_stdio.c": "d5a3178cee64625fa418f36970a666e8eee83e92c395acbd2b89220db93de6fd", + "libraries/3rdparty/tinycbor/src/cborvalidation.c": "53aea74b993f99365260fe25f51071c1b4be95c987a47518e3d26dd56c23b531", + "libraries/3rdparty/tinycbor/src/compilersupport_p.h": "3401cb759b3783bdcf4c8566e99010b364d7348a3f267b15f5f635f09960bab6", + "libraries/3rdparty/tinycbor/src/tinycbor-version.h": "77fc28859af9c24b7dc37aee0a73a07c0c90e7500b73e51c2d4a76c709ad5978", + "libraries/3rdparty/tinycbor/src/utf8_p.h": "b0efa3c4b2b04c4db2809989a86206f9277de5a79ade4838df9bbfb3e17db4bb", + "libraries/3rdparty/tinycrypt/AUTHORS": "478b050e66ce46564c1d081590edc7f3db7fcf1894430d20a9b6b550029d4ab8", + "libraries/3rdparty/tinycrypt/LICENSE": "b2d451fcba3577b118741d733d37ebd15bdd0b6b381e554a7345bdbfa3743108", + "libraries/3rdparty/tinycrypt/Makefile": "7c3c3e1913882fbc6e9ef5c567505704fbe7f12cf55a842eca5b19df8c868ef5", + "libraries/3rdparty/tinycrypt/README": "d795d171058c36cdb8ce718fd615846f345815465efe011aa0b215df86e53a38", + "libraries/3rdparty/tinycrypt/VERSION": "283571d2642fc7b3befd294f45d53b896a1d54d34c86235b13151192b380606a", + "libraries/3rdparty/tinycrypt/asn1/asn1.h": "89499b4d992a8a347ac4805fe01af0c5977ce6237ccb628589b6f885b2e1423a", + "libraries/3rdparty/tinycrypt/asn1/asn1parse.c": "fa021fe9c65c28090e841387b71f59484f62abebf5cafceb0fb555c0dcd572da", + "libraries/3rdparty/tinycrypt/config.mk": "ce91366509d78906308eb30de2f85bfb894b48146ea01d644c734e1a8ca346d1", + "libraries/3rdparty/tinycrypt/documentation/tinycrypt.rst": "8d5716676abf2f0036d58ee7691da44953d8efe97020ed4a5edd4afbea5c054d", + "libraries/3rdparty/tinycrypt/lib/Makefile": "b6bde2680a639927714b1db0cab6c038101d0432d45a08fa6da157aaeff21ec1", + "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/aes.h": "bd9e1ea99ec9717aa68f8c2b9b8844c11a7557017dde19c0ea7ca9599ce28c8e", + "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/cbc_mode.h": "9d04a528294793b47541cb70fe4e83f5c0a70b4c550fb49bce90a22dc863a191", + "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/ccm_mode.h": "79347427c642f708ae10f24784236a5e5a328f807b100a5b0fe90db70bc6432e", + "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/cmac_mode.h": "6f9727d78078f9ae016f18b2ec420f3e6f8afc60e0ea5fa0fbc8e8a646e8f53d", + "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/constants.h": "89c80a6d5f468ebde82fb525a6dd72685cb27720fd385da6e3f3f2a19fba48ec", + "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/ctr_mode.h": "1f3fe4a524a86e9c659643e608e81287b4e898e58316f28ca51b19c212e4bd72", + "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/ctr_prng.h": "8d0f25e6cf23cdd8634778fcba10af888d24fd0d11c496f1b9a0440cd45b2509", + "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/ecc.h": "ab1904e162dc994ef0b0174dcee9e708d57d58828dc5d819ba71713ac443fee4", + "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/ecc_dh.h": "1e8bda76ea0f2673d371a752ea57f3e5da621a3007fd891fa28d4ed555227185", + "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/ecc_dsa.h": "c6545de8ba4490efbde181189b999938b43c36cc1e905d0a12decf1b526b4769", + "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/ecc_platform_specific.h": "ed890b375c177e7abad7b188ac0a737e87d43224325cd1ed944bad3d25c470cf", + "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/hmac.h": "c981663602ae9c4df8f7c2fe5d6e1d2cb1132fc0b90beb4e4eef536d9f54b82b", + "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/hmac_prng.h": "c7d780c4bf3fb23f45ec1225f31f0c8a851c5693f47adf76fb76b7f140ce136a", + "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/sha256.h": "90eb15d8cd82f81ba163c53b199c04eb9e5fda52a41901bb380dd80097f57902", + "libraries/3rdparty/tinycrypt/lib/include/tinycrypt/utils.h": "c5c169e0ae15e394588d7d6797a28af9ab251b1ed1169b3207625752d8d8fc8a", + "libraries/3rdparty/tinycrypt/lib/source/aes_decrypt.c": "edad5e3570012bcc1da57869fdb2bc4e0c6e733fb67f7b362bcc71f88d0af017", + "libraries/3rdparty/tinycrypt/lib/source/aes_encrypt.c": "90957c91a22214b18653bae4ef4abeca8bc6674051c48fe0c97c413a6d65e555", + "libraries/3rdparty/tinycrypt/lib/source/cbc_mode.c": "e09c83712a618ba08a60fef3e5ba2ed5bf712fa6b8c79a074cbf5731665f7ffa", + "libraries/3rdparty/tinycrypt/lib/source/ccm_mode.c": "089fb37565150785cf67c20457fb95409d860cb0b572348148fb09d3d11ac6fd", + "libraries/3rdparty/tinycrypt/lib/source/cmac_mode.c": "67e2a2ac539ed72bd5ee80cd377b1b5f5148f6c743bd8c89904a393d39a5a8d7", + "libraries/3rdparty/tinycrypt/lib/source/ctr_mode.c": "30ce4835f928dc331ed74f86de26b9839ae50e703e6086434edaf3ba5a87473a", + "libraries/3rdparty/tinycrypt/lib/source/ctr_prng.c": "c0a2de479ae4bb72b89236a44058d387e14670f24e114298ee14173c41bd5315", + "libraries/3rdparty/tinycrypt/lib/source/ecc.c": "1c56234ff29708c712d07f864ed498eb6b0ab8475b5b5824079ed0c77070ea1b", + "libraries/3rdparty/tinycrypt/lib/source/ecc_dh.c": "bf6a6ba824721d9fa781b594ade96cbb97d47f65dd7fe5b431dc0ac6eaf335a1", + "libraries/3rdparty/tinycrypt/lib/source/ecc_dsa.c": "f80751d74bc9be544308f5b7495492b68e552b7283540cd50f9d0f295df13591", + "libraries/3rdparty/tinycrypt/lib/source/ecc_platform_specific.c": "17f454ecc206f2ac532c517b13beb56ff730e71efb93eb70b20ee71617a8eb7b", + "libraries/3rdparty/tinycrypt/lib/source/hmac.c": "6c9141de8af68822f611b4213801eda5a8695ece071b3bef34dbb6e52ffdd709", + "libraries/3rdparty/tinycrypt/lib/source/hmac_prng.c": "3a64017e98bd7b25f33819cbcd597d48e9ae00478201a68a485cf7e04f400274", + "libraries/3rdparty/tinycrypt/lib/source/sha256.c": "a8ad4bb2c09e31e4ab86c1b4f8fa073937a42e2694afb4dde6cb1b3c7a4b5ffd", + "libraries/3rdparty/tinycrypt/lib/source/utils.c": "2cf7cd3ee3b48d05b925dc005c1b12ead098f3939e948f55e278e16c180e8d8d", + "libraries/3rdparty/tinycrypt/tests/Makefile": "5d72dc2308dc2cdf16a6565b700d931a9b2ab72550af58a890993f301002c6f2", + "libraries/3rdparty/tinycrypt/tests/include/test_ecc_utils.h": "f793eb6066f90db4222a4d95d47e5f6b2e480bc07e1766e05cd091ccf8cc565c", + "libraries/3rdparty/tinycrypt/tests/include/test_utils.h": "bf74d9342f08637b56652c599b2956a21c56d32e80ec1e9d74b4909bd12b4122", + "libraries/3rdparty/tinycrypt/tests/pseudo-random-data.bin": "87944d1d1787ad21685f9289a5f5e365d7582f395d9d2dd9b122b837b30d1c61", + "libraries/3rdparty/tinycrypt/tests/test_aes.c": "27060817b7a6b0646aa5c4d55bf51586b976326bf165ae9ebdde7f5b26cf5f6b", + "libraries/3rdparty/tinycrypt/tests/test_cbc_mode.c": "59dfe4f51a60b38bb5d6cbc0be5db9ae795c993e58663e58f5fd9998e71f88aa", + "libraries/3rdparty/tinycrypt/tests/test_ccm_mode.c": "32249f37c22a339f6e1b0140fdee83402226a70726fb7beeab225a0989120073", + "libraries/3rdparty/tinycrypt/tests/test_cmac_mode.c": "1b48ae8a493e009e09d9ea9829353a4b90a71c21a297373c242215a67f2b683a", + "libraries/3rdparty/tinycrypt/tests/test_ctr_mode.c": "be4ae7b236ea863937b6091aa1f3717df196a333fbf39ff922d7da0c8eacc512", + "libraries/3rdparty/tinycrypt/tests/test_ctr_prng.c": "f745a4d272810460c85f8c1781da7977e7fdcf02e02d25f34e363b60c8291c9e", + "libraries/3rdparty/tinycrypt/tests/test_ecc_dh.c": "28d253afaa2f1e329ba5ccd4266b34d45346e77235fecc593a78a360ef6195e9", + "libraries/3rdparty/tinycrypt/tests/test_ecc_dsa.c": "55533e65df9e3c7e2e792c92ca5a567b692b92c289c21f12b3cfd75b385fef93", + "libraries/3rdparty/tinycrypt/tests/test_ecc_utils.c": "4ff6a5f2f5465f485ab2333cc4dd15b2244ca875cc016b6e646510d218ba3be8", + "libraries/3rdparty/tinycrypt/tests/test_hmac.c": "c0bca5221fbb587f5c29477fa062d7e30297914c1010102b5f6f47f2cb37e143", + "libraries/3rdparty/tinycrypt/tests/test_hmac_prng.c": "bbdabde91a268dc6b3a20f0efdff63e2d099848a013edfa7e956358ef3a9caf8", + "libraries/3rdparty/tinycrypt/tests/test_sha256.c": "b154011602efffd7319ca8eb6a0a04b9476efe2c1abb42f09748c3ed766197bc", + "libraries/3rdparty/tracealyzer_recorder/Include/aws_secure_sockets.tzext.h": "7a32f358eb66e499cfd083206ef4c7c5da6e1be9374cf50f3e5e286997a9c1b4", + "libraries/3rdparty/tracealyzer_recorder/Include/aws_wifi.tzext.h": "77cda4235e4436878fb5cc5a850075a6ac658b00269fa831d71983f9c0d43137", + "libraries/3rdparty/tracealyzer_recorder/Include/trcExtensions.h": "4750f0f01b17b0b989b59d0d3db673a67de759162d896a3dd89a8b2a9cc43940", + "libraries/3rdparty/tracealyzer_recorder/Include/trcHardwarePort.h": "b22ec1a829e1370154dd9217fae634d714b1bd8765dbeb36dde4529454d98f1c", + "libraries/3rdparty/tracealyzer_recorder/Include/trcKernelPort.h": "4e0a7fd011a2f5acb912f51ff0c1349ffc7a82805ed027a41d3f78737ca20716", + "libraries/3rdparty/tracealyzer_recorder/Include/trcPortDefines.h": "bcbd866a94a9bb5696481eb7e8540101d78dd82d963b2bdb56626a3dd51fa15f", + "libraries/3rdparty/tracealyzer_recorder/Include/trcRecorder.h": "c1e4d5e4ae87b38240e351aa3c93b570e153ad6f326666acd9067ed5e0953fad", + "libraries/3rdparty/tracealyzer_recorder/ReadMe.url": "3fbfd84c715d8e6d3df562c3019b2892139b098641d42d3f5b91781704bf2bfb", + "libraries/3rdparty/tracealyzer_recorder/config/trcConfig.h": "e20d06dbec2b222c6faee3fd940c675028494d0cef41c5d524439e3ba4dccef5", + "libraries/3rdparty/tracealyzer_recorder/config/trcSnapshotConfig.h": "2565df36a1c0c3e50314d3cd10b9a0675f875259da9534b318c7c814ee3ab76a", + "libraries/3rdparty/tracealyzer_recorder/config/trcStreamingConfig.h": "91321655d6de4bbbb05dc2d3d0c36561de70555c627271902c630350e63b8b77", + "libraries/3rdparty/tracealyzer_recorder/readme.txt": "607e810b5ab8d1dcc6101c4af4d5212cb9eb905dec8611361395085198c7becb", + "libraries/3rdparty/tracealyzer_recorder/streamports/AFR_WIFI_LOCAL/Readme-Streamport.txt": "42c43ce0b02c9d7b83ab4786ec246ac359cb034bb694edb2e8b99f16b024d0d3", + "libraries/3rdparty/tracealyzer_recorder/streamports/AFR_WIFI_LOCAL/include/trcStreamingPort.h": "16d3453f41635e9d396537d41d05510662121445a65d8aad713a0612393df71b", + "libraries/3rdparty/tracealyzer_recorder/streamports/AFR_WIFI_LOCAL/trcStreamingPort.c": "ba201fe8d90a15471d06653c4157633c494e467b82e1bfef4d886343868e9cb0", + "libraries/3rdparty/tracealyzer_recorder/streamports/ARM_ITM/Keil-uVision-Tracealyzer-ITM-Exporter.ini": "f115f28d185d7158c6e1b2d7671865aafbbd30bb91f231e69a502173b247d374", + "libraries/3rdparty/tracealyzer_recorder/streamports/ARM_ITM/Readme-ARM_ITM.txt": "9697b415f9559bd5129444f67ffd9283456323b267439399af97bfd9e769b621", + "libraries/3rdparty/tracealyzer_recorder/streamports/ARM_ITM/include/trcStreamingPort.h": "f3a13f5f3e5fdb57a21e9ed8978d25bbbd40176e2f74316f84bb903c79888fe6", + "libraries/3rdparty/tracealyzer_recorder/streamports/ARM_ITM/trcStreamingPort.c": "b8c2dddc68e2976fe7956e679e90e88eb793719b48e1c7b34f7240067915f50d", + "libraries/3rdparty/tracealyzer_recorder/streamports/File/Readme-Streamport.txt": "bab3659daf227c8b13136ce0e9596e5afeffc29de4d156e3040f1535a6f0482b", + "libraries/3rdparty/tracealyzer_recorder/streamports/File/include/trcStreamingPort.h": "6de4cfc1f5305ed7741a541de6f19844ad633cd1376a58e654d5cedbe2120f49", + "libraries/3rdparty/tracealyzer_recorder/streamports/File/trcStreamingPort.c": "459f57c182a7db1242bf713b2e583bea3b6162777becd7e444e7aefb42bb642b", + "libraries/3rdparty/tracealyzer_recorder/streamports/Jlink_RTT/Readme-Streamport.txt": "09c5ddedff88c85b1acb667dd53627f663df8831a710d7d5a62fc7db4db79ded", + "libraries/3rdparty/tracealyzer_recorder/streamports/Jlink_RTT/SEGGER_RTT.c": "7373709c2e587cd1abd221a6f249f9a6e14d8c11ee0b3d75d701b973586f7369", + "libraries/3rdparty/tracealyzer_recorder/streamports/Jlink_RTT/SEGGER_RTT_Printf.c": "ee399915fdbdb91901d825b3c1696f9add8936c354064ff4dc3e69a0dac6ccbe", + "libraries/3rdparty/tracealyzer_recorder/streamports/Jlink_RTT/include/SEGGER_RTT.h": "5da6bbb8b2d11faf2b948b00da9af146bd68dbb51245578e7167a1cb77ef9e5c", + "libraries/3rdparty/tracealyzer_recorder/streamports/Jlink_RTT/include/SEGGER_RTT_Conf.h": "231b7db1562922b395620e05937ebc6438e0f0323bd95057b987294b0872a510", + "libraries/3rdparty/tracealyzer_recorder/streamports/Jlink_RTT/include/trcStreamingPort.h": "83ec42f63402acd8e671d71e6724713b798ebcef792a1a2ff61e6facc34308b4", + "libraries/3rdparty/tracealyzer_recorder/streamports/Jlink_RTT/trcStreamingPort.c": "a33163cb9745dc3670a1bc7d3e60a128005bfc1b0c1734172729542577cd92d2", + "libraries/3rdparty/tracealyzer_recorder/streamports/TCPIP/Readme-Streamport.txt": "1bad876ee3af398df3fafb1f41afa99649bb4a54f5363ef41596df8d51cd8223", + "libraries/3rdparty/tracealyzer_recorder/streamports/TCPIP/include/trcStreamingPort.h": "4423f8db962d42ef503a606acc69758153c870407ce2eea914ed965309a149bd", + "libraries/3rdparty/tracealyzer_recorder/streamports/TCPIP/trcStreamingPort.c": "cd8293c3da466bb9b384d1a40d8f42521edd2941e575aa3095eb6e98e905ce09", + "libraries/3rdparty/tracealyzer_recorder/streamports/TCPIP_Win32/Readme-Streamport.txt": "780fa3af3812a6db0b2f364ba79ea9f53e19e4e8c7a66833e4270d8b4541588a", + "libraries/3rdparty/tracealyzer_recorder/streamports/TCPIP_Win32/include/trcStreamingPort.h": "780f0cd9bee4233e12c07342efc632008315c9e9bd3218e68382e3ded8ac48bf", + "libraries/3rdparty/tracealyzer_recorder/streamports/TCPIP_Win32/trcStreamingPort.c": "2d5a558ce8cbafdf29b186fb27d409622160929d151ef47adfcc18215ade2179", + "libraries/3rdparty/tracealyzer_recorder/streamports/USB_CDC/Readme-Streamport.txt": "a283d5e083e1a231cfb3bc17b30bbc01f4547dc740865d3cd9aa2b5878cbd531", + "libraries/3rdparty/tracealyzer_recorder/streamports/USB_CDC/include/trcStreamingPort.h": "6e7cf9f4d23c569ddb48d2a6cd7101e5266d95104c6a3a02326b89ab94c357b0", + "libraries/3rdparty/tracealyzer_recorder/streamports/USB_CDC/trcStreamingPort.c": "109bf4ca36cef6e364455ca8c4311ae614eb88e3bbfb0d5f0537eb03d65b64a7", + "libraries/3rdparty/tracealyzer_recorder/tracealyzer_readme.txt": "7fbf1589361df83fb3dae0e6ab4705bddfda4e6f5a38c44bfac9d7d408279407", + "libraries/3rdparty/tracealyzer_recorder/trcKernelPort.c": "bf314236cc6eec16119190cc91c96f9892d69f2f3f5887f7c658dda21385dab2", + "libraries/3rdparty/tracealyzer_recorder/trcSnapshotRecorder.c": "12f0c25ae2bd3a287e824d89c840a0e9ce6e3ecd892e830c1b403399a376fded", + "libraries/3rdparty/tracealyzer_recorder/trcStreamingRecorder.c": "a558fcea27ef041cb24615695a39ace3d84f81caa94534d0e7d69baf4d03cace", + "libraries/3rdparty/unity/CMakeLists.txt": "c9af8e56b8815a03197444cc642cfa5f33534efa6363573d94ba2c08c705e668", + "libraries/3rdparty/unity/LICENSE.txt": "3ed9b51da86f52c729c96cc99fdde6444b2297c788a9cf4ad1d3649dc34c4985", + "libraries/3rdparty/unity/README.md": "c4612d859d547fe4fd7a344899d33a6a0b91b65df4b3d90a75e1e766b36462a6", + "libraries/3rdparty/unity/auto/colour_prompt.rb": "e98b5171e72057bcfc19ae252f1c7d74ec93eca16957379ccce49da85712c4a4", + "libraries/3rdparty/unity/auto/colour_reporter.rb": "2e6fbc6a1718d1f755378a934526a5b4fe11ef045302ac1e1c251e927477d697", + "libraries/3rdparty/unity/auto/generate_config.yml": "85c5702a168e366148e8ec89df416eae888278a526c79459162c0f37641a02fe", + "libraries/3rdparty/unity/auto/generate_module.rb": "8d7ca483abf4bbd81b6b6e35628a31db43957b60ffd1fc9f5879976ae49d5676", + "libraries/3rdparty/unity/auto/generate_test_runner.rb": "3b267203eb9bc77ecd495024fedf857b3f7ac882804848a1d616028113ec5888", + "libraries/3rdparty/unity/auto/parse_output.rb": "3f33f2d75d316c767cf22ca59d404ff2287a5c8eeb37ebbe02f4bfe4ce099877", + "libraries/3rdparty/unity/auto/stylize_as_junit.rb": "d1d32f676a7de29b5c6526ddfff0f260f8881a2a2ccd06a31da34e94cca15d7c", + "libraries/3rdparty/unity/auto/test_file_filter.rb": "a69a44fccafbb504635163793799aa59809035951d7f258547d64d4145131a60", + "libraries/3rdparty/unity/auto/type_sanitizer.rb": "ecc5677ac9820f343aca50893463602fca940c24daf07a4784b4e9e0801c3f4b", + "libraries/3rdparty/unity/auto/unity_test_summary.py": "e46350b7132f04a7bb339d47bcef11ae0cb9e74c2050d0d75697b33c253c2895", + "libraries/3rdparty/unity/auto/unity_test_summary.rb": "22f41c7a277cb37895d742829ce9ca7ba65180a3b0011126c1e90c8cb1b37c20", + "libraries/3rdparty/unity/auto/unity_to_junit.py": "0743f26b5ae67af204981293337f9cc9a8cb46c90aaa3f46f31fd9658ab65990", + "libraries/3rdparty/unity/docs/ThrowTheSwitchCodingStandard.md": "f0f000eb1fc32b3a6684da894ed816d09ba077ad85e65e44f1f7998da47ef178", + "libraries/3rdparty/unity/docs/UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf": "28e8687d90c111ee8c249a7748495a0bfe00a3f35231b026ac73eed01d32eb34", + "libraries/3rdparty/unity/docs/UnityAssertionsReference.md": "4a7475082e43c174b8cb6d80d9505da5700d4ffadec7eb6923c813c57988ec56", + "libraries/3rdparty/unity/docs/UnityConfigurationGuide.md": "63008818f574d5a1cf365c484493dedca3763a563efd77f460a60325f30d4c16", + "libraries/3rdparty/unity/docs/UnityGettingStartedGuide.md": "c7eae02ffedd7ad4a112dab2ded25f238aed89f2358dd54bce7e64ae803dd4e2", + "libraries/3rdparty/unity/docs/UnityHelperScriptsGuide.md": "f8b89d36c0b901265fd3366f0a93045218c03adf501c240a5570bc68e22ceaac", + "libraries/3rdparty/unity/examples/example_1/makefile": "367e10ef968648ec5c531f144bb0ee257a619091a76fcc17516c220bf20539e6", + "libraries/3rdparty/unity/examples/example_1/readme.txt": "4d72d51f1a385cd4aeb594e4485ca2439d5b86247523cd2d2b89acc2173d8a24", + "libraries/3rdparty/unity/examples/example_1/src/ProductionCode.c": "9d6b0ae761f7dfc008d6547031ff92de63976f5621b6feef2a29614cec51b357", + "libraries/3rdparty/unity/examples/example_1/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", + "libraries/3rdparty/unity/examples/example_1/src/ProductionCode2.c": "c2cc0a76cb2ea145d3861bd9ccc467ac45ad3e8230d5075ed174ce3a5cd50a76", + "libraries/3rdparty/unity/examples/example_1/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", + "libraries/3rdparty/unity/examples/example_1/test/TestProductionCode.c": "33e4b165d437c376f2393da59be0b22a3a458ebbe94cc2b340159b71f2d8bb74", + "libraries/3rdparty/unity/examples/example_1/test/TestProductionCode2.c": "11387f2ecdc97ee3344c0df42123e73cae899702b348d5597e09e9760db267aa", + "libraries/3rdparty/unity/examples/example_1/test/test_runners/TestProductionCode2_Runner.c": "2c84d6b954a6810a7c509dc861ee0c18a562dd23a5dd7747ea524f0c1467d9a4", + "libraries/3rdparty/unity/examples/example_1/test/test_runners/TestProductionCode_Runner.c": "b6ec7bb984eddea80c178ecb30f6f772325a745ff9812a5e3f41f236c43e19e0", + "libraries/3rdparty/unity/examples/example_2/makefile": "9c925a4b80f11ce51cb65fef51f8e1279113dc67838c71b5bc8b0c31009e65bb", + "libraries/3rdparty/unity/examples/example_2/readme.txt": "a03bf4ac2d294a037189b42f7bf8fdff0bf50524857e3f8933eba76085f22f04", + "libraries/3rdparty/unity/examples/example_2/src/ProductionCode.c": "75136eec7a43d0dbe980dea19ec46f6e16c0da92093686e59f6143d8ae8b5bb7", + "libraries/3rdparty/unity/examples/example_2/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", + "libraries/3rdparty/unity/examples/example_2/src/ProductionCode2.c": "a929e7ef393ec5ccc53e3f885d663a1c8fbe5cc5f72a0fcad5c0d2f6cbc8b210", + "libraries/3rdparty/unity/examples/example_2/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", + "libraries/3rdparty/unity/examples/example_2/test/TestProductionCode.c": "7db7b7d9e7216fdc0814ff8bbecc37f40e573006207b47cfd8954469ebc9b502", + "libraries/3rdparty/unity/examples/example_2/test/TestProductionCode2.c": "332f23e940a9676504c84dc92d1a6cf72cd9204afe7f664c16b58ee7dbff312d", + "libraries/3rdparty/unity/examples/example_2/test/test_runners/TestProductionCode2_Runner.c": "14aef95de310f1e1381feaaf256ea94d0905a538311b5e3fdc944f927e75b287", + "libraries/3rdparty/unity/examples/example_2/test/test_runners/TestProductionCode_Runner.c": "a782491bcd8dd857b26a62df58e8671f1cb7641d6c0fe7f7853c079732ccd8e9", + "libraries/3rdparty/unity/examples/example_2/test/test_runners/all_tests.c": "fe5c0418201d70dc696b0db6acf60b2ea0069d74fa94fb96d7169b8752e00d17", + "libraries/3rdparty/unity/examples/example_3/helper/UnityHelper.c": "091c2466d25deffd8958332ad03d393ca1ec1b1f6150c16626d57d5901eb1b21", + "libraries/3rdparty/unity/examples/example_3/helper/UnityHelper.h": "a95bb6d3704c51637bb0855787236b41229e3836601ba97e88768f95779f3d4d", + "libraries/3rdparty/unity/examples/example_3/rakefile.rb": "2bd39eda1eb55bddd65a0a1536f707c2304b70bca3ac6bba6c0790d745a79a45", + "libraries/3rdparty/unity/examples/example_3/rakefile_helper.rb": "cfee16d634da56580eb6e7cdd5fe6fdffe432b21fba11f7262949d94f4622470", + "libraries/3rdparty/unity/examples/example_3/readme.txt": "2af5e731fb1db0ddf5c739f0b08fb2724e4acc7efb7ee0a02fe474a3e69d284a", + "libraries/3rdparty/unity/examples/example_3/src/ProductionCode.c": "75136eec7a43d0dbe980dea19ec46f6e16c0da92093686e59f6143d8ae8b5bb7", + "libraries/3rdparty/unity/examples/example_3/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", + "libraries/3rdparty/unity/examples/example_3/src/ProductionCode2.c": "a929e7ef393ec5ccc53e3f885d663a1c8fbe5cc5f72a0fcad5c0d2f6cbc8b210", + "libraries/3rdparty/unity/examples/example_3/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", + "libraries/3rdparty/unity/examples/example_3/target_gcc_32.yml": "2e61fc6bc7930929985f1ea1ec5d0019fe1d133c01555c86b01b20145fb6aaa4", + "libraries/3rdparty/unity/examples/example_3/test/TestProductionCode.c": "b0e815e2285b1730d7dcd24b400d15b4efccfe5e4776d96248a2165c2f0caec6", + "libraries/3rdparty/unity/examples/example_3/test/TestProductionCode2.c": "895f437abd40bd461fd86a3b8ed6bc02c5c283fc3926aafe53b473e477fa0a5a", + "libraries/3rdparty/unity/examples/example_4/meson.build": "b7ca305825ef9e6bef4e3a3fb4d0fba19882073e1f2c4e755f8044f697b93119", + "libraries/3rdparty/unity/examples/example_4/readme.txt": "d16faba668694cacde12746c58ec512de301218543217a9644e4e269bee8ab0c", + "libraries/3rdparty/unity/examples/example_4/src/ProductionCode.c": "9d6b0ae761f7dfc008d6547031ff92de63976f5621b6feef2a29614cec51b357", + "libraries/3rdparty/unity/examples/example_4/src/ProductionCode.h": "25cfcc42b79140f4c399363e0ef10a6e518a1831e10c61cc138d6d9a230425ce", + "libraries/3rdparty/unity/examples/example_4/src/ProductionCode2.c": "c2cc0a76cb2ea145d3861bd9ccc467ac45ad3e8230d5075ed174ce3a5cd50a76", + "libraries/3rdparty/unity/examples/example_4/src/ProductionCode2.h": "d4db1a4eea2bee3d668a203d4953f415f23be64a826c5a73059ef221f61b3882", + "libraries/3rdparty/unity/examples/example_4/src/meson.build": "46a328e6425249131d7ddc66bfd0b699638efec6d722e7f191621d60d7cb18d6", + "libraries/3rdparty/unity/examples/example_4/subprojects/unity.wrap": "59d1f20c0ada120ee62ef1baf30be51ebaaf40d30b16e4da014f9d58023b7a8a", + "libraries/3rdparty/unity/examples/example_4/test/TestProductionCode.c": "f3a8fa16e599d6aa7a0c9cf604ea1d42ff5466244372e00543fc3b2e116f0d41", + "libraries/3rdparty/unity/examples/example_4/test/TestProductionCode2.c": "26c0ee5fabc061cfd32ae891ab16f4b985f306dfea1a939d00e89a3c1ae6f25e", + "libraries/3rdparty/unity/examples/example_4/test/meson.build": "5b19fa4453b496f7a63de664c470ede7485d17ccd3b88a8e6a4b63d4da5be243", + "libraries/3rdparty/unity/examples/example_4/test/test_runners/TestProductionCode2_Runner.c": "2c84d6b954a6810a7c509dc861ee0c18a562dd23a5dd7747ea524f0c1467d9a4", + "libraries/3rdparty/unity/examples/example_4/test/test_runners/TestProductionCode_Runner.c": "b6ec7bb984eddea80c178ecb30f6f772325a745ff9812a5e3f41f236c43e19e0", + "libraries/3rdparty/unity/examples/example_4/test/test_runners/meson.build": "b8a2bfb8acb2f83d22a74700f1adb4e90474f11272aa341670fad17c7ae5e71e", + "libraries/3rdparty/unity/examples/unity_config.h": "e339e493a19a70352c324e371aba058e8795ef166d7af4f1edd8c49ed9771a70", + "libraries/3rdparty/unity/extras/eclipse/error_parsers.txt": "67e309b5e803a22ba22c347aa5123cbbe73edcbfe9950aa0fd74576a4add1a12", + "libraries/3rdparty/unity/extras/fixture/rakefile.rb": "00806fb140d73e67b0c3b6b944f0ab3197e51c0b88b975e6dd778043f1e7a9ab", + "libraries/3rdparty/unity/extras/fixture/rakefile_helper.rb": "db69f025b23ba4f30a38155a10199082ac45bc2cb49d6fe039365a3fde11c79c", + "libraries/3rdparty/unity/extras/fixture/readme.txt": "5692862a5fbc1910978be7ea4751899bafb6b913ce34cffa5517c0eba1fe40e3", + "libraries/3rdparty/unity/extras/fixture/src/unity_fixture.c": "29c1ed80d563a7b216b0fb4213dfc173094fd4f51d2e1c1ec188e75063386d59", + "libraries/3rdparty/unity/extras/fixture/src/unity_fixture.h": "6ef887747dcea12dcc5e24273aa1e792d90277ac4e32fb187969ed6217bf3131", + "libraries/3rdparty/unity/extras/fixture/src/unity_fixture_internals.h": "56eba22c7fd8c73d4bf8f95639f08abf63573f22efaec4b8061578b604eb556b", + "libraries/3rdparty/unity/extras/fixture/src/unity_fixture_malloc_overrides.h": "446d4a58dd88ce0bceba6e095ac4f26a4c55898e67265d688450fa3aacc7741c", + "libraries/3rdparty/unity/extras/fixture/test/Makefile": "665bba3afaf6ebd289432b039e40b03a24c7fee6f4dde8f82b1a7468fe82a7e7", + "libraries/3rdparty/unity/extras/fixture/test/main/AllTests.c": "1ec0a0e004f8a70d03dc76e28f38f09519bbaf7306d48d17d5bf0573d34c87c0", + "libraries/3rdparty/unity/extras/fixture/test/template_fixture_tests.c": "3ca4c500397fc3dd7370b419e7d4f7abb3a8b05deacaf72a4e2ccb396669003a", + "libraries/3rdparty/unity/extras/fixture/test/unity_fixture_Test.c": "d8d631a1e192b25ae24ea6ecf3bb53e86eff8f0615a1ad7095106d847b847d18", + "libraries/3rdparty/unity/extras/fixture/test/unity_fixture_TestRunner.c": "e739cdf119f943d482fe99b6acec671aa88a78b9cb38bb2b459d946ab962a200", + "libraries/3rdparty/unity/extras/fixture/test/unity_output_Spy.c": "efa0dfae695ba004c67a120c0b0e3d6f93f72cf7a992662bd4ab15d725c3ff45", + "libraries/3rdparty/unity/extras/fixture/test/unity_output_Spy.h": "b5adfe4f07d3c1c4b7cb0178344ccf608c60a08713d768c8b3e073c6f030dde5", + "libraries/3rdparty/unity/meson.build": "78b6c83b22c043c2741e1c63dbdc5477a39ba74566bcfcc704580976d4d79bd5", + "libraries/3rdparty/unity/release/build.info": "d068d6cff7b4f86fea550f0c3a9d37b227c5c18c20da61d2f73553906484999f", + "libraries/3rdparty/unity/release/version.info": "bf2380afad00fc76d9fb76d653c32eca8efe8916cf88f7000fa8920860ded480", + "libraries/3rdparty/unity/src/meson.build": "9e8bba1e59c9ad97365fc322eca8a2ca2a97b5c4e35de0389d3e4c8bdcc83aa9", + "libraries/3rdparty/unity/src/unity.c": "7486d9c33bce48a2ec7967e72407e906d06cb179ed90babf06626f181ea35a6f", + "libraries/3rdparty/unity/src/unity.h": "a1d55805833e8464ac217f7f93d7a6fba59e1b12df05c7517fda8f7717fda31f", + "libraries/3rdparty/unity/src/unity_internals.h": "ae94c9a6908768407f4d29d6b1acd06603e21e7946800dbe4a7bd1a510ce575a", + "libraries/3rdparty/unity/test/Makefile": "da2a6c3820bed28cb3f4f71085daabc80e02b97ab75b59447e18b533d7d572bd", + "libraries/3rdparty/unity/test/expectdata/testsample_cmd.c": "832ec9c8c30fd374adea6620dd38c19c689047bdad0513984066e525eefc0723", + "libraries/3rdparty/unity/test/expectdata/testsample_def.c": "246d3d9bc73ccef28f7a70b8748d95cd31eb85b9874e6972d30be1f74000fb8c", + "libraries/3rdparty/unity/test/expectdata/testsample_head1.c": "ed31f2c63e4bb7ba015a5388429b34287ecefa098551e55ae5864b883c3cdad4", + "libraries/3rdparty/unity/test/expectdata/testsample_head1.h": "fc279a298e45f70a559d05132ae888973c8f5aad913c0b2d6d8425ccbde5c998", + "libraries/3rdparty/unity/test/expectdata/testsample_mock_cmd.c": "b826f44458088555058b6c3b9c7ef15c2a5528c8efe01034d0f1debee06a739e", + "libraries/3rdparty/unity/test/expectdata/testsample_mock_def.c": "1016f1162a3ea3be49dffd824e529493d2845860d1139cb44cc32f0fe0a0701f", + "libraries/3rdparty/unity/test/expectdata/testsample_mock_head1.c": "cb7b253cefa315d7b4edaa386bffb63a728f3b33c869bf55ecfcd53d1e47eaaf", + "libraries/3rdparty/unity/test/expectdata/testsample_mock_head1.h": "9cb779d98b40e5dfcf70db57f7d3deae6310cac80547140c972ecde585f56c18", + "libraries/3rdparty/unity/test/expectdata/testsample_mock_new1.c": "4e5d73972dce4276dc688016eeb310e93ef96ea7beee0e6839092f0459798856", + "libraries/3rdparty/unity/test/expectdata/testsample_mock_new2.c": "74418cfefe544ac366a043972648c31742b2a4652155507c93a1a2a38471a5eb", + "libraries/3rdparty/unity/test/expectdata/testsample_mock_param.c": "6a8edda1c9b5a56d38e705d2d0341232ca9a55f1fb7383171475cb972c9b6c18", + "libraries/3rdparty/unity/test/expectdata/testsample_mock_run1.c": "4e5d73972dce4276dc688016eeb310e93ef96ea7beee0e6839092f0459798856", + "libraries/3rdparty/unity/test/expectdata/testsample_mock_run2.c": "74418cfefe544ac366a043972648c31742b2a4652155507c93a1a2a38471a5eb", + "libraries/3rdparty/unity/test/expectdata/testsample_mock_yaml.c": "763d37bc5a5edc7566bf6625dd38878aed8cc94a5cec8f6e23aee16e30bdaad6", + "libraries/3rdparty/unity/test/expectdata/testsample_new1.c": "983abee21894ba9fb5d667a69b046558867f9f16eaf546d259671f54dd4be626", + "libraries/3rdparty/unity/test/expectdata/testsample_new2.c": "9726bdaec7a5c8e99b4e6bbfc41b91c8687665bbafdb617be4514eadc30b023c", + "libraries/3rdparty/unity/test/expectdata/testsample_param.c": "7ab6834f8376908625b9999a4c5dad32ad65c8f3fd852e78b6d9c3bc871fc639", + "libraries/3rdparty/unity/test/expectdata/testsample_run1.c": "983abee21894ba9fb5d667a69b046558867f9f16eaf546d259671f54dd4be626", + "libraries/3rdparty/unity/test/expectdata/testsample_run2.c": "9726bdaec7a5c8e99b4e6bbfc41b91c8687665bbafdb617be4514eadc30b023c", + "libraries/3rdparty/unity/test/expectdata/testsample_yaml.c": "17714f87e28c7723608fdc832189965482404e3540e3f3ec55afa7f07054e0a7", + "libraries/3rdparty/unity/test/rakefile": "7bdd33e324a46e8e5cb97a052a2d62dae0c0a7e4c33cce9976e34af316d37007", + "libraries/3rdparty/unity/test/rakefile_helper.rb": "57a77ff52e8e79a9fa30c308465cbfbfba9881ee5871de182abbf92682f16477", + "libraries/3rdparty/unity/test/spec/generate_module_existing_file_spec.rb": "41d0b6bf8255f97e4fbf6c4f5fb2dcc61d846d2ddaf2cad763c1f500b8a68727", + "libraries/3rdparty/unity/test/targets/clang_file.yml": "afbb70db8cc433aca8e6ea3d04d2f5142cc8bd1a8f6e421006038c9601222d32", + "libraries/3rdparty/unity/test/targets/clang_strict.yml": "336cc5344beccd0c3a6c83227b764c8945193b464600ba56ade14c3c44c98b27", + "libraries/3rdparty/unity/test/targets/gcc_32.yml": "734debdb4392b83942cdccfb31ca724a43b923617a8b45d86bf6a1fefa86a7e6", + "libraries/3rdparty/unity/test/targets/gcc_64.yml": "530851623a24956399add9f0c0fe18719eb6dc428c1bec03ae6b255a9d0ae972", + "libraries/3rdparty/unity/test/targets/gcc_auto_limits.yml": "fbd96dc8a94c4de70dae87ff378312b3ee07cb8219d6290af17d36e3b34d0f6e", + "libraries/3rdparty/unity/test/targets/gcc_auto_stdint.yml": "c9ec9f61987603d059d4509f4befe0744f5fa99a137d95be359ddd2c71443281", + "libraries/3rdparty/unity/test/targets/gcc_manual_math.yml": "3bd8b0d4eb9fa693f4cf74fdaf61e31183b85351c4e957577bc8497cdc8f15a0", + "libraries/3rdparty/unity/test/targets/hitech_picc18.yml": "7b2a4ea56f3125fd75bb7d8e9baf1f26706b206f98c6f88e4d4b4091361fc546", + "libraries/3rdparty/unity/test/targets/iar_arm_v4.yml": "3df93ad02fd4e1cc17d28a63f824881eee4f73e1db54e43ff36909dd2f5eabaf", + "libraries/3rdparty/unity/test/targets/iar_arm_v5.yml": "bb6f961bbf3cf2c4651a33bf415818726b4d609c05cb9fdeabe6dc7a94d47e6b", + "libraries/3rdparty/unity/test/targets/iar_arm_v5_3.yml": "bb6f961bbf3cf2c4651a33bf415818726b4d609c05cb9fdeabe6dc7a94d47e6b", + "libraries/3rdparty/unity/test/targets/iar_armcortex_LM3S9B92_v5_4.yml": "8835f98e84e75b920fb9e27c0ebcc9c11f14bff768b382441099a01cbf7a129d", + "libraries/3rdparty/unity/test/targets/iar_cortexm3_v5.yml": "70ba518b050162526cf5cfd3cdc90a00a6aad0d0ef65558612d384c855513d52", + "libraries/3rdparty/unity/test/targets/iar_msp430.yml": "527ef25ba8d5056a8b44fce38302895a1a8ed342331edeed69db067b831c8e7b", + "libraries/3rdparty/unity/test/targets/iar_sh2a_v6.yml": "b99162afd271d76014220cabda53ff3951aae6595b198520eba36ef095e57746", + "libraries/3rdparty/unity/test/testdata/CException.h": "3d791048e28a3a83580dc5cb7a03d918323247128bde97b055e1037924a4a3a0", + "libraries/3rdparty/unity/test/testdata/Defs.h": "309f8524e59399b7e9e5f2a02ab7a1a4e21d6f808bdb05730ad41366412b72ea", + "libraries/3rdparty/unity/test/testdata/cmock.h": "f600e74488bfc56862df2daedce1a3525eaad43ed72c6706817f6629b180a1ec", + "libraries/3rdparty/unity/test/testdata/mockMock.h": "f198c43bad6e541c08b5e32c204d894be499ff005032c3ffa25e7ed7ba176001", + "libraries/3rdparty/unity/test/testdata/testRunnerGenerator.c": "b860abcd7d1b06000a6cdac491016c7396fb3da70fe4f04bca557fdf599136a3", + "libraries/3rdparty/unity/test/testdata/testRunnerGeneratorSmall.c": "f32a9a46a78102474346c7516bdb0401fabef9ee8616d033237a4bc658e3357a", + "libraries/3rdparty/unity/test/testdata/testRunnerGeneratorWithMocks.c": "96b3eba183241dd7fe69045e51aac3b76ef1632db13ad2ac058300ac201f6d88", + "libraries/3rdparty/unity/test/tests/test_generate_test_runner.rb": "bbcfbcd8c45d6c8dcd05fc2400914805d965e378297d536a63276cb2760deda3", + "libraries/3rdparty/unity/test/tests/testparameterized.c": "a3759d06ae748456d37e36bc8c44fe74995f95813c9697cd98cf4f0cfa55f6bb", + "libraries/3rdparty/unity/test/tests/testunity.c": "f8c1a7d15941af4299f3870d8a4311dd738f36d288ac82d1469c87837827bb7f", + "libraries/3rdparty/win_pcap/Packet32.h": "91424a5947374de2ea163bff4e0c033e3f6d1a2a789f3999f6e20c95080ffa32", + "libraries/3rdparty/win_pcap/PacketData.h": "4cb0df826837bf82691e5a98a7599671b259efc512b1c4825accca77d0cfc7a1", + "libraries/3rdparty/win_pcap/Win32-Extensions.h": "81117e8c6de61172df09834f50a1b127de721abb960e25dd25dbaef97d9e48fa", + "libraries/3rdparty/win_pcap/bittypes.h": "f895a46f3d528a66a2489850e478123dd1eedc5e62a3a529e626c3ab08cbabe1", + "libraries/3rdparty/win_pcap/ip6_misc.h": "fccef70161c3607d1cf0128013ee00410d477a581b62bb0d337d77a51d43ec05", + "libraries/3rdparty/win_pcap/libwpcap.a": "6082e9aeb725b2836e4f746527630885d1ec4c4004f81cdc9fd8d5a130097207", + "libraries/3rdparty/win_pcap/pcap-bpf.h": "a24e6a99451cc013cb1b891724fb04b4079251557852f5667f998a342d1b6446", + "libraries/3rdparty/win_pcap/pcap-namedb.h": "97afaf663c4ed4710101d5c6053011e0764642ae1adbffdabc9ee0dcf88874e1", + "libraries/3rdparty/win_pcap/pcap-stdinc.h": "937710c6e5412a5d2cf423ccbf4dfc06fefef17a077aa73b1fd4d1d82ead8fce", + "libraries/3rdparty/win_pcap/pcap.h": "c86912e57dc4da38d36ea3ac0e85b1b42c57548be418773c627043bc69ae8181", + "libraries/3rdparty/win_pcap/pcap/bluetooth.h": "b3ef727f506c30e72ed22a8837d737d75d2858cd7427e7022ab63cfe3dd9d844", + "libraries/3rdparty/win_pcap/pcap/bpf.h": "ea7397eaeaac18a0230aa2f3fecfabf387f2d1135e80ddc6a8eaa0e9b88c5408", + "libraries/3rdparty/win_pcap/pcap/namedb.h": "94cc2e21a83e9fc7a3b159f2fa5cd6c478edcbed05fef13cd9ad08d5364217f9", + "libraries/3rdparty/win_pcap/pcap/pcap.h": "43db459d6d64e995f8a42cba0c5d5515ed5c366e7bdb5fc717f8d14df614769e", + "libraries/3rdparty/win_pcap/pcap/sll.h": "08e56e0ac5747bfe919b22463cfbbfb8355288b32b36ce112cb047df58dc795a", + "libraries/3rdparty/win_pcap/pcap/usb.h": "81c16c743d81f8302fa61ab585ec0e2e29d69844d03f65600054269d6c315246", + "libraries/3rdparty/win_pcap/pcap/vlan.h": "196de3fda8473dde90ee24a682d399245da03a5a6106accf80d97da43900fe4d", + "libraries/3rdparty/win_pcap/remote-ext.h": "9f61998150429f80e5e000b1c9cab44372dbae0546174fcae8771e2e578bb46f", + "libraries/3rdparty/win_pcap/wpcap.lib": "0becdc2d0f2f1e7be3e56cedc9f72578dbac35b347cc15bc031276d10f501b49", + "libraries/CMakeLists.txt": "8732d4b6bebe2923598057249b599a996454dbc992066cba1eeff2d81ccfd38c", + "libraries/abstractions/backoff_algorithm.cmake": "fb8c040adfd1e6f470ae7a485772821a34c922893a014cab2ca92758e8878be5", + "libraries/abstractions/backoff_algorithm/CHANGELOG.md": "d6fa432c08b842f10983640318270202f904ca548764262b7237fe463358c0f0", + "libraries/abstractions/backoff_algorithm/LICENSE": "508a77d2e7b51d98adeed32648ad124b7b30241a8e70b2e72c99f92d8e5874d1", + "libraries/abstractions/backoff_algorithm/README.md": "a52c7ebeb69b7f1968dd159badd9d8fd8bd021ce5107c9d3c8cbdacce42d73f6", + "libraries/abstractions/backoff_algorithm/SECURITY.md": "ff53e3502bc39dac4a7074fe790f663c56d6c7aacd5b66dc648049f685e1e44b", + "libraries/abstractions/backoff_algorithm/backoffAlgorithmFilePaths.cmake": "af161035581eabdcc7da09201ec1316066766bbde90c6e121b73e2661b422b45", + "libraries/abstractions/backoff_algorithm/docs/doxygen/config.doxyfile": "9040341cf47ec88cf3f119cb049124b0bfc53760960263c5e8eef9d07c5a0535", + "libraries/abstractions/backoff_algorithm/docs/doxygen/layout.xml": "555a70789f54c525456ad9d30730614fe7119afb8b81dd8f8067af28dd14f66c", + "libraries/abstractions/backoff_algorithm/docs/doxygen/pages.dox": "a29ec3c55e78ad9f0c2a4751b627da7b4fda1c0cf73d0512453bf4103c6fc558", + "libraries/abstractions/backoff_algorithm/docs/doxygen/style.css": "e3d3b4438744aa4d547bcacc6e64f3fcfc5057b476c5237e5107e6bbe0aac72a", + "libraries/abstractions/backoff_algorithm/lexicon.txt": "2d4aaa7e203e8670274ec2e24fe4785cf94dc7e3efcbe6eb4f3981813e2cf06a", + "libraries/abstractions/backoff_algorithm/manifest.yml": "d8a501ce9e097a8cb5d6fef08e50355302f37837be505bac5d0fecca6a4de7d8", + "libraries/abstractions/backoff_algorithm/source/backoff_algorithm.c": "12d64cd8885f184c364d37f44b47eff9e3801a05f61ea8202578cc9e76e69872", + "libraries/abstractions/backoff_algorithm/source/include/backoff_algorithm.h": "2c053b3ec1ac8ae4b28baac746c4b42eceddd80b5928d958d89b5851e4626b84", + "libraries/abstractions/backoff_algorithm/source/include/stdint.readme": "dd6b448c2e42251785a058360c728511a87282f159819b274ae1a976172ee586", + "libraries/abstractions/backoff_algorithm/test/CMakeLists.txt": "9ae4168a563c9161c92923d9d646bcb6b6b1ff9240a76207b45b34013d845eed", + "libraries/abstractions/backoff_algorithm/test/unit-test/CMakeLists.txt": "a99c7f01dd9b5a719ebd1ed707091c61eac70f21cd54334b250c4f3ce7b40e46", + "libraries/abstractions/backoff_algorithm/test/unit-test/backoff_algorithm_utest.c": "7dafaf38519972354d3a0b7eff5b4ce4f41b3b9e77e759325bb8731ed8c6d15a", + "libraries/abstractions/backoff_algorithm/test/unit-test/catch_assert.h": "925194fa82843169076b980a73064069889f2f7fc1e1ec464fd282b1f689fb26", + "libraries/abstractions/backoff_algorithm/test/unit-test/unity_build.cmake": "0bd532c05dac6876647508256c5c50ff87b2c2017ab9e3cb866cf0722edc1ddc", + "libraries/abstractions/backoff_algorithm/tools/uncrustify.cfg": "55c02144fdaa3d62e03ed97e3e89a54b67d9433a5320ec02ec82e75344b21656", + "libraries/abstractions/backoff_algorithm/tools/unity/coverage.cmake": "44684d66e5193f6c54e47c677c1efd3251f4e83c9893e336918dd90e72c922bd", + "libraries/abstractions/backoff_algorithm/tools/unity/create_test.cmake": "086650d12714429c4130c386417e1aef985421f26c4c82a209ac0d40f71c1cd2", + "libraries/abstractions/backoff_algorithm/tools/unity/project.yml": "12130e50fcf569eaee1c82ebf43c3accfdc599b0f42064ea6819a49f2089eb2f", + "libraries/abstractions/ble_hal/CMakeLists.txt": "1cb8f857cfa06ad053b2724f3e418b81d1dc71ec0647cfe4fb0b706e6fb221ed", + "libraries/abstractions/ble_hal/include/bt_hal_avsrc_profile.h": "d92214761ec8efa7ee86d7804b96f09193006f4aaba672f36476eb455ef57768", + "libraries/abstractions/ble_hal/include/bt_hal_gatt_client.h": "91cd571150e804b11320dce7c8652faac9f7c5aa0ce1f897c7c0120c5f0814b4", + "libraries/abstractions/ble_hal/include/bt_hal_gatt_server.h": "bbc5a583be1f7def664b04d64e470385fb7f4d63bdb3ffcc7e961097fd3e30b7", + "libraries/abstractions/ble_hal/include/bt_hal_gatt_types.h": "5d291bb84617fdc485871710b43edac2a64678ac6352ece3ea858d863213a9a1", + "libraries/abstractions/ble_hal/include/bt_hal_manager.h": "c2e0fa6143dc436c62393ffcbd762ed991db78e783ba9223deb02c6b86aeada2", + "libraries/abstractions/ble_hal/include/bt_hal_manager_adapter_ble.h": "5c93421fd8ea114d82a4b2248c4422efc5c06dceaa09697fc8a94b7e4edb99e4", + "libraries/abstractions/ble_hal/include/bt_hal_manager_adapter_classic.h": "107c84bd346e14271cfb9ea46e438c3ef05d78a28ba762a0e50ab1af8847b0fc", + "libraries/abstractions/ble_hal/include/bt_hal_manager_types.h": "f3640d3ef30ae41070fece9f8a07a65a5ab075f6788e42a1a5524160464167d5", + "libraries/abstractions/common_io/CMakeLists.txt": "f812c17f34c2a06a831a4aa5860f620ce96f65374584c43891bd340478e027a2", + "libraries/abstractions/common_io/include/iot_adc.h": "c98cf0eb1837912d1a2a67d3984ae51a3e3e8c04e382f8e01a1e5867a7ae5a4c", + "libraries/abstractions/common_io/include/iot_battery.h": "906c2faa05c3da45f5d1f8cb2b48d83858b2e84ae5e451f9ae846d4d172cf459", + "libraries/abstractions/common_io/include/iot_efuse.h": "4cac70af098a06e29d07727f170c2cf8e4f531bedb61525daf664482eb49f4e9", + "libraries/abstractions/common_io/include/iot_flash.h": "37a385bac6f08bafbb6822a8a71272d38e2a7ba6fe568dc0c0b1131b0d740160", + "libraries/abstractions/common_io/include/iot_gpio.h": "375f6e0ca9948ff5c273416fabe4c99266726248dee5e26b366f9e1c6e0f90d9", + "libraries/abstractions/common_io/include/iot_hw.h": "6b8fddea2b010eaadcf1da59e639543619643ab22ac532965a2227de383f5218", + "libraries/abstractions/common_io/include/iot_i2c.h": "cf1814f16e1331b6a70793750372cb816eafb698c11d0a90a8b1a525e35fe7c5", + "libraries/abstractions/common_io/include/iot_i2s.h": "65980d6a10324c909bb6dd5d3967f1d28b1d0571bc6db057fea3b1e6797a8c90", + "libraries/abstractions/common_io/include/iot_perfcounter.h": "3c64f4e4b01dae4f777fe0a9f6dbcd292be77502faf2e5384126d7a2cf295406", + "libraries/abstractions/common_io/include/iot_power.h": "6eccb089cb44df0e1cd6db72ab8d416ebacea69f04bf27053fbe018556a5a88a", + "libraries/abstractions/common_io/include/iot_pwm.h": "9f21e7de748e37f516094e11c538080841698be62f9ebfbede2ab45b321406b4", + "libraries/abstractions/common_io/include/iot_reset.h": "4a5ae69482dd917de3d70c15ca75414e2be7fa5759460abc101d66733be1a8fc", + "libraries/abstractions/common_io/include/iot_rtc.h": "39ab81c61df8fe308c16a606aa18c3469377927b286590ae242dd446cb363b8a", + "libraries/abstractions/common_io/include/iot_sdio.h": "74c132d7bb6d5da42b0549fab6543106ac364fbbd65364cc0786dad57f5b3213", + "libraries/abstractions/common_io/include/iot_spi.h": "7b0ebd821abbc6aa149cc7973d6a8a192b0f08e25c42be48d1863d3333decfa7", + "libraries/abstractions/common_io/include/iot_timer.h": "34243af73f1c1a65780c49cc721233166bc20a4782b17c057d4cf542d2b1ef8e", + "libraries/abstractions/common_io/include/iot_tsensor.h": "4173af475651612d7adeba492f976db06dfd741f1efbaa56cf378c28e5ed9478", + "libraries/abstractions/common_io/include/iot_uart.h": "932aed348ce5475301a744814639231b0fc8fde48c973b1ff78a02b2ee7d16c1", + "libraries/abstractions/common_io/include/iot_usb_device.h": "76eaf5a72ebc08a69282283763f2dec31a8fca0fc4dd0aad01f0e03ec9aafc4e", + "libraries/abstractions/common_io/include/iot_usb_host.h": "c3338743bf3ac12fb490611d79a649e89c09acdca4e5efd8c31fb76985997a78", + "libraries/abstractions/common_io/include/iot_watchdog.h": "4ec4e80df956454540631f65e4268ac6d2233d24d4737620a082eb8255e30dad", + "libraries/abstractions/common_io/test/iot_test_common_io.c": "f287ca0bfabb4e3e1f9bd9b6497820fa8aa6a0aed04be84e887e75fa58c762e9", + "libraries/abstractions/common_io/test/iot_test_common_io_internal.h": "ed13fd5be71c7343e35afd7785ff1fae8278c489eae962526b59f0238ceca381", + "libraries/abstractions/common_io/test/test_iot_adc.c": "6ffcc02259d110f30979ed623fadf55ea83dea819ec9d3a55046dab45d35bc09", + "libraries/abstractions/common_io/test/test_iot_battery.c": "ea414d09b5f92e6f273bfbda4b465d395a23238c7c74cda02f2850a854633f8a", + "libraries/abstractions/common_io/test/test_iot_efuse.c": "40d13f2cebdcb6b02924ef8f625374e973b9fad5b0383ddfd94c1d0ace849e72", + "libraries/abstractions/common_io/test/test_iot_flash.c": "0ae659c01b6de4ba7c838295aadbb62fba1863c8e916b1c9923af11d41d83468", + "libraries/abstractions/common_io/test/test_iot_gpio.c": "bd899e1ae0a857b169cfd193e3497acb3c4d2ecc3ea155cbf80abe4f0b131105", + "libraries/abstractions/common_io/test/test_iot_i2c.c": "092e1e7dfef19fd0e62b33b351b3c49c1741fb1c3eaa48c98d9f086fd550baf7", + "libraries/abstractions/common_io/test/test_iot_i2s.c": "fc6493e9987dd1f6cad63bf57d8dfc087de667a148a9115844922c92bf2e40c6", + "libraries/abstractions/common_io/test/test_iot_perfcounter.c": "309dd1867a495d11b92ea7af88d03e839b187224ddeddfa7cc6ab0ca8805d5a4", + "libraries/abstractions/common_io/test/test_iot_power.c": "6c33f453f6967fa5651bc45574965aaf487b1ddccbaba4a0e29053798c9cad37", + "libraries/abstractions/common_io/test/test_iot_pwm.c": "90a8a006c0b8ab50e7333c16fb7d8dcad9b5a05a3832342a27cf5cc4c5092857", + "libraries/abstractions/common_io/test/test_iot_reset.c": "04f7e5729a8a9b0b925fbeb4a1d379a5c612595e90db59c9c0976d0612fa8f6e", + "libraries/abstractions/common_io/test/test_iot_rtc.c": "6f6110be5f6cd01aed51588c6d0b52ff91e493d30cedda6c751b9600ffd1e7bf", + "libraries/abstractions/common_io/test/test_iot_sdio.c": "081e46d9415cbbea3983d5b39a19b305a23053a2b314d3eba0fcb5fcba4dbde5", + "libraries/abstractions/common_io/test/test_iot_spi.c": "976115612ab657049fc4c28a74745be0dbec37c9f353bfcc91061878fe2cccea", + "libraries/abstractions/common_io/test/test_iot_timer.c": "ae88b4253abf9ce6d46025e557d31895c5d362acbb3e0c1498e8775d6116b53b", + "libraries/abstractions/common_io/test/test_iot_tsensor.c": "1dc3cf9f5544872004ab9692878977af38dd8501809d0cf19c4b2ca7bc8738f9", + "libraries/abstractions/common_io/test/test_iot_uart.c": "977ec7a8e53aeb6477d6d6d36fc5234b34d484813b888c632b2c1889c4512cad", + "libraries/abstractions/common_io/test/test_iot_watchdog.c": "d8025884c6843eee92e1d09490f9674abe596d8dd87936aa80a441d69bb324d7", + "libraries/abstractions/common_io/test/test_scripts/adc/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "libraries/abstractions/common_io/test/test_scripts/adc/test_iot_adc_rp3.py": "1427e623936ad97cef2ab2821a274c13065bd88fdddfdea75200926949252167", + "libraries/abstractions/common_io/test/test_scripts/adc/test_iot_adc_test.py": "2887a7ca6321a91bb00c503fcf0f60eccbdb73b3b9a9dfc82117a523b51cf04b", + "libraries/abstractions/common_io/test/test_scripts/adc/test_iot_runonPI_adc.sh": "86f371f2115d6b359d27c656e22ddc8b308476bf9151ccd23579281c58bcb02d", + "libraries/abstractions/common_io/test/test_scripts/gpio/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "libraries/abstractions/common_io/test/test_scripts/gpio/test_iot_gpio_rp3.py": "5072e819e935d56327155b8b3d32149b52de9d9f12427b6c67aae10f7423f720", + "libraries/abstractions/common_io/test/test_scripts/gpio/test_iot_gpio_test.py": "217d919ab1dcbbc99e5b7cae01569e8219ae79d7bd6edf0764ace38d24b9fa55", + "libraries/abstractions/common_io/test/test_scripts/gpio/test_iot_runonPI_gpio.sh": "9f0d1c9fd4c346c88dde88dd692b7a0e88d5da7665bd364c5180e97162c246f8", + "libraries/abstractions/common_io/test/test_scripts/i2c_master/test_iot_i2c_master_rp3.py": "821c577e2a78ab550310fb4727eec32e619899c7b44a4d3552ab6daff60affe0", + "libraries/abstractions/common_io/test/test_scripts/i2c_master/test_iot_i2c_master_test.py": "d4697e5bc20dab76ad494f4fe36b2fa3f495482beeb7e6eafa82f4e6ddab88b1", + "libraries/abstractions/common_io/test/test_scripts/i2c_master/test_iot_runonPI_i2c_master.sh": "baff23f31e85de8a31567f93da2299ea61e6be6c560b7e2d803b0fe844cd525d", + "libraries/abstractions/common_io/test/test_scripts/pwm/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "libraries/abstractions/common_io/test/test_scripts/pwm/test_iot_pwm_rp3.py": "3cb24d95cdb454b176eb0c6e1a61cf07b95859fdb9f14c4b717244385f1749be", + "libraries/abstractions/common_io/test/test_scripts/pwm/test_iot_pwm_test.py": "c95d993bf8ff7e1425224e955f45eb5c2bfe421cd25966d75f2916a9c481be39", + "libraries/abstractions/common_io/test/test_scripts/pwm/test_iot_runonPI_pwm.sh": "a221cd3c37bdec83070fc5b835191dc0405c631770fbf0d5f228082900e586c6", + "libraries/abstractions/common_io/test/test_scripts/spi_master/test_iot_spi_master_pyb.sh": "990cb65c257fc3fbb97c05286fbf3282214deb056429ed6a23f078da2e44eb22", + "libraries/abstractions/common_io/test/test_scripts/spi_master/test_iot_spi_master_test.py": "b6bb2834b8ec4b5c5be59165458567b5447416261cee321215d98311eb4f1eaf", + "libraries/abstractions/common_io/test/test_scripts/test_iot_assisted_tests.py": "695ad3b1c4aaed689e16b65b03fc686ed4b6f168a93ff5e92f26b9fa8bd35848", + "libraries/abstractions/common_io/test/test_scripts/test_iot_test_template.py": "248f70a233930fbf348fc1a7a55a3f7825e67626a265a2e2d6d4c72181601789", + "libraries/abstractions/common_io/test/test_scripts/tsensor/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "libraries/abstractions/common_io/test/test_scripts/tsensor/test_iot_runonPI_tsensor.sh": "f2bd7476ac5785b29f58de13cfbe7f7a2c1ebf8d7bb0f1bff32e36b6c7dae795", + "libraries/abstractions/common_io/test/test_scripts/tsensor/test_iot_tsensor_rp3.py": "6c44faedb3a712570e7821639587ea9ba52a1ca98dbd51b3866a74569b26c9d5", + "libraries/abstractions/common_io/test/test_scripts/tsensor/test_iot_tsensor_test.py": "e940aa613b1f7ecbe3b71bf863f09bb6b25ba64da406108ca076d9933093a34f", + "libraries/abstractions/common_io/test/test_scripts/uart/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "libraries/abstractions/common_io/test/test_scripts/uart/test_iot_runonPI_uart.sh": "304be0c6c2904d9651d32a442eae21c8a440d90426c7b576fdb70a1e80cec0cd", + "libraries/abstractions/common_io/test/test_scripts/uart/test_iot_uart_rp3.py": "e2a51ada857214ea674da0d5be0808338b00131d03e5d22cc4012f1cdb7e8977", + "libraries/abstractions/common_io/test/test_scripts/uart/test_iot_uart_test.py": "5fa064fe610758e5c460708d9c9e379467637ecaff3eb3c483583e80be961258", + "libraries/abstractions/common_io/test/test_scripts/usb_device/test_iot_usb_device_test.py": "9056bec1ba45998aec3cf8e3ba7c86faebdd39841b7b8817ae616d8ec07f37cb", + "libraries/abstractions/pkcs11/CMakeLists.txt": "fd9848967c950d03e223bd427d342e84e578429bf1f7418e6abc7ce2eabe6944", + "libraries/abstractions/pkcs11/ReadMe.md": "e93cec785840baceb712e9717b1e61b5d16b11e4ef896bdd4248fd550f4f2e7e", + "libraries/abstractions/pkcs11/corePKCS11/CHANGELOG.md": "f6956af5fd9e6c27570994bd095125bbb3bc3385006425310e0435fee4091c22", + "libraries/abstractions/pkcs11/corePKCS11/CODE_OF_CONDUCT.md": "34b6c98d5c23127ae6769e95e483e5bf6d3704ae1f0d3ae4e69d15f4ede118b6", + "libraries/abstractions/pkcs11/corePKCS11/CONTRIBUTING.md": "53d9deaabb4f35deb79bb7def2c10ec97bc1fa0f87ba76750555f095df81dc17", + "libraries/abstractions/pkcs11/corePKCS11/LICENSE": "508a77d2e7b51d98adeed32648ad124b7b30241a8e70b2e72c99f92d8e5874d1", + "libraries/abstractions/pkcs11/corePKCS11/MISRA.md": "2d2ec40a654065fc44643294cd7ffec09716f6e78191195df5e88d769db2afc7", + "libraries/abstractions/pkcs11/corePKCS11/README.md": "e748e5ad130237263fddbc826c8a9de3aded14ab190419a9eaec44389f441b4c", + "libraries/abstractions/pkcs11/corePKCS11/SECURITY.md": "ff53e3502bc39dac4a7074fe790f663c56d6c7aacd5b66dc648049f685e1e44b", + "libraries/abstractions/pkcs11/corePKCS11/docs/doxygen/config.doxyfile": "3e05de085481a1f4585edf6ecf6b8b598b25ac1e5289e31fe153376f443874de", + "libraries/abstractions/pkcs11/corePKCS11/docs/doxygen/layout.xml": "555a70789f54c525456ad9d30730614fe7119afb8b81dd8f8067af28dd14f66c", + "libraries/abstractions/pkcs11/corePKCS11/docs/doxygen/pages.dox": "d824322abb45174ccbdde04d9087a3daf23ad9c5401b78eeceacc543ef6bed6a", + "libraries/abstractions/pkcs11/corePKCS11/docs/doxygen/style.css": "e3d3b4438744aa4d547bcacc6e64f3fcfc5057b476c5237e5107e6bbe0aac72a", + "libraries/abstractions/pkcs11/corePKCS11/docs/images/pkcs11_digest.png": "92b850c3d210841e17fd95c3e9c8f7049ce7379ea0a5f63482a02577e4e6dfa6", + "libraries/abstractions/pkcs11/corePKCS11/docs/images/pkcs11_object_generate.png": "de93f2d18ceccb8cad11e8d6ac0b0a724401ef9900d7c6213321f4d2f04b4a06", + "libraries/abstractions/pkcs11/corePKCS11/docs/images/pkcs11_object_import.png": "ffa297b8cffee9d7e5acd6a1c94449886ede948c1c4291add518d29480e58b97", + "libraries/abstractions/pkcs11/corePKCS11/docs/images/pkcs11_rng.png": "6af00134c0f91c2c5112f8b9517e4c1f705b8f27fd835faf614b7d44914ef6f6", + "libraries/abstractions/pkcs11/corePKCS11/docs/images/pkcs11_sign_verify.png": "8003449a654fe1d051ca1ff289c1dd88009ce1c704962177957238d1557603de", + "libraries/abstractions/pkcs11/corePKCS11/docs/plantuml/pkcs11_digest.pu": "5ee805f82c68f09e901c9dd0b944c5e3ab840ec91df2500bc7f6d85e3305e844", + "libraries/abstractions/pkcs11/corePKCS11/docs/plantuml/pkcs11_object_generate.pu": "f03e0963477c8a37af7333513b72b0f0d83a9a49f724a956049794baea5d4f13", + "libraries/abstractions/pkcs11/corePKCS11/docs/plantuml/pkcs11_object_import.pu": "25e535911e40351e16c58745fca0b714c629ddc74e959d7c85ba8b14fb94a2f5", + "libraries/abstractions/pkcs11/corePKCS11/docs/plantuml/pkcs11_rng.pu": "2d32aeefba3adf3f5e992d8ffdc414b01f7d7dd8f3b5419a604f1194f56eec3f", + "libraries/abstractions/pkcs11/corePKCS11/docs/plantuml/pkcs11_sign_verify.pu": "24024c8acc15496eb28b56306a4688bf0d2ff509a352d70961438c31d2988b81", + "libraries/abstractions/pkcs11/corePKCS11/lexicon.txt": "68d43c172f3ff3665e7404e79e41bfc23d98f219d8252a1d98cea79c2469d807", + "libraries/abstractions/pkcs11/corePKCS11/manifest.yml": "99692cd5cb223eaeea7a847934715926ffadb03ba83a4fb038744854cfa6aa75", + "libraries/abstractions/pkcs11/corePKCS11/pkcsFilePaths.cmake": "870da81931f101530009af9ecf30a10c221c52ff8042b4615f220002def06ef3", + "libraries/abstractions/pkcs11/corePKCS11/source/core_pkcs11.c": "ae22ea6e7486563237deb77739f25d91d3039c17b9f562d8941f5ac3beb9872a", + "libraries/abstractions/pkcs11/corePKCS11/source/core_pki_utils.c": "22651f7a426d7e88fcfaf21f78be1f9a6c90686a8bdb3a72be7866e6760088fa", + "libraries/abstractions/pkcs11/corePKCS11/source/dependency/3rdparty/mbedtls_utils/mbedtls_error.c": "d6743b465d3bcd0445ac01d35599929db86fa26e12e6e423a746de67e930d0de", + "libraries/abstractions/pkcs11/corePKCS11/source/dependency/3rdparty/mbedtls_utils/mbedtls_error.h": "775e7bec1fcfac066e834067f4d09c9f077330c09c1120ebf99c55886d99e422", + "libraries/abstractions/pkcs11/corePKCS11/source/dependency/3rdparty/mbedtls_utils/mbedtls_utils.c": "9a7734e796aceaac8f6448b9b0ae7effc97d0fe4b508f7587c93e7620eefcd3d", + "libraries/abstractions/pkcs11/corePKCS11/source/dependency/3rdparty/pkcs11/CONTRIBUTING.md": "400098f5776f8d6289aaa5517f2d33fbc28d98d9612ccf3d4cfc85713d674d95", + "libraries/abstractions/pkcs11/corePKCS11/source/dependency/3rdparty/pkcs11/LICENSE.md": "9bcb0c0cb10c9dbe5090ea05b35ac12160a295c2704b178b2c661c10acfb96e8", + "libraries/abstractions/pkcs11/corePKCS11/source/dependency/3rdparty/pkcs11/README.md": "0e2538782b336a90335524fd19be0e2e21cbd197f161a2aa8f0fc82993eb1609", + "libraries/abstractions/pkcs11/corePKCS11/source/dependency/3rdparty/pkcs11/pkcs11.h": "8bb7aa1aeaa328b6a39913070d6f3d2bdeb9f2c92baf27f714fbb4cbefdf4054", + "libraries/abstractions/pkcs11/corePKCS11/source/dependency/3rdparty/pkcs11/pkcs11f.h": "a85adad038bfc9dad9c71377f3ed3b049ba2ac9b3f37198a372f211d210c6057", + "libraries/abstractions/pkcs11/corePKCS11/source/dependency/3rdparty/pkcs11/pkcs11t.h": "5b58736b6d23f12b4d9492cd24b06b9d11056c3153afc4e89b1fe564749e71a2", + "libraries/abstractions/pkcs11/corePKCS11/source/include/core_pkcs11.h": "5dc967789b0a0ca486a3375dd998268223a19d458cab476fe7ebeace50dde46b", + "libraries/abstractions/pkcs11/corePKCS11/source/include/core_pkcs11_pal.h": "1d9e6c2e40c5db4c303b1cb128110c24d956a40c0a2ced0b7645e2d400d05deb", + "libraries/abstractions/pkcs11/corePKCS11/source/include/core_pki_utils.h": "cdd6a7e3ca84a93157568b0a750cbf7662ca7c96969c8c5a0f0b34812b50e991", + "libraries/abstractions/pkcs11/corePKCS11/test/CMakeLists.txt": "9a7f42e6898e301cff7be5fad0940e943b2b0b727ffa6e7254c38d204c8d6302", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/include/pkcs11_interface_stubs.h": "8c5583f4aa10ed63801ebacd033a56a40836379922957ada84a9d8b1731a83c4", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_CloseSession/C_CloseSession_harness.c": "000c52b1962731b204efba16537327311de4a3f3f419216ec0c9b1dcdb08b2f8", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_CloseSession/Makefile": "ba25679ff87d6453424a69ba6a81814d7f79a76ce8cdb152b356c51521bf8e8b", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_CloseSession/README.md": "a0cccc7291643c078dcc9262424bfd873e05c8e1cf79cad853ea03688b0f6a83", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_CloseSession/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_CloseSession/cbmc-viewer.json": "517e9954c8dc99e75951f773f8d42003ededf99e34a482085d2dcded86a0b5ca", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_CreateObject/C_CreateObject_harness.c": "c68d0c6e1cb4536b6f82a73f03470326d07eb8b24e53be2e5e5a1eac8ee6018b", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_CreateObject/Makefile": "8da1af2e48a682e2fbace91e63fc4c100d65ec03e0f3336a8ebbc6bcbca2d616", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_CreateObject/README.md": "ebbb49ebce87e5800543dc24980d77cc198b56be300cc3276b1d5efbfbc6573d", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_CreateObject/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_CreateObject/cbmc-viewer.json": "cf66b6d47d14a46cdebda992339981f4e44d7adb46b647ce88dd89d7166cf5fc", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DestroyObject/C_DestroyObject_harness.c": "3c2b8a36cad2a53c7dd8bcd6cb417f36fa59ec01bd984c854d5de67223e62ab3", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DestroyObject/Makefile": "98c832d626af7568a4b7200b16b8a8a90d3c5d5e0dc7a7f82498889615633258", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DestroyObject/README.md": "05a9cb29a173c6eae06a64cde3b09d16108ff28102e0a2e9928161bb8a77e4ea", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DestroyObject/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DestroyObject/cbmc-viewer.json": "b4749e38566ce5200a4a7502d74ee5b902bc8b87c3ba3154807da977c02e163b", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DigestFinal/C_DigestFinal_harness.c": "080d6019e4f2ed298b71ad4d63cae7dd6135a409b3a3703ba1e3f68403b0b445", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DigestFinal/Makefile": "3f7d53f62ce53cc757894455c5b239fa1901fc35002e8561cfbe011f229f189e", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DigestFinal/README.md": "ae07a5bc5578792f2d13302e1b7b4e923f2f9c3da2c628e3e1849ae7987e95cb", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DigestFinal/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DigestFinal/cbmc-viewer.json": "2f30928ae2d546c7b6b432c4a8fa32314ecb6b75ab2d6b7a1432c1a3d33990d3", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DigestInit/C_DigestInit_harness.c": "f2f694f89c67e8dd83657fac72e7cefae1c5ba2ca81038e758e9ecb0e13e57e9", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DigestInit/Makefile": "01b1ba464ed5c940a6f2c8cf0b5b47bfcdadf151ade5f0ea7ead197e43c7eaef", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DigestInit/README.md": "6a80edb197bcb38351783db415332162f74cf8daf892c899ade94d8f1505f43d", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DigestInit/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DigestInit/cbmc-viewer.json": "30315c1e7970f152b1f4c7ee6cdc11a6e3c3a3e96cce72baa3bc6b8e6710fea4", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DigestUpdate/C_DigestUpdate_harness.c": "709914c4962625a458e03f48cec4c94b8e20e78fa1b631d92686bb0cd880a258", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DigestUpdate/Makefile": "92a7d2a1a80e6aa51b26b717b931a9f935d7812b7e393145ca241b04d71d5304", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DigestUpdate/README.md": "e87276f75e50f70584d7b0f6d6598b73ec3ddc51dae5139c036f64a4a2bd18f8", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DigestUpdate/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_DigestUpdate/cbmc-viewer.json": "552e554850b1b5f4d1f6d12e23910e7423bfaf262e278b914e5bb2d46be5b57a", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Finalize/C_Finalize_harness.c": "50399b62c7c4fd8a19c4f477f3db0ab3e87fa31b79890c81b6d34b04ffc35b8e", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Finalize/Makefile": "12f7951e44739140a6e12197a8f5cc25593a0c194b1450486d51841ed7854f41", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Finalize/README.md": "c37266c6eda30560818e78bf8fb19f917169a4f254881ba34db124eec1060024", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Finalize/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Finalize/cbmc-viewer.json": "c8c21028e36c8bb7597d4de296f728b95979e1130994c1c6166a72f8c7e927fe", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_FindObjects/C_FindObjects_harness.c": "5eaffb80d46430a8cbcc4a1e3d8492d0b51b8ecb7474bb20d85ba77a987d4518", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_FindObjects/Makefile": "5b793d76fe2667053a740fc04b4f08239a8e31869c7b8c393e6d0baf26a28954", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_FindObjects/README.md": "df745a038c55a96bb866d344d921334486376d0c4a22f333d15d1219a915e45f", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_FindObjects/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_FindObjects/cbmc-viewer.json": "fc9740bf0fb87262de65d6addd5f34f5b4ce4b01955022b86b2198a0492611cf", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_FindObjectsFinal/C_FindObjectsFinal_harness.c": "e6036a9fbdb7183e6b5abfc4ae55947715c8a7b01347647a2f656c955f942917", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_FindObjectsFinal/Makefile": "b40d6a5b70028f5409103987ca826d55917109dd1c6c55dba7c8d49abadc09fc", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_FindObjectsFinal/README.md": "816050cce125d99f415e0db0ed6c348c8956b9a5d4aef4b5502a855f5df9053e", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_FindObjectsFinal/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_FindObjectsFinal/cbmc-viewer.json": "b86dc22e804f1622a0fbdfaa3c562ff2baf737a0c44ef75602772c347f6636be", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_FindObjectsInit/C_FindObjectsInit_harness.c": "7ba390841fc5e0ee75aa80db1b5f27d9cab7673cbc0629c1974ac153ee12f9c3", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_FindObjectsInit/Makefile": "b078df095d04b1c3e6d2658e8fe3392f0e96d392d3b23744553335c98fea6493", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_FindObjectsInit/README.md": "4a059ad6df93d5fb1b7e15e5f79051bc052327cb318ea9fe49273ff417085ab6", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_FindObjectsInit/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_FindObjectsInit/cbmc-viewer.json": "6eb1ac756c25c0023959f7118f0a21a78aae4e4ff6caf54145b7891dd4e12072", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GenerateKeyPair/C_GenerateKeyPair_harness.c": "39b69d786b05b8fbb4585cacfe8da51f91914da122c6915fb79a087d81970a83", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GenerateKeyPair/Makefile": "8a720999a0292c53b7686bfd3a00b27e7108d0da69d2d724966ded69f366af1e", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GenerateKeyPair/README.md": "7c874afa00aff90539cdc8cded1a4709f4479586737885a95cad746a89b2bb41", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GenerateKeyPair/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GenerateKeyPair/cbmc-viewer.json": "11b077df6b66806e3800f79a4d70af45e2649973bf90813d43aea54ae5c4788e", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GenerateRandom/C_GenerateRandom_harness.c": "c679d9c8dad91cf9d4c421778de255dae127812243060acf9cdc82e503c0fc99", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GenerateRandom/Makefile": "41fcb967af3b426540df3cd1c0f609b5535ea946ed8ed1e7c430356832fbc14a", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GenerateRandom/README.md": "966199ba516adc193c13bb5ccc168d8d5a6c5c99b190f9102553f620fd331505", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GenerateRandom/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GenerateRandom/cbmc-viewer.json": "f479830beb79d2603273c6fce30c332e12f858cac03c7fc44b33cc316d48edac", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetAttributeValue/C_GetAttributeValue_harness.c": "5c4669ed4db44f4d45a870664244d2ea30b1ce9db19d538bc0dc83e0cebd5720", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetAttributeValue/Makefile": "232749f5a41f7b22f0e6fd714d64a2720c59b3381d9392a9fae1d2918ea1301f", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetAttributeValue/README.md": "67bb53f7cf7c1ccaa20d5ccccf343c96f30a5b8a04a21efac3c5095cf7be0daa", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetAttributeValue/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetAttributeValue/cbmc-viewer.json": "5abca4039da9c48532a686e0ade71094dad1c8393adc3ede3479f9bfacddf5dc", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetFunctionList/C_GetFunctionList_harness.c": "15381d65ff2fa1e9e2eced990dff5806afcf88832a17a946af04d41934830006", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetFunctionList/Makefile": "f7182c1c72434a1a692ae0f65b2a90f3c3261088c8e15e540d196dff821ce3d2", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetFunctionList/README.md": "2b11ffcf724682dbff30cf36c2423673f438adb8c3a49a8d1e7593a96e8ace32", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetFunctionList/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetFunctionList/cbmc-viewer.json": "14c58ea1408ec3fb2915c522eeb700d246c25919962c152ebf0b7a0b4f71c616", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetMechanismInfo/C_GetMechanismInfo_harness.c": "33b666b4f4bff7f304682d1b400a56621c1dd95bc3c85216bc4a3545b6ee615d", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetMechanismInfo/Makefile": "a308e9f0c74a51961f59a1833eda788f5220b3005550b73f8416fa807890f1bf", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetMechanismInfo/README.md": "ced8f3cdd84f12a944e8e78c075f7ecb12d80383a97ec6ba8cfd3775d4a1a376", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetMechanismInfo/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetMechanismInfo/cbmc-viewer.json": "61eced5be5064ec5cea3ac6ae82e42998152ba0ced5b85e5b8e8ebc7114bc6b4", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetSlotList/C_GetSlotList_harness.c": "40e491f1097d401e40a6026067a4d79386f62e9f37ff7a62d6fd3e8ade4b32cb", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetSlotList/Makefile": "96bd0bbd4ac602343fced9e6681a248a3828dccf4ccb35c8073e94f45facff7a", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetSlotList/README.md": "68c450a293272355d7c766a8ce68ff6e612e8b89a396bd4dfd27bd0beb2a4bbf", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetSlotList/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_GetSlotList/cbmc-viewer.json": "0f65d8adc32cd8a4dad656adf90da2f04be9405cd7a5dceb5deaedb90f26e4b2", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Initialize/C_Initialize_harness.c": "5f4a7e4feaeae3558870c951f194662026129f2ba2a151801c19e3fbd3781aeb", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Initialize/Makefile": "5f67e42b1b8ebf34acdbd472adb2ac26fc078071334ee0d648205c3f41051705", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Initialize/README.md": "195cc4a40fa03e60f7c1d6b06b2e8d47e4ec20af83c3899bd10e8aecced73c14", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Initialize/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Initialize/cbmc-viewer.json": "19b80e9bc21455eb522a2ebac2cedd4f3ca03e3666c28afa34129c2467e7a3b3", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_OpenSession/C_OpenSession_harness.c": "5d8188691c684a0ce2088400d3e78ad4324a0b107e9693d135a2840d93554a54", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_OpenSession/Makefile": "588a14364106fde670cc76ae55c6b9bb292149c8e419b1464d937f6b3d1a3d4b", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_OpenSession/README.md": "c9dae7f719fe21f90017c5527415499a58aeb9999a823400c3a2ef09306ced0c", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_OpenSession/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_OpenSession/cbmc-viewer.json": "e134f76aaec89ed9b05096a5db0fe6267e4109b8e711924a83047cf02324b5b3", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Sign/C_Sign_harness.c": "4eb8970c70376e883a5fbf87be01fa1154e57f07a1fcdad2c3fdfd2f1d269931", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Sign/Makefile": "f8f570cf4347a719b235d954f5a5b8d6931acfb50e2607b69203c917f657d9f5", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Sign/README.md": "002ed4327d24a934f2c1cea3fabe5842ac5abacad7d29f4d1c931820d8620c87", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Sign/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Sign/cbmc-viewer.json": "2ef3360705d85923af9eb91d45e0ec36cd2a25d936df1b93ec479e82d5c83b3f", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_SignInit/C_SignInit_harness.c": "3f29ebff4fdbd86428102ee77ff9bd877da7e3b2cfa5f682acd1672529af5305", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_SignInit/Makefile": "5162a3c183d9283804632f5bce8d284fe31ff9820cea1dc34f8a34a43a8ee7c9", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_SignInit/README.md": "a93b2c289c3361b71405dbc465f19dbc061110821ce06699ccbc799ce3b89629", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_SignInit/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_SignInit/cbmc-viewer.json": "517c4b4aba8876ecc40eca3c9f8d415ac1807662240d63949c68709a188b2bd2", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Verify/C_Verify_harness.c": "dee62efecba8eb3e6b559212fa7ebed74fbab2e248df21d3ddeb974e1c826346", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Verify/Makefile": "00d1b158a9fce6ab3f4f162f9ef83ceaf175192137e2668bd8604ab4ed9b79b7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Verify/README.md": "bfd553ffd0203e046c5b6ff2e4232eea89ac8d869fc46b40347eb700b9fff3a9", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Verify/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_Verify/cbmc-viewer.json": "a7cc85b1a92a68ffdbdc3e090a53a22a71f7911e11e0f42a99e7d03e73d018e3", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_VerifyInit/C_VerifyInit_harness.c": "bb2579a345cb4500cfeed286ec1f8903d0695253a6d76f24cdbbafff30662462", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_VerifyInit/Makefile": "77dfad494d6cc191a96aa02c29e5bec14ba3e345b21ba86568715170eca9cdae", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_VerifyInit/README.md": "3f92966f86687bc7a3eebb701bcbe3616faaa83852c463ee43fcef0fe0ecee9d", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_VerifyInit/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/C_VerifyInit/cbmc-viewer.json": "94fa9fe7cf7e0f0214e6cb1185c3320c98b99050155ba102210518d569d26da1", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/Makefile-project-defines": "0e446c4a1939c7a1f7d0b4cd0fccc5086a42279517f2a9b0562a46b0c0168c1e", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/Makefile-project-targets": "d8c3930590646a4a3b5f5ed446758bf2d8b27ffb742dee196efb816ae2f502f6", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/Makefile-project-testing": "acb51f25870892f177057e7f56e73979e0eeb4967e3280aa160fd33a1a7bb03f", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/Makefile-template-defines": "aa5cc72de5732cddc2a6a4c34cf167b22f911ae2f24115640c27c548638851b4", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/PKI_mbedTLSSignatureToPkcs11Signature/Makefile": "964e2f484d7c9024e1330a46cfd8aac920d0b5a5155144181829414575fe317c", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/PKI_mbedTLSSignatureToPkcs11Signature/PKI_mbedTLSSignatureToPkcs11Signature_harness.c": "05e5b95f130a269f29bf5478cf683851270bcfea3dd4ff12ad6171af06027fb0", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/PKI_mbedTLSSignatureToPkcs11Signature/README.md": "2c7a870a4486b94aac5c193b791b8873a32238bedd9e97e1866a40f34b95934e", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/PKI_mbedTLSSignatureToPkcs11Signature/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/PKI_mbedTLSSignatureToPkcs11Signature/cbmc-viewer.json": "ae981521998f8b93383e757cd73b65a97fb368f54e55823f97922f5910aa6d9e", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/PKI_pkcs11SignatureTombedTLSSignature/Makefile": "bd66ea510bcac8cecce4df6055a1a2f92b9f8f3bdf71435169c09cd25ce1bd3c", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/PKI_pkcs11SignatureTombedTLSSignature/PKI_pkcs11SignatureTombedTLSSignature_harness.c": "ff14d4380c831e1cf57edec17fa291f412053e70158b3255b869b2b868983dae", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/PKI_pkcs11SignatureTombedTLSSignature/README.md": "66f56f51fce06efb6ca634c469300851190b0ca288fce543aec5663e29cf7121", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/PKI_pkcs11SignatureTombedTLSSignature/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/PKI_pkcs11SignatureTombedTLSSignature/cbmc-viewer.json": "dd433cfcab9a3459a384a6eed067d7acd33bc6746115d3a26537af729145e227", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/config/core_pkcs11_config.h": "6cd2e6c9402eb2f27db31c28d4f33a8da809ff89f95b45526211e91136be06cf", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/config/mbedtls_config.h": "cd33e5e18416f04c96dfa0c47be229f660481605b1de83e7cdc38310cfa34209", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/run-cbmc-proofs.py": "aedcb62405ffb22af83c4b4cb38a665b57bfa3ecd102d868056b315306a26734", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/vAppendSHA256AlgorithmIdentifierSequence/Makefile": "38c7e19df64bd84bd82311bbd4df072d812d911752572417ce5146998404eb82", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/vAppendSHA256AlgorithmIdentifierSequence/README.md": "01c8e5258037a425ee8c624610fa8c7cb175a06ebcd09f3e6dfef567845ada65", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/vAppendSHA256AlgorithmIdentifierSequence/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/vAppendSHA256AlgorithmIdentifierSequence/cbmc-viewer.json": "9dcf86bd7364b060d3efe2808fa69a357be3b2d820eaf6a58ae4d2f45894b45f", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/vAppendSHA256AlgorithmIdentifierSequence/vAppendSHA256AlgorithmIdentifierSequence_harness.c": "42d5a3616f2e9f65a375b7dff7bd4b1a07c57436f305abe1c9878e9c311106f9", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xFindObjectWithLabelAndClass/Makefile": "6cfc39a4358adb3d3511ebfbf0d243f257699799263ea3e1dedd057b329d72da", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xFindObjectWithLabelAndClass/README.md": "470982187a86faffb3ab2113e382b989f90e61e006dc7fc2d8496ce1819360c0", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xFindObjectWithLabelAndClass/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xFindObjectWithLabelAndClass/cbmc-viewer.json": "57fa683720ca548290afec4b1d65e1747fce9ac79171e71a89729eabc959a8e9", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xFindObjectWithLabelAndClass/xFindObjectWithLabelAndClass_harness.c": "85d20bcce803d1d7216939b48d38fba519002ac373fdd934011af7677da5e7fc", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xGetSlotList/Makefile": "181c97853cc1c815e8c5ed8ddffc3e74ae3ff88abfb42c6b40354476501edb23", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xGetSlotList/README.md": "ac8899ec45418bd2f429fb3d48290aa4827f1f2d6ba17987093915b4202ad5f3", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xGetSlotList/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xGetSlotList/cbmc-viewer.json": "0ea0109149da4b9e9c9d44b9afaa752d321e793a04c1c2d38b5c15876d01b537", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xGetSlotList/xGetSlotList_harness.c": "4545ebe31be553e01ce5882c2e57b3dd25252d85d623c67e14436d0260f88c83", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xInitializePKCS11/Makefile": "0e45e10c7cf9c0f4b656dd1e7e624f592d536f9fb16339b5eab72cd6b41242fe", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xInitializePKCS11/README.md": "8df4d82bf15fe121fa723ef4ced0d33cfd55826ad8ecbc1967d48696031f40a1", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xInitializePKCS11/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xInitializePKCS11/cbmc-viewer.json": "b675c79012c985da8b9c6cc1425e9bab8bb9f920478259eab378ebf77e4668b9", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xInitializePKCS11/xInitializePKCS11_harness.c": "38d8b160398d65928106c2c9fef77a8cabc7deb51095826fc4a3498682736cf9", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xInitializePkcs11Session/Makefile": "19f4467fd806088e7b9cec0d006296694abe7381ecd40a1a8c384e447694af38", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xInitializePkcs11Session/README.md": "accabdfc488d16cd33acb69db2df22adbff9138ed9032b0b0ba01f35f4a51158", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xInitializePkcs11Session/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xInitializePkcs11Session/cbmc-viewer.json": "945db08f6b7203c3390a4590b6be0a4683149794ae9dd78b5013120c92be396c", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xInitializePkcs11Session/xInitializePkcs11Session_harness.c": "d0140fa0ba8ff261bd8ae2c312560dc517b90513b3e0958cc84b27a317cfa5c5", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xInitializePkcs11Token/Makefile": "be6a6162a7843866c650ec9803bd24315747c23295375eefdcc494eee4dfc021", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xInitializePkcs11Token/README.md": "7d16a128c8a3695e82a2c3b163b2608d8e7e736767bfecc67b3b9e91f585f6f3", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xInitializePkcs11Token/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xInitializePkcs11Token/cbmc-viewer.json": "ba87cfa9d4e52b06f167a03ad2fff865b6ac6eae14a3bc0e9ce9d8058c3f258b", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/proofs/xInitializePkcs11Token/xInitializePkcs11Token_harness.c": "2d0d94a2dd3bb2f029245a80321c4e06d464205d662af3910c6e64289c855fad", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/stubs/core_pkcs11_pal_stubs.c": "b65529f3848015ccbab5a0cf811d60223a232d7d64a8ed19555261da388b615a", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/stubs/core_pki_utils_stubs.c": "1724779c031b2fd84335a4a6fb5691ae7ef603884b028c282f5328af9ec1aeaa", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/stubs/mbedtls_stubs.c": "d4737f01afa91320bab364a477f65a0099a192eea67e55fc6c271ac5e31a1f98", + "libraries/abstractions/pkcs11/corePKCS11/test/cbmc/stubs/pkcs11_interface_stubs.c": "360a1544285b3094052cbd1f54dc0e4cf4c9db2d10c350cd692e834a902799aa", + "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/CMakeLists.txt": "28587d2848f33bded9907160603f4904408aafd35b81b500deb195ce7b4edd9c", + "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/cmock_build.cmake": "9dc11afd4003291373290c70c37da6f0e19f5f3ac56fdac9443c50abeeb42ed4", + "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/config/aws_mbedtls_config.h": "6f8482bf11b08377434547dc13aa2e4d1cbac539f667416d7f995057ea9f70bc", + "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/config/core_pkcs11_config.h": "6941efdfacd4a33864dea7a463423b2b42fbbd70b7a9978b4be0dc99e90efec0", + "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/config/logging_levels.h": "810b8c4754dffa9677db0313abbd9eac6cd14b67ade45e1441e0aeb91085c31f", + "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/config/logging_stack.h": "2d81f65fd7e27f0b9dc34c7544f8a68e32e9935053a10ee7ec8fdbfcadacda6f", + "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/config/mock_osal.h": "db4ae8bed56ed8f3d6646859326905c7d55651dc8d3cde04dab58b3a14675cb2", + "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/config/threading_alt.h": "363ca48b5e23f61ccee72506dc46e76577f5f458456368684869864c92b331f4", + "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/core_pkcs11_mbedtls_utest.c": "a99141c85c58b3510869fce0ee1d712476848fbbcc941ca48db586a2efbdaf92", + "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/core_pkcs11_utest.c": "9870c71bdca8fa2b731a91109d7caf43062a6f09017db07e838a6ea2f2b0fe6a", + "libraries/abstractions/pkcs11/corePKCS11/test/unit-test/core_pki_utils_utest.c": "c3b0c2f3863554dfac404bc4d74a8d0aaad96f27a28c5fb5d5ec1cdbcf6e5b64", + "libraries/abstractions/pkcs11/corePKCS11/tools/cmock/coverage.cmake": "8ac1ac5e6d5628fc8625d57f74249f15f53eba61f8338813d36d3dfa9dc1cf9b", + "libraries/abstractions/pkcs11/corePKCS11/tools/cmock/create_test.cmake": "9b1832fc7a89a99b191f304fdb65d3e3a84ac1aa89cc5b7fc71abe4ec8d72c6a", + "libraries/abstractions/pkcs11/corePKCS11/tools/cmock/pkcs_mbedtls/project.yml": "6940aa5db415867d18ab27fbaad67136bba87a728af16d3e4a317df29362c351", + "libraries/abstractions/pkcs11/corePKCS11/tools/cmock/pkcs_wrapper/project.yml": "bd664576c8428fd2982b8b8d3bab25511398b38a33f13d51f756ee32fe2c0fba", + "libraries/abstractions/pkcs11/corePKCS11/tools/coverity/misra.config": "230eb1d53162dfe78800128f6b47a90328c7ba6dcf81311414515f3cdce28584", + "libraries/abstractions/pkcs11/corePKCS11/tools/uncrustify.cfg": "55c02144fdaa3d62e03ed97e3e89a54b67d9433a5320ec02ec82e75344b21656", + "libraries/abstractions/pkcs11/ecc608a/atca_cert_chain.c": "33f36880ef2c7f66e1296b30e75ec8973a3256b4d7d856827de0565183713709", + "libraries/abstractions/pkcs11/ecc608a/atca_cert_chain.h": "5076fd35a2a40c9379e0d7c5b97eb9eaae6bc16460ef7eebf3be6c468d5b482f", + "libraries/abstractions/pkcs11/ecc608a/core_pkcs11_secure_element.c": "b093fd7e7aaa5f4e6bc16f346510d2006d069869582adb7f2da80aaf4f91c237", + "libraries/abstractions/pkcs11/psa/License.md": "79147b607b79da7884e49f492f0623ad85f7ad30a991f15fb0ab5022e8d5ae44", + "libraries/abstractions/pkcs11/psa/ReadMe.md": "a32d945bfcf103f4e18042a62be40e91114c9cf0a4edbc49464d6e647a083b41", + "libraries/abstractions/pkcs11/psa/iot_pkcs11_psa.c": "e0793cfccc98473f11e61c9166a3c86c22f16533994a5a98b72d5dea3089bdbe", + "libraries/abstractions/pkcs11/psa/iot_pkcs11_psa_input_format.c": "f45ed6ee4912fc36f09ff05deae11feb85561d6bd72b68e3872f05c5588f4c9c", + "libraries/abstractions/pkcs11/psa/iot_pkcs11_psa_input_format.h": "0c4114b6f1934ae33d27f0a09cef894b8891d73c1c2e327e989b493402c2d515", + "libraries/abstractions/pkcs11/psa/iot_pkcs11_psa_object_management.c": "d8b82c6891df0338d7df67f75b2c1ac6a931e3c5411cd85375755d0487f8f95e", + "libraries/abstractions/pkcs11/psa/iot_pkcs11_psa_object_management.h": "1fdc7288cd54755297752fe584d6a3966a7330583c74acda24691cf374703ab1", + "libraries/abstractions/platform/CMakeLists.txt": "20e44ccb13df778f3f938bb19cb876f1cde3a3b7a5d13ae74a2b536cf54798e6", + "libraries/abstractions/platform/freertos/include/platform/iot_network_ble.h": "3a53d18dc0980b0c70baac980653e2246fc6b47e8c7ebf49bea8f5615015205a", + "libraries/abstractions/platform/freertos/include/platform/iot_network_freertos.h": "6ba06cea2088481bbb5a1f63cd35ba61474d81c61a00cca317750a9d7d3541ce", + "libraries/abstractions/platform/freertos/include/platform/iot_platform_types_freertos.h": "3f1fa78bb0b9a275ef4e83df844d4ffc936a36fd67a8e0e6499fe504e93efe41", + "libraries/abstractions/platform/freertos/iot_clock_freertos.c": "978264f245a2ac646ba11ea18a9152208d51ce554dc4d26fb672a0350cf13f62", + "libraries/abstractions/platform/freertos/iot_metrics.c": "70616385eb4c5eea47a718ea0e95cd7f3dbf4b8f243eba60d9d7a2a0f832874c", + "libraries/abstractions/platform/freertos/iot_network_freertos.c": "704c96b6c1c872d7fabaead8ab39995423bada0de8f7636d1a53db6f59aad9ba", + "libraries/abstractions/platform/freertos/iot_threads_freertos.c": "1af294d45841473f9d47245fd1da299171e26118d0fcae8061dbd23ef7055686", + "libraries/abstractions/platform/include/platform/iot_clock.h": "defa2f5319cfaa15321dd7d950f6001b3e48dee14f2797f98c0bf2edbd49afb0", + "libraries/abstractions/platform/include/platform/iot_metrics.h": "4c7213608554b22554f15eb93bd4b76ce76b2169c3719b07687bc3657f99be63", + "libraries/abstractions/platform/include/platform/iot_network.h": "fb4066ad503762e14439fa9bc88ef82fd67efdf165954eeb7240bc12b3f22c84", + "libraries/abstractions/platform/include/platform/iot_threads.h": "a7a70bf277aeea5e8a480008c06331ffc628717b7bddd017351a41ce39c624c7", + "libraries/abstractions/platform/include/types/iot_platform_types.h": "587bae7e9b6ea955877ebd6ba16dec411f452c10d70f8375280d91d0c521cd5b", + "libraries/abstractions/platform/test/iot_test_platform_clock.c": "b1ce5f11acaf5d4f07bdfbc9fa0432dd3a3afb80875eabec1756b404e1832818", + "libraries/abstractions/platform/test/iot_test_platform_threads.c": "09cc9fa4576c6eb33386ac5cafbbb064c34a8be02fa252d0b922ead60d140b3b", + "libraries/abstractions/posix/CMakeLists.txt": "de791cb48fb673efa912fdff73e6a3baa8c0b6b8b04e3bb6bc0db4d48bdf92ec", + "libraries/abstractions/posix/include/FreeRTOS_POSIX/errno.h": "63e28e6669ee2923d2ef6ce8e34630e0d4684805d06392918e18c8c382cc0af2", + "libraries/abstractions/posix/include/FreeRTOS_POSIX/fcntl.h": "c8a72b1167bb503a618003740d9302f9c09d824e88e13a846f1e4d088f70369c", + "libraries/abstractions/posix/include/FreeRTOS_POSIX/mqueue.h": "dc4487732956540662472ebbbdbcb8b484b96c96b520b5e2dc4577a990fd77ab", + "libraries/abstractions/posix/include/FreeRTOS_POSIX/pthread.h": "8ed558699b8333699e133ad8e45683f57aed27930647f963bbce9f75fbebd752", + "libraries/abstractions/posix/include/FreeRTOS_POSIX/sched.h": "a5934933798dd885a42a56086a3392a6d2308f7da050c43d7ead74ed9bd6cc68", + "libraries/abstractions/posix/include/FreeRTOS_POSIX/semaphore.h": "5083acc6f8e4b0665fd2e3dd859695e1275e18d28c31d38fb928653cbc9b0e4a", + "libraries/abstractions/posix/include/FreeRTOS_POSIX/signal.h": "741a1a9c91be63b63ce47067603de2800513270634349b1d2bf04b11f306c42c", + "libraries/abstractions/posix/include/FreeRTOS_POSIX/sys/types.h": "8bf35f1c28ad99dbb69188857a993fba0bd525d5331dcc888267be97a6970a88", + "libraries/abstractions/posix/include/FreeRTOS_POSIX/time.h": "c279ff6e67a368de345be368430527e0c96878d53e7d8f7d259c4b18f119182c", + "libraries/abstractions/posix/include/FreeRTOS_POSIX/unistd.h": "910f4d265a487dca969d708f60d1b822030feb31eff8f1f96fd234b299390099", + "libraries/abstractions/posix/include/FreeRTOS_POSIX/utils.h": "237cbdd8c5edeea07b02d60dcda4300f956aec170b8654c4878c2e3e849fec78", + "libraries/abstractions/secure_sockets/CMakeLists.txt": "c63a1272f25d85aece46ffe8244b9defef75ea48c8e5c16c6f0b22a783616e41", + "libraries/abstractions/secure_sockets/freertos_plus_tcp/iot_secure_sockets.c": "1056ea6d041a4874647d14539be9436f4d22568a9c221ca1d18932613ba3153a", + "libraries/abstractions/secure_sockets/include/iot_secure_sockets.h": "166e49a70c3f7e5f17950753fbeb1f4a20a08dbe2052a2796e4c5b3b838e6325", + "libraries/abstractions/secure_sockets/include/iot_secure_sockets_config_defaults.h": "01fc8396c938a471b6fe004d7606e5b8be7d242e3930b6650ae4c5a656fcbc84", + "libraries/abstractions/secure_sockets/include/iot_secure_sockets_wrapper_metrics.h": "bf52d247e676e330730561a7563226de37c92dbc1cb0e427e507e9cccb97e743", + "libraries/abstractions/secure_sockets/lwip/iot_secure_sockets.c": "168baf5419310d2561dcd84b89d98dd82431a62bc5de47b0128b49cbcee48ba8", + "libraries/abstractions/secure_sockets/utest/CMakeLists.txt": "fcf1096bfbf730be2081055b8fec3ad799e1862a46ddbd91587b2c6882255f1b", + "libraries/abstractions/secure_sockets/utest/include/lwipopts.h": "3d60a1130ba4f01bbae96b39b459d7c307325066ecf76b6a4d32b8a78b337018", + "libraries/abstractions/secure_sockets/utest/include/mocked-types.h": "8bf43e1f5161d5d7e743f238ffd96bc2107c71a39280f7731c4ead071d3eead1", + "libraries/abstractions/secure_sockets/utest/project.yml": "384bbbe2c3494178d374752ba3669e1913e5e0db48d5815fd41d45574091ef53", + "libraries/abstractions/secure_sockets/utest/secure_sockets_utest.c": "b3632fcf82a6def6a9bbedff47f7058b6002e7e19e8e2af75deedcf2bc532c8c", + "libraries/abstractions/transport/secure_sockets/transport_secure_sockets.c": "e720d1e82d1796f7fd95a7c5d59a528876f317c047d2515b5350f39a24e2edca", + "libraries/abstractions/transport/secure_sockets/transport_secure_sockets.h": "04da4c731e435219fedddf85fd085192316fba8cf84f60292069f8a5ae50a82a", + "libraries/abstractions/transport/transport_interface.cmake": "4df5d353d77c20cfadf6c6c0ebd3bd40a9f9051fbf3aa9490a443aa49e2d20d5", + "libraries/abstractions/transport/transport_interface_secure_sockets.cmake": "68cf67f49312b9955ba20979607f5bf104f25da6f169ca594f14b367a52973af", + "libraries/abstractions/transport/utest/CMakeLists.txt": "5c81c12612af44d53c5a902e2214ab4d52a2769d6beb340dc4ca18c1e57bc185", + "libraries/abstractions/transport/utest/project.yml": "a27ed6ecc7dc19dc73a38b7e938048f4fd17f0e46b362cdb585887504f2a8d16", + "libraries/abstractions/transport/utest/transport_secure_sockets_utest.c": "db86ac12bbc2b0a8048d7658cb5184fe766120fa7b95f7a96e8a5be0f381613a", + "libraries/abstractions/wifi/CMakeLists.txt": "8e74e2f750f62bee0e7386b1c94adb07322fc1ae7dbeaef7d9efb54a0d2efb70", + "libraries/abstractions/wifi/include/iot_wifi.h": "0b025389f33184fe47a2e73dd2f756152de927e41fc5e9bca2ff32275b9e1df9", + "libraries/c_sdk/aws/defender/CMakeLists.txt": "c8ec82ad75c882ed8edf8fe8c895a1b95d1f4c2f5351e2eb5459642967eb724e", + "libraries/c_sdk/aws/defender/include/aws_defender.h": "c517864111d2983d26e88739df6f6f8e472cabb952194331d75ff217c651ef50", + "libraries/c_sdk/aws/defender/include/aws_iot_defender.h": "cee3e754740daa68c3bb56a5cfe0b4cfeb3156cf791ecdee218ac26495fd9253", + "libraries/c_sdk/aws/defender/src/aws_iot_defender_api.c": "53138b2c6f7f28568e32e34453166211b3a9a41ca72e931ee5d9508108ffc43d", + "libraries/c_sdk/aws/defender/src/aws_iot_defender_collector.c": "dd0c856a532b1d02eeb8983acbaaefc2d93017b8b2c65e116995e78cb84d748f", + "libraries/c_sdk/aws/defender/src/aws_iot_defender_mqtt.c": "b5027fb61d2365bbcb4242bde75037c12afcb62d6128ca364a012da55dc55913", + "libraries/c_sdk/aws/defender/src/aws_iot_defender_v1.c": "fe3cbc39bd8f71c42038aff5be3ee0386c0534cbc013e5f6e9e352e63042043e", + "libraries/c_sdk/aws/defender/src/private/aws_iot_defender_internal.h": "e5ae1888bcfaaf7d138e6c25dc897bd5be58bb14bb0a38662787f8081fffb435", + "libraries/c_sdk/aws/defender/test/system/aws_iot_tests_defender_system.c": "64c2bb90dd51b5a0bf5ca90dd6ef1af432523a797835cdcf16608af66324ee4b", + "libraries/c_sdk/aws/defender/test/unit/aws_iot_tests_defender_unit.c": "686da80c0aa8314b782411d95efe53a2942bd0b0c70e7dcc55d57f42ddb0dc00", + "libraries/c_sdk/aws/shadow/CMakeLists.txt": "cc67e96a38a0417c67bfb7a6e000a56c37c84c26dfe426549ca7cf19e59b6bb4", + "libraries/c_sdk/aws/shadow/include/aws_iot_shadow.h": "108a5d14e73a7fd3a10eb8f6e7ba1b235defcbf58887209a5b4af2a3c460fa4f", + "libraries/c_sdk/aws/shadow/include/aws_shadow.h": "9c0ca2358c7f9e38b40ecea0aec469a26c1a0fa049ebf3d012f01c4ab291eded", + "libraries/c_sdk/aws/shadow/include/types/aws_iot_shadow_types.h": "278ff857e76963a72b229f486a9df0fa55930373312c153dd4165fddc075d39f", + "libraries/c_sdk/aws/shadow/src/aws_iot_shadow_api.c": "db16e46664aaf4ccbba826972624aa542392e2cd01992c11697a8c1b6573fdc2", + "libraries/c_sdk/aws/shadow/src/aws_iot_shadow_operation.c": "8c426b8915dd1f52044d2f7700f6427e6e916e83d0b4a43371a6c75d1f4fec7c", + "libraries/c_sdk/aws/shadow/src/aws_iot_shadow_parser.c": "56f27be23afde3278e45a16cadad654709f9edc515953fbeeb329605450d155f", + "libraries/c_sdk/aws/shadow/src/aws_iot_shadow_static_memory.c": "4b8ef05038cc3d9d7909b610db1be4550304e6242c8fdc3cda842573da80797a", + "libraries/c_sdk/aws/shadow/src/aws_iot_shadow_subscription.c": "2469963ec2a797fc4701a7e263176e84c74d50e8abb33ce02f8e18b83534c261", + "libraries/c_sdk/aws/shadow/src/aws_shadow.c": "ef64825842a1e3e23d0b9067316c6f7d4cfe8818b26cc535467cd5a78c9eb98f", + "libraries/c_sdk/aws/shadow/src/aws_shadow_config_defaults.h": "7fb46ab0e7d7bf9fae1a65f4dae6900ae9c3d3bbe0747ccd05f76931b70bb669", + "libraries/c_sdk/aws/shadow/src/private/aws_iot_shadow_internal.h": "dfa638605fa05eae3b00236cb71401b05a23008ba241810a1033219c56bbed7b", + "libraries/c_sdk/aws/shadow/test/aws_test_shadow.c": "d14e0e53cc54f4385f3b0f89a9a64f2b93885721bd1ba1ebd3076f39b67aebab", + "libraries/c_sdk/aws/shadow/test/system/aws_iot_tests_shadow_system.c": "c7cb61fe273c1a5b0b376c8546167941df711e48705241644a173106e8785cb1", + "libraries/c_sdk/aws/shadow/test/unit/aws_iot_tests_shadow_api.c": "9e0d845a524ecdb036b959f81b748db823b79ce8fabd06d040a5ff7d945b5387", + "libraries/c_sdk/aws/shadow/test/unit/aws_iot_tests_shadow_parser.c": "c6d6d717f9e5bb941319e39dc444ae3d8d5d658f2ce20b73a9ccafa499fc7d9e", + "libraries/c_sdk/standard/ble/CMakeLists.txt": "0f11f84f0ecda360b6495bd06f39776dd29a06ca59342126427bc6bcc882e734", + "libraries/c_sdk/standard/ble/include/iot_ble.h": "d5af99ca247bbd26ca89c230c0e11f1f635dc9eb912c8854e9db134468f681af", + "libraries/c_sdk/standard/ble/include/iot_ble_config_defaults.h": "b7725d70d2a4c2b8ed2515d4003aec13b2021ce2bbec7cf63078ec5e24737ad6", + "libraries/c_sdk/standard/ble/include/iot_ble_data_transfer.h": "51bbcadcfca661328116a9ebc719b1aa4ff7de2c8725b99a3f14a89084ced6c9", + "libraries/c_sdk/standard/ble/include/iot_ble_device_information.h": "490adc5631cca5a7902bea574a0dd00c30d08352185f4d09900f25a535b45c6d", + "libraries/c_sdk/standard/ble/include/iot_ble_mqtt_serialize.h": "b309581a96ca1a05b2b51ecaf017e611247f4c6af1baef8491d56d4778cf58ce", + "libraries/c_sdk/standard/ble/include/iot_ble_mqtt_transport.h": "604635e6ab30c923b9167b051459593ba845ccc073addf2fef6fb729f08b9d46", + "libraries/c_sdk/standard/ble/include/iot_ble_mqtt_transport_config.h": "b2cabcdd54a9fb05873aeb7dbdb30063b634bb53b75e7eb8d41d8c520b601275", + "libraries/c_sdk/standard/ble/include/iot_ble_wifi_provisioning.h": "900a018fd609063948b5f6fc2395c9ba9a6325e6c387f1ab646bde20873f5d9d", + "libraries/c_sdk/standard/ble/src/iot_ble_gap.c": "c0729d65b549034250c5a055c6709cd063367a95c2805d5929c7998ed8312b93", + "libraries/c_sdk/standard/ble/src/iot_ble_gatt.c": "9c45c461fc3f6757c807591cc4dd9a24933ae876786b7564436cff5f9a4dcd34", + "libraries/c_sdk/standard/ble/src/iot_ble_internal.h": "592901572381ab481ea8e96de24f06342ddb476aae0ce36dc882344891cbff9c", + "libraries/c_sdk/standard/ble/src/services/data_transfer/iot_ble_data_transfer.c": "9f4f5bb1942f7939eaf747c4a19bbde34a3711cf4837ba31056b91c0a66c466d", + "libraries/c_sdk/standard/ble/src/services/device_information/iot_ble_device_information.c": "4addd8491e9b72917cc2fe9f1ac6456ee41ee592b250838a55f717e62bc6e792", + "libraries/c_sdk/standard/ble/src/services/mqtt_ble/iot_ble_mqtt_serialize.c": "46278a662dab57ac35c7163d57a7a720f3777c88678a7da309b34d80e5c89e02", + "libraries/c_sdk/standard/ble/src/services/mqtt_ble/iot_ble_mqtt_transport.c": "ea8c402e8f063f910ec7b9842f3e71620bff6841b2d31406a5592ec320bfcfc6", + "libraries/c_sdk/standard/ble/src/services/mqtt_ble/iot_network_ble.c": "84a8cff83ece4744b688319066cf547edd2d9859a46d754b7dfdffb7f015c54a", + "libraries/c_sdk/standard/ble/src/services/wifi_provisioning/iot_ble_wifi_provisioning.c": "5c1dce5b3c17a683901aff691509759a5256705d4777a0fdd735b9f653357590", + "libraries/c_sdk/standard/ble/utest/ble_mqtt_transport/CMakeLists.txt": "fbbb4c125643824ec9a273acf0072327e219c50f56422e25b9ee4c8e2fb32d41", + "libraries/c_sdk/standard/ble/utest/ble_mqtt_transport/iot_ble_mqtt_transport_utest.c": "7f2530809364e3723a576ca57e2e656f9263a2b530ba22ca40071ad6bfec5617", + "libraries/c_sdk/standard/ble/utest/ble_mqtt_transport/project.yml": "1a92f7ef1d78b693b3a09059a713261e9fc769fafd95814ecaa52d2aafbef7c5", + "libraries/c_sdk/standard/ble/utest/data_transfer/CMakeLists.txt": "f2a7b2993767011f69d2aaf3e82aa8434f360163119d50c91db8f4d2bcca392f", + "libraries/c_sdk/standard/ble/utest/data_transfer/iot_ble_data_transfer_utest.c": "072a0265edd9c5bf4214ee8c3bb895ef68200dddb8ffde43d893134a4ca9916a", + "libraries/c_sdk/standard/common/CMakeLists.txt": "e9c38c6e8510540bfc140333ed4c17113d8949fd49a2a9b882881999a1e6778b", + "libraries/c_sdk/standard/common/include/iot_appversion32.h": "7a772fe6be5d5f177dfa77b63c643a972c276da82817cf4ebbaba8c27312a66e", + "libraries/c_sdk/standard/common/include/iot_atomic.h": "5a974d1154b945590472b40d4e4103ef489441e7f8fa2499ac68e4c1171c7440", + "libraries/c_sdk/standard/common/include/iot_init.h": "8412b5f301aebd15bad900e48748beb406092843b99feffe97f43994a3273d97", + "libraries/c_sdk/standard/common/include/iot_linear_containers.h": "084bb3420d1d0876efa9d8ba04355032f6284038d8d90a1e7b54612270766d81", + "libraries/c_sdk/standard/common/include/iot_logging_setup.h": "d44de83fb5e0c002fae577fd2bf441fd747d548dd2a3b2e6fdf29b95db760890", + "libraries/c_sdk/standard/common/include/iot_taskpool.h": "d4e48a78b25c2d5de9b4ddca83e04eea73178cd0c4276ed72aabe27ced3d397a", + "libraries/c_sdk/standard/common/include/private/iot_default_root_certificates.h": "e144532e63d0d37975fb2a42e0ea68b5f964c4123e48169a031d646381fcc64b", + "libraries/c_sdk/standard/common/include/private/iot_doubly_linked_list.h": "890dcba20e326ad6f1cafc8aeb2504fd83cc0b66f65c129a1c403b651b3b3ae2", + "libraries/c_sdk/standard/common/include/private/iot_error.h": "e436377ac6fe9c522ba83042eff8bc0b6cdb1ace19ca5eba744080b250c5239d", + "libraries/c_sdk/standard/common/include/private/iot_lib_init.h": "e40e08941cc0652d55f281556a3febf9ce2c8a96ea6dc15c79ae4e4fd857911a", + "libraries/c_sdk/standard/common/include/private/iot_logging.h": "b10f162b2cbed3774fc509a6b7c6dad7e284b8c34896e849df085ffcb99a870b", + "libraries/c_sdk/standard/common/include/private/iot_static_memory.h": "1eec32535deede978f84fdc6e81745c495a553801a4c0dc4c5b87fda8852acc2", + "libraries/c_sdk/standard/common/include/private/iot_taskpool_internal.h": "66d2aa40f59b652d8650fc748674820fade00ddf7d2bf8d94c835bd1b6192fab", + "libraries/c_sdk/standard/common/include/types/iot_network_types.h": "c4633ad4e316fb09dfdb24a792c7d7826f76d50117034c49ed7ef4059191288f", + "libraries/c_sdk/standard/common/include/types/iot_taskpool_types.h": "964ed18ad220fd0edcffbdf5d72631d53331ad350faf377a69b39fd68dc858ad", + "libraries/c_sdk/standard/common/iot_device_metrics.c": "79bc39fc4dcb46a4a8ec924d5b46ff0bc7e36306ae25c166649ce33d3e8e7491", + "libraries/c_sdk/standard/common/iot_init.c": "54d9433be558894d8c00e280a8adede90bca510f0fedd70e7f9061d7245d5375", + "libraries/c_sdk/standard/common/iot_static_memory_common.c": "0e3d567dbc4f4f9986c8a1839e7396d7c336ed3fcb183ee5f9157d824ebfb906", + "libraries/c_sdk/standard/common/taskpool/iot_taskpool.c": "3510f2130d79f5277b89592930790d13ad3e3f6b9f7d461dba286f79dcc352a5", + "libraries/c_sdk/standard/common/taskpool/iot_taskpool_static_memory.c": "be38b5a6336584f62740ae968fc2679dc81e61b73fd9a8834808cc50c6cfc224", + "libraries/c_sdk/standard/common/test/iot_memory_leak.c": "472e5f9c8c7b81d25180d462e3acda232d0bb0e294e9ba8529c3f5488f0315a2", + "libraries/c_sdk/standard/common/test/iot_tests_taskpool.c": "4e215e9e21e496c45ec19e5ee3c94ac50eedfd5af155e6b9a062074d193288ce", + "libraries/c_sdk/standard/https/CMakeLists.txt": "eaa04b568b108518def05a314fd14405993dcafa84a923bfb8af5a5f095ce257", + "libraries/c_sdk/standard/https/CODESIZE.md": "da5fddfa49c70b9fb16765ba8f961dcb710ea273cbee574f9db66e132f1c57c8", + "libraries/c_sdk/standard/https/README.md": "b617d62af999ff0a4502ba6eb577c45ee0e9e8c1cd6d4fd416af45847b7e38e9", + "libraries/c_sdk/standard/https/include/iot_https_client.h": "cb48da3608dc3b5afabced2b91009ab2353926f2ee4c9e47e85734ade46e6560", + "libraries/c_sdk/standard/https/include/iot_https_utils.h": "206ed7f94a2746dea4c39574cd1f7f77d68adc2d1d6cf648e61628215db4e710", + "libraries/c_sdk/standard/https/include/types/iot_https_types.h": "07bc744f29952ffd76d702a4bf213259ec8c03689b911cec6ccf97b3c604b22b", + "libraries/c_sdk/standard/https/src/iot_https_client.c": "4718b190a1e0a813e74fba298e748fe6b269efe264df7e04ddbcacea324d76f7", + "libraries/c_sdk/standard/https/src/iot_https_utils.c": "c260e1de293018041954f21e1b63ad1a504743178c9cb4b565224a1302b34bd5", + "libraries/c_sdk/standard/https/src/private/iot_https_internal.h": "27dda02d7ace98f52c42128789bcbf4f7b4714d6d40fd692b7efe4932ca623cf", + "libraries/c_sdk/standard/https/test/access/iot_test_access_https.h": "cb6bec043b6c286701cd5c9f0a63576da507a836f6f9f6a4312eec17c10b7dda", + "libraries/c_sdk/standard/https/test/access/iot_test_access_https_client.c": "cfec4233d7b0b305a4c92606203804781134811ad059b12276dc296e627166da", + "libraries/c_sdk/standard/https/test/system/iot_tests_https_system.c": "359901114a0f0b86968631f42105678065c617293bf35596ef7682cd512020fd", + "libraries/c_sdk/standard/https/test/unit/iot_tests_https_async.c": "efc6523d84e0a5f847beeff3cf3b3c5907cf685524ecca91afebf44a3ed35576", + "libraries/c_sdk/standard/https/test/unit/iot_tests_https_client.c": "40d0fed0677dfe86fefd5acb063783b70ce3fb862666d804174ff551eafd0cfa", + "libraries/c_sdk/standard/https/test/unit/iot_tests_https_common.c": "d9db6a6d5e193db579db73263969c3c9a80c9f46f63923a0441503d447bec91d", + "libraries/c_sdk/standard/https/test/unit/iot_tests_https_common.h": "e27dbbce464c06396d879bcb55117840e5e0eb7d1126f2c461bd584afb59ca5b", + "libraries/c_sdk/standard/https/test/unit/iot_tests_https_sync.c": "c4fc22033a9d707952c6d4e29ba10d69ae643a3126db39269ae48429811b85e6", + "libraries/c_sdk/standard/https/test/unit/iot_tests_https_utils.c": "0d423bd88a7b3c68182c314f79607a4957ad88d317feaa7be76fa8453a7ab822", + "libraries/c_sdk/standard/mqtt/CMakeLists.txt": "69f3d607bc4c06d40fdba5afd750b15f30217d5df6cd4969c4123126806f9495", + "libraries/c_sdk/standard/mqtt/CODESIZE.md": "0f2f8c74f4759e7493dea36b5ed0961efa45aa882242cf62373ae0a31e995aeb", + "libraries/c_sdk/standard/mqtt/README.md": "d0cbc5bb464023a31297b605b1f46471c81837707d3e9a4fa6fc387005710ae6", + "libraries/c_sdk/standard/mqtt/include/iot_mqtt.h": "fcb7c5acf6de75882b2f4ede93eedbd0c2c5c07fcfcaf50e84c52a8e7f9f8844", + "libraries/c_sdk/standard/mqtt/include/iot_mqtt_agent.h": "e65b2575002ed3c91d21e62d977b4cee7949aa9036ff0a81345677a7622037c1", + "libraries/c_sdk/standard/mqtt/include/iot_mqtt_agent_config_defaults.h": "d112705ae65ac708669e97eece9a374b7c9a49ec9196f95ac992851ca0d3ea5c", + "libraries/c_sdk/standard/mqtt/include/iot_mqtt_config_defaults.h": "893cec640eb3725603c6a00f00436773be42967bc30ff58718379866cf1f0c07", + "libraries/c_sdk/standard/mqtt/include/iot_mqtt_lib.h": "19e7ba69d478af0684d188d328ffa88ca4210349fc9c380c774a688a359c73f9", + "libraries/c_sdk/standard/mqtt/include/types/iot_mqtt_types.h": "b1e71bb1378e2c7a277cf2d5fbf5c4f50f83c0cbe261d02392ee6b132821ba2f", + "libraries/c_sdk/standard/mqtt/src/iot_mqtt_agent.c": "b89c4b460099b26f73a3b2b7fcfef1e9218e873743df3e093ed811bd4051d8b7", + "libraries/c_sdk/standard/mqtt/src/iot_mqtt_api.c": "36dca94e0ffd85479bff9c3fe9f366f1e533f1c13afbfc24b72fc24ee5f74364", + "libraries/c_sdk/standard/mqtt/src/iot_mqtt_context_connection.c": "0f0b673ff37a7dcad5369bf59d8a9e2f53b445d1a403546d9f55799f2ba29cd8", + "libraries/c_sdk/standard/mqtt/src/iot_mqtt_managed_function_wrapper.c": "4a68910cb379ce418b452f06c82513af366d511bf1394380886865a5d9e79447", + "libraries/c_sdk/standard/mqtt/src/iot_mqtt_mutex_wrapper.c": "4cd6c0a400b35bd5e5b9e975a8693f724221e7c0f46d8345c0f122a00320d25d", + "libraries/c_sdk/standard/mqtt/src/iot_mqtt_network.c": "efb20cc91aadfccfed0fa32b9cf13138aede7a14fd65eaeceb79c39241a88c4b", + "libraries/c_sdk/standard/mqtt/src/iot_mqtt_operation.c": "ca23cd0be64ae44b64135a8f49004176aaa01451ed37c1be51b2077eff7974bf", + "libraries/c_sdk/standard/mqtt/src/iot_mqtt_publish_duplicates.c": "95b8cdb1a8247e4dd16aa7465d7bcd1207262a64241614eba9b2f88e5c958671", + "libraries/c_sdk/standard/mqtt/src/iot_mqtt_serializer_deserializer_wrapper.c": "7459c0ceb63e5a030d6a8b7820c5ec804391c2a5388c714e6a3fc4997e020bba", + "libraries/c_sdk/standard/mqtt/src/iot_mqtt_static_memory.c": "d0c107420bc0817548df9fa7c5144d28e3a611e8a510ab83b5d031cf509c4054", + "libraries/c_sdk/standard/mqtt/src/iot_mqtt_subscription.c": "cc32732f05bbffb5cff3f716ff0896e799b972baf215e9e3b68569a3e2177500", + "libraries/c_sdk/standard/mqtt/src/iot_mqtt_subscription_container.c": "aec00a74121222ff6e0567ec6dff25421236a0547766685cbffd0ca3c2777d6c", + "libraries/c_sdk/standard/mqtt/src/iot_mqtt_validate.c": "dd49e69f327e953f30faf316612401f22b015c8089684c6e4e5b663885638b8c", + "libraries/c_sdk/standard/mqtt/src/private/iot_mqtt_internal.h": "0c12512e1fc9886ee047175f1879f14e8a0d5dbcae4d7146c6d29bb2b6dc988d", + "libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt.h": "1a88277aed658985c9d9821a5f3b9a031d85c0c97fb0b3ec46f46c05d471599a", + "libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt_api.c": "7fedb1b7387e37548a2e2263e6b8d66edb1e1c6ddff9b4dd888232a9b641fd5e", + "libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt_context_connection.c": "c03c7a033c3fcfc01bfc938ac62e30ec55238947c1ecdad0beb209a7ab7f15f6", + "libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt_subscription.c": "2d4f4ab050f786a4283176321c3e57b44d01e5fc8b0f8d0c5c90daf116c125a9", + "libraries/c_sdk/standard/mqtt/test/iot_test_mqtt_agent.c": "3b2a9f496ee2ea51a6c0cc27164f9105fd6e4d31049e8cbdf9ec9e7f2023a15b", + "libraries/c_sdk/standard/mqtt/test/mock/iot_tests_mqtt_mock.c": "003fa582439011b32a17137b95a27c301d976de8daa76769955778f6c84f20f1", + "libraries/c_sdk/standard/mqtt/test/mock/iot_tests_mqtt_mock.h": "e12ad1bbfd3415fedb0a8ec59bc2ee844645e146695d14e75d2bebf81fd3f20e", + "libraries/c_sdk/standard/mqtt/test/system/iot_tests_mqtt_system.c": "52a075dbae349c8f33d1e0569ad392416ba5f78a6a99aa740f4db7515ad08edf", + "libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_api.c": "d98a8a4aa057d8fb502c53f9246c521607e1186c28a5503486af4acd8a294ab1", + "libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_metrics.c": "e8f711544587fe019e129e67052d0af93280f6ea1690390e197045f79ef1f34d", + "libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_receive.c": "f257d320530b33032865ce94c091109110cb6c29a4b0be0a9c3a9352af8d3d06", + "libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_subscription.c": "03c1e10595e50bf237305743aec64a96a5cb8ef682dccd69d8d1c06e5031b89a", + "libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_validate.c": "618428e8c8806fc4887d92ccccba1149a996a34281ab1640bd42517ddfb49833", + "libraries/c_sdk/standard/serializer/CMakeLists.txt": "dde7183a219ed813b6dad00bdf0423e5cee51c543db53a9365432471da41ad9e", + "libraries/c_sdk/standard/serializer/include/iot_json_utils.h": "5bf1f710e690b9955d90e0df02db2cfabaadea4d750acda4085c25feebbabc4b", + "libraries/c_sdk/standard/serializer/include/iot_serializer.h": "d83dfd2b9cae3df2ce12e1839039d0cbb436a0864b06b0421b2ffa2e3e1ed038", + "libraries/c_sdk/standard/serializer/src/cbor/iot_serializer_tinycbor_decoder.c": "b57282296f0f67cf378fc353a6e93201f6cbc3eb9285370511e9d832a13cdc3b", + "libraries/c_sdk/standard/serializer/src/cbor/iot_serializer_tinycbor_encoder.c": "d9d45720775644c14d3b855c70e77c988bf031c73013101e652edaede696db23", + "libraries/c_sdk/standard/serializer/src/iot_json_utils.c": "31e6f42d53b68ca208463ad9d656343a951618c87053e263cab533448fabc5f6", + "libraries/c_sdk/standard/serializer/src/iot_serializer_static_memory.c": "b29ecc34006e58e985cffc405120941f447ffab98647b5c444937b6c93d0cd88", + "libraries/c_sdk/standard/serializer/src/json/iot_serializer_json_decoder.c": "bd54cf6d88268aef636c4ff52a4c52550dd772181d7967cf0ee27d1c5fd0f541", + "libraries/c_sdk/standard/serializer/src/json/iot_serializer_json_encoder.c": "45d69b8bea3fde62360a18ca10268196931dea88b8ef3ace62af066d5ba67c9c", + "libraries/c_sdk/standard/serializer/test/iot_tests_deserializer_json.c": "f5029fa6d03be5ca750f8c2f469ae5fe6e8d321be84db66867715c3541bc892c", + "libraries/c_sdk/standard/serializer/test/iot_tests_serializer_cbor.c": "476b07305cda499e36a416f057f44a64bd39390b0d73e1f3277020e0837ee4b9", + "libraries/c_sdk/standard/serializer/test/iot_tests_serializer_json.c": "34f0eca4d8793b1ec26706ec153caf9109026fe267ae5fa535849d1bfa222abe", + "libraries/coreHTTP/CHANGELOG.md": "34b11b571fc78fb17b5983b45fdeb7101c8224288764b60b0d703fe2a6c5ce04", + "libraries/coreHTTP/LICENSE": "508a77d2e7b51d98adeed32648ad124b7b30241a8e70b2e72c99f92d8e5874d1", + "libraries/coreHTTP/MISRA.md": "d9cff61e3d19446ec04f3b8cb9c94025e96b874acfdcd86a628d074a7116c236", + "libraries/coreHTTP/README.md": "0ba7725b330809f72a5e46b007c190584cede26a49d752056efee7e2f7a48057", + "libraries/coreHTTP/SECURITY.md": "ff53e3502bc39dac4a7074fe790f663c56d6c7aacd5b66dc648049f685e1e44b", + "libraries/coreHTTP/docs/doxygen/config.doxyfile": "e1fc8d953069f266195e8a368d4d3fbed33698ff281291a0ac4c9041eb176682", + "libraries/coreHTTP/docs/doxygen/images/httpclient_send_activity_diagram.png": "a33657d016e6f9843d7376a9ff07a92f91339a7f7c4f3ad759130249a044a854", + "libraries/coreHTTP/docs/doxygen/images/httpclient_send_activity_diagram.pu": "74faf689ee5221967e60fb44d96821541a03439fa55d9de3213c80f6ca085113", + "libraries/coreHTTP/docs/doxygen/images/httpclient_send_sequence_diagram.png": "416b0c69f36758569f08a6d2eb014f4a00af8ece8d34e15644d074dfbc82da32", + "libraries/coreHTTP/docs/doxygen/images/httpclient_send_sequence_diagram.pu": "b67520292416360bc651de0698f5aa7439af1aa9ccc77e2d7e4064a2313b823a", + "libraries/coreHTTP/docs/doxygen/layout.xml": "555a70789f54c525456ad9d30730614fe7119afb8b81dd8f8067af28dd14f66c", + "libraries/coreHTTP/docs/doxygen/pages.dox": "b8695e449c7b76bfd3d4356e85bb7e34869961a641a2552170604b73d794b37d", + "libraries/coreHTTP/docs/doxygen/style.css": "e3d3b4438744aa4d547bcacc6e64f3fcfc5057b476c5237e5107e6bbe0aac72a", + "libraries/coreHTTP/httpFilePaths.cmake": "c76a4b8a19d025e4116d50289bca63bdf586c5db63a511a38cc2a78bd533f0f4", + "libraries/coreHTTP/lexicon.txt": "9aa31f81d0918f738ae02bf0c3b974b9f00025b42060252b3d16d56e0e498eff", + "libraries/coreHTTP/manifest.yml": "58ae3e1d3f4829d086751f2ccbe212c65c0c14fc8208a4af85f4bf81897f7c06", + "libraries/coreHTTP/source/core_http_client.c": "6bcf63124dda3bbf6a416f62af7a850bfb5866616c757bd62b736989fb77cfac", + "libraries/coreHTTP/source/dependency/3rdparty/http_parser/AUTHORS": "d1a15fcf0453796ee31e900dd5edff35ae86fb6ae4375c2afda8bde0f6fd2f03", + "libraries/coreHTTP/source/dependency/3rdparty/http_parser/LICENSE-MIT": "79e6ba8b687cb54786207342b9b6fcee0ac10218453ed9009b84d949b2233cc0", + "libraries/coreHTTP/source/dependency/3rdparty/http_parser/Makefile": "a3c39510e089c18bd94a6f113c4bc8d010349322972b634c0a6cf6b67ae3e589", + "libraries/coreHTTP/source/dependency/3rdparty/http_parser/README.md": "c44b674196891b01e397c38d4107cf6b9a171ca864c5e05c0c0c2adf7b24edc8", + "libraries/coreHTTP/source/dependency/3rdparty/http_parser/bench.c": "e64bfe50494d661794e515aad502f0154e888fbf6458fb8a18252ad0b5667c84", + "libraries/coreHTTP/source/dependency/3rdparty/http_parser/contrib/parsertrace.c": "e3d5f53fa3f6b26bf1cefc359eeadec35beaf61c6db863d2338cbac278d3a5ee", + "libraries/coreHTTP/source/dependency/3rdparty/http_parser/contrib/url_parser.c": "ecc24f95707866de11b4b6588cbd0bb0728b1def6e95387cedbef98a73a0acf2", + "libraries/coreHTTP/source/dependency/3rdparty/http_parser/fuzzers/fuzz_parser.c": "976630897aa2d81ec8d493ce838c7d26acc9f14de2a1d6b7531d1c6b875f4d78", + "libraries/coreHTTP/source/dependency/3rdparty/http_parser/fuzzers/fuzz_url.c": "539c24a4547e74379d217eb7d09fe6696a1078ef188da0626df5ebe8ab13c200", + "libraries/coreHTTP/source/dependency/3rdparty/http_parser/http_parser.c": "35115393aa0e716b7bc80c1dfb8836b9921161eb47c5052f7a5fc8c282cb63a4", + "libraries/coreHTTP/source/dependency/3rdparty/http_parser/http_parser.gyp": "ca7cc55cc2a81c5a5b3795171e3a953e5c7b10ec2923ec1560e60f914ca18ece", + "libraries/coreHTTP/source/dependency/3rdparty/http_parser/http_parser.h": "68d5fc4bbf8148393b27aba99333a298d2c7d9d10d4e058d236afd1ff7880b1d", + "libraries/coreHTTP/source/dependency/3rdparty/http_parser/test.c": "5fb25742a1bafc286ebf0af35c36b854fdc8152537719d5bd38b81a15e9256f7", + "libraries/coreHTTP/source/include/core_http_client.h": "1e66a360af09e35896730730eef4f833ed461f6ea529fd22aeab9d7ec3e2862a", + "libraries/coreHTTP/source/include/core_http_client_private.h": "993b6469c72766b386dbb882085a4dd14c08e0e626a41b996984f62024770d5e", + "libraries/coreHTTP/source/include/core_http_config_defaults.h": "5bbd51ec7077d04163f7ff6a87a6288f3ff022bb163ea5d3be39d7713d0e50f7", + "libraries/coreHTTP/source/interface/transport_interface.h": "2da8c975445459bb2a203fd3a0542821d84edda257e83a97c7f0e3d0771c5279", + "libraries/coreHTTP/test/CMakeLists.txt": "7b3cf06a23cc29e407522c71d41f7da4c79cc121834d2435b5937ca27c16bfd6", + "libraries/coreHTTP/test/cbmc/include/callback_stubs.h": "65f2d782ea8c1a5e87ae658f7227960aae4f4d33ee4a66c9437764fb83f4c0c4", + "libraries/coreHTTP/test/cbmc/include/core_http_config.h": "9b2fb355ff9c83d542de8910d8eaafbabd4c0cc89882dbc69d324bc552e0d8f0", + "libraries/coreHTTP/test/cbmc/include/get_time_stub.h": "1ee163b68ed0fe8b5a7635b19e5aec23d80c715f7ac998d40f551cf719add915", + "libraries/coreHTTP/test/cbmc/include/http_cbmc_state.h": "d95ddde1b5efde09f4b947e23019ee456cde3fa4365a6b919bd93138f151fc11", + "libraries/coreHTTP/test/cbmc/include/transport_interface_stubs.h": "8d581010b3d155b539821035600f325f4949e2d304e5992ac9f2ce9a61bafa0e", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_AddHeader/HTTPClient_AddHeader_harness.c": "8291d8e55d7475eb28297cddfc71970928221c8f07ae49f79eff9aee4ca47e84", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_AddHeader/Makefile": "4785c9a0604a859efe1fd8f6e0e21d48691f2b2f71552bbba41606f7192aae73", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_AddHeader/README.md": "b62d22babada17a4c4586fbea6e2e38a43ade1c99c5e8ca9cc9351859db888ac", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_AddHeader/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_AddHeader/cbmc-viewer.json": "79243f976acf0096224508e4aea3b1a21905cde37a013cba019926c01a72fd94", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_AddRangeHeader/HTTPClient_AddRangeHeader_harness.c": "b9b0f5f044d9b690929e910027df18f5cc4e75f0363b77c8a28a714f7edd19e9", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_AddRangeHeader/Makefile": "696fcbcac74e3c0d81f691110163511afaf3aeb86966f7fe10894e8c40f1395d", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_AddRangeHeader/README.md": "d45c670793bb1040fd60bd4011978d4b710965d2687a886a8ba126d37653b499", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_AddRangeHeader/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_AddRangeHeader/cbmc-viewer.json": "643d964cea0c59b1f2bc74e6f47a105b688b240d9834e3b94dbcfb5c5b35c2b9", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_InitializeRequestHeaders/HTTPClient_InitializeRequestHeaders_harness.c": "ab044e6287ed7a8094a7bddafda8db39395b1e1c88d5601aaa7a97ab5ba2c8c0", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_InitializeRequestHeaders/Makefile": "b49dd74e7c0dbc9ad4b956f6edcd77c270683fc9c58ce6719c1ee326ff43c356", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_InitializeRequestHeaders/README.md": "d0998cdd8fede8d3fbc25fbeb1769300432760c6c7b37cb316ee631c962c2fe4", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_InitializeRequestHeaders/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_InitializeRequestHeaders/cbmc-viewer.json": "02caa73dd56829a96c16818e47e224b231426e77197bb5d7e13046c51d1bf41d", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_ReadHeader/HTTPClient_ReadHeader_harness.c": "fee82608fae59c41aa6f7ca6a00818c61c0eacbaf4b07877b01481e639f22300", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_ReadHeader/Makefile": "de68643eaff244578112d46e066eda1470096cfacf097bf8069f54a030e5f1f1", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_ReadHeader/README.md": "26d7d349f0743630a40d897a57efd0755e219cc36811f3d91d7116e871d5b285", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_ReadHeader/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_ReadHeader/cbmc-viewer.json": "75813007f1e921249f5edbe51dca521043038a5807c6dce51a8ba7b3ebacc45c", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_Send/HTTPClient_Send_harness.c": "77baac9a00cfdb4f3dda9a99f195ca376154650655d67bfc09fc1d33f8ea75de", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_Send/Makefile": "683a3c3ebfcb4baba232bca75591164d02577631f1ebd494357c8ddec5ad6c1c", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_Send/README.md": "7ee6fbe03820add750b13514fef300624b11fcbb95b58514e5a6c17a5261ccdb", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_Send/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_Send/cbmc-viewer.json": "9d58f867f8aa6d49d5efe999e28d7ead51aac98a1e94220dcba3db1a976427ec", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_strerror/HTTPClient_strerror_harness.c": "6b3bd7ca732afd06e0e1bfa71d1ae7e034a19c301cf581ad6ae8dae8424310be", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_strerror/Makefile": "bb8ac58f1935322d1733ffda57db77dd16bd3cd19e92f2a9f6eaf6db499d0c9f", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_strerror/README.md": "5ede4ac03e17aa89563e4c15440805c6b0fd79f9f70cd18b8a17468b2956c4ad", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_strerror/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreHTTP/test/cbmc/proofs/HTTPClient_strerror/cbmc-viewer.json": "5cae08c7d5dbc14fb74eba0ff22e3f1290a0518ab26693d4626462d25c4ba144", + "libraries/coreHTTP/test/cbmc/proofs/Makefile-project-defines": "10cc06898a3f219fe925dea584e6852a44657475c66639938e78abe8c819f5d6", + "libraries/coreHTTP/test/cbmc/proofs/Makefile-project-targets": "d8c3930590646a4a3b5f5ed446758bf2d8b27ffb742dee196efb816ae2f502f6", + "libraries/coreHTTP/test/cbmc/proofs/Makefile-project-testing": "acb51f25870892f177057e7f56e73979e0eeb4967e3280aa160fd33a1a7bb03f", + "libraries/coreHTTP/test/cbmc/proofs/Makefile-template-defines": "50b3687413c3a9a1e42a62954b1007e270fadbfda068fcb8e796b1862563507f", + "libraries/coreHTTP/test/cbmc/proofs/findHeaderFieldParserCallback/Makefile": "8e182ed7b43d53277b86337bf98878faae435b0ccd4aea3d2b6518c61c521bcc", + "libraries/coreHTTP/test/cbmc/proofs/findHeaderFieldParserCallback/README.md": "76646a1aa4f84d86016d5b19ba860e511c45b223ddb562371fd1d9b54c6a11af", + "libraries/coreHTTP/test/cbmc/proofs/findHeaderFieldParserCallback/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreHTTP/test/cbmc/proofs/findHeaderFieldParserCallback/cbmc-viewer.json": "b9b2b959af9659f644ee219f03fb0f6e3dade520f9eb774905fb1ba5fb8006e1", + "libraries/coreHTTP/test/cbmc/proofs/findHeaderFieldParserCallback/findHeaderFieldParserCallback_harness.c": "703bfe666f7c20778a77b2b60ad0f19bb42d77f2f3065628cb667b27bf539081", + "libraries/coreHTTP/test/cbmc/proofs/findHeaderOnHeaderCompleteCallback/Makefile": "933278fdf885a2baa9075390078b473eb3eb93d1aa91946b92848cc05d9b91a0", + "libraries/coreHTTP/test/cbmc/proofs/findHeaderOnHeaderCompleteCallback/README.md": "ddeda79c19ae2c809f7254813fc3d50ac47a20fb65a4cf6d6e42ff92704c1379", + "libraries/coreHTTP/test/cbmc/proofs/findHeaderOnHeaderCompleteCallback/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreHTTP/test/cbmc/proofs/findHeaderOnHeaderCompleteCallback/cbmc-viewer.json": "fd2db195214019e10708297d144564e6223e61b1a0c72b0c998044cd373e3e98", + "libraries/coreHTTP/test/cbmc/proofs/findHeaderOnHeaderCompleteCallback/findHeaderOnHeaderCompleteCallback_harness.c": "0c8dbba83959ad19f0bd16e45057871bfef08a281e539f65bcb7b51ac89318c3", + "libraries/coreHTTP/test/cbmc/proofs/findHeaderValueParserCallback/Makefile": "f3d17ebe795b6c87075736ef2619bba2e5cc7146c7eacefe30d4d72ca0445036", + "libraries/coreHTTP/test/cbmc/proofs/findHeaderValueParserCallback/README.md": "b9fa2c18150592277fe1910856e9190803d92dc79ed82748aaf0c485b9e5e3af", + "libraries/coreHTTP/test/cbmc/proofs/findHeaderValueParserCallback/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreHTTP/test/cbmc/proofs/findHeaderValueParserCallback/cbmc-viewer.json": "fdf5c633bc18921aaa3bb52c7f7a2a7980b84c5e263683d041b533e84c56e119", + "libraries/coreHTTP/test/cbmc/proofs/findHeaderValueParserCallback/findHeaderValueParserCallback_harness.c": "739e9e0efb0f36015fa3e574b1de907a5bc9ea8278a442a4d1d78393e49452b4", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnBodyCallback/Makefile": "a59febfae8c6d6d3fb8349d81590748584584f089ca7afb626261fabb517405f", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnBodyCallback/README.md": "426235c79fc28e957e9de7ca9e39af9445db22e7803f5272df0b591928a4e64e", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnBodyCallback/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnBodyCallback/cbmc-viewer.json": "4ce59beacd592f7fa25643ef3eaa87473ed164eba214ddff8b77283963962a03", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnBodyCallback/httpParserOnBodyCallback_harness.c": "7aa5d855d0ea0ed897a52ee1ea64032b12766a7e0db3d1e0dbf4ff4711fca414", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnHeaderFieldCallback/Makefile": "ac0726618716e62af180a2bf0bed91441691004b64749bffef506ded94333210", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnHeaderFieldCallback/README.md": "61dccddd922a37b7fa9468dce966110b8023ffa29de0f96acd17824483a9e321", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnHeaderFieldCallback/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnHeaderFieldCallback/cbmc-viewer.json": "2cb88cfe2685c7c4c6a88f60c6c9f819c88786c863563279a9f016c1cedbbeb2", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnHeaderFieldCallback/httpParserOnHeaderFieldCallback_harness.c": "afe03b974deebf787a95cf5692ffc7028134847d5ee2ab013ce43c76ee5b7b6f", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnHeaderValueCallback/Makefile": "ddb2dcc12b7901058995e4acf485929d9b1f3100e45e7363a31ba5409ddf2e04", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnHeaderValueCallback/README.md": "8c3e06c2491cdb832f04bab5442dc362c9e09fb3a1aef58d8ef4940cbe47afec", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnHeaderValueCallback/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnHeaderValueCallback/cbmc-viewer.json": "23ec4249ee5f16dc714fcef1fa7f14391fc27040c8582c0e8bfcfe44c890eb99", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnHeaderValueCallback/httpParserOnHeaderValueCallback_harness.c": "d1a13b295b3b1ffa12d0f0d92507858b89bcd1d8a16cf98517a13264cb58d7e2", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnHeadersCompleteCallback/Makefile": "7ce1bc110843b76c990a4b93d0ead190c164d3561a3351ac401721e20133b1db", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnHeadersCompleteCallback/README.md": "1be6ba12508bac97a06f897faf96250bf1f04afdb6d6759ecdeaae34da0bf38b", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnHeadersCompleteCallback/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnHeadersCompleteCallback/cbmc-viewer.json": "6f34f80d9db904eb18457219e39374e4105ac4b02f12558e75136f9004e4bf3d", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnHeadersCompleteCallback/httpParserOnHeadersCompleteCallback_harness.c": "577f26d6f00407ab7e022e1b08373df608003d55ef6a338fdfe5eaa7c53bf2f3", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnMessageBeginCallback/Makefile": "b4a6efd1d52d70f3ef49f2da113981a8d7c2db4548be09a20428d535b6a16e71", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnMessageBeginCallback/README.md": "f787909d29ebe0f2b9c3d45fd9074a4069af098f786b793c3bbbe55d9f55d6c1", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnMessageBeginCallback/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnMessageBeginCallback/cbmc-viewer.json": "36136bab4783f0c761bf69adb79c19feb23c7079310c9546512680087d4edf9a", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnMessageBeginCallback/httpParserOnMessageBeginCallback_harness.c": "e474f562ab3359c2a66a598653bcd8afbe37bf2a70686811c833d3d7157bc8a7", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnMessageCompleteCallback/Makefile": "c5174b7cc970ae5778ac317988a7f3837f0e7d935b3e5afa6396b659b803c97e", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnMessageCompleteCallback/README.md": "57ae45864f026d4cd3c82ce6b258d063d81f6548e49eca1a80adc5bdddb132ab", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnMessageCompleteCallback/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnMessageCompleteCallback/cbmc-viewer.json": "efdc22d03e3ce5ef734a3079c252b3d913f33768ef269cf838f54efb6f62dabb", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnMessageCompleteCallback/httpParserOnMessageCompleteCallback_harness.c": "84cc8356ad955eac7c833edd3adea4d2cb2d56d2ec774675723f93b139e37e90", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnStatusCallback/Makefile": "702888ff9c0f9e7cc6f176edb536507d166384206f3213ab7f9f65a0b02ce531", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnStatusCallback/README.md": "838b83f4e48e15433cbe30ffca9983afc63436736b5630909e452df90b2ca90d", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnStatusCallback/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnStatusCallback/cbmc-viewer.json": "b92161eadc17e6b6c0fa367c09d87a0126d9e9f4baa3fb83e40f6dc92157f436", + "libraries/coreHTTP/test/cbmc/proofs/httpParserOnStatusCallback/httpParserOnStatusCallback_harness.c": "27265146a3e9f4b04fdabb9ddbaf318be9cba29a6837eb1eff3f92d5cb5e18bb", + "libraries/coreHTTP/test/cbmc/proofs/run-cbmc-proofs.py": "b37b71fb8ccf4b101ea1ffc65107c857f45fa6e228f1eb9e2041c017efd3319c", + "libraries/coreHTTP/test/cbmc/sources/http_cbmc_state.c": "5976b1b97529b152920b07cbd54e1150b42dde2d60d9ab283d17df128447c180", + "libraries/coreHTTP/test/cbmc/stubs/HTTPClient_ReadHeader_http_parser_execute.c": "a187ba00dfce7b639facc486d860503ab16baa0884a6bf319134a5796375edfb", + "libraries/coreHTTP/test/cbmc/stubs/HTTPClient_Send_http_parser_execute.c": "cf0adf0fc770b930e8b013cae520a80ec2b58a6a72c750850dd09a884d1b4dd7", + "libraries/coreHTTP/test/cbmc/stubs/callback_stubs.c": "3f4c2000d9cdbaea78ac144f005a78fb3318c43cf6de9d9a0d0dee203f2bdb2e", + "libraries/coreHTTP/test/cbmc/stubs/get_time_stub.c": "75d4dd4dc34b7f645133e6765a6c41cb1ada919128ec8c14a12a3e5f09b65c6a", + "libraries/coreHTTP/test/cbmc/stubs/httpHeaderStrncpy.c": "42e222346153400ba3f935b36a17cb88889434c1c07251da7963919461bceb26", + "libraries/coreHTTP/test/cbmc/stubs/memmove.c": "da8696b26e831c2d1ee285987adddf39f85feca80fbaf8e822fb6688047d0863", + "libraries/coreHTTP/test/cbmc/stubs/strncpy.c": "6095eab84fadb00b560d0886e1b2830beba0a85bb099b39a62092f0f1f19d9e8", + "libraries/coreHTTP/test/cbmc/stubs/transport_interface_stubs.c": "9cbaf9f59346814225ca51b016a1d70ff66667a0991b43e3ee2a152728f40325", + "libraries/coreHTTP/test/http_parser_build.cmake": "06b97e8eeda41b3ae20a4b8e3736813a776221810ff70f50a7decebd7de19b34", + "libraries/coreHTTP/test/unit-test/CMakeLists.txt": "b6641669155f8981bd14c6d198ef624ae59ef84787e069ec1c1bebc8e08b9556", + "libraries/coreHTTP/test/unit-test/cmock_build.cmake": "d73f758fdc599d6abcd447dbbd05331a14615eeb631b22cf5101b8a3d4eeebc2", + "libraries/coreHTTP/test/unit-test/core_http_config.h": "10e9626505ebfbdfd001e13f5975891054276d7a9b0f2998dbf3cef86f87ca31", + "libraries/coreHTTP/test/unit-test/core_http_send_utest.c": "0b9465e902d2f9df9d4fafdbcc25ea4b0e0b9c131c2a9d9939a33f2b7c912ca4", + "libraries/coreHTTP/test/unit-test/core_http_utest.c": "3ed2578a9b82c16694e97f75e4ec0f316c9215c6122f37b1837ac9862e41495a", + "libraries/coreHTTP/tools/cmock/coverage.cmake": "8ac1ac5e6d5628fc8625d57f74249f15f53eba61f8338813d36d3dfa9dc1cf9b", + "libraries/coreHTTP/tools/cmock/create_test.cmake": "41dc66ba43772ccbcc59871e16ebc60b8671875e0e59d9068313be0aac1f25b2", + "libraries/coreHTTP/tools/cmock/project.yml": "805074ab6dcf01b29aac19ab1964b70227d0f7013b5b755dbf5c17ae66e6a0d6", + "libraries/coreHTTP/tools/uncrustify.cfg": "55c02144fdaa3d62e03ed97e3e89a54b67d9433a5320ec02ec82e75344b21656", + "libraries/coreJSON/CHANGELOG.md": "6c16b6db078b49a243b6e7c05492afa6c131ef36aa809ba5acb582ce0d6c9332", + "libraries/coreJSON/LICENSE": "508a77d2e7b51d98adeed32648ad124b7b30241a8e70b2e72c99f92d8e5874d1", + "libraries/coreJSON/MISRA.md": "616fc5ab84e4b5dbe75b1e4b7aff3a6dbb187c73c1943a00b78a4683cb64dd7e", + "libraries/coreJSON/README.md": "8bc7734322acc3f827838e4d3ff6370e81f2f890adec3a68f4ea91162e148116", + "libraries/coreJSON/SECURITY.md": "ff53e3502bc39dac4a7074fe790f663c56d6c7aacd5b66dc648049f685e1e44b", + "libraries/coreJSON/docs/doxygen/config.doxyfile": "0e7200549685238cf88c89bb3d7c9b4491aed7ff538f18fe49aae1dd2083eadb", + "libraries/coreJSON/docs/doxygen/layout.xml": "555a70789f54c525456ad9d30730614fe7119afb8b81dd8f8067af28dd14f66c", + "libraries/coreJSON/docs/doxygen/pages.dox": "8e6306c157d181618a06030628c953ce198c5880cfb8ca27b42e4bb32d898eb7", + "libraries/coreJSON/docs/doxygen/style.css": "e3d3b4438744aa4d547bcacc6e64f3fcfc5057b476c5237e5107e6bbe0aac72a", + "libraries/coreJSON/jsonFilePaths.cmake": "f32f3a92f044c43d37eeb359f23efbdbd428ff643b1778c5381d1fbdc353cf1f", + "libraries/coreJSON/lexicon.txt": "d44dce8b866dfee032b593d562428e366777d9675c8cbe551de3ff8a6cd928e3", + "libraries/coreJSON/manifest.yml": "55e82e0f8afc5317954eaa807de33060fc377bbb573618ddee825a45d1474ea8", + "libraries/coreJSON/source/core_json.c": "4409f01c1feca9a152669abcfeca27bb276755931d2aee84ccc62ef4c2a2d1e1", + "libraries/coreJSON/source/include/core_json.h": "95f1741edb7039ba101d444a3efdcda46157a1792eafbbb4c47023427fd28966", + "libraries/coreJSON/source/include/stdbool.readme": "3b5fea454a7ffd75a0dc1a752e10ab00f56e9f07141a7a1cd420b0ba3a979090", + "libraries/coreJSON/source/include/stdint.readme": "dd6b448c2e42251785a058360c728511a87282f159819b274ae1a976172ee586", + "libraries/coreJSON/test/CMakeLists.txt": "f22296561886d698c1672c2d5df2e94c34363b8a40d42985fc71abc5640ddcc6", + "libraries/coreJSON/test/cbmc/include/core_json_annex.h": "8e10b277e200d09ac3e14460102933c5d35471f2ee5383a1388919ad857f1912", + "libraries/coreJSON/test/cbmc/include/skipGeneric.h": "71b471afc11837c9fc7e452f383fe5419b8ece257a90ce2ed4e7d92705ab090c", + "libraries/coreJSON/test/cbmc/proofs/JSON_Iterate/JSON_Iterate_harness.c": "db28221f3ccfb5c4203183ed29108f00b83227805cf2682f8a7c2f051fb069c3", + "libraries/coreJSON/test/cbmc/proofs/JSON_Iterate/Makefile": "77738d5901c8915025ef1729f85cb7369ddb6acc7e9a969b54b2f23f7e7f258c", + "libraries/coreJSON/test/cbmc/proofs/JSON_Iterate/README.md": "7bd5e4d69a5b4548ca6810f69fa07186c2e26b44af20b6abdb38266a9d5566ad", + "libraries/coreJSON/test/cbmc/proofs/JSON_Iterate/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreJSON/test/cbmc/proofs/JSON_Iterate/cbmc-viewer.json": "39a8e80bc7a1eb7eaf0bcf0bfdfcdcfec81ef0b5072eb7679bb39df71b3f16bf", + "libraries/coreJSON/test/cbmc/proofs/JSON_Search/JSON_Search_harness.c": "17ca937e25e1b97cb0df5316f35d39fa73faa050cf503ba819eee5b2ef1bca4b", + "libraries/coreJSON/test/cbmc/proofs/JSON_Search/Makefile": "73b7bc81d143a9482379dab0a83a9e3f0afc83fd8bc8b4440a5b9e7892df69b6", + "libraries/coreJSON/test/cbmc/proofs/JSON_Search/README.md": "a965351dc787454d41311dff7736ff7362d36b45a6dbbc9ff7151342a3e43104", + "libraries/coreJSON/test/cbmc/proofs/JSON_Search/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreJSON/test/cbmc/proofs/JSON_Search/cbmc-viewer.json": "6da77d4bf12527d3e501027861e38907084f4d23c6ce122d4da4d94dcd33a5a3", + "libraries/coreJSON/test/cbmc/proofs/JSON_Validate/JSON_Validate_harness.c": "90986194c3e783cdaf2faea14d3d6c9a4a993c1970bc23d199553e27a5a6a355", + "libraries/coreJSON/test/cbmc/proofs/JSON_Validate/Makefile": "517644e63575deaf71c485a6383000b9e948f0dc3148ac746c4ccfbac45643fe", + "libraries/coreJSON/test/cbmc/proofs/JSON_Validate/README.md": "b59f599efc875baf43bec04bbf8b8128035d4029384eef85e791220652556a6e", + "libraries/coreJSON/test/cbmc/proofs/JSON_Validate/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreJSON/test/cbmc/proofs/JSON_Validate/cbmc-viewer.json": "2d3aff70830a307ffd0ea58660969c781f4cec87116de38cc6f39b97ae7aef0e", + "libraries/coreJSON/test/cbmc/proofs/Makefile": "42af9f1f05522517bfbddbf31e44fc8cb2356f1bb0ad8d40bc6d9f317c046e95", + "libraries/coreJSON/test/cbmc/proofs/Makefile-json.common": "9638337492da33c3892e0b27c238666a44bd14adda49b30a2ff92b632b45387f", + "libraries/coreJSON/test/cbmc/proofs/Makefile-project-defines": "fd69da4e6c6df9b44d9dd5808117deb730a4cc7407a96f84ee7097fc5bbf3b30", + "libraries/coreJSON/test/cbmc/proofs/Makefile-project-targets": "cf0f30169e817afc81cc8d161d4bcc336f369392db04b81c43570fffdb57ca6c", + "libraries/coreJSON/test/cbmc/proofs/Makefile-project-testing": "acb51f25870892f177057e7f56e73979e0eeb4967e3280aa160fd33a1a7bb03f", + "libraries/coreJSON/test/cbmc/proofs/Makefile-template-defines": "50b3687413c3a9a1e42a62954b1007e270fadbfda068fcb8e796b1862563507f", + "libraries/coreJSON/test/cbmc/proofs/README.md": "142dc28dad300138bed3a174bdb7ce714f1c6a882299440e63552e2bebd2f7d0", + "libraries/coreJSON/test/cbmc/proofs/run-cbmc-proofs.py": "b37b71fb8ccf4b101ea1ffc65107c857f45fa6e228f1eb9e2041c017efd3319c", + "libraries/coreJSON/test/cbmc/proofs/skipAnyLiteral/Makefile": "bfd696dd9aaf2ce7b0c486c3dae2e181438e83727c76dd1cf34559293bc2e0d8", + "libraries/coreJSON/test/cbmc/proofs/skipAnyLiteral/README.md": "7df172f374b3f15a458a9fa766ba5e79687549f2dcf501d8d7de9aa5290efc2f", + "libraries/coreJSON/test/cbmc/proofs/skipAnyLiteral/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreJSON/test/cbmc/proofs/skipAnyLiteral/cbmc-viewer.json": "fae6047e1eed0cf84842c64e6fb697d295bb4cb3b4c09b8314c306c3fc6462ae", + "libraries/coreJSON/test/cbmc/proofs/skipAnyLiteral/skipAnyLiteral_harness.c": "f16bbd9c20c9b63e165907f1a9a1f93a2aac02c9efbeeac9f00c9d6fc7882545", + "libraries/coreJSON/test/cbmc/proofs/skipCollection/Makefile": "0349bae0eadee7229072a5bdeda767e0d85ea4dd56f1829890c7957ea283e0e8", + "libraries/coreJSON/test/cbmc/proofs/skipCollection/README.md": "4314646b3917f891cfb5ca83b7862bb9412434bc7b156f8337dd6deaf4b4751f", + "libraries/coreJSON/test/cbmc/proofs/skipCollection/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreJSON/test/cbmc/proofs/skipCollection/cbmc-viewer.json": "be80ad3ea1285e22419058ed98c05d8159994755fa4c6bafb015d5d63f065128", + "libraries/coreJSON/test/cbmc/proofs/skipCollection/skipCollection_harness.c": "f2140b46a6f776d3995b3393b8b82c3a8adfc3d02beffcaf060e196a0670fb3a", + "libraries/coreJSON/test/cbmc/proofs/skipEscape/Makefile": "2c355113aec48c5d4c4dbdc16fef7601c174011b61920e1047e6c55487d147da", + "libraries/coreJSON/test/cbmc/proofs/skipEscape/README.md": "3e5425772da09445abb5d976a789941ea1233744a717887165efb7a89f87ba2f", + "libraries/coreJSON/test/cbmc/proofs/skipEscape/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreJSON/test/cbmc/proofs/skipEscape/cbmc-viewer.json": "6318ff51b7058066c99a87b99194b1d65d4a33d77a83da3dc4fad6327778b29f", + "libraries/coreJSON/test/cbmc/proofs/skipEscape/skipEscape_harness.c": "2a1a83bcbf3e2c766d71a3031b1ce519342b014456222692b3ed091740cd034a", + "libraries/coreJSON/test/cbmc/proofs/skipNumber/Makefile": "20ffa32b03006ec004d968f3984567be678ce81b8a4ae85c250f8a3630c12666", + "libraries/coreJSON/test/cbmc/proofs/skipNumber/README.md": "0d4f0d613efe747e39bac8874b639129b74f164fcb017cc8aa1acae9e0da8b0e", + "libraries/coreJSON/test/cbmc/proofs/skipNumber/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreJSON/test/cbmc/proofs/skipNumber/cbmc-viewer.json": "13bd089ecb4de1a6edca24af3bb2d2dbf124681e71a50539bda9cb85c502b16f", + "libraries/coreJSON/test/cbmc/proofs/skipNumber/skipNumber_harness.c": "cd1a8ca3bbfda7297460a88f10514686e80cee27e9f2fa596bb8005226018fa0", + "libraries/coreJSON/test/cbmc/proofs/skipSpace/Makefile": "825e917450aeaf3536995a43b84e6b846191ff976e7e3b789f8cbde804d8e319", + "libraries/coreJSON/test/cbmc/proofs/skipSpace/README.md": "620573816baea73974121fb4415ad4dfca463a38e925152aa3d4e2b04a53d122", + "libraries/coreJSON/test/cbmc/proofs/skipSpace/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreJSON/test/cbmc/proofs/skipSpace/cbmc-viewer.json": "3a3db6ce8ebe463f90a95bb9b984bb9c8c0a8c346dfe3fd9f1e736e12bac8782", + "libraries/coreJSON/test/cbmc/proofs/skipSpace/skipSpace_harness.c": "1334799a73aef3cd60a934f1d65d10be36a2200a2225f0ac80d0e9c0dab31188", + "libraries/coreJSON/test/cbmc/proofs/skipSpaceAndComma/Makefile": "8759e841c7a053a9117758370b768561e85baa72919bff3ed6aed65178cf8658", + "libraries/coreJSON/test/cbmc/proofs/skipSpaceAndComma/README.md": "acbbf3b27c2f02885f9b5c92f47208f335fb54eb4f730a7b73dad404e7c6305d", + "libraries/coreJSON/test/cbmc/proofs/skipSpaceAndComma/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreJSON/test/cbmc/proofs/skipSpaceAndComma/cbmc-viewer.json": "1de624ce0d5cdfb47f4e60861fad02c9ecad2cb1d825cc4ff7cbe438f32ee2ec", + "libraries/coreJSON/test/cbmc/proofs/skipSpaceAndComma/skipSpaceAndComma_harness.c": "3e8eadf67d70396fe80dbd288c6ee598db34696b47be92270f455aa9ba435e70", + "libraries/coreJSON/test/cbmc/proofs/skipString/Makefile": "84a027e8b6ab7744bba40d2889dfb218bfc45f3d18aa91595e09557d3d1a24b1", + "libraries/coreJSON/test/cbmc/proofs/skipString/README.md": "1bc095eaac3f4f5945a7dac68dc5baf969dc18a4dee99423da6bbdf779a9387c", + "libraries/coreJSON/test/cbmc/proofs/skipString/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreJSON/test/cbmc/proofs/skipString/cbmc-viewer.json": "2ca367bb82a31b0e2758e773bc28b7360cd54917696fa019b35a1ed401228cbe", + "libraries/coreJSON/test/cbmc/proofs/skipString/skipString_harness.c": "348a4b1637233ff4c1d9989673e39c4757026dd7d5a219ba40c64f334c111438", + "libraries/coreJSON/test/cbmc/proofs/skipUTF8/Makefile": "4fbbea93626213a1782113d1bebb7ed521c03443bccfe0b79f64a1f6552faa96", + "libraries/coreJSON/test/cbmc/proofs/skipUTF8/README.md": "d0224f808e488f9c5d257bf40d465bcef9934b5de5d5cc91a40395d888dd109c", + "libraries/coreJSON/test/cbmc/proofs/skipUTF8/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreJSON/test/cbmc/proofs/skipUTF8/cbmc-viewer.json": "e6c1725d654647bc7bfb06be02406424b554104b42f739f6d3339e99106ecd65", + "libraries/coreJSON/test/cbmc/proofs/skipUTF8/skipUTF8_harness.c": "eb9276e6f0e56624701aaec6fe5108e7bde05250b620150f019b99a922bc585e", + "libraries/coreJSON/test/cbmc/stubs/skipAnyLiteral.c": "2c8257603a3f02cc950a41eeec30befd5e68c4e16c92d525d4fc0039dde7cc9e", + "libraries/coreJSON/test/cbmc/stubs/skipAnyScalar.c": "b2e94f963d6353dbf3fdb922d6540a4296ad8b77b4d5bc0371dc46c50fdf1f35", + "libraries/coreJSON/test/cbmc/stubs/skipCollection.c": "e237c37e15efe9b998f01fe7dfcb948113a25d55e9b223822d8c23d70af2bc94", + "libraries/coreJSON/test/cbmc/stubs/skipDigits.c": "1310376156b8f04b4441d15bd8227fec6297e436ffca521d8179067a2b7a326f", + "libraries/coreJSON/test/cbmc/stubs/skipEscape.c": "e1c4eff844a08977d712e4b65941524d3be2eb2982dc41f4f475a3b0027fb113", + "libraries/coreJSON/test/cbmc/stubs/skipGeneric.c": "aa1fbd55b2b4c5eda9f27e87131d873ce0c59529c55cf02a41fe53c756503477", + "libraries/coreJSON/test/cbmc/stubs/skipNumber.c": "411c5f259588b734347384e88fff8a6b1588b9f3f31d6dc1376e25d073419ea2", + "libraries/coreJSON/test/cbmc/stubs/skipSpace.c": "444944024e58480e7f7ef141eca39e93ace17af35703e206b3081568ef1551df", + "libraries/coreJSON/test/cbmc/stubs/skipSpaceAndComma.c": "acacb7367c1da82480f28cf6b0a99dd956c44b866fd5c57f3ab37d43880e138f", + "libraries/coreJSON/test/cbmc/stubs/skipString.c": "be94a80872309695fc9f485f3a3ed7099120df47ebb5e623536dc50e87e634e5", + "libraries/coreJSON/test/cbmc/stubs/skipUTF8.c": "0ed0934046be2c98e5ad719dc421625c803c39c1c28f6d870f448330e2dabe37", + "libraries/coreJSON/test/unit-test/CMakeLists.txt": "bb0a488a774d045b9d69078094ab50389b5e6b881cca16b967c69f198206ca5a", + "libraries/coreJSON/test/unit-test/catch_assert.h": "de1bfd864b4f994720f3393a4c735b13091270fa22b263d9af1f35a0dc80ce83", + "libraries/coreJSON/test/unit-test/core_json_utest.c": "dd94bd234a092c614737bcf02fe3470a813c5eb679c9a8022318c90e590ed327", + "libraries/coreJSON/test/unit-test/unity_build.cmake": "0bd532c05dac6876647508256c5c50ff87b2c2017ab9e3cb866cf0722edc1ddc", + "libraries/coreJSON/tools/coverity/misra.config": "d7d37fb4773c548cd823d55ac8278cb9b4d89eb49d0e12c9fbf7132a92011497", + "libraries/coreJSON/tools/uncrustify.cfg": "55c02144fdaa3d62e03ed97e3e89a54b67d9433a5320ec02ec82e75344b21656", + "libraries/coreJSON/tools/unity/coverage.cmake": "44684d66e5193f6c54e47c677c1efd3251f4e83c9893e336918dd90e72c922bd", + "libraries/coreJSON/tools/unity/create_test.cmake": "086650d12714429c4130c386417e1aef985421f26c4c82a209ac0d40f71c1cd2", + "libraries/coreJSON/tools/unity/project.yml": "12130e50fcf569eaee1c82ebf43c3accfdc599b0f42064ea6819a49f2089eb2f", + "libraries/coreMQTT/CHANGELOG.md": "49d7f63bb13580ed2bf5b05c0eccad0c4567dcc1a51b25d30a4c168d04a21e6a", + "libraries/coreMQTT/LICENSE": "508a77d2e7b51d98adeed32648ad124b7b30241a8e70b2e72c99f92d8e5874d1", + "libraries/coreMQTT/MISRA.md": "ee3dafb6f0d1bbaf8d4601246438cca6cf02f1b654a69f04e68b8000f9dc21aa", + "libraries/coreMQTT/README.md": "8c9218904c05da8616265222a4b148891b618f181b07335d528e4fb7703afa2e", + "libraries/coreMQTT/SECURITY.md": "ff53e3502bc39dac4a7074fe790f663c56d6c7aacd5b66dc648049f685e1e44b", + "libraries/coreMQTT/docs/doxygen/config.doxyfile": "ac9356a3d6e9f8c1912428917ef655d8ae37f65ce2d667a482cc303c8bcc901c", + "libraries/coreMQTT/docs/doxygen/layout.xml": "555a70789f54c525456ad9d30730614fe7119afb8b81dd8f8067af28dd14f66c", + "libraries/coreMQTT/docs/doxygen/pages.dox": "6910668751f7d400b48c10f550d7d11dc970c1481f7e51f29b8487543e8183cd", + "libraries/coreMQTT/docs/doxygen/porting.dox": "1edb176f2260e8a6d3115286218f5791e664a48f2a939e8e03e9c784cbb42491", + "libraries/coreMQTT/docs/doxygen/style.css": "e3d3b4438744aa4d547bcacc6e64f3fcfc5057b476c5237e5107e6bbe0aac72a", + "libraries/coreMQTT/docs/doxygen/timeouts.dox": "97f415c2452a83eea9da9b42871eccb775ecf6de1774fe08efbea017654fcbf2", + "libraries/coreMQTT/docs/plantuml/images/mqtt_connect_design.png": "21b94da4fcf887e92a6b69792e0438a2606e084670106bda53ede60d77915b92", + "libraries/coreMQTT/docs/plantuml/images/mqtt_processloop_design.png": "e840f26ce3e411d3eedae32073a9506b000f44b4b328df68d6c854fc423a3e43", + "libraries/coreMQTT/docs/plantuml/images/mqtt_receiveloop_design.png": "cecf49d04c44aee8f69ae2ea5c842db85973e43aba2fd7c3da04da6768931b02", + "libraries/coreMQTT/docs/plantuml/mqtt_connect_design.pu": "58d747147b1bc68565dfb0d64c0f13a3134778465209f3c320232641a915a999", + "libraries/coreMQTT/docs/plantuml/mqtt_processloop_design.pu": "3682c146c15953956cbaf2121c35aac02a4706dcc953841c15c7b0635cdaec42", + "libraries/coreMQTT/docs/plantuml/mqtt_receiveloop_design.pu": "5d271bfa63049501d47af872eb96d0aad770fdb478ab58876ebadcc7b46dd733", + "libraries/coreMQTT/lexicon.txt": "3e046645b31b19abf97a1bd3c773cf7fe7bc83675b0fb9adae36d9e2482e1bc4", + "libraries/coreMQTT/manifest.yml": "2ce5195f565c3641b1312f5d3e8df9f7a01ff64d150937d5d8f83a9a20811fab", + "libraries/coreMQTT/mqttFilePaths.cmake": "40ee4b2022a23805a8bd4902404e6c3fe32a6ba0981d9ca7d2ac8521859c8d11", + "libraries/coreMQTT/source/core_mqtt.c": "6c0a5e4d4ba5839e7a12795c697f4479378e5b09e37b44e523cb2d530768fbcb", + "libraries/coreMQTT/source/core_mqtt_serializer.c": "4faa4373c6aea6df5916c95d83dac6d19cec747e9f16fd0b8b4a1798c7d8c2c8", + "libraries/coreMQTT/source/core_mqtt_state.c": "28ed4662c0da23388edcb3145267bdc733c9788bed334da888dd017272035b50", + "libraries/coreMQTT/source/include/core_mqtt.h": "04697ef71fb5aba3aed70460a260c1f8bb517d75af01086a1c8473b5ccf7654d", + "libraries/coreMQTT/source/include/core_mqtt_config_defaults.h": "adacf4f60c2ab66145fdac5a75067c19352852ce9f765798e3cc514eb513b3f8", + "libraries/coreMQTT/source/include/core_mqtt_serializer.h": "b86db6fc3512b0754b67c67799b8525e9d9e6dadbd5c29383c8184d2edc2a7d5", + "libraries/coreMQTT/source/include/core_mqtt_state.h": "672fe2662b779ba98af0bb72433f1632d50283ab4249b876a5084f4e44528fbb", + "libraries/coreMQTT/source/include/stdbool.readme": "3b5fea454a7ffd75a0dc1a752e10ab00f56e9f07141a7a1cd420b0ba3a979090", + "libraries/coreMQTT/source/include/stdint.readme": "dd6b448c2e42251785a058360c728511a87282f159819b274ae1a976172ee586", + "libraries/coreMQTT/source/interface/transport_interface.h": "d27ac8f149eac5b58abd42e0188c077d8ec7b45105f169c9d2096b07d2238e17", + "libraries/coreMQTT/test/CMakeLists.txt": "329fe5c02c29d0daf12236504e13097296b3f10c695fbb710590270ac3fcbb68", + "libraries/coreMQTT/test/cbmc/include/core_mqtt_config.h": "7d038ddb76ef1832e36ab4319842eed1ae3ea3ca450a1ac48b0f388e538abaf1", + "libraries/coreMQTT/test/cbmc/include/event_callback_stub.h": "951bdae29cdc1208aa5bd10aa7db6f99dfe1d753a049420b785fc52217ca0022", + "libraries/coreMQTT/test/cbmc/include/get_time_stub.h": "07697c0a13aa0c4b49f9a8b9705b9e3dc9374415a698f5d66db9539220aa05c1", + "libraries/coreMQTT/test/cbmc/include/mqtt_cbmc_state.h": "f09667ff341dd6493f0f4c38122d79ee6d18fa7af57f777f6d917a3775efbef6", + "libraries/coreMQTT/test/cbmc/include/network_interface_stubs.h": "746a84a45e40942332f2b161a9c97c0d71a7edeeb256415d341d18e1e8c02d9d", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Connect/MQTT_Connect_harness.c": "be9800c64b76dc0784609d81fd1684ff2578cb85b28d6ce8082244d4d334a4cd", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Connect/Makefile": "6959705bb0326af295a198cd0be0b49500eec5c7a5c33b309db9a31fca012cc4", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Connect/README.md": "56ef61cf1649982459e19664c8388fe891ac22cd9ace86d02e9dc19cc237fb58", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Connect/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Connect/cbmc-viewer.json": "cab584fd42fc0f278ce71342de8d61eaf2d76a29fabb4d20e47bfc23222a28e1", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializeAck/MQTT_DeserializeAck_harness.c": "daffd649c3db90885a6c20a7a4adcab7faf053877970226597ac8b557eb52616", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializeAck/Makefile": "19b8901b34714c2f43dea31f92c8d3d92ebe2bbd3cfc64ddbb8662fb0425255d", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializeAck/README.md": "7a7d6c9942e7f500d437c5a719f1a34058e359765400dcee5c92f863f4b5a571", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializeAck/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializeAck/cbmc-viewer.json": "64303ecfdb4e576970e009599853582974cf2f127e55ec4b8abd022806edad84", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializePublish/MQTT_DeserializePublish_harness.c": "9a064fa4c62d5bdf8626b182ca9a9826387cd1b1985d68cfc7c727c32bd2e462", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializePublish/Makefile": "0898d4140cac0be565d0f9d2383efb29956864f55ef17e04151ba09269426815", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializePublish/README.md": "75cf3eaace92611b83a309ed9dfd488dda51b8f4f4917ba4c502352bb46ce144", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializePublish/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_DeserializePublish/cbmc-viewer.json": "47e712b26c107b25f7aca63d3b947acf9f056f28bf3a9bea108a591b237cbeed", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Disconnect/MQTT_Disconnect_harness.c": "91c676b8f5cb2af3e13beb2cfc583b6946532b6801586eb69a5a32376366e8d0", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Disconnect/Makefile": "a10513d306d332c8883687913b5d8d1b4fc24c1f550688031455f03be482f3c6", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Disconnect/README.md": "ec8d0fd2765e652ae921480aed0fb834ca7aaeb29732be426c57d1869c310454", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Disconnect/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Disconnect/cbmc-viewer.json": "bf4978a78d0061026ae9f78c03ccae0ee1e6cdcfb39b7350d2aefe68cbd9ac98", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetIncomingPacketTypeAndLength/MQTT_GetIncomingPacketTypeAndLength_harness.c": "2978682557a07eaaeb626a0762d98f69acd6a1a6e59b2a52a6953a2918dda9a9", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetIncomingPacketTypeAndLength/Makefile": "4423c7597e296f08c0f7cb9de52d945377563ec3e2f02249fcf6d903648dbc9a", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetIncomingPacketTypeAndLength/README.md": "3f5540f0a13298b8f90721fcfe9ba561cda091cdd6797c2c3f8b85b57b0812f2", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetIncomingPacketTypeAndLength/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetIncomingPacketTypeAndLength/cbmc-viewer.json": "97a42a4e5454069192e8d0e654a6805782c587af560b08f17a095682d8d1cd85", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetPacketId/MQTT_GetPacketId_harness.c": "f05cc76482ded94f0292c7a6952b2d8338cd4f8456a9a52ae4cb715e1c4b29c6", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetPacketId/Makefile": "1ab9da1dacd1a33713a2e2f6848d97252fcc47fb9489633c763a41761af1b025", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetPacketId/README.md": "173028ffc86135f832c5b763987f0cd623b1949d46f94afe6f24ae27578a7a8d", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetPacketId/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetPacketId/cbmc-viewer.json": "ee5d6d6e29ec44fbcf95ba512a32fee52b5b333b6fcf432dc57b8d60f64840a1", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetSubAckStatusCodes/MQTT_GetSubAckStatusCodes_harness.c": "5d1c305b05b7d2fbba9e852e474037b2d73ad899b606b7c313352b5d1c123762", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetSubAckStatusCodes/Makefile": "fb43e3ef5da978ba636b9b8c94984988fe5ebdf417608cbee901d95135f6b658", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetSubAckStatusCodes/README.md": "2d74b1a9895f27194a11a08d5e2690145ea717267365446f93d676865b4338f9", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetSubAckStatusCodes/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_GetSubAckStatusCodes/cbmc-viewer.json": "6abd54df401cf3bf8ae26e1515e34e0bf794565d5666b1d8f0c411ae61156157", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Init/MQTT_Init_harness.c": "98839810e0d4a42b09971d19e347392fe1b791dd04c2d970697b2414bcb35658", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Init/Makefile": "55515078de553566bf63b2df808b6e2a3b2fe6edd48069f3d28ecc0d8c79b7a8", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Init/README.md": "ca6a087edcbeb2cd36cee08b509952e2fbaafdaacf5cfeb12016b327dd67d220", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Init/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Init/cbmc-viewer.json": "72a69eeacc6efe57b089a25f951a7427b1985d439812512c92e284c0279add2e", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_MatchTopic/MQTT_MatchTopic_harness.c": "c78a1f546c283257715ad76f852cd0121d9b43a74cbc340bc5499d19c4e416a2", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_MatchTopic/Makefile": "6a167927fee24f423215499a6f810050b54ff0ba96d0ff50f951a8a01f7273a3", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_MatchTopic/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_MatchTopic/cbmc-viewer.json": "b69a5577a7b673b1c40b34949efac35ec6271451079862825401b3d2a128d789", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Ping/MQTT_Ping_harness.c": "a169d202e2a5d044b09e5bbbce43e80301dc905060e65ae37e71bacc24d3b08e", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Ping/Makefile": "3a84d9afa0cc8ef70f6f4de03f2ccef17eb808c8d929793642e7aef5bd166ca1", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Ping/README.md": "0a93c1b497a1c52a6121e92c071d6e4bb9e168b17555ed1f9c0f6d9053a9b113", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Ping/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Ping/cbmc-viewer.json": "f6c242754a1c117221b01a11f7cdbd0e6438eeeb520a6a0a842e85b6f6f07ef4", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_ProcessLoop/MQTT_ProcessLoop_harness.c": "29266ae4e25362f6436e7babdb28e3cd3d96378d3f9bb6a221a40a478df5b594", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_ProcessLoop/Makefile": "c4e52318c2f01432d065125bed93c4cba029c74e3440be88720cbb0be983af06", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_ProcessLoop/README.md": "241f1632dac11c88647d93a537e843febe8aa7cdef51a2eb8f222c2ef54d9f14", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_ProcessLoop/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_ProcessLoop/cbmc-viewer.json": "79aec48e68b39c6e4d339247d55b72186f0d8f3ed8baa54d7005899a09f8ec98", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Publish/MQTT_Publish_harness.c": "d8d65143846387fb46609ba72a2a81f0d244e5bba3d9cbc09dfee53b2a09cb69", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Publish/Makefile": "879840e755a86e9e5b8e75297cd0944e6851c0c0f3b1e7cdb43dbfe53f85b1a3", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Publish/README.md": "020fe4a980704d4ca277ba5f3177131cd4ca17cf8cb50932fc77239270f090f8", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Publish/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Publish/cbmc-viewer.json": "9b69f8a19dac6acdeee2eddfe653599008df1502df115c7ed861d8920ee8a745", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_ReceiveLoop/MQTT_ReceiveLoop_harness.c": "20b941a2e744a9e68d7007deb0c2bef4ed7e091584ead456c01c33f3d5961b95", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_ReceiveLoop/Makefile": "4eb62efbcfcc94b55059c144a0040580b58a131af3fc09a73bc976b82f2bb803", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_ReceiveLoop/README.md": "e374941c2cfb38a528b50eb6ce77b8642feb4d471c283290ef5bf893e6f6f6be", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_ReceiveLoop/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_ReceiveLoop/cbmc-viewer.json": "8dae172cd3cf76f4857621a32a943815dbc64b767be0dcbdc6f236c1ce73d87a", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeAck/MQTT_SerializeAck_harness.c": "7aa97a4a46b2b940a307488cbec759fa571b8710ff96a9a5daae9691faed70bc", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeAck/Makefile": "404d6903622abbee1a5de868d65dc96aa702994899139f91db4825f4226f30c9", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeAck/README.md": "5e6fc8595d1fa6e42e46f89b1c82a699f42776068ef8842d3028b3b5cd930208", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeAck/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeAck/cbmc-viewer.json": "97acbe10b64118abc2c50a2ce9b6d41d20c9636e8eea4eb1f690965e338f3dca", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeConnect/MQTT_SerializeConnect_harness.c": "3d7fe5c51152f11c97319a45d7e71155441cd442646e8fb1952831cddb84000c", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeConnect/Makefile": "be52f16379b711c424bc9630d52005c3944c5a40a85847c33daaa22282e33656", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeConnect/README.md": "8176a747d19bd17bbc0e318858ba82c9ed1e35007766e79d294ca26e4772bc0a", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeConnect/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeConnect/cbmc-viewer.json": "46d696d30594fe3ad0320f9b3fed7948ec877c87df95f6b48aa92dfccf29f5cf", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeDisconnect/MQTT_SerializeDisconnect_harness.c": "292fc840ddb7a4fd35a780bbe954b3ec6e564873699b3f07be13ed9ec9d20bd0", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeDisconnect/Makefile": "1b390c0119f425bcfc4eab47e1e89e8dff524892eeeb4b22dc14eb0d3e899e4f", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeDisconnect/README.md": "6cfa4a964cbebddb3273f54787c4fd387517cb7dfa41ad52db1b0d4c831b6a42", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeDisconnect/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeDisconnect/cbmc-viewer.json": "38376b24ad94f9802301d5a2d15aab04cbc83b464756ec8fa6b82090b5f64df8", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePingreq/MQTT_SerializePingreq_harness.c": "91db5058dfaac2c468313a056298cf24f88c5bab371ead3d1f261143a6979eb2", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePingreq/Makefile": "94f1c85d775e5a90888d9d50ce36c4c701c25c26d110470765fc0a0dc965a33d", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePingreq/README.md": "d6a9f488491dbe597490c3b5534bc230e43f468f7198bc785223303dd55b14ba", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePingreq/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePingreq/cbmc-viewer.json": "eb118ca44d049c8bb9872e3d73601a3643c7fbb4e7939f078be32a6f89d22c52", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublish/MQTT_SerializePublish_harness.c": "068a4de1e7b1e4fea5ba1de2be464c9b7d326b667563bbcee3c8340380f5945a", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublish/Makefile": "60798ba1e5074e3e3eba28bb25106304799fee5744760db24274a48648b849c5", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublish/README.md": "2b7bd481ec1b8ec86339cc9489108660d9565014fe188c3675011fbf35418162", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublish/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublish/cbmc-viewer.json": "907873e23c42a57756a18e3e179ad347b7b70210297a0abea7322b1c2f47545d", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublishHeader/MQTT_SerializePublishHeader_harness.c": "eb5da6b5da5073ba82c858c09b8d5e498e8d43eaf4964a04417d2eb425188a3e", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublishHeader/Makefile": "59b6107ce9da982749fd594741776679a178cd0edf9ae01a37dd7083f6fd96db", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublishHeader/README.md": "bf530b289a27f153bfab861208c39235e68e6e6af7e139a64a60cea749609deb", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublishHeader/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializePublishHeader/cbmc-viewer.json": "80c29042213ab8cc35df703b910864447ffd197a30c8092a3f44afbc980e077d", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeSubscribe/MQTT_SerializeSubscribe_harness.c": "929ced9dd3645d3ecb113ee5d824de5a6db4e18b133782ac69f97da8aa2f6431", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeSubscribe/Makefile": "deedd106c13ce55b92cec98187e9fef8f204aa89dd267c3d75cd4b8593507ef3", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeSubscribe/README.md": "b604ae8cb53c551e05cc34995632bf589ffa4cb6ec423c2222445a3b5b67f8fc", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeSubscribe/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeSubscribe/cbmc-viewer.json": "b2250403fe8c62be92d03a4074d14389adb65c6011dd377024c132cf4b6ca846", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeUnsubscribe/MQTT_SerializeUnsubscribe_harness.c": "ec658613501f0ceaef076ffb43878edb3498698617d19f1314c372a511a773b7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeUnsubscribe/Makefile": "518841906dfbd49f5aacf7b6cc8d22a65497c9def47c2ecf2a7b0e3bc6205b5c", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeUnsubscribe/README.md": "d2a2e6132e9813e8115c8456f44d6a47ba0694c164ca5af7d623cc42bbf64cba", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeUnsubscribe/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_SerializeUnsubscribe/cbmc-viewer.json": "825c4d6438cc955585f8cc96d1e0db10dfa339b3b8e9affa649ba80290d14bdd", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Subscribe/MQTT_Subscribe_harness.c": "d57fb1f6bed8fff3b2c3da8e547ae686050c9a371d22eeb25c62f4eabacb32c3", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Subscribe/Makefile": "df44df207fb78c123d1f485f69525d94b229c22ed6a9ddc57cdb0893b3aef97a", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Subscribe/README.md": "3030e6395ffdb3ad5e06cb6c4eac7f547b4b449cbff149eca48d0457b16b4a3a", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Subscribe/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Subscribe/cbmc-viewer.json": "9bdd8ffaf8f974098a76bf0ffac325925ada3091a660b0350939762106e267c9", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Unsubscribe/MQTT_Unsubscribe_harness.c": "a316f631c751dd1b3e18c5d2b19813d6c620480186d68dbdadbb2907d86f8622", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Unsubscribe/Makefile": "d73c02ecab06c21886b82799b5229ccf81da83ab644da39a17d166fdaa1b051a", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Unsubscribe/README.md": "0cea32d7b5aa59d40f68bddb1d67adc4dcbf2f0f8f8a9d8ad4c138bcfbbd77b8", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Unsubscribe/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/coreMQTT/test/cbmc/proofs/MQTT_Unsubscribe/cbmc-viewer.json": "a0869989a2bc70187d7895dddb395904eca58cc2b412d6c623adaefb9be8c6e9", + "libraries/coreMQTT/test/cbmc/proofs/Makefile-project-defines": "76e22aea31f930b26133e16927dc45124186f68f2f4c698e297653966a598d75", + "libraries/coreMQTT/test/cbmc/proofs/Makefile-project-targets": "d8c3930590646a4a3b5f5ed446758bf2d8b27ffb742dee196efb816ae2f502f6", + "libraries/coreMQTT/test/cbmc/proofs/Makefile-project-testing": "acb51f25870892f177057e7f56e73979e0eeb4967e3280aa160fd33a1a7bb03f", + "libraries/coreMQTT/test/cbmc/proofs/Makefile-template-defines": "50b3687413c3a9a1e42a62954b1007e270fadbfda068fcb8e796b1862563507f", + "libraries/coreMQTT/test/cbmc/proofs/run-cbmc-proofs.py": "b37b71fb8ccf4b101ea1ffc65107c857f45fa6e228f1eb9e2041c017efd3319c", + "libraries/coreMQTT/test/cbmc/sources/mqtt_cbmc_state.c": "782b538a3c783615e9b072cc506d30a265375441770c5c22f9ab8135290883d4", + "libraries/coreMQTT/test/cbmc/stubs/event_callback_stub.c": "8619268ebdbc5a0cbd9ed4a28e0660f30d45e8c406479b0270d5af983cc37e1f", + "libraries/coreMQTT/test/cbmc/stubs/get_time_stub.c": "46ac238cb11460eb0fce516093c7b3e7f537d95bc078e150062afd67534caeda", + "libraries/coreMQTT/test/cbmc/stubs/memcpy.c": "2ab8fcbdfd5f5472065e27639359c856454d3fbf44b73ecff64e996dfbf62d1b", + "libraries/coreMQTT/test/cbmc/stubs/network_interface_stubs.c": "01691695af6bab490d673ba25326b125beca9f12514a6c032aead34231bd9532", + "libraries/coreMQTT/test/unit-test/CMakeLists.txt": "7351576c9d2bc47f30722196011400b0365104adbb7bdfbc21248d3ca6029c61", + "libraries/coreMQTT/test/unit-test/cmock_build.cmake": "d73f758fdc599d6abcd447dbbd05331a14615eeb631b22cf5101b8a3d4eeebc2", + "libraries/coreMQTT/test/unit-test/core_mqtt_config.h": "fcf66913884b745594c3cdb86b0836d5699049054b63e6f37a5cd0cad15fe020", + "libraries/coreMQTT/test/unit-test/core_mqtt_serializer_utest.c": "615c7e4ef4e7330b7c1a6aa36cb8a5d24de77aff4dbb60b865c1ec88c4aea5d9", + "libraries/coreMQTT/test/unit-test/core_mqtt_state_utest.c": "456d9936f992a5a5682a91a24626f7c85d9337167b583b44e3c53910e1e292ab", + "libraries/coreMQTT/test/unit-test/core_mqtt_utest.c": "aef9885f5b4c3b8217dc415bafaac8b61d792b461f6d705e229ca47e24e52216", + "libraries/coreMQTT/test/unit-test/logging/logging_levels.h": "7ec73b0fc2db9d927d62f5882bd98bf143dd78b04f5bcf24b3f031f1808849cc", + "libraries/coreMQTT/test/unit-test/logging/logging_stack.h": "3dbcc7f9f0ddab00d17b036b262ea402e52e4e349eba3238c12cc98dd76c501a", + "libraries/coreMQTT/tools/cmock/coverage.cmake": "8ac1ac5e6d5628fc8625d57f74249f15f53eba61f8338813d36d3dfa9dc1cf9b", + "libraries/coreMQTT/tools/cmock/create_test.cmake": "41dc66ba43772ccbcc59871e16ebc60b8671875e0e59d9068313be0aac1f25b2", + "libraries/coreMQTT/tools/cmock/project.yml": "805074ab6dcf01b29aac19ab1964b70227d0f7013b5b755dbf5c17ae66e6a0d6", + "libraries/coreMQTT/tools/uncrustify.cfg": "55c02144fdaa3d62e03ed97e3e89a54b67d9433a5320ec02ec82e75344b21656", + "libraries/core_http_demo_dependencies.cmake": "afff24d0e49b1b8abacfbaa9b27c1c9ac997c8e5d54c6b2f516bd1a7234e62a8", + "libraries/core_json.cmake": "ac1b14a56b95f3a9d662ebaa0b86c5e4841c432ee307a573d444d8fd319b1ec1", + "libraries/core_mqtt_demo_dependencies.cmake": "071ede03f356e7dcc12a7500c0f48a8d5177efab97a24e686a804e8013cc3766", + "libraries/device_defender_demo_dependencies.cmake": "6c7daec2952523949740655f0ddd45c5a6d6e032199095957ff423d93b194135", + "libraries/device_defender_for_aws/CHANGELOG.md": "8e1ca013ee497f6f7d48678432fc760acd0617816e8c5eec468cd043e79f5711", + "libraries/device_defender_for_aws/LICENSE": "92798b9082a3ffab53ad3495460f53abcf0ac30e1408f2edd88d5119726ff6c4", + "libraries/device_defender_for_aws/MISRA.md": "1429b980983e34cb237b6cad22bc7324aa81a225bb4769cda8d7244a34649913", + "libraries/device_defender_for_aws/README.md": "122f20088af3dc1d9c4c71c94d225085af08a6347769ca558e53fcdef7ec6f27", + "libraries/device_defender_for_aws/SECURITY.md": "ff53e3502bc39dac4a7074fe790f663c56d6c7aacd5b66dc648049f685e1e44b", + "libraries/device_defender_for_aws/defenderFilePaths.cmake": "304408766cf2f5aba4de5e13b3ae59b9bdb5243e141fc3b1749f3c91bf147e9e", + "libraries/device_defender_for_aws/docs/doxygen/config.doxyfile": "32bf4356f3cd354018be1f9806baf1e4afc94d1b33e30119d38607e5b4dd3cab", + "libraries/device_defender_for_aws/docs/doxygen/layout.xml": "555a70789f54c525456ad9d30730614fe7119afb8b81dd8f8067af28dd14f66c", + "libraries/device_defender_for_aws/docs/doxygen/pages.dox": "26570016166717c1596f619700e6a5cd5710a7af494c2ec8b6ce8d34225cbb1a", + "libraries/device_defender_for_aws/docs/doxygen/porting.dox": "1cca8b3557d2c77a7054d357356f3c7412d3d960c043ffd08707c9b11176f877", + "libraries/device_defender_for_aws/docs/doxygen/style.css": "e3d3b4438744aa4d547bcacc6e64f3fcfc5057b476c5237e5107e6bbe0aac72a", + "libraries/device_defender_for_aws/docs/plantuml/defender_design_operations.pu": "1b420a9752c530adc6e70f176f81400d876be2718ceb521e189aecc82c9a78ed", + "libraries/device_defender_for_aws/docs/plantuml/images/defender_design_operations.png": "9048e7da5eab9921ef4e2feff9706f49d626bed4954974fe5c9e117dbaf214ab", + "libraries/device_defender_for_aws/manifest.yml": "412f6660f605a38bc8db01ffdf44908f818f8f0e17026417265723d9ad986c9c", + "libraries/device_defender_for_aws/source/defender.c": "83e5be28451f45840d8f0823d4d6ffe46d25b8d46c4c3f9d348e5a89ce2ea904", + "libraries/device_defender_for_aws/source/include/defender.h": "ecb052f3c211eb2946411a0b99738521ceedb00dc0c38cb99931f0a8bd1a9e0b", + "libraries/device_defender_for_aws/source/include/defender_config_defaults.h": "8da39ff6232dcaabfe680143ff45e8796bb56fbae63e17f811fb14d8dbf86795", + "libraries/device_defender_for_aws/test/CMakeLists.txt": "793970898983e0dd910611ed98bf08bed857b0d2db6502e30a82d27c175d64b5", + "libraries/device_defender_for_aws/test/cbmc/proofs/Defender_GetTopic/Defender_GetTopic_harness.c": "6a85ba23aa834681fa1bae8882ee8167b0e0c9abddf9fc99c3abaec976a8ad9d", + "libraries/device_defender_for_aws/test/cbmc/proofs/Defender_GetTopic/Makefile": "d38a1bc79cdc7029fedd12fee893b61e6aa73c50712bbc08c8f90aea5cf5c946", + "libraries/device_defender_for_aws/test/cbmc/proofs/Defender_GetTopic/README.md": "619728536b509e5a370ee7adc734175270a5e112fcabe876215ca3fd58c0ad05", + "libraries/device_defender_for_aws/test/cbmc/proofs/Defender_GetTopic/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/device_defender_for_aws/test/cbmc/proofs/Defender_GetTopic/cbmc-viewer.json": "9d9db2ac4c818072b8360b020f2629f165e1bc7ea215c0738bb698a015f9b810", + "libraries/device_defender_for_aws/test/cbmc/proofs/Defender_MatchTopic/Defender_MatchTopic_harness.c": "d597dc7d7e72b3a4bcc181d71fa812ca75d59a9ccdc5d944ae2902d7c7939fa1", + "libraries/device_defender_for_aws/test/cbmc/proofs/Defender_MatchTopic/Makefile": "563d121e7f6a7e7b638261819d5b3a46259020a6e819ebc4c661014171098f01", + "libraries/device_defender_for_aws/test/cbmc/proofs/Defender_MatchTopic/README.md": "0b982a939a67c7c92af7f5102d2819e2f964aaf0d173a25a36cd7d3cd38d105d", + "libraries/device_defender_for_aws/test/cbmc/proofs/Defender_MatchTopic/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/device_defender_for_aws/test/cbmc/proofs/Defender_MatchTopic/cbmc-viewer.json": "c70566194031f972ef2f6a3777bf727e1fb8b63cc565b17edc970e2269b61e7d", + "libraries/device_defender_for_aws/test/cbmc/proofs/Makefile-project-defines": "6e42d2d116ec0aae20a6988ae29ea224513daaedf1fdc0b95b9e4e14d698b2f2", + "libraries/device_defender_for_aws/test/cbmc/proofs/Makefile-project-targets": "d8c3930590646a4a3b5f5ed446758bf2d8b27ffb742dee196efb816ae2f502f6", + "libraries/device_defender_for_aws/test/cbmc/proofs/Makefile-project-testing": "acb51f25870892f177057e7f56e73979e0eeb4967e3280aa160fd33a1a7bb03f", + "libraries/device_defender_for_aws/test/cbmc/proofs/Makefile-template-defines": "50b3687413c3a9a1e42a62954b1007e270fadbfda068fcb8e796b1862563507f", + "libraries/device_defender_for_aws/test/cbmc/proofs/run-cbmc-proofs.py": "b37b71fb8ccf4b101ea1ffc65107c857f45fa6e228f1eb9e2041c017efd3319c", + "libraries/device_defender_for_aws/test/unit-test/CMakeLists.txt": "a5dfc22bae97b57f11bf53b324ef858e7c135ae8d26535c2a859aa0c6f4ab0be", + "libraries/device_defender_for_aws/test/unit-test/defender_utest.c": "477205e2ec2f00384a9d4ca3d8a16c9e3c637dd88f85d25c00ad648fae75feac", + "libraries/device_defender_for_aws/test/unit-test/unity_build.cmake": "daf106eac10e7a34b62e4f2165d32a30ccc5930f819bfac121818c02835c2d0d", + "libraries/device_defender_for_aws/tools/coverity/misra.config": "d72f33418fcbf9e66e81707794654364e319d1b67e554eae4954f14d1d7d8908", + "libraries/device_defender_for_aws/tools/lexicon.txt": "3d54a1096198f686458bea69a96eefa5606ed28e3bdef4004915c472b5d7b27b", + "libraries/device_defender_for_aws/tools/uncrustify.cfg": "55c02144fdaa3d62e03ed97e3e89a54b67d9433a5320ec02ec82e75344b21656", + "libraries/device_defender_for_aws/tools/unity/coverage.cmake": "1831c88a0bb202d41f80944d8aedf1b52665c6746c1e023d46ac548d59218f3c", + "libraries/device_defender_for_aws/tools/unity/create_test.cmake": "2cb0dc70a852f3d640b19d550a06358918f360928f24b63cb4c614b34678107f", + "libraries/device_defender_for_aws/tools/unity/project.yml": "12130e50fcf569eaee1c82ebf43c3accfdc599b0f42064ea6819a49f2089eb2f", + "libraries/device_shadow_demo_dependencies.cmake": "0495c3ae7b349db5b573e33a3fbc137ff3c60d7a0e0b95d02baba15ae3ffb6a3", + "libraries/device_shadow_for_aws/CHANGELOG.md": "6ccb2f49dc4be179b638c909de7aeb655aac75d3843d9ee1eceda5bda5ef2728", + "libraries/device_shadow_for_aws/LICENSE": "52f54173fb286e7baa536bab3fb2aef58891af07e96646fb4d80663fabdfdcfb", + "libraries/device_shadow_for_aws/MISRA.md": "83c3eaba6c074f8ecb666c2d9d8c3de156fe47eedaae379494f70fea4653fce0", + "libraries/device_shadow_for_aws/README.md": "54df38c66e3635f5c42a279a38acc4bb9c475c7791cabe622c4427bc5f355d8b", + "libraries/device_shadow_for_aws/SECURITY.md": "ff53e3502bc39dac4a7074fe790f663c56d6c7aacd5b66dc648049f685e1e44b", + "libraries/device_shadow_for_aws/docs/doxygen/config.doxyfile": "e252931859057ea8f29cfb7f2c9ca2affcf1ed5c63e6026151d72770c47261a4", + "libraries/device_shadow_for_aws/docs/doxygen/layout.xml": "555a70789f54c525456ad9d30730614fe7119afb8b81dd8f8067af28dd14f66c", + "libraries/device_shadow_for_aws/docs/doxygen/pages.dox": "79630b146f50c9da781ddb199ecb63fb2a7089e0b74de9dcd2bcdffe4390f64c", + "libraries/device_shadow_for_aws/docs/doxygen/porting.dox": "57770d46dfc3d9a8ea9dac0495ee057956221981221fe70ddf8fbf6b46a8cfe3", + "libraries/device_shadow_for_aws/docs/doxygen/style.css": "e3d3b4438744aa4d547bcacc6e64f3fcfc5057b476c5237e5107e6bbe0aac72a", + "libraries/device_shadow_for_aws/docs/plantuml/images/shadow_design_operation.png": "be26eeab05864c35a8777eab1ca26255c7c585d88ed88e548f67c86891f210b9", + "libraries/device_shadow_for_aws/docs/plantuml/shadow_design_typicaloperation.pu": "81c9ef7f7e2cd9d56aed1f29e96d6a3677a530eb6c9ada4bb2bf1d3572ae7479", + "libraries/device_shadow_for_aws/lexicon.txt": "322d3b86541dab47e31ea0cdad6d2f77aaf458e517848ee266a14bde9f73b32e", + "libraries/device_shadow_for_aws/manifest.yml": "12e4eef3c991791913b17d88f2db8d7e8f8244ea6ca154b543bbd038de7096d1", + "libraries/device_shadow_for_aws/shadowFilePaths.cmake": "0288a46686c14976f166ba2466ea9dafdb5388fc1563430d88ff989e479c1ce5", + "libraries/device_shadow_for_aws/source/include/shadow.h": "293045b22bcd203a4845e74d427fd994b0372e100fa552c3e6af2fa1fa38ce27", + "libraries/device_shadow_for_aws/source/include/shadow_config_defaults.h": "2b7b7b9c5512e8e51b424dcbad238059e4968595dfa92c8a13d3886d9708e8bb", + "libraries/device_shadow_for_aws/source/shadow.c": "ff55e37b0d5b2ed6fc2b6779b6fcd99812e6a3a4b2daed5bf03955a3a8710503", + "libraries/device_shadow_for_aws/test/CMakeLists.txt": "4f5de7fdcf2cbdf2fd557b569ddc34f405dddc51df66ce95d164fe01ce5a63b0", + "libraries/device_shadow_for_aws/test/cbmc/include/shadow_cbmc_state.h": "f461e5de7047affab2de1e8e1f76e1523a5c05d725bb0314e7c4dbb5b1de21c1", + "libraries/device_shadow_for_aws/test/cbmc/proofs/Makefile-project-defines": "88668a1c0ec1b0b7a944fdcc4997b050e7633f3f33da0fec37f280c11799ac03", + "libraries/device_shadow_for_aws/test/cbmc/proofs/Makefile-project-targets": "d8c3930590646a4a3b5f5ed446758bf2d8b27ffb742dee196efb816ae2f502f6", + "libraries/device_shadow_for_aws/test/cbmc/proofs/Makefile-project-testing": "acb51f25870892f177057e7f56e73979e0eeb4967e3280aa160fd33a1a7bb03f", + "libraries/device_shadow_for_aws/test/cbmc/proofs/Makefile-template-defines": "50b3687413c3a9a1e42a62954b1007e270fadbfda068fcb8e796b1862563507f", + "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_GetTopicString/Makefile": "e78d4425a8651d72d500df887628335b1d5e38b419fdf7f81548ef2f260499cf", + "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_GetTopicString/README.md": "accc952272ea78212cf6d4842e274e5212c75b31c4dc3d471fd4c62a0a26f90c", + "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_GetTopicString/Shadow_GetTopicString_harness.c": "865218e58468e7399655bb76269a974c7a831883772a59358f43d1b8ecd75cf5", + "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_GetTopicString/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_GetTopicString/cbmc-viewer.json": "76ee8989609434f5d85140cfebad4a10f6094b08c3c9f4fdc6f77b8349998bac", + "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_MatchTopic/Makefile": "c3c9494dcce237a07cb4e87c7ec36b0079bdd0999df594d77b063eeac7907e3c", + "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_MatchTopic/README.md": "00d47208dd0ae8c71dff2e619d1255b6c73241fb8d9fc3879f9ae879e000b3dc", + "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_MatchTopic/Shadow_MatchTopic_harness.c": "62496772a7af9ada614e3f42a03e734d8c73c0ea3341d6e09ae8143750ef403e", + "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_MatchTopic/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/device_shadow_for_aws/test/cbmc/proofs/Shadow_MatchTopic/cbmc-viewer.json": "b596eaf251320594edc10aab35f561c68f847211325565f18b838719bf8644c4", + "libraries/device_shadow_for_aws/test/cbmc/proofs/run-cbmc-proofs.py": "b37b71fb8ccf4b101ea1ffc65107c857f45fa6e228f1eb9e2041c017efd3319c", + "libraries/device_shadow_for_aws/test/cbmc/sources/shadow_cbmc_state.c": "5bcff9fd7543d0333af3b563fa9348f2362fab9f38bc94053365734050f3a33b", + "libraries/device_shadow_for_aws/test/unit-test/CMakeLists.txt": "3450a4ea7b5cf02588d8f1c577115788d19e4038f1ec6838c56b5e6deb835bb9", + "libraries/device_shadow_for_aws/test/unit-test/cmock_build.cmake": "d73f758fdc599d6abcd447dbbd05331a14615eeb631b22cf5101b8a3d4eeebc2", + "libraries/device_shadow_for_aws/test/unit-test/shadow_utest.c": "907ba953aa8e975bef0ca791ef57cd50554eca13e33e042f2b932efa164925c6", + "libraries/device_shadow_for_aws/tools/cmock/coverage.cmake": "8ac1ac5e6d5628fc8625d57f74249f15f53eba61f8338813d36d3dfa9dc1cf9b", + "libraries/device_shadow_for_aws/tools/cmock/create_test.cmake": "41dc66ba43772ccbcc59871e16ebc60b8671875e0e59d9068313be0aac1f25b2", + "libraries/device_shadow_for_aws/tools/cmock/project.yml": "805074ab6dcf01b29aac19ab1964b70227d0f7013b5b755dbf5c17ae66e6a0d6", + "libraries/device_shadow_for_aws/tools/misra.config": "87445ff3dcb7c836a2f1ed650d751277aec5fd90639a73f43fb699dfff33b15e", + "libraries/device_shadow_for_aws/tools/uncrustify.cfg": "55c02144fdaa3d62e03ed97e3e89a54b67d9433a5320ec02ec82e75344b21656", + "libraries/freertos_plus/aws/greengrass/CMakeLists.txt": "393bd7ea752c2e8cd5c8844ca16ef65f0e511425fc5aa93e685ebf185e108d8e", + "libraries/freertos_plus/aws/greengrass/include/aws_ggd_config_defaults.h": "434b1e4a7fcc217e88275ac039f602e484e5d6b424bb010515d53c7cecc316c2", + "libraries/freertos_plus/aws/greengrass/include/aws_greengrass_discovery.h": "5798efbcec0e5e969cbd169e75c277adfa844b05f8e39ced88ad8d4fbe969d57", + "libraries/freertos_plus/aws/greengrass/src/aws_greengrass_discovery.c": "a314e73563229f862e4b0e104c1aed2a7140a893e69bbb6dda01e7bda4da25bf", + "libraries/freertos_plus/aws/greengrass/src/aws_helper_secure_connect.c": "40e0e21bb6cb1a392e3db33c129f5b3f183948d95605edacfe3e18c02d008514", + "libraries/freertos_plus/aws/greengrass/src/aws_helper_secure_connect.h": "8a71233b2b831488a385f659530907a26adddb8edfe391c0adce7a1497ff5758", + "libraries/freertos_plus/aws/greengrass/test/aws_greengrass_discovery_test_access_declare.h": "45272bea7f9a1018ceb9028e03145aa789fe5b367310b77c4f4e4fc993007f53", + "libraries/freertos_plus/aws/greengrass/test/aws_greengrass_discovery_test_access_define.h": "6bd7b214b1e9936dc7fa4bb9f6604ebb79af66ae7e94891ca2c3948b4137f176", + "libraries/freertos_plus/aws/greengrass/test/aws_test_ggd_system.c": "8dde331777cf0a01864d12003f2e7fe3c2d9ed2d834ff576c793ebb5062eb6de", + "libraries/freertos_plus/aws/greengrass/test/aws_test_ggd_unit.c": "6c0952a26a21ad22eb0ae4786525652ad21a45f4bfb42ff4c9cd20496ec124d8", + "libraries/freertos_plus/aws/greengrass/test/aws_test_helper_secure_connect.c": "99004b85bd8ffffb1fe6113d7a24cac09c394d1250d9d9c58d3858d98f96e472", + "libraries/freertos_plus/aws/ota/CMakeLists.txt": "bbccd996cd384cce21e8a89e8767d0353c434242c7f0eea2cb8899cbc9d77c46", + "libraries/freertos_plus/aws/ota/README.md": "b18ac6726e49fbd1f1ae96f8fc3551b0d9a226cd34d82503e3f2e641bf89b64e", + "libraries/freertos_plus/aws/ota/include/aws_iot_ota_agent.h": "b742809f8ab1e112e3fc43b5666daad95ccaaa10d79c34e69986e438a02b4c22", + "libraries/freertos_plus/aws/ota/include/aws_iot_ota_types.h": "57182b26616084fc42ba2b062e1d6e76466acdfef09f0645cd2a05ab766c8ea1", + "libraries/freertos_plus/aws/ota/src/aws_iot_ota_agent.c": "442ad0fa4d83b3565e9475ba3777e3e592a51b761547febccfaea43ddb2324e0", + "libraries/freertos_plus/aws/ota/src/aws_iot_ota_agent_internal.h": "dfd6ca7fb76631b5d9599070f91339a5ec6e259cd37e7ab912e5a42d4382fd8d", + "libraries/freertos_plus/aws/ota/src/aws_iot_ota_interface.c": "06f304e0659379ca35e293df481923160c1245a001c7343ea613530f9cb10a43", + "libraries/freertos_plus/aws/ota/src/aws_iot_ota_interface.h": "068a154bf5b8fca5b40bbde581839227c27b0c60e9bbaff7bbd3a64a92e07dee", + "libraries/freertos_plus/aws/ota/src/aws_iot_ota_pal.h": "c46e0c47c77368aa6bf23cd67eb5a44bce31552c6dbdf82fa937183439a0c187", + "libraries/freertos_plus/aws/ota/src/http/aws_iot_ota_http.c": "84f903d6f44293df041390a384a2aac2dd224488117ddcc4f0c15245322597b1", + "libraries/freertos_plus/aws/ota/src/http/aws_iot_ota_http.h": "31b163f629af2dcacfac4d2d7006c47a67ae80590e739d5e9ac95131edae2540", + "libraries/freertos_plus/aws/ota/src/mqtt/aws_iot_ota_cbor.c": "d72c60fc721724da9c96e952d326db64510c85bbe7e3622a8a9c218b2a3687c9", + "libraries/freertos_plus/aws/ota/src/mqtt/aws_iot_ota_cbor.h": "2ec1f8fc7211d684f84df8663e03b227bac0fd2c3ec672acf3e9dbbc7b3f7b08", + "libraries/freertos_plus/aws/ota/src/mqtt/aws_iot_ota_cbor_internal.h": "6216ff295ec1bc8462f586e040413e670c528c948fd7c913c94c38738ca0fc8c", + "libraries/freertos_plus/aws/ota/src/mqtt/aws_iot_ota_mqtt.c": "54e002b3f4eb0d786e3c1560c000722ea4ce31680b5a1fedafa578bba58284d5", + "libraries/freertos_plus/aws/ota/src/mqtt/aws_iot_ota_mqtt.h": "8c5875e1bdcc526808cbe568633d93bc91fb97f59abddf14b38c91bc12545044", + "libraries/freertos_plus/standard/crypto/CMakeLists.txt": "481befa1e33d2e1ebbacfd42083ebd9e4241905936132ec0d5f1c6161a9c21d4", + "libraries/freertos_plus/standard/crypto/include/iot_crypto.h": "430a2b08df14ee1b397efc666544a128003222ddd1f26d17cf346c9bc7bf31b9", + "libraries/freertos_plus/standard/crypto/src/iot_crypto.c": "7e837f3e07fc4eb76554386413eca2854ff8ac64171519121ffd8fed293fa611", + "libraries/freertos_plus/standard/crypto/test/iot_test_crypto.c": "c54a8611e6d6f50c6eda53631573c1f509fe262e789a92e63d1bbc37e9b0a4d3", + "libraries/freertos_plus/standard/freertos_plus_cli/CMakeLists.txt": "e00100014f7209e35f71f54f5f8789c136ce62160ca07f6a414c989eca594136", + "libraries/freertos_plus/standard/freertos_plus_cli/include/FreeRTOS_CLI.h": "7de127b16025300d2f54a063aa4e122c464a060890875705e45cdcffdcbca295", + "libraries/freertos_plus/standard/freertos_plus_cli/include/FreeRTOS_CLI_Console.h": "d431af28dbc1110cd58d06a90c317413aa73386c800382647d9de56525940f37", + "libraries/freertos_plus/standard/freertos_plus_cli/include/FreeRTOS_CLI_UART.h": "63e0aaadf729cf0b0ec72457be88e054fec9366a54d2b20e5a1169ce12bee4b8", + "libraries/freertos_plus/standard/freertos_plus_cli/source/FreeRTOS_CLI.c": "702d1f733cc7f2f8ffab9e33c8b117c21a282b81de053e03f17cd9887fe2b517", + "libraries/freertos_plus/standard/freertos_plus_cli/source/FreeRTOS_CLI_Console.c": "cf12352c6959a994185ff186e949cab0736837b6a860e061b55dbf2b51af12a6", + "libraries/freertos_plus/standard/freertos_plus_cli/uart/FreeRTOS_CLI_UART.c": "bfe85e168f474dd85c1b04c25a7c451e86134f54e295179dbdbd650d09407515", + "libraries/freertos_plus/standard/freertos_plus_cli/utest/iot_test_freertos_cli.c": "337521d3f851419fd65b13f79e218728c4c8daa41b2ac801314c513879698441", + "libraries/freertos_plus/standard/freertos_plus_cli/utest/iot_test_freertos_cli_console.c": "af45dad1085f2c8466d751aa74779b86578fc5b3f50379654317716c1e498869", + "libraries/freertos_plus/standard/freertos_plus_posix/CMakeLists.txt": "2d110d1d29d9ef1dd3f73912e38a451f498c24711466787004f5a7624a0b680f", + "libraries/freertos_plus/standard/freertos_plus_posix/doc/Doxyfile": "71907a1ca6b1cae1114f2d16664148b74b6861e6f768c9ac04b1a9052f677105", + "libraries/freertos_plus/standard/freertos_plus_posix/doc/DoxygenLayout.xml": "6f6ef8c521e2943d9b596e7904bcd22a8f2d6253ce70fe206a030831e03fcd32", + "libraries/freertos_plus/standard/freertos_plus_posix/include/FreeRTOS_POSIX.h": "2018f496eb5d0d482c1d00e2881d863b3c3946224ec3165d773eb5448ca94f07", + "libraries/freertos_plus/standard/freertos_plus_posix/include/FreeRTOS_POSIX_internal.h": "fcd06b832232cf783e76f293417b238c97d7ae4b08b9a8feebf03de6521b86e1", + "libraries/freertos_plus/standard/freertos_plus_posix/include/FreeRTOS_POSIX_portable_default.h": "766d7402b43f56a3171581bc8134d54675dab4c09ac85b9a39f0c13729050495", + "libraries/freertos_plus/standard/freertos_plus_posix/include/FreeRTOS_POSIX_types.h": "fc8cf5e542d75add0b383577b5b7fdb8cae57cb3a2c64832c4c94b4b20553346", + "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_clock.c": "b170317d13ef4ac9badc1d00afaa87655f86e7b94e4bf5064ecb1621b6ee511d", + "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_mqueue.c": "5f7ea4afb1547c2e5006e873224de3bd69da039066ce4227278a50867ebd9de1", + "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_pthread.c": "e22feecee2e094755d6dc0aee7be28d1d8dcf72d13d98d5c8922fc407474e446", + "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_pthread_barrier.c": "43adaafd1338534907f5d0d841950320d8e01bb637b50ac0c765181c888e5892", + "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_pthread_cond.c": "3c1d23aefa4d415c025a89d0388b53ae6d0d128e34ed23531a450116cddecaf7", + "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_pthread_mutex.c": "d217516b0ba41c02d9b491d511a81ea3a73780de6cc0a6e527347fda7753064f", + "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_sched.c": "668a4cac8f3bf0407067db17aef8361a572bc7701421f8a57981f7a607877573", + "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_semaphore.c": "6479146228437651b99a82c1c0b6d987d1531feea3e9694e9a78642069f397d1", + "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_timer.c": "fc6f4fa34d4841b8722141f831be0191e33e8dad5b565bd22d5fe365defdece3", + "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_unistd.c": "803294f5e4d427eddcbe89849aa12981335680d4cbaad1b97fccac37fcf955ec", + "libraries/freertos_plus/standard/freertos_plus_posix/source/FreeRTOS_POSIX_utils.c": "4a67ed8d61577fb4ff56a8b9811a5ce8729780c21cc14cbe9e19a23ec48a1fc3", + "libraries/freertos_plus/standard/freertos_plus_posix/test/iot_test_posix_clock.c": "f91d9fd78bdf34418fe4222f3752fc2bba1d681329e38b43e8d946cbe37d4281", + "libraries/freertos_plus/standard/freertos_plus_posix/test/iot_test_posix_mqueue.c": "912eeb6ea837aca95d88fbcb63be237239ee583319d157250ff9e856120734d3", + "libraries/freertos_plus/standard/freertos_plus_posix/test/iot_test_posix_pthread.c": "f02793e69e06da522fac7a2728983540d668c2a5f9dace05e1f4c6abd20c583e", + "libraries/freertos_plus/standard/freertos_plus_posix/test/iot_test_posix_semaphore.c": "0461bbedab67462139d12aaece2279490b73146fd5572e7c86cddb4b92f2109d", + "libraries/freertos_plus/standard/freertos_plus_posix/test/iot_test_posix_stress.c": "ba930da93fe8953cf0cbd95dc630da07bd5a409125895752fecd3db1a0bacf16", + "libraries/freertos_plus/standard/freertos_plus_posix/test/iot_test_posix_timer.c": "1e65f7b22962948f761f692c5276853f1ed602eeb4aafeace39e5599c868f738", + "libraries/freertos_plus/standard/freertos_plus_posix/test/iot_test_posix_unistd.c": "e0b2ce70d62b9b153d09c11a265fe44d03c34dac72b01aa23dd9b6a767d0b889", + "libraries/freertos_plus/standard/freertos_plus_posix/test/iot_test_posix_utils.c": "3352d2f4f0b5dfa8b26b360ec74bbf0126c11baf57762cf961d179bbca4c6071", + "libraries/freertos_plus/standard/freertos_plus_tcp.cmake": "65fe34d30f92b7d85a761ab8817910f11059dc760e1298af661517f41569e4fb", + "libraries/freertos_plus/standard/freertos_plus_tcp/FreeRTOS_ARP.c": "a270eed4926e4aa2ba0aff17dabbdf89bda435d104586e65ef1491cb47feabeb", + "libraries/freertos_plus/standard/freertos_plus_tcp/FreeRTOS_DHCP.c": "e877fa52ef7af3066284be53b96a87f7754a863167b0ae8e0649bc4ad7d40c5f", + "libraries/freertos_plus/standard/freertos_plus_tcp/FreeRTOS_DNS.c": "a47ce04a889c396ecfc8acb0b4cff3a4aee89913dfb4a21afc34f48e8c189196", + "libraries/freertos_plus/standard/freertos_plus_tcp/FreeRTOS_IP.c": "90122392833358cb09a4a81c8053f30ba157d5224af871fe8f5d0dca953dc3f3", + "libraries/freertos_plus/standard/freertos_plus_tcp/FreeRTOS_Sockets.c": "c72b205e5653d26e579a68c500c43e1847aedde2db79e078c520aa03a04972b0", + "libraries/freertos_plus/standard/freertos_plus_tcp/FreeRTOS_Stream_Buffer.c": "082f6e847085091d3fa26a580c21202ac5a63dc82e1ee5a2f1ea30f383b0cd91", + "libraries/freertos_plus/standard/freertos_plus_tcp/FreeRTOS_TCP_IP.c": "c2f2f3651cc35cc2d741f8342a6a51c95f630b2fb1d29da8f1e4fe302041a446", + "libraries/freertos_plus/standard/freertos_plus_tcp/FreeRTOS_TCP_WIN.c": "ae5a8653ead35cba49c899c20d442e7a02f0e06894d2ed24c21923181a00c508", + "libraries/freertos_plus/standard/freertos_plus_tcp/FreeRTOS_UDP_IP.c": "ed2397a207d4692e86b7fa6c96c9dfb20806c691562c0abd7482cea22b1941c0", + "libraries/freertos_plus/standard/freertos_plus_tcp/History.txt": "14444b020933d64403a5eb7a44f1144f6750b91296d9a1bd51e034952c15c972", + "libraries/freertos_plus/standard/freertos_plus_tcp/LICENSE.md": "508a77d2e7b51d98adeed32648ad124b7b30241a8e70b2e72c99f92d8e5874d1", + "libraries/freertos_plus/standard/freertos_plus_tcp/MISRA.md": "c2f61079e65ad438c7d74550a1bf8958457da9bcd65861aa6820f7ac29395a4d", + "libraries/freertos_plus/standard/freertos_plus_tcp/README.md": "ea4a6f76004cae4ba33b1b2c077dcf72139cd7905e8afcf69960f7c206031604", + "libraries/freertos_plus/standard/freertos_plus_tcp/ReadMe.url": "6c821ec481c65c354d181c49e519d0dde0def21bde8e85e7350bdb87a946941f", + "libraries/freertos_plus/standard/freertos_plus_tcp/docs/doxygen/config.doxyfile": "71fa4d9cae8b5c3628806eb2129f10bf99db95fa0efcaee9e9b0eab6ec003e65", + "libraries/freertos_plus/standard/freertos_plus_tcp/docs/doxygen/layout.xml": "555a70789f54c525456ad9d30730614fe7119afb8b81dd8f8067af28dd14f66c", + "libraries/freertos_plus/standard/freertos_plus_tcp/docs/doxygen/style.css": "e3d3b4438744aa4d547bcacc6e64f3fcfc5057b476c5237e5107e6bbe0aac72a", + "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOSIPConfigDefaults.h": "8da78f305a7190c4467a925dd0f2862e48ce85e8cc59f0fc5cbdbbb4500e0b66", + "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_ARP.h": "cf63bc041c5253ec98f0e99a24cd9632390ad3155513878acd84cba1a5e36df9", + "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_DHCP.h": "d367d65e193764ef9196ebb3047d090996059e835b133485716e2754938f3ab7", + "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_DNS.h": "4b3a0aa2229d83b82177c76ea52f2850783de0c94338c71c96e54f80fe3193f1", + "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_IP.h": "f5f29e00160d83a89791d23db91ba66de860eb59b0ec30e7bd9a290ef490187b", + "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_IP_Private.h": "35464c7c9f6d9c1e1df087b1e78095a7482ec425c1bf23d4c2fb383584ba4b6d", + "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_Sockets.h": "398a33e571ceb503775b0c38e3526ea9e802b8f196c93c6bb9def1aed146e07c", + "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_Stream_Buffer.h": "ad40c09c20217a9b7b7a9bc5428795d4f984f37137444cccd5a838bdf14fb6f8", + "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_TCP_IP.h": "cdcbdc63361882781a3780590490334e4314a125e94e624585c9dcaf4fd88e51", + "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_TCP_WIN.h": "d52bcb271c12a76a5035fc38552946b7dfc29b0cb3b35041d3dfd72d39982656", + "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_UDP_IP.h": "90d584e6df3517df934d91691db60f7ab0e72f13341ce8a83d1055e2b5552c85", + "libraries/freertos_plus/standard/freertos_plus_tcp/include/FreeRTOS_errno_TCP.h": "9c26ccf13f3998cfddb553c36ab575e834510cb7ad1cb2717296542d313d54ef", + "libraries/freertos_plus/standard/freertos_plus_tcp/include/IPTraceMacroDefaults.h": "3ac7aae8a855222cf4639221ec51866c94cba91b9d4ef840a516e0913603191c", + "libraries/freertos_plus/standard/freertos_plus_tcp/include/NetworkBufferManagement.h": "0331f99c9cae5847daef64c8c8994927a1d00b52377a0a302fde7a86c887d051", + "libraries/freertos_plus/standard/freertos_plus_tcp/include/NetworkInterface.h": "56bab67595d2845182a6906d6a23b734f08314908b250db9b3197d9688ff9b58", + "libraries/freertos_plus/standard/freertos_plus_tcp/manifest.yml": "e0b02279d0892fad65af80469875dd99a8c241cb9d683721626afac52bbe651d", + "libraries/freertos_plus/standard/freertos_plus_tcp/readme.txt": "650a32b9db6e75a5bddfded2e44b5e137a9f9ba76124451eadd452b00c3c8010", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/build-combination/AllDisable/FreeRTOSIPConfig.h": "fff034ce69843890bbc87467fb23e891da26ebb266de6a72aa4d3e87f806f819", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/build-combination/AllEnable/FreeRTOSIPConfig.h": "06c1c2d37d40ee7c54a8def533c2700f4fffb2f12b8c906b3145249377fd0a2d", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/build-combination/CMakeLists.txt": "82b95b38c56a52495c2acb28c2f08964dc7bba2aec29458a2f571dc9fb9172e0", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/build-combination/Common/FreeRTOSConfig.h": "1d57ec870baa67fce22a12cc94c8cb9a4ce52ae912919372c177d20aaf16509f", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/build-combination/Common/main.c": "b29e96615f076896c2d0094e2b2771a963f3bf4731e7f21a940f181833e3276d", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/build-combination/Common/winbase.h": "dd72cd6385688bc28589ec7f07527e689e0581d15a0b91ab7690ebed3b122e5a", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/build-combination/Common/windows.h": "dd72cd6385688bc28589ec7f07527e689e0581d15a0b91ab7690ebed3b122e5a", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/README.md": "2e1517b705e63a4034c4d5c38a72adef06c3e7e216db5954d180143be8023349", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/cmake/compute-coverage.cmake": "8cc293e091fd5150d51c2ed38767eca810599ec591c3e1ebffe34babc5e81377", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/cmake/compute-property.cmake": "e244ad6756696ef7541d40f4aeebe3f9fdd9bfa9457328d66fecfcbc2e4dea0f", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/cmake/model-check.cmake": "d0e3c0e331f9e7658ebd47ed91ed0f075be87710d64203198244d86e34786443", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/include/README.md": "d92693cca3094d662b72784110946c09a66a8303dd0b03f3461f8b7b62280262", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/include/aws_freertos_ip_verification_access_ip_define.h": "81cae509e8ecd058785ec1eadf196553f4547ffbf5e991a18122b38ad9cc05f4", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/include/aws_freertos_tcp_verification_access_tcp_define.h": "970e55f94b54e0e4a3ca16816f1234b39724624711feb00a9ca4509dabbafeb5", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/include/cbmc.h": "bf3fb8dbc20e9af8ca69287d4e6f91dda6cccd423bfa340b077df180a288209a", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/include/queue_init.h": "8420699152826dbf680bec3cd2efcf2872ae1b23b48f0b4dbaf2eeb52d8ae3db", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/include/tasksStubs.h": "fde7c87b4aac3632fd9e677df58467fe2f0996af025feaf35dc9897daee45879", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/FreeRTOSConfig.h": "5e96cb98802fe80958e58712eb4485d3b2ba6d1ce43481841f856795edeec52b", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/FreeRTOSIPConfig.h": "688e1fd00acf6848ba2defe690ec13b09909842ec4f023640ed9427fe5e387df", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/Makefile": "62f5359d2c57c49751e667130dbcad7f026a94a73ded970686ecd6b4890d2b07", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/README.md": "bec763d9c3a15d46899989dcd7a28f443123b8579d8d6fffaf5d80d041417070", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/__pycache__/compute_patch.cpython-36.pyc": "fe73400b72e2e034b1be43e64964f3f354e9108d58ff5a3897dccbb982af675e", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/__pycache__/patch.cpython-36.pyc": "1934234b94d63788c77137417dbc4717c56e9b8322b47bdb2dfcf62c311b5e08", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/__pycache__/patches_constants.cpython-36.pyc": "c061304856f947ea1d0c29e5a8d1f5e7498bd24010544d187ba3fe734c244d0e", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/compute_patch.py": "97cc6c1fbadf52dbd5014220d462163279ccf4afa71f4cf0b904b870efb793d9", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/patch.py": "42516fa3e5214e434f6755e15756d67c8ba7ca1a970f021f628777cbfe69a0c2", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/patches_constants.py": "317f874431820fce7a913501b2e1a711df3d3fb1bdb598a737adb0a15816ccde", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/unpatch.py": "21bd4f2a468f1aaec312212587710cccec3489f419fbb6fcc16acc25784b0eed", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPAgeCache/ARPAgeCache_harness.c": "39853aeaeaa191017a994c531f88b0f76889661f0c306576ca567c9e09b424aa", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPAgeCache/Makefile.json": "9707edb8e400212ec97f84e60c10f9d40f73d6937cb1c38b619b8f970c612d6c", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPAgeCache/README.md": "aeb4610ac4385bf15b340a3e79e90a89bbb558a823e6f4e42421e389aefe1910", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPGenerateRequestPacket/ARPGenerateRequestPacket_harness.c": "e837b81f4b7c2a7f9042b10de1956ce7dc86aabba1c92a7681fee08f9492fcce", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPGenerateRequestPacket/Makefile.json": "c68383eb27ee62c4771f294646287662962b8251e7d85ee575058deb6e586082", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPGenerateRequestPacket/README.md": "b9a210fc5d5ab9fc6d9bc5c907842f9aa249e28eb65fb336306e125b69459640", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPGetCacheEntry/ARPGetCacheEntry_harness.c": "f26d923851165ef0e828adf8e4289a801d5e27f43edea5f248a7f1801f817d9d", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPGetCacheEntry/Configurations.json": "51bd3e04a590b0df9700515ebf0acb07239fe2def64600a87d6c96ba4df0c168", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPGetCacheEntry/README.md": "9916569965ddce1f39f0610a330d27f66e3e62dc218b25d3d9c1689e6f536db0", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPGetCacheEntryByMac/ARPGetCacheEntryByMac_harness.c": "a4568be01085a5f4a087e32f8a031b3e4d91d058ee147998ecf4277ac2ab3cff", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPGetCacheEntryByMac/Makefile.json": "9faea9ff5dd12f067477e85748161651e561c19c797bc8407312dc1d99b5e1f1", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPGetCacheEntryByMac/README.md": "ee9b0c769051950546b1c962b3e761249b52fd0133132fbeed05cdc355e54dab", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPProcessPacket/ARPProcessPacket_harness.c": "d846786713d407f84bf632fb2b6a06e5ea80b51c4d657cdf4b6ca0de6fbcdc43", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPProcessPacket/Configurations.json": "8802a9d06c9a896f2b9826d200b517ac8a211870cad6416db2870d0f1bb6837b", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPProcessPacket/README.md": "1a3af6593d7cd50a343eb2740d47f2d9961a3a77f2ef56a1b46829d0505b8235", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPRefreshCacheEntry/ARPRefreshCacheEntry_harness.c": "a2b4e339af9b8bba5d643abf24e3bd2bab2a43cb7e482682d5141682892230d5", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPRefreshCacheEntry/Configurations.json": "71cd19e3171854bcced175cbcedf17a79975da5f2651fd4e3a7b0f499bdb8263", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPRefreshCacheEntry/README.md": "f9bb7a176f5f924937512440c589b38fc7c3f7a98a4fe91386271711cc3d2871", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPSendGratuitous/ARPSendGratuitous_harness.c": "dcbe3a280bc06976fa83cdf1801da20421a940d04d9f905118cfb58067a36d9d", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPSendGratuitous/Makefile.json": "66659ee852d417e08acedab451252f549865bc592b3152162935fcbe09dbbbdd", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPSendGratuitous/README.md": "b6c9ef7ad2e0e24f43e4a45e85ba47eeb66502183960e46f291472f4e9e33f9a", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_FreeRTOS_ClearARP/ClearARP_harness.c": "33f0182d87ac5473bc3128e6d3cad662cd21c2de5008be3d9f5d1f74dc80a081", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_FreeRTOS_ClearARP/Makefile.json": "e035a4838878a8b897117322a47d52bf95818ff8b1f578217e0db8e94b634675", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_FreeRTOS_ClearARP/README.md": "6fbeffc40126d0d55fa78c1d439941c30e615437edb3908fdf7f3691385ef214", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_FreeRTOS_OutputARPRequest/Configurations.json": "8ed33822a5203a290cd01cc15d00865827934f6260868be09a1026cfb54f3451", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_FreeRTOS_OutputARPRequest/OutputARPRequest_harness.c": "a918785af996de56583ebb6a3e0f01cc64971d229a71d4697b65ead685884184", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_FreeRTOS_OutputARPRequest/README.md": "7e5a27411840d03fc4367959642c2b601d0f6f586f1b9881dcba905f89f0ad57", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_FreeRTOS_PrintARPCache/FreeRTOS_PrintARPCache_harness.c": "b010fe4cee6944110c5ed1321f5debc8701763854917b7f61cfa1fc0ea2430a3", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_FreeRTOS_PrintARPCache/Makefile.json": "f0733aee20251ce681f6e80055a1f7116f119273bd4af4e05d2e791ea0e7ef34", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_FreeRTOS_PrintARPCache/README.md": "fc60542585ae6e44bca336874b376b4dfac645ccc167c685b0d5d841b1d85881", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_OutputARPRequest_buffer_alloc1/Configurations.json": "cf1f8dab26ef867fd3c838e28b8e214e81dc084361fc9446ed371e77b9b735df", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_OutputARPRequest_buffer_alloc1/OutputARPRequest_harness.c": "e8a8cd3b93348c008809512da53456566430b7d5c24273c43fe7f5ec0a1ca452", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_OutputARPRequest_buffer_alloc1/README.md": "36a9e7446602693c416fedc98c38a543cf4f298a402ea939991cc01b0ac3884c", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_OutputARPRequest_buffer_alloc2/Configurations.json": "5c34c28eef561dc28dd73f2ecefb9f908b5489011846d602021b880eb1008268", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_OutputARPRequest_buffer_alloc2/OutputARPRequest_harness.c": "98a029dff3d797a349d9a2304bf40b0ae6ad9af2040d241fb52b9e440408592f", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_OutputARPRequest_buffer_alloc2/README.md": "93506f031fd2552b5892c1257925cba330d4f1dcf38c8f8ea7fc0a65c871d796", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ulARPRemoveCacheEntryByMac/Makefile.json": "f7db10c26b07d66c3109a068d9678f3ae5aa2c2d344eb1fdcb0814a5057207c3", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ulARPRemoveCacheEntryByMac/ulARPRemoveCacheEntryByMac_harness.c": "c785b6e319302226dc5bee6d9efe9df521051849b1ec253cb919c51e265d83bf", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/CBMCStubLibrary/tasksStubs.c": "4bf5c310c91f77e06e35af264151997cff2942e2e0c39b7f1604a486a68841cd", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/CMakeLists.txt": "52530e97d5d959bdd795f264974680a2849147c8809809cfecaf814422dc7d91", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/CheckOptions/CheckOptions_harness.c": "13ec4642c6d4a496a699227395c9d954ec2e0f85d78f5458f88c8187df5e0450", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/CheckOptions/Makefile.json": "ab871a90c3db97a915aa03ad7c61058a34428f97a7e8a86faf8c4ce273b49d6d", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/CheckOptionsInner/CheckOptionsInner_harness.c": "8f035b1e329d91be5dd56a094e4061d81d4ade5b5ad5f4065dea1cc491eaa5b5", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/CheckOptionsInner/Makefile.json": "49a1ea8e8f3b6c11d68952127e80284d82c7e8ef9b2570ed09ba41b3997a4066", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/CheckOptionsOuter/CheckOptionsOuter_harness.c": "96078cd7c26d07e3cd0b18034d46d90a732525d459fe0de00b2619daa5fbf9ad", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/CheckOptionsOuter/Makefile.json": "58ae4c249a87d9b29a874c102477d2265a338877749826f0cd95a9554467c3db", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DHCP/DHCPProcess/DHCPProcess_harness.c": "a202679970d0dda17a807c03eca7802efc446548c7be16ec3f3784910e916c04", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DHCP/DHCPProcess/Makefile.json": "626d63059105ce1514643147ddffc3988b1d546044b386a03535141e3f6e2759", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DHCP/DHCPProcess/README.md": "c085d7c4281dcb90bac65ba018f23cc99cc87fd8881db09c6e705e2439d01ca8", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DHCP/DHCPProcess/cbmc-viewer.json": "f7a7c8742c7a39f6e32d8b98e7545737a3c8e67fa943d0c292155f1d672e6eb3", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DHCP/IsDHCPSocket/IsDHCPSocket_harness.c": "e9fbb0aef0a3835206424b14e9c5c9b751834b7b28e1acf9d078ead2e91c406c", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DHCP/IsDHCPSocket/Makefile.json": "11d5ee4689ca8ca9ba9b57e8a3cdd337ae2b8f11dfdc8765eee8f6f0a1c00388", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DHCP/IsDHCPSocket/README.md": "e75d815637ab4e1815813c0dd0b49fc468ae55a06086fa5b3c0a64af4f0d0f0e", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSHandlePacket/DNShandlePacket_harness.c": "a5107448bbbc99321863bf4ab90072b70152bb6705d9582def020224ad90932f", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSHandlePacket/Makefile.json": "1ef08e9c4e70cd511f8b66de06f51df6f589ae92eb45a3d4d9398ee107101ec3", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSclear/DNSclear_harness.c": "9923b82ec4c04a108476081b2f66d2638ac350e18fc81a642c9f9de8b99006a8", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSclear/Makefile.json": "9454ff95399695f3e98878be8bdf99db80b305161abdace383c1098c69d016a4", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSgetHostByName/DNSgetHostByName_harness.c": "06545980dca3705c0b9fe9c7e94968ff74e3332cb8121c099f55cf0c85791ac1", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSgetHostByName/Makefile.json": "cf3edde6e69558394995861c5794aaaaee616b991ba20d2f45e5679536a32bd3", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSgetHostByName/cbmc-viewer.json": "56121f38e5cf50cb05e1bb0135469eb1a9dc32e5065f8fd250efd15b79e5097c", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSgetHostByName_a/DNSgetHostByName_a_harness.c": "22286b404c8e6ba1956968ccf079615d2d096c64255c1383bbc0f501301a79ef", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSgetHostByName_a/Makefile.json": "be12e2d37c1d3dfc61e13e36c975cb14ae826736b66d92aa47769728df2526ee", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSgetHostByName_a/cbmc-viewer.json": "8e50503d9a4d8ae8c90390f2191be8c1b2f6f9303cdfb3cc585890df6cef5106", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSgetHostByName_cancel/DNSgetHostByName_cancel_harness.c": "a583aa89d8e7a053f46d72906017f84364ae9f9f2a8106c34f0f62256e2c567d", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSgetHostByName_cancel/Makefile.json": "f2ebd17622bedfbc6354a93115bca218a67696917f04317a2ad514d4f50008cb", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSlookup/DNSlookup_harness.c": "c8efbdd6ccfdddd9c768aa661453fe13c7557147c3a0dc5edd4d9bb6fc44b5ab", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSlookup/Makefile.json": "be7a119d2872edfa54769c8591c1dee92be218b2756b87017dc4f9a3e5c181d1", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/IP/SendEventToIPTask/Makefile.json": "c89609bbc34e988316f7deee374ed7a184c5d72e1d37cb09bd678a8983fbbd57", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/IP/SendEventToIPTask/README.md": "170aa9d950c8c2d04dac100d2ac75abfa0923a9ecc44ca25ce1da56e759acab5", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/IP/SendEventToIPTask/SendEventToIPTask_harness.c": "b0710b779714c722a3015970547c1745cd8a76fd0983ac4529c457edde939817", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Makefile.template": "f9876adf49fdeeb7badd4b21f5c6401de6e60a01878585963824d7052e32de50", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/MakefileCommon.json": "52a93cc0fe508c389057dc2983dc0c05721dbc1cd3742de97a0dec3258cd6d04", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/MakefileLinux.json": "975704e91f7538aef7031a454b2698834ed6408fa8eac0cc384f52c97c51c354", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/MakefileWindows.json": "cf34143c0c3c02b8b540fddd3ea87bced19c108b31090b4b4366e3edcbad8eb5", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ParseDNSReply/Makefile.json": "d368ee8897627f7ff790f5741b253a1053ba99b414582bb613fdeed4cda9ca67", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ParseDNSReply/ParseDNSReply_harness.c": "ba35b5d25b88a77944ddf152c8c3b162179838af193d7bc6ba9bb3c1fe676b21", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ProcessDHCPReplies/Makefile.json": "a4161729dc2e6b14638f16054abfade2222aba1f25eefad03accb2b935e2fa48", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ProcessDHCPReplies/ProcessDHCPReplies_harness.c": "024926d52d97b62728db7bba8c1fdcca919188a0ac4350867d71efbd3368c6e5", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/README.md": "fa4ba1c3a3b5a88c86b821f7d0aa22eebb9e70046d43dc460fac7d5892f2b7d9", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ReadNameField/Makefile.json": "5d51a30c1aa7a8f4aa7492eb0d14f68b0964e4e0c74f3e0aff93a513866e8a86", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ReadNameField/ReadNameField_harness.c": "34fd7098fe8cce44dccdcba0e445b725ee1ae7622fa4903b9344f4d45ded1bb8", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/SkipNameField/Makefile.json": "96adeffeb4bb05ac86708e8341a23f7cb35d6031cfc754a3b8c328e0bea798f2", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/SkipNameField/SkipNameField_harness.c": "a66f3a724513e7044bdc2e7b3b40c40f337ddb81e65780ddc96a817eb4bc77d2", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Socket/vSocketBind/ALLOW_ETHERNET_DRIVER_FILTERS_PACKETS/Makefile.json": "46c28281e416d166bbece766ae8620d892318dc883b04628ff54eeb913e631fa", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Socket/vSocketBind/ALLOW_ETHERNET_DRIVER_FILTERS_PACKETS/vSocketBind_harness.c": "63f6244069aed974439474296503f8a69527816be7908c8529f0e076d02e714c", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Socket/vSocketBind/ALLOW_SOCKET_SEND_WITHOUT_BIND/Makefile.json": "bf1b01ad19681cb943de52c088c068fce196cc6f6517d60d213351624fc8a3e9", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Socket/vSocketBind/ALLOW_SOCKET_SEND_WITHOUT_BIND/vSocketBind_harness.c": "335effd49efa9e747ad2e0660934b00ae69177f55a99ce5c2f6c35738575fbc2", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Socket/vSocketBind/DONT_ALLOW_SOCKET_SEND_WITHOUT_BIND/Makefile.json": "602c647558918619a24613a03ef3dd11e61ad98c3c32a7355dcdefb2421a44a2", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Socket/vSocketBind/DONT_ALLOW_SOCKET_SEND_WITHOUT_BIND/vSocketBind_harness.c": "c1c3482d895f8ac28089ff52abc33a7409d279e97bed71d0d9e3174522fa56df", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Socket/vSocketClose/Configurations.json": "1165ac6563b46322ac0807ab4d003f4d6c550b1380323fcc41aeb1324794aff9", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Socket/vSocketClose/vSocketClose_harness.c": "ae7a5f87cf16de5926490aa615c74513c3d64eb154b4ecf24e58b4bf9a7203cf", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Socket/vSocketWakeUpUser/Makefile.json": "08b26aa99518b3af8b2eab242cee7bf87d8d61f3e9ead6dcb124d1d956699042", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Socket/vSocketWakeUpUser/vSocketWakeUpUser_harness.c": "2345b200f4dd68bff538749765624e1b5c869b5de08933a352c82755920dda85", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCP/prvTCPHandleState/Makefile.json": "d9adb5a9fbf7bcf1a78e165ff992813d7512c8d0da80cd5dda378a7828d2dc3b", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCP/prvTCPHandleState/README.md": "f9f898124416839dbd3b5432a5232d3800185f2b1ded1bcd18ea66db5a71214a", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCP/prvTCPHandleState/TCPHandleState_harness.c": "c3f253f5fa6fef9e5556922bf4514f14716a3cf884e7fb58d8c19be28aaab850", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCP/prvTCPPrepareSend/Makefile.json": "5ee4ff453c7fe12ed33e2996b7dc4b227a05012d7872d59ed467bb248e2dce6e", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCP/prvTCPPrepareSend/README.md": "df7ed64ff377c328015e55520a5f267615ccf49505348382958115c818486819", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCP/prvTCPPrepareSend/TCPPrepareSend_harness.c": "ef35858a9a2191cd606f0fde111b646614cfc6fc90e55ef9ae87c8971408b1f8", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCP/prvTCPReturnPacket/Makefile.json": "50cc89565a5b5fd2faf12345b74318e960a1bfeedafa0993b3c7cb564961b46b", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCP/prvTCPReturnPacket/README.md": "c4707f113833ceaf60866136d09480c057efaea25584ad5364cf9d778000e7e7", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCP/prvTCPReturnPacket/TCPReturnPacket_harness.c": "4c6027b8268942c29464c6d01da6dc100f12c75cf57a2d4d38ca6eb20c2c4307", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCPWin/vTCPWindowDestroy/Makefile.json": "7521b2f78e2495ecdeb0a5256e4f6d625af702f96680d14b06653d8166143b7d", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCPWin/vTCPWindowDestroy/vTCPWindowDestroy_harness.c": "eb69c5897a89cc25abcff1a3ec2afc2756f4b74423c8b2afbcac03e27c52c93e", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/UDP/vProcessGeneratedUDPPacket/Makefile.json": "69bfae7729f172b2150ac378a293d68efeea63b32a9e8c2bddcb62e74cb3e523", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/UDP/vProcessGeneratedUDPPacket/vProcessGeneratedUDPPacket_harness.c": "2feee142d4d62ef6e80ab173da92cd715334bfbc43bda4dd52783c93d4f41071", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/__pycache__/make_cbmc_batch_files.cpython-36.pyc": "721f69b4985c50b5505fd37e7773be9f3baa766fa64026fb76f8d536e8435653", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/__pycache__/make_common_makefile.cpython-36.pyc": "7831124fdcbef17be51b7a07d72c9ad9d8d5d1df94b8b57fffac144a6c4df8b3", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/__pycache__/make_configuration_directories.cpython-36.pyc": "e9820d84a819b38a360baa6e1595cb0e4ca3d6694b4919cdd9083a65fc721c34", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/__pycache__/make_proof_makefiles.cpython-36.pyc": "1562d46a0155df32cdc15e663b7a117ff2954be6d9ba7cd3a03888168318a16f", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/make_cbmc_batch_files.py": "00df8582a3027ee0d2163dec55ba726bae3fad6ff311b22533bdbd9d8a0e8dd3", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/make_common_makefile.py": "a1f27cada426ad99d7ab90750f82d08b1c740598adc8a0624bcc888ffefecd98", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/make_configuration_directories.py": "33ec0021618c28068235af604c8bffe707dd8b0b50ffc1be20af272933bae02e", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/make_proof_makefiles.py": "8025bf79c7a7df6436b747b160dccf6adc2ba0d76738c6e8aebbea3e6ba1c0f0", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/make_remove_makefiles.py": "0b6a9b94719f649f93fa11c857484ec4927c50470dd607a49d88c5ebae1e99c3", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/make_type_header_files.py": "3ded76b45610b413e5b625abe5e55a41c2704392169dab6a501445d73fd37642", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ninja.py": "4ea9d353d825efd3f6dc94532cdf3e1fae680ab6a04872f62d2184dec24e7211", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/parsing/ProcessIPPacket/Makefile.json": "06140eba3a858b09047a1e2a09e11250b8c5c1503bbefe027798c299deb6c54e", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/parsing/ProcessIPPacket/ProcessIPPacket_harness.c": "5f25a3058f9aa91b31b5cf8ce6f3d97dd76741b6815b3fc33c51b5a964498877", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/parsing/ProcessReceivedTCPPacket/Makefile.json": "e1df2b5f2f615da68fa4da19de2429bfbb921d826cab160f25e39ccddf6a0676", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/parsing/ProcessReceivedTCPPacket/ProcessReceivedTCPPacket_harness.c": "f6b193bae898cee51b17a246921b1a6b3269d3be234409321cd43695136b09a8", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/parsing/ProcessReceivedUDPPacket/Makefile.json": "b29e945524a08d3dac189046e3e308d76a8610c8f61b5e9a2970184baa3a8728", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/parsing/ProcessReceivedUDPPacket/ProcessReceivedUDPPacket_harness.c": "e153a20de6b79fdc5a778f7c1250d3d55ac673e746a67ebf4f6650a296150783", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/prepare.py": "0fd5d2ad2cac14176330cde62826a853d4f4293d1a0441a2ab017e4ef252fecb", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/prvProcessEthernetPacket/Makefile.json": "b33145dbe58bb50b9ad32f04950b1c1e48b744b2ef8ac4a41a8e4fe0d82611c2", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/prvProcessEthernetPacket/prvProcessEthernetPacket_harness.c": "3471c1d5fc60a0e3053f081da85b1f5bba3ea1eb9e1a9334f99a320a52d63d2f", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/run-cbmc-proofs.py": "9ea1c57bbeb22242e8c830173cbe1906b821c2616013f62312a3c032a5f54686", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/utility/memory_assignments.c": "265d586bbf6fe31f3269e39f5b8cef9ec061d7cadb32edb6a896b835ad8390ea", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/stubs/cbmc.c": "d7406c1c0f880e7a73ff745545f5967c5f7b751e4816d6f7fffce9bfc0a6fc83", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/stubs/freertos_api.c": "cc1aebf98653d7f76996a688d897fd4eeb31ab4c26a6c26d20c8614eec24df30", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/windows/README.md": "fcea1660eaa6aa884003c87ad2092d5465e2f9355b82d98eacbe094e431d762e", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/windows/WinBase.h": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/windows/Windows.h": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/windows/direct.h": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/windows2/winbase.h": "44bac2a6b8cfbb11e3b4c27adb78bfe730cea8da62eb75be420eb0499d006652", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/windows2/windows.h": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/CMakeLists.txt": "1f39e3090be8d52f89debe6f54cd651f3d1c56a9d29150888cc60a9984ba1155", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/FreeRTOSConfig.h": "8762872d3a508e141a4b67c9c65721363868c83b3934689692392928a87efd40", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/FreeRTOSIPConfig.h": "2e999a469c09573cb6be76a149f547149c3515145ed450ef2674a741adfa9ae5", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/FreeRTOSIPConfigDefaults.h": "c8eb46dae180686102fb0f1ee06140bcd4041a01dd3d6e4e29387babb3b3cf03", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/FreeRTOS_errno_TCP.h": "d4caee738c896606b1d77940c572a60fc95629d74b510dad4f2e55893b895f24", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/IPTraceMacroDefaults.h": "56fa5f9875e92e4f30163a25d0ef63fbe171a3e22a61f9866859fced2565bb00", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/NetworkBufferManagement.h": "500e817036af01d88b3316c6f275bcc9ade09896eba034273b5ecde538ac4a14", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/NetworkInterface.h": "d8efdfdd8048b1928cad1a3b344916f2743a647e931130ff5bd9f00e66a509e5", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/WinBase.h": "9fe50d95cffddb9800ebb400c762c7bb7e7ece820ab4ee790c6c603eefbbc590", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/Windows.h": "9fe50d95cffddb9800ebb400c762c7bb7e7ece820ab4ee790c6c603eefbbc590", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/pack_struct_end.h": "a5628c709b78400763ccc6e0db1b45bc60b0253f0be8c7f637b7560e18b10047", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/pack_struct_start.h": "71ee6c7854b738c210a91c68d30ad4a6b4d4c5ba64f2cc0510ecfe77e037a75b", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/portmacro.h": "a1e4bef1b700ac9fb9d2d6f02e2fea3d1c1ada009790738668a8359b6e264d38", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/FreeRTOS_TCP_Unit_test.c": "f283e74ecb1912fba3cc8664186301b39a75337aa48e7f03227274f97f98d376", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/README.md": "c8396e1f028fdc6c4cfce82eb8987536484f61f2dd6cd84cda6226b9b8d4c487", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/TCPFilePaths.cmake": "9f330dcefb76567591969a198674b14d2101871173d22546c6e857770c8f8f83", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/cmock/coverage.cmake": "e155a5a4f89869c40aa52fd6b81dd6df0ba83dc01429d756c6a9cc382cee2b16", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/cmock/create_test.cmake": "29f47f117ac31311cd2c903185da0a9cddc7efbc4603d4093bfd673dd6897502", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/cmock/project.yml": "81e1d57b8a8b724ab9be3ac0985b800eea0271ec7c53d513ce22e2b371dd6060", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/cmock_build.cmake": "90a0d545d0848194b28b86ed0d0815c4bf9ddf6cb4a9f6aabf9259d63e669524", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/stubs/FreeRTOS_ARP_stubs.c": "4d9c33ec2705f90ef074aea7553058c200108a0dbc1f96a59774f7a859204cee", + "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/unit_test_build.cmake": "24d557a556205517dbe65de1dca22b2f454fbf294771d0cd272ed3a404166097", + "libraries/freertos_plus/standard/freertos_plus_tcp/tools/tcp_utilities/include/tcp_dump_packets.h": "5698278f5b08a81788087c959058cf8d160328d02024b857542236def8ced28d", + "libraries/freertos_plus/standard/freertos_plus_tcp/tools/tcp_utilities/include/tcp_mem_stats.h": "acde50800ea92d1776fcdb90e7d0d5406cdc07829d41ae370f322da3f71e4b41", + "libraries/freertos_plus/standard/freertos_plus_tcp/tools/tcp_utilities/include/tcp_netstat.h": "6a918f1867c970864abeccad8809e61bd66d2a391dc544d1da85055c18219994", + "libraries/freertos_plus/standard/freertos_plus_tcp/tools/tcp_utilities/tcp_dump_packets.c": "25696067947f82c80655e141eb96f806f203ef1aad7a93c9f1d2189bc5619d16", + "libraries/freertos_plus/standard/freertos_plus_tcp/tools/tcp_utilities/tcp_dump_packets.md": "b516c055037cb3e626e020569ea017f45f67b2c6a315539670807da107e04e62", + "libraries/freertos_plus/standard/freertos_plus_tcp/tools/tcp_utilities/tcp_mem_stats.c": "3b1f0dc9c84bc9756b675e036060335c2cc8905c25efde3d133375023afa88c1", + "libraries/freertos_plus/standard/freertos_plus_tcp/tools/tcp_utilities/tcp_mem_stats.md": "5e3c6c46e2cc64f7fed92c9e4fa3cc06ca9a64ac79c8ee62a3ef9485c7f2b6f1", + "libraries/freertos_plus/standard/freertos_plus_tcp/tools/tcp_utilities/tcp_netstat.c": "4432888f81412aee9f48989d132dcabe09bf0aa7aa4b7008282e98befbc7af8c", + "libraries/freertos_plus/standard/freertos_plus_tcp/tools/tcp_utilities/tcp_netstat.md": "cf041fbfd893defddc4ef9c9f51f3824e69e5fa56c9558a436a3b21de9298255", + "libraries/freertos_plus/standard/freertos_plus_tcp/tools/uncrustify.cfg": "55c02144fdaa3d62e03ed97e3e89a54b67d9433a5320ec02ec82e75344b21656", + "libraries/freertos_plus/standard/freertos_plus_tcp_utils.cmake": "9d414393edc498f8334f2f53675b1a134ccf884c0dbc3c243b5d399bc51f55c5", + "libraries/freertos_plus/standard/tls/CMakeLists.txt": "cf0ef0baf3fa24b73cc492a69a82e6b6f02f1aa0b413aea63e48795c37ea7f77", + "libraries/freertos_plus/standard/tls/include/iot_tls.h": "ee45a11ae88e7d22d9762b72117e2b67c17547376cf51db61ecc1d5e5a100780", + "libraries/freertos_plus/standard/tls/src/iot_tls.c": "cb2faf53ab378b6afefd2d976dee724a3bd7b147738919a6d7d1a8cafc2434ba", + "libraries/freertos_plus/standard/utils/CMakeLists.txt": "c26d41b8c622dfda9f55c41d6057415a4724ee7c5c569762e3d0297eb1c8472e", + "libraries/freertos_plus/standard/utils/include/iot_system_init.h": "2cb083ba7e32cfd7042bd1c4c72b73c73def1f054b5420f5dc40bfa46cce1242", + "libraries/freertos_plus/standard/utils/src/iot_system_init.c": "e563c4fabdcc6450ea0bb36eccabaa4ac77f834d8b7e497a65a7281b50b15bb8", + "libraries/jobs_demo_dependencies.cmake": "40d91d005bb75b44ef028d2639ae8db8b1e4c91a359626c94f3c6c39c4e6c566", + "libraries/jobs_for_aws/CHANGELOG.md": "0bb2d630437bea721220901923798c76b0a90d11d7acd1d22d200f8032ef3092", + "libraries/jobs_for_aws/CODE_OF_CONDUCT.md": "34b6c98d5c23127ae6769e95e483e5bf6d3704ae1f0d3ae4e69d15f4ede118b6", + "libraries/jobs_for_aws/CONTRIBUTING.md": "53d9deaabb4f35deb79bb7def2c10ec97bc1fa0f87ba76750555f095df81dc17", + "libraries/jobs_for_aws/LICENSE": "52f54173fb286e7baa536bab3fb2aef58891af07e96646fb4d80663fabdfdcfb", + "libraries/jobs_for_aws/MISRA.md": "9591e3ff387b720d4ff27337e1200d66b250df6bc67e933dd139f3fb581a47e0", + "libraries/jobs_for_aws/README.md": "c001ad7d01d75f8258f07ae2ae5c9785e485068e3faeb0d8b4c7d00e576a37dc", + "libraries/jobs_for_aws/SECURITY.md": "ff53e3502bc39dac4a7074fe790f663c56d6c7aacd5b66dc648049f685e1e44b", + "libraries/jobs_for_aws/docs/doxygen/config.doxyfile": "ab66418ba6bb60cd796ba162e1d791da2c2f1b90e834ac500755b9f85697e371", + "libraries/jobs_for_aws/docs/doxygen/layout.xml": "555a70789f54c525456ad9d30730614fe7119afb8b81dd8f8067af28dd14f66c", + "libraries/jobs_for_aws/docs/doxygen/pages.dox": "9b4d8278094facacd078fc20e9c1ff2fdef15956c4b55301e50560a9723dafbe", + "libraries/jobs_for_aws/docs/doxygen/style.css": "e3d3b4438744aa4d547bcacc6e64f3fcfc5057b476c5237e5107e6bbe0aac72a", + "libraries/jobs_for_aws/jobsFilePaths.cmake": "d3087ed94ffc75978efbb1a9b65b814e932c3fac918d9fd1126483ae9c1e2201", + "libraries/jobs_for_aws/lexicon.txt": "a335ba2217a9b48b2e11655567be4cd8e4205d93ed325b04887af35b85a62d39", + "libraries/jobs_for_aws/manifest.yml": "6bbb95b909829bb74b0c2f53a761d0ac55a0700f8fd8ccbeaf9457ffe37a5d76", + "libraries/jobs_for_aws/source/include/jobs.h": "5636d57de291d44b8bb17c5bc4c86a32879f7ea8b33a0215b073de598c2a3516", + "libraries/jobs_for_aws/source/jobs.c": "5c3b61fbc6efe600019bc2d4e41cdcbb19cefc2c0eac6de62127bec6ab7301fa", + "libraries/jobs_for_aws/test/CMakeLists.txt": "6deafc861516f7a851f204ec647d2e2b28fe261a5f54d03247e2390d7e64cfda", + "libraries/jobs_for_aws/test/cbmc/include/jobs_annex.h": "8186b7f577161f7d14715a48d3570824daaa0397a699464bc31bdff0d7f772b0", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_Describe/Jobs_Describe_harness.c": "39b36c6cda388ec3652dc3e39dbaec4fb2f306dde99943b3d80532669bc798e1", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_Describe/Makefile": "6190042ebaff0a10e5120fb954863a3877be91551d35cc41598a8065e9422329", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_Describe/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_Describe/cbmc-viewer.json": "56c51e53715ad3571a4f9128294810f61548b5c3a8afbad2d0e1212281cce9e6", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_GetPending/Jobs_GetPending_harness.c": "98c03e5482b19483a3589ac56cffae3988a9d3f5ac1cc2dbb9dd0d9ee792beb8", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_GetPending/Makefile": "53e8b18bc0b649145f99b5447cb76a066a9c7506ac2a3b0209c5494972944e47", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_GetPending/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_GetPending/cbmc-viewer.json": "430353f545d70238f34acc2116e5581356ccc290dd76e17664a59e6279332f43", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_GetTopic/Jobs_GetTopic_harness.c": "f84cae35bc88baa339825e314c04e98a95097ad0255dcbb875e914ea9c691857", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_GetTopic/Makefile": "dac91252d1eb79be142ba34283c6aa01d9cd5782dba9ebd683addb5ca0582f07", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_GetTopic/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_GetTopic/cbmc-viewer.json": "746dd960eed2716b927b81a2a71dcc13ea498e351433880609b7b0e480de185a", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_MatchTopic/Jobs_MatchTopic_harness.c": "2c85f5775e28eabbd9c54e467fd22ec6d509895c2de30503c036cd3d354b842f", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_MatchTopic/Makefile": "3fb470b9d88128cd5e877e587238434df2b6f74a1d1be5485703e0ac74172874", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_MatchTopic/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_MatchTopic/cbmc-viewer.json": "0325946e1f20129eb116942304d681f41cb689b59d08618475711faee1e944c5", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_StartNext/Jobs_StartNext_harness.c": "e11ffa7847475d31dca19bf538560818bd8b68c33eb42dd965bd9da7c4effd28", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_StartNext/Makefile": "11e87487163e26f7b2f520fb669c5f0c180ddf9da83d282fa268c0f442575319", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_StartNext/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_StartNext/cbmc-viewer.json": "e4fb038561f4e438c298b7b30d0143b848ce18b1192a1b77dd35184841a92ad6", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_Update/Jobs_Update_harness.c": "45fb27565ae9a673534384590870fff09c61f874b5886cc39b57769485255ac8", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_Update/Makefile": "be59e11bfef189d1af6b53242bfc7aa47e71134023020ea38acfb67eff772ddd", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_Update/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/jobs_for_aws/test/cbmc/proofs/Jobs_Update/cbmc-viewer.json": "2e877e82d46bfa321d8e7f66ccad42429d9c10f897442d717f51ab9e8760a6f6", + "libraries/jobs_for_aws/test/cbmc/proofs/Makefile": "c1d36a39f39be91210133b2603ae89498f341cb16909ad45e8c26ac972031011", + "libraries/jobs_for_aws/test/cbmc/proofs/Makefile-jobs.common": "f2caa34e7c1c09a129d1bf20f44de38acde3b339c740afbe7099ef61c53a6872", + "libraries/jobs_for_aws/test/cbmc/proofs/Makefile-project-defines": "6eff809b1ed8668cfee5ec121780a92ed9674e9219560fffa8d90db624fa18a8", + "libraries/jobs_for_aws/test/cbmc/proofs/Makefile-project-targets": "16763b7ce1babf81ca45e9e2be29af49ed2e09b476a2687e1710632ccd50108d", + "libraries/jobs_for_aws/test/cbmc/proofs/Makefile-project-testing": "daad04bea5682eb4450d3cb65cd37d5bb822d487a5db0c2fed58fd188c02f052", + "libraries/jobs_for_aws/test/cbmc/proofs/Makefile-template-defines": "50b3687413c3a9a1e42a62954b1007e270fadbfda068fcb8e796b1862563507f", + "libraries/jobs_for_aws/test/cbmc/proofs/README.md": "5adff57e2d2a6544d212c84bb5809dc2c2d5aef02ee4832633f59678b3f29240", + "libraries/jobs_for_aws/test/cbmc/proofs/run-cbmc-proofs.py": "b37b71fb8ccf4b101ea1ffc65107c857f45fa6e228f1eb9e2041c017efd3319c", + "libraries/jobs_for_aws/test/cbmc/proofs/strnAppend/Makefile": "7c872d86e1041b74d87313e4e5b9f02c71a1dc813e72033a1059dd0ac4d5ec17", + "libraries/jobs_for_aws/test/cbmc/proofs/strnAppend/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/jobs_for_aws/test/cbmc/proofs/strnAppend/cbmc-viewer.json": "2eae33de0bc128cecf57c857585b48f74f052137807b3ece7639ddc4d027df85", + "libraries/jobs_for_aws/test/cbmc/proofs/strnAppend/strnAppend_harness.c": "810eba4e0e56007511f0623a1e9a16f32183353a664d87fcbb0062df16705a74", + "libraries/jobs_for_aws/test/cbmc/proofs/strnEq/Makefile": "6a4d33b3cc46fcdfc70b668e63b417712cb7da8ca1670b3ea9471ef06bc2a5d2", + "libraries/jobs_for_aws/test/cbmc/proofs/strnEq/cbmc-proof.txt": "7d902cf8fefe06b80fb9fde9e318ebb543a217aac703a6e4c72aea7b0da71eb7", + "libraries/jobs_for_aws/test/cbmc/proofs/strnEq/cbmc-viewer.json": "d14104e7347b9da636032cd236bf7a697bda1ea4f2f4c5705b331056259c30f0", + "libraries/jobs_for_aws/test/cbmc/proofs/strnEq/strnEq_harness.c": "97ec7abc9ace548d67757f67e8108231a1951d6254840aaa16e5af5d5556f954", + "libraries/jobs_for_aws/test/cbmc/stubs/strnAppend.c": "772b2bc8f0d7b9bdf4d3f37e68a467b39602a778b60aa9f991cd289870ccf06a", + "libraries/jobs_for_aws/test/cbmc/stubs/strnEq.c": "459c28b59feba8739a603351a54cdf9e8cfc3f0ccabf45f69c1879d5448f84b2", + "libraries/jobs_for_aws/test/unit-test/CMakeLists.txt": "1a40c32dfd0d259d179ac1cd70a1558f15d57685843ded616931a1c870ad6abe", + "libraries/jobs_for_aws/test/unit-test/catch_assert.h": "8dca7666e86fd56c544650456dfb261315c60e3d2d365e50ccb35fccaf9d7f61", + "libraries/jobs_for_aws/test/unit-test/cmock_build.cmake": "f7e241efa214d79cb74a29cba48a5338eff1ee6152fe50f0a286351b8b1ccb77", + "libraries/jobs_for_aws/test/unit-test/jobs_utest.c": "0147de170cc197deefe09abd27fd12ad8d18a24840c78f9b55372f04b9c3caec", + "libraries/jobs_for_aws/test/unit-test/unity_build.cmake": "0bd532c05dac6876647508256c5c50ff87b2c2017ab9e3cb866cf0722edc1ddc", + "libraries/jobs_for_aws/tools/coverity/misra.config": "9e43cf5f5988f6d32166fd4af9443b98c17c50dfbefac82188d8a8e987b44964", + "libraries/jobs_for_aws/tools/uncrustify.cfg": "55c02144fdaa3d62e03ed97e3e89a54b67d9433a5320ec02ec82e75344b21656", + "libraries/jobs_for_aws/tools/unity/coverage.cmake": "44684d66e5193f6c54e47c677c1efd3251f4e83c9893e336918dd90e72c922bd", + "libraries/jobs_for_aws/tools/unity/create_test.cmake": "086650d12714429c4130c386417e1aef985421f26c4c82a209ac0d40f71c1cd2", + "libraries/jobs_for_aws/tools/unity/project.yml": "12130e50fcf569eaee1c82ebf43c3accfdc599b0f42064ea6819a49f2089eb2f", + "libraries/logging/CMakeLists.txt": "2c536c9a42538b4866d98854dc8dcb1489f3cd1843d5dd87a6028bbbd39068ae", + "libraries/logging/include/iot_logging_task.h": "1dd75c6a35463ad2b2bfa522c74e9490ee788613de475b2bad7b5ead873b622b", + "libraries/logging/include/logging_levels.h": "344ef517508655a954e0efa052423015c5bbd9e20d4e19f59e83d8eddf09e581", + "libraries/logging/include/logging_stack.h": "459650dca0b8e2a5045b93dbb4b2dba65aee30c8c0ce1f4e58b35b3ea06eadd5", + "libraries/logging/iot_logging.c": "d755884d3106c4365ca0b57ee197bcdee4e3348b2f6ea39cac1635d526f6cceb", + "libraries/logging/iot_logging_task_dynamic_buffers.c": "97302d6a5ae10e9e37eeaa5c580ab23b0d6fdca98d85e69363be23dc596ba87f" } - }, + }, "minimal": { - "optional_components": [], + "optional_components": [], "required_files": { - "libraries/abstractions/ble_hal/test/ble_test_scipts/attributesCommon.py": "a4eca76d9a909cdb35bbb3b8fc2f08248900935ddcb26119cadf7a12efd9bd18", - "libraries/abstractions/ble_hal/test/ble_test_scipts/bleAdapter.py": "f5f102eda56dc3e4a9dd5d217a76451cb3d98ccc325a26ff371f0ba183966bd0", - "libraries/abstractions/ble_hal/test/ble_test_scipts/gattClient.py": "d2aca12ed4a620fb9009eba16d5a793d9d4b81b617c4b405d5e29ebdfd997b10", - "libraries/abstractions/ble_hal/test/ble_test_scipts/runPI.sh": "226ef495cdf367d326398d62b348a991cf01a99dc3df6e4a9eccfeb153ae948e", - "libraries/abstractions/ble_hal/test/ble_test_scipts/securityAgent.py": "108f4a63557798c64b740e0575ed699426782b0398ccbda4f60ac793089ccab3", - "libraries/abstractions/ble_hal/test/ble_test_scipts/startTests_afqp.py": "3a71d8b8cd82604d3344fa3110d157a9d01d3faa0e0613116a17389f7572c298", - "libraries/abstractions/ble_hal/test/ble_test_scipts/startTests_integration.py": "30b41b42d04a777b0f5b4cbfef43738868946ffa69cf2105b113a9ca7f88fe43", - "libraries/abstractions/ble_hal/test/ble_test_scipts/startTests_kpi.py": "7dfc4b8cbbf8795f7f054d3be9b3454f49666253573f7d6f2642741c344e8e55", - "libraries/abstractions/ble_hal/test/ble_test_scipts/startTests_stress.py": "91a6b6781284cd1b1f87b391d3695c96e673bf2e2e96750d28b8dcf1d858c251", - "libraries/abstractions/ble_hal/test/ble_test_scipts/test1.py": "0b22ea40c1bdb550d0b1dac1d91427b8811b8ca5f09422290be01baa9e42c05d", - "libraries/abstractions/ble_hal/test/ble_test_scipts/testClass.py": "f7e4fde0bbe016db98f9d8e432c189c8c42751afca9638569f4aacd431bcf0ad", - "libraries/abstractions/ble_hal/test/ble_test_scipts/testutils.py": "1e571b073d6184e95cd6e61d56f0c927d8f9882bcee1fa421e3ef221c31fb463", - "libraries/abstractions/ble_hal/test/include/iot_test_ble_hal_afqp.h": "4660cd048278613d15508bc9da70e556ad1e7d0e7efafbdbe7f1e7628de65cfb", - "libraries/abstractions/ble_hal/test/include/iot_test_ble_hal_common.h": "d6f84a433d8fece87d6fd1272a16b10e732b87e6dafea43275080498b8e5c8e8", - "libraries/abstractions/ble_hal/test/include/iot_test_ble_hal_config_defaults.h": "c903363afea6d4a48734f86e00e4779e77f164f0216a91d1794bef763a6a8f00", - "libraries/abstractions/ble_hal/test/include/iot_test_ble_hal_integration.h": "65ecd0a669f46385511d35335c7ca8f91e9df208f26e13265fc9ad22131639d8", - "libraries/abstractions/ble_hal/test/include/iot_test_ble_hal_kpi.h": "90ba3933acf588b1b37d237d30b2c99365b5c446d0a11485f6a598c744d7985f", - "libraries/abstractions/ble_hal/test/include/iot_test_ble_hal_stress_test.h": "c5607433cc84241984a8be56831f194e99ce85a8da3db2d46a22756fcf05a115", - "libraries/abstractions/ble_hal/test/src/iot_test_ble_hal_afqp.c": "d1855070ee01326e637e31c1a29973ddfaaa7465546527199b590a84135cc6ba", - "libraries/abstractions/ble_hal/test/src/iot_test_ble_hal_common.c": "ee89287628d854d7925f859408f534b17dacfd745bbb139b3c76b22872e823ca", - "libraries/abstractions/ble_hal/test/src/iot_test_ble_hal_integration.c": "cdd5fbf8fe82a42efc68017ac2f67b32fce69727da75f35430da19a72d4a0c99", - "libraries/abstractions/ble_hal/test/src/iot_test_ble_hal_kpi.c": "576457c49c0ae59204acda3e13e476cf614807a8cae793c06aa56dc8db42abec", - "libraries/abstractions/ble_hal/test/src/iot_test_ble_hal_stress_test.c": "85eb3f0bb84c078592a962398a615fe8c0f6bcdeb2c0875bd2fc96ed4e5e00c8", - "libraries/abstractions/pkcs11/test/MBT_C_CloseSession.c": "dd0a10f8c684fdfd9df5746b1edf9f5515d9d359a52ce1cdfc1c9de698cb14d2", - "libraries/abstractions/pkcs11/test/MBT_C_DigestFinal.c": "09247bf02ede9693829c2c7561427f02b1cc80e0ed06895d41f8fea6691f63cd", - "libraries/abstractions/pkcs11/test/MBT_C_DigestInit.c": "897f35f2595b614b555f04cfc374c70e6e4654002ce13aacd61cae21d4d91d73", - "libraries/abstractions/pkcs11/test/MBT_C_DigestUpdate.c": "b299d85f8f803a221dd9d40f9d7490f57ed05f0f2a6be0bcada3a6af1b785832", - "libraries/abstractions/pkcs11/test/MBT_C_Finalize.c": "1e563a74433510e7de870ec4be7b31521a7d090e5f9c416cbd7cfb3245e906e5", - "libraries/abstractions/pkcs11/test/MBT_C_FindObjects.c": "ef78970152d8ec949858fdbdbfaeae51a46262428dcc232c0787e27618296ac4", - "libraries/abstractions/pkcs11/test/MBT_C_FindObjectsFinal.c": "d6a6ce975898e6c9e0c45ee36466910dd75b61de38e4f7532773ece2935cda8b", - "libraries/abstractions/pkcs11/test/MBT_C_FindObjectsInit.c": "a5cc246e4f57a8d5bc729a0ce919cc93c333b3d0fe57f0720b908fbb56f365de", - "libraries/abstractions/pkcs11/test/MBT_C_GenerateKeyPair.c": "378f4ddb0f342e1a8c4f631e50fd3bee7d052c8b7465a74b06512815dace9def", - "libraries/abstractions/pkcs11/test/MBT_C_GenerateRandom.c": "d9f48da6a63727a9929bbb4c612f35753517b9d1a2af64ec8fdd0e7fa52f8dec", - "libraries/abstractions/pkcs11/test/MBT_C_GetAttributeValue.c": "6f489d4a49feb28f28c37ab49c20f96d076e9fd5213d15c2ac84994e3d406cd2", - "libraries/abstractions/pkcs11/test/MBT_C_Initialize.c": "8e9142fc4c853c871e276f60b9edea678ca5f36b3581beab5bda4f25c3d6d34a", - "libraries/abstractions/pkcs11/test/MBT_C_OpenSession.c": "6767be7184bd1abe0cc7dbc3a92637bcfcf29c43ef5966c3ffb69803a6aaea03", - "libraries/abstractions/pkcs11/test/MBT_C_Sign.c": "4030f4be14a82c86df0ee76448ee69db51e840782547c411d742eddc9d7f27a2", - "libraries/abstractions/pkcs11/test/MBT_C_SignInit.c": "e2f5093ea5bdcfd59526fe8239fb0fba3ddde03c8ecd9f50f9587ddaf06b56e2", - "libraries/abstractions/pkcs11/test/MBT_C_Verify.c": "8a56b1b5d43d553db37acce246b0d4002dbb598c69b03b8d190f0c031cd57f34", - "libraries/abstractions/pkcs11/test/MBT_C_VerifyInit.c": "1bae5160ddff4557250298cb65fb333322f4198cb71f3f4b1dd90c71a6da2acf", - "libraries/abstractions/pkcs11/test/MBT_DigestMachine.c": "8237e05dd173720a82eafb230902dfed71fc6ab9ae236a85dc441d1f861f81ae", - "libraries/abstractions/pkcs11/test/MBT_GenerationMachine.c": "0fef2662a4816c20fc7defa9c95f108086591c4eb2e6cb49cc1123fb3d7e5017", - "libraries/abstractions/pkcs11/test/MBT_ObjectMachine.c": "b992b9a1e0f5fbca591d23d6adc5521feef67a568e75d403458202e4ce61257e", - "libraries/abstractions/pkcs11/test/MBT_SessionMachine.c": "05f45787c452f7677d9cae8b1c09173c47f9712a9c700cbad572511622445a64", - "libraries/abstractions/pkcs11/test/MBT_SignMachine.c": "3c388a60eefa42b00b8a05cdc95f84b0362219fd5994473e2354f4ebfcc6f064", - "libraries/abstractions/pkcs11/test/MBT_VerifyMachine.c": "18c5dce1429b5a22a25c6c94f08e38e4016ac6bdae6cbb0ecce05ad9dea9de97", - "libraries/abstractions/pkcs11/test/iot_test_pkcs11.c": "98f5e01561b119568fc0efa0fc91d220daf5d1884d5a0a80c2098a6e9ce98bfc", - "libraries/abstractions/pkcs11/test/iot_test_pkcs11_globals.h": "ea483a99f1cb2378af879eb66ad0f96ebcaf1da4f83b05f8d21ddbbd933bf7ac", - "libraries/abstractions/platform/test/iot_test_platform_clock.c": "b1ce5f11acaf5d4f07bdfbc9fa0432dd3a3afb80875eabec1756b404e1832818", - "libraries/abstractions/platform/test/iot_test_platform_threads.c": "09cc9fa4576c6eb33386ac5cafbbb064c34a8be02fa252d0b922ead60d140b3b", - "libraries/abstractions/secure_sockets/test/iot_test_tcp.c": "b00a3da003bc20048bad54bca53af2a15a3bcf7a041af554a5252e1c06c9c759", - "libraries/abstractions/wifi/test/iot_test_wifi.c": "fc0096c4adc48842fd84690184c06233b731ca4dd29bac297690f6576bdf8935", - "libraries/abstractions/wifi/test/iot_test_wifi.h": "5a19517bf48ef66bebfdb1e04fb1f3cbdab7bf30e6d19620c373ccee4aac3399", - "libraries/c_sdk/standard/ble/test/CMakeLists.txt": "c332dbdf621b42384a139151acf9c5c3e06190a18d2e7ee25ac5f25cb9a46bfe", - "libraries/c_sdk/standard/ble/test/iot_ble_wifi_prov_test_access_declare.h": "8b28220244a9a6237673a254010b29a0a4c2e3aaf3502e38bb25124f913deafb", - "libraries/c_sdk/standard/ble/test/iot_ble_wifi_prov_test_access_define.h": "d5d07c1230d497a421f3c4d0f7b59f89b01706c4468372a9134280358b4f3a4b", - "libraries/c_sdk/standard/ble/test/iot_mqtt_ble_system_test.c": "ce334bcae67d2486f34f4ce98a2c1a66aebdf213e06f6cd694f68e75d285b76b", - "libraries/c_sdk/standard/ble/test/iot_test_ble_end_to_end.c": "d47ba1df33d16239cb1c99f0fe0e397d7befa6a8e83adb34d7299e4234b2701f", - "libraries/c_sdk/standard/ble/test/iot_test_ble_mqtt_serialize.c": "10c53a7c82f00638f501034f67dbd4e93050aceb07d59be0303a1cc5190e3518", - "libraries/c_sdk/standard/ble/test/iot_test_wifi_provisioning.c": "6bd06607991df48ddefd2dde5d47978eae9cf1fb75f0eed9baeed5ef39f5f9ac", - "libraries/c_sdk/standard/common/test/iot_memory_leak.c": "472e5f9c8c7b81d25180d462e3acda232d0bb0e294e9ba8529c3f5488f0315a2", - "libraries/c_sdk/standard/common/test/iot_tests_taskpool.c": "4e215e9e21e496c45ec19e5ee3c94ac50eedfd5af155e6b9a062074d193288ce", - "libraries/c_sdk/standard/https/test/access/iot_test_access_https.h": "19d8268a5d0a8062f62b428ef089b42752db207f0a117514a1abe318cd6a1603", - "libraries/c_sdk/standard/https/test/access/iot_test_access_https_client.c": "124fe06688f1f72557eefdb26210d0906ea38f371c8a58f2c8e565261eab54a0", - "libraries/c_sdk/standard/https/test/system/iot_tests_https_system.c": "dc022309604be41da1903faec7176c0dfc7310d6f0ec3912e1b9d90622fac52d", - "libraries/c_sdk/standard/https/test/unit/iot_tests_https_async.c": "b2f06f6db5ade5e044c97a4c305cd8494a93dfae290b3baabfb43291892994f9", - "libraries/c_sdk/standard/https/test/unit/iot_tests_https_client.c": "afd547b0cdf46e5e55a108cd10cfd8205448d43d937b81a6aa99bbeeedfd93a5", - "libraries/c_sdk/standard/https/test/unit/iot_tests_https_common.c": "6d95eb915178df134eb8c0583dd2bc4f4cec996fc2a7e714be209e408d314cfa", - "libraries/c_sdk/standard/https/test/unit/iot_tests_https_common.h": "b8243b0b9fe6a81f1267c8cc9442524d85f28410ea79b78966ee8b91978893f2", - "libraries/c_sdk/standard/https/test/unit/iot_tests_https_sync.c": "f41852514f51cfbfc21514f57f3431a16dad2f0af2eb641d51d9cb3404ade8a0", - "libraries/c_sdk/standard/https/test/unit/iot_tests_https_utils.c": "770b64166cd73f961056643c73ba6647a125264072ccfd67cee809833bcb1a63", - "libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt.h": "fb5a4da07122d303f952c02298c93bc78397e732994fb0bed52e744c944780e3", - "libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt_api.c": "d72d077fe2b3094d1c4aefdd0e0e8cd660dbc3c9f46899d598dad8f7f76a8987", - "libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt_context_connection.c": "72386d68a2e5dab1e46f7633327371e20be64d457b711d842c0b14f57386b62a", - "libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt_subscription.c": "03b9f28e87a4256ab1ce6858b76f2fb7a98c868780300ed3927e597fff55e74c", - "libraries/c_sdk/standard/mqtt/test/iot_test_mqtt_agent.c": "6e98d9d7a7071651cb63992c1483bf63e58b1f441a6fda607267ff9ca938b144", - "libraries/c_sdk/standard/mqtt/test/mock/iot_tests_mqtt_mock.c": "f0bac08d45dca744922b18a3969de793fcdcb5437156ce05c8c002221c30bf32", - "libraries/c_sdk/standard/mqtt/test/mock/iot_tests_mqtt_mock.h": "c69e8f43268b0f751db139e6a880cbbff212eccaadf0378ea07e09994ae7e8ee", - "libraries/c_sdk/standard/mqtt/test/system/iot_tests_mqtt_system.c": "6502b7291459634643aad4a2e50356c458c745b5a024410f3a2aa692bdeed6bb", - "libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_api.c": "a60caf1435f80406b5b3c911b311e520830e8c6579372dbf11804d5683e6f486", - "libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_metrics.c": "e94e5de09727eb18e2f6a7e458d0be581d6ada0d464de4e99517f3d7f3e9c9e0", - "libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_receive.c": "40110bf1d531db01263747d903147bdb367244f8d8d6651fd5576ad7c94e85ea", - "libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_subscription.c": "989b8a2324f3d9a14aeb9d8c26898dc5e6db7beecef0adcaed18d56ac29c6e6d", - "libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_validate.c": "682038d886ce951a48683a3a4993500e9546b83629849b1873321f68d0664844", - "libraries/c_sdk/standard/serializer/test/iot_tests_deserializer_json.c": "f5029fa6d03be5ca750f8c2f469ae5fe6e8d321be84db66867715c3541bc892c", - "libraries/c_sdk/standard/serializer/test/iot_tests_serializer_cbor.c": "476b07305cda499e36a416f057f44a64bd39390b0d73e1f3277020e0837ee4b9", - "libraries/c_sdk/standard/serializer/test/iot_tests_serializer_json.c": "34f0eca4d8793b1ec26706ec153caf9109026fe267ae5fa535849d1bfa222abe", - "libraries/freertos_plus/aws/ota/test/README.md": "4ced3c5630f4f80f1d521bbbf284a005764a3a30a0d493d03dda7b072c9e9f55", - "libraries/freertos_plus/aws/ota/test/aws_ota_agent_test_access_declare.h": "12f13edb214506945ef5705d643b8da9285f2f1d28068b4cf5c9f57ca7729dff", - "libraries/freertos_plus/aws/ota/test/aws_ota_agent_test_access_define.h": "f87ac9f64f61addfa1ad1af8c520c0efce5d3bd053dee03a9f73de2fe8a4b183", - "libraries/freertos_plus/aws/ota/test/aws_ota_codesigner_certificate.h": "66c35df6bc08423c7ff865be60f0552e3c4dd5944f007eb1dcd07f30ab38dfe0", - "libraries/freertos_plus/aws/ota/test/aws_ota_pal_test_access_declare.h": "29ec4ff20e2de3ad6804195cb5c0ac6435ff47e754fc4b8ece3683f0bdec4e45", - "libraries/freertos_plus/aws/ota/test/aws_ota_pal_test_access_define.h": "37c33a96adeaa79bf40f44fb3ab72d0c07cf6b7f39e68356657060c5df72a696", - "libraries/freertos_plus/aws/ota/test/aws_test_ota_agent.c": "692aa14daf0174b2c2b5d8bab90642adbe3c36a47466742cbefeca863925876c", - "libraries/freertos_plus/aws/ota/test/aws_test_ota_cbor.c": "0d093e61c8206be2aef35de6fbaaa1b2762b1479d31d692acd4690221d9bad6c", - "libraries/freertos_plus/aws/ota/test/aws_test_ota_pal.c": "f0f387b0e1d2d8eaad9e76f10ee332af4821e75f820d760d5ca1fbae17db6af3", - "libraries/freertos_plus/aws/ota/test/aws_test_ota_pal_ecdsa_sha256_signature.h": "1d7cc108377ccf2d0910421e7e8c05510c572799e5c16e4eb422e231f7c4af98", - "libraries/freertos_plus/aws/ota/test/aws_test_ota_pal_rsa_sha1_signature.h": "49443686ce2bb4b7fa4000bf5eb01bbbd2828b6946838a54bed30ca66582ef04", - "libraries/freertos_plus/aws/ota/test/aws_test_ota_pal_rsa_sha256_signature.h": "7972c85001d4f298dffd7392672e035c483006b871d64913614a60b2e9ac2fca", - "libraries/freertos_plus/aws/ota/test/aws_test_ota_signature_methods.h": "6015225bcc029fd04aa62f71f254badcd57daf68ddbdf12053f88d01669e175e", - "libraries/freertos_plus/aws/ota/test/test_files/describeStreamResponse.cbor": "b314ea57c902e90d41e2acebc0dc7dd9ba8924876d23a88754dd1c4765b21541", - "libraries/freertos_plus/aws/ota/test/test_files/ecdsa-sha256-signer.crt.pem": "79705066d68dc58ba6b5c9ad27e8c3f355184be078025ab76d1a1bc9a9cbeade", - "libraries/freertos_plus/aws/ota/test/test_files/ecdsa-sha256-signer.key.pem": "cb258c4d1d4e4fc355cd13051d4130719fba62257797cc3e17083443bb767b06", - "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_0.cbor": "bf223676be6a282853bc22c64faee719ab74068a4d7770d977a6f37c67400fdd", - "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_1.cbor": "72b22a9ea24016629f6d169b52e98e735ee9924bb4f13c1295f1efd5f6fc6abd", - "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_10.cbor": "e6b9ee23bbd6d33240bebaccd8ee9978230ad8e7206926246ed36a1a8d60e4f4", - "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_11.cbor": "14f6287ab8666bed3d2c0998763f1fd30baffee52e7fe79994c6ee20e868653b", - "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_12.cbor": "4bf01a682c8fcfe0c47fb78b04d73d61aa31a79f6bcb07410bc530edc22a18da", - "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_13.cbor": "fdfd00cb7c0874216925c7152c9491b38c9dd179bfaffeba954c4eb27947ca75", - "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_14.cbor": "207819f2f6d5d82a3d3b1dcea0f508e4fe217ca243bad33090940d7bf1e03128", - "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_15.cbor": "31910394ab515ca70c57aae3be88d14f9a35e3e66ba7c6c3132ef0b93830289d", - "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_2.cbor": "cfb32bc6d6fafed74e985824f0b731837372179aece4d0a84087919a256ee59d", - "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_3.cbor": "a4733133a6c983859459141909031bfbb153cca083b9e881f24542c05041ec7a", - "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_4.cbor": "509a62af0b2906057735a635572e8e17aed57e8f0c42def8736db880823ef65d", - "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_5.cbor": "b471bc1ef2bff3b72da84f9bef8bc4ec44fc6aec26d3501cf1b5991fb62732a8", - "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_6.cbor": "bfa28de6fbb8330be654728e64d935c7582c8aae45ab992a4f6c0b7f19b803a2", - "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_7.cbor": "e1614f15ca0fec4d3bec19e7d48be470066957de78bb41ba5870786a0d15f678", - "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_8.cbor": "e66c279dded094b1654748fdbb527eb290f3f142ac3f4f7edfb2c439a49b984f", - "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_9.cbor": "3536044b7fffe7ae1241823ed01bfaf056bb09a55d43f6b8e70af4ee62fffb17", - "libraries/freertos_plus/aws/ota/test/test_files/payload.bin": "cd5639809d3f72ab83ead330059af6fecebac84927704617bbccc710b1c23253", - "libraries/freertos_plus/aws/ota/test/test_files/rsa-sha1-root-ca-cert-key.pem": "9e97f6f9ea210b532a7b86eac12f0d97a1b6c372e22ab86187bf98e5e208c4aa", - "libraries/freertos_plus/aws/ota/test/test_files/rsa-sha1-root-ca-cert.pem": "b550b03c7b547629bd0ecfdbc5804cd72d6b57dc0ec8cf8a1bd2616215d602a4", - "libraries/freertos_plus/aws/ota/test/test_files/rsa-sha1-signer.crt.pem": "4a05cecf862a081237cee9207be87080e2c50544959f74be2c3908d7857b9da7", - "libraries/freertos_plus/aws/ota/test/test_files/rsa-sha1-signer.key.pem": "46d820537f7b3d57c8f9ee63d9019602cc9329a6cd0b6a5f8ffcdb1838125601", - "libraries/freertos_plus/aws/ota/test/test_files/rsa-sha256-signer.crt.pem": "5de1c733099a249e2424c38aa9b732094914f260ba2582cc39f9198f46d0b7d5", - "libraries/freertos_plus/aws/ota/test/test_files/rsa-sha256-signer.key.pem": "baceeaf3b8fb0e16a4d3eb8a1b016dfcd41f752270f00649311ba567759e9e29", - "libraries/freertos_plus/aws/ota/test/test_files/rsasigner.crt": "2b92ff249815c106222fa13ef62bf2353f2ebb9180c36c474203efbc055ed2dc", - "libraries/freertos_plus/standard/crypto/test/iot_test_crypto.c": "008bd3222452fe12bb61cfa1143b277f27b1d583fe81cfca85a6efd92e43916f", - "libraries/freertos_plus/standard/freertos_plus_posix/test/iot_test_posix_clock.c": "f91d9fd78bdf34418fe4222f3752fc2bba1d681329e38b43e8d946cbe37d4281", - "libraries/freertos_plus/standard/freertos_plus_posix/test/iot_test_posix_mqueue.c": "912eeb6ea837aca95d88fbcb63be237239ee583319d157250ff9e856120734d3", - "libraries/freertos_plus/standard/freertos_plus_posix/test/iot_test_posix_pthread.c": "f02793e69e06da522fac7a2728983540d668c2a5f9dace05e1f4c6abd20c583e", - "libraries/freertos_plus/standard/freertos_plus_posix/test/iot_test_posix_semaphore.c": "0461bbedab67462139d12aaece2279490b73146fd5572e7c86cddb4b92f2109d", - "libraries/freertos_plus/standard/freertos_plus_posix/test/iot_test_posix_stress.c": "ba930da93fe8953cf0cbd95dc630da07bd5a409125895752fecd3db1a0bacf16", - "libraries/freertos_plus/standard/freertos_plus_posix/test/iot_test_posix_timer.c": "1e65f7b22962948f761f692c5276853f1ed602eeb4aafeace39e5599c868f738", - "libraries/freertos_plus/standard/freertos_plus_posix/test/iot_test_posix_unistd.c": "e0b2ce70d62b9b153d09c11a265fe44d03c34dac72b01aa23dd9b6a767d0b889", - "libraries/freertos_plus/standard/freertos_plus_posix/test/iot_test_posix_utils.c": "3352d2f4f0b5dfa8b26b360ec74bbf0126c11baf57762cf961d179bbca4c6071", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/build-combination/AllDisable/FreeRTOSIPConfig.h": "fff034ce69843890bbc87467fb23e891da26ebb266de6a72aa4d3e87f806f819", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/build-combination/AllEnable/FreeRTOSIPConfig.h": "06c1c2d37d40ee7c54a8def533c2700f4fffb2f12b8c906b3145249377fd0a2d", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/build-combination/CMakeLists.txt": "82b95b38c56a52495c2acb28c2f08964dc7bba2aec29458a2f571dc9fb9172e0", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/build-combination/Common/FreeRTOSConfig.h": "1d57ec870baa67fce22a12cc94c8cb9a4ce52ae912919372c177d20aaf16509f", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/build-combination/Common/main.c": "b29e96615f076896c2d0094e2b2771a963f3bf4731e7f21a940f181833e3276d", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/build-combination/Common/winbase.h": "dd72cd6385688bc28589ec7f07527e689e0581d15a0b91ab7690ebed3b122e5a", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/build-combination/Common/windows.h": "dd72cd6385688bc28589ec7f07527e689e0581d15a0b91ab7690ebed3b122e5a", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/README.md": "2e1517b705e63a4034c4d5c38a72adef06c3e7e216db5954d180143be8023349", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/cmake/compute-coverage.cmake": "8cc293e091fd5150d51c2ed38767eca810599ec591c3e1ebffe34babc5e81377", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/cmake/compute-property.cmake": "e244ad6756696ef7541d40f4aeebe3f9fdd9bfa9457328d66fecfcbc2e4dea0f", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/cmake/model-check.cmake": "d0e3c0e331f9e7658ebd47ed91ed0f075be87710d64203198244d86e34786443", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/include/README.md": "d92693cca3094d662b72784110946c09a66a8303dd0b03f3461f8b7b62280262", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/include/aws_freertos_ip_verification_access_ip_define.h": "81cae509e8ecd058785ec1eadf196553f4547ffbf5e991a18122b38ad9cc05f4", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/include/aws_freertos_tcp_verification_access_tcp_define.h": "970e55f94b54e0e4a3ca16816f1234b39724624711feb00a9ca4509dabbafeb5", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/include/cbmc.h": "bf3fb8dbc20e9af8ca69287d4e6f91dda6cccd423bfa340b077df180a288209a", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/include/queue_init.h": "8420699152826dbf680bec3cd2efcf2872ae1b23b48f0b4dbaf2eeb52d8ae3db", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/include/tasksStubs.h": "fde7c87b4aac3632fd9e677df58467fe2f0996af025feaf35dc9897daee45879", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/FreeRTOSConfig.h": "5e96cb98802fe80958e58712eb4485d3b2ba6d1ce43481841f856795edeec52b", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/FreeRTOSIPConfig.h": "688e1fd00acf6848ba2defe690ec13b09909842ec4f023640ed9427fe5e387df", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/Makefile": "62f5359d2c57c49751e667130dbcad7f026a94a73ded970686ecd6b4890d2b07", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/README.md": "bec763d9c3a15d46899989dcd7a28f443123b8579d8d6fffaf5d80d041417070", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/__pycache__/compute_patch.cpython-36.pyc": "fe73400b72e2e034b1be43e64964f3f354e9108d58ff5a3897dccbb982af675e", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/__pycache__/patch.cpython-36.pyc": "1934234b94d63788c77137417dbc4717c56e9b8322b47bdb2dfcf62c311b5e08", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/__pycache__/patches_constants.cpython-36.pyc": "c061304856f947ea1d0c29e5a8d1f5e7498bd24010544d187ba3fe734c244d0e", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/compute_patch.py": "97cc6c1fbadf52dbd5014220d462163279ccf4afa71f4cf0b904b870efb793d9", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/patch.py": "42516fa3e5214e434f6755e15756d67c8ba7ca1a970f021f628777cbfe69a0c2", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/patches_constants.py": "317f874431820fce7a913501b2e1a711df3d3fb1bdb598a737adb0a15816ccde", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/patches/unpatch.py": "21bd4f2a468f1aaec312212587710cccec3489f419fbb6fcc16acc25784b0eed", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPAgeCache/ARPAgeCache_harness.c": "39853aeaeaa191017a994c531f88b0f76889661f0c306576ca567c9e09b424aa", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPAgeCache/Makefile.json": "9707edb8e400212ec97f84e60c10f9d40f73d6937cb1c38b619b8f970c612d6c", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPAgeCache/README.md": "aeb4610ac4385bf15b340a3e79e90a89bbb558a823e6f4e42421e389aefe1910", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPGenerateRequestPacket/ARPGenerateRequestPacket_harness.c": "e837b81f4b7c2a7f9042b10de1956ce7dc86aabba1c92a7681fee08f9492fcce", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPGenerateRequestPacket/Makefile.json": "c68383eb27ee62c4771f294646287662962b8251e7d85ee575058deb6e586082", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPGenerateRequestPacket/README.md": "b9a210fc5d5ab9fc6d9bc5c907842f9aa249e28eb65fb336306e125b69459640", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPGetCacheEntry/ARPGetCacheEntry_harness.c": "f26d923851165ef0e828adf8e4289a801d5e27f43edea5f248a7f1801f817d9d", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPGetCacheEntry/Configurations.json": "51bd3e04a590b0df9700515ebf0acb07239fe2def64600a87d6c96ba4df0c168", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPGetCacheEntry/README.md": "9916569965ddce1f39f0610a330d27f66e3e62dc218b25d3d9c1689e6f536db0", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPGetCacheEntryByMac/ARPGetCacheEntryByMac_harness.c": "a4568be01085a5f4a087e32f8a031b3e4d91d058ee147998ecf4277ac2ab3cff", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPGetCacheEntryByMac/Makefile.json": "9faea9ff5dd12f067477e85748161651e561c19c797bc8407312dc1d99b5e1f1", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPGetCacheEntryByMac/README.md": "ee9b0c769051950546b1c962b3e761249b52fd0133132fbeed05cdc355e54dab", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPProcessPacket/ARPProcessPacket_harness.c": "d846786713d407f84bf632fb2b6a06e5ea80b51c4d657cdf4b6ca0de6fbcdc43", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPProcessPacket/Configurations.json": "8802a9d06c9a896f2b9826d200b517ac8a211870cad6416db2870d0f1bb6837b", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPProcessPacket/README.md": "1a3af6593d7cd50a343eb2740d47f2d9961a3a77f2ef56a1b46829d0505b8235", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPRefreshCacheEntry/ARPRefreshCacheEntry_harness.c": "a2b4e339af9b8bba5d643abf24e3bd2bab2a43cb7e482682d5141682892230d5", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPRefreshCacheEntry/Configurations.json": "71cd19e3171854bcced175cbcedf17a79975da5f2651fd4e3a7b0f499bdb8263", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPRefreshCacheEntry/README.md": "f9bb7a176f5f924937512440c589b38fc7c3f7a98a4fe91386271711cc3d2871", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPSendGratuitous/ARPSendGratuitous_harness.c": "dcbe3a280bc06976fa83cdf1801da20421a940d04d9f905118cfb58067a36d9d", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPSendGratuitous/Makefile.json": "66659ee852d417e08acedab451252f549865bc592b3152162935fcbe09dbbbdd", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARPSendGratuitous/README.md": "b6c9ef7ad2e0e24f43e4a45e85ba47eeb66502183960e46f291472f4e9e33f9a", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_FreeRTOS_ClearARP/ClearARP_harness.c": "33f0182d87ac5473bc3128e6d3cad662cd21c2de5008be3d9f5d1f74dc80a081", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_FreeRTOS_ClearARP/Makefile.json": "e035a4838878a8b897117322a47d52bf95818ff8b1f578217e0db8e94b634675", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_FreeRTOS_ClearARP/README.md": "6fbeffc40126d0d55fa78c1d439941c30e615437edb3908fdf7f3691385ef214", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_FreeRTOS_OutputARPRequest/Configurations.json": "8ed33822a5203a290cd01cc15d00865827934f6260868be09a1026cfb54f3451", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_FreeRTOS_OutputARPRequest/OutputARPRequest_harness.c": "a918785af996de56583ebb6a3e0f01cc64971d229a71d4697b65ead685884184", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_FreeRTOS_OutputARPRequest/README.md": "7e5a27411840d03fc4367959642c2b601d0f6f586f1b9881dcba905f89f0ad57", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_FreeRTOS_PrintARPCache/FreeRTOS_PrintARPCache_harness.c": "b010fe4cee6944110c5ed1321f5debc8701763854917b7f61cfa1fc0ea2430a3", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_FreeRTOS_PrintARPCache/Makefile.json": "f0733aee20251ce681f6e80055a1f7116f119273bd4af4e05d2e791ea0e7ef34", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_FreeRTOS_PrintARPCache/README.md": "fc60542585ae6e44bca336874b376b4dfac645ccc167c685b0d5d841b1d85881", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_OutputARPRequest_buffer_alloc1/Configurations.json": "cf1f8dab26ef867fd3c838e28b8e214e81dc084361fc9446ed371e77b9b735df", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_OutputARPRequest_buffer_alloc1/OutputARPRequest_harness.c": "e8a8cd3b93348c008809512da53456566430b7d5c24273c43fe7f5ec0a1ca452", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_OutputARPRequest_buffer_alloc1/README.md": "36a9e7446602693c416fedc98c38a543cf4f298a402ea939991cc01b0ac3884c", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_OutputARPRequest_buffer_alloc2/Configurations.json": "5c34c28eef561dc28dd73f2ecefb9f908b5489011846d602021b880eb1008268", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_OutputARPRequest_buffer_alloc2/OutputARPRequest_harness.c": "98a029dff3d797a349d9a2304bf40b0ae6ad9af2040d241fb52b9e440408592f", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ARP_OutputARPRequest_buffer_alloc2/README.md": "93506f031fd2552b5892c1257925cba330d4f1dcf38c8f8ea7fc0a65c871d796", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ulARPRemoveCacheEntryByMac/Makefile.json": "f7db10c26b07d66c3109a068d9678f3ae5aa2c2d344eb1fdcb0814a5057207c3", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ARP/ulARPRemoveCacheEntryByMac/ulARPRemoveCacheEntryByMac_harness.c": "c785b6e319302226dc5bee6d9efe9df521051849b1ec253cb919c51e265d83bf", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/CBMCStubLibrary/tasksStubs.c": "4bf5c310c91f77e06e35af264151997cff2942e2e0c39b7f1604a486a68841cd", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/CMakeLists.txt": "52530e97d5d959bdd795f264974680a2849147c8809809cfecaf814422dc7d91", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/CheckOptions/CheckOptions_harness.c": "13ec4642c6d4a496a699227395c9d954ec2e0f85d78f5458f88c8187df5e0450", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/CheckOptions/Makefile.json": "ab871a90c3db97a915aa03ad7c61058a34428f97a7e8a86faf8c4ce273b49d6d", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/CheckOptionsInner/CheckOptionsInner_harness.c": "8f035b1e329d91be5dd56a094e4061d81d4ade5b5ad5f4065dea1cc491eaa5b5", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/CheckOptionsInner/Makefile.json": "49a1ea8e8f3b6c11d68952127e80284d82c7e8ef9b2570ed09ba41b3997a4066", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/CheckOptionsOuter/CheckOptionsOuter_harness.c": "96078cd7c26d07e3cd0b18034d46d90a732525d459fe0de00b2619daa5fbf9ad", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/CheckOptionsOuter/Makefile.json": "58ae4c249a87d9b29a874c102477d2265a338877749826f0cd95a9554467c3db", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DHCP/DHCPProcess/DHCPProcess_harness.c": "ffe14ef08d3943336048caba93ad0f0ced07c855c0164a0c1b474c229038eafd", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DHCP/DHCPProcess/Makefile.json": "626d63059105ce1514643147ddffc3988b1d546044b386a03535141e3f6e2759", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DHCP/DHCPProcess/README.md": "c085d7c4281dcb90bac65ba018f23cc99cc87fd8881db09c6e705e2439d01ca8", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DHCP/DHCPProcess/cbmc-viewer.json": "f7a7c8742c7a39f6e32d8b98e7545737a3c8e67fa943d0c292155f1d672e6eb3", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DHCP/IsDHCPSocket/IsDHCPSocket_harness.c": "e9fbb0aef0a3835206424b14e9c5c9b751834b7b28e1acf9d078ead2e91c406c", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DHCP/IsDHCPSocket/Makefile.json": "11d5ee4689ca8ca9ba9b57e8a3cdd337ae2b8f11dfdc8765eee8f6f0a1c00388", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DHCP/IsDHCPSocket/README.md": "e75d815637ab4e1815813c0dd0b49fc468ae55a06086fa5b3c0a64af4f0d0f0e", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSHandlePacket/DNShandlePacket_harness.c": "a5107448bbbc99321863bf4ab90072b70152bb6705d9582def020224ad90932f", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSHandlePacket/Makefile.json": "1ef08e9c4e70cd511f8b66de06f51df6f589ae92eb45a3d4d9398ee107101ec3", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSclear/DNSclear_harness.c": "9923b82ec4c04a108476081b2f66d2638ac350e18fc81a642c9f9de8b99006a8", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSclear/Makefile.json": "9454ff95399695f3e98878be8bdf99db80b305161abdace383c1098c69d016a4", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSgetHostByName/DNSgetHostByName_harness.c": "06545980dca3705c0b9fe9c7e94968ff74e3332cb8121c099f55cf0c85791ac1", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSgetHostByName/Makefile.json": "cf3edde6e69558394995861c5794aaaaee616b991ba20d2f45e5679536a32bd3", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSgetHostByName/cbmc-viewer.json": "56121f38e5cf50cb05e1bb0135469eb1a9dc32e5065f8fd250efd15b79e5097c", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSgetHostByName_a/DNSgetHostByName_a_harness.c": "22286b404c8e6ba1956968ccf079615d2d096c64255c1383bbc0f501301a79ef", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSgetHostByName_a/Makefile.json": "be12e2d37c1d3dfc61e13e36c975cb14ae826736b66d92aa47769728df2526ee", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSgetHostByName_a/cbmc-viewer.json": "8e50503d9a4d8ae8c90390f2191be8c1b2f6f9303cdfb3cc585890df6cef5106", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSgetHostByName_cancel/DNSgetHostByName_cancel_harness.c": "a583aa89d8e7a053f46d72906017f84364ae9f9f2a8106c34f0f62256e2c567d", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSgetHostByName_cancel/Makefile.json": "f2ebd17622bedfbc6354a93115bca218a67696917f04317a2ad514d4f50008cb", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSlookup/DNSlookup_harness.c": "c8efbdd6ccfdddd9c768aa661453fe13c7557147c3a0dc5edd4d9bb6fc44b5ab", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/DNS/DNSlookup/Makefile.json": "be7a119d2872edfa54769c8591c1dee92be218b2756b87017dc4f9a3e5c181d1", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/IP/SendEventToIPTask/Makefile.json": "c89609bbc34e988316f7deee374ed7a184c5d72e1d37cb09bd678a8983fbbd57", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/IP/SendEventToIPTask/README.md": "170aa9d950c8c2d04dac100d2ac75abfa0923a9ecc44ca25ce1da56e759acab5", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/IP/SendEventToIPTask/SendEventToIPTask_harness.c": "b0710b779714c722a3015970547c1745cd8a76fd0983ac4529c457edde939817", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Makefile.template": "401e79bab172511b5b159c6af5fa5ec6e2274bf5957ffe577b117004befc5267", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/MakefileCommon.json": "52a93cc0fe508c389057dc2983dc0c05721dbc1cd3742de97a0dec3258cd6d04", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/MakefileLinux.json": "975704e91f7538aef7031a454b2698834ed6408fa8eac0cc384f52c97c51c354", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/MakefileWindows.json": "cf34143c0c3c02b8b540fddd3ea87bced19c108b31090b4b4366e3edcbad8eb5", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ParseDNSReply/Makefile.json": "d368ee8897627f7ff790f5741b253a1053ba99b414582bb613fdeed4cda9ca67", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ParseDNSReply/ParseDNSReply_harness.c": "ba35b5d25b88a77944ddf152c8c3b162179838af193d7bc6ba9bb3c1fe676b21", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ProcessDHCPReplies/Makefile.json": "a4161729dc2e6b14638f16054abfade2222aba1f25eefad03accb2b935e2fa48", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ProcessDHCPReplies/ProcessDHCPReplies_harness.c": "024926d52d97b62728db7bba8c1fdcca919188a0ac4350867d71efbd3368c6e5", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/README.md": "fa4ba1c3a3b5a88c86b821f7d0aa22eebb9e70046d43dc460fac7d5892f2b7d9", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ReadNameField/Makefile.json": "5d51a30c1aa7a8f4aa7492eb0d14f68b0964e4e0c74f3e0aff93a513866e8a86", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ReadNameField/ReadNameField_harness.c": "34fd7098fe8cce44dccdcba0e445b725ee1ae7622fa4903b9344f4d45ded1bb8", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/SkipNameField/Makefile.json": "96adeffeb4bb05ac86708e8341a23f7cb35d6031cfc754a3b8c328e0bea798f2", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/SkipNameField/SkipNameField_harness.c": "a66f3a724513e7044bdc2e7b3b40c40f337ddb81e65780ddc96a817eb4bc77d2", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Socket/vSocketBind/ALLOW_ETHERNET_DRIVER_FILTERS_PACKETS/Makefile.json": "46c28281e416d166bbece766ae8620d892318dc883b04628ff54eeb913e631fa", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Socket/vSocketBind/ALLOW_ETHERNET_DRIVER_FILTERS_PACKETS/vSocketBind_harness.c": "63f6244069aed974439474296503f8a69527816be7908c8529f0e076d02e714c", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Socket/vSocketBind/ALLOW_SOCKET_SEND_WITHOUT_BIND/Makefile.json": "bf1b01ad19681cb943de52c088c068fce196cc6f6517d60d213351624fc8a3e9", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Socket/vSocketBind/ALLOW_SOCKET_SEND_WITHOUT_BIND/vSocketBind_harness.c": "335effd49efa9e747ad2e0660934b00ae69177f55a99ce5c2f6c35738575fbc2", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Socket/vSocketBind/DONT_ALLOW_SOCKET_SEND_WITHOUT_BIND/Makefile.json": "602c647558918619a24613a03ef3dd11e61ad98c3c32a7355dcdefb2421a44a2", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Socket/vSocketBind/DONT_ALLOW_SOCKET_SEND_WITHOUT_BIND/vSocketBind_harness.c": "c1c3482d895f8ac28089ff52abc33a7409d279e97bed71d0d9e3174522fa56df", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Socket/vSocketWakeUpUser/Makefile.json": "08b26aa99518b3af8b2eab242cee7bf87d8d61f3e9ead6dcb124d1d956699042", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/Socket/vSocketWakeUpUser/vSocketWakeUpUser_harness.c": "2345b200f4dd68bff538749765624e1b5c869b5de08933a352c82755920dda85", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCP/prvTCPHandleState/Makefile.json": "d9adb5a9fbf7bcf1a78e165ff992813d7512c8d0da80cd5dda378a7828d2dc3b", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCP/prvTCPHandleState/README.md": "f9f898124416839dbd3b5432a5232d3800185f2b1ded1bcd18ea66db5a71214a", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCP/prvTCPHandleState/TCPHandleState_harness.c": "c3f253f5fa6fef9e5556922bf4514f14716a3cf884e7fb58d8c19be28aaab850", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCP/prvTCPPrepareSend/Makefile.json": "5ee4ff453c7fe12ed33e2996b7dc4b227a05012d7872d59ed467bb248e2dce6e", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCP/prvTCPPrepareSend/README.md": "df7ed64ff377c328015e55520a5f267615ccf49505348382958115c818486819", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCP/prvTCPPrepareSend/TCPPrepareSend_harness.c": "ef35858a9a2191cd606f0fde111b646614cfc6fc90e55ef9ae87c8971408b1f8", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCP/prvTCPReturnPacket/Makefile.json": "50cc89565a5b5fd2faf12345b74318e960a1bfeedafa0993b3c7cb564961b46b", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCP/prvTCPReturnPacket/README.md": "c4707f113833ceaf60866136d09480c057efaea25584ad5364cf9d778000e7e7", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/TCP/prvTCPReturnPacket/TCPReturnPacket_harness.c": "4c6027b8268942c29464c6d01da6dc100f12c75cf57a2d4d38ca6eb20c2c4307", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/UDP/vProcessGeneratedUDPPacket/Makefile.json": "69bfae7729f172b2150ac378a293d68efeea63b32a9e8c2bddcb62e74cb3e523", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/UDP/vProcessGeneratedUDPPacket/vProcessGeneratedUDPPacket_harness.c": "2feee142d4d62ef6e80ab173da92cd715334bfbc43bda4dd52783c93d4f41071", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/__pycache__/make_cbmc_batch_files.cpython-36.pyc": "721f69b4985c50b5505fd37e7773be9f3baa766fa64026fb76f8d536e8435653", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/__pycache__/make_common_makefile.cpython-36.pyc": "7831124fdcbef17be51b7a07d72c9ad9d8d5d1df94b8b57fffac144a6c4df8b3", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/__pycache__/make_configuration_directories.cpython-36.pyc": "e9820d84a819b38a360baa6e1595cb0e4ca3d6694b4919cdd9083a65fc721c34", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/__pycache__/make_proof_makefiles.cpython-36.pyc": "1562d46a0155df32cdc15e663b7a117ff2954be6d9ba7cd3a03888168318a16f", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/make_cbmc_batch_files.py": "00df8582a3027ee0d2163dec55ba726bae3fad6ff311b22533bdbd9d8a0e8dd3", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/make_common_makefile.py": "39aa549cd0b7800cf00e918e4737c1c63a9274668cc25e0075494b07df5e54f9", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/make_configuration_directories.py": "33ec0021618c28068235af604c8bffe707dd8b0b50ffc1be20af272933bae02e", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/make_proof_makefiles.py": "8025bf79c7a7df6436b747b160dccf6adc2ba0d76738c6e8aebbea3e6ba1c0f0", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/make_remove_makefiles.py": "0b6a9b94719f649f93fa11c857484ec4927c50470dd607a49d88c5ebae1e99c3", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/make_type_header_files.py": "3ded76b45610b413e5b625abe5e55a41c2704392169dab6a501445d73fd37642", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/ninja.py": "4ea9d353d825efd3f6dc94532cdf3e1fae680ab6a04872f62d2184dec24e7211", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/parsing/ProcessIPPacket/Makefile.json": "06140eba3a858b09047a1e2a09e11250b8c5c1503bbefe027798c299deb6c54e", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/parsing/ProcessIPPacket/ProcessIPPacket_harness.c": "5f25a3058f9aa91b31b5cf8ce6f3d97dd76741b6815b3fc33c51b5a964498877", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/parsing/ProcessReceivedTCPPacket/Makefile.json": "e1df2b5f2f615da68fa4da19de2429bfbb921d826cab160f25e39ccddf6a0676", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/parsing/ProcessReceivedTCPPacket/ProcessReceivedTCPPacket_harness.c": "f6b193bae898cee51b17a246921b1a6b3269d3be234409321cd43695136b09a8", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/parsing/ProcessReceivedUDPPacket/Makefile.json": "b29e945524a08d3dac189046e3e308d76a8610c8f61b5e9a2970184baa3a8728", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/parsing/ProcessReceivedUDPPacket/ProcessReceivedUDPPacket_harness.c": "e153a20de6b79fdc5a778f7c1250d3d55ac673e746a67ebf4f6650a296150783", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/prepare.py": "0fd5d2ad2cac14176330cde62826a853d4f4293d1a0441a2ab017e4ef252fecb", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/prvProcessEthernetPacket/Makefile.json": "b33145dbe58bb50b9ad32f04950b1c1e48b744b2ef8ac4a41a8e4fe0d82611c2", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/prvProcessEthernetPacket/prvProcessEthernetPacket_harness.c": "3471c1d5fc60a0e3053f081da85b1f5bba3ea1eb9e1a9334f99a320a52d63d2f", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/run-cbmc-proofs.py": "e9ffc00d65eb8d4f8f47db6a9a723116729dcf73a981c7d3824a1a8392d74db5", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/proofs/utility/memory_assignments.c": "265d586bbf6fe31f3269e39f5b8cef9ec061d7cadb32edb6a896b835ad8390ea", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/stubs/cbmc.c": "d7406c1c0f880e7a73ff745545f5967c5f7b751e4816d6f7fffce9bfc0a6fc83", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/stubs/freertos_api.c": "cc1aebf98653d7f76996a688d897fd4eeb31ab4c26a6c26d20c8614eec24df30", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/windows/README.md": "fcea1660eaa6aa884003c87ad2092d5465e2f9355b82d98eacbe094e431d762e", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/windows/WinBase.h": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/windows/Windows.h": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/windows/direct.h": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/windows2/winbase.h": "44bac2a6b8cfbb11e3b4c27adb78bfe730cea8da62eb75be420eb0499d006652", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/cbmc/windows2/windows.h": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/CMakeLists.txt": "1f39e3090be8d52f89debe6f54cd651f3d1c56a9d29150888cc60a9984ba1155", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/FreeRTOSConfig.h": "8762872d3a508e141a4b67c9c65721363868c83b3934689692392928a87efd40", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/FreeRTOSIPConfig.h": "2e999a469c09573cb6be76a149f547149c3515145ed450ef2674a741adfa9ae5", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/FreeRTOSIPConfigDefaults.h": "05cd4d6057f4afcfd0ac32a14e38c1876678117db56f4a9bcbb9e4978a4aba4e", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/FreeRTOS_errno_TCP.h": "17544907ea797253ffeb8bc4391dde537033e6f13f3a0aa6ab973009ad9831a9", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/IPTraceMacroDefaults.h": "d623514a52fd9b954ef64b83c557c7ab4597051664378ee7c96ba975453509eb", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/NetworkBufferManagement.h": "f8cbadd7ff5a2710c54504f156b8f891a2a1d1d16571fd57e7d4ee675142b15c", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/NetworkInterface.h": "5a25a71583821c4f61ac674c5e3f03a9486a2dfa3b7a94b065dc57bb3151788b", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/WinBase.h": "9fe50d95cffddb9800ebb400c762c7bb7e7ece820ab4ee790c6c603eefbbc590", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/Windows.h": "9fe50d95cffddb9800ebb400c762c7bb7e7ece820ab4ee790c6c603eefbbc590", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/pack_struct_end.h": "59e20376ab653c273ff4b13ec735880989300f3a31f1df2d5b2d3b05109bc2a6", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/pack_struct_start.h": "831644866b904f3d8388064aba9d37199449089630d879dcd5720df839772976", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/ConfigFiles/portmacro.h": "a1e4bef1b700ac9fb9d2d6f02e2fea3d1c1ada009790738668a8359b6e264d38", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/FreeRTOS_TCP_Unit_test.c": "f283e74ecb1912fba3cc8664186301b39a75337aa48e7f03227274f97f98d376", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/README.md": "c8396e1f028fdc6c4cfce82eb8987536484f61f2dd6cd84cda6226b9b8d4c487", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/TCPFilePaths.cmake": "9f330dcefb76567591969a198674b14d2101871173d22546c6e857770c8f8f83", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/cmock/coverage.cmake": "e155a5a4f89869c40aa52fd6b81dd6df0ba83dc01429d756c6a9cc382cee2b16", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/cmock/create_test.cmake": "29f47f117ac31311cd2c903185da0a9cddc7efbc4603d4093bfd673dd6897502", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/cmock/project.yml": "81e1d57b8a8b724ab9be3ac0985b800eea0271ec7c53d513ce22e2b371dd6060", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/cmock_build.cmake": "90a0d545d0848194b28b86ed0d0815c4bf9ddf6cb4a9f6aabf9259d63e669524", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/stubs/FreeRTOS_ARP_stubs.c": "4d9c33ec2705f90ef074aea7553058c200108a0dbc1f96a59774f7a859204cee", - "libraries/freertos_plus/standard/freertos_plus_tcp/test/unit-test/unit_test_build.cmake": "24d557a556205517dbe65de1dca22b2f454fbf294771d0cd272ed3a404166097", - "libraries/freertos_plus/standard/tls/test/iot_test_tls.c": "29554dfebc3eff9a4c3feeaa3d9ef7b54144fbbb8ba41be9e5ab87d37b760f35", - "libraries/freertos_plus/standard/tls/test/iot_test_tls.h": "6788ea9aac4f15868e5833ab7ae7fd45875b4746d4db65a631503dfcb2b28a9b", - "tests/CMakeLists.txt": "ec58f7e4bc4c78addba71426b7f51a4229b02ce05dbb7cc69806fe20b4774051", - "tests/common/aws_test.c": "bb129bae37d7f83791bdd5a955e37546fdc099ccf2b1a91c4e0819b25cd15f19", - "tests/common/aws_test_framework.c": "86f2fb0b1e913a316457f3d61ef7748e2c14d09bc54248b269c5d0e2e85077ba", - "tests/common/aws_test_runner.c": "779213f0af9892590f50ad58d79d0ff6eed472eda5bc75504fcd8bc8e6d33883", - "tests/common/iot_test_freertos.c": "553fa643340c008b8ad4604c1ea4a094c95a59c7c3dec2bab91bef3422f79da4", - "tests/common/iot_tests_network.c": "fa96bce8b0cd935d7b0505b907e6655ba50bbc75a25e37947fc4eefc62aed06c", - "tests/include/aws_application_version.h": "7298862828bcb1e01f221c2a88e91584b0b409bbbb7644dddff0ed4de594c668", - "tests/include/aws_clientcredential.h": "043f2bca40ee773ff37a383969b6ecbf4191876c7ab7f81168ba24807412dd7a", - "tests/include/aws_clientcredential_keys.h": "3d0291cb02a4cffef2fcd6ca90765713de488be121cbf91858938917f290abef", - "tests/include/aws_test_framework.h": "b022fa265036e6e716662a2f86eebffbab053570967ca4222ddec7a95b01bbd7", - "tests/include/aws_test_runner.h": "d56fb11b6dad6c957d9a82bcb74d689c915b614649aa519ba06e9d5aebf009c3", - "tests/include/aws_test_tcp.h": "06a1e7b81e6c82f0b360e11da1ea30392b2f35397f5f23ca1a75a5c1d5e7145f", - "tests/include/aws_test_utils.h": "1ec2f74c7a2d8832d5fa2d126e10108497bd751fd06700a6731fcf10010b8e95", - "tests/include/aws_unity_config.h": "2c57e935856ff25b0f12476361383982c7b864f1e7820ebc8474692b801722f4", - "tests/include/iot_config_common.h": "b8baa71897f806144a34000c10add4dc00df23a1489824ea0d35ad6640df3dc5", - "tests/integration_test/CMakeLists.txt": "31ebb297d94746be938bd21cf02581cc05e50d627bdd5177ad8d4c0a16379ca1", - "tests/integration_test/core_mqtt_system_test.c": "db761ab1fc65f6be366f41259c84eccf3aa0bfaeebcb975b32ccffbe3cc1dddd", - "tests/integration_test/freertos_tcp_test_access_declare.h": "89915f3a2e90bc414d567138db08c00ef9f298ace314fba86f4643c8df3446fb", - "tests/integration_test/freertos_tcp_test_access_dns_define.h": "db9acf56f95d947688a882d5f5d877554ee47c30e6448a40e584f1a2917ba8dc", - "tests/integration_test/freertos_tcp_test_access_tcp_define.h": "9080cf2f0a880ac1fd99adb0479e7714a56bf3bf07980c0a4b2798da153f10ad", - "tests/integration_test/shadow_system_test.c": "c245d7a86985bd250d6c76f1d3dc8c7c4f94568651e0ba6b2952fa89b3e8964a", - "tests/integration_test/test_freertos_tcp.c": "e3a05baf55be188c4c280e358774d79b54dc6df8ed5622b9e005d0d143ebb32d", - "tests/unit_test/linux/CMakeLists.txt": "4d032e97271ca3c71232620d06b4190b984c59ca9a59be27c2c01cdbc00bddf0", - "tests/unit_test/linux/README.md": "3e8ca145ddeae48ce4549b4e8c3c737d1f753674942005f1086f0b8875fea8dd", - "tests/unit_test/linux/config_files/FreeRTOSConfig.h": "e21c535455eb095fd98ee26b50fc8a7078c2cd02c705c2da66fcb84efd8240b0", - "tests/unit_test/linux/config_files/aws_secure_sockets_config.h": "dc96eeacb73ca83b0ac09612e46f9fe147a1e6198e7609ced477a9f5de02c95c", - "tests/unit_test/linux/config_files/aws_wifi_config.h": "68ec1d32c970f80f1067bf462ec18fec007e67c975813a8fef4baae4e55e86ae", - "tests/unit_test/linux/config_files/config.h": "02102f50fca2162d08e3beb07840c539728e53d4d2588098a928d518c03e2504", - "tests/unit_test/linux/config_files/core_mqtt_config.h": "70ce45dcc49e65c79db25d7510a3335204a3bcda0ab9c1e1b789e99480c46fa0", - "tests/unit_test/linux/config_files/core_pkcs11_config.h": "481a16e40def599502f47e40fa9fc17772564b5065b736c696d2b86d5c2472bf", - "tests/unit_test/linux/config_files/iot_ble_config.h": "3a7c38843d733190aa05951ae0aa66f8733d1ccd1df5aea9ab0afb129cf05dd1", - "tests/unit_test/linux/config_files/iot_config.h": "e328282d270c1548d25b29d7160db29baa37792ae861fb1683aac57ff9cd0625", - "tests/unit_test/linux/config_files/iot_config_common.h": "6cdac2cf4515f40a16a6415264ff6caefd876394554490716ebcd4a57716176b", - "tests/unit_test/linux/config_files/logging_levels.h": "1a0c68f2abaab42a29c589d9a1240d33f365b345025adfd2273f8b9c0d2506ca", - "tests/unit_test/linux/config_files/logging_stack.h": "ced115e6fa662a09cb7f9e8eabf16e14073567d76d884788477d11f62bf96cb5", - "tests/unit_test/linux/config_files/portableDefs.h": "846d161b800c509c818e8e37ac5ccf66c56c5ff91502ed846d44d2ba14ac23c1", - "tests/unit_test/linux/config_files/portmacro.h": "9839920bbe61e1c30dd9fa7efe36a3b08367f486750fbbf7d14cdbab4f5126ce", - "tests/unit_test/linux/config_files/trcConfig.h": "3c64639c5150a2c59b7aedf9cbea346d5510dd3fce03598eafb2ca10480fa564", - "tests/unit_test/linux/config_files/trcSnapshotConfig.h": "1331a0cee7e872883993dc323210ec0e777a170c552a36a40610eb93a479c9e9", - "tests/unit_test/linux/utils/iot_atomic.h": "7ac0b52ffe7bd96cf3f65d360f12f51dc7813c617ad0f289d2f6f8b71d193dae", - "tests/unit_test/linux/utils/task_control.c": "016a0c387c76af9e1f108df2e2bcdefa99c7c083aa9b2a399905cc07df4e3113", - "tests/unit_test/linux/utils/task_control.h": "9f3237b85aa220b3f7107b0beee502708ac74fa446dcc4b62c3e32deebda2e82", - "tests/unit_test/linux/utils/wait_for_event.c": "056a4a6a24fb7585429e5ca290f445ccaacb1ea0416b429cb4014738b49c4a5b", - "tests/unit_test/linux/utils/wait_for_event.h": "9f5beaa137968ca80de3b97fa6a9037a521b26390b36ba2e95912ee3f1bb2a25" + "demos/CMakeLists.txt": "e1a11a664dc54b5a09d340094e09b36ef47f3b49200f22a527676a77ac3ad167", + "demos/README.md": "e1cca6698cc63794a4f8d02a181e880abffdf436fc1f6ca264d32fee6522a809", + "demos/ble/README.md": "7afc1253b4286497f499cbf32cb9c683d9487bb6251eba37c0d8a77a54dd6780", + "demos/ble/gatt_server/CMakeLists.txt": "152eeb517a01301fbea83c736f0271fe9b632dceb2157038ac08bdbddce93dee", + "demos/ble/gatt_server/aws_ble_gatt_server_demo.c": "8830d2d3619d583a94a187700f3dc28be07acfbf424b524a64bef87dde561f56", + "demos/ble/mqtt_ble/CMakeLists.txt": "4f90e24641015772c80219a4d1ef4597c38cc7abd89ce36d737f02a6d879076b", + "demos/ble/mqtt_ble/mqtt_demo_ble_transport.c": "c949f258fd31918a75388bf66c3e67ecb6d040931c65b75b543e1947d5226857", + "demos/ble/numeric_comparison/CMakeLists.txt": "35998f0a565000bb3158f0c63164aad7685dd4d6d7dcc4b2782f6b9af64c5589", + "demos/ble/numeric_comparison/iot_ble_numericComparison.c": "78bfcc1ca9fe5b95c02e181964f2c9d03d97962d72bf72ba7aebc41ab0042dde", + "demos/ble/shadow_ble/CMakeLists.txt": "ef375f456597e61b844287be7ae3c6498fd0d66e30df1623de3db05a59f944d1", + "demos/ble/shadow_ble/shadow_demo_ble_transport.c": "75a63977781fcd1b6ee870ad6ec0eb569f567ae54e132eb0e47017164e2501ab", + "demos/cli/CMakeLists.txt": "39a38609feffe4b42f70c14aaefa2a04df3be45aed9cfb32c7621e2aa64becde", + "demos/cli/README.md": "03c46cacf4eb8ab860f1a337454c36c45d75d560a2852ac8d3132fb1bce0e222", + "demos/cli/cli_uart_demo.c": "075425bb8b4c0e345097006cf327f01ed7ccb1b0d0112f0f95a66643ef491d89", + "demos/common/http_demo_helpers/CMakeLists.txt": "74d7714e1f43dc54734d304ef7a581e98ec2c1d0ecc45b24516ef7b8c2792ffd", + "demos/common/http_demo_helpers/http_demo_utils.c": "8fed457fbd4123ea762ab68b58eddc22a1dc527fbdebe79ddd064032b1720053", + "demos/common/http_demo_helpers/http_demo_utils.h": "25f342cbb329fa0dcd9d5ac1e69948912337722c90486b832b1d79b4da07a2ec", + "demos/common/http_demo_helpers/presigned_url_generator/README.md": "fc1842ef78e85d2efad99c8b8e7e604aed4f2cd7d1635e8cdaaabe4ec443f523", + "demos/common/http_demo_helpers/presigned_url_generator/presigned_urls_gen.py": "a7669c25e0c78698e76312923d3a1c7fee5373f484dbd713c4e3a7bf258334f6", + "demos/common/mqtt_demo_helpers/CMakeLists.txt": "9e3de506ecc71b53d8fd3afd2bfdc3b04ffa3a8dd31d02f487aa755f0fa340de", + "demos/common/mqtt_demo_helpers/mqtt_demo_helpers.c": "c4d6000084a51365cce83bbc2915b93d3261ab2593b9cca0dfead955e01d2eae", + "demos/common/mqtt_demo_helpers/mqtt_demo_helpers.h": "cfde158267841e6b13f7bdf21f216f48d78b5c766a51df1a9dfa10edb2877d5b", + "demos/common/pkcs11_helpers/CMakeLists.txt": "0b5064b3b716477103d71d866277635cea7ffd5fbad48130e3411d7ca09eb933", + "demos/common/pkcs11_helpers/pkcs11_helpers.c": "5e51bc5378ea580b965a9cffd061ec5b8ad5c407235d8ee7a9e49ccd2a791b8c", + "demos/common/pkcs11_helpers/pkcs11_helpers.h": "c8ae701bfde1070e3f4c3c778c85d03e5722f8092f646e2bb6ab4e2810b821e4", + "demos/coreHTTP/CMakeLists.txt": "f9f08ee646567ea0c5b6082c842cadacb7bf2b21bb9489a3f814861da1744aac", + "demos/coreHTTP/http_demo_mutual_auth.c": "88b980102847d9bbaf6d46e8d545291994b7a265a02bdd5829261535c7179b18", + "demos/coreHTTP/http_demo_s3_download.c": "6ecc2c8c3b75e6ebaaadb8faee12442b382e34bcf4c59e760b47449118b5afa1", + "demos/coreHTTP/http_demo_s3_download_multithreaded.c": "aff506d5cd2626962061c0ead2d197c41e28e2ff27f63b8a740ddf75cf0d3657", + "demos/coreHTTP/http_demo_s3_upload.c": "a0ba4f627e6ed75e7eac56a52ba67974c89af15ec5a4f9eb89e1bd46bc75c1f9", + "demos/coreMQTT/CMakeLists.txt": "00d0d6051a92bd8eb562f17fff0e1589891c319d5540c9ef249a2ece08f17753", + "demos/coreMQTT/mqtt_demo_connection_sharing.c": "aa439bfb3c516bcdf60edf60d6cc7b7f71de001f9bfd8debc93f355c7dc9c220", + "demos/coreMQTT/mqtt_demo_mutual_auth.c": "01da688dec5ac5ebfbf46835e692a7d6d6b016aca3e5d65e70f034b5f021512b", + "demos/demo_runner/aws_demo.c": "2be964689975a5fbf9365e6ccfef3c8937ea545d86f093abfa3cb7671d57338a", + "demos/demo_runner/aws_demo_network_addr.c": "a2c669dcf420af9efa57a764da0d629a23cbd96fdfca179669bf5f8cb68a41c1", + "demos/demo_runner/aws_demo_version.c": "48e67d48ac4d989630be72c3e831b1243abb6051ea3615efa398bf5c05b57a66", + "demos/demo_runner/iot_demo_freertos.c": "9ae55ff87b9db4e9a17714e6f97096691df962fd0c08bb9ca1a792579925cd46", + "demos/demo_runner/iot_demo_runner.c": "987e71d9c275c4e5f8606506019beb33d4e6ed749edbb1a195cc1c5c123b814a", + "demos/dev_mode_key_provisioning/CMakeLists.txt": "9f72c9c400638e5125b2a40fa70a783bb5f29196a673f3221c39d54f2a69222c", + "demos/dev_mode_key_provisioning/README.md": "ac9cdb2605b93dd736045006af72e9504fd3fa98bf968ae9d413ecfcb45fe3e3", + "demos/dev_mode_key_provisioning/include/aws_dev_mode_key_provisioning.h": "f9012eb4be9fd9b919f4107c8257ac982320972fea2cf29bdf3c2c9dcd9325f9", + "demos/dev_mode_key_provisioning/src/aws_dev_mode_key_provisioning.c": "d17a944d1139a3596294743d3e31e4233b198f5556d0cefc49f37baa012b514f", + "demos/device_defender_for_aws/CMakeLists.txt": "94d7669145a3ec26d66de306c4ef46d8eeb4b933c744a0c90959bf02dd485eb9", + "demos/device_defender_for_aws/defender_demo.c": "e4e53e4cae12c04bd19751b1a23c305606bc562389bbe157ddc79c1bb8a38488", + "demos/device_defender_for_aws/metrics_collector.h": "7db7237f9a66fa0064a7c3a6792f77d4a1da22a329b2a64460b7dbc4dae6e52c", + "demos/device_defender_for_aws/metrics_collector/freertos_plus_tcp/metrics_collector.c": "86c983300ea019f242c1da5b5e0bb7bc3d3892ee4d5a394f9170be77667a85f0", + "demos/device_defender_for_aws/metrics_collector/lwip/metrics_collector.c": "7709851b795d0e86b8f59a5dfcaec0a472bb9bbc0038e9397978aa6a01c530a6", + "demos/device_defender_for_aws/metrics_collector/lwip/netif_port.h": "62b8b70cf4c046d9e435364fea48d5f41cdb28e6fd71640c7c7a495f962ffba5", + "demos/device_defender_for_aws/metrics_collector/stub/metrics_collector.c": "5cd03344ae0a3f55f7feb0bd1f41e6141a76b728014ac38a58ab4e6ad9d092d1", + "demos/device_defender_for_aws/report_builder.c": "137f9c91d5400f119177aee30c474ee1efa68dc950878e253c6b1c5d0774056e", + "demos/device_defender_for_aws/report_builder.h": "74c745ef9203848c2d62e1bfb69044b8c39258e85c28f12378a53c5e18dba3c3", + "demos/device_shadow_for_aws/CMakeLists.txt": "d458e586630aae23e33dd3ea851299e93088d40b6ed20b22a4ab48add6668e98", + "demos/device_shadow_for_aws/shadow_demo_main.c": "0ad9b00baca97bc37202bb5cc16be7cff647ac440fec93d498166ca2be59f560", + "demos/directories.txt": "f830aa514024f3db8fa561be02901f07f46e4277b5c2f788e1224e5d0b12ad10", + "demos/greengrass_connectivity/CMakeLists.txt": "384633cdeea4ef23a740409dd969d7d426ec4539c2430f627c11181fc8a0ccc1", + "demos/greengrass_connectivity/README.md": "f698c41b63b8404fefaa80f41f5888fe99ae107fee5843ee56de7422a993d252", + "demos/greengrass_connectivity/aws_greengrass_discovery_demo.c": "54185c811948897deadf699241d8bdeb223d2ab3755ff210d6aaa8990fe801c7", + "demos/include/aws_application_version.h": "12d9da910e8c86daf3eb2096ac942b05936f8eef43553b02153e42ee5d575d65", + "demos/include/aws_ble_gatt_server_demo.h": "ab08ffc4e1a594c8afa22b69ed12f3f9e48031fa45ee36cb50758cdc8eaf5942", + "demos/include/aws_clientcredential.h": "fe05ef63909030beacd142eae73e5d16d68c2fbb35ad350e85863e4a33f91a97", + "demos/include/aws_clientcredential_keys.h": "0a037a57d8b53229b4858aa9bb3abb88759ef978563c955b3974e1f2e185bcef", + "demos/include/aws_demo.h": "6841f58aa8a1cfc18e958ac1d0e41521740c8409dba62aa07003d777fa00e43e", + "demos/include/aws_iot_demo_network.h": "39a22e735e9cd0e06b9fb28af1262440bfc2c0ecb78035d0d21354c1166b9f03", + "demos/include/aws_ota_codesigner_certificate.h": "00419f40a5e99225d98606648c8f33350ab29d41442c722670a0f16ac4eb0331", + "demos/include/aws_wifi_connect_task.h": "237aa206d1d6fd5aada0fa8a846f7588166ccf95fcc981ac82bb4141f6e37ca1", + "demos/include/iot_ble_numericComparison.h": "473ac9bc8098ed9e39d1780e39ede22b7d239cb28fa596d3697cd337f56ea430", + "demos/include/iot_config_common.h": "294f822c0ece8d8f522fb96f6e8a5eeaf828615a73a8aafebdfea1fcd44aa2a0", + "demos/include/iot_demo_logging.h": "ce9cc97c974393619c9bfa0006840130ea609566192c28268c91edeb06059c9d", + "demos/include/iot_demo_runner.h": "9c368fb940aa8a9e75a282a7bc5b2d3ac273ae77479c9d275211163eba70c4b4", + "demos/jobs_for_aws/CMakeLists.txt": "c067824d4be05033f1542f572d2d26943347be974dd38df5c4a029e4a2a08c1a", + "demos/jobs_for_aws/jobs_demo.c": "a42332ba09f364b45ba5ac0f49fa8c852ca5f1888db8980ac82317d5a5e159f5", + "demos/network_manager/aws_iot_demo_network.c": "4c709b3b2cec0ca7c02f0c017deb292f7a972fcd3d8937168557b47e8dc3e7f0", + "demos/network_manager/aws_iot_network_manager.c": "025c543fb7cbeddeb1c402b93a37fdb2ba3e9ff7b2b41264fdc5c9c001b2b3bf", + "demos/network_manager/iot_network_manager_private.h": "d0a3a82c8d89f76192f31686ded57de07e1f081e0854ac890823f30824ca021e", + "demos/ota/CMakeLists.txt": "97eb17c125e3b60bcebf1d5230cbd9da2ffe11d245ba642dd128c8c52965e89b", + "demos/ota/aws_iot_ota_update_demo.c": "a553895cdba137cac2ef25c73611809851a4e5d9c2a3e8787f8b003f9f33d8a9", + "demos/posix/CMakeLists.txt": "2ebbf9aac42e713a1b851c61fa9307be255528911ab3067e62064257a5ba6dc0", + "demos/posix/aws_posix_demo.c": "7c93b85293ba4272750e035b0e578ba0b5ec0cb5762afc17bf4ef246818d8594", + "demos/tcp/CMakeLists.txt": "99e72686738645dc71be2b6f87ff5ed5e7ac320c3a2073e8be9598c5bd9110e4", + "demos/tcp/aws_tcp_echo_client_single_task.c": "2c4d135cc8e85d8d2e7f38f46463d50cba1e823ebbc9db9d48ef874af97e652c", + "demos/tcp/aws_tcp_echo_client_single_tasks.h": "ae9c4797201b1fb340af166c29c34a4077b180c07b700e44671a5cbf05776fdf", + "demos/wifi_provisioning/CMakeLists.txt": "daf58d954ac6f1bcdba29c56cdf51d79af41b17279a93f5602465363008b156b", + "demos/wifi_provisioning/README.md": "8cf1fa67aa68ff85ed13aa8aef5316af2c31b6552c2044f2e618a0c0472a6e3a", + "demos/wifi_provisioning/aws_wifi_connect_task.c": "97ef205bbd68172a2ad6f7957c35d4dfe7a8e145bf6d8ce8f6a95bbc90f2fe76", + "libraries/abstractions/ble_hal/test/ble_test_scipts/attributesCommon.py": "a4eca76d9a909cdb35bbb3b8fc2f08248900935ddcb26119cadf7a12efd9bd18", + "libraries/abstractions/ble_hal/test/ble_test_scipts/bleAdapter.py": "f5f102eda56dc3e4a9dd5d217a76451cb3d98ccc325a26ff371f0ba183966bd0", + "libraries/abstractions/ble_hal/test/ble_test_scipts/gattClient.py": "d2aca12ed4a620fb9009eba16d5a793d9d4b81b617c4b405d5e29ebdfd997b10", + "libraries/abstractions/ble_hal/test/ble_test_scipts/runPI.sh": "226ef495cdf367d326398d62b348a991cf01a99dc3df6e4a9eccfeb153ae948e", + "libraries/abstractions/ble_hal/test/ble_test_scipts/securityAgent.py": "108f4a63557798c64b740e0575ed699426782b0398ccbda4f60ac793089ccab3", + "libraries/abstractions/ble_hal/test/ble_test_scipts/startTests_afqp.py": "3a71d8b8cd82604d3344fa3110d157a9d01d3faa0e0613116a17389f7572c298", + "libraries/abstractions/ble_hal/test/ble_test_scipts/startTests_integration.py": "30b41b42d04a777b0f5b4cbfef43738868946ffa69cf2105b113a9ca7f88fe43", + "libraries/abstractions/ble_hal/test/ble_test_scipts/startTests_kpi.py": "7dfc4b8cbbf8795f7f054d3be9b3454f49666253573f7d6f2642741c344e8e55", + "libraries/abstractions/ble_hal/test/ble_test_scipts/startTests_stress.py": "91a6b6781284cd1b1f87b391d3695c96e673bf2e2e96750d28b8dcf1d858c251", + "libraries/abstractions/ble_hal/test/ble_test_scipts/test1.py": "0b22ea40c1bdb550d0b1dac1d91427b8811b8ca5f09422290be01baa9e42c05d", + "libraries/abstractions/ble_hal/test/ble_test_scipts/testClass.py": "f7e4fde0bbe016db98f9d8e432c189c8c42751afca9638569f4aacd431bcf0ad", + "libraries/abstractions/ble_hal/test/ble_test_scipts/testutils.py": "1e571b073d6184e95cd6e61d56f0c927d8f9882bcee1fa421e3ef221c31fb463", + "libraries/abstractions/ble_hal/test/include/iot_test_ble_hal_afqp.h": "4660cd048278613d15508bc9da70e556ad1e7d0e7efafbdbe7f1e7628de65cfb", + "libraries/abstractions/ble_hal/test/include/iot_test_ble_hal_common.h": "d6f84a433d8fece87d6fd1272a16b10e732b87e6dafea43275080498b8e5c8e8", + "libraries/abstractions/ble_hal/test/include/iot_test_ble_hal_config_defaults.h": "c903363afea6d4a48734f86e00e4779e77f164f0216a91d1794bef763a6a8f00", + "libraries/abstractions/ble_hal/test/include/iot_test_ble_hal_integration.h": "65ecd0a669f46385511d35335c7ca8f91e9df208f26e13265fc9ad22131639d8", + "libraries/abstractions/ble_hal/test/include/iot_test_ble_hal_kpi.h": "90ba3933acf588b1b37d237d30b2c99365b5c446d0a11485f6a598c744d7985f", + "libraries/abstractions/ble_hal/test/include/iot_test_ble_hal_stress_test.h": "c5607433cc84241984a8be56831f194e99ce85a8da3db2d46a22756fcf05a115", + "libraries/abstractions/ble_hal/test/src/iot_test_ble_hal_afqp.c": "d1855070ee01326e637e31c1a29973ddfaaa7465546527199b590a84135cc6ba", + "libraries/abstractions/ble_hal/test/src/iot_test_ble_hal_common.c": "ee89287628d854d7925f859408f534b17dacfd745bbb139b3c76b22872e823ca", + "libraries/abstractions/ble_hal/test/src/iot_test_ble_hal_integration.c": "cdd5fbf8fe82a42efc68017ac2f67b32fce69727da75f35430da19a72d4a0c99", + "libraries/abstractions/ble_hal/test/src/iot_test_ble_hal_kpi.c": "576457c49c0ae59204acda3e13e476cf614807a8cae793c06aa56dc8db42abec", + "libraries/abstractions/ble_hal/test/src/iot_test_ble_hal_stress_test.c": "85eb3f0bb84c078592a962398a615fe8c0f6bcdeb2c0875bd2fc96ed4e5e00c8", + "libraries/abstractions/pkcs11/test/MBT_C_CloseSession.c": "f316daa101c47688cdc238a1b791035e2c0380bedb3410d1c643d3e1476d5acc", + "libraries/abstractions/pkcs11/test/MBT_C_DigestFinal.c": "d0be185de95705a42bcfc292de3bfdf85e0583c1eca79a9ea8c679f457e80e62", + "libraries/abstractions/pkcs11/test/MBT_C_DigestInit.c": "f2796e12b07cff645092f8a1eeb32f66b4f715aee4f47403a040e54f913730d9", + "libraries/abstractions/pkcs11/test/MBT_C_DigestUpdate.c": "8e7568eb0cc85fbd4ba01e35b105096651026cdb30fa4456ffeab8e3bbadaf0a", + "libraries/abstractions/pkcs11/test/MBT_C_Finalize.c": "1dee24c1ba0ece633174c9d828ae0b263383ecb8635ef2223316fd6cab321064", + "libraries/abstractions/pkcs11/test/MBT_C_FindObjects.c": "fb3da851d795f107d0ea25bfda32eb44412abd0710d7ef2ca25a73f9214dfffb", + "libraries/abstractions/pkcs11/test/MBT_C_FindObjectsFinal.c": "2ccf532ee7600d07faeae2b733f1f26ac7ffc988485820f14b9cd298e614c4a4", + "libraries/abstractions/pkcs11/test/MBT_C_FindObjectsInit.c": "b2a2d23f7b5d2504da688ea8d7d00aeb5695567f973bcb9606d4473c2068f9dc", + "libraries/abstractions/pkcs11/test/MBT_C_GenerateKeyPair.c": "b60e379e5b0fdd9643f7cfdd7aaf43bb3019380264f62b507cb3e1f6b7eb7149", + "libraries/abstractions/pkcs11/test/MBT_C_GenerateRandom.c": "25ab67fd16402844842097b765ccc63ab217eb18dc91f6ac1a73fc848a883b02", + "libraries/abstractions/pkcs11/test/MBT_C_GetAttributeValue.c": "3ffd3f0c2c5e1631dd9437a67cd63563a1a3637bfad4949e61b2b9e099be260b", + "libraries/abstractions/pkcs11/test/MBT_C_Initialize.c": "d515ad4c9c5db86db5c5f7b328d64240e7834baf2493b8815de8145648997aef", + "libraries/abstractions/pkcs11/test/MBT_C_OpenSession.c": "95c6f69004ef20180fe20beb5f2fb62c460f2a5511fcf07725db9fd6957c70d6", + "libraries/abstractions/pkcs11/test/MBT_C_Sign.c": "d9277bc9b91d281a2dbd80067f015aa2c995acd78b9a91737d0fb62f3b27bdcf", + "libraries/abstractions/pkcs11/test/MBT_C_SignInit.c": "896a325e90f8cdee989b18fa2bf661d0a7105ea999b166d41949a2ff52ac50fa", + "libraries/abstractions/pkcs11/test/MBT_C_Verify.c": "8afa0525843dc34ab9a4cb566306c602fdf23fac6f22685bad593bfe055acc24", + "libraries/abstractions/pkcs11/test/MBT_C_VerifyInit.c": "7086c0a388e2bfb2eeae092952655a57df13adf0c05c1e18d6cdfa03b4d2180f", + "libraries/abstractions/pkcs11/test/MBT_DigestMachine.c": "649037d3a5f39de8ee72487162fce4b801ff39d2330ad56bbc015b6ac55f6c85", + "libraries/abstractions/pkcs11/test/MBT_GenerationMachine.c": "be1dcb4c8167f26503fa0bd37caad3dc7399161211ff2f0f5ac519d842e99e0e", + "libraries/abstractions/pkcs11/test/MBT_ObjectMachine.c": "dba2ca7acd412a701d2fb0e5ff629adb0af7562b13335df94fc0fd09d2b48d01", + "libraries/abstractions/pkcs11/test/MBT_SessionMachine.c": "4cddd9627258f4468df3eebabe746eabfd99a091147d1663accc3f27be83c935", + "libraries/abstractions/pkcs11/test/MBT_SignMachine.c": "20f94c19ddf2742acd4da74bb306e10b29acf884158e21d1f50cf7add8e2bbaa", + "libraries/abstractions/pkcs11/test/MBT_VerifyMachine.c": "50da5f00c64eea0f47d19a02ead5bee7bd3dc0acf40a60c93a5428a7560fba97", + "libraries/abstractions/pkcs11/test/iot_test_pkcs11.c": "ee9b8776bf492ac10f9cd3e482c27418420103079f678ee4f25644aa4fcfb3e0", + "libraries/abstractions/pkcs11/test/iot_test_pkcs11_globals.h": "3920b26d79ef67fe8b906acc0f000ad80c1944f0eaad5e3bcd8ed759f64089de", + "libraries/abstractions/secure_sockets/test/iot_test_tcp.c": "b00a3da003bc20048bad54bca53af2a15a3bcf7a041af554a5252e1c06c9c759", + "libraries/abstractions/wifi/test/iot_test_wifi.c": "fc0096c4adc48842fd84690184c06233b731ca4dd29bac297690f6576bdf8935", + "libraries/abstractions/wifi/test/iot_test_wifi.h": "5a19517bf48ef66bebfdb1e04fb1f3cbdab7bf30e6d19620c373ccee4aac3399", + "libraries/c_sdk/standard/ble/test/CMakeLists.txt": "c332dbdf621b42384a139151acf9c5c3e06190a18d2e7ee25ac5f25cb9a46bfe", + "libraries/c_sdk/standard/ble/test/iot_ble_wifi_prov_test_access_declare.h": "8b28220244a9a6237673a254010b29a0a4c2e3aaf3502e38bb25124f913deafb", + "libraries/c_sdk/standard/ble/test/iot_ble_wifi_prov_test_access_define.h": "d5d07c1230d497a421f3c4d0f7b59f89b01706c4468372a9134280358b4f3a4b", + "libraries/c_sdk/standard/ble/test/iot_mqtt_ble_system_test.c": "b83a703c8f21a6cca713c019b4e1bc740fbef90231c61156ed67828dc67a4e53", + "libraries/c_sdk/standard/ble/test/iot_test_ble_end_to_end.c": "d47ba1df33d16239cb1c99f0fe0e397d7befa6a8e83adb34d7299e4234b2701f", + "libraries/c_sdk/standard/ble/test/iot_test_ble_mqtt_serialize.c": "b32bc682f79db7852995c3e3a5654d53e16c507cc32db45a74d813fa6f066bbd", + "libraries/c_sdk/standard/ble/test/iot_test_wifi_provisioning.c": "6bd06607991df48ddefd2dde5d47978eae9cf1fb75f0eed9baeed5ef39f5f9ac", + "libraries/freertos_plus/aws/ota/test/README.md": "4ced3c5630f4f80f1d521bbbf284a005764a3a30a0d493d03dda7b072c9e9f55", + "libraries/freertos_plus/aws/ota/test/aws_ota_agent_test_access_declare.h": "12f13edb214506945ef5705d643b8da9285f2f1d28068b4cf5c9f57ca7729dff", + "libraries/freertos_plus/aws/ota/test/aws_ota_agent_test_access_define.h": "f87ac9f64f61addfa1ad1af8c520c0efce5d3bd053dee03a9f73de2fe8a4b183", + "libraries/freertos_plus/aws/ota/test/aws_ota_codesigner_certificate.h": "66c35df6bc08423c7ff865be60f0552e3c4dd5944f007eb1dcd07f30ab38dfe0", + "libraries/freertos_plus/aws/ota/test/aws_ota_pal_test_access_declare.h": "29ec4ff20e2de3ad6804195cb5c0ac6435ff47e754fc4b8ece3683f0bdec4e45", + "libraries/freertos_plus/aws/ota/test/aws_ota_pal_test_access_define.h": "37c33a96adeaa79bf40f44fb3ab72d0c07cf6b7f39e68356657060c5df72a696", + "libraries/freertos_plus/aws/ota/test/aws_test_ota_agent.c": "692aa14daf0174b2c2b5d8bab90642adbe3c36a47466742cbefeca863925876c", + "libraries/freertos_plus/aws/ota/test/aws_test_ota_cbor.c": "0d093e61c8206be2aef35de6fbaaa1b2762b1479d31d692acd4690221d9bad6c", + "libraries/freertos_plus/aws/ota/test/aws_test_ota_pal.c": "f0f387b0e1d2d8eaad9e76f10ee332af4821e75f820d760d5ca1fbae17db6af3", + "libraries/freertos_plus/aws/ota/test/aws_test_ota_pal_ecdsa_sha256_signature.h": "1d7cc108377ccf2d0910421e7e8c05510c572799e5c16e4eb422e231f7c4af98", + "libraries/freertos_plus/aws/ota/test/aws_test_ota_pal_rsa_sha1_signature.h": "49443686ce2bb4b7fa4000bf5eb01bbbd2828b6946838a54bed30ca66582ef04", + "libraries/freertos_plus/aws/ota/test/aws_test_ota_pal_rsa_sha256_signature.h": "7972c85001d4f298dffd7392672e035c483006b871d64913614a60b2e9ac2fca", + "libraries/freertos_plus/aws/ota/test/aws_test_ota_signature_methods.h": "6015225bcc029fd04aa62f71f254badcd57daf68ddbdf12053f88d01669e175e", + "libraries/freertos_plus/aws/ota/test/test_files/describeStreamResponse.cbor": "b314ea57c902e90d41e2acebc0dc7dd9ba8924876d23a88754dd1c4765b21541", + "libraries/freertos_plus/aws/ota/test/test_files/ecdsa-sha256-signer.crt.pem": "79705066d68dc58ba6b5c9ad27e8c3f355184be078025ab76d1a1bc9a9cbeade", + "libraries/freertos_plus/aws/ota/test/test_files/ecdsa-sha256-signer.key.pem": "cb258c4d1d4e4fc355cd13051d4130719fba62257797cc3e17083443bb767b06", + "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_0.cbor": "bf223676be6a282853bc22c64faee719ab74068a4d7770d977a6f37c67400fdd", + "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_1.cbor": "72b22a9ea24016629f6d169b52e98e735ee9924bb4f13c1295f1efd5f6fc6abd", + "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_10.cbor": "e6b9ee23bbd6d33240bebaccd8ee9978230ad8e7206926246ed36a1a8d60e4f4", + "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_11.cbor": "14f6287ab8666bed3d2c0998763f1fd30baffee52e7fe79994c6ee20e868653b", + "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_12.cbor": "4bf01a682c8fcfe0c47fb78b04d73d61aa31a79f6bcb07410bc530edc22a18da", + "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_13.cbor": "fdfd00cb7c0874216925c7152c9491b38c9dd179bfaffeba954c4eb27947ca75", + "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_14.cbor": "207819f2f6d5d82a3d3b1dcea0f508e4fe217ca243bad33090940d7bf1e03128", + "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_15.cbor": "31910394ab515ca70c57aae3be88d14f9a35e3e66ba7c6c3132ef0b93830289d", + "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_2.cbor": "cfb32bc6d6fafed74e985824f0b731837372179aece4d0a84087919a256ee59d", + "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_3.cbor": "a4733133a6c983859459141909031bfbb153cca083b9e881f24542c05041ec7a", + "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_4.cbor": "509a62af0b2906057735a635572e8e17aed57e8f0c42def8736db880823ef65d", + "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_5.cbor": "b471bc1ef2bff3b72da84f9bef8bc4ec44fc6aec26d3501cf1b5991fb62732a8", + "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_6.cbor": "bfa28de6fbb8330be654728e64d935c7582c8aae45ab992a4f6c0b7f19b803a2", + "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_7.cbor": "e1614f15ca0fec4d3bec19e7d48be470066957de78bb41ba5870786a0d15f678", + "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_8.cbor": "e66c279dded094b1654748fdbb527eb290f3f142ac3f4f7edfb2c439a49b984f", + "libraries/freertos_plus/aws/ota/test/test_files/getStreamResponse_9.cbor": "3536044b7fffe7ae1241823ed01bfaf056bb09a55d43f6b8e70af4ee62fffb17", + "libraries/freertos_plus/aws/ota/test/test_files/payload.bin": "cd5639809d3f72ab83ead330059af6fecebac84927704617bbccc710b1c23253", + "libraries/freertos_plus/aws/ota/test/test_files/rsa-sha1-root-ca-cert-key.pem": "9e97f6f9ea210b532a7b86eac12f0d97a1b6c372e22ab86187bf98e5e208c4aa", + "libraries/freertos_plus/aws/ota/test/test_files/rsa-sha1-root-ca-cert.pem": "b550b03c7b547629bd0ecfdbc5804cd72d6b57dc0ec8cf8a1bd2616215d602a4", + "libraries/freertos_plus/aws/ota/test/test_files/rsa-sha1-signer.crt.pem": "4a05cecf862a081237cee9207be87080e2c50544959f74be2c3908d7857b9da7", + "libraries/freertos_plus/aws/ota/test/test_files/rsa-sha1-signer.key.pem": "46d820537f7b3d57c8f9ee63d9019602cc9329a6cd0b6a5f8ffcdb1838125601", + "libraries/freertos_plus/aws/ota/test/test_files/rsa-sha256-signer.crt.pem": "5de1c733099a249e2424c38aa9b732094914f260ba2582cc39f9198f46d0b7d5", + "libraries/freertos_plus/aws/ota/test/test_files/rsa-sha256-signer.key.pem": "baceeaf3b8fb0e16a4d3eb8a1b016dfcd41f752270f00649311ba567759e9e29", + "libraries/freertos_plus/aws/ota/test/test_files/rsasigner.crt": "2b92ff249815c106222fa13ef62bf2353f2ebb9180c36c474203efbc055ed2dc", + "libraries/freertos_plus/standard/tls/test/iot_test_tls.c": "7f045cc4e4ad59a5294cf7cce7c77c40f9f62fa9728b09080ec4ab8af7d0ef7f", + "libraries/freertos_plus/standard/tls/test/iot_test_tls.h": "b3931813dbad0eaa43ebbc8df80b26d0783c80b978b4d58d5b71fea023c15cc1", + "tests/CMakeLists.txt": "ec58f7e4bc4c78addba71426b7f51a4229b02ce05dbb7cc69806fe20b4774051", + "tests/common/aws_test.c": "8c529f6163ea47735a58313c979145f989c0918655f27c802acd909f846fc042", + "tests/common/aws_test_framework.c": "38b4944ae657fb1d9599cc87079462994772342edc88b6f281d83bc3a567f38b", + "tests/common/aws_test_runner.c": "abbab15bd3b511b29293da8ee5fc8c858c32548d709976520cd2262f82808e8d", + "tests/common/iot_test_freertos.c": "83ab93d9f694c2067a1ebb716b05dbf58db82dd9b5e3ea640365dd21ccdf3646", + "tests/common/iot_tests_network.c": "7897cec83bf4fad4042bc18584b91ee907d38f868cc6e0c4004e4a39f722d1aa", + "tests/include/aws_application_version.h": "f60fd918e1fa4593c54b5021cf1ea04f074d4c15874fda9c865bc0ee3b3cb97e", + "tests/include/aws_clientcredential.h": "9ddfa1b9cee7627cce3ca06a1218aa4795623a297f3e2b1300f166a98ba477e1", + "tests/include/aws_clientcredential_keys.h": "aea58dd1a8d6b520d901e21df1eef0e4464cccdc057a092e68c1ff4fe60de327", + "tests/include/aws_test_framework.h": "198a26059a758e86348f39f99deadbad3503c28e90416dbfeba2658faa10003b", + "tests/include/aws_test_runner.h": "b658994237bcdc044b9778de18be22cb73b1054bea9e36e4f487b63b4823da97", + "tests/include/aws_test_tcp.h": "dea182055de9c8e0a7073419310dfc12a196c8595b44b3eef3de4f18ff0fc539", + "tests/include/aws_test_utils.h": "1eb566be98d2991c6e7d684852c8d9c30d1bfd346236ec344f8fa542b07a782a", + "tests/include/aws_unity_config.h": "defedeab0ecca302ffd4df7449ee97bdc5e411c38a7aea255179a8cb36516d75", + "tests/include/iot_config_common.h": "ed660bbdeee86fa711de3e2417029498854f5591a1fb7201d1bb7e450f5d2dc0", + "tests/integration_test/CMakeLists.txt": "881bececad22738b24b4a5a7226e0aadca0935024db12cb5f6949e732d82645b", + "tests/integration_test/core_http_system_test.c": "a76d516bed97f4ca81187a41d5b4764c281a0d1a33290c3d930926cfa504d090", + "tests/integration_test/core_mqtt_system_test.c": "3c66b2373bf1590699b002e5886553fd4514e56066bceb6266ed0935842596b6", + "tests/integration_test/freertos_tcp_test_access_declare.h": "1f74d984c8cc1e29af6c3edbebb45cae55488e4b87d5564c391cc9d202f8e7c2", + "tests/integration_test/freertos_tcp_test_access_dns_define.h": "d7b0b69ad6fecdd5f3798c4a9c96e6a7085dcc4a50f40a364739593821e7b57a", + "tests/integration_test/freertos_tcp_test_access_tcp_define.h": "50638448a5a2bdbab198b586460f385f5fb8fa80b375e3799550e091abbe8e1e", + "tests/integration_test/shadow_system_test.c": "ad050d596392bd3006cf32acd1787cd10fa1ee053270111b7ca601cac4a990f9", + "tests/integration_test/test_freertos_tcp.c": "c31b370bffb7b5b9792541aa11df27afa685eb5f1a3227e3b54226a0a3f67387", + "tests/unit_test/linux/CMakeLists.txt": "ba82e9bc8258c5e9d86ecdb7e092345017e5642a0ccdd4b7ab01274815d59c17", + "tests/unit_test/linux/README.md": "3e8ca145ddeae48ce4549b4e8c3c737d1f753674942005f1086f0b8875fea8dd", + "tests/unit_test/linux/config_files/FreeRTOSConfig.h": "d5f1d4c3d5847912b5c06212227b3159fa7e375b709604bf606b331cf267170b", + "tests/unit_test/linux/config_files/aws_secure_sockets_config.h": "57ea48f6d27c2f25092d7347699da81b2a5ebf1cc91f7365b9331286b8dc5059", + "tests/unit_test/linux/config_files/aws_wifi_config.h": "0fc14c96bbc3379534adf57e9477b4b15194bfc24b80be5e074dae32aceee12c", + "tests/unit_test/linux/config_files/config.h": "02102f50fca2162d08e3beb07840c539728e53d4d2588098a928d518c03e2504", + "tests/unit_test/linux/config_files/core_mqtt_config.h": "3a4017949c0f8668f992052706beaa5192e321a44a2ca67f7ab0be818d19e516", + "tests/unit_test/linux/config_files/core_pkcs11_config.h": "c5a24088fea06b44712dcd1490ce971dc358ae39768fbc3a1fc62c28f6563f3f", + "tests/unit_test/linux/config_files/iot_ble_config.h": "911de7dc95ef7ba07c999a6abe06bbe8ec2bb0904d88477ef36eb6c7251035f4", + "tests/unit_test/linux/config_files/iot_config.h": "532cfcfce9763a5d92a91ab37d94ac68193d68537eb33ba5e8dab4c8389fb0fb", + "tests/unit_test/linux/config_files/iot_config_common.h": "67ca01697c3b189ea251d1645e60842f46f617af8a45320768c76af31c94a0c6", + "tests/unit_test/linux/config_files/logging_levels.h": "8d6d90d8d3bb175076df9e985a406636c5463e1577db8e736c54072362a3ebd8", + "tests/unit_test/linux/config_files/logging_stack.h": "f4b0d1033e2b6db8f25ea9314d104dbe81185390f482f80331b67b19607f2cb1", + "tests/unit_test/linux/config_files/portableDefs.h": "af7f51b28a446f2c2c6af4a8eebf4f9de4cd8c208d4928e50dda1fad90c20ff9", + "tests/unit_test/linux/config_files/portmacro.h": "363a54cb76bfe8868809641b27ecd24c7df79088d2aaccde482c6c36f9f83bc4", + "tests/unit_test/linux/config_files/trcConfig.h": "3c64639c5150a2c59b7aedf9cbea346d5510dd3fce03598eafb2ca10480fa564", + "tests/unit_test/linux/config_files/trcSnapshotConfig.h": "1331a0cee7e872883993dc323210ec0e777a170c552a36a40610eb93a479c9e9", + "tests/unit_test/linux/utils/iot_atomic.h": "7cc93d629292b3ad720cd3d009c7d1f3ae43743a61ff8cfd56a88c6992086c25", + "tests/unit_test/linux/utils/task_control.c": "cd339d2a0415953dc0be29b1c481d18c63b49ef25b725781e49e22687af93efc", + "tests/unit_test/linux/utils/task_control.h": "8c629e1213bf9c0bee64bf70e4735293d35b4788201c10a1ddf030e1b2c3e1d7", + "tests/unit_test/linux/utils/wait_for_event.c": "5da71cc7056fdd660b968cda794eae5c9234d5c73be2635e1a9d9399a7b5f1a5", + "tests/unit_test/linux/utils/wait_for_event.h": "9d43102a2c6794150862d3ecc6f1107f02ba0b515c8fc155a1397eec12fdcdf0" } } } \ No newline at end of file diff --git a/demos/ble/gatt_server/aws_ble_gatt_server_demo.c b/demos/ble/gatt_server/aws_ble_gatt_server_demo.c index a1006896acd..0dc44f3eeca 100644 --- a/demos/ble/gatt_server/aws_ble_gatt_server_demo.c +++ b/demos/ble/gatt_server/aws_ble_gatt_server_demo.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/ble/mqtt_ble/mqtt_demo_ble_transport.c b/demos/ble/mqtt_ble/mqtt_demo_ble_transport.c index 7618a1c11e3..0e808b80583 100644 --- a/demos/ble/mqtt_ble/mqtt_demo_ble_transport.c +++ b/demos/ble/mqtt_ble/mqtt_demo_ble_transport.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/ble/numeric_comparison/iot_ble_numericComparison.c b/demos/ble/numeric_comparison/iot_ble_numericComparison.c index 044f75a0ac0..eff5840a391 100644 --- a/demos/ble/numeric_comparison/iot_ble_numericComparison.c +++ b/demos/ble/numeric_comparison/iot_ble_numericComparison.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/ble/shadow_ble/shadow_demo_ble_transport.c b/demos/ble/shadow_ble/shadow_demo_ble_transport.c index dc6f0a69c10..02b312be7d3 100644 --- a/demos/ble/shadow_ble/shadow_demo_ble_transport.c +++ b/demos/ble/shadow_ble/shadow_demo_ble_transport.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/cli/cli_uart_demo.c b/demos/cli/cli_uart_demo.c index ee8400cb113..221b117156a 100644 --- a/demos/cli/cli_uart_demo.c +++ b/demos/cli/cli_uart_demo.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/common/http_demo_helpers/CMakeLists.txt b/demos/common/http_demo_helpers/CMakeLists.txt new file mode 100644 index 00000000000..84f7c164391 --- /dev/null +++ b/demos/common/http_demo_helpers/CMakeLists.txt @@ -0,0 +1,23 @@ +# Module for demo helper utilities based on coreHTTP library. +afr_module(INTERNAL NAME http_demo_helpers) + +afr_module_sources( + ${AFR_CURRENT_MODULE} + PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/http_demo_utils.c +) + +afr_module_include_dirs( + ${AFR_CURRENT_MODULE} + PUBLIC + "${CMAKE_CURRENT_LIST_DIR}" + ) + +afr_module_dependencies( + ${AFR_CURRENT_MODULE} + PUBLIC + AFR::core_http + AFR::backoff_algorithm + AFR::transport_interface_secure_sockets + AFR::pkcs11_helpers +) diff --git a/demos/common/http_demo_helpers/http_demo_utils.c b/demos/common/http_demo_helpers/http_demo_utils.c new file mode 100644 index 00000000000..0eeb8273b67 --- /dev/null +++ b/demos/common/http_demo_helpers/http_demo_utils.c @@ -0,0 +1,290 @@ +/* + * FreeRTOS V202012.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* Standard includes. */ +#include + +#include "http_demo_utils.h" + +/* Retry utilities. */ +#include "backoff_algorithm.h" + +/* Include PKCS11 helpers header. */ +#include "pkcs11_helpers.h" + +/* Parser utilities. */ +#include "http_parser.h" + +/*-----------------------------------------------------------*/ + +/** + * @brief The maximum number of retries for connecting to server. + */ +#define CONNECTION_RETRY_MAX_ATTEMPTS ( 5U ) + +/** + * @brief The maximum back-off delay (in milliseconds) for retrying connection to server. + */ +#define CONNECTION_RETRY_MAX_BACKOFF_DELAY_MS ( 5000U ) + +/** + * @brief The base back-off delay (in milliseconds) to use for connection retry attempts. + */ +#define CONNECTION_RETRY_BACKOFF_BASE_MS ( 500U ) + +/*-----------------------------------------------------------*/ + +/** + * @brief Calculate and perform an exponential backoff with jitter delay for + * the next retry attempt of a failed network operation with the server. + * + * The function generates a random number, calculates the next backoff period + * with the generated random number, and performs the backoff delay operation if the + * number of retries have not exhausted. + * + * @note The PKCS11 module is used to generate the random number as it allows access + * to a True Random Number Generator (TRNG) if the vendor platform supports it. + * It is recommended to seed the random number generator with a device-specific entropy + * source so that probability of collisions from devices in connection retries is mitigated. + * + * @note The backoff period is calculated using the backoffAlgorithm library. + * + * @param[in, out] pxRetryAttempts The context to use for backoff period calculation + * with the backoffAlgorithm library. + * + * @return pdPASS if calculating the backoff period was successful; otherwise pdFAIL + * if there was failure in random number generation OR all retry attempts had exhausted. + */ +static BaseType_t prvBackoffForRetry( BackoffAlgorithmContext_t * pxRetryParams ); + +/*-----------------------------------------------------------*/ + +static BaseType_t prvBackoffForRetry( BackoffAlgorithmContext_t * pxRetryParams ) +{ + BaseType_t xReturnStatus = pdFAIL; + uint16_t usNextRetryBackOff = 0U; + BackoffAlgorithmStatus_t xBackoffAlgStatus = BackoffAlgorithmSuccess; + + /** + * To calculate the backoff period for the next retry attempt, we will + * generate a random number to provide to the backoffAlgorithm library. + * + * Note: The PKCS11 module is used to generate the random number as it allows access + * to a True Random Number Generator (TRNG) if the vendor platform supports it. + * It is recommended to use a random number generator seeded with a device-specific + * entropy source so that probability of collisions from devices in connection retries + * is mitigated. + */ + uint32_t ulRandomNum = 0; + + if( xPkcs11GenerateRandomNumber( ( uint8_t * ) &ulRandomNum, + sizeof( ulRandomNum ) ) == pdPASS ) + { + /* Get back-off value (in milliseconds) for the next retry attempt. */ + xBackoffAlgStatus = BackoffAlgorithm_GetNextBackoff( pxRetryParams, ulRandomNum, &usNextRetryBackOff ); + + if( xBackoffAlgStatus == BackoffAlgorithmRetriesExhausted ) + { + LogError( ( "All retry attempts have exhausted. Operation will not be retried" ) ); + } + else if( xBackoffAlgStatus == BackoffAlgorithmSuccess ) + { + /* Perform the backoff delay. */ + vTaskDelay( pdMS_TO_TICKS( usNextRetryBackOff ) ); + + xReturnStatus = pdPASS; + + LogInfo( ( "Retry attempt %lu out of maximum retry attempts %lu.", + ( pxRetryParams->attemptsDone + 1 ), + pxRetryParams->maxRetryAttempts ) ); + } + } + else + { + LogError( ( "Unable to retry operation with broker: Random number generation failed" ) ); + } + + return xReturnStatus; +} + +/*-----------------------------------------------------------*/ + +BaseType_t connectToServerWithBackoffRetries( TransportConnect_t connectFunction, + NetworkContext_t * pxNetworkContext ) +{ + BaseType_t xReturn = pdFAIL; + /* Struct containing the next backoff time. */ + BackoffAlgorithmContext_t xReconnectParams; + BaseType_t xBackoffStatus = 0U; + + configASSERT( connectFunction != NULL ); + configASSERT( pxNetworkContext != NULL ); + + /* Initialize reconnect attempts and interval. */ + BackoffAlgorithm_InitializeParams( &xReconnectParams, + CONNECTION_RETRY_BACKOFF_BASE_MS, + CONNECTION_RETRY_MAX_BACKOFF_DELAY_MS, + CONNECTION_RETRY_MAX_ATTEMPTS ); + + /* Attempt to connect to the HTTP server. If connection fails, retry after a + * timeout. The timeout value will exponentially increase until either the + * maximum timeout value is reached or the set number of attempts are + * exhausted.*/ + do + { + xReturn = connectFunction( pxNetworkContext ); + + if( xReturn != pdPASS ) + { + LogWarn( ( "Connection to the HTTP server failed. " + "Retrying connection with backoff and jitter." ) ); + + /* As the connection attempt failed, we will retry the connection after an + * exponential backoff with jitter delay. */ + + /* Calculate the backoff period for the next retry attempt and perform the wait operation. */ + xBackoffStatus = prvBackoffForRetry( &xReconnectParams ); + } + } while( ( xReturn == pdFAIL ) && ( xBackoffStatus == pdPASS ) ); + + return xReturn; +} + +/*-----------------------------------------------------------*/ + +HTTPStatus_t getUrlPath( const char * pcUrl, + size_t xUrlLen, + const char ** pcPath, + size_t * pxPathLen ) +{ + /* http-parser status. Initialized to 1 to signify failure. */ + int parserStatus = 1; + struct http_parser_url urlParser; + HTTPStatus_t xHTTPStatus = HTTPSuccess; + + /* Sets all members in urlParser to 0. */ + http_parser_url_init( &urlParser ); + + if( ( pcUrl == NULL ) || ( pcPath == NULL ) || ( pxPathLen == NULL ) ) + { + LogError( ( "NULL parameter passed to getUrlPath()." ) ); + xHTTPStatus = HTTPInvalidParameter; + } + + if( xHTTPStatus == HTTPSuccess ) + { + parserStatus = http_parser_parse_url( pcUrl, xUrlLen, 0, &urlParser ); + + if( parserStatus != 0 ) + { + LogError( ( "Error parsing the input URL %.*s. Error code: %d.", + ( int32_t ) xUrlLen, + pcUrl, + parserStatus ) ); + xHTTPStatus = HTTPParserInternalError; + } + } + + if( xHTTPStatus == HTTPSuccess ) + { + *pxPathLen = ( size_t ) ( urlParser.field_data[ UF_PATH ].len ); + + if( *pxPathLen == 0 ) + { + xHTTPStatus = HTTPNoResponse; + *pcPath = NULL; + } + else + { + *pcPath = &pcUrl[ urlParser.field_data[ UF_PATH ].off ]; + } + } + + if( xHTTPStatus != HTTPSuccess ) + { + LogError( ( "Error parsing the path from URL %s. Error code: %d", + pcUrl, + xHTTPStatus ) ); + } + + return xHTTPStatus; +} + +/*-----------------------------------------------------------*/ + +HTTPStatus_t getUrlAddress( const char * pcUrl, + size_t xUrlLen, + const char ** pcAddress, + size_t * pxAddressLen ) +{ + /* http-parser status. Initialized to 1 to signify failure. */ + int parserStatus = 1; + struct http_parser_url urlParser; + HTTPStatus_t xHTTPStatus = HTTPSuccess; + + /* Sets all members in urlParser to 0. */ + http_parser_url_init( &urlParser ); + + if( ( pcUrl == NULL ) || ( pcAddress == NULL ) || ( pxAddressLen == NULL ) ) + { + LogError( ( "NULL parameter passed to getUrlAddress()." ) ); + xHTTPStatus = HTTPInvalidParameter; + } + + if( xHTTPStatus == HTTPSuccess ) + { + parserStatus = http_parser_parse_url( pcUrl, xUrlLen, 0, &urlParser ); + + if( parserStatus != 0 ) + { + LogError( ( "Error parsing the input URL %.*s. Error code: %d.", + ( int32_t ) xUrlLen, + pcUrl, + parserStatus ) ); + xHTTPStatus = HTTPParserInternalError; + } + } + + if( xHTTPStatus == HTTPSuccess ) + { + *pxAddressLen = ( size_t ) ( urlParser.field_data[ UF_HOST ].len ); + + if( *pxAddressLen == 0 ) + { + xHTTPStatus = HTTPNoResponse; + *pcAddress = NULL; + } + else + { + *pcAddress = &pcUrl[ urlParser.field_data[ UF_HOST ].off ]; + } + } + + if( xHTTPStatus != HTTPSuccess ) + { + LogError( ( "Error parsing the address from URL %s. Error code %d", + pcUrl, + xHTTPStatus ) ); + } + + return xHTTPStatus; +} diff --git a/demos/common/http_demo_helpers/http_demo_utils.h b/demos/common/http_demo_helpers/http_demo_utils.h new file mode 100644 index 00000000000..7a93bdcb1ce --- /dev/null +++ b/demos/common/http_demo_helpers/http_demo_utils.h @@ -0,0 +1,125 @@ +/* + * FreeRTOS V202012.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef HTTP_DEMO_UTILS_H +#define HTTP_DEMO_UTILS_H + +/* Standard includes. */ +#include +#include +#include + +/* Transport interface implementation include header for TLS. */ +#include "transport_secure_sockets.h" + +/* Kernel includes. */ +#include "FreeRTOS.h" + +/* HTTP API header. */ +#include "core_http_client.h" + +/** + * @brief Function pointer for establishing connection to a server. + * + * @param[out] pxNetworkContext Implementation-defined network context. + * + * @return pdFAIL on failure; pdPASS on successful connection. + */ +typedef BaseType_t ( * TransportConnect_t )( NetworkContext_t * pxNetworkContext ); + +/** + * @brief Connect to a server with reconnection retries. + * + * If connection fails, retry is attempted after a timeout. The timeout value + * will exponentially increase until either the maximum timeout value is reached + * or the set number of attempts are exhausted. + * + * @param[in] connectFunction Function pointer for establishing connection to a + * server. + * @param[out] pxNetworkContext Implementation-defined network context. + * + * @return pdFAIL on failure; pdPASS on successful connection. + */ +BaseType_t connectToServerWithBackoffRetries( TransportConnect_t connectFunction, + NetworkContext_t * pxNetworkContext ); + +/** + * @brief Retrieve the path from the input URL. + * + * This function retrieves the location and length of the path from within the + * input the URL. The query is not included in the length returned. + * + * The URL MUST start with "http://" or "https://" to find the path. + * + * For example, if pcUrl is: + * "https://www.somewebsite.com/path/to/item.txt?optionalquery=stuff" + * + * Then pcPath and pxPathLen will be the following: + * *pcPath = "/path/to/item.txt?optionalquery=stuff" + * *pxPathLen = 17 + * + * @param[in] pcUrl URL string to parse. + * @param[in] xUrlLen The length of the URL string input. + * @param[out] pcPath pointer within input url that the path starts at. + * @param[out] pxPathLen Length of the path. + * + * @return The status of the parsing attempt: + * HTTPSuccess if the path was successfully parsed, + * HTTPParserInternalError if there was an error parsing the URL, + * or HTTPNoResponse if the path was not found. + */ +HTTPStatus_t getUrlPath( const char * pcUrl, + size_t xUrlLen, + const char ** pcPath, + size_t * pxPathLen ); + +/** + * @brief Retrieve the Address from the input URL. + * + * This function retrieves the location and length of the address from within + * the input URL. The path and query are not included in the length returned. + * + * The URL MUST start with "http://" or "https://" to find the address. + * + * For example, if pcUrl is: + * "https://www.somewebsite.com/path/to/item.txt?optionalquery=stuff" + * + * Then pcAddress and pxAddressLen will be the following: + * *pcAddress = "www.somewebsite.com/path/to/item.txt?optionalquery=stuff" + * *pxAddressLen = 19 + * + * @param[in] pcUrl URL string to parse. + * @param[in] xUrlLen The length of the URL string input. + * @param[out] pcAddress pointer within input url that the address starts at. + * @param[out] pxAddressLen Length of the address. + * + * @return The status of the parsing attempt: + * HTTPSuccess if the path was successfully parsed, + * HTTPParserInternalError if there was an error parsing the URL, + * or HTTPNoResponse if the path was not found. + */ +HTTPStatus_t getUrlAddress( const char * pcUrl, + size_t xUrlLen, + const char ** pcAddress, + size_t * pxAddressLen ); + +#endif /* ifndef HTTP_DEMO_UTILS_H */ diff --git a/demos/common/http_demo_helpers/presigned_url_generator/README.md b/demos/common/http_demo_helpers/presigned_url_generator/README.md new file mode 100644 index 00000000000..b4236752553 --- /dev/null +++ b/demos/common/http_demo_helpers/presigned_url_generator/README.md @@ -0,0 +1,55 @@ +# Presigned S3 URLs Generator + +`presigned_url_gen.py` generates pre-signed URLs for S3 HTTP GET and PUT request access. + +### Dependencies + +* Python 3+ +* boto3 +* argparse + +### Prerequisites + +1. Install the dependencies. + ```sh + pip install boto3 argparse + ``` + +1. You will need an AWS Account with S3 access before beginning. You must install and configure the AWS CLI in order to + use this script. + For information on AWS S3 please see: https://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html + For AWS CLI installation information please see: https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html + For AWS CLI configuration information please see: https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html + + ```sh + aws configure + ``` + +### Usage + +1. Run `presigned_url_gen.py` with your s3 bucket name and s3 object key. + ```sh + ./presigned_urls_gen.py --bucket --key + ``` + An example expected output: + ``` + #define democonfigS3_PRESIGNED_GET_URL "https://aws-s3-endpoint/object-key.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ABABABABABABABABABAB%2F20201027%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20201027T194726Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=SomeHash12345UrlABcdEFgfIjK" + #define democonfigS3_PRESIGNED_PUT_URL "https://aws-s3-endpoint/object-key.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ABABABABABABABABABAB%2F20201027%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20201027T194726Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=SomeHash12345UrlLMnmOPqrStUvW" + ``` +1. Copy and paste the output to `demo_config.h` for macros `democonfigS3_PRESIGNED_GET_URL` and `democonfigS3_PRESIGNED_PUT_URL`. + ```c + #define democonfigS3_PRESIGNED_GET_URL "https://aws-s3-endpoint/object-key.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ABABABABABABABABABAB%2F20201027%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20201027T194726Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=SomeHash12345UrlABcdEFgfIjK" + #define democonfigS3_PRESIGNED_PUT_URL "https://aws-s3-endpoint/object-key.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ABABABABABABABABABAB%2F20201027%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20201027T194726Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=SomeHash12345UrlLMnmOPqrStUvW" + ``` + +### Parameters + +#### --bucket +The name of the S3 bucket from which the demo will download or upload. + +#### --key +The name of the existing object you wish to download (GET), +or the name of the object you wish to upload (PUT). + +#### --region +Optional parameter for the AWS region in which the bucket is located. diff --git a/demos/common/http_demo_helpers/presigned_url_generator/presigned_urls_gen.py b/demos/common/http_demo_helpers/presigned_url_generator/presigned_urls_gen.py new file mode 100644 index 00000000000..b829436e07b --- /dev/null +++ b/demos/common/http_demo_helpers/presigned_url_generator/presigned_urls_gen.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 + +import boto3 +from botocore.client import Config +import argparse + + +def get_presigned_urls(bucket_name, key_name, region_name) -> None: + """ + Prints the presigned GET and PUT URLs assigned to the demo specific C + macros, for the given object key in the given S3 bucket. If the region + parameter is not defined, boto3 will use the one configured using AWS CLI. + The URLs are presigned with AWS's Signature Version 4. + Args: + bucket_name (str): S3 bucket + key_name (str): S3 object key + region_name (str): S3 bucket's region + """ + + # Get the service client. + # SigV2 is being deprecated. If the boto3 installation in the current Python environment has an older version of + # the package, then this configuration forces the use of SigV4. + s3 = boto3.client("s3", config=Config(signature_version="s3v4", region_name=region_name)) + + client_method_dict = {"GET": "get_object", "PUT": "put_object"} + + # Generate the URL to get 'key-name' from 'bucket-name' + for method in client_method_dict.keys(): + url = s3.generate_presigned_url( + ClientMethod=client_method_dict[method], + Params={"Bucket": bucket_name, "Key": key_name}, + ) + print("#define democonfigS3_PRESIGNED_" + method + "_URL" + " " + '"' + url + '"\n') + + +def main(): + """ + Generate demo C macro strings, on the console, for the input S3 bucket and object key. + """ + parser = argparse.ArgumentParser(description="S3 Presigned URL Generator. See README.md") + parser.add_argument( + "--bucket", + action="store", + required=True, + dest="bucket_name", + help="The name of the S3 bucket of interest.", + ) + parser.add_argument( + "--key", + action="store", + required=True, + dest="key_name", + help="The name of the S3 Object in the bucket. This is referred to as a 'key'", + ) + parser.add_argument( + "--region", + action="store", + required=False, + dest="region_name", + help="The region in which the S3 bucket of interest is created.", + ) + args = parser.parse_args() + + get_presigned_urls(args.bucket_name, args.key_name, args.region_name) + + +if __name__ == "__main__": # pragma: no cover + main() diff --git a/demos/common/mqtt_demo_helpers/CMakeLists.txt b/demos/common/mqtt_demo_helpers/CMakeLists.txt new file mode 100644 index 00000000000..5f25b06cf1b --- /dev/null +++ b/demos/common/mqtt_demo_helpers/CMakeLists.txt @@ -0,0 +1,23 @@ +# Module for demo helper utilities based on coreMQTT library. +afr_module(INTERNAL NAME mqtt_demo_helpers) + +afr_module_sources( + ${AFR_CURRENT_MODULE} + PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/mqtt_demo_helpers.c +) + +afr_module_include_dirs( + ${AFR_CURRENT_MODULE} + PUBLIC + "${CMAKE_CURRENT_LIST_DIR}" +) + +afr_module_dependencies( + ${AFR_CURRENT_MODULE} + PUBLIC + AFR::core_mqtt + AFR::transport_interface_secure_sockets + AFR::backoff_algorithm + AFR::pkcs11_helpers +) diff --git a/demos/device_shadow_for_aws/shadow_demo_helpers.c b/demos/common/mqtt_demo_helpers/mqtt_demo_helpers.c similarity index 74% rename from demos/device_shadow_for_aws/shadow_demo_helpers.c rename to demos/common/mqtt_demo_helpers/mqtt_demo_helpers.c index 4a11b898b38..921b058057a 100644 --- a/demos/device_shadow_for_aws/shadow_demo_helpers.c +++ b/demos/common/mqtt_demo_helpers/mqtt_demo_helpers.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -21,7 +21,7 @@ */ /** - * @file shadow_demo_helpers.c + * @file mqtt_demo_helpers.c * * @brief This file provides helper functions used by the Shadow demo application to * do MQTT operations over a mutually authenticated TLS connection. @@ -38,28 +38,41 @@ #include #include -/* Include Demo Config as the first non-system header. */ -#include "shadow_demo_config.h" - /* MQTT API header. */ #include "core_mqtt.h" /* Shadow includes */ -#include "shadow_demo_helpers.h" +#include "mqtt_demo_helpers.h" /* Retry utilities include. */ -#include "retry_utils.h" +#include "backoff_algorithm.h" + +/* Include PKCS11 helpers header. */ +#include "pkcs11_helpers.h" /* Include header for client credentials. */ #include "aws_clientcredential.h" -#include "aws_clientcredential_keys.h" - /* Include header for root CA certificates. */ #include "iot_default_root_certificates.h" /*-----------------------------------------------------------*/ +/** + * @brief The maximum number of retries for connecting to server. + */ +#define CONNECTION_RETRY_MAX_ATTEMPTS ( 5U ) + +/** + * @brief The maximum back-off delay (in milliseconds) for retrying connection to server. + */ +#define CONNECTION_RETRY_MAX_BACKOFF_DELAY_MS ( 5000U ) + +/** + * @brief The base back-off delay (in milliseconds) to use for connection retry attempts. + */ +#define CONNECTION_RETRY_BACKOFF_BASE_MS ( 500U ) + /** * @brief Timeout for receiving CONNACK packet in milliseconds. */ @@ -99,7 +112,7 @@ /** * @brief Transport timeout in milliseconds for transport send and receive. */ -#define mqttexampleTRANSPORT_SEND_RECV_TIMEOUT_MS ( 500U ) +#define mqttexampleTRANSPORT_SEND_RECV_TIMEOUT_MS ( 200U ) /** * @brief Maximum number of outgoing publishes maintained in the application @@ -166,36 +179,35 @@ static uint16_t globalUnsubscribePacketIdentifier = 0U; */ static PublishPackets_t outgoingPublishPackets[ MAX_OUTGOING_PUBLISHES ] = { 0 }; -/** - * @brief Static buffer used to hold MQTT messages being sent and received. - */ -static uint8_t ucSharedBuffer[ democonfigNETWORK_BUFFER_SIZE ]; - -/** - * @brief The MQTT context used for MQTT operation. - */ -static MQTTContext_t mqttContext = { 0 }; - -/** - * @brief The network context used for Openssl operation. - */ -static NetworkContext_t networkContext = { 0 }; - /** * @brief The flag to indicate the mqtt session changed. */ static bool mqttSessionEstablished = false; +/*-----------------------------------------------------------*/ + /** - * @brief Static buffer used to hold MQTT messages being sent and received. + * @brief Calculate and perform an exponential backoff with jitter delay for + * the next retry attempt of a failed network operation with the server. + * + * The function generates a random number, calculates the next backoff period + * with the generated random number, and performs the backoff delay operation if the + * number of retries have not exhausted. + * + * @note The PKCS11 module is used to generate the random number as it allows access + * to a True Random Number Generator (TRNG) if the vendor platform supports it. + * It is recommended to seed the random number generator with a device-specific entropy + * source so that probability of collisions from devices in connection retries is mitigated. + * + * @note The backoff period is calculated using the backoffAlgorithm library. + * + * @param[in, out] pxRetryAttempts The context to use for backoff period calculation + * with the backoffAlgorithm library. + * + * @return pdPASS if calculating the backoff period was successful; otherwise pdFAIL + * if there was failure in random number generation OR all retry attempts had exhausted. */ -static MQTTFixedBuffer_t xBuffer = -{ - .pBuffer = ucSharedBuffer, - .size = democonfigNETWORK_BUFFER_SIZE -}; - -/*-----------------------------------------------------------*/ +static BaseType_t prvBackoffForRetry( BackoffAlgorithmContext_t * pxRetryParams ); /** * @brief Connect to MQTT broker with reconnection retries. @@ -217,10 +229,10 @@ static TransportSocketStatus_t prvConnectToServerWithBackoffRetries( NetworkCont * @param[out] pucIndex The output parameter to return the index at which an * outgoing publish message can be stored. * - * @return EXIT_FAILURE if no more publishes can be stored; - * EXIT_SUCCESS if an index to store the next outgoing publish is obtained. + * @return pdFAIL if no more publishes can be stored; + * pdPASS if an index to store the next outgoing publish is obtained. */ -static int prvGetNextFreeIndexForOutgoingPublishes( uint8_t * pucIndex ); +static BaseType_t prvGetNextFreeIndexForOutgoingPublishes( uint8_t * pucIndex ); /** * @brief Function to clean up an outgoing publish at given index from the @@ -251,7 +263,7 @@ static void vCleanupOutgoingPublishWithPacketID( uint16_t usPacketId ); * * @param[in] pxMqttContext MQTT context pointer. */ -static int handlePublishResend( MQTTContext_t * pxMqttContext ); +static BaseType_t handlePublishResend( MQTTContext_t * pxMqttContext ); /** * @brief The timer query function provided to the MQTT context. @@ -262,11 +274,59 @@ static uint32_t prvGetTimeMs( void ); /*-----------------------------------------------------------*/ +static BaseType_t prvBackoffForRetry( BackoffAlgorithmContext_t * pxRetryParams ) +{ + BaseType_t xReturnStatus = pdFAIL; + uint16_t usNextRetryBackOff = 0U; + BackoffAlgorithmStatus_t xBackoffAlgStatus = BackoffAlgorithmSuccess; + + /** + * To calculate the backoff period for the next retry attempt, we will + * generate a random number to provide to the backoffAlgorithm library. + * + * Note: The PKCS11 module is used to generate the random number as it allows access + * to a True Random Number Generator (TRNG) if the vendor platform supports it. + * It is recommended to use a random number generator seeded with a device-specific + * entropy source so that probability of collisions from devices in connection retries + * is mitigated. + */ + uint32_t ulRandomNum = 0; + + if( xPkcs11GenerateRandomNumber( ( uint8_t * ) &ulRandomNum, + sizeof( ulRandomNum ) ) == pdPASS ) + { + /* Get back-off value (in milliseconds) for the next retry attempt. */ + xBackoffAlgStatus = BackoffAlgorithm_GetNextBackoff( pxRetryParams, ulRandomNum, &usNextRetryBackOff ); + + if( xBackoffAlgStatus == BackoffAlgorithmRetriesExhausted ) + { + LogError( ( "All retry attempts have exhausted. Operation will not be retried" ) ); + } + else if( xBackoffAlgStatus == BackoffAlgorithmSuccess ) + { + /* Perform the backoff delay. */ + vTaskDelay( pdMS_TO_TICKS( usNextRetryBackOff ) ); + + xReturnStatus = pdPASS; + + LogInfo( ( "Retry attempt %lu out of maximum retry attempts %lu.", + ( pxRetryParams->attemptsDone + 1 ), + pxRetryParams->maxRetryAttempts ) ); + } + } + else + { + LogError( ( "Unable to retry operation with broker: Random number generation failed" ) ); + } + + return xReturnStatus; +} + static TransportSocketStatus_t prvConnectToServerWithBackoffRetries( NetworkContext_t * pxNetworkContext ) { TransportSocketStatus_t xNetworkStatus = TRANSPORT_SOCKET_STATUS_SUCCESS; - RetryUtilsStatus_t xRetryUtilsStatus = RetryUtilsSuccess; - RetryUtilsParams_t xReconnectParams = { 0 }; + BackoffAlgorithmContext_t xReconnectParams = { 0 }; + BaseType_t xBackoffStatus = pdPASS; ServerInfo_t xServerInfo = { 0 }; SocketsConfig_t xSocketConfig = { 0 }; @@ -284,8 +344,10 @@ static TransportSocketStatus_t prvConnectToServerWithBackoffRetries( NetworkCont xSocketConfig.recvTimeoutMs = mqttexampleTRANSPORT_SEND_RECV_TIMEOUT_MS; /* Initialize reconnect attempts and interval. */ - RetryUtils_ParamsReset( &xReconnectParams ); - xReconnectParams.maxRetryAttempts = MAX_RETRY_ATTEMPTS; + BackoffAlgorithm_InitializeParams( &xReconnectParams, + CONNECTION_RETRY_BACKOFF_BASE_MS, + CONNECTION_RETRY_MAX_BACKOFF_DELAY_MS, + CONNECTION_RETRY_MAX_ATTEMPTS ); /* Attempt to connect to MQTT broker. If connection fails, retry after * a timeout. Timeout value will exponentially increase until maximum @@ -305,25 +367,24 @@ static TransportSocketStatus_t prvConnectToServerWithBackoffRetries( NetworkCont if( xNetworkStatus != TRANSPORT_SOCKET_STATUS_SUCCESS ) { - LogWarn( ( "Connection to the broker failed. Retrying connection with backoff and jitter." ) ); - xRetryUtilsStatus = RetryUtils_BackoffAndSleep( &xReconnectParams ); - } + LogWarn( ( "Connection to the broker failed. Attempting connection retry after backoff delay." ) ); - if( xRetryUtilsStatus == RetryUtilsRetriesExhausted ) - { - LogError( ( "Connection to the broker failed, all attempts exhausted." ) ); - xNetworkStatus = TRANSPORT_SOCKET_STATUS_CONNECT_FAILURE; + /* As the connection attempt failed, we will retry the connection after an + * exponential backoff with jitter delay. */ + + /* Calculate the backoff period for the next retry attempt and perform the wait operation. */ + xBackoffStatus = prvBackoffForRetry( &xReconnectParams ); } - } while( ( xNetworkStatus != TRANSPORT_SOCKET_STATUS_SUCCESS ) && ( xRetryUtilsStatus == RetryUtilsSuccess ) ); + } while( ( xNetworkStatus != TRANSPORT_SOCKET_STATUS_SUCCESS ) && ( xBackoffStatus == pdPASS ) ); return xNetworkStatus; } /*-----------------------------------------------------------*/ -static int prvGetNextFreeIndexForOutgoingPublishes( uint8_t * pucIndex ) +static BaseType_t prvGetNextFreeIndexForOutgoingPublishes( uint8_t * pucIndex ) { - int returnStatus = EXIT_FAILURE; + BaseType_t xReturnStatus = pdFAIL; uint8_t ucIndex = 0; assert( outgoingPublishPackets != NULL ); @@ -335,7 +396,7 @@ static int prvGetNextFreeIndexForOutgoingPublishes( uint8_t * pucIndex ) * Check if the the ucIndex has a free slot. */ if( outgoingPublishPackets[ ucIndex ].packetId == MQTT_PACKET_ID_INVALID ) { - returnStatus = EXIT_SUCCESS; + xReturnStatus = pdPASS; break; } } @@ -343,7 +404,7 @@ static int prvGetNextFreeIndexForOutgoingPublishes( uint8_t * pucIndex ) /* Copy the available ucIndex into the output param. */ *pucIndex = ucIndex; - return returnStatus; + return xReturnStatus; } /*-----------------------------------------------------------*/ @@ -434,9 +495,9 @@ void vHandleOtherIncomingPacket( MQTTPacketInfo_t * pxPacketInfo, /*-----------------------------------------------------------*/ -static int handlePublishResend( MQTTContext_t * pxMqttContext ) +static BaseType_t handlePublishResend( MQTTContext_t * pxMqttContext ) { - int returnStatus = EXIT_SUCCESS; + BaseType_t xReturnStatus = pdPASS; MQTTStatus_t eMqttStatus = MQTTSuccess; uint8_t ucIndex = 0U; @@ -460,10 +521,10 @@ static int handlePublishResend( MQTTContext_t * pxMqttContext ) if( eMqttStatus != MQTTSuccess ) { LogError( ( "Sending duplicate PUBLISH for packet id %u " - " failed with status %u.", + " failed with status %s.", outgoingPublishPackets[ ucIndex ].packetId, - eMqttStatus ) ); - returnStatus = EXIT_FAILURE; + MQTT_Status_strerror( eMqttStatus ) ) ); + xReturnStatus = pdFAIL; break; } else @@ -474,19 +535,20 @@ static int handlePublishResend( MQTTContext_t * pxMqttContext ) } } - return returnStatus; + return xReturnStatus; } /*-----------------------------------------------------------*/ -TransportSocketStatus_t EstablishMqttSession( MQTTEventCallback_t eventCallback ) +BaseType_t EstablishMqttSession( MQTTContext_t * pxMqttContext, + NetworkContext_t * pxNetworkContext, + MQTTFixedBuffer_t * pxNetworkBuffer, + MQTTEventCallback_t eventCallback ) { - TransportSocketStatus_t returnStatus = EXIT_SUCCESS; - MQTTStatus_t eMqttStatus; - MQTTConnectInfo_t xConnectInfo; - TransportInterface_t xTransport; - MQTTContext_t * pxMqttContext = &mqttContext; - NetworkContext_t * pxNetworkContext = &networkContext; + BaseType_t xReturnStatus = pdPASS; + MQTTStatus_t eMqttStatus = MQTTSuccess; + MQTTConnectInfo_t xConnectInfo = { 0 }; + TransportInterface_t xTransport = { 0 }; bool sessionPresent = false; assert( pxMqttContext != NULL ); @@ -496,15 +558,14 @@ TransportSocketStatus_t EstablishMqttSession( MQTTEventCallback_t eventCallback ( void ) memset( pxMqttContext, 0U, sizeof( MQTTContext_t ) ); ( void ) memset( pxNetworkContext, 0U, sizeof( NetworkContext_t ) ); - returnStatus = prvConnectToServerWithBackoffRetries( pxNetworkContext ); - - if( returnStatus != EXIT_SUCCESS ) + if( prvConnectToServerWithBackoffRetries( pxNetworkContext ) != TRANSPORT_SOCKET_STATUS_SUCCESS ) { /* Log error to indicate connection failure after all * reconnect attempts are over. */ LogError( ( "Failed to connect to MQTT broker %.*s.", strlen( democonfigMQTT_BROKER_ENDPOINT ), democonfigMQTT_BROKER_ENDPOINT ) ); + xReturnStatus = pdFAIL; } else { @@ -518,12 +579,13 @@ TransportSocketStatus_t EstablishMqttSession( MQTTEventCallback_t eventCallback &xTransport, prvGetTimeMs, eventCallback, - &xBuffer ); + pxNetworkBuffer ); if( eMqttStatus != MQTTSuccess ) { - returnStatus = EXIT_FAILURE; - LogError( ( "MQTT init failed with status %u.", eMqttStatus ) ); + xReturnStatus = pdFAIL; + LogError( ( "MQTT init failed with status %s.", + MQTT_Status_strerror( eMqttStatus ) ) ); } else { @@ -561,8 +623,9 @@ TransportSocketStatus_t EstablishMqttSession( MQTTEventCallback_t eventCallback if( eMqttStatus != MQTTSuccess ) { - returnStatus = EXIT_FAILURE; - LogError( ( "Connection with MQTT broker failed with status %u.", eMqttStatus ) ); + xReturnStatus = pdFAIL; + LogError( ( "Connection with MQTT broker failed with status %s.", + MQTT_Status_strerror( eMqttStatus ) ) ); } else { @@ -570,7 +633,7 @@ TransportSocketStatus_t EstablishMqttSession( MQTTEventCallback_t eventCallback } } - if( returnStatus == EXIT_SUCCESS ) + if( xReturnStatus == pdPASS ) { /* Keep a flag for indicating if MQTT session is established. This * flag will mark that an MQTT DISCONNECT has to be sent at the end @@ -578,7 +641,7 @@ TransportSocketStatus_t EstablishMqttSession( MQTTEventCallback_t eventCallback mqttSessionEstablished = true; } - if( returnStatus == EXIT_SUCCESS ) + if( xReturnStatus == pdPASS ) { /* Check if session is present and if there are any outgoing publishes * that need to resend. This is only valid if the broker is @@ -589,7 +652,7 @@ TransportSocketStatus_t EstablishMqttSession( MQTTEventCallback_t eventCallback "Resending unacked publishes." ) ); /* Handle all the resend of publish messages. */ - returnStatus = handlePublishResend( &mqttContext ); + xReturnStatus = handlePublishResend( pxMqttContext ); } else { @@ -603,18 +666,17 @@ TransportSocketStatus_t EstablishMqttSession( MQTTEventCallback_t eventCallback } } - return returnStatus; + return xReturnStatus; } /*-----------------------------------------------------------*/ -int32_t DisconnectMqttSession( void ) +BaseType_t DisconnectMqttSession( MQTTContext_t * pxMqttContext, + NetworkContext_t * pxNetworkContext ) { MQTTStatus_t eMqttStatus = MQTTSuccess; - int returnStatus = EXIT_SUCCESS; + BaseType_t xReturnStatus = pdPASS; TransportSocketStatus_t xNetworkStatus; - MQTTContext_t * pxMqttContext = &mqttContext; - NetworkContext_t * pxNetworkContext = &networkContext; assert( pxMqttContext != NULL ); assert( pxNetworkContext != NULL ); @@ -626,9 +688,9 @@ int32_t DisconnectMqttSession( void ) if( eMqttStatus != MQTTSuccess ) { - LogError( ( "Sending MQTT DISCONNECT failed with status=%u.", - eMqttStatus ) ); - returnStatus = EXIT_FAILURE; + LogError( ( "Sending MQTT DISCONNECT failed with status=%s.", + MQTT_Status_strerror( eMqttStatus ) ) ); + xReturnStatus = pdFAIL; } } @@ -639,20 +701,20 @@ int32_t DisconnectMqttSession( void ) { LogError( ( "Disconnecting from SecureSocket failed with status=%u.", xNetworkStatus ) ); - returnStatus = EXIT_FAILURE; + xReturnStatus = pdFAIL; } - return returnStatus; + return xReturnStatus; } /*-----------------------------------------------------------*/ -int32_t SubscribeToTopic( const char * pcTopicFilter, - uint16_t usTopicFilterLength ) +BaseType_t SubscribeToTopic( MQTTContext_t * pxMqttContext, + const char * pcTopicFilter, + uint16_t usTopicFilterLength ) { - int returnStatus = EXIT_SUCCESS; + BaseType_t xReturnStatus = pdPASS; MQTTStatus_t eMqttStatus; - MQTTContext_t * pxMqttContext = &mqttContext; MQTTSubscribeInfo_t pSubscriptionList[ mqttexampleTOPIC_COUNT ]; assert( pxMqttContext != NULL ); @@ -678,9 +740,9 @@ int32_t SubscribeToTopic( const char * pcTopicFilter, if( eMqttStatus != MQTTSuccess ) { - LogError( ( "Failed to send SUBSCRIBE packet to broker with error = %u.", - eMqttStatus ) ); - returnStatus = EXIT_FAILURE; + LogError( ( "Failed to send SUBSCRIBE packet to broker with error = %s.", + MQTT_Status_strerror( eMqttStatus ) ) ); + xReturnStatus = pdFAIL; } else { @@ -699,23 +761,23 @@ int32_t SubscribeToTopic( const char * pcTopicFilter, if( eMqttStatus != MQTTSuccess ) { - returnStatus = EXIT_FAILURE; - LogError( ( "MQTT_ProcessLoop returned with status = %u.", - eMqttStatus ) ); + xReturnStatus = pdFAIL; + LogError( ( "MQTT_ProcessLoop returned with status = %s.", + MQTT_Status_strerror( eMqttStatus ) ) ); } } - return returnStatus; + return xReturnStatus; } /*-----------------------------------------------------------*/ -int32_t UnsubscribeFromTopic( const char * pcTopicFilter, - uint16_t usTopicFilterLength ) +BaseType_t UnsubscribeFromTopic( MQTTContext_t * pxMqttContext, + const char * pcTopicFilter, + uint16_t usTopicFilterLength ) { - int returnStatus = EXIT_SUCCESS; + BaseType_t xReturnStatus = pdPASS; MQTTStatus_t eMqttStatus; - MQTTContext_t * pxMqttContext = &mqttContext; MQTTSubscribeInfo_t pSubscriptionList[ 1 ]; assert( pxMqttContext != NULL ); @@ -741,9 +803,9 @@ int32_t UnsubscribeFromTopic( const char * pcTopicFilter, if( eMqttStatus != MQTTSuccess ) { - LogError( ( "Failed to send UNSUBSCRIBE packet to broker with error = %u.", - eMqttStatus ) ); - returnStatus = EXIT_FAILURE; + LogError( ( "Failed to send UNSUBSCRIBE packet to broker with error = %s.", + MQTT_Status_strerror( eMqttStatus ) ) ); + xReturnStatus = pdFAIL; } else { @@ -762,26 +824,26 @@ int32_t UnsubscribeFromTopic( const char * pcTopicFilter, if( eMqttStatus != MQTTSuccess ) { - returnStatus = EXIT_FAILURE; - LogError( ( "MQTT_ProcessLoop returned with status = %u.", - eMqttStatus ) ); + xReturnStatus = pdFAIL; + LogError( ( "MQTT_ProcessLoop returned with status = %s.", + MQTT_Status_strerror( eMqttStatus ) ) ); } } - return returnStatus; + return xReturnStatus; } /*-----------------------------------------------------------*/ -int32_t PublishToTopic( const char * pcTopicFilter, - int32_t topicFilterLength, - const char * pcPayload, - size_t payloadLength ) +BaseType_t PublishToTopic( MQTTContext_t * pxMqttContext, + const char * pcTopicFilter, + int32_t topicFilterLength, + const char * pcPayload, + size_t payloadLength ) { - int returnStatus = EXIT_SUCCESS; + BaseType_t xReturnStatus = pdPASS; MQTTStatus_t eMqttStatus = MQTTSuccess; uint8_t ucPublishIndex = MAX_OUTGOING_PUBLISHES; - MQTTContext_t * pxMqttContext = &mqttContext; assert( pxMqttContext != NULL ); assert( pcTopicFilter != NULL ); @@ -791,15 +853,15 @@ int32_t PublishToTopic( const char * pcTopicFilter, * publishes are stored until a PUBACK is received. These messages are * stored for supporting a resend if a network connection is broken before * receiving a PUBACK. */ - returnStatus = prvGetNextFreeIndexForOutgoingPublishes( &ucPublishIndex ); + xReturnStatus = prvGetNextFreeIndexForOutgoingPublishes( &ucPublishIndex ); - if( returnStatus == EXIT_FAILURE ) + if( xReturnStatus == pdFAIL ) { LogError( ( "Unable to find a free spot for outgoing PUBLISH message.\n\n" ) ); } else { - LogInfo( ( "the published payload:%s \r\n ", pcPayload ) ); + LogInfo( ( "the published payload:%.*s \r\n ", payloadLength, pcPayload ) ); /* This example publishes to only one topic and uses QOS1. */ outgoingPublishPackets[ ucPublishIndex ].pubInfo.qos = MQTTQoS1; outgoingPublishPackets[ ucPublishIndex ].pubInfo.pTopicName = pcTopicFilter; @@ -817,10 +879,10 @@ int32_t PublishToTopic( const char * pcTopicFilter, if( eMqttStatus != MQTTSuccess ) { - LogError( ( "Failed to send PUBLISH packet to broker with error = %u.", - eMqttStatus ) ); + LogError( ( "Failed to send PUBLISH packet to broker with error = %s.", + MQTT_Status_strerror( eMqttStatus ) ) ); vCleanupOutgoingPublishAt( ucPublishIndex ); - returnStatus = EXIT_FAILURE; + xReturnStatus = pdFAIL; } else { @@ -835,18 +897,42 @@ int32_t PublishToTopic( const char * pcTopicFilter, * sends ping request to broker if MQTT_KEEP_ALIVE_INTERVAL_SECONDS * has expired since the last MQTT packet sent and receive * ping responses. */ - eMqttStatus = MQTT_ProcessLoop( &mqttContext, mqttexamplePROCESS_LOOP_TIMEOUT_MS ); + eMqttStatus = MQTT_ProcessLoop( pxMqttContext, mqttexamplePROCESS_LOOP_TIMEOUT_MS ); if( eMqttStatus != MQTTSuccess ) { - LogWarn( ( "MQTT_ProcessLoop returned with status = %u.", - eMqttStatus ) ); + LogWarn( ( "MQTT_ProcessLoop returned with status = %s.", + MQTT_Status_strerror( eMqttStatus ) ) ); } } } - return returnStatus; + return xReturnStatus; +} +/*-----------------------------------------------------------*/ + +BaseType_t ProcessLoop( MQTTContext_t * pxMqttContext, + uint32_t ulTimeoutMs ) +{ + BaseType_t xReturnStatus = pdFAIL; + MQTTStatus_t eMqttStatus = MQTTSuccess; + + eMqttStatus = MQTT_ProcessLoop( pxMqttContext, ulTimeoutMs ); + + if( eMqttStatus != MQTTSuccess ) + { + LogWarn( ( "MQTT_ProcessLoop returned with status = %s.", + MQTT_Status_strerror( eMqttStatus ) ) ); + } + else + { + LogDebug( ( "MQTT_ProcessLoop successful." ) ); + xReturnStatus = pdPASS; + } + + return xReturnStatus; } + /*-----------------------------------------------------------*/ static uint32_t prvGetTimeMs( void ) diff --git a/demos/device_shadow_for_aws/shadow_demo_helpers.h b/demos/common/mqtt_demo_helpers/mqtt_demo_helpers.h similarity index 60% rename from demos/device_shadow_for_aws/shadow_demo_helpers.h rename to demos/common/mqtt_demo_helpers/mqtt_demo_helpers.h index 85743399a74..9d89bf8c105 100644 --- a/demos/device_shadow_for_aws/shadow_demo_helpers.h +++ b/demos/common/mqtt_demo_helpers/mqtt_demo_helpers.h @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -20,11 +20,8 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifndef SHADOW_DEMO_HELPERS_H_ -#define SHADOW_DEMO_HELPERS_H_ - -/* Include Demo Config as the first non-system header. */ -#include "shadow_demo_config.h" +#ifndef MQTT_DEMO_HELPERS_H_ +#define MQTT_DEMO_HELPERS_H_ /* MQTT API header. */ #include "core_mqtt.h" @@ -32,6 +29,9 @@ /* Transport interface implementation include header for TLS. */ #include "transport_secure_sockets.h" +/* Include header for connection configurations. */ +#include "aws_clientcredential.h" + /*------------- Demo configurations -------------------------*/ /** Note: The device client certificate and private key credentials are @@ -71,12 +71,21 @@ /** * @brief Establish a MQTT connection. * + * @param[in] pxContext The memory for the MQTTContext_t that will be used for the + * MQTT connection. + * @param[in] pxNetContext The memory for the NetworkContext_t required for the + * MQTT connection. + * @param[in] pxNetworkBuffer The buffer space for initializing the @p pxContext MQTT + * context used in the MQTT connection. * @param[in] appCallback The callback function used to receive incoming * publishes and incoming acks from MQTT library. * * @return The status of the final connection attempt. */ -TransportSocketStatus_t EstablishMqttSession( MQTTEventCallback_t eventCallback ); +BaseType_t EstablishMqttSession( MQTTContext_t * pxContext, + NetworkContext_t * pxNetContext, + MQTTFixedBuffer_t * pxNetworkBuffer, + MQTTEventCallback_t eventCallback ); /** * @brief Handle the incoming packet if it's not related to the device shadow. @@ -90,52 +99,73 @@ void vHandleOtherIncomingPacket( MQTTPacketInfo_t * pxPacketInfo, /** * @brief Close the MQTT connection. * - * @return EXIT_SUCCESS if DISCONNECT was successfully sent; - * EXIT_FAILURE otherwise. + * @param[in] pxContext The MQTT context for the MQTT connection to close. + * + * @return pdPASS if DISCONNECT was successfully sent; + * pdFAIL otherwise. */ -int32_t DisconnectMqttSession( void ); +BaseType_t DisconnectMqttSession( MQTTContext_t * pxContext, + NetworkContext_t * pxNetContext ); /** * @brief Subscribe to a MQTT topic filter. * + * @param[in] pxContext The MQTT context for the MQTT connection. * @param[in] pcTopicFilter Pointer to the shadow topic buffer. * @param[in] usTopicFilterLength Indicates the length of the shadow * topic buffer. * - * @return EXIT_SUCCESS if SUBSCRIBE was successfully sent; - * EXIT_FAILURE otherwise. + * @return pdPASS if SUBSCRIBE was successfully sent; + * pdFAIL otherwise. */ -int32_t SubscribeToTopic( const char * pcTopicFilter, - uint16_t usTopicFilterLength ); +BaseType_t SubscribeToTopic( MQTTContext_t * pxContext, + const char * pcTopicFilter, + uint16_t usTopicFilterLength ); /** * @brief Sends an MQTT UNSUBSCRIBE to unsubscribe from the shadow * topic. * + * @param[in] pxContext The MQTT context for the MQTT connection. * @param[in] pcTopicFilter Pointer to the shadow topic buffer. * @param[in] usTopicFilterLength Indicates the length of the shadow * topic buffer. * - * @return EXIT_SUCCESS if UNSUBSCRIBE was successfully sent; - * EXIT_FAILURE otherwise. + * @return pdPASS if UNSUBSCRIBE was successfully sent; + * pdFAIL otherwise. */ -int32_t UnsubscribeFromTopic( const char * pcTopicFilter, - uint16_t usTopicFilterLength ); +BaseType_t UnsubscribeFromTopic( MQTTContext_t * pxContext, + const char * pcTopicFilter, + uint16_t usTopicFilterLength ); /** * @brief Publish a message to a MQTT topic. * + * @param[in] pxContext The MQTT context for the MQTT connection. * @param[in] pcTopicFilter Points to the topic. * @param[in] topicFilterLength The length of the topic. * @param[in] pcPayload Points to the payload. * @param[in] payloadLength The length of the payload. * - * @return EXIT_SUCCESS if PUBLISH was successfully sent; - * EXIT_FAILURE otherwise. + * @return pdPASS if PUBLISH was successfully sent; + * pdFAIL otherwise. + */ +BaseType_t PublishToTopic( MQTTContext_t * pxContext, + const char * pcTopicFilter, + int32_t topicFilterLength, + const char * pcPayload, + size_t payloadLength ); + +/** + * @brief Invoke the core MQTT library's process loop function. + * + * @param[in] pxMqttContext The MQTT context for the MQTT connection. + * @param[in] ulTimeoutMs Minimum time for the loop to run, if no error occurs. + * + * @return pdPASS if process loop was successful; + * pdFAIL otherwise. */ -int32_t PublishToTopic( const char * pcTopicFilter, - int32_t topicFilterLength, - const char * pcPayload, - size_t payloadLength ); +BaseType_t ProcessLoop( MQTTContext_t * pxMqttContext, + uint32_t ulTimeoutMs ); -#endif /* ifndef SHADOW_DEMO_HELPERS_H_ */ +#endif /* ifndef MQTT_DEMO_HELPERS_H_ */ diff --git a/demos/common/pkcs11_helpers/CMakeLists.txt b/demos/common/pkcs11_helpers/CMakeLists.txt new file mode 100644 index 00000000000..3abc5ddddf9 --- /dev/null +++ b/demos/common/pkcs11_helpers/CMakeLists.txt @@ -0,0 +1,22 @@ +# Module for corePKCS11 library based helper utilities. +afr_module(NAME pkcs11_helpers) + +afr_module_sources( + ${AFR_CURRENT_MODULE} + PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/pkcs11_helpers.c +) + +afr_module_include_dirs( + ${AFR_CURRENT_MODULE} + PUBLIC + "${CMAKE_CURRENT_LIST_DIR}" +) + +afr_module_dependencies( + ${AFR_CURRENT_MODULE} + PUBLIC + AFR::pkcs11_implementation + PRIVATE + AFR::logging +) diff --git a/demos/common/pkcs11_helpers/pkcs11_helpers.c b/demos/common/pkcs11_helpers/pkcs11_helpers.c new file mode 100644 index 00000000000..5f9dce74872 --- /dev/null +++ b/demos/common/pkcs11_helpers/pkcs11_helpers.c @@ -0,0 +1,103 @@ +/* + * FreeRTOS V202012.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/** + * @file pkcs11_helpers.c + * @brief Implementation of the helper functions for accessing PKCS11 module functionality. + */ + +/* Include corePKCS11 config file. */ +#include "core_pkcs11_config.h" + +/* Include PKCS11 headers. */ +#include "core_pkcs11.h" +#include "pkcs11.h" + +/* Include header. */ +#include "pkcs11_helpers.h" + +/*-----------------------------------------------------------*/ + +BaseType_t xPkcs11GenerateRandomNumber( uint8_t * pusRandomNumBuffer, + size_t xBufferLength ) +{ + BaseType_t xStatus = pdPASS; + CK_RV xResult = CKR_OK; + CK_FUNCTION_LIST_PTR pxFunctionList = NULL; + CK_SESSION_HANDLE xSession = CK_INVALID_HANDLE; + + if( ( pusRandomNumBuffer == NULL ) || ( xBufferLength == 0U ) ) + { + LogError( ( "Cannot generate random number. Invalid parameters passed. " + "buffer=%p,bufferLen=%lu", pusRandomNumBuffer, xBufferLength ) ); + xStatus = pdFAIL; + } + + if( xStatus == pdPASS ) + { + /* Get list of functions supported by the PKCS #11 port. */ + xResult = C_GetFunctionList( &pxFunctionList ); + + if( ( xResult != CKR_OK ) || ( pxFunctionList == NULL ) ) + { + LogError( ( "Failed to generate random number. " + "PKCS #11 API, C_GetFunctionList, failed." ) ); + xStatus = pdFAIL; + } + } + + if( xStatus == pdPASS ) + { + /* Initialize PKCS #11 module and create a new session. */ + xResult = xInitializePkcs11Session( &xSession ); + + if( ( xResult != CKR_OK ) || ( xSession == CK_INVALID_HANDLE ) ) + { + LogError( ( "Failed to generate random number. " + "Failed to initialize PKCS #11 session." ) ); + xStatus = pdFAIL; + } + } + + if( xStatus == pdPASS ) + { + if( pxFunctionList->C_GenerateRandom( xSession, + pusRandomNumBuffer, + xBufferLength ) != CKR_OK ) + { + xStatus = pdFAIL; + LogError( ( "Failed to generate random number. " + "PKCS #11 API, C_GenerateRandom, failed to generate random number." ) ); + } + } + + if( xStatus == pdPASS ) + { + if( pxFunctionList->C_CloseSession( xSession ) != CKR_OK ) + { + xStatus = pdFAIL; + LogError( ( " Failed to close PKCS #11 session after generating random number." ) ); + } + } + + return xStatus; +} diff --git a/demos/common/pkcs11_helpers/pkcs11_helpers.h b/demos/common/pkcs11_helpers/pkcs11_helpers.h new file mode 100644 index 00000000000..63a92461865 --- /dev/null +++ b/demos/common/pkcs11_helpers/pkcs11_helpers.h @@ -0,0 +1,54 @@ +/* + * FreeRTOS V202012.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef PKCS11_HELPERS_H_ +#define PKCS11_HELPERS_H_ + +/** + * @file pkcs11_helpers.h + * @brief Helper functions for accessing PKCS11 module functionality. + */ + +/* FreeRTOS include. */ +#include "FreeRTOS.h" + +/*-----------------------------------------------------------*/ + +/** + * @brief Utility function to generate a random number using the + * PKCS11 module. + * + * This is a wrapper function for initiating a PKCS11 session, + * calling the C_GenerateRandom API function to generate a random + * number and closing the PKCS11 session. + * + * @param[in, out] pusRandomNumBuffer The buffer to store the generated random number. + * @param[in] xBufferLength The size of the @p pusRandomNumBuffer buffer. + * + * @return pdPASS if random number generation was successful; otherwise + * pdFAIL to indicate failure. + */ +BaseType_t xPkcs11GenerateRandomNumber( uint8_t * pusRandomNumBuffer, + size_t xBufferLength ); + + +#endif /* ifndef PKCS11_HELPERS_H_ */ diff --git a/demos/coreHTTP/CMakeLists.txt b/demos/coreHTTP/CMakeLists.txt new file mode 100644 index 00000000000..f90b34d5a7f --- /dev/null +++ b/demos/coreHTTP/CMakeLists.txt @@ -0,0 +1,41 @@ +# FreeRTOS coreHTTP demos +afr_demo_module(core_http) + +# Set the default demo that is enabled in the downloaded package. +afr_set_demo_metadata(ID "CORE_HTTP_MUTUAL_AUTH_DEMO") +afr_set_demo_metadata(DESCRIPTION "Examples that demonstrate the HTTP library") +afr_set_demo_metadata(DISPLAY_NAME "coreHTTP Demos") + +# Add the CMakeLists.txt file of module to metadata list. +afr_module_cmake_files(${AFR_CURRENT_MODULE} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt +) + +afr_module_sources( + ${AFR_CURRENT_MODULE} + INTERFACE + "${CMAKE_CURRENT_LIST_DIR}/http_demo_mutual_auth.c" + "${CMAKE_CURRENT_LIST_DIR}/http_demo_s3_download.c" + "${CMAKE_CURRENT_LIST_DIR}/http_demo_s3_download_multithreaded.c" + "${CMAKE_CURRENT_LIST_DIR}/http_demo_s3_upload.c" +) + +afr_module_include_dirs( + ${AFR_CURRENT_MODULE} + INTERFACE + ${AFR_DEMOS_DIR}/common/http_demo_helpers +) + +afr_module_dependencies( + ${AFR_CURRENT_MODULE} + INTERFACE + AFR::http_demo_helpers + AFR::core_http + AFR::backoff_algorithm + AFR::transport_interface_secure_sockets + AFR::secure_sockets + # Add dependency on the core_http_demo_dependencies metadata module + # so that FreeRTOS console shows this demo ONLY when the core HTTP library + # is selected on the console. + AFR::core_http_demo_dependencies +) diff --git a/demos/coreHTTP/http_demo_mutual_auth.c b/demos/coreHTTP/http_demo_mutual_auth.c new file mode 100644 index 00000000000..8738cae4633 --- /dev/null +++ b/demos/coreHTTP/http_demo_mutual_auth.c @@ -0,0 +1,489 @@ +/* + * FreeRTOS V202012.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + */ + +/* + * Demo for showing use of the HTTP API using a mutually-authenticated network + * connection. + * + * The example shown below uses HTTP APIs to first create a + * mutually-authenticated network connection with an HTTP server, and then send + * a POST request containing a simple message. This example is single threaded + * and uses statically allocated memory. It uses QoS1 for sending and receiving + * messages from the server. + * + * A mutually-authenticated TLS connection is used to connect to the HTTP server + * in this example. Define democonfigAWS_IOT_ENDPOINT and democonfigROOT_CA_PEM + * in http_demo_mutual_auth_config.h, and define the client private key and + * certificate in aws_clientcredential_keys.h, to establish a mutually + * authenticated connection. + */ + +/** + * @file http_demo_mutual_auth.c + * @brief Demonstrates usage of the HTTP library. + * + * @note This demo uses retry logic to connect to the server if connection attempts fail. + * The FreeRTOS/backoffAlgorithm library is used to calculate the retry interval with an exponential + * backoff and jitter algorithm. For generating random number required by the algorithm, the PKCS11 + * module is used as it allows access to a True Random Number Generator (TRNG) if the vendor platform + * supports it. + * It is RECOMMENDED to seed the random number generator with a device-specific entropy source so that + * probability of collisions from devices in connection retries is mitigated. + */ +/* Standard includes. */ +#include +#include +#include + +/* Demo Specific configs. */ +#include "http_demo_mutual_auth_config.h" + +/* Include common demo header. */ +#include "aws_demo.h" + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Transport interface implementation include header for TLS. */ +#include "transport_secure_sockets.h" + +/* Common HTTP demo utilities. */ +#include "http_demo_utils.h" + +/* HTTP API header. */ +#include "core_http_client.h" + +/* Include header for connection configurations. */ +#include "aws_clientcredential.h" + +/* Include header for root CA certificates. */ +#include "iot_default_root_certificates.h" + +/*------------- Demo configurations -------------------------*/ + +/** Note: The device client certificate and private key credentials are + * obtained by the transport interface implementation (with Secure Sockets) + * from the demos/include/aws_clientcredential_keys.h file. + * + * The following macros SHOULD be defined for this demo which uses both server + * and client authentications for TLS session: + * - keyCLIENT_CERTIFICATE_PEM for client certificate. + * - keyCLIENT_PRIVATE_KEY_PEM for client private key. + */ + +/* Check that a path for HTTP Method POST is defined. */ +#ifndef democonfigPOST_PATH + #error "Please define democonfigPOST_PATH." +#endif + +/* Check that a request body to send for the POST request is defined. */ +#ifndef democonfigREQUEST_BODY + #error "Please define a democonfigREQUEST_BODY." +#endif + +/* Check that the AWS IoT Core endpoint is defined. */ +#ifndef democonfigAWS_IOT_ENDPOINT + #define democonfigAWS_IOT_ENDPOINT clientcredentialMQTT_BROKER_ENDPOINT +#endif + +/* Check that a TLS port for AWS IoT Core is defined. */ +#ifndef democonfigAWS_HTTP_PORT + #define democonfigAWS_HTTP_PORT clientcredentialMQTT_BROKER_PORT +#endif + +/* Check that the root CA certificate is defined. */ +#ifndef democonfigROOT_CA_PEM + #define democonfigROOT_CA_PEM tlsATS1_ROOT_CERTIFICATE_PEM +#endif + +/* Check that a transport timeout for transport send and receive is defined. */ +#ifndef democonfigTRANSPORT_SEND_RECV_TIMEOUT_MS + #define democonfigTRANSPORT_SEND_RECV_TIMEOUT_MS ( 1000 ) +#endif + +/* Check that a size for the user buffer is defined. */ +#ifndef democonfigUSER_BUFFER_LENGTH + #define democonfigUSER_BUFFER_LENGTH ( 2048 ) +#endif + +/** + * @brief The length of the AWS IoT Endpoint. + */ +#define httpexampleAWS_IOT_ENDPOINT_LENGTH ( sizeof( democonfigAWS_IOT_ENDPOINT ) - 1 ) + +/** + * @brief The length of the HTTP POST method. + */ +#define httpexampleHTTP_METHOD_POST_LENGTH ( sizeof( HTTP_METHOD_POST ) - 1 ) + +/** + * @brief The length of the HTTP POST path. + */ +#define httpexamplePOST_PATH_LENGTH ( sizeof( democonfigPOST_PATH ) - 1 ) + +/** + * @brief Length of the request body. + */ +#define httpexampleREQUEST_BODY_LENGTH ( sizeof( democonfigREQUEST_BODY ) - 1 ) + +/** + * @brief The maximum number of times to run the loop in this demo. + */ +#ifndef httpexampleMAX_DEMO_COUNT + #define httpexampleMAX_DEMO_COUNT ( 3 ) +#endif + +/** + * @brief Time in ticks to wait between each cycle of the demo implemented + * by RunCoreHttpMutualAuthDemo(). + */ +#define httpexampleDELAY_BETWEEN_DEMO_ITERATIONS_TICKS ( pdMS_TO_TICKS( 5000U ) ) + +/** + * @brief A buffer used in the demo for storing HTTP request headers and + * HTTP response headers and body. + * + * @note This demo shows how the same buffer can be re-used for storing the HTTP + * response after the HTTP request is sent out. However, the user can also + * decide to use separate buffers for storing the HTTP request and response. + */ +static uint8_t ucUserBuffer[ democonfigUSER_BUFFER_LENGTH ]; + +/*-----------------------------------------------------------*/ + +/** + * @brief Connect to HTTP server with reconnection retries. + * + * @param[out] pxNetworkContext The output parameter to return the created network context. + * + * @return pdPASS on successful connection, pdFAIL otherwise. + */ +static BaseType_t prvConnectToServer( NetworkContext_t * pxNetworkContext ); + +/** + * @brief Send an HTTP request based on a specified method and path, then + * print the response received from the server. + * + * @param[in] pxTransportInterface The transport interface for making network calls. + * @param[in] pcMethod The HTTP request method. + * @param[in] xMethodLen The length of the HTTP request method. + * @param[in] pcPath The Request-URI to the objects of interest. + * @param[in] xPathLen The length of the Request-URI. + * + * @return pdFAIL on failure; pdPASS on success. + */ +static BaseType_t prvSendHttpRequest( const TransportInterface_t * pxTransportInterface, + const char * pcMethod, + size_t xMethodLen, + const char * pcPath, + size_t xPathLen ); + +/*-----------------------------------------------------------*/ + +/** + * @brief Entry point of the demo. + * + * This example resolves the AWS IoT Core endpoint, establishes a TCP + * connection, and performs a mutually authenticated TLS handshake such that all + * further communication is encrypted. After which, the HTTP Client Library API + * is used to make a POST request to AWS IoT Core in order to publish a message + * to a topic named "topic" with QoS=1 so that all clients subscribed to this + * topic receive the message at least once. Any possible errors are also logged. + * + * @note This example is single-threaded and uses statically allocated memory. + * + */ +int RunCoreHttpMutualAuthDemo( bool awsIotMqttMode, + const char * pIdentifier, + void * pNetworkServerInfo, + void * pNetworkCredentialInfo, + const IotNetworkInterface_t * pNetworkInterface ) +{ + /* The transport layer interface used by the HTTP Client library. */ + TransportInterface_t xTransportInterface; + /* The network context for the transport layer interface. */ + NetworkContext_t xNetworkContext = { 0 }; + TransportSocketStatus_t xNetworkStatus; + BaseType_t xIsConnectionEstablished = pdFALSE; + UBaseType_t uxDemoRunCount = 0UL; + + /* Upon return, pdPASS will indicate a successful demo execution. + * pdFAIL will indicate some failures occurred during execution. The + * user of this demo must check the logs for any failure codes. */ + BaseType_t xDemoStatus = pdPASS; + + /* Remove compiler warnings about unused parameters. */ + ( void ) awsIotMqttMode; + ( void ) pIdentifier; + ( void ) pNetworkServerInfo; + ( void ) pNetworkCredentialInfo; + ( void ) pNetworkInterface; + + do + { + /**************************** Connect. ******************************/ + + /* Attempt to connect to the HTTP server. If connection fails, retry + * after a timeout. The timeout value will be exponentially increased + * until either the maximum number of attempts or the maximum timeout + * value is reached. The function returns pdFAIL if the TCP connection + * cannot be established with the broker after the configured number of + * attempts. */ + xDemoStatus = connectToServerWithBackoffRetries( prvConnectToServer, + &xNetworkContext ); + + if( xDemoStatus == pdPASS ) + { + /* Set a flag indicating that a TLS connection exists. */ + xIsConnectionEstablished = pdTRUE; + + /* Define the transport interface. */ + xTransportInterface.pNetworkContext = &xNetworkContext; + xTransportInterface.send = SecureSocketsTransport_Send; + xTransportInterface.recv = SecureSocketsTransport_Recv; + } + else + { + /* Log error to indicate connection failure after all + * reconnect attempts are over. */ + LogError( ( "Failed to connect to HTTP server %.*s.", + ( int32_t ) httpexampleAWS_IOT_ENDPOINT_LENGTH, + democonfigAWS_IOT_ENDPOINT ) ); + } + + /*********************** Send HTTP request.************************/ + + if( xDemoStatus == pdPASS ) + { + xDemoStatus = prvSendHttpRequest( &xTransportInterface, + HTTP_METHOD_POST, + httpexampleHTTP_METHOD_POST_LENGTH, + democonfigPOST_PATH, + httpexamplePOST_PATH_LENGTH ); + } + + /**************************** Disconnect. ******************************/ + + /* Close the network connection to clean up any system resources that the + * demo may have consumed. */ + if( xIsConnectionEstablished == pdTRUE ) + { + /* Close the network connection. */ + xNetworkStatus = SecureSocketsTransport_Disconnect( &xNetworkContext ); + + if( xNetworkStatus != TRANSPORT_SOCKET_STATUS_SUCCESS ) + { + xDemoStatus = pdFAIL; + LogError( ( "SecureSocketsTransport_Disconnect() failed to close the network connection. " + "StatusCode=%d.", ( int ) xNetworkStatus ) ); + } + } + + /* Increment the demo run count. */ + uxDemoRunCount++; + + if( xDemoStatus == pdPASS ) + { + LogInfo( ( "Demo iteration %lu was successful.", uxDemoRunCount ) ); + } + /* Attempt to retry a failed demo iteration for up to #httpexampleMAX_DEMO_COUNT times. */ + else if( uxDemoRunCount < httpexampleMAX_DEMO_COUNT ) + { + LogWarn( ( "Demo iteration %lu failed. Retrying...", uxDemoRunCount ) ); + vTaskDelay( httpexampleDELAY_BETWEEN_DEMO_ITERATIONS_TICKS ); + } + /* Failed all #httpexampleMAX_DEMO_COUNT demo iterations. */ + else + { + LogError( ( "All %d demo iterations failed.", httpexampleMAX_DEMO_COUNT ) ); + break; + } + } while( xDemoStatus != pdPASS ); + + if( xDemoStatus == pdPASS ) + { + LogInfo( ( "Demo completed successfully." ) ); + } + + return ( xDemoStatus == pdPASS ) ? EXIT_SUCCESS : EXIT_FAILURE; +} + +/*-----------------------------------------------------------*/ + +static BaseType_t prvConnectToServer( NetworkContext_t * pxNetworkContext ) +{ + ServerInfo_t xServerInfo = { 0 }; + SocketsConfig_t xSocketsConfig = { 0 }; + BaseType_t xStatus = pdPASS; + TransportSocketStatus_t xNetworkStatus = TRANSPORT_SOCKET_STATUS_SUCCESS; + + /* Initializer server information. */ + xServerInfo.pHostName = democonfigAWS_IOT_ENDPOINT; + xServerInfo.hostNameLength = httpexampleAWS_IOT_ENDPOINT_LENGTH; + xServerInfo.port = democonfigAWS_HTTP_PORT; + + /* Configure credentials for TLS mutual authenticated session. */ + xSocketsConfig.enableTls = true; + xSocketsConfig.pAlpnProtos = NULL; + xSocketsConfig.maxFragmentLength = 0; + xSocketsConfig.disableSni = false; + xSocketsConfig.pRootCa = democonfigROOT_CA_PEM; + xSocketsConfig.rootCaSize = sizeof( democonfigROOT_CA_PEM ); + xSocketsConfig.sendTimeoutMs = democonfigTRANSPORT_SEND_RECV_TIMEOUT_MS; + xSocketsConfig.recvTimeoutMs = democonfigTRANSPORT_SEND_RECV_TIMEOUT_MS; + + /* Establish a TLS session with the HTTP server. This example connects to + * the HTTP server as specified in democonfigAWS_IOT_ENDPOINT and + * democonfigAWS_HTTP_PORT in http_demo_mutual_auth_config.h. */ + LogInfo( ( "Establishing a TLS session to %.*s:%d.", + ( int32_t ) httpexampleAWS_IOT_ENDPOINT_LENGTH, + democonfigAWS_IOT_ENDPOINT, + democonfigAWS_HTTP_PORT ) ); + + /* Attempt to create a mutually authenticated TLS connection. */ + xNetworkStatus = SecureSocketsTransport_Connect( pxNetworkContext, + &xServerInfo, + &xSocketsConfig ); + + if( xNetworkStatus != TRANSPORT_SOCKET_STATUS_SUCCESS ) + { + xStatus = pdFAIL; + } + + return xStatus; +} + +/*-----------------------------------------------------------*/ + +static BaseType_t prvSendHttpRequest( const TransportInterface_t * pxTransportInterface, + const char * pcMethod, + size_t xMethodLen, + const char * pcPath, + size_t xPathLen ) +{ + /* Return value of this method. */ + BaseType_t xStatus = pdPASS; + + /* Configurations of the initial request headers that are passed to + * #HTTPClient_InitializeRequestHeaders. */ + HTTPRequestInfo_t xRequestInfo; + /* Represents a response returned from an HTTP server. */ + HTTPResponse_t xResponse; + /* Represents header data that will be sent in an HTTP request. */ + HTTPRequestHeaders_t xRequestHeaders; + + /* Return value of all methods from the HTTP Client library API. */ + HTTPStatus_t xHTTPStatus = HTTPSuccess; + + configASSERT( pcMethod != NULL ); + configASSERT( pcPath != NULL ); + + /* Initialize all HTTP Client library API structs to 0. */ + ( void ) memset( &xRequestInfo, 0, sizeof( xRequestInfo ) ); + ( void ) memset( &xResponse, 0, sizeof( xResponse ) ); + ( void ) memset( &xRequestHeaders, 0, sizeof( xRequestHeaders ) ); + + /* Initialize the request object. */ + xRequestInfo.pHost = democonfigAWS_IOT_ENDPOINT; + xRequestInfo.hostLen = httpexampleAWS_IOT_ENDPOINT_LENGTH; + xRequestInfo.pMethod = pcMethod; + xRequestInfo.methodLen = xMethodLen; + xRequestInfo.pPath = pcPath; + xRequestInfo.pathLen = xPathLen; + + /* Set "Connection" HTTP header to "keep-alive" so that multiple requests + * can be sent over the same established TCP connection. */ + xRequestInfo.reqFlags = HTTP_REQUEST_KEEP_ALIVE_FLAG; + + /* Set the buffer used for storing request headers. */ + xRequestHeaders.pBuffer = ucUserBuffer; + xRequestHeaders.bufferLen = democonfigUSER_BUFFER_LENGTH; + + xHTTPStatus = HTTPClient_InitializeRequestHeaders( &xRequestHeaders, + &xRequestInfo ); + + if( xHTTPStatus == HTTPSuccess ) + { + /* Initialize the response object. The same buffer used for storing + * request headers is reused here. */ + xResponse.pBuffer = ucUserBuffer; + xResponse.bufferLen = democonfigUSER_BUFFER_LENGTH; + + LogInfo( ( "Sending HTTP %.*s request to %.*s%.*s...", + ( int32_t ) xRequestInfo.methodLen, xRequestInfo.pMethod, + ( int32_t ) httpexampleAWS_IOT_ENDPOINT_LENGTH, democonfigAWS_IOT_ENDPOINT, + ( int32_t ) xRequestInfo.pathLen, xRequestInfo.pPath ) ); + LogDebug( ( "Request Headers:\n%.*s\n" + "Request Body:\n%.*s\n", + ( int32_t ) xRequestHeaders.headersLen, + ( char * ) xRequestHeaders.pBuffer, + ( int32_t ) httpexampleREQUEST_BODY_LENGTH, democonfigREQUEST_BODY ) ); + + /* Send the request and receive the response. */ + xHTTPStatus = HTTPClient_Send( pxTransportInterface, + &xRequestHeaders, + ( uint8_t * ) democonfigREQUEST_BODY, + httpexampleREQUEST_BODY_LENGTH, + &xResponse, + 0 ); + } + else + { + LogError( ( "Failed to initialize HTTP request headers: Error=%s.", + HTTPClient_strerror( xHTTPStatus ) ) ); + } + + if( xHTTPStatus == HTTPSuccess ) + { + LogInfo( ( "Received HTTP response from %.*s%.*s...\n", + ( int32_t ) httpexampleAWS_IOT_ENDPOINT_LENGTH, democonfigAWS_IOT_ENDPOINT, + ( int32_t ) xRequestInfo.pathLen, xRequestInfo.pPath ) ); + LogDebug( ( "Response Headers:\n%.*s\n", + ( int32_t ) xResponse.headersLen, xResponse.pHeaders ) ); + LogDebug( ( "Status Code:\n%u\n", + xResponse.statusCode ) ); + LogDebug( ( "Response Body:\n%.*s\n", + ( int32_t ) xResponse.bodyLen, xResponse.pBody ) ); + } + else + { + LogError( ( "Failed to send HTTP %.*s request to %.*s%.*s: Error=%s.", + ( int32_t ) xRequestInfo.methodLen, xRequestInfo.pMethod, + ( int32_t ) httpexampleAWS_IOT_ENDPOINT_LENGTH, democonfigAWS_IOT_ENDPOINT, + ( int32_t ) xRequestInfo.pathLen, xRequestInfo.pPath, + HTTPClient_strerror( xHTTPStatus ) ) ); + } + + if( xHTTPStatus != HTTPSuccess ) + { + xStatus = pdFAIL; + } + + return xStatus; +} + +/*-----------------------------------------------------------*/ diff --git a/demos/coreHTTP/http_demo_s3_download.c b/demos/coreHTTP/http_demo_s3_download.c new file mode 100644 index 00000000000..be46d743807 --- /dev/null +++ b/demos/coreHTTP/http_demo_s3_download.c @@ -0,0 +1,790 @@ +/* + * FreeRTOS V202012.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + */ + +/* + * Demo for showing use of the HTTP API using a server-authenticated network + * connection. + * + * This example, using a pre-signed URL, resolves a S3 domain, establishes a TCP + * connection, validates the server's certificate using the root CA certificate + * defined in the config header, then finally performs a TLS handshake with the + * HTTP server so that all communication is encrypted. After which, the HTTP + * client library API is used to download the S3 file (by sending multiple GET + * requests, filling up the response buffer each time until all parts are + * downloaded). If any request fails, an error code is returned. + * + * @note This demo requires user-generated pre-signed URLs to be pasted into + * http_demo_s3_download_config.h. Please use the provided script + * "presigned_urls_gen.py" (located in http_demo_helpers) to generate these + * URLs. For detailed instructions, see the accompanied README.md. + * + * @note If your file requires more than 99 range requests to S3 (depending on the + * size of the file and the length specified in democonfigRANGE_REQUEST_LENGTH), + * your connection may be dropped by S3. In this case, either increase the + * buffer size and range request length (if feasible), to reduce the number of + * requests required, or re-establish the connection with S3 after receiving a + * "Connection: close" response header. + * + * @note This demo uses retry logic to connect to the server if connection + * attempts fail. The FreeRTOS/backoffAlgorithm library is used to calculate the + * retry interval with an exponential backoff and jitter algorithm. For + * generating random number required by the algorithm, the PKCS11 module is used + * as it allows access to a True Random Number Generator (TRNG) if the vendor + * platform supports it. + * It is RECOMMENDED to seed the random number generator with a device-specific + * entropy source so that probability of collisions from devices in connection + * retries is mitigated. + */ + +/** + * @file http_demo_s3_download.c + * @brief Demonstrates usage of the HTTP library. + */ + +/* Standard includes. */ +#include +#include +#include +#include +#include + +/* Include demo config as the first non-system header. */ +#include "http_demo_s3_download_config.h" + +/* Include common demo header. */ +#include "aws_demo.h" + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Transport interface implementation include header for TLS. */ +#include "transport_secure_sockets.h" + +/* Common HTTP demo utilities. */ +#include "http_demo_utils.h" + +/* HTTP API header. */ +#include "core_http_client.h" + +/*------------- Demo configurations -------------------------*/ + +/* Check that the TLS port of the server is defined. */ +#ifndef democonfigHTTPS_PORT + #error "Please define democonfigHTTPS_PORT in http_demo_s3_download_config.h." +#endif + +/* Check that the root CA certificate is defined. */ +#ifndef democonfigROOT_CA_PEM + #error "Please define democonfigROOT_CA_PEM in http_demo_s3_download_config.h." +#endif + +/* Check that the pre-signed GET URL is defined. */ +#ifndef democonfigS3_PRESIGNED_GET_URL + #define democonfigS3_PRESIGNED_GET_URL "GET-URL" +#endif + +/* Check that a transport timeout for the transport send and receive functions + * is defined. */ +#ifndef democonfigTRANSPORT_SEND_RECV_TIMEOUT_MS + #define democonfigTRANSPORT_SEND_RECV_TIMEOUT_MS ( 5000 ) +#endif + +/* Check that the size of the user buffer is defined. */ +#ifndef democonfigUSER_BUFFER_LENGTH + #define democonfigUSER_BUFFER_LENGTH ( 4096 ) +#endif + +/* Check that the range request length is defined. */ +#ifndef democonfigRANGE_REQUEST_LENGTH + #define democonfigRANGE_REQUEST_LENGTH ( 2048 ) +#endif + +/** + * @brief Length of the pre-signed GET URL defined in demo_config.h. + */ +#define httpexampleS3_PRESIGNED_GET_URL_LENGTH ( sizeof( democonfigS3_PRESIGNED_GET_URL ) - 1 ) + +/** + * @brief The length of the HTTP GET method. + */ +#define httpexampleHTTP_METHOD_GET_LENGTH ( sizeof( HTTP_METHOD_GET ) - 1 ) + +/** + * @brief Field name of the HTTP range header to read from server response. + */ +#define httpexampleHTTP_CONTENT_RANGE_HEADER_FIELD "Content-Range" + +/** + * @brief Length of the HTTP range header field. + */ +#define httpexampleHTTP_CONTENT_RANGE_HEADER_FIELD_LENGTH ( sizeof( httpexampleHTTP_CONTENT_RANGE_HEADER_FIELD ) - 1 ) + +/** + * @brief The HTTP status code returned for partial content. + */ +#define httpexampleHTTP_STATUS_CODE_PARTIAL_CONTENT 206 + +/** + * @brief The maximum number of times to run the loop in this demo. + */ +#ifndef httpexampleMAX_DEMO_COUNT + #define httpexampleMAX_DEMO_COUNT ( 3 ) +#endif + +/** + * @brief Time in ticks to wait between each cycle of the demo implemented + * by RunCoreHttpS3DownloadDemo(). + */ +#define httpexampleDELAY_BETWEEN_DEMO_ITERATIONS_TICKS ( pdMS_TO_TICKS( 5000U ) ) + +/** + * @brief A buffer used in the demo for storing HTTP request headers, and HTTP + * response headers and body. + * + * @note This demo shows how the same buffer can be re-used for storing the HTTP + * response after the HTTP request is sent out. However, the user can decide how + * to use buffers to store HTTP requests and responses. + */ +static uint8_t ucUserBuffer[ democonfigUSER_BUFFER_LENGTH ]; + +/** + * @brief Represents header data that will be sent in an HTTP request. + */ +static HTTPRequestHeaders_t xRequestHeaders; + +/** + * @brief Configurations of the initial request headers that are passed to + * #HTTPClient_InitializeRequestHeaders. + */ +static HTTPRequestInfo_t xRequestInfo; + +/** + * @brief Represents a response returned from an HTTP server. + */ +static HTTPResponse_t xResponse; + +/** + * @brief The host address string extracted from the pre-signed URL. + * + * @note httpexampleS3_PRESIGNED_GET_URL_LENGTH is set as the array length here as the + * length of the host name string cannot exceed this value. + */ +static char cServerHost[ httpexampleS3_PRESIGNED_GET_URL_LENGTH ]; + +/** + * @brief The length of the host address found in the pre-signed URL. + */ +static size_t xServerHostLength; + +/** + * @brief The location of the path within the pre-signed URL. + */ +static const char * pcPath; + +/*-----------------------------------------------------------*/ + +/** + * @brief Connect to HTTP server with reconnection retries. + * + * @param[out] pxNetworkContext The output parameter to return the created + * network context. + * + * @return pdFAIL on failure; pdPASS on successful connection. + */ +static BaseType_t prvConnectToServer( NetworkContext_t * pxNetworkContext ); + +/** + * @brief Retrieve the size of the S3 object that is specified in pcPath. + * + * @param[out] pxFileSize The size of the S3 object. + * @param[in] pxTransportInterface The transport interface for making network + * calls. + * @param[in] pcHost The server host address. This string must be + * null-terminated. + * @param[in] xHostLen The length of the server host address. + * @param[in] pcPath The Request-URI to the objects of interest. This string + * should be null-terminated. + * + * @return The status of the file size acquisition using a GET request to the + * server: pdPASS on success, pdFAIL on failure. + */ +static BaseType_t prvGetS3ObjectFileSize( size_t * pxFileSize, + const TransportInterface_t * pxTransportInterface, + const char * pcHost, + size_t xHostLen, + const char * pcPath ); + +/** + * @brief Send multiple HTTP GET requests, based on a specified path, to + * download a file in chunks from the host S3 server. + * + * @param[in] pxTransportInterface The transport interface for making network + * calls. + * @param[in] pcPath The Request-URI to the objects of interest. This string + * should be null-terminated. + * + * @return The status of the file download using multiple GET requests to the + * server: pdPASS on success, pdFAIL on failure. + */ +static BaseType_t prvDownloadS3ObjectFile( const TransportInterface_t * pxTransportInterface, + const char * pcPath ); + +/*-----------------------------------------------------------*/ + +static BaseType_t prvConnectToServer( NetworkContext_t * pxNetworkContext ) +{ + ServerInfo_t xServerInfo = { 0 }; + SocketsConfig_t xSocketsConfig = { 0 }; + BaseType_t xStatus = pdPASS; + TransportSocketStatus_t xNetworkStatus = TRANSPORT_SOCKET_STATUS_SUCCESS; + HTTPStatus_t xHTTPStatus = HTTPSuccess; + + /* The location of the host address within the pre-signed URL. */ + const char * pcAddress = NULL; + + /* Retrieve the address location and length from democonfigS3_PRESIGNED_GET_URL. */ + xHTTPStatus = getUrlAddress( democonfigS3_PRESIGNED_GET_URL, + httpexampleS3_PRESIGNED_GET_URL_LENGTH, + &pcAddress, + &xServerHostLength ); + + xStatus = ( xHTTPStatus == HTTPSuccess ) ? pdPASS : pdFAIL; + + if( xStatus == pdPASS ) + { + /* cServerHost should consist only of the host address located in + * democonfigS3_PRESIGNED_GET_URL. */ + memcpy( cServerHost, pcAddress, xServerHostLength ); + cServerHost[ xServerHostLength ] = '\0'; + + /* Initializer server information. */ + xServerInfo.pHostName = cServerHost; + xServerInfo.hostNameLength = xServerHostLength; + xServerInfo.port = democonfigHTTPS_PORT; + + /* Configure credentials for TLS server-authenticated session. */ + xSocketsConfig.enableTls = true; + xSocketsConfig.pAlpnProtos = NULL; + xSocketsConfig.maxFragmentLength = 0; + xSocketsConfig.disableSni = false; + xSocketsConfig.pRootCa = democonfigROOT_CA_PEM; + xSocketsConfig.rootCaSize = sizeof( democonfigROOT_CA_PEM ); + xSocketsConfig.sendTimeoutMs = democonfigTRANSPORT_SEND_RECV_TIMEOUT_MS; + xSocketsConfig.recvTimeoutMs = democonfigTRANSPORT_SEND_RECV_TIMEOUT_MS; + + /* Establish a TLS session with the HTTP server. This example connects + * to the server host located in democonfigPRESIGNED_GET_URL and + * democonfigHTTPS_PORT in demo_config.h. */ + LogInfo( ( "Establishing a TLS session with %s:%d.", + cServerHost, + democonfigHTTPS_PORT ) ); + + /* Attempt to create a server-authenticated TLS connection. */ + xNetworkStatus = SecureSocketsTransport_Connect( pxNetworkContext, + &xServerInfo, + &xSocketsConfig ); + + if( xNetworkStatus != TRANSPORT_SOCKET_STATUS_SUCCESS ) + { + xStatus = pdFAIL; + } + } + + return xStatus; +} + +/*-----------------------------------------------------------*/ + +static BaseType_t prvGetS3ObjectFileSize( size_t * pxFileSize, + const TransportInterface_t * pxTransportInterface, + const char * pcHost, + size_t xHostLen, + const char * pcPath ) +{ + BaseType_t xStatus = pdPASS; + HTTPStatus_t xHTTPStatus = HTTPSuccess; + + /* The location of the file size in pcContentRangeValStr. */ + char * pcFileSizeStr = NULL; + + /* String to store the Content-Range header value. */ + char * pcContentRangeValStr = NULL; + size_t xContentRangeValStrLength = 0; + + configASSERT( pxFileSize != NULL ); + configASSERT( pcHost != NULL ); + configASSERT( pcPath != NULL ); + + /* Initialize all HTTP Client library API structs to 0. */ + ( void ) memset( &xRequestHeaders, 0, sizeof( xRequestHeaders ) ); + ( void ) memset( &xRequestInfo, 0, sizeof( xRequestInfo ) ); + ( void ) memset( &xResponse, 0, sizeof( xResponse ) ); + + /* Initialize the request object. */ + xRequestInfo.pHost = pcHost; + xRequestInfo.hostLen = xHostLen; + xRequestInfo.pMethod = HTTP_METHOD_GET; + xRequestInfo.methodLen = sizeof( HTTP_METHOD_GET ) - 1; + xRequestInfo.pPath = pcPath; + xRequestInfo.pathLen = strlen( pcPath ); + + /* Set "Connection" HTTP header to "keep-alive" so that multiple requests + * can be sent over the same established TCP connection. This is done in + * order to download the file in parts. */ + xRequestInfo.reqFlags = HTTP_REQUEST_KEEP_ALIVE_FLAG; + + /* Set the buffer used for storing request headers. */ + xRequestHeaders.pBuffer = ucUserBuffer; + xRequestHeaders.bufferLen = democonfigUSER_BUFFER_LENGTH; + + /* Initialize the response object. The same buffer used for storing request + * headers is reused here. */ + xResponse.pBuffer = ucUserBuffer; + xResponse.bufferLen = democonfigUSER_BUFFER_LENGTH; + + LogInfo( ( "Getting file object size from host..." ) ); + + xHTTPStatus = HTTPClient_InitializeRequestHeaders( &xRequestHeaders, + &xRequestInfo ); + + if( xHTTPStatus != HTTPSuccess ) + { + LogError( ( "Failed to initialize HTTP request headers: Error=%s.", + HTTPClient_strerror( xHTTPStatus ) ) ); + xStatus = pdFAIL; + } + + if( xStatus == pdPASS ) + { + /* Add the header to get bytes=0-0. S3 will respond with a Content-Range + * header that contains the size of the file in it. This header will + * look like: "Content-Range: bytes 0-0/FILESIZE". The body will have a + * single byte that we are ignoring. */ + xHTTPStatus = HTTPClient_AddRangeHeader( &xRequestHeaders, 0, 0 ); + + if( xHTTPStatus != HTTPSuccess ) + { + LogError( ( "Failed to add range header to request headers: Error=%s.", + HTTPClient_strerror( xHTTPStatus ) ) ); + xStatus = pdFAIL; + } + } + + if( xStatus == pdPASS ) + { + /* Send the request and receive the response. */ + xHTTPStatus = HTTPClient_Send( pxTransportInterface, + &xRequestHeaders, + NULL, + 0, + &xResponse, + 0 ); + + if( xHTTPStatus != HTTPSuccess ) + { + LogError( ( "Failed to send HTTP GET request to %s%s: Error=%s.", + pcHost, pcPath, HTTPClient_strerror( xHTTPStatus ) ) ); + xStatus = pdFAIL; + } + } + + if( xStatus == pdPASS ) + { + LogDebug( ( "Received HTTP response from %s%s...", + pcHost, pcPath ) ); + LogDebug( ( "Response Headers:\n%.*s", + ( int32_t ) xResponse.headersLen, + xResponse.pHeaders ) ); + LogDebug( ( "Response Body:\n%.*s\n", + ( int32_t ) xResponse.bodyLen, + xResponse.pBody ) ); + + if( xResponse.statusCode != httpexampleHTTP_STATUS_CODE_PARTIAL_CONTENT ) + { + LogError( ( "Received an invalid response from the server " + "(Status Code: %u).", + xResponse.statusCode ) ); + xStatus = pdFAIL; + } + } + + if( xStatus == pdPASS ) + { + LogInfo( ( "Received successful response from server " + "(Status Code: %u).", + xResponse.statusCode ) ); + + xHTTPStatus = HTTPClient_ReadHeader( &xResponse, + ( char * ) httpexampleHTTP_CONTENT_RANGE_HEADER_FIELD, + ( size_t ) httpexampleHTTP_CONTENT_RANGE_HEADER_FIELD_LENGTH, + ( const char ** ) &pcContentRangeValStr, + &xContentRangeValStrLength ); + + if( xHTTPStatus != HTTPSuccess ) + { + LogError( ( "Failed to read Content-Range header from HTTP response: Error=%s.", + HTTPClient_strerror( xHTTPStatus ) ) ); + xStatus = pdFAIL; + } + } + + /* Parse the Content-Range header value to get the file size. */ + if( xStatus == pdPASS ) + { + pcFileSizeStr = strstr( pcContentRangeValStr, "/" ); + + if( pcFileSizeStr == NULL ) + { + LogError( ( "'/' not present in Content-Range header value: %s.", + pcContentRangeValStr ) ); + xStatus = pdFAIL; + } + } + + if( xStatus == pdPASS ) + { + pcFileSizeStr += sizeof( char ); + *pxFileSize = ( size_t ) strtoul( pcFileSizeStr, NULL, 10 ); + + if( ( *pxFileSize == 0 ) || ( *pxFileSize == UINT32_MAX ) ) + { + LogError( ( "Error using strtoul to get the file size from %s: xFileSize=%d.", + pcFileSizeStr, ( int32_t ) *pxFileSize ) ); + xStatus = pdFAIL; + } + } + + if( xStatus == pdPASS ) + { + LogInfo( ( "The file is %d bytes long.", ( int32_t ) *pxFileSize ) ); + } + + return xStatus; +} + +/*-----------------------------------------------------------*/ + +static BaseType_t prvDownloadS3ObjectFile( const TransportInterface_t * pxTransportInterface, + const char * pcPath ) +{ + /* Return value of this method. */ + BaseType_t xStatus = pdFAIL; + HTTPStatus_t xHTTPStatus = HTTPSuccess; + + /* The size of the file we are trying to download in S3. */ + size_t xFileSize = 0; + + /* The number of bytes we want to request with in each range of the file + * bytes. */ + size_t xNumReqBytes = 0; + /* xCurByte indicates which starting byte we want to download next. */ + size_t xCurByte = 0; + + configASSERT( pcPath != NULL ); + + /* Initialize all HTTP Client library API structs to 0. */ + ( void ) memset( &xRequestHeaders, 0, sizeof( xRequestHeaders ) ); + ( void ) memset( &xRequestInfo, 0, sizeof( xRequestInfo ) ); + ( void ) memset( &xResponse, 0, sizeof( xResponse ) ); + + /* Initialize the request object. */ + xRequestInfo.pHost = cServerHost; + xRequestInfo.hostLen = xServerHostLength; + xRequestInfo.pMethod = HTTP_METHOD_GET; + xRequestInfo.methodLen = httpexampleHTTP_METHOD_GET_LENGTH; + xRequestInfo.pPath = pcPath; + xRequestInfo.pathLen = strlen( pcPath ); + + /* Set "Connection" HTTP header to "keep-alive" so that multiple requests + * can be sent over the same established TCP connection. This is done in + * order to download the file in parts. */ + xRequestInfo.reqFlags = HTTP_REQUEST_KEEP_ALIVE_FLAG; + + /* Set the buffer used for storing request headers. */ + xRequestHeaders.pBuffer = ucUserBuffer; + xRequestHeaders.bufferLen = democonfigUSER_BUFFER_LENGTH; + + /* Initialize the response object. The same buffer used for storing request + * headers is reused here. */ + xResponse.pBuffer = ucUserBuffer; + xResponse.bufferLen = democonfigUSER_BUFFER_LENGTH; + + /* Verify the file exists by retrieving the file size. */ + xStatus = prvGetS3ObjectFileSize( &xFileSize, + pxTransportInterface, + cServerHost, + xServerHostLength, + pcPath ); + + /* Set the number of bytes to request in each iteration, defined by the user + * in democonfigRANGE_REQUEST_LENGTH. */ + if( xFileSize < democonfigRANGE_REQUEST_LENGTH ) + { + xNumReqBytes = xFileSize; + } + else + { + xNumReqBytes = democonfigRANGE_REQUEST_LENGTH; + } + + /* Here we iterate sending byte range requests until the full file has been + * downloaded. We keep track of the next byte to download with xCurByte, and + * increment by xNumReqBytes after each iteration. When xCurByte reaches + * xFileSize, we stop downloading. */ + while( ( xStatus == pdPASS ) && ( xHTTPStatus == HTTPSuccess ) && ( xCurByte < xFileSize ) ) + { + xHTTPStatus = HTTPClient_InitializeRequestHeaders( &xRequestHeaders, + &xRequestInfo ); + + if( xHTTPStatus == HTTPSuccess ) + { + xHTTPStatus = HTTPClient_AddRangeHeader( &xRequestHeaders, + xCurByte, + xCurByte + xNumReqBytes - 1 ); + } + else + { + LogError( ( "Failed to initialize HTTP request headers: Error=%s.", + HTTPClient_strerror( xHTTPStatus ) ) ); + } + + if( xHTTPStatus == HTTPSuccess ) + { + LogInfo( ( "Downloading bytes %d-%d, out of %d total bytes, from %s...: ", + ( int32_t ) ( xCurByte ), + ( int32_t ) ( xCurByte + xNumReqBytes - 1 ), + ( int32_t ) xFileSize, + cServerHost ) ); + LogDebug( ( "Request Headers:\n%.*s", + ( int32_t ) xRequestHeaders.headersLen, + ( char * ) xRequestHeaders.pBuffer ) ); + xHTTPStatus = HTTPClient_Send( pxTransportInterface, + &xRequestHeaders, + NULL, + 0, + &xResponse, + 0 ); + } + else + { + LogError( ( "Failed to add Range header to request headers: Error=%s.", + HTTPClient_strerror( xHTTPStatus ) ) ); + } + + if( xHTTPStatus == HTTPSuccess ) + { + LogDebug( ( "Received HTTP response from %s%s...", + cServerHost, pcPath ) ); + LogDebug( ( "Response Headers:\n%.*s", + ( int32_t ) xResponse.headersLen, + xResponse.pHeaders ) ); + LogInfo( ( "Response Body:\n%.*s\n", + ( int32_t ) xResponse.bodyLen, + xResponse.pBody ) ); + + /* We increment by the content length because the server may not + * have sent us the range we requested. */ + xCurByte += xResponse.contentLength; + + if( ( xFileSize - xCurByte ) < xNumReqBytes ) + { + xNumReqBytes = xFileSize - xCurByte; + } + + xStatus = ( xResponse.statusCode == httpexampleHTTP_STATUS_CODE_PARTIAL_CONTENT ) ? pdPASS : pdFAIL; + } + else + { + LogError( ( "An error occurred in downloading the file. " + "Failed to send HTTP GET request to %s%s: Error=%s.", + cServerHost, pcPath, HTTPClient_strerror( xHTTPStatus ) ) ); + } + + if( xStatus != pdPASS ) + { + LogError( ( "Received an invalid response from the server " + "(Status Code: %u).", + xResponse.statusCode ) ); + } + } + + return( ( xStatus == pdPASS ) && ( xHTTPStatus == HTTPSuccess ) ); +} + +/*-----------------------------------------------------------*/ + +/** + * @brief Entry point of the demo. + * + * This example, using a pre-signed URL, resolves a S3 domain, establishes a + * TCP connection, validates the server's certificate using the root CA + * certificate defined in the config header, then finally performs a TLS + * handshake with the HTTP server so that all communication is encrypted. After + * which, the HTTP Client library API is used to download the S3 file (by + * sending multiple GET requests, filling up the response buffer each time until + * all parts are downloaded). If any request fails, an error code is returned. + * + * @note This example is single-threaded and uses statically allocated memory. + * + */ +int RunCoreHttpS3DownloadDemo( bool awsIotMqttMode, + const char * pIdentifier, + void * pNetworkServerInfo, + void * pNetworkCredentialInfo, + const IotNetworkInterface_t * pNetworkInterface ) +{ + /* The transport layer interface used by the HTTP Client library. */ + TransportInterface_t xTransportInterface; + /* The network context for the transport layer interface. */ + NetworkContext_t xNetworkContext = { 0 }; + TransportSocketStatus_t xNetworkStatus; + BaseType_t xIsConnectionEstablished = pdFALSE; + /* HTTPS Client library return status. */ + HTTPStatus_t xHTTPStatus = HTTPSuccess; + BaseType_t xDemoRunCount = 0UL; + + /* Upon return, pdPASS will indicate a successful demo execution. + * pdFAIL will indicate some failures occurred during execution. The + * user of this demo must check the logs for any failure codes. */ + BaseType_t xDemoStatus = pdPASS; + + /* Remove compiler warnings about unused parameters. */ + ( void ) awsIotMqttMode; + ( void ) pIdentifier; + ( void ) pNetworkServerInfo; + ( void ) pNetworkCredentialInfo; + ( void ) pNetworkInterface; + + /* The length of the path within the pre-signed URL. This variable is + * defined in order to store the length returned from parsing the URL, but + * it is unused. The path used for the requests in this demo needs all the + * query information following the location of the object, to the end of the + * S3 presigned URL. */ + size_t xPathLen = 0; + + LogInfo( ( "HTTP Client Synchronous S3 download demo using pre-signed URL:\n%s", + democonfigS3_PRESIGNED_GET_URL ) ); + + do + { + /**************************** Connect. ******************************/ + + /* Establish TLS connection on top of TCP connection using Secure Sockets. */ + + /* Attempt to connect to S3. If connection fails, retry after a timeout. + * The timeout value will be exponentially increased until either the + * maximum number of attempts or the maximum timeout value is reached. + * The function returns pdFAIL if a TCP connection with the server + * cannot be established after the configured number of attempts. */ + xDemoStatus = connectToServerWithBackoffRetries( prvConnectToServer, + &xNetworkContext ); + + if( xDemoStatus == pdFAIL ) + { + /* Log an error to indicate connection failure after all + * reconnect attempts are over. */ + LogError( ( "Failed to connect to HTTP server %s.", + cServerHost ) ); + } + + /* Define the transport interface. */ + if( xDemoStatus == pdPASS ) + { + /* Set a flag indicating that a TLS connection exists. */ + xIsConnectionEstablished = pdTRUE; + + /* Define the transport interface. */ + xTransportInterface.pNetworkContext = &xNetworkContext; + xTransportInterface.send = SecureSocketsTransport_Send; + xTransportInterface.recv = SecureSocketsTransport_Recv; + } + + /******************** Download S3 Object File. **********************/ + + if( xDemoStatus == pdPASS ) + { + /* Retrieve the path location from democonfigS3_PRESIGNED_GET_URL. This + * function returns the length of the path without the query into + * xPathLen, which is left unused in this demo. */ + xHTTPStatus = getUrlPath( democonfigS3_PRESIGNED_GET_URL, + httpexampleS3_PRESIGNED_GET_URL_LENGTH, + &pcPath, + &xPathLen ); + + xDemoStatus = ( xHTTPStatus == HTTPSuccess ) ? pdPASS : pdFAIL; + } + + if( xDemoStatus == pdPASS ) + { + xDemoStatus = prvDownloadS3ObjectFile( &xTransportInterface, + pcPath ); + } + + /************************** Disconnect. *****************************/ + + /* Close the network connection to clean up any system resources that the + * demo may have consumed. */ + if( xIsConnectionEstablished == pdTRUE ) + { + /* Close the network connection. */ + xNetworkStatus = SecureSocketsTransport_Disconnect( &xNetworkContext ); + + if( xNetworkStatus != TRANSPORT_SOCKET_STATUS_SUCCESS ) + { + xDemoStatus = pdFAIL; + LogError( ( "SecureSocketsTransport_Disconnect() failed to close the network connection. " + "StatusCode=%d.", ( int ) xNetworkStatus ) ); + } + } + + /* Increment the demo run count. */ + xDemoRunCount++; + + if( xDemoStatus == pdPASS ) + { + LogInfo( ( "Demo iteration %lu is successful.", xDemoRunCount ) ); + } + /* Attempt to retry a failed iteration of demo for up to #httpexampleMAX_DEMO_COUNT times. */ + else if( xDemoRunCount < httpexampleMAX_DEMO_COUNT ) + { + LogWarn( ( "Demo iteration %lu failed. Retrying...", xDemoRunCount ) ); + vTaskDelay( httpexampleDELAY_BETWEEN_DEMO_ITERATIONS_TICKS ); + } + /* Failed all #httpexampleMAX_DEMO_COUNT demo iterations. */ + else + { + LogError( ( "All %d demo iterations failed.", httpexampleMAX_DEMO_COUNT ) ); + break; + } + } while( xDemoStatus != pdPASS ); + + if( xDemoStatus == pdPASS ) + { + LogInfo( ( "Demo completed successfully." ) ); + } + + return ( xDemoStatus == pdPASS ) ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/demos/coreHTTP/http_demo_s3_download_multithreaded.c b/demos/coreHTTP/http_demo_s3_download_multithreaded.c new file mode 100644 index 00000000000..23fa28c4bae --- /dev/null +++ b/demos/coreHTTP/http_demo_s3_download_multithreaded.c @@ -0,0 +1,1104 @@ +/* + * FreeRTOS V202012.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + */ + +/* + * Demo for showing use of the HTTP API using a server-authenticated network + * connection. + * + * This example, using a pre-signed URL, resolves a S3 domain, establishes a TCP + * connection, validates the server's certificate using the root CA certificate + * defined in the config header, then finally performs a TLS handshake with the + * HTTP server so that all communication is encrypted. + * + * Afterwards, two thread-safe queues are created -- a request and response + * queue -- to be shared among two tasks, the main task and the HTTP task. The + * main task adds HTTP request headers into the request queue, for the HTTP task + * to retrieve and send to the server using the HTTP Client library API. The + * HTTP task then places the server's response into the response queue, which + * the main task parses and evaluates. The requests created by the main task are + * range requests, used to download the S3 file in chunks. The main task reads + * responses from the response queue continuously until the entire file is + * received. If any request fails, an error code is returned. + * + * @note This demo requires user-generated pre-signed URLs to be pasted into + * http_s3_download_multithreaded_demo_config.h. Please use the provided script + * "presigned_urls_gen.py" (located in http_demo_helpers) to generate these + * URLs. For detailed instructions, see the accompanied README.md. + * + * @note If your file requires more than 99 range requests to S3 (depending on the + * size of the file and the length specified in democonfigRANGE_REQUEST_LENGTH), + * your connection may be dropped by S3. In this case, either increase the + * buffer size and range request length (if feasible), to reduce the number of + * requests required, or re-establish the connection with S3 after receiving a + * "Connection: close" response header. + * + * @note This demo uses retry logic to connect to the server if connection + * attempts fail. The FreeRTOS/backoffAlgorithm library is used to calculate the + * retry interval with an exponential backoff and jitter algorithm. For + * generating random number required by the algorithm, the PKCS11 module is used + * as it allows access to a True Random Number Generator (TRNG) if the vendor + * platform supports it. + * It is RECOMMENDED to seed the random number generator with a device-specific + * entropy source so that probability of collisions from devices in connection + * retries is mitigated. + */ + +/** + * @file http_demo_s3_download_multithreaded.c + * @brief Demonstrates usage of the HTTP library. + */ + +/* Standard includes. */ +#include +#include +#include +#include + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +/* Include demo config as the first non-system header. */ +#include "http_demo_s3_download_multithreaded_config.h" + +/* Include common demo header. */ +#include "aws_demo.h" + +/* Transport interface implementation include header for TLS. */ +#include "transport_secure_sockets.h" + +/* Common HTTP demo utilities. */ +#include "http_demo_utils.h" + +/* HTTP API header. */ +#include "core_http_client.h" + +/*------------- Demo configurations -------------------------*/ + +/* Check that the TLS port of the server is defined. */ +#ifndef democonfigHTTPS_PORT + #error "Please define a democonfigHTTPS_PORT in http_demo_s3_download_multithreaded_config.h." +#endif + +/* Check that the root CA certificate is defined. */ +#ifndef democonfigROOT_CA_PEM + #error "Please define a democonfigROOT_CA_PEM in http_demo_s3_download_multithreaded_config.h." +#endif + +/* Check the the queue size is defined. */ +#ifndef democonfigQUEUE_SIZE + #error "Please define a QUEUE_SIZE in http_demo_s3_download_multithreaded_config.h." +#endif + +/* The default value of the pre-signed GET URL macro. */ +#ifndef democonfigS3_PRESIGNED_GET_URL + #define democonfigS3_PRESIGNED_GET_URL "GET-URL" +#endif + +/* The default value for the timeout of the transport send and receive + * functions. */ +#ifndef democonfigTRANSPORT_SEND_RECV_TIMEOUT_MS + #define democonfigTRANSPORT_SEND_RECV_TIMEOUT_MS ( 5000 ) +#endif + +/* The default value for the size of the user buffer. */ +#ifndef democonfigUSER_BUFFER_LENGTH + #define democonfigUSER_BUFFER_LENGTH ( 2048 ) +#endif + +/* The default value for the range request length. */ +#ifndef democonfigRANGE_REQUEST_LENGTH + #define democonfigRANGE_REQUEST_LENGTH ( 1024 ) +#endif + +/* The default value for the stack size to use for HTTP tasks. */ +#ifndef httpexampleTASK_STACK_SIZE + #define httpexampleTASK_STACK_SIZE ( configMINIMAL_STACK_SIZE * 4 ) +#endif + +/** + * @brief The default value for the maximum number of times to run the loop in + * this demo. + */ +#ifndef httpexampleMAX_DEMO_COUNT + #define httpexampleMAX_DEMO_COUNT ( 3 ) +#endif + +/** + * @brief Length of the pre-signed GET URL defined in http_demo_s3_download_multithreaded_config.h. + */ +#define httpexampleS3_PRESIGNED_GET_URL_LENGTH ( sizeof( democonfigS3_PRESIGNED_GET_URL ) - 1 ) + +/** + * @brief The length of the HTTP GET method. + */ +#define httpexampleHTTP_METHOD_GET_LENGTH ( sizeof( HTTP_METHOD_GET ) - 1 ) + +/** + * @brief Field name of the HTTP range header to read from server response. + */ +#define httpexampleHTTP_CONTENT_RANGE_HEADER_FIELD "Content-Range" + +/** + * @brief Length of the HTTP range header field. + */ +#define httpexampleHTTP_CONTENT_RANGE_HEADER_FIELD_LENGTH ( sizeof( httpexampleHTTP_CONTENT_RANGE_HEADER_FIELD ) - 1 ) + +/** + * @brief The HTTP status code returned for partial content. + */ +#define httpexampleHTTP_STATUS_CODE_PARTIAL_CONTENT 206 + +/** + * @brief Time in ticks to wait between each iteration of + * RunCoreHttpS3DownloadMultithreadedDemo(). + */ +#define httpexampleDELAY_BETWEEN_DEMO_ITERATIONS_TICKS ( pdMS_TO_TICKS( 5000U ) ) + +/** + * @brief Ticks to wait for task notifications. + */ +#define httpexampleDEMO_TICKS_TO_WAIT pdMS_TO_TICKS( 1000 ) + +/** + * @brief Notification bit indicating HTTPClient_Send() error in HTTP task. + */ +#define httpexampleHTTP_SEND_ERROR ( 1U << 1 ) + +/** + * @brief The maximum number of loop iterations to wait after the last received + * server response, before declaring failure. + */ +#define httpexampleMAX_WAIT_ITERATIONS ( 10 ) + +/** + * @brief Represents the network context used for the TLS session with the + * server. + */ +static NetworkContext_t xNetworkContext; + +/** + * @brief The host address string extracted from the pre-signed URL. + * + * @note httpexampleS3_PRESIGNED_GET_URL_LENGTH is set as the array length here + * as the length of the host name string cannot exceed this value. + */ +static char cServerHost[ httpexampleS3_PRESIGNED_GET_URL_LENGTH ]; + +/** + * @brief The length of the host address found in the pre-signed URL. + */ +static size_t xServerHostLength; + +/** + * @brief Data type for the request queue. + * + * Contains the request header struct and its corresponding buffer, to be + * populated and enqueued by the main task, and read by the HTTP task. The + * buffer is included to avoid pointer inaccuracy during queue copy operations. + */ +typedef struct RequestItem +{ + HTTPRequestHeaders_t xRequestHeaders; + uint8_t ucHeaderBuffer[ democonfigUSER_BUFFER_LENGTH ]; +} RequestItem_t; + +/** + * @brief Data type for the response queue. + * + * Contains the response data type and its corresponding buffer, to be enqueued + * by the HTTP task, and interpreted by the main task. The buffer is included to + * avoid pointer inaccuracy during queue copy operations. + */ +typedef struct ResponseItem +{ + HTTPResponse_t xResponse; + uint8_t ucResponseBuffer[ democonfigUSER_BUFFER_LENGTH ]; +} ResponseItem_t; + +/** + * @brief Struct used by the main task to add requests to the request queue. + * + * This structure is modified only by the main task. Since queue operations are + * done by-copy, it is safe for the main task to modify this struct once the + * previous request has been successfully enqueued. + */ +static RequestItem_t xRequestItem = { 0 }; + +/** + * @brief Struct used by the main task to receive responses from the response + * queue. + * + * This structure is modified only by the main task. Since queue operations are + * done by-copy, it is safe for the main task to modify this struct once the + * previous response has been parsed. + */ +static ResponseItem_t xResponseItem = { 0 }; + +/** + * @brief Struct used by the HTTP task to send requests to the server. + * + * This structure is modified only by the HTTP task, and is used to receive + * requests off of the request queue and send them to the HTTP server. Since + * queue operations are done by-copy, it is safe for the HTTP task to modify + * this struct once the previous request has been sent to the server. + */ +static RequestItem_t xHTTPRequestItem = { 0 }; + +/** + * @brief Struct used by the HTTP task to receive responses from the server and + * place them on the response queue. + * + * This structure is modified only by the HTTP task. Since queue operations are + * done by-copy, it is safe for the HTTP task to modify this struct once the + * previous response has been successfully enqueued. + */ +static ResponseItem_t xHTTPResponseItem = { 0 }; + +/** + * @brief Queue for HTTP requests. Requests are written by the main task, and + * executed by the HTTP task. + */ +static QueueHandle_t xRequestQueue; + +/** + * @brief Queue for HTTP responses. Responses are written by the HTTP task, + * and read by the main task. + */ +static QueueHandle_t xResponseQueue; + +/** + * @brief Handle of prvStartHTTPTask. + */ +static TaskHandle_t xHTTPTask; + +/** + * @brief Handle for the main task. + */ +static TaskHandle_t xMainTask; + +/*-----------------------------------------------------------*/ + +/** + * @brief Connect to HTTP server with reconnection retries. + * + * @param[out] pxNetworkContext The output parameter to return the created + * network context. + * + * @return pdFAIL on failure; pdPASS on successful connection. + */ +static BaseType_t prvConnectToServer( NetworkContext_t * pxNetworkContext ); + +/** + * @brief Send continuous range requests until the entire S3 file is downloaded, + * and log the corresponding responses received from the server. + * + * @param[in] pcHost The host name of the server. + * @param[in] xHostLen The length of pcHost. + * @param[in] pcRequest The HTTP Request-URI. + * @param[in] xRequestUriLen The length of pcRequest. + * @param[in] xRequestQueue The queue to which HTTP requests should be written. + * @param[in] xResponseQueue The queue from which HTTP responses should be read. + * + * @return pdFAIL on failure; pdPASS on success. + */ +static BaseType_t prvDownloadS3ObjectFile( const char * pcHost, + const size_t xHostLen, + const char * pcRequest, + const size_t xRequestUriLen, + QueueHandle_t xRequestQueue, + QueueHandle_t xResponseQueue ); + +/** + * @brief Enqueue an HTTP GET request for a given range of the S3 file. + * + * @param[in] pxRequestInfo The #HTTPRequestInfo_t for configuring the request. + * @param[in] xRequestQueue The queue to which HTTP requests should be written. + * @param[in] xStart The position of the first byte in the range. + * @param[in] xEnd The position of the last byte in the range, inclusive. + * + * @return pdFAIL on failure; pdPASS on success. + */ +static BaseType_t prvRequestS3ObjectRange( const HTTPRequestInfo_t * pxRequestInfo, + QueueHandle_t xRequestQueue, + const size_t xStart, + const size_t xEnd ); + +/** + * @brief Check for an HTTP task notification. + * + * @param[in] pulNotification pointer holding notification value. + * @param[in] ulExpectedBits Bits to wait for. + * @param[in] xClearBits If bits should be cleared. + * + * @return `pdTRUE` if notification received, `pdFALSE` otherwise. + */ +static BaseType_t prvCheckNotification( uint32_t * pulNotification, + uint32_t ulExpectedBits, + BaseType_t xClearBits ); + +/** + * @brief Retrieve the size of the S3 object that is specified in pcPath using + * HTTP task. + * + * @param[in] pxRequestInfo The #HTTPRequestInfo_t for configuring the request. + * @param[in] xRequestQueue The queue to which HTTP requests should be written. + * @param[in] xResponseQueue The queue from which HTTP responses should be read. + * @param[out] pxFileSize - The size of the S3 object. + * + * @return pdFAIL on failure; pdPASS on success. + */ +static BaseType_t prvGetS3ObjectFileSize( const HTTPRequestInfo_t * pxRequestInfo, + QueueHandle_t xRequestQueue, + QueueHandle_t xResponseQueue, + size_t * pxFileSize ); + +/** + * @brief Services HTTP requests from the request queue and writes responses to + * the response queue. + * + * @param[in] pvArgs Parameters as passed at the time of task creation. Not used + * in this example. + * */ +static void prvStartHTTPTask( void * pvArgs ); + +/** + * @brief Clean up resources created by demo. + * + * @param[in] xHandle The HTTP task handle. + * @param[in] xRequestQueue The request queue. + * @param[in] xResponseQueue The response queue. + */ +static void prvTearDown( TaskHandle_t xHandle, + QueueHandle_t xRequestQueue, + QueueHandle_t xResponseQueue ); + +/*-----------------------------------------------------------*/ + +static BaseType_t prvConnectToServer( NetworkContext_t * pxNetworkContext ) +{ + ServerInfo_t xServerInfo = { 0 }; + SocketsConfig_t xSocketsConfig = { 0 }; + BaseType_t xStatus = pdPASS; + TransportSocketStatus_t xNetworkStatus = TRANSPORT_SOCKET_STATUS_SUCCESS; + + configASSERT( pxNetworkContext != NULL ); + + /* Initializer server information. */ + xServerInfo.pHostName = cServerHost; + xServerInfo.hostNameLength = xServerHostLength; + xServerInfo.port = democonfigHTTPS_PORT; + + /* Configure credentials for TLS server-authenticated session. */ + xSocketsConfig.enableTls = true; + xSocketsConfig.pAlpnProtos = NULL; + xSocketsConfig.maxFragmentLength = 0; + xSocketsConfig.disableSni = false; + xSocketsConfig.pRootCa = democonfigROOT_CA_PEM; + xSocketsConfig.rootCaSize = sizeof( democonfigROOT_CA_PEM ); + xSocketsConfig.sendTimeoutMs = democonfigTRANSPORT_SEND_RECV_TIMEOUT_MS; + xSocketsConfig.recvTimeoutMs = democonfigTRANSPORT_SEND_RECV_TIMEOUT_MS; + + /* Establish a TLS session with the HTTP server. This example connects + * to the server host located in democonfigPRESIGNED_GET_URL and + * democonfigHTTPS_PORT in http_s3_download_multithreaded_demo_config.h. */ + LogInfo( ( "Establishing a TLS session with %s:%d.", + cServerHost, + democonfigHTTPS_PORT ) ); + + /* Attempt to create a server-authenticated TLS connection. */ + xNetworkStatus = SecureSocketsTransport_Connect( pxNetworkContext, + &xServerInfo, + &xSocketsConfig ); + + if( xNetworkStatus != TRANSPORT_SOCKET_STATUS_SUCCESS ) + { + LogWarn( ( "Unsuccessful connection attempt, received error code:%d", + ( int ) xNetworkStatus ) ); + xStatus = pdFAIL; + } + + return xStatus; +} + +/*-----------------------------------------------------------*/ + +static BaseType_t prvDownloadS3ObjectFile( const char * pcHost, + const size_t xHostLen, + const char * pcRequest, + const size_t xRequestUriLen, + QueueHandle_t xRequestQueue, + QueueHandle_t xResponseQueue ) +{ + BaseType_t xStatus = pdPASS; + size_t xRemainingResponseCount = 0; + uint32_t ulWaitCounter = 0; + uint32_t ulNotification = 0; + + /* Configurations of the initial request headers. */ + HTTPRequestInfo_t xRequestInfo = { 0 }; + + /* The length of the file at democonfigS3_PRESIGNED_GET_URL. */ + size_t xFileSize = 0; + + /* The number of bytes we want to request within each range of the file. */ + size_t xNumReqBytes = 0; + /* The starting byte for the next range request. */ + size_t xCurByte = 0; + + configASSERT( pcHost != NULL ); + configASSERT( pcRequest != NULL ); + + /* Initialize the request object. */ + xRequestInfo.pHost = pcHost; + xRequestInfo.hostLen = xHostLen; + xRequestInfo.pMethod = HTTP_METHOD_GET; + xRequestInfo.methodLen = httpexampleHTTP_METHOD_GET_LENGTH; + xRequestInfo.pPath = pcRequest; + xRequestInfo.pathLen = xRequestUriLen; + + /* Set "Connection" HTTP header to "keep-alive" so that multiple requests + * can be sent over the same established TCP connection. This is done in + * order to download the file in parts. */ + xRequestInfo.reqFlags = HTTP_REQUEST_KEEP_ALIVE_FLAG; + + /* Get the length of the S3 file. */ + xStatus = prvGetS3ObjectFileSize( &xRequestInfo, + xRequestQueue, + xResponseQueue, + &xFileSize ); + + /* Set the number of bytes to request in each iteration, defined by the user + * in democonfigRANGE_REQUEST_LENGTH. */ + if( xFileSize < democonfigRANGE_REQUEST_LENGTH ) + { + xNumReqBytes = xFileSize; + } + else + { + xNumReqBytes = democonfigRANGE_REQUEST_LENGTH; + } + + /* Here we iterate sending byte range requests to the request queue and + * retrieving responses from the response queue until the entire file has + * been downloaded. We keep track of the next starting byte to download with + * xCurByte, and increment by xNumReqBytes after each iteration. When + * xCurByte reaches xFileSize, we stop downloading. We keep track of the + * number of responses we are waiting for with xRemainingResponseCount. + */ + while( ( xStatus != pdFAIL ) && ( xCurByte < xFileSize || xRemainingResponseCount > 0 ) ) + { + /* Send a range request for the specified bytes, if remaining. */ + if( xCurByte < xFileSize ) + { + /* Add range request to the request queue. */ + xStatus = prvRequestS3ObjectRange( &xRequestInfo, + xRequestQueue, + xCurByte, + xCurByte + xNumReqBytes - 1 ); + + /* Exit loop if the request was not successfully enqueued. */ + if( xStatus != pdPASS ) + { + break; + } + + /* Update the starting byte for the next iteration.*/ + xCurByte += xNumReqBytes; + + /* If the number of bytes left to download is less than the + * pre-defined constant xNumReqBytes, set xNumReqBytes to equal the + * accurate number of remaining bytes left to download. */ + if( ( xFileSize - xCurByte ) < xNumReqBytes ) + { + xNumReqBytes = xFileSize - xCurByte; + } + + /* If the request was successfully enqueued, we expect a + * corresponding response. */ + xRemainingResponseCount += 1; + } + + /* Retrieve response from the response queue, if available. */ + if( xRemainingResponseCount > 0 ) + { + if( xQueueReceive( xResponseQueue, &xResponseItem, httpexampleDEMO_TICKS_TO_WAIT ) != pdFAIL ) + { + /* Ensure that the buffer pointer is accurate after being copied from the queue. */ + xResponseItem.xResponse.pBuffer = xResponseItem.ucResponseBuffer; + + LogInfo( ( "The main task retrieved a server response from the response queue." ) ); + LogDebug( ( "Response Headers:\n%.*s", + ( int32_t ) xResponseItem.xResponse.headersLen, + xResponseItem.xResponse.pHeaders ) ); + LogDebug( ( "Response Status:\n%u", + xResponseItem.xResponse.statusCode ) ); + LogInfo( ( "Response Body:\n%.*s\n", + ( int32_t ) xResponseItem.xResponse.bodyLen, + xResponseItem.xResponse.pBody ) ); + + /* Check for a partial content status code (206), indicating a + * successful server response. */ + if( xResponseItem.xResponse.statusCode != httpexampleHTTP_STATUS_CODE_PARTIAL_CONTENT ) + { + LogError( ( "Received response with unexpected status code: %d", xResponseItem.xResponse.statusCode ) ); + xStatus = pdFAIL; + break; + } + + /* Reset the wait counter every time a response is received. */ + ulWaitCounter = 0; + xRemainingResponseCount -= 1; + } + /* Check for a notification from the HTTP task about an HTTP send failure. */ + else if( prvCheckNotification( &ulNotification, httpexampleHTTP_SEND_ERROR, pdTRUE ) != pdFALSE ) + { + LogError( ( "Received notification from the HTTP task indicating a HTTPClient_Send() error." ) ); + xStatus = pdFAIL; + break; + } + } + + /* Break if we have been stuck waiting for a response for too long. The + * total wait here will be the (notification check delay + queue check + * delay), multiplied by `httpexampleMAX_WAIT_ITERATIONS`. For example, + * with a 1000 ms delay for both checks, and a maximum iteration of 10, + * this function will wait 20 seconds after receiving the last response + * before exiting the loop. */ + if( ++ulWaitCounter > httpexampleMAX_WAIT_ITERATIONS ) + { + LogError( ( "Response receive loop exceeded maximum wait time.\n" ) ); + xStatus = pdFAIL; + break; + } + } + + return xStatus; +} + +/*-----------------------------------------------------------*/ + +static BaseType_t prvRequestS3ObjectRange( const HTTPRequestInfo_t * pxRequestInfo, + QueueHandle_t xRequestQueue, + const size_t xStart, + const size_t xEnd ) +{ + HTTPStatus_t xHTTPStatus = HTTPSuccess; + BaseType_t xStatus = pdPASS; + + configASSERT( pxRequestInfo != NULL ); + + /* Set the buffer used for storing request headers. */ + xRequestItem.xRequestHeaders.pBuffer = xRequestItem.ucHeaderBuffer; + xRequestItem.xRequestHeaders.bufferLen = democonfigUSER_BUFFER_LENGTH; + + xHTTPStatus = HTTPClient_InitializeRequestHeaders( &( xRequestItem.xRequestHeaders ), + pxRequestInfo ); + + if( xHTTPStatus != HTTPSuccess ) + { + LogError( ( "Failed to initialize HTTP request headers: Error=%s.", + HTTPClient_strerror( xHTTPStatus ) ) ); + xStatus = pdFAIL; + } + + if( xStatus == pdPASS ) + { + xHTTPStatus = HTTPClient_AddRangeHeader( &( xRequestItem.xRequestHeaders ), + xStart, + xEnd ); + + if( xHTTPStatus != HTTPSuccess ) + { + LogError( ( "Failed to add Range header to request headers: Error=%s.", + HTTPClient_strerror( xHTTPStatus ) ) ); + xStatus = pdFAIL; + } + } + + if( xStatus == pdPASS ) + { + /* Enqueue the request. */ + LogInfo( ( "Enqueuing request for bytes %d to %d of S3 Object. ", + ( int32_t ) xStart, + ( int32_t ) xEnd ) ); + LogDebug( ( "Request Headers:\n%.*s", + ( int32_t ) xRequestItem.xRequestHeaders.headersLen, + ( char * ) xRequestItem.xRequestHeaders.pBuffer ) ); + + xStatus = xQueueSendToBack( xRequestQueue, + &xRequestItem, + httpexampleDEMO_TICKS_TO_WAIT ); + + /* Ensure request was added to the queue. */ + if( xStatus == pdFAIL ) + { + LogError( ( "Could not enqueue request." ) ); + } + } + + return xStatus; +} + +/*-----------------------------------------------------------*/ + +static BaseType_t prvCheckNotification( uint32_t * pulNotification, + uint32_t ulExpectedBits, + BaseType_t xClearBits ) +{ + BaseType_t xStatus = pdTRUE; + + configASSERT( pulNotification != NULL ); + + xStatus = xTaskNotifyWait( 0, + ( xClearBits ) ? ulExpectedBits : 0, + pulNotification, + httpexampleDEMO_TICKS_TO_WAIT ); + + if( xStatus == pdTRUE ) + { + xStatus = ( ( *pulNotification & ulExpectedBits ) == ulExpectedBits ) ? pdTRUE : pdFALSE; + } + + return xStatus; +} + +/*-----------------------------------------------------------*/ + +static BaseType_t prvGetS3ObjectFileSize( const HTTPRequestInfo_t * pxRequestInfo, + QueueHandle_t xRequestQueue, + QueueHandle_t xResponseQueue, + size_t * pxFileSize ) +{ + BaseType_t xStatus = pdPASS; + HTTPStatus_t xHTTPStatus = HTTPSuccess; + uint32_t ulNotification = 0; + + /* The location of the file size in pcContentRangeValStr. */ + char * pcFileSizeStr = NULL; + + /* String to store the Content-Range header value. */ + char * pcContentRangeValStr = NULL; + size_t xContentRangeValStrLength = 0; + + configASSERT( pxRequestInfo != NULL ); + configASSERT( pxFileSize != NULL ); + + LogInfo( ( "Getting file object size from host..." ) ); + + /* Request bytes 0 to 0. S3 will respond with a Content-Range + * header that contains the size of the file in it. This header will look + * like: "Content-Range: bytes 0-0/FILESIZE". The body will have a single + * byte that we are ignoring. */ + xStatus = prvRequestS3ObjectRange( pxRequestInfo, + xRequestQueue, + 0, + 0 ); + + if( xStatus == pdPASS ) + { + xStatus = xQueueReceive( xResponseQueue, &xResponseItem, httpexampleDEMO_TICKS_TO_WAIT ); + } + + if( xStatus == pdPASS ) + { + /* Ensure that the buffer pointer is accurate after being copied from the queue. */ + xResponseItem.xResponse.pBuffer = xResponseItem.ucResponseBuffer; + + if( xResponseItem.xResponse.statusCode != httpexampleHTTP_STATUS_CODE_PARTIAL_CONTENT ) + { + LogError( ( "Received response with unexpected status code: %d.", xResponseItem.xResponse.statusCode ) ); + xStatus = pdFAIL; + } + else + { + xHTTPStatus = HTTPClient_ReadHeader( &xResponseItem.xResponse, + ( char * ) httpexampleHTTP_CONTENT_RANGE_HEADER_FIELD, + ( size_t ) httpexampleHTTP_CONTENT_RANGE_HEADER_FIELD_LENGTH, + ( const char ** ) &pcContentRangeValStr, + &xContentRangeValStrLength ); + + if( xHTTPStatus != HTTPSuccess ) + { + LogError( ( "Failed to read Content-Range header from HTTP response: Error=%s.", + HTTPClient_strerror( xHTTPStatus ) ) ); + xStatus = pdFAIL; + } + } + } + /* Check for a notification from the HTTP task about an HTTP send failure. */ + else if( prvCheckNotification( &ulNotification, httpexampleHTTP_SEND_ERROR, pdTRUE ) != pdFALSE ) + { + LogError( ( "Received notification from the HTTP task indicating a HTTPClient_Send() error." ) ); + } + + /* Parse the Content-Range header value to get the file size. */ + if( xStatus == pdPASS ) + { + pcFileSizeStr = strstr( pcContentRangeValStr, "/" ); + + if( pcFileSizeStr == NULL ) + { + LogError( ( "'/' not present in Content-Range header value: %s.", + pcContentRangeValStr ) ); + xStatus = pdFAIL; + } + } + + if( xStatus == pdPASS ) + { + pcFileSizeStr += sizeof( char ); + *pxFileSize = ( size_t ) strtoul( pcFileSizeStr, NULL, 10 ); + + if( ( *pxFileSize == 0 ) || ( *pxFileSize == UINT32_MAX ) ) + { + LogError( ( "Error using strtoul to get the file size from %s: xFileSize=%d.", + pcFileSizeStr, ( int32_t ) *pxFileSize ) ); + xStatus = pdFAIL; + } + } + + if( xStatus == pdPASS ) + { + LogInfo( ( "The file is %d bytes long.", ( int32_t ) *pxFileSize ) ); + } + + return xStatus; +} + +/*-----------------------------------------------------------*/ + +static void prvStartHTTPTask( void * pvArgs ) +{ + HTTPStatus_t xHTTPStatus = HTTPSuccess; + BaseType_t xStatus = pdPASS; + /* The transport layer interface used by the HTTP Client library. */ + TransportInterface_t xTransportInterface; + + ( void ) pvArgs; + + /* Define the transport interface. */ + xTransportInterface.pNetworkContext = &xNetworkContext; + xTransportInterface.send = SecureSocketsTransport_Send; + xTransportInterface.recv = SecureSocketsTransport_Recv; + + /* Initialize response struct. */ + xHTTPResponseItem.xResponse.pBuffer = xHTTPResponseItem.ucResponseBuffer; + xHTTPResponseItem.xResponse.bufferLen = democonfigUSER_BUFFER_LENGTH; + + for( ; ; ) + { + /* Read request from queue. */ + xStatus = xQueueReceive( xRequestQueue, + &xHTTPRequestItem, + httpexampleDEMO_TICKS_TO_WAIT ); + + if( xStatus == pdFAIL ) + { + LogInfo( ( "No requests in the queue. Trying again." ) ); + continue; + } + + /* Ensure that the buffer pointer is accurate after being copied from the queue. */ + xHTTPRequestItem.xRequestHeaders.pBuffer = xHTTPRequestItem.ucHeaderBuffer; + + LogInfo( ( "The HTTP task retrieved a request from the request queue." ) ); + LogDebug( ( "Request Headers:\n%.*s", + ( int32_t ) xHTTPRequestItem.xRequestHeaders.headersLen, + ( char * ) xHTTPRequestItem.xRequestHeaders.pBuffer ) ); + + xHTTPStatus = HTTPClient_Send( &xTransportInterface, + &xHTTPRequestItem.xRequestHeaders, + NULL, + 0, + &xHTTPResponseItem.xResponse, + 0 ); + + if( xHTTPStatus != HTTPSuccess ) + { + LogError( ( "Failed to send HTTP request: Error=%s.", + HTTPClient_strerror( xHTTPStatus ) ) ); + /*Notify the main task of failure. */ + xTaskNotify( xMainTask, httpexampleHTTP_SEND_ERROR, eSetBits ); + break; + } + else + { + LogInfo( ( "The HTTP task received a response from the server." ) ); + /* Write response to queue. */ + xStatus = xQueueSendToBack( xResponseQueue, + &xHTTPResponseItem, + httpexampleDEMO_TICKS_TO_WAIT ); + + /* Ensure response was added to the queue. */ + if( xStatus != pdPASS ) + { + LogError( ( "Could not enqueue response." ) ); + break; + } + } + } +} + +/*-----------------------------------------------------------*/ + +void prvTearDown( TaskHandle_t xHandle, + QueueHandle_t xRequestQueue, + QueueHandle_t xResponseQueue ) +{ + /* Delete HTTP task. */ + LogInfo( ( "Deleting HTTP task." ) ); + vTaskDelete( xHandle ); + + /* Close and delete the queues. */ + if( xRequestQueue != NULL ) + { + vQueueDelete( xRequestQueue ); + } + + if( xResponseQueue != NULL ) + { + vQueueDelete( xResponseQueue ); + } +} + +/*-----------------------------------------------------------*/ + +/** + * @brief Entry point of the demo. + * + * This example, using a pre-signed URL, resolves a S3 domain, establishes a TCP + * connection, validates the server's certificate using the root CA certificate + * defined in the config header, then finally performs a TLS handshake with the + * HTTP server so that all communication is encrypted. + * + * Afterwards, an independent HTTP task is started, to read requests from the + * request queue and execute them using the HTTP Client library API, and write + * the corresponding responses to the response queue. The main task sends + * requests to the request queue, which are used to download the S3 file in + * chunks using range requests. While doing so, the main task reads responses + * from the response queue continuously until the entire file is received. If + * any request fails, an error code is returned. + * + * @note This example is multi-threaded and uses statically allocated memory. + * + */ +int RunCoreHttpS3DownloadMultithreadedDemo( bool awsIotMqttMode, + const char * pIdentifier, + void * pNetworkServerInfo, + void * pNetworkCredentialInfo, + const IotNetworkInterface_t * pNetworkInterface ) +{ + TransportSocketStatus_t xNetworkStatus; + BaseType_t xIsConnectionEstablished = pdFALSE; + /* HTTPS Client library return status. */ + HTTPStatus_t xHTTPStatus = HTTPSuccess; + /* The location of the host address within the pre-signed URL. */ + const char * pcAddress = NULL; + /* The location of the path within the pre-signed URL. */ + const char * pcPath = NULL; + UBaseType_t uxDemoRunCount = 0UL; + + /* Upon return, pdPASS will indicate a successful demo execution. pdFAIL + * will indicate some failures occurred during execution. The user of this + * demo must check the logs for any failure codes. */ + BaseType_t xDemoStatus = pdPASS; + + /* The length of the path within the pre-signed URL. This variable is + * defined in order to store the length returned from parsing the URL, but + * it is unused. The path used for the requests in this demo needs all the + * query information following the location of the object, to the end of the + * S3 presigned URL. */ + size_t pathLen = 0; + /* The length of the Request-URI within string S3_PRESIGNED_GET_URL */ + size_t xRequestUriLen = 0; + + /* Remove compiler warnings about unused parameters. */ + ( void ) awsIotMqttMode; + ( void ) pIdentifier; + ( void ) pNetworkServerInfo; + ( void ) pNetworkCredentialInfo; + ( void ) pNetworkInterface; + + xMainTask = xTaskGetCurrentTaskHandle(); + + LogInfo( ( "HTTP Client multi-threaded S3 download demo using pre-signed URL:\n%s", democonfigS3_PRESIGNED_GET_URL ) ); + + do + { + /* Reset for each iteration of the demo. */ + xDemoStatus = pdPASS; + + /**************************** Parse Signed URL. ******************************/ + if( xDemoStatus == pdPASS ) + { + /* Retrieve the path location from democonfigS3_PRESIGNED_GET_URL. This + * function returns the length of the path without the query into + * pathLen. */ + xHTTPStatus = getUrlPath( democonfigS3_PRESIGNED_GET_URL, + httpexampleS3_PRESIGNED_GET_URL_LENGTH, + &pcPath, + &pathLen ); + + /* The path used for the requests in this demo needs + * all the query information following the location of the object, to + * the end of the S3 presigned URL. */ + xRequestUriLen = strlen( pcPath ); + + xDemoStatus = ( xHTTPStatus == HTTPSuccess ) ? pdPASS : pdFAIL; + } + + if( xDemoStatus == pdPASS ) + { + /* Retrieve the address location and length from the democonfigS3_PRESIGNED_GET_URL. */ + xHTTPStatus = getUrlAddress( democonfigS3_PRESIGNED_GET_URL, + httpexampleS3_PRESIGNED_GET_URL_LENGTH, + &pcAddress, + &xServerHostLength ); + + xDemoStatus = ( xHTTPStatus == HTTPSuccess ) ? pdPASS : pdFAIL; + } + + if( xDemoStatus == pdPASS ) + { + /* cServerHost should consist only of the host address located in + * democonfigS3_PRESIGNED_GET_URL. */ + memcpy( cServerHost, pcAddress, xServerHostLength ); + cServerHost[ xServerHostLength ] = '\0'; + } + + /**************************** Connect. ******************************/ + + /* Establish a TLS connection on top of TCP connection using OpenSSL. */ + if( xDemoStatus == pdPASS ) + { + /* Attempt to connect to the HTTP server. If connection fails, retry + * after a timeout. The timeout value will be exponentially + * increased until either the maximum number of attempts or the + * maximum timeout value is reached. The function returns pdFAIL if + * the TCP connection cannot be established with the server after + * the configured number of attempts. */ + xDemoStatus = connectToServerWithBackoffRetries( prvConnectToServer, + &xNetworkContext ); + + if( xDemoStatus == pdFAIL ) + { + /* Log an error to indicate connection failure after all + * reconnect attempts are over. */ + LogError( ( "Failed to connect to HTTP server %s.", + cServerHost ) ); + } + } + + /* Define the transport interface. */ + if( xDemoStatus == pdPASS ) + { + /* Set a flag indicating that a TLS connection exists. */ + xIsConnectionEstablished = pdTRUE; + } + + /***************** Open queues and create HTTP task. ****************/ + + /* Open request and response queues. */ + if( xDemoStatus == pdPASS ) + { + xRequestQueue = xQueueCreate( democonfigQUEUE_SIZE, + sizeof( RequestItem_t ) ); + + xResponseQueue = xQueueCreate( democonfigQUEUE_SIZE, + sizeof( ResponseItem_t ) ); + + xDemoStatus = ( ( xRequestQueue != NULL ) && ( xResponseQueue != NULL ) ) ? pdPASS : pdFAIL; + } + + /* Start HTTP task. */ + if( xDemoStatus == pdPASS ) + { + xDemoStatus = xTaskCreate( prvStartHTTPTask, "HTTPTask", httpexampleTASK_STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHTTPTask ); + } + + /******************** Download S3 Object File. **********************/ + + if( xDemoStatus == pdPASS ) + { + xDemoStatus = prvDownloadS3ObjectFile( cServerHost, + xServerHostLength, + pcPath, + xRequestUriLen, + xRequestQueue, + xResponseQueue ); + } + + /************************** Disconnect. *****************************/ + + /* Close the network connection to clean up any system resources that the + * demo may have consumed. */ + if( xIsConnectionEstablished == pdTRUE ) + { + /* Close the network connection. */ + xNetworkStatus = SecureSocketsTransport_Disconnect( &xNetworkContext ); + + if( xNetworkStatus != TRANSPORT_SOCKET_STATUS_SUCCESS ) + { + LogError( ( "SecureSocketsTransport_Disconnect() failed to close the network connection. " + "StatusCode=%d.", ( int ) xNetworkStatus ) ); + xDemoStatus = pdFAIL; + } + } + + /*********** Clean up and evaluate demo iteration status. ***********/ + + /* Close and delete the queues. */ + prvTearDown( xHTTPTask, xRequestQueue, xResponseQueue ); + + /* Increment the demo run count. */ + uxDemoRunCount++; + + if( xDemoStatus == pdPASS ) + { + LogInfo( ( "Demo iteration %lu was successful.", uxDemoRunCount ) ); + } + /* Attempt to retry a failed iteration of demo for up to #httpexampleMAX_DEMO_COUNT times. */ + else if( uxDemoRunCount < httpexampleMAX_DEMO_COUNT ) + { + LogWarn( ( "Demo iteration %lu failed. Retrying...", uxDemoRunCount ) ); + vTaskDelay( httpexampleDELAY_BETWEEN_DEMO_ITERATIONS_TICKS ); + } + /* Failed all #httpexampleMAX_DEMO_COUNT demo iterations. */ + else + { + LogError( ( "All %d demo iterations failed.", httpexampleMAX_DEMO_COUNT ) ); + break; + } + } while( xDemoStatus != pdPASS ); + + if( xDemoStatus == pdPASS ) + { + LogInfo( ( "Demo completed successfully." ) ); + } + + return ( xDemoStatus == pdPASS ) ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/demos/coreHTTP/http_demo_s3_upload.c b/demos/coreHTTP/http_demo_s3_upload.c new file mode 100644 index 00000000000..f4e7a318301 --- /dev/null +++ b/demos/coreHTTP/http_demo_s3_upload.c @@ -0,0 +1,830 @@ +/* + * FreeRTOS V202012.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + */ + +/* + * Demo for showing use of the HTTP API using a server-authenticated network + * connection. + * + * This example, using a pre-signed URL, resolves a S3 domain, establishes a TCP + * connection, validates the server's certificate using the root CA certificate + * defined in the config header, and then finally performs a TLS handshake with + * the HTTP server so that all communication is encrypted. After which, the HTTP + * Client library API is used to upload a file to a S3 bucket by sending a PUT + * request, and verify the file was uploaded using a GET request. If any request + * fails, an error code is returned. + * + * @note This demo requires user-generated pre-signed URLs to be pasted into + * http_demo_s3_upload_config. Please use the provided script + * "presigned_urls_gen.py" (located in http_demo_helpers) to generate these + * URLs. For detailed instructions, see the accompanied README.md. + * + * @note This demo uses retry logic to connect to the server if connection + * attempts fail. The FreeRTOS/backoffAlgorithm library is used to calculate the + * retry interval with an exponential backoff and jitter algorithm. For + * generating random number required by the algorithm, the PKCS11 module is used + * as it allows access to a True Random Number Generator (TRNG) if the vendor + * platform supports it. + * It is RECOMMENDED to seed the random number generator with a device-specific + * entropy source so that probability of collisions from devices in connection + * retries is mitigated. + */ + +/** + * @file http_demo_s3_upload.c + * @brief Demonstrates usage of the HTTP library. + */ + +/* Standard includes. */ +#include +#include +#include +#include +#include + +/* Include demo config as the first non-system header. */ +#include "http_demo_s3_upload_config.h" + +/* Include common demo header. */ +#include "aws_demo.h" + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Transport interface implementation include header for TLS. */ +#include "transport_secure_sockets.h" + +/* Common HTTP demo utilities. */ +#include "http_demo_utils.h" + +/* HTTP API header. */ +#include "core_http_client.h" + +/*------------- Demo configurations -------------------------*/ + +/* Check that the TLS port of the server is defined. */ +#ifndef democonfigHTTPS_PORT + #error "Please define democonfigHTTPS_PORT in http_demo_s3_upload_config.h." +#endif + +/* Check that the root CA certificate is defined. */ +#ifndef democonfigROOT_CA_PEM + #error "Please define democonfigROOT_CA_PEM in http_demo_s3_upload_config.h." +#endif + +/* Check that the pre-signed GET URL is defined. */ +#ifndef democonfigS3_PRESIGNED_GET_URL + #define democonfigS3_PRESIGNED_GET_URL "GET-URL" +#endif + +/* Check that the pre-signed PUT URL is defined. */ +#ifndef democonfigS3_PRESIGNED_PUT_URL + #define democonfigS3_PRESIGNED_PUT_URL "PUT-URL" +#endif + +/* Check that a transport timeout for transport send and receive functions is + * defined. */ +#ifndef democonfigTRANSPORT_SEND_RECV_TIMEOUT_MS + #define democonfigTRANSPORT_SEND_RECV_TIMEOUT_MS ( 5000 ) +#endif + +/* Check that the size of the user buffer is defined. */ +#ifndef democonfigUSER_BUFFER_LENGTH + #define democonfigUSER_BUFFER_LENGTH ( 4096 ) +#endif + +/* Pointer to the data to upload.*/ +#ifndef democonfigDEMO_HTTP_UPLOAD_DATA + #define democonfigDEMO_HTTP_UPLOAD_DATA "Hello World!" +#endif + +/** + * @brief Length of the pre-signed GET URL defined in http_demo_s3_upload_config.h. + */ +#define httpexampleS3_PRESIGNED_GET_URL_LENGTH ( sizeof( democonfigS3_PRESIGNED_GET_URL ) - 1 ) + +/** + * @brief Length of the pre-signed PUT URL defined in http_demo_s3_upload_config.h. + */ +#define httpexampleS3_PRESIGNED_PUT_URL_LENGTH ( sizeof( democonfigS3_PRESIGNED_PUT_URL ) - 1 ) + +/** + * @brief The length of the HTTP GET method. + */ +#define httpexampleHTTP_METHOD_GET_LENGTH ( sizeof( HTTP_METHOD_GET ) - 1 ) + +/** + * @brief The length of the HTTP PUT method. + */ +#define httpexampleHTTP_METHOD_PUT_LENGTH ( sizeof( HTTP_METHOD_PUT ) - 1 ) + +/** + * @brief Field name of the HTTP range header to read from server response. + */ +#define httpexampleHTTP_CONTENT_RANGE_HEADER_FIELD "Content-Range" + +/** + * @brief Length of the HTTP range header field. + */ +#define httpexampleHTTP_CONTENT_RANGE_HEADER_FIELD_LENGTH ( sizeof( httpexampleHTTP_CONTENT_RANGE_HEADER_FIELD ) - 1 ) + +/** + * @brief The length of the data in bytes to upload. + */ +#define httpexampleDEMO_HTTP_UPLOAD_DATA_LENGTH ( sizeof( democonfigDEMO_HTTP_UPLOAD_DATA ) - 1 ) + +/** + * @brief The HTTP status code returned for partial content. + */ +#define httpexampleHTTP_STATUS_CODE_PARTIAL_CONTENT 206 + +/** + * @brief The HTTP status code returned for a successful request. + */ +#define httpexampleHTTP_STATUS_CODE_SUCCESSFUL_REQUEST 200 + +/** + * @brief The maximum number of times to run the loop in this demo. + */ +#ifndef httpexampleMAX_DEMO_COUNT + #define httpexampleMAX_DEMO_COUNT ( 3 ) +#endif + +/** + * @brief Time in ticks to wait between each cycle of the demo implemented + * by RunCoreHttpS3UploadDemo(). + */ +#define httpexampleDELAY_BETWEEN_DEMO_ITERATIONS_TICKS ( pdMS_TO_TICKS( 5000U ) ) + +/** + * @brief A buffer used in the demo for storing HTTP request headers, and HTTP + * response headers and body. + * + * @note This demo shows how the same buffer can be re-used for storing the HTTP + * response after the HTTP request is sent out. However, the user can decide how + * to use buffers to store HTTP requests and responses. + */ +static uint8_t ucUserBuffer[ democonfigUSER_BUFFER_LENGTH ]; + +/** + * @brief Represents header data that will be sent in an HTTP request. + */ +static HTTPRequestHeaders_t xRequestHeaders; + +/** + * @brief Configurations of the initial request headers that are passed to + * #HTTPClient_InitializeRequestHeaders. + */ +static HTTPRequestInfo_t xRequestInfo; + +/** + * @brief Represents a response returned from an HTTP server. + */ +static HTTPResponse_t xResponse; + +/** + * @brief The host address string extracted from the pre-signed URL. + * + * @note httpexampleS3_PRESIGNED_PUT_URL_LENGTH is set as the array length here + * as the length of the host name string cannot exceed this value. + */ +static char cServerHost[ httpexampleS3_PRESIGNED_PUT_URL_LENGTH ]; + +/** + * @brief The length of the host address found in the pre-signed URL. + */ +static size_t xServerHostLength; + +/** + * @brief The location of the path within the pre-signed URL. + */ +static const char * pcPath; + +/*-----------------------------------------------------------*/ + +/** + * @brief Connect to HTTP server with reconnection retries. + * + * @param[out] pxNetworkContext The output parameter to return the created + * network context. + * + * @return pdFAIL on failure; pdPASS on successful connection. + */ +static BaseType_t prvConnectToServer( NetworkContext_t * pxNetworkContext ); + +/** + * @brief Retrieve the size of the S3 object that is specified in pcPath. + * + * @param[out] pxFileSize The size of the S3 object. + * @param[in] pxTransportInterface The transport interface for making network + * calls. + * @param[in] pcHost The server host address. This string must be + * null-terminated. + * @param[in] xHostLen The length of the server host address. + * @param[in] pcPath The Request-URI to the objects of interest. This string + * should be null-terminated. + * + * @return The status of the file size acquisition using a GET request to the + * server: pdPASS on success, pdFAIL on failure. + */ +static BaseType_t prvGetS3ObjectFileSize( size_t * pxFileSize, + const TransportInterface_t * pxTransportInterface, + const char * pcHost, + size_t xHostLen, + const char * pcPath ); + +/** + * @brief Send an HTTP PUT request based on a specified path to upload a file, + * then print the response received from the server. + * + * @param[in] pxTransportInterface The transport interface for making network + * calls. + * @param[in] pcPath The Request-URI to the objects of interest. This string must + * be null-terminated. + * + * @return The status of the file upload using a PUT request to the server: pdPASS + * on success, pdFAIL on failure. + */ +static BaseType_t prvUploadS3ObjectFile( const TransportInterface_t * pxTransportInterface, + const char * pcPath ); + +/** + * @brief Retrieve and verify the size of the S3 object that is specified in + * pcPath. + * + * @param[in] pxTransportInterface The transport interface for making network + * calls. + * @param[in] pcPath The Request-URI to the objects of interest. This string must + * be null-terminated. + * + * @return The status of the file size acquisition and verification using a GET + * request to the server: pdPASS on success, pdFAIL on failure. + */ +static BaseType_t prvVerifyS3ObjectFileSize( const TransportInterface_t * pxTransportInterface, + const char * pcPath ); + +/*-----------------------------------------------------------*/ + +static BaseType_t prvConnectToServer( NetworkContext_t * pxNetworkContext ) +{ + ServerInfo_t xServerInfo = { 0 }; + SocketsConfig_t xSocketsConfig = { 0 }; + BaseType_t xStatus = pdPASS; + TransportSocketStatus_t xNetworkStatus = TRANSPORT_SOCKET_STATUS_SUCCESS; + HTTPStatus_t xHTTPStatus = HTTPSuccess; + + /* The location of the host address within the pre-signed URL. */ + const char * pcAddress = NULL; + + /* Retrieve the address location and length from democonfigS3_PRESIGNED_PUT_URL. */ + xHTTPStatus = getUrlAddress( democonfigS3_PRESIGNED_PUT_URL, + httpexampleS3_PRESIGNED_GET_URL_LENGTH, + &pcAddress, + &xServerHostLength ); + + xStatus = ( xHTTPStatus == HTTPSuccess ) ? pdPASS : pdFAIL; + + if( xStatus == pdPASS ) + { + /* cServerHost should consist only of the host address located in + * democonfigS3_PRESIGNED_PUT_URL. */ + memcpy( cServerHost, pcAddress, xServerHostLength ); + cServerHost[ xServerHostLength ] = '\0'; + + /* Initializer server information. */ + xServerInfo.pHostName = cServerHost; + xServerInfo.hostNameLength = xServerHostLength; + xServerInfo.port = democonfigHTTPS_PORT; + + /* Configure credentials for TLS server-authenticated session. */ + xSocketsConfig.enableTls = true; + xSocketsConfig.pAlpnProtos = NULL; + xSocketsConfig.maxFragmentLength = 0; + xSocketsConfig.disableSni = false; + xSocketsConfig.pRootCa = democonfigROOT_CA_PEM; + xSocketsConfig.rootCaSize = sizeof( democonfigROOT_CA_PEM ); + xSocketsConfig.sendTimeoutMs = democonfigTRANSPORT_SEND_RECV_TIMEOUT_MS; + xSocketsConfig.recvTimeoutMs = democonfigTRANSPORT_SEND_RECV_TIMEOUT_MS; + + /* Establish a TLS session with the HTTP server. This example connects + * to the server host located in democonfigPRESIGNED_GET_URL and + * democonfigHTTPS_PORT in http_demo_s3_upload_config.h. */ + LogInfo( ( "Establishing a TLS session with %s:%d.", + cServerHost, + democonfigHTTPS_PORT ) ); + + /* Attempt to create a server-authenticated TLS connection. */ + xNetworkStatus = SecureSocketsTransport_Connect( pxNetworkContext, + &xServerInfo, + &xSocketsConfig ); + + if( xNetworkStatus != TRANSPORT_SOCKET_STATUS_SUCCESS ) + { + xStatus = pdFAIL; + } + } + + return xStatus; +} + +/*-----------------------------------------------------------*/ + +static BaseType_t prvGetS3ObjectFileSize( size_t * pxFileSize, + const TransportInterface_t * pxTransportInterface, + const char * pcHost, + size_t xHostLen, + const char * pcPath ) +{ + BaseType_t xStatus = pdPASS; + HTTPStatus_t xHTTPStatus = HTTPSuccess; + + /* The location of the file size in pcContentRangeValStr. */ + char * pcFileSizeStr = NULL; + + /* String to store the Content-Range header value. */ + char * pcContentRangeValStr = NULL; + size_t xContentRangeValStrLength = 0; + + configASSERT( pxFileSize != NULL ); + configASSERT( pcHost != NULL ); + configASSERT( pcPath != NULL ); + + /* Initialize all HTTP Client library API structs to 0. */ + ( void ) memset( &xRequestHeaders, 0, sizeof( xRequestHeaders ) ); + ( void ) memset( &xRequestInfo, 0, sizeof( xRequestInfo ) ); + ( void ) memset( &xResponse, 0, sizeof( xResponse ) ); + + /* Initialize the request object. */ + xRequestInfo.pHost = pcHost; + xRequestInfo.hostLen = xHostLen; + xRequestInfo.pMethod = HTTP_METHOD_GET; + xRequestInfo.methodLen = sizeof( HTTP_METHOD_GET ) - 1; + xRequestInfo.pPath = pcPath; + xRequestInfo.pathLen = strlen( pcPath ); + + /* Set "Connection" HTTP header to "keep-alive" so that multiple requests + * can be sent over the same established TCP connection. This is done in + * order to download the file in parts. */ + xRequestInfo.reqFlags = HTTP_REQUEST_KEEP_ALIVE_FLAG; + + /* Set the buffer used for storing request headers. */ + xRequestHeaders.pBuffer = ucUserBuffer; + xRequestHeaders.bufferLen = democonfigUSER_BUFFER_LENGTH; + + /* Initialize the response object. The same buffer used for storing request + * headers is reused here. */ + xResponse.pBuffer = ucUserBuffer; + xResponse.bufferLen = democonfigUSER_BUFFER_LENGTH; + + LogInfo( ( "Getting file object size from host..." ) ); + + xHTTPStatus = HTTPClient_InitializeRequestHeaders( &xRequestHeaders, + &xRequestInfo ); + + if( xHTTPStatus != HTTPSuccess ) + { + LogError( ( "Failed to initialize HTTP request headers: Error=%s.", + HTTPClient_strerror( xHTTPStatus ) ) ); + xStatus = pdFAIL; + } + + if( xStatus == pdPASS ) + { + /* Add the header to get bytes=0-0. S3 will respond with a Content-Range + * header that contains the size of the file in it. This header will + * look like: "Content-Range: bytes 0-0/FILESIZE". The body will have a + * single byte that we are ignoring. */ + xHTTPStatus = HTTPClient_AddRangeHeader( &xRequestHeaders, 0, 0 ); + + if( xHTTPStatus != HTTPSuccess ) + { + LogError( ( "Failed to add range header to request headers: Error=%s.", + HTTPClient_strerror( xHTTPStatus ) ) ); + xStatus = pdFAIL; + } + } + + if( xStatus == pdPASS ) + { + /* Send the request and receive the response. */ + xHTTPStatus = HTTPClient_Send( pxTransportInterface, + &xRequestHeaders, + NULL, + 0, + &xResponse, + 0 ); + + if( xHTTPStatus != HTTPSuccess ) + { + LogError( ( "Failed to send HTTP GET request to %s%s: Error=%s.", + pcHost, pcPath, HTTPClient_strerror( xHTTPStatus ) ) ); + xStatus = pdFAIL; + } + } + + if( xStatus == pdPASS ) + { + LogDebug( ( "Received HTTP response from %s%s...", + pcHost, pcPath ) ); + LogDebug( ( "Response Headers:\n%.*s", + ( int32_t ) xResponse.headersLen, + xResponse.pHeaders ) ); + LogDebug( ( "Response Body:\n%.*s\n", + ( int32_t ) xResponse.bodyLen, + xResponse.pBody ) ); + + if( xResponse.statusCode != httpexampleHTTP_STATUS_CODE_PARTIAL_CONTENT ) + { + LogError( ( "Received an invalid response from the server " + "(Status Code: %u).", + xResponse.statusCode ) ); + xStatus = pdFAIL; + } + } + + if( xStatus == pdPASS ) + { + LogInfo( ( "Received successful response from server " + "(Status Code: %u).", + xResponse.statusCode ) ); + + xHTTPStatus = HTTPClient_ReadHeader( &xResponse, + ( char * ) httpexampleHTTP_CONTENT_RANGE_HEADER_FIELD, + ( size_t ) httpexampleHTTP_CONTENT_RANGE_HEADER_FIELD_LENGTH, + ( const char ** ) &pcContentRangeValStr, + &xContentRangeValStrLength ); + + if( xHTTPStatus != HTTPSuccess ) + { + LogError( ( "Failed to read Content-Range header from HTTP response: Error=%s.", + HTTPClient_strerror( xHTTPStatus ) ) ); + xStatus = pdFAIL; + } + } + + /* Parse the Content-Range header value to get the file size. */ + if( xStatus == pdPASS ) + { + pcFileSizeStr = strstr( pcContentRangeValStr, "/" ); + + if( pcFileSizeStr == NULL ) + { + LogError( ( "'/' not present in Content-Range header value: %s.", + pcContentRangeValStr ) ); + xStatus = pdFAIL; + } + } + + if( xStatus == pdPASS ) + { + pcFileSizeStr += sizeof( char ); + *pxFileSize = ( size_t ) strtoul( pcFileSizeStr, NULL, 10 ); + + if( ( *pxFileSize == 0 ) || ( *pxFileSize == UINT32_MAX ) ) + { + LogError( ( "Error using strtoul to get the file size from %s: xFileSize=%d.", + pcFileSizeStr, ( int32_t ) *pxFileSize ) ); + xStatus = pdFAIL; + } + } + + if( xStatus == pdPASS ) + { + LogInfo( ( "The file is %d bytes long.", ( int32_t ) *pxFileSize ) ); + } + + return xStatus; +} + +/*-----------------------------------------------------------*/ + +static BaseType_t prvUploadS3ObjectFile( const TransportInterface_t * pxTransportInterface, + const char * pcPath ) +{ + BaseType_t xStatus = pdFAIL; + HTTPStatus_t xHTTPStatus = HTTPSuccess; + + configASSERT( pcPath != NULL ); + + /* Initialize all HTTP Client library API structs to 0. */ + ( void ) memset( &xRequestHeaders, 0, sizeof( xRequestHeaders ) ); + ( void ) memset( &xRequestInfo, 0, sizeof( xRequestInfo ) ); + ( void ) memset( &xResponse, 0, sizeof( xResponse ) ); + + /* Initialize the request object. */ + xRequestInfo.pHost = cServerHost; + xRequestInfo.hostLen = xServerHostLength; + xRequestInfo.pMethod = HTTP_METHOD_PUT; + xRequestInfo.methodLen = httpexampleHTTP_METHOD_PUT_LENGTH; + xRequestInfo.pPath = pcPath; + xRequestInfo.pathLen = strlen( pcPath ); + + /* Set "Connection" HTTP header to "keep-alive" so that multiple requests + * can be sent over the same established TCP connection. */ + xRequestInfo.reqFlags = HTTP_REQUEST_KEEP_ALIVE_FLAG; + + /* Set the buffer used for storing request headers. */ + xRequestHeaders.pBuffer = ucUserBuffer; + xRequestHeaders.bufferLen = democonfigUSER_BUFFER_LENGTH; + + /* Initialize the response object. The same buffer used for storing request + * headers is reused here. */ + xResponse.pBuffer = ucUserBuffer; + xResponse.bufferLen = democonfigUSER_BUFFER_LENGTH; + + if( xHTTPStatus == HTTPSuccess ) + { + xHTTPStatus = HTTPClient_InitializeRequestHeaders( &xRequestHeaders, + &xRequestInfo ); + } + + if( xHTTPStatus == HTTPSuccess ) + { + LogInfo( ( "Uploading file..." ) ); + LogDebug( ( "Request Headers:\n%.*s", + ( int32_t ) xRequestHeaders.headersLen, + ( char * ) xRequestHeaders.pBuffer ) ); + xHTTPStatus = HTTPClient_Send( pxTransportInterface, + &xRequestHeaders, + ( const uint8_t * ) democonfigDEMO_HTTP_UPLOAD_DATA, + httpexampleDEMO_HTTP_UPLOAD_DATA_LENGTH, + &xResponse, + 0 ); + } + else + { + LogError( ( "Failed to initialize HTTP request headers: Error=%s.", + HTTPClient_strerror( xHTTPStatus ) ) ); + } + + if( xHTTPStatus == HTTPSuccess ) + { + LogDebug( ( "Received HTTP response from %s%s...", + cServerHost, pcPath ) ); + LogDebug( ( "Response Headers:\n%.*s", + ( int32_t ) xResponse.headersLen, + xResponse.pHeaders ) ); + LogDebug( ( "Response Body:\n%.*s\n", + ( int32_t ) xResponse.bodyLen, + xResponse.pBody ) ); + + xStatus = ( xResponse.statusCode == httpexampleHTTP_STATUS_CODE_SUCCESSFUL_REQUEST ) ? pdPASS : pdFAIL; + } + else + { + LogError( ( "An error occurred in uploading the file." + "Failed to send HTTP PUT request to %s%s: Error=%s.", + cServerHost, pcPath, HTTPClient_strerror( xHTTPStatus ) ) ); + } + + if( xStatus == pdPASS ) + { + LogInfo( ( "Received successful response from server " + "(Status Code: %u).", + xResponse.statusCode ) ); + } + else + { + LogError( ( "Received an invalid response from the server " + "(Status Code: %u).", + xResponse.statusCode ) ); + } + + return( ( xStatus == pdPASS ) && ( xHTTPStatus == HTTPSuccess ) ); +} + +/*-----------------------------------------------------------*/ + +static BaseType_t prvVerifyS3ObjectFileSize( const TransportInterface_t * pxTransportInterface, + const char * pcPath ) +{ + BaseType_t xStatus = pdFAIL; + /* The size of the file uploaded to S3. */ + size_t xFileSize = 0; + + /* Retrieve the file size. */ + xStatus = prvGetS3ObjectFileSize( &xFileSize, + pxTransportInterface, + cServerHost, + xServerHostLength, + pcPath ); + + if( xStatus == pdPASS ) + { + if( xFileSize != httpexampleDEMO_HTTP_UPLOAD_DATA_LENGTH ) + { + LogError( ( "Failed to upload the data to S3. The file size found is %d, but it should be %d.", + ( int32_t ) xFileSize, + ( int32_t ) httpexampleDEMO_HTTP_UPLOAD_DATA_LENGTH ) ); + } + else + { + LogInfo( ( "Successfully verified that the size of the file found on S3 matches the file size uploaded " + "(Uploaded: %d bytes, Found: %d bytes).", + ( int32_t ) httpexampleDEMO_HTTP_UPLOAD_DATA_LENGTH, + ( int32_t ) xFileSize ) ); + } + } + + return xStatus; +} + +/*-----------------------------------------------------------*/ + +/** + * @brief Entry point of the demo. + * + * This example, using a pre-signed URL, resolves a S3 domain, establishes a TCP + * connection, validates the server's certificate using the root CA certificate + * defined in the config header, and then finally performs a TLS handshake with + * the HTTP server so that all communication is encrypted. After which, the HTTP + * Client library API is used to upload a file to a S3 bucket by sending a PUT + * request, and verify the file was uploaded using a GET request. If any request + * fails, an error code is returned. + * + * @note This example is single-threaded and uses statically allocated memory. + * + */ + +int RunCoreHttpS3UploadDemo( bool awsIotMqttMode, + const char * pIdentifier, + void * pNetworkServerInfo, + void * pNetworkCredentialInfo, + const IotNetworkInterface_t * pNetworkInterface ) +{ + /* The transport layer interface used by the HTTP Client library. */ + TransportInterface_t xTransportInterface; + /* The network context for the transport layer interface. */ + NetworkContext_t xNetworkContext = { 0 }; + TransportSocketStatus_t xNetworkStatus; + BaseType_t xIsConnectionEstablished = pdFALSE; + /* HTTPS Client library return status. */ + HTTPStatus_t xHTTPStatus = HTTPSuccess; + BaseType_t xDemoRunCount = 0UL; + + /* Upon return, pdPASS will indicate a successful demo execution. + * pdFAIL will indicate some failures occurred during execution. The + * user of this demo must check the logs for any failure codes. */ + BaseType_t xDemoStatus = pdPASS; + + /* Remove compiler warnings about unused parameters. */ + ( void ) awsIotMqttMode; + ( void ) pIdentifier; + ( void ) pNetworkServerInfo; + ( void ) pNetworkCredentialInfo; + ( void ) pNetworkInterface; + + /* The length of the path within the pre-signed URL. This variable is + * defined in order to store the length returned from parsing the URL, but + * it is unused. The path used for the requests in this demo needs all the + * query information following the location of the object, to the end of the + * S3 presigned URL. */ + size_t xPathLen = 0; + + LogInfo( ( "HTTP Client Synchronous S3 upload demo using pre-signed URL:\n%s", + democonfigS3_PRESIGNED_PUT_URL ) ); + + do + { + /**************************** Connect. ******************************/ + + /* Establish TLS connection on top of TCP connection using Secure Sockets. */ + + /* Attempt to connect to S3. If connection fails, retry after a timeout. + * The timeout value will be exponentially increased until either the + * maximum number of attempts or the maximum timeout value is reached. + * The function returns pdFAIL if a TCP connection with the server + * cannot be established after the configured number of attempts. */ + xDemoStatus = connectToServerWithBackoffRetries( prvConnectToServer, + &xNetworkContext ); + + if( xDemoStatus == pdFAIL ) + { + /* Log an error to indicate connection failure after all + * reconnect attempts are over. */ + LogError( ( "Failed to connect to HTTP server %s.", + cServerHost ) ); + } + + /* Define the transport interface. */ + if( xDemoStatus == pdPASS ) + { + /* Set a flag indicating that a TLS connection exists. */ + xIsConnectionEstablished = pdTRUE; + + /* Define the transport interface. */ + xTransportInterface.pNetworkContext = &xNetworkContext; + xTransportInterface.send = SecureSocketsTransport_Send; + xTransportInterface.recv = SecureSocketsTransport_Recv; + } + + /********************** Upload S3 Object File. **********************/ + + if( xDemoStatus == pdPASS ) + { + /* Retrieve the path location from democonfigS3_PRESIGNED_PUT_URL. This + * function returns the length of the path without the query into + * xPathLen, which is left unused in this demo. */ + xHTTPStatus = getUrlPath( democonfigS3_PRESIGNED_PUT_URL, + httpexampleS3_PRESIGNED_PUT_URL_LENGTH, + &pcPath, + &xPathLen ); + + xDemoStatus = ( xHTTPStatus == HTTPSuccess ) ? pdPASS : pdFAIL; + } + + if( xDemoStatus == pdPASS ) + { + xDemoStatus = prvUploadS3ObjectFile( &xTransportInterface, + pcPath ); + } + + /******************* Verify S3 Object File Upload. ********************/ + + if( xDemoStatus == pdPASS ) + { + /* Retrieve the path location from democonfigS3_PRESIGNED_GET_URL. This + * function returns the length of the path without the query into + * xPathLen. */ + xHTTPStatus = getUrlPath( democonfigS3_PRESIGNED_GET_URL, + httpexampleS3_PRESIGNED_GET_URL_LENGTH, + &pcPath, + &xPathLen ); + + xDemoStatus = ( xHTTPStatus == HTTPSuccess ) ? pdPASS : pdFAIL; + } + + if( xDemoStatus == pdPASS ) + { + /* Verify the file exists by retrieving the file size. */ + xDemoStatus = prvVerifyS3ObjectFileSize( &xTransportInterface, + pcPath ); + } + + /************************** Disconnect. *****************************/ + + /* Close the network connection to clean up any system resources that the + * demo may have consumed. */ + if( xIsConnectionEstablished == pdTRUE ) + { + /* Close the network connection. */ + xNetworkStatus = SecureSocketsTransport_Disconnect( &xNetworkContext ); + + if( xNetworkStatus != TRANSPORT_SOCKET_STATUS_SUCCESS ) + { + xDemoStatus = pdFAIL; + LogError( ( "SecureSocketsTransport_Disconnect() failed to close the network connection. " + "StatusCode=%d.", ( int ) xNetworkStatus ) ); + } + } + + /* Increment the demo run count. */ + xDemoRunCount++; + + if( xDemoStatus == pdPASS ) + { + LogInfo( ( "Demo iteration %lu is successful.", xDemoRunCount ) ); + } + /* Attempt to retry a failed iteration of demo for up to #httpexampleMAX_DEMO_COUNT times. */ + else if( xDemoRunCount < httpexampleMAX_DEMO_COUNT ) + { + LogWarn( ( "Demo iteration %lu failed. Retrying...", xDemoRunCount ) ); + vTaskDelay( httpexampleDELAY_BETWEEN_DEMO_ITERATIONS_TICKS ); + } + /* Failed all #httpexampleMAX_DEMO_COUNT demo iterations. */ + else + { + LogError( ( "All %d demo iterations failed.", httpexampleMAX_DEMO_COUNT ) ); + break; + } + } while( xDemoStatus != pdPASS ); + + if( xDemoStatus == pdPASS ) + { + LogInfo( ( "Demo completed successfully." ) ); + } + + return ( xDemoStatus == pdPASS ) ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/demos/coreMQTT/CMakeLists.txt b/demos/coreMQTT/CMakeLists.txt index e1c5062b54f..eb4fe5dd7b7 100755 --- a/demos/coreMQTT/CMakeLists.txt +++ b/demos/coreMQTT/CMakeLists.txt @@ -6,25 +6,26 @@ afr_set_demo_metadata(ID "CORE_MQTT_MUTUAL_AUTH_DEMO") afr_set_demo_metadata(DESCRIPTION "Examples that demonstrate the MQTT library") afr_set_demo_metadata(DISPLAY_NAME "coreMQTT Demos") +# Add the CMakeLists.txt file of module to metadata list. +afr_module_cmake_files(${AFR_CURRENT_MODULE} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt +) + afr_module_sources( ${AFR_CURRENT_MODULE} INTERFACE "${CMAKE_CURRENT_LIST_DIR}/mqtt_demo_mutual_auth.c" "${CMAKE_CURRENT_LIST_DIR}/mqtt_demo_connection_sharing.c" - # As the containing directory name (coreMQTT) does not match the - # module name (core_mqtt), we add dependency on the CMake file so - # that metadata is generated for it, and it is present in code - # downloaded from the FreeRTOS console. - ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt ) afr_module_dependencies( ${AFR_CURRENT_MODULE} INTERFACE AFR::core_mqtt - AFR::retry_utils + AFR::backoff_algorithm AFR::transport_interface_secure_sockets AFR::secure_sockets + AFR::pkcs11_helpers # Add dependency on the core_mqtt_demo_dependencies metadata module # so that FreeRTOS console shows this demo ONLY when the core MQTT library # (or another library depending on coreMQTT) is selected on the console. diff --git a/demos/coreMQTT/mqtt_demo_connection_sharing.c b/demos/coreMQTT/mqtt_demo_connection_sharing.c index 6eb7bb07178..af318c6d3ad 100644 --- a/demos/coreMQTT/mqtt_demo_connection_sharing.c +++ b/demos/coreMQTT/mqtt_demo_connection_sharing.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -68,7 +68,10 @@ #include "core_mqtt_state.h" /* Retry utilities include. */ -#include "retry_utils.h" +#include "backoff_algorithm.h" + +/* Include PKCS11 helpers header. */ +#include "pkcs11_helpers.h" /* Transport interface implementation include header for TLS. */ #include "transport_secure_sockets.h" @@ -122,12 +125,30 @@ /** * @brief Length of client identifier. */ -#define democonfigCLIENT_IDENTIFIER_LENGTH ( ( uint16_t ) ( sizeof( democonfigCLIENT_IDENTIFIER ) - 1 ) ) +#define democonfigCLIENT_IDENTIFIER_LENGTH ( ( uint16_t ) ( sizeof( democonfigCLIENT_IDENTIFIER ) - 1 ) ) /** * @brief Length of MQTT server host name. */ -#define democonfigBROKER_ENDPOINT_LENGTH ( ( uint16_t ) ( sizeof( democonfigMQTT_BROKER_ENDPOINT ) - 1 ) ) +#define democonfigBROKER_ENDPOINT_LENGTH ( ( uint16_t ) ( sizeof( democonfigMQTT_BROKER_ENDPOINT ) - 1 ) ) + +/** + * @brief The maximum number of retries for network operation with server. + */ +#define RETRY_MAX_ATTEMPTS ( 5U ) + +/** + * @brief The maximum back-off delay (in milliseconds) for retrying failed operation + * with server. + */ +#define RETRY_MAX_BACKOFF_DELAY_MS ( 5000U ) + +/** + * @brief The base back-off delay (in milliseconds) to use for network operation retry + * attempts. + */ +#define RETRY_BACKOFF_BASE_MS ( 500U ) + /** * @brief Timeout for receiving CONNACK packet in milliseconds. @@ -417,6 +438,29 @@ static MQTTStatus_t prvMQTTConnect( MQTTContext_t * pxMQTTContext, */ static MQTTStatus_t prvResumeSession( bool xSessionPresent ); +/** + * @brief Calculate and perform an exponential backoff with jitter delay for + * the next retry attempt of a failed network operation with the server. + * + * The function generates a random number, calculates the next backoff period + * with the generated random number, and performs the backoff delay operation if the + * number of retries have not exhausted. + * + * @note The PKCS11 module is used to generate the random number as it allows access + * to a True Random Number Generator (TRNG) if the vendor platform supports it. + * It is recommended to seed the random number generator with a device-specific entropy + * source so that probability of collisions from devices in connection retries is mitigated. + * + * @note The backoff period is calculated using the backoffAlgorithm library. + * + * @param[in, out] pxRetryAttempts The context to use for backoff period calculation + * with the backoffAlgorithm library. + * + * @return pdPASS if calculating the backoff period was successful; otherwise pdFAIL + * if there was failure in random number generation OR all retry attempts had exhausted. + */ +static BaseType_t prvBackoffForRetry( BackoffAlgorithmContext_t * pxRetryParams ); + /** * @brief Form a TCP connection to a server. * @@ -917,11 +961,61 @@ static MQTTStatus_t prvResumeSession( bool xSessionPresent ) /*-----------------------------------------------------------*/ +static BaseType_t prvBackoffForRetry( BackoffAlgorithmContext_t * pxRetryParams ) +{ + BaseType_t xReturnStatus = pdFAIL; + uint16_t usNextRetryBackOff = 0U; + BackoffAlgorithmStatus_t xBackoffAlgStatus = BackoffAlgorithmSuccess; + + /** + * To calculate the backoff period for the next retry attempt, we will + * generate a random number to provide to the backoffAlgorithm library. + * + * Note: The PKCS11 module is used to generate the random number as it allows access + * to a True Random Number Generator (TRNG) if the vendor platform supports it. + * It is recommended to use a random number generator seeded with a device-specific + * entropy source so that probability of collisions from devices in connection retries + * is mitigated. + */ + uint32_t ulRandomNum = 0; + + if( xPkcs11GenerateRandomNumber( ( uint8_t * ) &ulRandomNum, + sizeof( ulRandomNum ) ) == pdPASS ) + { + /* Get back-off value (in milliseconds) for the next retry attempt. */ + xBackoffAlgStatus = BackoffAlgorithm_GetNextBackoff( pxRetryParams, ulRandomNum, &usNextRetryBackOff ); + + if( xBackoffAlgStatus == BackoffAlgorithmRetriesExhausted ) + { + LogError( ( "All retry attempts have exhausted. Operation will not be retried" ) ); + } + else if( xBackoffAlgStatus == BackoffAlgorithmSuccess ) + { + /* Perform the backoff delay. */ + vTaskDelay( pdMS_TO_TICKS( usNextRetryBackOff ) ); + + xReturnStatus = pdPASS; + + LogInfo( ( "Retry attempt %lu out of maximum retry attempts %lu.", + ( pxRetryParams->attemptsDone + 1 ), + pxRetryParams->maxRetryAttempts ) ); + } + } + else + { + LogError( ( "Unable to retry operation with broker: Random number generation failed" ) ); + } + + return xReturnStatus; +} + +/*-----------------------------------------------------------*/ + static BaseType_t prvSocketConnect( NetworkContext_t * pxNetworkContext ) { BaseType_t xConnected = pdFAIL; - RetryUtilsStatus_t xRetryUtilsStatus = RetryUtilsSuccess; - RetryUtilsParams_t xReconnectParams; + BackoffAlgorithmContext_t xReconnectParams; + BaseType_t xBackoffStatus = pdFAIL; TransportSocketStatus_t xNetworkStatus = TRANSPORT_SOCKET_STATUS_SUCCESS; ServerInfo_t xServerInfo = { 0 }; SocketsConfig_t xSocketConfig = { 0 }; @@ -939,10 +1033,11 @@ static BaseType_t prvSocketConnect( NetworkContext_t * pxNetworkContext ) xSocketConfig.pRootCa = democonfigROOT_CA_PEM; xSocketConfig.rootCaSize = sizeof( democonfigROOT_CA_PEM ); - /* We will use a retry mechanism with an exponential backoff mechanism and - * jitter. We initialize reconnect attempts and interval here. */ - xReconnectParams.maxRetryAttempts = MAX_RETRY_ATTEMPTS; - RetryUtils_ParamsReset( &xReconnectParams ); + /* Initialize reconnect attempts and interval. */ + BackoffAlgorithm_InitializeParams( &xReconnectParams, + RETRY_BACKOFF_BASE_MS, + RETRY_MAX_BACKOFF_DELAY_MS, + RETRY_MAX_ATTEMPTS ); /* Attempt to connect to MQTT broker. If connection fails, retry after a * timeout. Timeout value will exponentially increase until the maximum @@ -963,15 +1058,15 @@ static BaseType_t prvSocketConnect( NetworkContext_t * pxNetworkContext ) if( !xConnected ) { - LogWarn( ( "Connection to the broker failed. Retrying connection with backoff and jitter." ) ); - xRetryUtilsStatus = RetryUtils_BackoffAndSleep( &xReconnectParams ); - } + LogWarn( ( "Connection to the broker failed. Attempting connection retry after backoff delay." ) ); - if( xRetryUtilsStatus == RetryUtilsRetriesExhausted ) - { - LogError( ( "Connection to the broker failed. All attempts exhausted." ) ); + /* As the connection attempt failed, we will retry the connection after an + * exponential backoff with jitter delay. */ + + /* Calculate the backoff period for the next retry attempt and perform the wait operation. */ + xBackoffStatus = prvBackoffForRetry( &xReconnectParams ); } - } while( ( xConnected != pdPASS ) && ( xRetryUtilsStatus == RetryUtilsSuccess ) ); + } while( ( xConnected != pdPASS ) && ( xBackoffStatus == pdPASS ) ); return xConnected; } @@ -2018,12 +2113,13 @@ int RunCoreMqttConnectionSharingDemo( bool awsIotMqttMode, BaseType_t xNetworkStatus = pdFAIL; BaseType_t xResult = pdFALSE; BaseType_t xNetworkConnectionCreated = pdFALSE; - uint32_t ulNotification = 0; + uint32_t ulNotification = 0UL; MQTTStatus_t xMQTTStatus; uint32_t ulExpectedNotifications = mqttexamplePUBLISHER_SYNC_COMPLETE_BIT | mqttexampleSUBSCRIBE_TASK_COMPLETE_BIT | mqttexamplePUBLISHER_ASYNC_COMPLETE_BIT; - uint32_t ulDemoCount = 0; + uint32_t ulDemoCount = 0UL; + uint32_t ulDemoSuccessCount = 0UL; int ret = EXIT_SUCCESS; ( void ) awsIotMqttMode; @@ -2078,7 +2174,7 @@ int RunCoreMqttConnectionSharingDemo( bool awsIotMqttMode, } } - for( ulDemoCount = 0; ( ulDemoCount < democonfigMQTT_MAX_DEMO_COUNT ) && ( ret == EXIT_SUCCESS ); ulDemoCount++ ) + for( ulDemoCount = 0UL; ( ulDemoCount < democonfigMQTT_MAX_DEMO_COUNT ); ulDemoCount++ ) { /* Clear the lists of subscriptions and pending acknowledgments. */ memset( pxPendingAcks, 0x00, mqttexamplePENDING_ACKS_MAX_SIZE * sizeof( AckInfo_t ) ); @@ -2156,13 +2252,17 @@ int RunCoreMqttConnectionSharingDemo( bool awsIotMqttMode, if( ret == EXIT_SUCCESS ) { LogInfo( ( "Demo iteration %lu completed successfully.", ( ulDemoCount + 1UL ) ) ); - LogInfo( ( "Short delay before starting the next iteration.... \r\n\r\n" ) ); - vTaskDelay( mqttexampleDELAY_BETWEEN_DEMO_ITERATIONS ); + ulDemoSuccessCount++; } else { + /* Demo loop will be repeated for democonfigMQTT_MAX_DEMO_COUNT + * times even if current loop resulted in a failure. */ LogError( ( "Demo failed at iteration %lu.", ( ulDemoCount + 1UL ) ) ); } + + LogInfo( ( "Short delay before starting the next iteration.... \r\n\r\n" ) ); + vTaskDelay( mqttexampleDELAY_BETWEEN_DEMO_ITERATIONS ); } /* Delete queues. */ @@ -2181,6 +2281,25 @@ int RunCoreMqttConnectionSharingDemo( bool awsIotMqttMode, vQueueDelete( xSubscriberResponseQueue ); } + /* Demo run is considered successful if more than half of + * #democonfigMQTT_MAX_DEMO_COUNT is successful. */ + if( ulDemoSuccessCount > ( democonfigMQTT_MAX_DEMO_COUNT / 2 ) ) + { + ret = EXIT_SUCCESS; + LogInfo( ( "Demo run is successful with %lu successful loops out of total %lu loops.", + ( ulDemoSuccessCount ), + democonfigMQTT_MAX_DEMO_COUNT ) ); + } + else + { + ret = EXIT_FAILURE; + LogInfo( ( "Demo run failed with %lu failed loops out of total %lu loops." + " RequiredSuccessCounts=%lu.", + ( democonfigMQTT_MAX_DEMO_COUNT - ulDemoSuccessCount ), + democonfigMQTT_MAX_DEMO_COUNT, + ( ( democonfigMQTT_MAX_DEMO_COUNT / 2 ) + 1 ) ) ); + } + return ret; } diff --git a/demos/coreMQTT/mqtt_demo_mutual_auth.c b/demos/coreMQTT/mqtt_demo_mutual_auth.c index c9b051ed7aa..5613fd2227f 100644 --- a/demos/coreMQTT/mqtt_demo_mutual_auth.c +++ b/demos/coreMQTT/mqtt_demo_mutual_auth.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -64,7 +64,10 @@ #include "core_mqtt.h" /* Retry utilities include. */ -#include "retry_utils.h" +#include "backoff_algorithm.h" + +/* Include PKCS11 helpers header. */ +#include "pkcs11_helpers.h" /* Transport interface implementation include header for TLS. */ #include "transport_secure_sockets.h" @@ -131,6 +134,23 @@ #endif /*-----------------------------------------------------------*/ +/** + * @brief The maximum number of retries for network operation with server. + */ +#define RETRY_MAX_ATTEMPTS ( 5U ) + +/** + * @brief The maximum back-off delay (in milliseconds) for retrying failed operation + * with server. + */ +#define RETRY_MAX_BACKOFF_DELAY_MS ( 5000U ) + +/** + * @brief The base back-off delay (in milliseconds) to use for network operation retry + * attempts. + */ +#define RETRY_BACKOFF_BASE_MS ( 500U ) + /** * @brief Timeout for receiving CONNACK packet in milliseconds. */ @@ -163,7 +183,13 @@ /** * @brief Timeout for MQTT_ProcessLoop in milliseconds. */ -#define mqttexamplePROCESS_LOOP_TIMEOUT_MS ( 500U ) +#define mqttexamplePROCESS_LOOP_TIMEOUT_MS ( 700U ) + +/** + * @brief The maximum number of times to call MQTT_ProcessLoop() when polling + * for a specific packet from the broker. + */ +#define MQTT_PROCESS_LOOP_PACKET_WAIT_COUNT_MAX ( 30U ) /** * @brief Keep alive time reported to the broker while establishing @@ -202,6 +228,29 @@ /*-----------------------------------------------------------*/ +/** + * @brief Calculate and perform an exponential backoff with jitter delay for + * the next retry attempt of a failed network operation with the server. + * + * The function generates a random number, calculates the next backoff period + * with the generated random number, and performs the backoff delay operation if the + * number of retries have not exhausted. + * + * @note The PKCS11 module is used to generate the random number as it allows access + * to a True Random Number Generator (TRNG) if the vendor platform supports it. + * It is recommended to seed the random number generator with a device-specific entropy + * source so that probability of collisions from devices in connection retries is mitigated. + * + * @note The backoff period is calculated using the backoffAlgorithm library. + * + * @param[in, out] pxRetryAttempts The context to use for backoff period calculation + * with the backoffAlgorithm library. + * + * @return pdPASS if calculating the backoff period was successful; otherwise pdFAIL + * if there was failure in random number generation OR all retry attempts had exhausted. + */ +static BaseType_t prvBackoffForRetry( BackoffAlgorithmContext_t * pxRetryParams ); + /** * @brief Connect to MQTT broker with reconnection retries. * @@ -304,6 +353,18 @@ static void prvEventCallback( MQTTContext_t * pxMQTTContext, MQTTPacketInfo_t * pxPacketInfo, MQTTDeserializedInfo_t * pxDeserializedInfo ); +/** + * @brief Helper function to wait for a specific incoming packet from the + * broker. + * + * @param[in] pxMQTTContext MQTT context pointer. + * @param[in] usPacketType Packet type to wait for. + * + * @return The return status from call to #MQTT_ProcessLoop API. + */ +static MQTTStatus_t prvWaitForPacket( MQTTContext_t * pxMQTTContext, + uint16_t usPacketType ); + /*-----------------------------------------------------------*/ /** @@ -338,6 +399,20 @@ static uint16_t usSubscribePacketIdentifier; */ static uint16_t usUnsubscribePacketIdentifier; +/** + * @brief MQTT packet type received from the MQTT broker. + * + * @note Only on receiving incoming PUBLISH, SUBACK, and UNSUBACK, this + * variable is updated. For MQTT packets PUBACK and PINGRESP, the variable is + * not updated since there is no need to specifically wait for it in this demo. + * A single variable suffices as this demo uses single task and requests one operation + * (of PUBLISH, SUBSCRIBE, UNSUBSCRIBE) at a time before expecting response from + * the broker. Hence it is not possible to receive multiple packets of type PUBLISH, + * SUBACK, and UNSUBACK in a single call of #prvWaitForPacket. + * For a multi task application, consider a different method to wait for the packet, if needed. + */ +static uint16_t usPacketTypeReceived = 0U; + /** * @brief A pair containing a topic filter and its SUBACK status. */ @@ -393,14 +468,14 @@ int RunCoreMqttMutualAuthDemo( bool awsIotMqttMode, NetworkContext_t xNetworkContext = { 0 }; MQTTContext_t xMQTTContext = { 0 }; MQTTStatus_t xMQTTStatus; - uint32_t ulDemoRunCount = 0; + uint32_t ulDemoRunCount = 0UL, ulDemoSuccessCount = 0UL; TransportSocketStatus_t xNetworkStatus; BaseType_t xIsConnectionEstablished = pdFALSE; /* Upon return, pdPASS will indicate a successful demo execution. * pdFAIL will indicate some failures occurred during execution. The * user of this demo must check the logs for any failure codes. */ - BaseType_t xDemoStatus = pdPASS; + BaseType_t xDemoStatus = pdFAIL; /* Remove compiler warnings about unused parameters. */ ( void ) awsIotMqttMode; @@ -415,7 +490,7 @@ int RunCoreMqttMutualAuthDemo( bool awsIotMqttMode, */ ulGlobalEntryTimeMs = prvGetTimeMs(); - for( ; ulDemoRunCount < democonfigMQTT_MAX_DEMO_COUNT; ulDemoRunCount++ ) + for( ulDemoRunCount = 0UL; ( ulDemoRunCount < democonfigMQTT_MAX_DEMO_COUNT ); ulDemoRunCount++ ) { /****************************** Connect. ******************************/ @@ -444,7 +519,7 @@ int RunCoreMqttMutualAuthDemo( bool awsIotMqttMode, { /* If server rejected the subscription request, attempt to resubscribe to topic. * Attempts are made according to the exponential backoff retry strategy - * implemented in retry_utils. */ + * implemented in backoff_algorithm. */ xDemoStatus = prvMQTTSubscribeWithBackoffRetries( &xMQTTContext ); } @@ -461,16 +536,16 @@ int RunCoreMqttMutualAuthDemo( bool awsIotMqttMode, if( xDemoStatus == pdPASS ) { /* Process incoming publish echo, since application subscribed to the same - * topic, the broker will send publish message back to the application. */ + * topic, the broker will send publish message back to the application. + * #prvWaitForPacket will try to receive an incoming PUBLISH packet from broker. + * Please note that PUBACK for the outgoing PUBLISH may also be received before + * receiving an incoming PUBLISH. */ LogInfo( ( "Attempt to receive publish message from broker." ) ); - xMQTTStatus = MQTT_ProcessLoop( &xMQTTContext, mqttexamplePROCESS_LOOP_TIMEOUT_MS ); + xMQTTStatus = prvWaitForPacket( &xMQTTContext, MQTT_PACKET_TYPE_PUBLISH ); if( xMQTTStatus != MQTTSuccess ) { xDemoStatus = pdFAIL; - LogError( ( "MQTT_ProcessLoop failed: LoopDuration=%u, Error=%s", - mqttexamplePROCESS_LOOP_TIMEOUT_MS, - MQTT_Status_strerror( xMQTTStatus ) ) ); } } @@ -490,14 +565,11 @@ int RunCoreMqttMutualAuthDemo( bool awsIotMqttMode, if( xDemoStatus == pdPASS ) { /* Process incoming UNSUBACK packet from the broker. */ - xMQTTStatus = MQTT_ProcessLoop( &xMQTTContext, mqttexamplePROCESS_LOOP_TIMEOUT_MS ); + xMQTTStatus = prvWaitForPacket( &xMQTTContext, MQTT_PACKET_TYPE_UNSUBACK ); if( xMQTTStatus != MQTTSuccess ) { xDemoStatus = pdFAIL; - LogError( ( "Failed to receive UNSUBACK packet from broker: ProcessLoopDuration=%u, Error=%s", - mqttexamplePROCESS_LOOP_TIMEOUT_MS, - MQTT_Status_strerror( xMQTTStatus ) ) ); } } @@ -539,31 +611,103 @@ int RunCoreMqttMutualAuthDemo( bool awsIotMqttMode, * bombard the broker. */ LogInfo( ( "Demo completed an iteration successfully." ) ); LogInfo( ( "Demo iteration %lu completed successfully.", ( ulDemoRunCount + 1UL ) ) ); + + /* Update success count. */ + ulDemoSuccessCount++; } else { - /* Terminate the demo due to failure. */ + /* Demo loop will be repeated for democonfigMQTT_MAX_DEMO_COUNT + * times even if current loop resulted in a failure. */ LogInfo( ( "Demo failed at iteration %lu.", ( ulDemoRunCount + 1UL ) ) ); - LogInfo( ( "Exiting demo." ) ); - break; } LogInfo( ( "Short delay before starting the next iteration.... " ) ); vTaskDelay( mqttexampleDELAY_BETWEEN_DEMO_ITERATIONS_TICKS ); } + /* Demo run is considered successful if more than half of + * #democonfigMQTT_MAX_DEMO_COUNT is successful. */ + if( ulDemoSuccessCount > ( democonfigMQTT_MAX_DEMO_COUNT / 2 ) ) + { + xDemoStatus = pdPASS; + LogInfo( ( "Demo run is successful with %lu successful loops out of total %lu loops.", + ( ulDemoSuccessCount ), + democonfigMQTT_MAX_DEMO_COUNT ) ); + } + else + { + xDemoStatus = pdFAIL; + LogInfo( ( "Demo run failed with %lu failed loops out of total %lu loops." + " RequiredSuccessCounts=%lu.", + ( democonfigMQTT_MAX_DEMO_COUNT - ulDemoSuccessCount ), + democonfigMQTT_MAX_DEMO_COUNT, + ( ( democonfigMQTT_MAX_DEMO_COUNT / 2 ) + 1 ) ) ); + } + return ( xDemoStatus == pdPASS ) ? EXIT_SUCCESS : EXIT_FAILURE; } /*-----------------------------------------------------------*/ +static BaseType_t prvBackoffForRetry( BackoffAlgorithmContext_t * pxRetryParams ) +{ + BaseType_t xReturnStatus = pdFAIL; + uint16_t usNextRetryBackOff = 0U; + BackoffAlgorithmStatus_t xBackoffAlgStatus = BackoffAlgorithmSuccess; + + /** + * To calculate the backoff period for the next retry attempt, we will + * generate a random number to provide to the backoffAlgorithm library. + * + * Note: The PKCS11 module is used to generate the random number as it allows access + * to a True Random Number Generator (TRNG) if the vendor platform supports it. + * It is recommended to use a random number generator seeded with a device-specific + * entropy source so that probability of collisions from devices in connection retries + * is mitigated. + */ + uint32_t ulRandomNum = 0; + + if( xPkcs11GenerateRandomNumber( ( uint8_t * ) &ulRandomNum, + sizeof( ulRandomNum ) ) == pdPASS ) + { + /* Get back-off value (in milliseconds) for the next retry attempt. */ + xBackoffAlgStatus = BackoffAlgorithm_GetNextBackoff( pxRetryParams, ulRandomNum, &usNextRetryBackOff ); + + if( xBackoffAlgStatus == BackoffAlgorithmRetriesExhausted ) + { + LogError( ( "All retry attempts have exhausted. Operation will not be retried" ) ); + } + else if( xBackoffAlgStatus == BackoffAlgorithmSuccess ) + { + /* Perform the backoff delay. */ + vTaskDelay( pdMS_TO_TICKS( usNextRetryBackOff ) ); + + xReturnStatus = pdPASS; + + LogInfo( ( "Retry attempt %lu out of maximum retry attempts %lu.", + ( pxRetryParams->attemptsDone + 1 ), + pxRetryParams->maxRetryAttempts ) ); + } + } + else + { + LogError( ( "Unable to retry operation with broker: Random number generation failed" ) ); + } + + return xReturnStatus; +} + +/*-----------------------------------------------------------*/ + static BaseType_t prvConnectToServerWithBackoffRetries( NetworkContext_t * pxNetworkContext ) { ServerInfo_t xServerInfo = { 0 }; + SocketsConfig_t xSocketsConfig = { 0 }; BaseType_t xStatus = pdPASS; TransportSocketStatus_t xNetworkStatus = TRANSPORT_SOCKET_STATUS_SUCCESS; - RetryUtilsStatus_t xRetryUtilsStatus = RetryUtilsSuccess; - RetryUtilsParams_t xReconnectParams; + BackoffAlgorithmContext_t xReconnectParams; + BaseType_t xBackoffStatus = pdFALSE; /* Set the credentials for establishing a TLS connection. */ /* Initializer server information. */ @@ -582,8 +726,10 @@ static BaseType_t prvConnectToServerWithBackoffRetries( NetworkContext_t * pxNet xSocketsConfig.recvTimeoutMs = mqttexampleTRANSPORT_SEND_RECV_TIMEOUT_MS; /* Initialize reconnect attempts and interval. */ - RetryUtils_ParamsReset( &xReconnectParams ); - xReconnectParams.maxRetryAttempts = MAX_RETRY_ATTEMPTS; + BackoffAlgorithm_InitializeParams( &xReconnectParams, + RETRY_BACKOFF_BASE_MS, + RETRY_MAX_BACKOFF_DELAY_MS, + RETRY_MAX_ATTEMPTS ); /* Attempt to connect to MQTT broker. If connection fails, retry after * a timeout. Timeout value will exponentially increase till maximum @@ -604,22 +750,15 @@ static BaseType_t prvConnectToServerWithBackoffRetries( NetworkContext_t * pxNet if( xNetworkStatus != TRANSPORT_SOCKET_STATUS_SUCCESS ) { - LogWarn( ( "Connection to the broker failed. Status=%d ." - "Retrying connection with backoff and jitter.", xNetworkStatus ) ); - xStatus = pdFAIL; + LogWarn( ( "Connection to the broker failed. Attempting connection retry after backoff delay." ) ); - LogInfo( ( "Retry attempt %lu out of maximum retry attempts %lu.", - ( xReconnectParams.attemptsDone + 1 ), - MAX_RETRY_ATTEMPTS ) ); - xRetryUtilsStatus = RetryUtils_BackoffAndSleep( &xReconnectParams ); - } + /* As the connection attempt failed, we will retry the connection after an + * exponential backoff with jitter delay. */ - if( xRetryUtilsStatus == RetryUtilsRetriesExhausted ) - { - LogError( ( "Connection to the broker failed, all attempts exhausted." ) ); - xNetworkStatus = TRANSPORT_SOCKET_STATUS_CONNECT_FAILURE; + /* Calculate the backoff period for the next retry attempt and perform the wait operation. */ + xBackoffStatus = prvBackoffForRetry( &xReconnectParams ); } - } while( ( xNetworkStatus != TRANSPORT_SOCKET_STATUS_SUCCESS ) && ( xRetryUtilsStatus == RetryUtilsSuccess ) ); + } while( ( xNetworkStatus != TRANSPORT_SOCKET_STATUS_SUCCESS ) && ( xBackoffStatus == pdPASS ) ); return xStatus; } @@ -709,10 +848,10 @@ static void prvUpdateSubAckStatus( MQTTPacketInfo_t * pxPacketInfo ) static BaseType_t prvMQTTSubscribeWithBackoffRetries( MQTTContext_t * pxMQTTContext ) { MQTTStatus_t xResult = MQTTSuccess; - RetryUtilsStatus_t xRetryUtilsStatus = RetryUtilsSuccess; - RetryUtilsParams_t xRetryParams; + BackoffAlgorithmContext_t xRetryParams; + BaseType_t xBackoffStatus = pdFAIL; MQTTSubscribeInfo_t xMQTTSubscription[ mqttexampleTOPIC_COUNT ]; - bool xFailedSubscribeToTopic = false; + BaseType_t xFailedSubscribeToTopic = pdFALSE; uint32_t ulTopicCount = 0U; BaseType_t xStatus = pdFAIL; @@ -729,8 +868,10 @@ static BaseType_t prvMQTTSubscribeWithBackoffRetries( MQTTContext_t * pxMQTTCont xMQTTSubscription[ 0 ].topicFilterLength = ( uint16_t ) strlen( mqttexampleTOPIC ); /* Initialize retry attempts and interval. */ - RetryUtils_ParamsReset( &xRetryParams ); - xRetryParams.maxRetryAttempts = MAX_RETRY_ATTEMPTS; + BackoffAlgorithm_InitializeParams( &xRetryParams, + RETRY_BACKOFF_BASE_MS, + RETRY_MAX_BACKOFF_DELAY_MS, + RETRY_MAX_ATTEMPTS ); do { @@ -764,19 +905,18 @@ static BaseType_t prvMQTTSubscribeWithBackoffRetries( MQTTContext_t * pxMQTTCont * receiving Publish message before subscribe ack is zero; but application * must be ready to receive any packet. This demo uses the generic packet * processing function everywhere to highlight this fact. */ - xResult = MQTT_ProcessLoop( pxMQTTContext, mqttexamplePROCESS_LOOP_TIMEOUT_MS ); + xResult = prvWaitForPacket( pxMQTTContext, MQTT_PACKET_TYPE_SUBACK ); if( xResult != MQTTSuccess ) { - LogError( ( "Failed to receive SUBACK response for SUBSCRIBE request: ProcessLoopDuration=%u, Error=%s", - mqttexamplePROCESS_LOOP_TIMEOUT_MS, MQTT_Status_strerror( xResult ) ) ); + xStatus = pdFAIL; } } if( xStatus == pdPASS ) { /* Reset flag before checking suback responses. */ - xFailedSubscribeToTopic = false; + xFailedSubscribeToTopic = pdFALSE; /* Check if recent subscription request has been rejected. #xTopicFilterContext is updated * in the event callback to reflect the status of the SUBACK sent by the broker. It represents @@ -786,20 +926,21 @@ static BaseType_t prvMQTTSubscribeWithBackoffRetries( MQTTContext_t * pxMQTTCont { if( xTopicFilterContext[ ulTopicCount ].xSubAckStatus == MQTTSubAckFailure ) { + xFailedSubscribeToTopic = pdTRUE; + + /* As the subscribe attempt failed, we will retry the connection after an + * exponential backoff with jitter delay. */ + + /* Retry subscribe after exponential back-off. */ LogWarn( ( "Server rejected subscription request. Attempting to re-subscribe to topic %s.", xTopicFilterContext[ ulTopicCount ].pcTopicFilter ) ); - xFailedSubscribeToTopic = true; - xRetryUtilsStatus = RetryUtils_BackoffAndSleep( &xRetryParams ); + + xBackoffStatus = prvBackoffForRetry( &xRetryParams ); break; } } } - - if( xRetryUtilsStatus == RetryUtilsRetriesExhausted ) - { - LogError( ( "SUBSCRIBE request re-tries exhausted." ) ); - } - } while( ( xFailedSubscribeToTopic == true ) && ( xRetryUtilsStatus == RetryUtilsSuccess ) ); + } while( ( xFailedSubscribeToTopic == pdTRUE ) && ( xBackoffStatus == pdPASS ) ); return xStatus; } @@ -894,6 +1035,9 @@ static void prvMQTTProcessResponse( MQTTPacketInfo_t * pxIncomingPacket, case MQTT_PACKET_TYPE_SUBACK: + /* Update the packet type received to SUBACK. */ + usPacketTypeReceived = MQTT_PACKET_TYPE_SUBACK; + /* A SUBACK from the broker, containing the server response to our subscription request, has been received. * It contains the status code indicating server approval/rejection for the subscription to the single topic * requested. The SUBACK will be parsed to obtain the status code, and this status code will be stored in global @@ -916,12 +1060,17 @@ static void prvMQTTProcessResponse( MQTTPacketInfo_t * pxIncomingPacket, case MQTT_PACKET_TYPE_UNSUBACK: LogInfo( ( "Unsubscribed from the topic %s.", mqttexampleTOPIC ) ); + + /* Update the packet type received to UNSUBACK. */ + usPacketTypeReceived = MQTT_PACKET_TYPE_UNSUBACK; + /* Make sure ACK packet identifier matches with Request packet identifier. */ configASSERT( usUnsubscribePacketIdentifier == usPacketId ); break; case MQTT_PACKET_TYPE_PINGRESP: LogInfo( ( "Ping Response successfully received." ) ); + break; /* Any other packet type is invalid. */ @@ -937,6 +1086,9 @@ static void prvMQTTProcessIncomingPublish( MQTTPublishInfo_t * pxPublishInfo ) { configASSERT( pxPublishInfo != NULL ); + /* Set the global for indicating that an incoming publish is received. */ + usPacketTypeReceived = MQTT_PACKET_TYPE_PUBLISH; + /* Process incoming Publish. */ LogInfo( ( "Incoming QoS : %d\n", pxPublishInfo->qos ) ); @@ -999,3 +1151,34 @@ static uint32_t prvGetTimeMs( void ) } /*-----------------------------------------------------------*/ + +static MQTTStatus_t prvWaitForPacket( MQTTContext_t * pxMQTTContext, + uint16_t usPacketType ) +{ + uint8_t ucCount = 0U; + MQTTStatus_t xMQTTStatus = MQTTSuccess; + + /* Reset the packet type received. */ + usPacketTypeReceived = 0U; + + while( ( usPacketTypeReceived != usPacketType ) && + ( ucCount++ < MQTT_PROCESS_LOOP_PACKET_WAIT_COUNT_MAX ) && + ( xMQTTStatus == MQTTSuccess ) ) + { + /* Event callback will set #usPacketTypeReceived when receiving appropriate packet. This + * will wait for at most mqttexamplePROCESS_LOOP_TIMEOUT_MS. */ + xMQTTStatus = MQTT_ProcessLoop( pxMQTTContext, mqttexamplePROCESS_LOOP_TIMEOUT_MS ); + } + + if( ( xMQTTStatus != MQTTSuccess ) || ( usPacketTypeReceived != usPacketType ) ) + { + LogError( ( "MQTT_ProcessLoop failed to receive packet: Packet type=%02X, LoopDuration=%u, Status=%s", + usPacketType, + ( mqttexamplePROCESS_LOOP_TIMEOUT_MS * ucCount ), + MQTT_Status_strerror( xMQTTStatus ) ) ); + } + + return xMQTTStatus; +} + +/*-----------------------------------------------------------*/ diff --git a/demos/defender/CMakeLists.txt b/demos/defender/CMakeLists.txt deleted file mode 100644 index e3c5672960a..00000000000 --- a/demos/defender/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -# Device Defender demo -afr_demo_module(defender) - -afr_set_demo_metadata(ID "DEFENDER_DEMO") -afr_set_demo_metadata(DESCRIPTION "An example that demonstrates reporting metrics to AWS IoT with Device Defender") -afr_set_demo_metadata(DISPLAY_NAME "Device Defender") - -afr_module_sources( - ${AFR_CURRENT_MODULE} - INTERFACE - "${CMAKE_CURRENT_LIST_DIR}/aws_iot_demo_defender.c" -) -afr_module_dependencies( - ${AFR_CURRENT_MODULE} - INTERFACE - AFR::defender -) diff --git a/demos/defender/aws_iot_demo_defender.c b/demos/defender/aws_iot_demo_defender.c deleted file mode 100644 index f126b2056e9..00000000000 --- a/demos/defender/aws_iot_demo_defender.c +++ /dev/null @@ -1,357 +0,0 @@ -/* - * FreeRTOS V202011.00 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://aws.amazon.com/freertos - * http://www.FreeRTOS.org - */ - -/* Demo configuration includes. */ -#include "iot_config.h" - -/* Standard includes. */ -#include -#include - -/* Demo logging include. */ -#include "iot_demo_logging.h" - -/* Platform includes for demo. */ -#include "platform/iot_clock.h" -#include "platform/iot_network.h" - -/* Defender includes. */ -#include "aws_iot_defender.h" - -/* Includes for initialization. */ -#include "iot_mqtt.h" -#include "platform/iot_metrics.h" - -/** - * @brief The keep-alive interval used for this demo. - * - * An MQTT ping request will be sent periodically at this interval. - */ -#define KEEP_ALIVE_SECONDS ( ( uint16_t ) 60 ) - -/** - * @brief The timeout for Defender and MQTT operations in this demo. - */ -#define TIMEOUT_MS ( ( uint32_t ) 5000 ) - -/** - * @brief Defender metrics publish interval, 5 minutes (300 seconds) is minumum. - */ -#define DEFENDER_PUBLISH_INTERVAL ( ( uint32_t ) 300 ) - -/*-----------------------------------------------------------*/ - -/** - * @brief Callback used to get notification of defender's events. - * - * @param[in] pCallbackContext context pointer passed by the application - * when callback is regiested in AwsIotDefender_Start() - * - * @param[im] pointer to AwsIotDefenderCallbackInfo_t containing status of - * publish - */ -static void _defenderCallback( void * pCallbackContext, - AwsIotDefenderCallbackInfo_t * const pCallbackInfo ) -{ - bool * pMetricsAccepted = ( bool * ) ( pCallbackContext ); - - IotLogInfo( "User's callback is invoked on event: %s.", AwsIotDefender_EventType( pCallbackInfo->eventType ) ); - - if( pCallbackInfo != NULL ) - { - /* Callback info processing example. */ - if( pCallbackInfo->eventType == AWS_IOT_DEFENDER_METRICS_ACCEPTED ) - { - *pMetricsAccepted = true; - } - - if( pCallbackInfo->pMetricsReport != NULL ) - { - IotLogInfo( "Published metrics report." ); - } - else - { - IotLogError( "No metrics report was generated." ); - } - - if( pCallbackInfo->pPayload != NULL ) - { - IotLogInfo( "Received MQTT message." ); - } - else - { - IotLogError( "No message has been returned from subscribed topic." ); - } - } -} - -/*-----------------------------------------------------------*/ - -/** - * @brief Establish a new connection to the MQTT server for the Defender demo. - * - * @param[in] pIdentifier NULL-terminated MQTT client identifier. The Defender - * demo will use the Thing Name as the client identifier. - * @param[in] pNetworkServerInfo Passed to the MQTT connect function when - * establishing the MQTT connection. - * @param[in] pNetworkCredentialInfo Passed to the MQTT connect function when - * establishing the MQTT connection. - * @param[in] pNetworkInterface The network interface to use for this demo. - * @param[out] pMqttConnection Set to the handle to the new MQTT connection. - * - * @return `EXIT_SUCCESS` if the connection is successfully established; `EXIT_FAILURE` - * otherwise. - */ -static int _establishMqttConnection( const char * pIdentifier, - void * pNetworkServerInfo, - void * pNetworkCredentialInfo, - const IotNetworkInterface_t * pNetworkInterface, - IotMqttConnection_t * pMqttConnection ) -{ - int status = EXIT_SUCCESS; - IotMqttError_t connectStatus = IOT_MQTT_STATUS_PENDING; - IotMqttNetworkInfo_t networkInfo = IOT_MQTT_NETWORK_INFO_INITIALIZER; - IotMqttConnectInfo_t connectInfo = IOT_MQTT_CONNECT_INFO_INITIALIZER; - - if( pIdentifier == NULL ) - { - IotLogError( "Defender Thing Name must be provided." ); - - status = EXIT_FAILURE; - } - - if( status == EXIT_SUCCESS ) - { - /* Set the members of the network info not set by the initializer. This - * struct provided information on the transport layer to the MQTT connection. */ - networkInfo.createNetworkConnection = true; - networkInfo.u.setup.pNetworkServerInfo = pNetworkServerInfo; - networkInfo.u.setup.pNetworkCredentialInfo = pNetworkCredentialInfo; - networkInfo.pNetworkInterface = pNetworkInterface; - - /* Set the members of the connection info not set by the initializer. */ - connectInfo.awsIotMqttMode = true; - connectInfo.cleanSession = true; - connectInfo.keepAliveSeconds = KEEP_ALIVE_SECONDS; - - /* AWS IoT recommends the use of the Thing Name as the MQTT client ID. */ - connectInfo.pClientIdentifier = pIdentifier; - connectInfo.clientIdentifierLength = ( uint16_t ) strlen( pIdentifier ); - - IotLogInfo( "Defender Thing Name is %.*s (length %hu).", - connectInfo.clientIdentifierLength, - connectInfo.pClientIdentifier, - connectInfo.clientIdentifierLength ); - - /* Establish the MQTT connection. */ - connectStatus = IotMqtt_Connect( &networkInfo, - &connectInfo, - TIMEOUT_MS, - pMqttConnection ); - - if( connectStatus != IOT_MQTT_SUCCESS ) - { - IotLogError( "MQTT CONNECT returned error %s.", - IotMqtt_strerror( connectStatus ) ); - - status = EXIT_FAILURE; - } - } - - return status; -} -/*-----------------------------------------------------------*/ - -/** - * @brief The function that runs the Defender demo, called by the demo runner. - * - * @param[in] awsIotMqttMode Ignored for the Defender demo. - * @param[in] pIdentifier NULL-terminated Defender Thing Name. - * @param[in] pNetworkServerInfo Passed to the MQTT connect function when - * establishing the MQTT connection for Defender. - * @param[in] pNetworkCredentialInfo Passed to the MQTT connect function when - * establishing the MQTT connection for Defender. - * @param[in] pNetworkInterface The network interface to use for this demo. - * - * @return `EXIT_SUCCESS` if the demo completes successfully; `EXIT_FAILURE` otherwise. - */ -int RunDefenderDemo( bool awsIotMqttMode, - const char * pIdentifier, - void * pNetworkServerInfo, - void * pNetworkCredentialInfo, - const IotNetworkInterface_t * pNetworkInterface ) -{ - int status = EXIT_SUCCESS; - bool metricsInitStatus = false; - bool metricsAccepted = false; - IotMqttError_t mqttStatus = IOT_MQTT_INIT_FAILED; - AwsIotDefenderError_t defenderResult = AWS_IOT_DEFENDER_INTERNAL_FAILURE; - AwsIotDefenderStartInfo_t startInfo = AWS_IOT_DEFENDER_START_INFO_INITIALIZER; - const AwsIotDefenderCallback_t callback = { .function = _defenderCallback, .pCallbackContext = &metricsAccepted }; - IotMqttConnection_t mqttConnection = IOT_MQTT_CONNECTION_INITIALIZER; - - /* Unused parameters. */ - ( void ) awsIotMqttMode; - - IotLogInfo( "----Device Defender Demo Start----" ); - - /* Check parameter(s). */ - if( ( pIdentifier == NULL ) || ( pIdentifier[ 0 ] == '\0' ) ) - { - IotLogError( "The length of the Thing Name (identifier) must be nonzero." ); - status = EXIT_FAILURE; - } - - if( status == EXIT_SUCCESS ) - { - /* Initialize the MQTT library. */ - mqttStatus = IotMqtt_Init(); - - if( mqttStatus != IOT_MQTT_SUCCESS ) - { - IotLogError( "MQTT Initialization Failed." ); - status = EXIT_FAILURE; - } - } - - if( status == EXIT_SUCCESS ) - { - /* Initialize Metrics. */ - metricsInitStatus = IotMetrics_Init(); - - if( !metricsInitStatus ) - { - IotLogError( "IOT Metrics Initialization Failed." ); - status = EXIT_FAILURE; - } - } - - if( status == EXIT_SUCCESS ) - { - /* Specify all metrics in "tcp connections" group */ - defenderResult = - AwsIotDefender_SetMetrics( AWS_IOT_DEFENDER_METRICS_TCP_CONNECTIONS, AWS_IOT_DEFENDER_METRICS_ALL ); - - if( defenderResult != AWS_IOT_DEFENDER_SUCCESS ) - { - status = EXIT_FAILURE; - } - } - - if( status == EXIT_SUCCESS ) - { - /* Set metrics report period */ - defenderResult = AwsIotDefender_SetPeriod( DEFENDER_PUBLISH_INTERVAL ); - - if( defenderResult != AWS_IOT_DEFENDER_SUCCESS ) - { - status = EXIT_FAILURE; - } - } - - if( status == EXIT_SUCCESS ) - { - /* Create MQTT Connection */ - status = _establishMqttConnection( pIdentifier, - pNetworkServerInfo, - pNetworkCredentialInfo, - pNetworkInterface, - &mqttConnection ); - - if( status != EXIT_SUCCESS ) - { - IotLogError( "Failed to create the MQTT Connection." ); - IotMqtt_Cleanup(); - defenderResult = AWS_IOT_DEFENDER_INTERNAL_FAILURE; - } - } - - if( status == EXIT_SUCCESS ) - { - /* Initialize start info and call defender Start API */ - startInfo.pClientIdentifier = pIdentifier; - startInfo.clientIdentifierLength = ( uint16_t ) strlen( pIdentifier ); - startInfo.callback = callback; - startInfo.mqttConnection = mqttConnection; - defenderResult = AwsIotDefender_Start( &startInfo ); - - if( defenderResult == AWS_IOT_DEFENDER_SUCCESS ) - { - /* Let the Device Defender Library run for 3 seconds before stopping. - * This is to allow enough time for the AWS IoT Device Defender - * Service to accept the metrics report. - * - * The following happens when the metrics report is accepted by the AWS IoT - * Device Defender Service: - * - * 1. The application is notified in _defenderCallback() with an event - * type of AWS_IOT_DEFENDER_METRICS_ACCEPTED. In this demo, the - * callback sets the variable metricsAccepted to true which is passed - * as the callback context. - * 2. The Defender library prints "Metrics report was accepted by - * defender service." - * - * It is okay to pass the local variable metricsAccepted in the callback - * context because the Device Defender Library is stopped in this function - * itself. Therefore, the callback can never execute after this function - * has exited. - */ - IotClock_SleepMs( 3000 ); - /* Stop the defender agent. */ - AwsIotDefender_Stop(); - /* Disconnect MQTT */ - IotMqtt_Disconnect( mqttConnection, false ); - } - else - { - status = EXIT_FAILURE; - IotLogError( "AwsIotDefender_Start() returned with error status %s.", - AwsIotDefender_strerror( defenderResult ) ); - } - } - - /* Cleanup. */ - if( metricsInitStatus ) - { - IotMetrics_Cleanup(); - } - - if( mqttStatus == IOT_MQTT_SUCCESS ) - { - IotMqtt_Cleanup(); - } - - /* The demo is successful only if the metrics were accepted by - * the AWS IoT Device Defender Service. */ - if( metricsAccepted == false ) - { - status = EXIT_FAILURE; - } - - IotLogInfo( "----Device Defender Demo End. Status: %s----.", AwsIotDefender_strerror( defenderResult ) ); - return status; -} - -/*-----------------------------------------------------------*/ diff --git a/demos/demo_runner/aws_demo.c b/demos/demo_runner/aws_demo.c index 6c67f270d97..3aae7becea7 100644 --- a/demos/demo_runner/aws_demo.c +++ b/demos/demo_runner/aws_demo.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/demo_runner/aws_demo_network_addr.c b/demos/demo_runner/aws_demo_network_addr.c index c197159cbc4..132cd4f373b 100644 --- a/demos/demo_runner/aws_demo_network_addr.c +++ b/demos/demo_runner/aws_demo_network_addr.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/demo_runner/aws_demo_version.c b/demos/demo_runner/aws_demo_version.c index fd8db913060..bd56d4ad005 100644 --- a/demos/demo_runner/aws_demo_version.c +++ b/demos/demo_runner/aws_demo_version.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/demo_runner/iot_demo_freertos.c b/demos/demo_runner/iot_demo_freertos.c index b00cb266b67..9681bbb959f 100644 --- a/demos/demo_runner/iot_demo_freertos.c +++ b/demos/demo_runner/iot_demo_freertos.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/demo_runner/iot_demo_runner.c b/demos/demo_runner/iot_demo_runner.c index 3a179ce87c2..6c03003d4ea 100644 --- a/demos/demo_runner/iot_demo_runner.c +++ b/demos/demo_runner/iot_demo_runner.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/dev_mode_key_provisioning/include/aws_dev_mode_key_provisioning.h b/demos/dev_mode_key_provisioning/include/aws_dev_mode_key_provisioning.h index 130b24170b3..1afe2721f99 100644 --- a/demos/dev_mode_key_provisioning/include/aws_dev_mode_key_provisioning.h +++ b/demos/dev_mode_key_provisioning/include/aws_dev_mode_key_provisioning.h @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/dev_mode_key_provisioning/src/aws_dev_mode_key_provisioning.c b/demos/dev_mode_key_provisioning/src/aws_dev_mode_key_provisioning.c index fd1f5d1040e..23b8873393a 100644 --- a/demos/dev_mode_key_provisioning/src/aws_dev_mode_key_provisioning.c +++ b/demos/dev_mode_key_provisioning/src/aws_dev_mode_key_provisioning.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -748,6 +748,7 @@ CK_RV xDestroyProvidedObjects( CK_SESSION_HANDLE xSession, xResult = xFindObjectWithLabelAndClass( xSession, ( char * ) pxLabel, + strlen( ( char * ) pxLabel ), xClass[ uiIndex ], &xObjectHandle ); @@ -763,6 +764,7 @@ CK_RV xDestroyProvidedObjects( CK_SESSION_HANDLE xSession, { xResult = xFindObjectWithLabelAndClass( xSession, ( char * ) pxLabel, + strlen( ( char * ) pxLabel ), xClass[ uiIndex ], &xObjectHandle ); } @@ -924,6 +926,7 @@ static CK_RV prvGetProvisionedState( CK_SESSION_HANDLE xSession, { xResult = xFindObjectWithLabelAndClass( xSession, pkcs11configLABEL_DEVICE_PRIVATE_KEY_FOR_TLS, + sizeof( pkcs11configLABEL_DEVICE_PRIVATE_KEY_FOR_TLS ) - 1, CKO_PRIVATE_KEY, &pxProvisionedState->xPrivateKey ); } @@ -933,6 +936,7 @@ static CK_RV prvGetProvisionedState( CK_SESSION_HANDLE xSession, /* Check also for the corresponding public. */ xResult = xFindObjectWithLabelAndClass( xSession, pkcs11configLABEL_DEVICE_PUBLIC_KEY_FOR_TLS, + sizeof( pkcs11configLABEL_DEVICE_PUBLIC_KEY_FOR_TLS ) - 1, CKO_PUBLIC_KEY, &pxProvisionedState->xPublicKey ); } @@ -951,6 +955,7 @@ static CK_RV prvGetProvisionedState( CK_SESSION_HANDLE xSession, { xResult = xFindObjectWithLabelAndClass( xSession, pkcs11configLABEL_DEVICE_CERTIFICATE_FOR_TLS, + sizeof( pkcs11configLABEL_DEVICE_CERTIFICATE_FOR_TLS ) - 1, CKO_CERTIFICATE, &pxProvisionedState->xClientCertificate ); } diff --git a/demos/device_defender_for_aws/CMakeLists.txt b/demos/device_defender_for_aws/CMakeLists.txt new file mode 100644 index 00000000000..c146bce50b2 --- /dev/null +++ b/demos/device_defender_for_aws/CMakeLists.txt @@ -0,0 +1,101 @@ +# Demo module for AWS IoT Defender. +afr_demo_module(device_defender) + +afr_set_demo_metadata(ID "DEVICE_DEFENDER_DEMO") +afr_set_demo_metadata(DESCRIPTION "An example that demonstrates the use of the AWS IoT Defender library.") + +# Add the CMakeLists.txt file of module to metadata list. +afr_module_cmake_files(${AFR_CURRENT_MODULE} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt +) + +afr_module_sources( + ${AFR_CURRENT_MODULE} + INTERFACE + "${CMAKE_CURRENT_LIST_DIR}/defender_demo.c" + "${CMAKE_CURRENT_LIST_DIR}/report_builder.c" + # List of header files added to the target so that these are available + # in code downloaded from the FreeRTOS console. + "${CMAKE_CURRENT_LIST_DIR}/report_builder.h" + "${CMAKE_CURRENT_LIST_DIR}/metrics_collector.h" +) + +afr_module_include_dirs( + ${AFR_CURRENT_MODULE} + INTERFACE + ${AFR_DEMOS_DIR}/common/mqtt_demo_helpers + ${CMAKE_CURRENT_LIST_DIR} +) + +afr_module_dependencies( + ${AFR_CURRENT_MODULE} + INTERFACE + AFR::mqtt_demo_helpers + AFR::core_json + AFR::device_defender + # Add dependency on the device_defender_demo_dependencies + # metadata module so that this demo is only shown when the + # Device Defender library is selected on the FreeRTOS console. + AFR::device_defender_demo_dependencies +) + +# The device defender demo collectes metrics using functions defined in +# metrics_collector.h. We provide an implementation of these functions for +# FreeRTOS+TCP and for LWIP in core locking mode. +# We check the availablitiy of FreeRTOS+TCP or supported lwIP in order to +# provide our metrics_collector implementations. +# If neither is available we include a stub implementation. + +# Metrics are supported on all FreeRTOS+TCP configurations, so if it is +# available we use it. +if(TARGET AFR::freertos_plus_tcp::mcu_port) + # Demo using FreeRTOS+TCP metrics + afr_set_demo_metadata(DISPLAY_NAME "Device Defender Demo (FreeRTOS+TCP)") + + afr_module_sources( + ${AFR_CURRENT_MODULE} + INTERFACE + "${CMAKE_CURRENT_LIST_DIR}/metrics_collector/freertos_plus_tcp/metrics_collector.c" + ) + + afr_module_dependencies( + ${AFR_CURRENT_MODULE} + INTERFACE + AFR::freertos_plus_tcp_utils + ) + +# The DEFENDER_METRICS_LWIP_SUPPORTED flag is defined in board configurations +# which support LWIP metrics collection. +elseif(${DEFENDER_METRICS_LWIP_SUPPORTED}) + # Demo using LWIP metrics + afr_set_demo_metadata(DISPLAY_NAME "Device Defender Demo (LWIP)") + + afr_module_sources( + ${AFR_CURRENT_MODULE} + INTERFACE + "${CMAKE_CURRENT_LIST_DIR}/metrics_collector/lwip/metrics_collector.c" + # List of header files added to the target so that these are available + # in code downloaded from the FreeRTOS console. + "${CMAKE_CURRENT_LIST_DIR}/metrics_collector/lwip/netif_port.h" + ) + + afr_module_include_dirs( + ${AFR_CURRENT_MODULE} + INTERFACE + ${CMAKE_CURRENT_LIST_DIR}/metrics_collector/lwip + ) + +# If both previous checks failed, we do not have an implemented +# metrics_collector available, and thus we use the stub implementation. +else() + # Demo using stubbed metrics for boards that do not support either + # FreeRTOS+TCP or lwIP. + afr_set_demo_metadata(DISPLAY_NAME "Device Defender Demo (Stubbed metrics)") + + afr_module_sources( + ${AFR_CURRENT_MODULE} + INTERFACE + "${CMAKE_CURRENT_LIST_DIR}/metrics_collector/stub/metrics_collector.c" + ) + +endif() diff --git a/demos/device_defender_for_aws/defender_demo.c b/demos/device_defender_for_aws/defender_demo.c new file mode 100644 index 00000000000..295748bc77b --- /dev/null +++ b/demos/device_defender_for_aws/defender_demo.c @@ -0,0 +1,694 @@ +/* + * FreeRTOS V202012.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://aws.amazon.com/freertos + * http://www.FreeRTOS.org + */ + +/* Standard includes. */ +#include +#include + +/* Demo config. */ +#include "defender_demo_config.h" + +/* Metrics collector. */ +#include "metrics_collector.h" + +/* Report builder. */ +#include "report_builder.h" + +/* MQTT operations. */ +#include "mqtt_demo_helpers.h" + +/* JSON Library. */ +#include "core_json.h" + +/* Device Defender Client Library. */ +#include "defender.h" + +/** + * @brief Predefined thing name. + * + * This is the example predefine thing name and could be compiled in ROM code. + */ +#define THING_NAME clientcredentialIOT_THING_NAME + +/** + * @brief The length of #THING_NAME. + */ +#define THING_NAME_LENGTH ( ( uint16_t ) ( sizeof( THING_NAME ) - 1 ) ) + +/** + * @brief Number of seconds to wait for the response from AWS IoT Device + * Defender service. + */ +#define DEFENDER_RESPONSE_WAIT_SECONDS ( 2 ) + +/** + * @brief The maximum number of times to run the loop in this demo. + */ +#ifndef DEFENDER_DEMO_MAX_ATTEMPTS + #define DEFENDER_DEMO_MAX_ATTEMPTS ( 3 ) +#endif + +/** + * @brief Time in ticks to wait between each iteration of the demo execution, + * in case a retry is required from demo execution failure. + */ +#define DELAY_BETWEEEN_DEMO_ATTEMPTS_TICKS ( pdMS_TO_TICKS( 5000U ) ) + +/** + * @brief Status values of the device defender report. + */ +typedef enum +{ + ReportStatusNotReceived, + ReportStatusAccepted, + ReportStatusRejected +} ReportStatus_t; +/*-----------------------------------------------------------*/ + +/** + * @brief The MQTT context used for MQTT operation. + */ +static MQTTContext_t mqttContext; + +/** + * @brief The network context used for OpenSSL operation. + */ +static NetworkContext_t networkContext; + +/** + * @brief Static buffer used to hold MQTT messages being sent and received. + */ +static uint8_t sharedBuffer[ NETWORK_BUFFER_SIZE ]; + +/** + * @brief Static buffer used to hold MQTT messages being sent and received. + */ +static MQTTFixedBuffer_t xBuffer = +{ + sharedBuffer, + NETWORK_BUFFER_SIZE +}; + +/** + * @brief Network Stats. + */ +static NetworkStats_t networkStats; + +/** + * @brief Open TCP ports array. + */ +static uint16_t openTcpPorts[ OPEN_TCP_PORTS_ARRAY_SIZE ]; + +/** + * @brief Open UDP ports array. + */ +static uint16_t openUdpPorts[ OPEN_UDP_PORTS_ARRAY_SIZE ]; + +/** + * @brief Established connections array. + */ +static Connection_t establishedConnections[ ESTABLISHED_CONNECTIONS_ARRAY_SIZE ]; + +/** + * @brief All the metrics sent in the device defender report. + */ +static ReportMetrics_t deviceMetrics; + +/** + * @brief Report status. + */ +static ReportStatus_t reportStatus; + +/** + * @brief Buffer for generating the device defender report. + */ +static char deviceMetricsJsonReport[ DEVICE_METRICS_REPORT_BUFFER_SIZE ]; + +/** + * @brief Report Id sent in the defender report. + */ +static uint32_t reportId = 0; +/*-----------------------------------------------------------*/ + +/** + * @brief Callback to receive the incoming publish messages from the MQTT broker. + * + * @param[in] pMqttContext MQTT context pointer. + * @param[in] pPacketInfo Information on the type of incoming MQTT packet. + * @param[in] pDeserializedInfo Deserialized information from incoming packet. + */ +static void publishCallback( MQTTContext_t * pMqttContext, + MQTTPacketInfo_t * pPacketInfo, + MQTTDeserializedInfo_t * pDeserializedInfo ); + +/** + * @brief Collect all the metrics to be sent in the device defender report. + * + * @return pdPASS if all the metrics are successfully collected; + * pdFAIL otherwise. + */ +static BaseType_t collectDeviceMetrics( void ); + +/** + * @brief Generate the device defender report. + * + * @param[out] pOutReportLength Length of the device defender report. + * + * @return pdPASS if the report is generated successfully; + * pdFAIL otherwise. + */ +static BaseType_t generateDeviceMetricsReport( uint32_t * pOutReportLength ); + +/** + * @brief Subscribe to the device defender topics. + * + * @param[in] pMqttContext MQTT context pointer. + * + * @return pdPASS if the subscribe is successful; + * pdFAIL otherwise. + */ +static BaseType_t subscribeToDefenderTopics( MQTTContext_t * pMqttContext ); + +/** + * @brief Unsubscribe from the device defender topics. + * + * @param[in] pMqttContext MQTT context pointer. + * + * @return pdPASS if the unsubscribe is successful; + * pdFAIL otherwise. + */ +static BaseType_t unsubscribeFromDefenderTopics( MQTTContext_t * pMqttContext ); + +/** + * @brief Validate the response received from the AWS IoT Device Defender Service. + * + * This functions checks that a valid JSON is received and the value of reportId + * is same as was sent in the published report. + * + * @param[in] defenderResponse The defender response to validate. + * @param[in] defenderResponseLength Length of the defender response. + * + * @return true if the response is valid; + * false otherwise. + */ +static bool validateDefenderResponse( const char * defenderResponse, + uint32_t defenderResponseLength ); +/*-----------------------------------------------------------*/ + +static bool validateDefenderResponse( const char * defenderResponse, + uint32_t defenderResponseLength ) +{ + bool status = false; + JSONStatus_t jsonResult = JSONSuccess; + char * reportIdString = NULL; + size_t reportIdStringLength; + uint32_t reportIdInResponse; + + /* Is the response a valid JSON? */ + jsonResult = JSON_Validate( defenderResponse, defenderResponseLength ); + + if( jsonResult != JSONSuccess ) + { + LogError( ( "Invalid response from AWS IoT Device Defender Service: %.*s.", + ( int ) defenderResponseLength, + defenderResponse ) ); + } + + if( jsonResult == JSONSuccess ) + { + /* Search the reportId key in the response. */ + jsonResult = JSON_Search( ( char * ) defenderResponse, + defenderResponseLength, + "reportId", + sizeof( "reportId" ) - 1, + &( reportIdString ), + &( reportIdStringLength ) ); + + if( jsonResult != JSONSuccess ) + { + LogError( ( "reportId key not found in the response from the" + "AWS IoT Device Defender Service: %.*s.", + ( int ) defenderResponseLength, + defenderResponse ) ); + } + } + + if( jsonResult == JSONSuccess ) + { + reportIdInResponse = ( uint32_t ) strtoul( reportIdString, NULL, 10 ); + + /* Is the reportId present in the response same as was sent in the + * published report? */ + if( reportIdInResponse == reportId ) + { + LogInfo( ( "A valid response with reportId %u received from the " + "AWS IoT Device Defender Service.", reportId ) ); + status = true; + } + else + { + LogError( ( "Unexpected reportId found in the response from the AWS" + "IoT Device Defender Service. Expected: %u, Found: %u, " + "Complete Response: %.*s.", + reportIdInResponse, + reportId, + ( int ) defenderResponseLength, + defenderResponse ) ); + } + } + + return status; +} +/*-----------------------------------------------------------*/ + +static void publishCallback( MQTTContext_t * pMqttContext, + MQTTPacketInfo_t * pPacketInfo, + MQTTDeserializedInfo_t * pDeserializedInfo ) +{ + DefenderStatus_t status; + DefenderTopic_t api; + bool validationResult; + MQTTPublishInfo_t * pPublishInfo = pDeserializedInfo->pPublishInfo; + + /* Silence compiler warnings about unused variables. */ + ( void ) pMqttContext; + + /* Handle incoming publish. The lower 4 bits of the publish packet + * type is used for the dup, QoS, and retain flags. Hence masking + * out the lower bits to check if the packet is publish. */ + if( ( pPacketInfo->type & 0xF0U ) == MQTT_PACKET_TYPE_PUBLISH ) + { + status = Defender_MatchTopic( pPublishInfo->pTopicName, + pPublishInfo->topicNameLength, + &( api ), + NULL, + NULL ); + + if( status == DefenderSuccess ) + { + if( api == DefenderJsonReportAccepted ) + { + /* Check if the response is valid and is for the report we published. */ + validationResult = validateDefenderResponse( pPublishInfo->pPayload, + pPublishInfo->payloadLength ); + + if( validationResult == true ) + { + LogInfo( ( "The defender report was accepted by the service. Response: %.*s.", + ( int ) pPublishInfo->payloadLength, + ( const char * ) pPublishInfo->pPayload ) ); + reportStatus = ReportStatusAccepted; + } + } + else if( api == DefenderJsonReportRejected ) + { + /* Check if the response is valid and is for the report we published. */ + validationResult = validateDefenderResponse( pPublishInfo->pPayload, + pPublishInfo->payloadLength ); + + if( validationResult == true ) + { + LogError( ( "The defender report was rejected by the service. Response: %.*s.", + ( int ) pPublishInfo->payloadLength, + ( const char * ) pPublishInfo->pPayload ) ); + reportStatus = ReportStatusRejected; + } + } + else + { + LogError( ( "Unexpected defender API : %d.", api ) ); + } + } + else + { + LogError( ( "Unexpected publish message received. Topic: %.*s, Payload: %.*s.", + ( int ) pPublishInfo->topicNameLength, + ( const char * ) pPublishInfo->pTopicName, + ( int ) pPublishInfo->payloadLength, + ( const char * ) ( pPublishInfo->pPayload ) ) ); + } + } + else + { + vHandleOtherIncomingPacket( pPacketInfo, pDeserializedInfo->packetIdentifier ); + } +} +/*-----------------------------------------------------------*/ + +static BaseType_t collectDeviceMetrics( void ) +{ + BaseType_t status = pdFAIL; + MetricsCollectorStatus_t metricsCollectorStatus; + uint32_t numOpenTcpPorts, numOpenUdpPorts, numEstablishedConnections; + + /* Collect bytes and packets sent and received. */ + metricsCollectorStatus = GetNetworkStats( &( networkStats ) ); + + if( metricsCollectorStatus != MetricsCollectorSuccess ) + { + LogError( ( "GetNetworkStats failed. Status: %d.", + metricsCollectorStatus ) ); + } + + /* Collect a list of open TCP ports. */ + if( metricsCollectorStatus == MetricsCollectorSuccess ) + { + metricsCollectorStatus = GetOpenTcpPorts( &( openTcpPorts[ 0 ] ), + OPEN_TCP_PORTS_ARRAY_SIZE, + &( numOpenTcpPorts ) ); + + if( metricsCollectorStatus != MetricsCollectorSuccess ) + { + LogError( ( "GetOpenTcpPorts failed. Status: %d.", + metricsCollectorStatus ) ); + } + } + + /* Collect a list of open UDP ports. */ + if( metricsCollectorStatus == MetricsCollectorSuccess ) + { + metricsCollectorStatus = GetOpenUdpPorts( &( openUdpPorts[ 0 ] ), + OPEN_UDP_PORTS_ARRAY_SIZE, + &( numOpenUdpPorts ) ); + + if( metricsCollectorStatus != MetricsCollectorSuccess ) + { + LogError( ( "GetOpenUdpPorts failed. Status: %d.", + metricsCollectorStatus ) ); + } + } + + /* Collect a list of established connections. */ + if( metricsCollectorStatus == MetricsCollectorSuccess ) + { + metricsCollectorStatus = GetEstablishedConnections( &( establishedConnections[ 0 ] ), + ESTABLISHED_CONNECTIONS_ARRAY_SIZE, + &( numEstablishedConnections ) ); + + if( metricsCollectorStatus != MetricsCollectorSuccess ) + { + LogError( ( "GetEstablishedConnections failed. Status: %d.", + metricsCollectorStatus ) ); + } + } + + /* Populate device metrics. */ + if( metricsCollectorStatus == MetricsCollectorSuccess ) + { + status = pdPASS; + deviceMetrics.pNetworkStats = &( networkStats ); + deviceMetrics.pOpenTcpPortsArray = &( openTcpPorts[ 0 ] ); + deviceMetrics.openTcpPortsArrayLength = numOpenTcpPorts; + deviceMetrics.pOpenUdpPortsArray = &( openUdpPorts[ 0 ] ); + deviceMetrics.openUdpPortsArrayLength = numOpenUdpPorts; + deviceMetrics.pEstablishedConnectionsArray = &( establishedConnections[ 0 ] ); + deviceMetrics.establishedConnectionsArrayLength = numEstablishedConnections; + } + + return status; +} +/*-----------------------------------------------------------*/ + +static BaseType_t subscribeToDefenderTopics( MQTTContext_t * pMqttContext ) +{ + BaseType_t status = pdFAIL; + + status = SubscribeToTopic( pMqttContext, + DEFENDER_API_JSON_ACCEPTED( THING_NAME ), + DEFENDER_API_LENGTH_JSON_ACCEPTED( THING_NAME_LENGTH ) ); + + if( status == pdPASS ) + { + status = SubscribeToTopic( pMqttContext, + DEFENDER_API_JSON_REJECTED( THING_NAME ), + DEFENDER_API_LENGTH_JSON_REJECTED( THING_NAME_LENGTH ) ); + } + + return status; +} +/*-----------------------------------------------------------*/ + +static BaseType_t unsubscribeFromDefenderTopics( MQTTContext_t * pMqttContext ) +{ + BaseType_t status = pdFAIL; + + status = UnsubscribeFromTopic( pMqttContext, + DEFENDER_API_JSON_ACCEPTED( THING_NAME ), + DEFENDER_API_LENGTH_JSON_ACCEPTED( THING_NAME_LENGTH ) ); + + if( status == pdPASS ) + { + status = UnsubscribeFromTopic( pMqttContext, + DEFENDER_API_JSON_REJECTED( THING_NAME ), + DEFENDER_API_LENGTH_JSON_REJECTED( THING_NAME_LENGTH ) ); + } + + return status; +} +/*-----------------------------------------------------------*/ + +static BaseType_t generateDeviceMetricsReport( uint32_t * pOutReportLength ) +{ + BaseType_t status = pdFAIL; + ReportBuilderStatus_t reportBuilderStatus; + + /* Generate the metrics report in the format expected by the AWS IoT Device + * Defender Service. */ + reportBuilderStatus = GenerateJsonReport( &( deviceMetricsJsonReport[ 0 ] ), + DEVICE_METRICS_REPORT_BUFFER_SIZE, + &( deviceMetrics ), + DEVICE_METRICS_REPORT_MAJOR_VERSION, + DEVICE_METRICS_REPORT_MINOR_VERSION, + reportId, + pOutReportLength ); + + if( reportBuilderStatus != ReportBuilderSuccess ) + { + LogError( ( "GenerateJsonReport failed. Status: %d.", + reportBuilderStatus ) ); + } + else + { + LogDebug( ( "Generated Report: %.*s.", + *pOutReportLength, + &( deviceMetricsJsonReport[ 0 ] ) ) ); + status = pdPASS; + } + + return status; +} +/*-----------------------------------------------------------*/ + +/** + * @brief The function that runs the Defender demo, called by the demo runner. + * + * @param[in] awsIotMqttMode Ignored for the Defender demo. + * @param[in] pIdentifier Ignored for the Defender demo. + * @param[in] pNetworkServerInfo Ignored for the Defender demo. + * @param[in] pNetworkCredentialInfo Ignored for the Defender demo. + * @param[in] pNetworkInterface Ignored for the Defender demo. + * + * @return `EXIT_SUCCESS` if the demo completes successfully; `EXIT_FAILURE` otherwise. + */ + +int RunDeviceDefenderDemo( bool awsIotMqttMode, + const char * pIdentifier, + void * pNetworkServerInfo, + void * pNetworkCredentialInfo, + const void * pNetworkInterface ) +{ + BaseType_t demoStatus = pdFAIL; + uint32_t reportLength = 0UL, i, mqttSessionEstablished = 0UL; + UBaseType_t demoRunCount = 0; + BaseType_t retryDemoLoop = pdFALSE; + + ( void ) awsIotMqttMode; + ( void ) pIdentifier; + ( void ) pNetworkServerInfo; + ( void ) pNetworkCredentialInfo; + ( void ) pNetworkInterface; + + /* This demo runs a single loop unless there are failures in the demo execution. + * In case of failures in the demo execution, demo loop will be retried for up to + * DEFENDER_DEMO_MAX_ATTEMPTS times. */ + do + { + /* Start with report not received. */ + reportStatus = ReportStatusNotReceived; + + /* Set a report Id to be used. + * + * !!!NOTE!!! + * This demo sets the report ID to xTaskGetTickCount(), which may collide + * if the device is reset. Reports for a Thing with a previously used + * report ID will be assumed to be duplicates and discarded by the Device + * Defender service. The report ID needs to be unique per report sent with + * a given Thing. We recommend using an increasing unique id such as the + * current timestamp. */ + reportId = ( uint32_t ) xTaskGetTickCount(); + + LogInfo( ( "Establishing MQTT session..." ) ); + demoStatus = EstablishMqttSession( &mqttContext, + &networkContext, + &xBuffer, + publishCallback ); + + if( demoStatus == pdFAIL ) + { + LogError( ( "Failed to establish MQTT session." ) ); + } + else + { + mqttSessionEstablished = 1; + } + + if( demoStatus == pdPASS ) + { + LogInfo( ( "Subscribing to defender topics..." ) ); + demoStatus = subscribeToDefenderTopics( &mqttContext ); + + if( demoStatus == pdFAIL ) + { + LogError( ( "Failed to subscribe to defender topics." ) ); + } + } + + if( demoStatus == pdPASS ) + { + LogInfo( ( "Collecting device metrics..." ) ); + demoStatus = collectDeviceMetrics(); + + if( demoStatus == pdFAIL ) + { + LogError( ( "Failed to collect device metrics." ) ); + } + } + + if( demoStatus == pdPASS ) + { + LogInfo( ( "Generating device defender report..." ) ); + demoStatus = generateDeviceMetricsReport( &( reportLength ) ); + + if( demoStatus == pdFAIL ) + { + LogError( ( "Failed to generate device defender report." ) ); + } + } + + if( demoStatus == pdPASS ) + { + LogInfo( ( "Publishing device defender report..." ) ); + demoStatus = PublishToTopic( &mqttContext, + DEFENDER_API_JSON_PUBLISH( THING_NAME ), + DEFENDER_API_LENGTH_JSON_PUBLISH( THING_NAME_LENGTH ), + &( deviceMetricsJsonReport[ 0 ] ), + reportLength ); + + if( demoStatus == pdFAIL ) + { + LogError( ( "Failed to publish device defender report." ) ); + } + } + + if( demoStatus == pdPASS ) + { + /* Note that PublishToTopic already called MQTT_ProcessLoop, therefore + * responses may have been received and the publishCallback may have + * been called. */ + for( i = 0; i < DEFENDER_RESPONSE_WAIT_SECONDS; i++ ) + { + /* reportStatus is updated in the publishCallback. */ + if( reportStatus != ReportStatusNotReceived ) + { + break; + } + + ( void ) ProcessLoop( &mqttContext, 1000 ); + } + } + + if( reportStatus == ReportStatusNotReceived ) + { + LogError( ( "Failed to receive response from AWS IoT Device Defender Service." ) ); + demoStatus = pdFAIL; + } + + /* Unsubscribe and disconnect if MQTT session was established. Per the MQTT + * protocol spec, it is okay to send UNSUBSCRIBE even if no corresponding + * subscription exists on the broker. Therefore, it is okay to attempt + * unsubscribe even if one more subscribe failed earlier. */ + if( mqttSessionEstablished == 1 ) + { + LogInfo( ( "Unsubscribing from defender topics..." ) ); + demoStatus = unsubscribeFromDefenderTopics( &mqttContext ); + + if( demoStatus == pdFAIL ) + { + LogError( ( "Failed to unsubscribe from defender topics." ) ); + } + + LogInfo( ( "Closing MQTT session..." ) ); + ( void ) DisconnectMqttSession( &mqttContext, &networkContext ); + } + + /* Increment the demo run count. */ + demoRunCount++; + + if( ( demoStatus == pdPASS ) && ( reportStatus == ReportStatusAccepted ) ) + { + LogInfo( ( "Demo completed successfully." ) ); + + /* Reset the flag for demo retry. */ + retryDemoLoop = pdFALSE; + } + else + { + demoStatus = pdFAIL; + + if( demoRunCount < DEFENDER_DEMO_MAX_ATTEMPTS ) + { + LogWarn( ( "Demo iteration %lu failed. Retrying...", + ( unsigned long ) demoRunCount ) ); + retryDemoLoop = pdTRUE; + + /* Clear the flag indicating successful MQTT session establishment + * before attempting a retry. */ + mqttSessionEstablished = 0; + + LogInfo( ( "A short delay before the next demo iteration." ) ); + vTaskDelay( DELAY_BETWEEEN_DEMO_ATTEMPTS_TICKS ); + } + else + { + LogError( ( "All %lu demo iterations failed.", + ( unsigned long ) DEFENDER_DEMO_MAX_ATTEMPTS ) ); + retryDemoLoop = pdFALSE; + } + } + } while( retryDemoLoop == pdTRUE ); + + return( ( demoStatus == pdPASS ) ? EXIT_SUCCESS : EXIT_FAILURE ); +} +/*-----------------------------------------------------------*/ diff --git a/demos/device_defender_for_aws/metrics_collector.h b/demos/device_defender_for_aws/metrics_collector.h new file mode 100644 index 00000000000..b069394370e --- /dev/null +++ b/demos/device_defender_for_aws/metrics_collector.h @@ -0,0 +1,140 @@ +/* + * FreeRTOS V202012.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://aws.amazon.com/freertos + * http://www.FreeRTOS.org + */ + +#ifndef __METRICS_COLLECTOR_H__ +#define __METRICS_COLLECTOR_H__ + +/* Standard includes. */ +#include + +/** + * @brief Return codes from metrics collector APIs. + */ +typedef enum +{ + MetricsCollectorSuccess = 0, + MetricsCollectorBadParameter, + MetricsCollectorCollectionFailed +} MetricsCollectorStatus_t; + +/** + * @brief Represents network stats. + */ +typedef struct NetworkStats +{ + uint32_t bytesReceived; /* Number of bytes received. */ + uint32_t bytesSent; /* Number of bytes sent. */ + uint32_t packetsReceived; /* Number of TCP packets received. */ + uint32_t packetsSent; /* Number of TCP packets sent. */ +} NetworkStats_t; + +/** + * @brief Represents a network connection. + */ +typedef struct Connection +{ + uint32_t localIp; + uint32_t remoteIp; + uint16_t localPort; + uint16_t remotePort; +} Connection_t; + +/** + * @brief Get network stats. + * + * @param[out] pOutNetworkStats The network stats. + * + * @return #MetricsCollectorSuccess if the network stats are successfully obtained; + * #MetricsCollectorBadParameter if invalid parameters are passed; + * #MetricsCollectorCollectionFailed if the collection methods failed. + */ +MetricsCollectorStatus_t GetNetworkStats( NetworkStats_t * pOutNetworkStats ); + +/** + * @brief Get a list of the open TCP ports. + * + * This function can be called with @p pOutTcpPortsArray NULL to get the number + * of the open TCP ports. + * + * @param[in] pOutTcpPortsArray The array to write the open TCP ports into. This + * can be NULL, if only the number of open ports is needed. + * @param[in] tcpPortsArrayLength Length of the pOutTcpPortsArray, if it is not + * NULL. + * @param[out] pOutNumTcpOpenPorts Number of open TCP ports if @p + * pOutTcpPortsArray NULL, else number of TCP ports written. + * + * @return #MetricsCollectorSuccess if open TCP ports are successfully obtained; + * #MetricsCollectorBadParameter if invalid parameters are passed; + * #MetricsCollectorCollectionFailed if the collection methods failed. + */ +MetricsCollectorStatus_t GetOpenTcpPorts( uint16_t * pOutTcpPortsArray, + uint32_t tcpPortsArrayLength, + uint32_t * pOutNumTcpOpenPorts ); + +/** + * @brief Get a list of the open UDP ports. + * + * This function can be called with @p pOutUdpPortsArray NULL to get the number + * of the open UDP ports. + * + * @param[in] pOutUdpPortsArray The array to write the open UDP ports into. Can + * be NULL, if only number of open ports is needed. + * @param[in] udpPortsArrayLength Length of the pOutUdpPortsArray, if it is not + * NULL. + * @param[out] pOutNumUdpOpenPorts Number of open UDP ports if @p + * pOutUdpPortsArray NULL, else number of UDP ports written. + * + * @return #MetricsCollectorSuccess if open UDP ports are successfully obtained; + * #MetricsCollectorBadParameter if invalid parameters are passed; + * #MetricsCollectorCollectionFailed if the collection methods failed. + */ +MetricsCollectorStatus_t GetOpenUdpPorts( uint16_t * pOutUdpPortsArray, + uint32_t udpPortsArrayLength, + uint32_t * pOutNumUdpOpenPorts ); + +/** + * @brief Get a list of established connections. + * + * This function can be called with @p pOutConnectionsArray NULL to get the + * number of established connections. + * + * @param[in] pOutConnectionsArray The array to write the established connections + * into. This can be NULL, if only the number of established connections is + * needed. + * @param[in] connectionsArrayLength Length of the pOutConnectionsArray, if it + * is not NULL. + * @param[out] pOutNumEstablishedConnections Number of the established connections. + * @param[out] pOutNumEstablishedConnections Number of established connections if @p + * pOutNumEstablishedConnections NULL, else number of established connections written. + * + * @return #MetricsCollectorSuccess if established connections are successfully obtained; + * #MetricsCollectorBadParameter if invalid parameters are passed; + * #MetricsCollectorCollectionFailed if the collection methods failed. + */ +MetricsCollectorStatus_t GetEstablishedConnections( Connection_t * pOutConnectionsArray, + uint32_t connectionsArrayLength, + uint32_t * pOutNumEstablishedConnections ); + +#endif /* __METRICS_COLLECTOR_H__ */ diff --git a/demos/device_defender_for_aws/metrics_collector/freertos_plus_tcp/metrics_collector.c b/demos/device_defender_for_aws/metrics_collector/freertos_plus_tcp/metrics_collector.c new file mode 100644 index 00000000000..3912fcaf993 --- /dev/null +++ b/demos/device_defender_for_aws/metrics_collector/freertos_plus_tcp/metrics_collector.c @@ -0,0 +1,252 @@ +/* + * FreeRTOS V202012.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://aws.amazon.com/freertos + * https://www.FreeRTOS.org + */ + +/** + * @file metrics_collector.c + * + * @brief Functions used by the defender demo to collect metrics on the + * device's open ports and sockets. FreeRTOS+TCP tcp_netstat utility + * is used to collect this metrics. + */ + +/* Standard includes. */ +#include +#include +#include +#include +#include + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "FreeRTOS_IP.h" + +/* FreeRTOS+TCP tcp_netstat utility include. */ +#include "tcp_netstat.h" + +/* Demo config. */ +#include "defender_demo_config.h" + +/* Interface include. */ +#include "metrics_collector.h" +/*-----------------------------------------------------------*/ + +MetricsCollectorStatus_t GetNetworkStats( NetworkStats_t * pOutNetworkStats ) +{ + MetricsCollectorStatus_t status = MetricsCollectorCollectionFailed; + + MetricsType_t metrics = { 0 }; + BaseType_t metricsStatus = 0; + + configASSERT( pOutNetworkStats != NULL ); + + /* Start with everything as zero. */ + memset( pOutNetworkStats, 0, sizeof( NetworkStats_t ) ); + + /* Get metrics from FreeRTOS+TCP tcp_netstat utility. */ + metricsStatus = vGetMetrics( &metrics ); + + if( metricsStatus == 0 ) + { + /* Fill our response with values gotten from FreeRTOS+TCP. */ + LogDebug( ( "Network stats read. Bytes received: %u, packets received: %u, " + "bytes sent: %u, packets sent: %u.", + ( unsigned int ) metrics.xInput.uxByteCount, + ( unsigned int ) metrics.xInput.uxPacketCount, + ( unsigned int ) metrics.xOutput.uxByteCount, + ( unsigned int ) metrics.xOutput.uxPacketCount ) ); + + pOutNetworkStats->bytesReceived = metrics.xInput.uxByteCount; + pOutNetworkStats->packetsReceived = metrics.xInput.uxPacketCount; + pOutNetworkStats->bytesSent = metrics.xOutput.uxByteCount; + pOutNetworkStats->packetsSent = metrics.xOutput.uxPacketCount; + + status = MetricsCollectorSuccess; + } + + return status; +} +/*-----------------------------------------------------------*/ + +MetricsCollectorStatus_t GetOpenTcpPorts( uint16_t * pOutTcpPortsArray, + uint32_t tcpPortsArrayLength, + uint32_t * pOutNumTcpOpenPorts ) +{ + MetricsCollectorStatus_t status = MetricsCollectorCollectionFailed; + + MetricsType_t metrics = { 0 }; + BaseType_t metricsStatus = 0; + uint32_t copyAmount = 0UL; + + /* pOutTcpPortsArray can be NULL. */ + configASSERT( pOutNumTcpOpenPorts != NULL ); + + /* Get metrics from FreeRTOS+TCP tcp_netstat utility. */ + metricsStatus = vGetMetrics( &metrics ); + + if( metricsStatus == 0 ) + { + /* Fill the output array with as many TCP ports as will fit in the + * given array. */ + if( pOutTcpPortsArray != NULL ) + { + copyAmount = metrics.xTCPPortList.uxCount; + + /* Limit the copied ports to what can fit in the output array. */ + if( tcpPortsArrayLength < metrics.xTCPPortList.uxCount ) + { + LogWarn( ( "Ports returned truncated due to insufficient buffer size." ) ); + copyAmount = tcpPortsArrayLength; + } + + memcpy( pOutTcpPortsArray, &metrics.xTCPPortList.usTCPPortList, copyAmount * sizeof( uint16_t ) ); + + /* Return the number of elements copied to the array. */ + *pOutNumTcpOpenPorts = copyAmount; + } + else + { + /* Return the total number of open ports. */ + *pOutNumTcpOpenPorts = metrics.xTCPPortList.uxCount; + } + + status = MetricsCollectorSuccess; + } + + return status; +} +/*-----------------------------------------------------------*/ + +MetricsCollectorStatus_t GetOpenUdpPorts( uint16_t * pOutUdpPortsArray, + uint32_t udpPortsArrayLength, + uint32_t * pOutNumUdpOpenPorts ) +{ + MetricsCollectorStatus_t status = MetricsCollectorCollectionFailed; + + MetricsType_t metrics = { 0 }; + BaseType_t metricsStatus = 0; + uint32_t copyAmount = 0UL; + + /* pOutUdpPortsArray can be NULL. */ + configASSERT( pOutNumUdpOpenPorts != NULL ); + + /* Get metrics from FreeRTOS+TCP tcp_netstat utility. */ + metricsStatus = vGetMetrics( &metrics ); + + if( metricsStatus == 0 ) + { + /* Fill the output array with as many UDP ports as will fit in the + * given array. */ + if( pOutUdpPortsArray != NULL ) + { + copyAmount = metrics.xUDPPortList.uxCount; + + /* Limit the copied ports to what can fit in the output array. */ + if( udpPortsArrayLength < metrics.xUDPPortList.uxCount ) + { + LogWarn( ( "Ports returned truncated due to insufficient buffer size." ) ); + copyAmount = udpPortsArrayLength; + } + + memcpy( pOutUdpPortsArray, &metrics.xUDPPortList.usUDPPortList, copyAmount * sizeof( uint16_t ) ); + + /* Return the number of elements copied to the array. */ + *pOutNumUdpOpenPorts = copyAmount; + } + else + { + /* Return the total number of open ports. */ + *pOutNumUdpOpenPorts = metrics.xUDPPortList.uxCount; + } + + status = MetricsCollectorSuccess; + } + + return status; +} + +/*-----------------------------------------------------------*/ + +MetricsCollectorStatus_t GetEstablishedConnections( Connection_t * pOutConnectionsArray, + uint32_t connectionsArrayLength, + uint32_t * pOutNumEstablishedConnections ) +{ + MetricsCollectorStatus_t status = MetricsCollectorCollectionFailed; + + MetricsType_t metrics = { 0 }; + BaseType_t metricsStatus = 0; + uint32_t copyAmount = 0UL; + uint32_t localIp = 0UL; + uint32_t i; + + /* pOutConnectionsArray can be NULL. */ + configASSERT( pOutNumEstablishedConnections != NULL ); + + /* Get metrics from FreeRTOS+TCP tcp_netstat utility. */ + metricsStatus = vGetMetrics( &metrics ); + + if( metricsStatus == 0 ) + { + /* Fill the output array with as many TCP socket infos as will fit in + * the given array. */ + if( pOutConnectionsArray != NULL ) + { + copyAmount = metrics.xTCPSocketList.uxCount; + + /* Get local IP as the tcp_netstat utility does not give it. */ + localIp = FreeRTOS_GetIPAddress(); + + /* Limit the outputted connections to what can fit in the output array. */ + if( connectionsArrayLength < metrics.xTCPSocketList.uxCount ) + { + LogWarn( ( "Ports returned truncated due to insufficient buffer size." ) ); + copyAmount = connectionsArrayLength; + } + + for( i = 0; i < copyAmount; i++ ) + { + pOutConnectionsArray[ i ].localIp = localIp; + pOutConnectionsArray[ i ].localPort = + metrics.xTCPSocketList.xTCPList[ i ].usLocalPort; + pOutConnectionsArray[ i ].remoteIp = + metrics.xTCPSocketList.xTCPList[ i ].ulRemoteIP; + pOutConnectionsArray[ i ].remotePort = + metrics.xTCPSocketList.xTCPList[ i ].usRemotePort; + } + + /* Return the number of elements copied to the array. */ + *pOutNumEstablishedConnections = copyAmount; + } + else + { + /* Return the total number of established connections. */ + *pOutNumEstablishedConnections = metrics.xTCPSocketList.uxCount; + } + + status = MetricsCollectorSuccess; + } + + return status; +} +/*-----------------------------------------------------------*/ diff --git a/demos/device_defender_for_aws/metrics_collector/lwip/metrics_collector.c b/demos/device_defender_for_aws/metrics_collector/lwip/metrics_collector.c new file mode 100644 index 00000000000..33468e053ed --- /dev/null +++ b/demos/device_defender_for_aws/metrics_collector/lwip/metrics_collector.c @@ -0,0 +1,292 @@ +/* + * FreeRTOS V202012.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://aws.amazon.com/freertos + * http://www.FreeRTOS.org + */ + +/* Standard includes. */ +#include + +/* Demo config. */ +#include "defender_demo_config.h" + +/* Interface includes. */ +#include "metrics_collector.h" + +/* Lwip includes. */ +#include "lwip/arch.h" +#include "lwip/stats.h" +#include "lwip/tcpip.h" /* #define LOCK_TCPIP_CORE() sys_mutex_lock(&lock_tcpip_core) */ +#include "lwip/ip_addr.h" /* ip_addr_t, ipaddr_ntoa, ip_addr_copy */ +#include "lwip/tcp.h" /* struct tcp_pcb */ +#include "lwip/udp.h" /* struct udp_pcb */ +#include "lwip/priv/tcp_priv.h" /* tcp_listen_pcbs_t */ + +/* Lwip configuration includes. */ +#include "lwipopts.h" +#include "netif_port.h" + +#if !defined( LWIP_TCPIP_CORE_LOCKING ) || ( LWIP_TCPIP_CORE_LOCKING == 0 ) + #error "Network metrics are only supported in core locking mode. Please define LWIP_TCPIP_CORE_LOCKING to 1 in lwipopts.h." +#endif + +/* Helper macros to get bytes in/out and packets in/out. */ +#define LWIP_GET_PACKETS_IN() ( lwip_stats.mib2.ipinreceives ) +#define LWIP_GET_PACKETS_OUT() ( lwip_stats.mib2.ipoutrequests ) +#if ( LWIP_BYTES_IN_OUT_UNSUPPORTED == 0 ) + #define LWIP_GET_BYTES_IN() ( LWIP_NET_IF.mib2_counters.ifinoctets ) + #define LWIP_GET_BYTES_OUT() ( LWIP_NET_IF.mib2_counters.ifoutoctets ) +#else + #define LWIP_GET_BYTES_IN() ( 0 ) + #define LWIP_GET_BYTES_OUT() ( 0 ) +#endif /* LWIP_BYTES_IN_OUT_UNSUPPORTED == 1 */ + +/* Variables defined in the LWIP source code. */ +extern struct tcp_pcb * tcp_active_pcbs; /* List of all TCP PCBs that are in a state in which they accept or send data. */ +extern union tcp_listen_pcbs_t tcp_listen_pcbs; /* List of all TCP PCBs in LISTEN state. */ +extern struct udp_pcb * udp_pcbs; /* List of UDP PCBs. */ +/*-----------------------------------------------------------*/ + +MetricsCollectorStatus_t GetNetworkStats( NetworkStats_t * pOutNetworkStats ) +{ + MetricsCollectorStatus_t status = MetricsCollectorSuccess; + + if( pOutNetworkStats == NULL ) + { + LogError( ( "Invalid parameters. pOutNetworkStats: 0x%08x", pOutNetworkStats ) ); + status = MetricsCollectorBadParameter; + } + + if( status == MetricsCollectorSuccess ) + { + LOCK_TCPIP_CORE(); + + pOutNetworkStats->bytesReceived = LWIP_GET_BYTES_IN(); + pOutNetworkStats->bytesSent = LWIP_GET_BYTES_OUT(); + pOutNetworkStats->packetsReceived = LWIP_GET_PACKETS_IN(); + pOutNetworkStats->packetsSent = LWIP_GET_PACKETS_OUT(); + + UNLOCK_TCPIP_CORE(); + } + + return status; +} +/*-----------------------------------------------------------*/ + +MetricsCollectorStatus_t GetOpenTcpPorts( uint16_t * pOutTcpPortsArray, + uint32_t tcpPortsArrayLength, + uint32_t * pOutNumTcpOpenPorts ) +{ + MetricsCollectorStatus_t status = MetricsCollectorSuccess; + struct tcp_pcb_listen * pCurrPcb; + uint16_t pcbCnt = 0; + + if( ( ( pOutTcpPortsArray != NULL ) && ( tcpPortsArrayLength == 0 ) ) || + ( pOutNumTcpOpenPorts == NULL ) ) + { + LogError( ( "Invalid parameters. pOutTcpPortsArray: 0x%08x," + "tcpPortsArrayLength: %u, pOutNumTcpOpenPorts: 0x%08x.", + pOutTcpPortsArray, + tcpPortsArrayLength, + pOutNumTcpOpenPorts ) ); + status = MetricsCollectorBadParameter; + } + + if( status == MetricsCollectorSuccess ) + { + LOCK_TCPIP_CORE(); + + for( pCurrPcb = tcp_listen_pcbs.listen_pcbs; pCurrPcb != NULL; pCurrPcb = pCurrPcb->next ) + { + if( pOutTcpPortsArray != NULL ) + { + if( pcbCnt < tcpPortsArrayLength ) + { + pOutTcpPortsArray[ pcbCnt ] = pCurrPcb->local_port; + ++pcbCnt; + } + else + { + /* Break if the output array is full. */ + break; + } + } + else + { + ++pcbCnt; + } + } + + UNLOCK_TCPIP_CORE(); + } + + if( ( pOutTcpPortsArray != NULL ) && ( pcbCnt == tcpPortsArrayLength ) && ( pCurrPcb != NULL ) ) + { + LogWarn( ( "The pOutTcpPortsArray is not large enough to store all of the open TCP ports." ) ); + } + + if( status == MetricsCollectorSuccess ) + { + *pOutNumTcpOpenPorts = pcbCnt; + } + + return status; +} +/*-----------------------------------------------------------*/ + +MetricsCollectorStatus_t GetOpenUdpPorts( uint16_t * pOutUdpPortsArray, + uint32_t udpPortsArrayLength, + uint32_t * pOutNumUdpOpenPorts ) +{ + MetricsCollectorStatus_t status = MetricsCollectorSuccess; + struct udp_pcb * pCurrPcb; + uint16_t pcbCnt = 0; + + if( ( ( pOutUdpPortsArray != NULL ) && ( udpPortsArrayLength == 0 ) ) || + ( pOutNumUdpOpenPorts == NULL ) ) + { + LogError( ( "Invalid parameters. pOutUdpPortsArray: 0x%08x," + "udpPortsArrayLength: %u, pOutNumUdpOpenPorts: 0x%08x.", + pOutUdpPortsArray, + udpPortsArrayLength, + pOutNumUdpOpenPorts ) ); + status = MetricsCollectorBadParameter; + } + + if( status == MetricsCollectorSuccess ) + { + LOCK_TCPIP_CORE(); + + for( pCurrPcb = udp_pcbs; pCurrPcb != NULL; pCurrPcb = pCurrPcb->next ) + { + if( pOutUdpPortsArray != NULL ) + { + if( pcbCnt < udpPortsArrayLength ) + { + pOutUdpPortsArray[ pcbCnt ] = pCurrPcb->local_port; + ++pcbCnt; + } + else + { + /* Break if the output array is full. */ + break; + } + } + else + { + ++pcbCnt; + } + } + + UNLOCK_TCPIP_CORE(); + } + + if( ( pOutUdpPortsArray != NULL ) && ( pcbCnt == udpPortsArrayLength ) && ( pCurrPcb != NULL ) ) + { + LogWarn( ( "The pOutUdpPortsArray is not large enough to store all of the open UDP ports." ) ); + } + + if( status == MetricsCollectorSuccess ) + { + *pOutNumUdpOpenPorts = pcbCnt; + } + + return status; +} +/*-----------------------------------------------------------*/ + +MetricsCollectorStatus_t GetEstablishedConnections( Connection_t * pOutConnectionsArray, + uint32_t connectionsArrayLength, + uint32_t * pOutNumEstablishedConnections ) +{ + MetricsCollectorStatus_t status = MetricsCollectorSuccess; + struct tcp_pcb * pCurrPcb = tcp_active_pcbs; + uint16_t pcbCnt = 0; + Connection_t * pEstablishedConnection; + + if( ( ( pOutConnectionsArray != NULL ) && ( connectionsArrayLength == 0 ) ) || + ( pOutNumEstablishedConnections == NULL ) ) + { + LogError( ( "Invalid parameters. pOutConnectionsArray: 0x%08x," + " connectionsArrayLength: %u, pOutNumEstablishedConnections: 0x%08x.", + pOutConnectionsArray, + connectionsArrayLength, + pOutNumEstablishedConnections ) ); + status = MetricsCollectorBadParameter; + } + + if( status == MetricsCollectorSuccess ) + { + LOCK_TCPIP_CORE(); + + for( pCurrPcb = tcp_active_pcbs; pCurrPcb != NULL; pCurrPcb = pCurrPcb->next ) + { + if( pOutConnectionsArray != NULL ) + { + if( pcbCnt < connectionsArrayLength ) + { + /* The output array member to fill. */ + pEstablishedConnection = &( pOutConnectionsArray[ pcbCnt ] ); + + #if LWIP_IPV4 && LWIP_IPV6 + pEstablishedConnection->remoteIp = pCurrPcb->remote_ip.u_addr.ip4.addr; /* Network byte order. */ + pEstablishedConnection->localIp = pCurrPcb->local_ip.u_addr.ip4.addr; /* Network byte order. */ + #elif LWIP_IPV4 + pEstablishedConnection->remoteIp = pCurrPcb->remote_ip.addr; /* Network byte order. */ + pEstablishedConnection->localIp = pCurrPcb->local_ip.addr; /* Network byte order. */ + #else + #error "IPV6 only is not supported." + #endif + + pEstablishedConnection->localPort = pCurrPcb->local_port; /* Host byte order. */ + pEstablishedConnection->remotePort = pCurrPcb->remote_port; /* Host byte order. */ + + ++pcbCnt; + } + else + { + /* Break if the output array is full. */ + break; + } + } + else + { + ++pcbCnt; + } + } + + UNLOCK_TCPIP_CORE(); + } + + if( ( pOutConnectionsArray != NULL ) && ( pcbCnt == connectionsArrayLength ) && ( pCurrPcb != NULL ) ) + { + LogWarn( ( "The pOutConnectionsArray is not large enough to store all of the established connections." ) ); + } + + if( status == MetricsCollectorSuccess ) + { + *pOutNumEstablishedConnections = pcbCnt; + } + + return status; +} +/*-----------------------------------------------------------*/ diff --git a/demos/device_defender_for_aws/metrics_collector/lwip/netif_port.h b/demos/device_defender_for_aws/metrics_collector/lwip/netif_port.h new file mode 100644 index 00000000000..de70f72d5cd --- /dev/null +++ b/demos/device_defender_for_aws/metrics_collector/lwip/netif_port.h @@ -0,0 +1,47 @@ +/* + * FreeRTOS V202012.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://aws.amazon.com/freertos + * http://www.FreeRTOS.org + */ + +#ifndef __NETIF_PORT_H__ +#define __NETIF_PORT_H__ + +/* The LWIP network metric bytes-in and bytes-out need the support from LWIP + * network interface port. The bytes counts are implemented in the board + * LWIP network interface port. The metric collector reads the bytes-in and + * bytes-out data from a LWIP netif structure defined in the board LWIP network + */ + +/* Boards netif port configurations. */ +#ifdef MT7697HX_DEV_KIT + /* Extern netif variables from board's port. */ + extern struct netif sta_if, ap_if; + +/* This define is used by metrics_collector.c to read the number of + * bytes-in/out. */ + #define LWIP_NET_IF sta_if +#else + #define LWIP_BYTES_IN_OUT_UNSUPPORTED 1 +#endif + +#endif /* __NETIF_PORT_H__ */ diff --git a/demos/device_defender_for_aws/metrics_collector/stub/metrics_collector.c b/demos/device_defender_for_aws/metrics_collector/stub/metrics_collector.c new file mode 100644 index 00000000000..08363aab5c8 --- /dev/null +++ b/demos/device_defender_for_aws/metrics_collector/stub/metrics_collector.c @@ -0,0 +1,202 @@ +/* + * FreeRTOS V202012.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://aws.amazon.com/freertos + * https://www.FreeRTOS.org + */ + +/** + * @file metrics_collector.c + * + * @brief Functions used by the defender demo to collect networking metrics. + * This file is a stub which returns zero for all metrics. In order to report + * correct metrics, the functions in this file must be implemented for the + * target platform's network stack. + * Here are reference implementations for the FreeRTOS+TCP and LWIP network stacks: + * + * FreeRTOS+TCP: + * If you are using FreeRTOS+TCP, use the metrics_collector.c file + * available at + * [FreeRTOS+TCP metrics_collector implementation](https://github.com/aws/amazon-freertos/blob/master/demos/device_defender_for_aws/metrics_collector/freertos_plus_tcp/metrics_collector.c). + * + * LWIP: + * If you are using LWIP, use the metrics_collector.c available at + * [LWIP metrics_collector implementation](https://github.com/aws/amazon-freertos/blob/master/demos/device_defender_for_aws/metrics_collector/lwip/metrics_collector.c). + * + * In addition, define the following macros in your lwipopts.h: + * #define LINK_SPEED_OF_YOUR_NETIF_IN_BPS 0 + * #define LWIP_TCPIP_CORE_LOCKING 1 + * #define LWIP_STATS 1 + * #define MIB2_STATS 1 + */ + +/* Standard includes. */ +#include +#include + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Demo config. */ +#include "defender_demo_config.h" + +/* Interface include. */ +#include "metrics_collector.h" +/*-----------------------------------------------------------*/ + +MetricsCollectorStatus_t GetNetworkStats( NetworkStats_t * pOutNetworkStats ) +{ + MetricsCollectorStatus_t status = MetricsCollectorSuccess; + + if( pOutNetworkStats == NULL ) + { + status = MetricsCollectorBadParameter; + } + + if( status == MetricsCollectorSuccess ) + { + /* Initialize everything to zero. */ + memset( pOutNetworkStats, 0, sizeof( NetworkStats_t ) ); + + /* Take a look at the comments at the top of this file. */ + LogError( ( "Using stub definition of GetNetworkStats! " + "Please implement for your network stack to get correct metrics." ) ); + + pOutNetworkStats->bytesReceived = 0; + pOutNetworkStats->packetsReceived = 0; + pOutNetworkStats->bytesSent = 0; + pOutNetworkStats->packetsSent = 0; + } + + return status; +} +/*-----------------------------------------------------------*/ + +MetricsCollectorStatus_t GetOpenTcpPorts( uint16_t * pOutTcpPortsArray, + uint32_t tcpPortsArrayLength, + uint32_t * pOutNumTcpOpenPorts ) +{ + MetricsCollectorStatus_t status = MetricsCollectorSuccess; + + /* pOutTcpPortsArray can be NULL. */ + if( pOutNumTcpOpenPorts == NULL ) + { + status = MetricsCollectorBadParameter; + } + + if( status == MetricsCollectorSuccess ) + { + /* Take a look at the comments at the top of this file. */ + LogError( ( "Using stub definition of GetOpenTcpPorts! " + "Please implement for your network stack to get correct metrics." ) ); + + if( pOutTcpPortsArray != NULL ) + { + /* Fill the output array with as many TCP ports as will fit in the + * given array. */ + + /* Return the number of elements copied to the array. */ + *pOutNumTcpOpenPorts = 0; + } + else + { + /* Return the total number of open ports. */ + *pOutNumTcpOpenPorts = 0; + } + } + + return status; +} +/*-----------------------------------------------------------*/ + +MetricsCollectorStatus_t GetOpenUdpPorts( uint16_t * pOutUdpPortsArray, + uint32_t udpPortsArrayLength, + uint32_t * pOutNumUdpOpenPorts ) +{ + MetricsCollectorStatus_t status = MetricsCollectorSuccess; + + if( pOutNumUdpOpenPorts == NULL ) + { + status = MetricsCollectorBadParameter; + } + + if( status == MetricsCollectorSuccess ) + { + /* Take a look at the comments at the top of this file. */ + LogError( ( "Using stub definition of GetOpenUdpPorts! " + "Please implement for your network stack to get correct metrics." ) ); + + if( pOutUdpPortsArray != NULL ) + { + /* Fill the output array with as many UDP ports as will fit in the + * given array. */ + + /* Return the number of elements copied to the array. */ + *pOutNumUdpOpenPorts = 0; + } + else + { + /* Return the total number of open ports. */ + *pOutNumUdpOpenPorts = 0; + } + } + + return status; +} + +/*-----------------------------------------------------------*/ + +MetricsCollectorStatus_t GetEstablishedConnections( Connection_t * pOutConnectionsArray, + uint32_t connectionsArrayLength, + uint32_t * pOutNumEstablishedConnections ) +{ + MetricsCollectorStatus_t status = MetricsCollectorSuccess; + + if( pOutNumEstablishedConnections == NULL ) + { + status = MetricsCollectorBadParameter; + } + + if( status == MetricsCollectorSuccess ) + { + /* Take a look at the comments at the top of this file. */ + LogError( ( "Using stub definition of GetEstablishedConnections! " + "Please implement for your network stack to get correct metrics." ) ); + + if( pOutConnectionsArray != NULL ) + { + /* Fill the output array with as many TCP socket infos as will fit in + * the given array. */ + + /* Return the number of elements copied to the array. */ + *pOutNumEstablishedConnections = 0; + } + else + { + /* Return the total number of established connections. */ + *pOutNumEstablishedConnections = 0; + } + } + + return status; +} +/*-----------------------------------------------------------*/ diff --git a/demos/device_defender_for_aws/report_builder.c b/demos/device_defender_for_aws/report_builder.c new file mode 100644 index 00000000000..28fedf3e169 --- /dev/null +++ b/demos/device_defender_for_aws/report_builder.c @@ -0,0 +1,492 @@ +/* + * FreeRTOS V202012.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://aws.amazon.com/freertos + * http://www.FreeRTOS.org + */ + +/* Standard includes. */ +#include +#include + +/* Demo config. */ +#include "defender_demo_config.h" + +/* Interface include. */ +#include "report_builder.h" + +/* Various JSON characters. */ +#define JSON_ARRAY_OPEN_MARKER '[' +#define JSON_ARRAY_CLOSE_MARKER ']' +#define JSON_ARRAY_OBJECT_SEPARATOR ',' + +/* Helper macro to check if snprintf was successful. */ +#define SNPRINTF_SUCCESS( retVal, bufLen ) ( ( retVal > 0 ) && ( ( uint32_t ) retVal < bufLen ) ) + +/* Formats used to generate the JSON report. */ +#define JSON_PORT_OBJECT_FORMAT \ + "{" \ + "\"port\": %u" \ + "}," + +#define JSON_CONNECTION_OBJECT_FORMAT \ + "{" \ + "\"local_port\": %u," \ + "\"remote_addr\": \"%u.%u.%u.%u:%u\"" \ + "}," + +#define JSON_REPORT_FORMAT_PART1 \ + "{" \ + "\"header\": {" \ + "\"report_id\": %u," \ + "\"version\": \"%u.%u\"" \ + "}," \ + "\"metrics\": {" \ + "\"listening_tcp_ports\": {" \ + "\"ports\": " + +#define JSON_REPORT_FORMAT_PART2 \ + "," \ + "\"total\": %u" \ + "}," \ + "\"listening_udp_ports\": {" \ + "\"ports\": " + +#define JSON_REPORT_FORMAT_PART3 \ + "," \ + "\"total\": %u" \ + "}," \ + "\"network_stats\": {" \ + "\"bytes_in\": %u," \ + "\"bytes_out\": %u," \ + "\"packets_in\": %u," \ + "\"packets_out\": %u" \ + "}," \ + "\"tcp_connections\": {" \ + "\"established_connections\": {" \ + "\"connections\": " + +#define JSON_REPORT_FORMAT_PART4 \ + "," \ + "\"total\": %u" \ + "}" \ + "}" \ + "}" \ + "}" +/*-----------------------------------------------------------*/ + +/** + * @brief Write ports array to the given buffer in the format expected by the + * AWS IoT Device Defender Service. + * + * This function writes an array of the following format: + * [ + * { + * "port":44207 + * }, + * { + * "port":53 + * } + * ] + * + * @param[in] pBuffer The buffer to write the ports array. + * @param[in] bufferLength The length of the buffer. + * @param[in] pOpenPortsArray The array containing the open ports. + * @param[in] openPortsArrayLength Length of the pOpenPortsArray array. + * @param[out] pOutCharsWritten Number of characters written to the buffer. + * + * @return #ReportBuilderSuccess if the array is successfully written; + * #ReportBuilderBufferTooSmall if the buffer cannot hold the full array. + */ +static ReportBuilderStatus_t writePortsArray( char * pBuffer, + uint32_t bufferLength, + const uint16_t * pOpenPortsArray, + uint32_t openPortsArrayLength, + uint32_t * pOutCharsWritten ); + +/** + * @brief Write established connections array to the given buffer in the format + * expected by the AWS IoT Device Defender Service. + * + * This function write array of the following format: + * [ + * { + * "local_port":44207, + * "remote_addr":"127.0.0.1:45148" + * }, + * { + * "local_port":22, + * "remote_addr":"24.16.237.194:63552" + * } + * ] + * + * @param[in] pBuffer The buffer to write the connections array. + * @param[in] bufferLength The length of the buffer. + * @param[in] pConnectionsArray The array containing the established connections. + * @param[in] connectionsArrayLength Length of the pConnectionsArray array. + * @param[out] pOutCharsWritten Number of characters written to the buffer. + * + * @return #ReportBuilderSuccess if the array is successfully written; + * #ReportBuilderBufferTooSmall if the buffer cannot hold the full array. + */ +static ReportBuilderStatus_t writeConnectionsArray( char * pBuffer, + uint32_t bufferLength, + const Connection_t * pConnectionsArray, + uint32_t connectionsArrayLength, + uint32_t * pOutCharsWritten ); +/*-----------------------------------------------------------*/ + +static ReportBuilderStatus_t writePortsArray( char * pBuffer, + uint32_t bufferLength, + const uint16_t * pOpenPortsArray, + uint32_t openPortsArrayLength, + uint32_t * pOutCharsWritten ) +{ + char * pCurrentWritePos = pBuffer; + uint32_t i, remainingBufferLength = bufferLength; + int charactersWritten; + ReportBuilderStatus_t status = ReportBuilderSuccess; + + /* Write the JSON array open marker. */ + if( remainingBufferLength > 1 ) + { + *pCurrentWritePos = JSON_ARRAY_OPEN_MARKER; + remainingBufferLength -= 1; + pCurrentWritePos += 1; + } + else + { + status = ReportBuilderBufferTooSmall; + } + + /* Write the array elements. */ + for( i = 0; ( ( i < openPortsArrayLength ) && ( status == ReportBuilderSuccess ) ); i++ ) + { + charactersWritten = snprintf( pCurrentWritePos, + remainingBufferLength, + JSON_PORT_OBJECT_FORMAT, + pOpenPortsArray[ i ] ); + + if( !SNPRINTF_SUCCESS( charactersWritten, remainingBufferLength ) ) + { + status = ReportBuilderBufferTooSmall; + break; + } + else + { + remainingBufferLength -= ( uint32_t ) charactersWritten; + pCurrentWritePos += charactersWritten; + } + } + + if( status == ReportBuilderSuccess ) + { + /* Discard the last comma. */ + if( openPortsArrayLength > 0 ) + { + pCurrentWritePos -= 1; + remainingBufferLength += 1; + } + + /* Write the JSON array close marker. */ + if( remainingBufferLength > 1 ) + { + *pCurrentWritePos = JSON_ARRAY_CLOSE_MARKER; + remainingBufferLength -= 1; + pCurrentWritePos += 1; + } + else + { + status = ReportBuilderBufferTooSmall; + } + } + + if( status == ReportBuilderSuccess ) + { + *pOutCharsWritten = bufferLength - remainingBufferLength; + } + + return status; +} +/*-----------------------------------------------------------*/ + +static ReportBuilderStatus_t writeConnectionsArray( char * pBuffer, + uint32_t bufferLength, + const Connection_t * pConnectionsArray, + uint32_t connectionsArrayLength, + uint32_t * pOutCharsWritten ) +{ + char * pCurrentWritePos = pBuffer; + uint32_t i, remainingBufferLength = bufferLength; + int charactersWritten; + ReportBuilderStatus_t status = ReportBuilderSuccess; + const Connection_t * pConn; + + /* Write the JSON array open marker. */ + if( remainingBufferLength > 1 ) + { + *pCurrentWritePos = JSON_ARRAY_OPEN_MARKER; + remainingBufferLength -= 1; + pCurrentWritePos += 1; + } + else + { + status = ReportBuilderBufferTooSmall; + } + + /* Write the array elements. */ + for( i = 0; ( ( i < connectionsArrayLength ) && ( status == ReportBuilderSuccess ) ); i++ ) + { + pConn = &( pConnectionsArray[ i ] ); + charactersWritten = snprintf( pCurrentWritePos, + remainingBufferLength, + JSON_CONNECTION_OBJECT_FORMAT, + pConn->localPort, + ( pConn->remoteIp >> 24 ) & 0xFF, + ( pConn->remoteIp >> 16 ) & 0xFF, + ( pConn->remoteIp >> 8 ) & 0xFF, + ( pConn->remoteIp ) & 0xFF, + pConn->remotePort ); + + if( !SNPRINTF_SUCCESS( charactersWritten, remainingBufferLength ) ) + { + status = ReportBuilderBufferTooSmall; + break; + } + else + { + remainingBufferLength -= charactersWritten; + pCurrentWritePos += charactersWritten; + } + } + + if( status == ReportBuilderSuccess ) + { + /* Discard the last comma. */ + if( connectionsArrayLength > 0 ) + { + pCurrentWritePos -= 1; + remainingBufferLength += 1; + } + + /* Write the JSON array close marker. */ + if( remainingBufferLength > 1 ) + { + *pCurrentWritePos = JSON_ARRAY_CLOSE_MARKER; + remainingBufferLength -= 1; + pCurrentWritePos += 1; + } + else + { + status = ReportBuilderBufferTooSmall; + } + } + + if( status == ReportBuilderSuccess ) + { + *pOutCharsWritten = bufferLength - remainingBufferLength; + } + + return status; +} +/*-----------------------------------------------------------*/ + +ReportBuilderStatus_t GenerateJsonReport( char * pBuffer, + uint32_t bufferLength, + const ReportMetrics_t * pMetrics, + uint32_t majorReportVersion, + uint32_t minorReportVersion, + uint32_t reportId, + uint32_t * pOutReprotLength ) +{ + char * pCurrentWritePos = pBuffer; + uint32_t remainingBufferLength = bufferLength, bufferWritten; + ReportBuilderStatus_t status = ReportBuilderSuccess; + int charactersWritten; + + if( ( pBuffer == NULL ) || + ( bufferLength == 0 ) || + ( pMetrics == NULL ) || + ( pOutReprotLength == NULL ) ) + { + LogError( ( "Invalid parameters. pBuffer: %p, bufferLength: %u" + " pMetrics: %p, pOutReprotLength: %p.", + pBuffer, + bufferLength, + pMetrics, + pOutReprotLength ) ); + status = ReportBuilderBadParameter; + } + + /* Write part1. */ + if( status == ReportBuilderSuccess ) + { + charactersWritten = snprintf( pCurrentWritePos, + remainingBufferLength, + JSON_REPORT_FORMAT_PART1, + reportId, + majorReportVersion, + minorReportVersion ); + + if( !SNPRINTF_SUCCESS( charactersWritten, remainingBufferLength ) ) + { + LogError( ( "Failed to write part 1." ) ); + status = ReportBuilderBufferTooSmall; + } + else + { + remainingBufferLength -= charactersWritten; + pCurrentWritePos += charactersWritten; + } + } + + /* Write TCP ports array. */ + if( status == ReportBuilderSuccess ) + { + status = writePortsArray( pCurrentWritePos, + remainingBufferLength, + pMetrics->pOpenTcpPortsArray, + pMetrics->openTcpPortsArrayLength, + &( bufferWritten ) ); + + if( status == ReportBuilderSuccess ) + { + pCurrentWritePos += bufferWritten; + remainingBufferLength -= bufferWritten; + } + else + { + LogError( ( "Failed to write TCP ports array." ) ); + } + } + + /* Write part2. */ + if( status == ReportBuilderSuccess ) + { + charactersWritten = snprintf( pCurrentWritePos, + remainingBufferLength, + JSON_REPORT_FORMAT_PART2, + pMetrics->openTcpPortsArrayLength ); + + if( !SNPRINTF_SUCCESS( charactersWritten, remainingBufferLength ) ) + { + LogError( ( "Failed to write part 2." ) ); + status = ReportBuilderBufferTooSmall; + } + else + { + remainingBufferLength -= charactersWritten; + pCurrentWritePos += charactersWritten; + } + } + + /* Write UDP ports array. */ + if( status == ReportBuilderSuccess ) + { + status = writePortsArray( pCurrentWritePos, + remainingBufferLength, + pMetrics->pOpenUdpPortsArray, + pMetrics->openUdpPortsArrayLength, + &( bufferWritten ) ); + + if( status == ReportBuilderSuccess ) + { + pCurrentWritePos += bufferWritten; + remainingBufferLength -= bufferWritten; + } + else + { + LogError( ( "Failed to write UDP ports array." ) ); + } + } + + /* Write part3. */ + if( status == ReportBuilderSuccess ) + { + charactersWritten = snprintf( pCurrentWritePos, + remainingBufferLength, + JSON_REPORT_FORMAT_PART3, + pMetrics->openUdpPortsArrayLength, + pMetrics->pNetworkStats->bytesReceived, + pMetrics->pNetworkStats->bytesSent, + pMetrics->pNetworkStats->packetsReceived, + pMetrics->pNetworkStats->packetsSent ); + + if( !SNPRINTF_SUCCESS( charactersWritten, remainingBufferLength ) ) + { + LogError( ( "Failed to write part 3." ) ); + status = ReportBuilderBufferTooSmall; + } + else + { + remainingBufferLength -= charactersWritten; + pCurrentWritePos += charactersWritten; + } + } + + /* Write connections array. */ + if( status == ReportBuilderSuccess ) + { + status = writeConnectionsArray( pCurrentWritePos, + remainingBufferLength, + pMetrics->pEstablishedConnectionsArray, + pMetrics->establishedConnectionsArrayLength, + &( bufferWritten ) ); + + if( status == ReportBuilderSuccess ) + { + pCurrentWritePos += bufferWritten; + remainingBufferLength -= bufferWritten; + } + else + { + LogError( ( "Failed to write established connections array." ) ); + } + } + + /* Write part4. */ + if( status == ReportBuilderSuccess ) + { + charactersWritten = snprintf( pCurrentWritePos, + remainingBufferLength, + JSON_REPORT_FORMAT_PART4, + pMetrics->establishedConnectionsArrayLength ); + + if( !SNPRINTF_SUCCESS( charactersWritten, remainingBufferLength ) ) + { + LogError( ( "Failed to write part 4." ) ); + status = ReportBuilderBufferTooSmall; + } + else + { + remainingBufferLength -= charactersWritten; + pCurrentWritePos += charactersWritten; + } + } + + if( status == ReportBuilderSuccess ) + { + *pOutReprotLength = bufferLength - remainingBufferLength; + } + + return status; +} +/*-----------------------------------------------------------*/ diff --git a/demos/device_defender_for_aws/report_builder.h b/demos/device_defender_for_aws/report_builder.h new file mode 100644 index 00000000000..9581881036d --- /dev/null +++ b/demos/device_defender_for_aws/report_builder.h @@ -0,0 +1,80 @@ +/* + * FreeRTOS V202012.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://aws.amazon.com/freertos + * http://www.FreeRTOS.org + */ + +#ifndef REPORT_BUILDER_H_ +#define REPORT_BUILDER_H_ + +/* Metrics collector. */ +#include "metrics_collector.h" + +/** + * @brief Return codes from report builder APIs. + */ +typedef enum +{ + ReportBuilderSuccess = 0, + ReportBuilderBadParameter, + ReportBuilderBufferTooSmall +} ReportBuilderStatus_t; + +/** + * @brief Represents metrics to be included in the report. + */ +typedef struct ReportMetrics +{ + NetworkStats_t * pNetworkStats; + uint16_t * pOpenTcpPortsArray; + uint32_t openTcpPortsArrayLength; + uint16_t * pOpenUdpPortsArray; + uint32_t openUdpPortsArrayLength; + Connection_t * pEstablishedConnectionsArray; + uint32_t establishedConnectionsArrayLength; +} ReportMetrics_t; + +/** + * @brief Generate a report in the format expected by the AWS IoT Device Defender + * Service. + * + * @param[in] pBuffer The buffer to write the report into. + * @param[in] bufferLength The length of the buffer. + * @param[in] pMetrics Metrics to write in the generated report. + * @param[in] majorReportVersion Major version of the report. + * @param[in] minorReportVersion Minor version of the report. + * @param[in] reportId Value to be used as the reportId in the generated report. + * @param[out] pOutReprotLength The length of the generated report. + * + * @return #ReportBuilderSuccess if the report is successfully generated; + * #ReportBuilderBadParameter if invalid parameters are passed; + * #ReportBuilderBufferTooSmall if the buffer cannot hold the full report. + */ +ReportBuilderStatus_t GenerateJsonReport( char * pBuffer, + uint32_t bufferLength, + const ReportMetrics_t * pMetrics, + uint32_t majorReportVersion, + uint32_t minorReportVersion, + uint32_t reportId, + uint32_t * pOutReprotLength ); + +#endif /* ifndef REPORT_BUILDER_H_ */ diff --git a/demos/device_shadow_for_aws/CMakeLists.txt b/demos/device_shadow_for_aws/CMakeLists.txt index 46c5c03d73e..3cc06def8ef 100644 --- a/demos/device_shadow_for_aws/CMakeLists.txt +++ b/demos/device_shadow_for_aws/CMakeLists.txt @@ -5,30 +5,29 @@ afr_set_demo_metadata(ID "DEVICE_SHADOW_DEMO") afr_set_demo_metadata(DESCRIPTION "An example that demonstrates the use of the Device Shadow library.") afr_set_demo_metadata(DISPLAY_NAME "Device Shadow Demo") +# Add the CMakeLists.txt file of module to metadata list. +afr_module_cmake_files(${AFR_CURRENT_MODULE} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt +) + afr_module_sources( ${AFR_CURRENT_MODULE} INTERFACE "${CMAKE_CURRENT_LIST_DIR}/shadow_demo_main.c" - "${CMAKE_CURRENT_LIST_DIR}/shadow_demo_helpers.c" - # Add the header file to generate their metadata so that - # they are present in code downloaded from FreeRTOS console. - "${CMAKE_CURRENT_LIST_DIR}/shadow_demo_helpers.h" - # As the containing directory name (i.e. device_shadow_for_aws) - # does not match the module name (i.e. device_shadow), - # we add the CMake file to the source list so that metadata is - # generated for it, and it is present in code downloaded from - # the FreeRTOS console. - ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt +) + +afr_module_include_dirs( + ${AFR_CURRENT_MODULE} + INTERFACE + ${AFR_DEMOS_DIR}/common/mqtt_demo_helpers ) afr_module_dependencies( ${AFR_CURRENT_MODULE} INTERFACE - AFR::core_mqtt + AFR::mqtt_demo_helpers AFR::core_json AFR::device_shadow - AFR::retry_utils - AFR::transport_interface_secure_sockets # Add dependency on the device_shadow_demo_dependencies # metadata module so that this demo is only shown when the # Device Shadow library is selected on the FreeRTOS console. diff --git a/demos/device_shadow_for_aws/shadow_demo_main.c b/demos/device_shadow_for_aws/shadow_demo_main.c index 9e1588ce505..aa6160bbd7e 100644 --- a/demos/device_shadow_for_aws/shadow_demo_main.c +++ b/demos/device_shadow_for_aws/shadow_demo_main.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -43,6 +43,15 @@ * a second message to update the reported state of powerOn. * 6. Handle incoming message again in prvEventCallback. If the message is from update/accepted, verify that it * has the same clientToken as previously published in the update message. That will mark the end of the demo. + * + * @note This demo uses retry logic to connect to AWS IoT broker if connection attempts fail. + * The FreeRTOS/backoffAlgorithm library is used to calculate the retry interval with an exponential + * backoff and jitter algorithm. For generating random number required by the algorithm, the PKCS11 + * module is used as it allows access to a True Random Number Generator (TRNG) if the vendor platform + * supports it. + * It is RECOMMENDED to seed the random number generator with a device-specific entropy source so that + * probability of collisions from devices in connection retries is mitigated. + * */ /* Standard includes. */ @@ -66,7 +75,7 @@ #include "core_json.h" /* shadow demo helpers header. */ -#include "shadow_demo_helpers.h" +#include "mqtt_demo_helpers.h" /** @@ -163,8 +172,73 @@ */ #define THING_NAME_LENGTH ( ( uint16_t ) ( sizeof( THING_NAME ) - 1 ) ) +/** + * @brief The maximum number of times to run the loop in this demo. + */ +#ifndef SHADOW_MAX_DEMO_COUNT + #define SHADOW_MAX_DEMO_COUNT ( 3 ) +#endif + +/** + * @brief Time in ticks to wait between each cycle of the demo implemented + * by RunDeviceShadowDemo(). + */ +#define DELAY_BETWEEN_DEMO_ITERATIONS_TICKS ( pdMS_TO_TICKS( 5000U ) ) + +/** + * @brief The maximum number of times to call MQTT_ProcessLoop() when waiting + * for a response for Shadow delete operation. + */ +#define MQTT_PROCESS_LOOP_DELETE_RESPONSE_COUNT_MAX ( 30U ) + +/** + * @brief Timeout for MQTT_ProcessLoop in milliseconds. + */ +#define MQTT_PROCESS_LOOP_TIMEOUT_MS ( 700U ) + +/** + * @brief JSON key for response code that indicates the type of error in + * the error document received on topic `delete/rejected`. + */ +#define SHADOW_DELETE_REJECTED_ERROR_CODE_KEY "code" + +/** + * @brief Length of #SHADOW_DELETE_REJECTED_ERROR_CODE_KEY + */ +#define SHADOW_DELETE_REJECTED_ERROR_CODE_KEY_LENGTH ( ( uint16_t ) ( sizeof( SHADOW_DELETE_REJECTED_ERROR_CODE_KEY ) - 1 ) ) + /*-----------------------------------------------------------*/ + +/** + * @brief The MQTT context used for MQTT operation. + */ +static MQTTContext_t xMqttContext; + +/** + * @brief The network context used for Openssl operation. + */ +static NetworkContext_t xNetworkContext; + +/** + * @brief The flag to indicate the mqtt session changed. + */ +static BaseType_t mqttSessionEstablished = pdTRUE; + +/** + * @brief Static buffer used to hold MQTT messages being sent and received. + */ +static uint8_t ucSharedBuffer[ democonfigNETWORK_BUFFER_SIZE ]; + +/** + * @brief Static buffer used to hold MQTT messages being sent and received. + */ +static MQTTFixedBuffer_t xBuffer = +{ + .pBuffer = ucSharedBuffer, + .size = democonfigNETWORK_BUFFER_SIZE +}; + /** * @brief The simulated device current power on state. */ @@ -185,12 +259,30 @@ static uint32_t ulClientToken = 0U; /** * @brief The return status of prvUpdateDeltaHandler callback function. */ -static int32_t lUpdateDeltaReturn = EXIT_SUCCESS; +static BaseType_t xUpdateDeltaReturn = pdPASS; /** * @brief The return status of prvUpdateAcceptedHandler callback function. */ -static int32_t lUpdateAcceptedReturn = EXIT_SUCCESS; +static BaseType_t xUpdateAcceptedReturn = pdPASS; + +/** + * @brief Status of the response of Shadow delete operation from AWS IoT + * message broker. + */ +static BaseType_t xDeleteResponseReceived = pdFALSE; + +/** + * @brief Status of the Shadow delete operation. + * + * The Shadow delete status will be updated by the incoming publishes on the + * MQTT topics for delete acknowledgement from AWS IoT message broker + * (accepted/rejected). Shadow document is considered to be deleted if an + * incoming publish is received on `delete/accepted` topic or an incoming + * publish is received on `delete/rejected` topic with error code 404. Code 404 + * indicates that the Shadow document does not exist for the Thing yet. + */ +static BaseType_t xShadowDeleted = pdFALSE; /*-----------------------------------------------------------*/ @@ -230,6 +322,127 @@ static void prvUpdateDeltaHandler( MQTTPublishInfo_t * pxPublishInfo ); */ static void prvUpdateAcceptedHandler( MQTTPublishInfo_t * pxPublishInfo ); + +/** + * @brief Process payload from `/delete/rejected` topic. + * + * This handler examines the rejected message to look for the reject reason code. + * If the reject reason code is `404`, an attempt was made to delete a shadow + * document which was not present yet. This is considered to be success for this + * demo application. + * + * @param[in] pxPublishInfo Deserialized publish info pointer for the incoming + * packet. + */ +static void prvDeleteRejectedHandler( MQTTPublishInfo_t * pxPublishInfo ); + +/** + * @brief Helper function to wait for a response for Shadow delete operation. + * + * @param[in] pxMQTTContext MQTT context pointer. + * + * @return pdPASS if successfully received a response for Shadow delete + * operation; pdFAIL otherwise. + */ +static BaseType_t prvWaitForDeleteResponse( MQTTContext_t * pxMQTTContext ); + +/*-----------------------------------------------------------*/ + +static BaseType_t prvWaitForDeleteResponse( MQTTContext_t * pxMQTTContext ) +{ + uint8_t ucCount = 0U; + MQTTStatus_t xMQTTStatus = MQTTSuccess; + BaseType_t xReturnStatus = pdPASS; + + assert( pxMQTTContext != NULL ); + + while( ( xDeleteResponseReceived != pdTRUE ) && + ( ucCount++ < MQTT_PROCESS_LOOP_DELETE_RESPONSE_COUNT_MAX ) && + ( xMQTTStatus == MQTTSuccess ) ) + { + /* Event callback will set #xDeleteResponseReceived when receiving an + * incoming publish on either `delete/accepted` or `delete/rejected` + * Shadow topics. */ + xMQTTStatus = MQTT_ProcessLoop( pxMQTTContext, MQTT_PROCESS_LOOP_TIMEOUT_MS ); + } + + if( ( xMQTTStatus != MQTTSuccess ) || ( xDeleteResponseReceived != pdTRUE ) ) + { + LogError( ( "MQTT_ProcessLoop failed to receive a response for Shadow delete operation:" + " LoopDuration=%u, MQTT Status=%s.", + ( MQTT_PROCESS_LOOP_TIMEOUT_MS * ucCount ), + MQTT_Status_strerror( xMQTTStatus ) ) ); + xReturnStatus = pdFAIL; + } + + return xReturnStatus; +} + +/*-----------------------------------------------------------*/ + +static void prvDeleteRejectedHandler( MQTTPublishInfo_t * pxPublishInfo ) +{ + JSONStatus_t result = JSONSuccess; + char * pcOutValue = NULL; + uint32_t ulOutValueLength = 0UL; + uint32_t ulErrorCode = 0UL; + + assert( pxPublishInfo != NULL ); + assert( pxPublishInfo->pPayload != NULL ); + + LogInfo( ( "/delete/rejected json payload:%s.", ( const char * ) pxPublishInfo->pPayload ) ); + + /* The payload will look similar to this: + * { + * "code": error-code, + * "message": "error-message", + * "timestamp": timestamp, + * "clientToken": "token" + * } + */ + + /* Make sure the payload is a valid json document. */ + result = JSON_Validate( pxPublishInfo->pPayload, + pxPublishInfo->payloadLength ); + + if( result == JSONSuccess ) + { + /* Then we start to get the version value by JSON keyword "version". */ + result = JSON_Search( ( char * ) pxPublishInfo->pPayload, + pxPublishInfo->payloadLength, + SHADOW_DELETE_REJECTED_ERROR_CODE_KEY, + SHADOW_DELETE_REJECTED_ERROR_CODE_KEY_LENGTH, + &pcOutValue, + ( size_t * ) &ulOutValueLength ); + } + else + { + LogError( ( "The json document is invalid!!" ) ); + } + + if( result == JSONSuccess ) + { + LogInfo( ( "Error code is: %.*s.", + ulOutValueLength, + pcOutValue ) ); + + /* Convert the extracted value to an unsigned integer value. */ + ulErrorCode = ( uint32_t ) strtoul( pcOutValue, NULL, 10 ); + } + else + { + LogError( ( "No error code in json document!!" ) ); + } + + LogInfo( ( "Error code:%lu.", ulErrorCode ) ); + + /* Mark Shadow delete operation as a success if error code is 404. */ + if( ulErrorCode == 404 ) + { + xShadowDeleted = pdTRUE; + } +} + /*-----------------------------------------------------------*/ static void prvUpdateDeltaHandler( MQTTPublishInfo_t * pxPublishInfo ) @@ -346,7 +559,7 @@ static void prvUpdateDeltaHandler( MQTTPublishInfo_t * pxPublishInfo ) else { LogError( ( "No powerOn in json document!!" ) ); - lUpdateDeltaReturn = EXIT_FAILURE; + xUpdateDeltaReturn = pdFAIL; } } @@ -433,7 +646,7 @@ static void prvUpdateAcceptedHandler( MQTTPublishInfo_t * pxPublishInfo ) else { LogError( ( "No clientToken in json document!!" ) ); - lUpdateAcceptedReturn = EXIT_FAILURE; + xUpdateAcceptedReturn = pdFAIL; } } @@ -495,6 +708,18 @@ static void prvEventCallback( MQTTContext_t * pxMqttContext, { LogInfo( ( "/update/rejected json payload:%s.", ( const char * ) pxDeserializedInfo->pPublishInfo->pPayload ) ); } + else if( messageType == ShadowMessageTypeDeleteAccepted ) + { + LogInfo( ( "Received an MQTT incoming publish on /delete/accepted topic." ) ); + xShadowDeleted = pdTRUE; + xDeleteResponseReceived = pdTRUE; + } + else if( messageType == ShadowMessageTypeDeleteRejected ) + { + /* Handler function to process payload. */ + prvDeleteRejectedHandler( pxDeserializedInfo->pPublishInfo ); + xDeleteResponseReceived = pdTRUE; + } else { LogInfo( ( "Other message type:%d !!", messageType ) ); @@ -538,7 +763,9 @@ int RunDeviceShadowDemo( bool awsIotMqttMode, void * pNetworkCredentialInfo, const void * pNetworkInterface ) { - int returnStatus = EXIT_SUCCESS; + BaseType_t xDemoStatus = pdPASS; + BaseType_t xDemoRunCount = 0UL; + BaseType_t xDeleteResponseLoopCount = 0UL; /* A buffer containing the update document. It has static duration to prevent * it from being placed on the call stack. */ @@ -551,181 +778,272 @@ int RunDeviceShadowDemo( bool awsIotMqttMode, ( void ) pNetworkCredentialInfo; ( void ) pNetworkInterface; - returnStatus = EstablishMqttSession( prvEventCallback ); - - if( returnStatus == EXIT_FAILURE ) - { - /* Log error to indicate connection failure. */ - LogError( ( "Failed to connect to MQTT broker." ) ); - } - else + do { - /* First of all, try to delete any Shadow document in the cloud. */ - returnStatus = PublishToTopic( SHADOW_TOPIC_STRING_DELETE( THING_NAME ), - SHADOW_TOPIC_LENGTH_DELETE( THING_NAME_LENGTH ), - pcUpdateDocument, - 0U ); - - /* Then try to subscribe shadow topics. */ - if( returnStatus == EXIT_SUCCESS ) - { - returnStatus = SubscribeToTopic( SHADOW_TOPIC_STRING_UPDATE_DELTA( THING_NAME ), - SHADOW_TOPIC_LENGTH_UPDATE_DELTA( THING_NAME_LENGTH ) ); - } + xDemoStatus = EstablishMqttSession( &xMqttContext, + &xNetworkContext, + &xBuffer, + prvEventCallback ); - if( returnStatus == EXIT_SUCCESS ) + if( xDemoStatus == pdFAIL ) { - returnStatus = SubscribeToTopic( SHADOW_TOPIC_STRING_UPDATE_ACCEPTED( THING_NAME ), - SHADOW_TOPIC_LENGTH_UPDATE_ACCEPTED( THING_NAME_LENGTH ) ); + /* Log error to indicate connection failure. */ + LogError( ( "Failed to connect to MQTT broker." ) ); } - - if( returnStatus == EXIT_SUCCESS ) + else { - returnStatus = SubscribeToTopic( SHADOW_TOPIC_STRING_UPDATE_REJECTED( THING_NAME ), - SHADOW_TOPIC_LENGTH_UPDATE_REJECTED( THING_NAME_LENGTH ) ); - } + /* Reset the shadow delete status flags. */ + xDeleteResponseReceived = pdFALSE; + xShadowDeleted = pdFALSE; - /* This demo uses a constant #THING_NAME known at compile time therefore we can use macros to - * assemble shadow topic strings. - * If the thing name is known at run time, then we could use the API #Shadow_GetTopicString to - * assemble shadow topic strings, here is the example for /update/delta: - * - * For /update/delta: - * - * #define SHADOW_TOPIC_MAX_LENGTH (256U) - * - * ShadowStatus_t shadowStatus = SHADOW_STATUS_SUCCESS; - * char cTopicBuffer[ SHADOW_TOPIC_MAX_LENGTH ] = { 0 }; - * uint16_t usBufferSize = SHADOW_TOPIC_MAX_LENGTH; - * uint16_t usOutLength = 0; - * const char * pcThingName = "TestThingName"; - * uint16_t usThingNameLength = ( sizeof( pcThingName ) - 1U ); - * - * shadowStatus = Shadow_GetTopicString( SHADOW_TOPIC_STRING_TYPE_UPDATE_DELTA, - * pcThingName, - * usThingNameLength, - * & ( cTopicBuffer[ 0 ] ), - * usBufferSize, - * & usOutLength ); - */ + /* First of all, try to delete any Shadow document in the cloud. + * Try to subscribe to `delete/accepted` and `delete/rejected` topics. */ + xDemoStatus = SubscribeToTopic( &xMqttContext, + SHADOW_TOPIC_STRING_DELETE_ACCEPTED( THING_NAME ), + SHADOW_TOPIC_LENGTH_DELETE_ACCEPTED( THING_NAME_LENGTH ) ); - /* Then we publish a desired state to the /update topic. Since we've deleted - * the device shadow at the beginning of the demo, this will cause a delta message - * to be published, which we have subscribed to. - * In many real applications, the desired state is not published by - * the device itself. But for the purpose of making this demo self-contained, - * we publish one here so that we can receive a delta message later. - */ - if( returnStatus == EXIT_SUCCESS ) - { - /* Desired power on state . */ - LogInfo( ( "Send desired power state with 1." ) ); - - ( void ) memset( pcUpdateDocument, - 0x00, - sizeof( pcUpdateDocument ) ); - - snprintf( pcUpdateDocument, - SHADOW_DESIRED_JSON_LENGTH + 1, - SHADOW_DESIRED_JSON, - ( int ) 1, - ( long unsigned ) ( xTaskGetTickCount() % 1000000 ) ); - - returnStatus = PublishToTopic( SHADOW_TOPIC_STRING_UPDATE( THING_NAME ), - SHADOW_TOPIC_LENGTH_UPDATE( THING_NAME_LENGTH ), - pcUpdateDocument, - ( SHADOW_DESIRED_JSON_LENGTH + 1 ) ); - } + if( xDemoStatus == pdPASS ) + { + /* Try to subscribe to `delete/rejected` topic. */ + xDemoStatus = SubscribeToTopic( &xMqttContext, + SHADOW_TOPIC_STRING_DELETE_REJECTED( THING_NAME ), + SHADOW_TOPIC_LENGTH_DELETE_REJECTED( THING_NAME_LENGTH ) ); + } - if( returnStatus == EXIT_SUCCESS ) - { - /* Note that PublishToTopic already called MQTT_ProcessLoop, - * therefore responses may have been received and the prvEventCallback - * may have been called, which may have changed the stateChanged flag. - * Check if the state change flag has been modified or not. If it's modified, - * then we publish reported state to update topic. + if( xDemoStatus == pdPASS ) + { + /* Publish to Shadow `delete` topic to attempt to delete the + * Shadow document if exists. */ + xDemoStatus = PublishToTopic( &xMqttContext, + SHADOW_TOPIC_STRING_DELETE( THING_NAME ), + SHADOW_TOPIC_LENGTH_DELETE( THING_NAME_LENGTH ), + pcUpdateDocument, + 0U ); + } + + /* Wait for an incoming publish on `delete/accepted` or `delete/rejected` + * topics, if not already received a publish. */ + if( ( xDemoStatus == pdPASS ) && ( xDeleteResponseReceived != pdTRUE ) ) + { + xDemoStatus = prvWaitForDeleteResponse( &xMqttContext ); + } + + /* Unsubscribe from the `delete/accepted` and 'delete/rejected` topics.*/ + if( xDemoStatus == pdPASS ) + { + xDemoStatus = UnsubscribeFromTopic( &xMqttContext, + SHADOW_TOPIC_STRING_DELETE_ACCEPTED( THING_NAME ), + SHADOW_TOPIC_LENGTH_DELETE_ACCEPTED( THING_NAME_LENGTH ) ); + } + + if( xDemoStatus == pdPASS ) + { + xDemoStatus = UnsubscribeFromTopic( &xMqttContext, + SHADOW_TOPIC_STRING_DELETE_REJECTED( THING_NAME ), + SHADOW_TOPIC_LENGTH_DELETE_REJECTED( THING_NAME_LENGTH ) ); + } + + /* Check if Shadow document delete was successful. A delete can be + * successful in cases listed below. + * 1. If an incoming publish is received on `delete/accepted` topic. + * 2. If an incoming publish is received on `delete/rejected` topic + * with error code 404. This indicates that a Shadow document was + * not present for the Thing. */ + if( xShadowDeleted == pdFALSE ) + { + LogError( ( "Shadow delete operation failed." ) ); + xDemoStatus = pdFAIL; + } + + /* Then try to subscribe Shadow delta and Shadow updated topics. */ + if( xDemoStatus == pdPASS ) + { + xDemoStatus = SubscribeToTopic( &xMqttContext, + SHADOW_TOPIC_STRING_UPDATE_DELTA( THING_NAME ), + SHADOW_TOPIC_LENGTH_UPDATE_DELTA( THING_NAME_LENGTH ) ); + } + + if( xDemoStatus == pdPASS ) + { + xDemoStatus = SubscribeToTopic( &xMqttContext, + SHADOW_TOPIC_STRING_UPDATE_ACCEPTED( THING_NAME ), + SHADOW_TOPIC_LENGTH_UPDATE_ACCEPTED( THING_NAME_LENGTH ) ); + } + + if( xDemoStatus == pdPASS ) + { + xDemoStatus = SubscribeToTopic( &xMqttContext, + SHADOW_TOPIC_STRING_UPDATE_REJECTED( THING_NAME ), + SHADOW_TOPIC_LENGTH_UPDATE_REJECTED( THING_NAME_LENGTH ) ); + } + + /* This demo uses a constant #THING_NAME known at compile time therefore we can use macros to + * assemble shadow topic strings. + * If the thing name is known at run time, then we could use the API #Shadow_GetTopicString to + * assemble shadow topic strings, here is the example for /update/delta: + * + * For /update/delta: + * + * #define SHADOW_TOPIC_MAX_LENGTH (256U) + * + * ShadowStatus_t shadowStatus = SHADOW_STATUS_SUCCESS; + * char cTopicBuffer[ SHADOW_TOPIC_MAX_LENGTH ] = { 0 }; + * uint16_t usBufferSize = SHADOW_TOPIC_MAX_LENGTH; + * uint16_t usOutLength = 0; + * const char * pcThingName = "TestThingName"; + * uint16_t usThingNameLength = ( sizeof( pcThingName ) - 1U ); + * + * shadowStatus = Shadow_GetTopicString( SHADOW_TOPIC_STRING_TYPE_UPDATE_DELTA, + * pcThingName, + * usThingNameLength, + * & ( cTopicBuffer[ 0 ] ), + * usBufferSize, + * & usOutLength ); + */ + + /* Then we publish a desired state to the /update topic. Since we've deleted + * the device shadow at the beginning of the demo, this will cause a delta message + * to be published, which we have subscribed to. + * In many real applications, the desired state is not published by + * the device itself. But for the purpose of making this demo self-contained, + * we publish one here so that we can receive a delta message later. */ - if( stateChanged == true ) + if( xDemoStatus == pdPASS ) { - /* Report the latest power state back to device shadow. */ - LogInfo( ( "Report to the state change: %d", ulCurrentPowerOnState ) ); + /* Desired power on state . */ + LogInfo( ( "Send desired power state with 1." ) ); + ( void ) memset( pcUpdateDocument, 0x00, sizeof( pcUpdateDocument ) ); - /* Keep the client token in global variable used to compare if - * the same token in /update/accepted. */ - ulClientToken = ( xTaskGetTickCount() % 1000000 ); - snprintf( pcUpdateDocument, - SHADOW_REPORTED_JSON_LENGTH + 1, - SHADOW_REPORTED_JSON, - ( int ) ulCurrentPowerOnState, - ( long unsigned ) ulClientToken ); - - returnStatus = PublishToTopic( SHADOW_TOPIC_STRING_UPDATE( THING_NAME ), - SHADOW_TOPIC_LENGTH_UPDATE( THING_NAME_LENGTH ), - pcUpdateDocument, - ( SHADOW_DESIRED_JSON_LENGTH + 1 ) ); + SHADOW_DESIRED_JSON_LENGTH + 1, + SHADOW_DESIRED_JSON, + ( int ) 1, + ( long unsigned ) ( xTaskGetTickCount() % 1000000 ) ); + + xDemoStatus = PublishToTopic( &xMqttContext, + SHADOW_TOPIC_STRING_UPDATE( THING_NAME ), + SHADOW_TOPIC_LENGTH_UPDATE( THING_NAME_LENGTH ), + pcUpdateDocument, + ( SHADOW_DESIRED_JSON_LENGTH + 1 ) ); } - else + + if( xDemoStatus == pdPASS ) { - LogInfo( ( "No change from /update/delta, unsubscribe all shadow topics and disconnect from MQTT.\r\n" ) ); + /* Note that PublishToTopic already called MQTT_ProcessLoop, + * therefore responses may have been received and the prvEventCallback + * may have been called, which may have changed the stateChanged flag. + * Check if the state change flag has been modified or not. If it's modified, + * then we publish reported state to update topic. + */ + if( stateChanged == true ) + { + /* Report the latest power state back to device shadow. */ + LogInfo( ( "Report to the state change: %d", ulCurrentPowerOnState ) ); + ( void ) memset( pcUpdateDocument, + 0x00, + sizeof( pcUpdateDocument ) ); + + /* Keep the client token in global variable used to compare if + * the same token in /update/accepted. */ + ulClientToken = ( xTaskGetTickCount() % 1000000 ); + + snprintf( pcUpdateDocument, + SHADOW_REPORTED_JSON_LENGTH + 1, + SHADOW_REPORTED_JSON, + ( int ) ulCurrentPowerOnState, + ( long unsigned ) ulClientToken ); + + xDemoStatus = PublishToTopic( &xMqttContext, + SHADOW_TOPIC_STRING_UPDATE( THING_NAME ), + SHADOW_TOPIC_LENGTH_UPDATE( THING_NAME_LENGTH ), + pcUpdateDocument, + ( SHADOW_DESIRED_JSON_LENGTH + 1 ) ); + } + else + { + LogInfo( ( "No change from /update/delta, unsubscribe all shadow topics and disconnect from MQTT.\r\n" ) ); + } } - } - if( returnStatus == EXIT_SUCCESS ) - { - LogInfo( ( "Start to unsubscribe shadow topics and disconnect from MQTT. \r\n" ) ); + if( xDemoStatus == pdPASS ) + { + LogInfo( ( "Start to unsubscribe shadow topics and disconnect from MQTT. \r\n" ) ); - returnStatus = UnsubscribeFromTopic( SHADOW_TOPIC_STRING_UPDATE_DELTA( THING_NAME ), - SHADOW_TOPIC_LENGTH_UPDATE_DELTA( THING_NAME_LENGTH ) ); + xDemoStatus = UnsubscribeFromTopic( &xMqttContext, + SHADOW_TOPIC_STRING_UPDATE_DELTA( THING_NAME ), + SHADOW_TOPIC_LENGTH_UPDATE_DELTA( THING_NAME_LENGTH ) ); - if( returnStatus != EXIT_SUCCESS ) - { - LogError( ( "Failed to unsubscribe the topic %s", - SHADOW_TOPIC_STRING_UPDATE_DELTA( THING_NAME ) ) ); + if( xDemoStatus != pdPASS ) + { + LogError( ( "Failed to unsubscribe the topic %s", + SHADOW_TOPIC_STRING_UPDATE_DELTA( THING_NAME ) ) ); + } } - } - if( returnStatus == EXIT_SUCCESS ) - { - returnStatus = UnsubscribeFromTopic( SHADOW_TOPIC_STRING_UPDATE_ACCEPTED( THING_NAME ), - SHADOW_TOPIC_LENGTH_UPDATE_ACCEPTED( THING_NAME_LENGTH ) ); + if( xDemoStatus == pdPASS ) + { + xDemoStatus = UnsubscribeFromTopic( &xMqttContext, + SHADOW_TOPIC_STRING_UPDATE_ACCEPTED( THING_NAME ), + SHADOW_TOPIC_LENGTH_UPDATE_ACCEPTED( THING_NAME_LENGTH ) ); + + if( xDemoStatus != pdPASS ) + { + LogError( ( "Failed to unsubscribe the topic %s", + SHADOW_TOPIC_STRING_UPDATE_ACCEPTED( THING_NAME ) ) ); + } + } - if( returnStatus != EXIT_SUCCESS ) + if( xDemoStatus == pdPASS ) { - LogError( ( "Failed to unsubscribe the topic %s", - SHADOW_TOPIC_STRING_UPDATE_ACCEPTED( THING_NAME ) ) ); + xDemoStatus = UnsubscribeFromTopic( &xMqttContext, + SHADOW_TOPIC_STRING_UPDATE_REJECTED( THING_NAME ), + SHADOW_TOPIC_LENGTH_UPDATE_REJECTED( THING_NAME_LENGTH ) ); + + if( xDemoStatus != pdPASS ) + { + LogError( ( "Failed to unsubscribe the topic %s", + SHADOW_TOPIC_STRING_UPDATE_REJECTED( THING_NAME ) ) ); + } } - } - if( returnStatus == EXIT_SUCCESS ) - { - returnStatus = UnsubscribeFromTopic( SHADOW_TOPIC_STRING_UPDATE_REJECTED( THING_NAME ), - SHADOW_TOPIC_LENGTH_UPDATE_REJECTED( THING_NAME_LENGTH ) ); + /* The MQTT session is always disconnected, even if there were prior failures. */ + xDemoStatus = DisconnectMqttSession( &xMqttContext, &xNetworkContext ); - if( returnStatus != EXIT_SUCCESS ) + /* This demo performs only Device Shadow operations. If matching the Shadow + * MQTT topic fails or there are failure in parsing the received JSON document, + * then this demo was not successful. */ + if( ( xUpdateAcceptedReturn != pdPASS ) || ( xUpdateDeltaReturn != pdPASS ) ) { - LogError( ( "Failed to unsubscribe the topic %s", - SHADOW_TOPIC_STRING_UPDATE_REJECTED( THING_NAME ) ) ); + LogError( ( "Callback function failed." ) ); + xDemoStatus = pdFAIL; } } - /* The MQTT session is always disconnected, even there were prior failures. */ - returnStatus = DisconnectMqttSession(); + /* Increment the demo run count. */ + xDemoRunCount++; - /* This demo performs only Device Shadow operations. If matching the Shadow - * MQTT topic fails or there are failure in parsing the received JSON document, - * then this demo was not successful. */ - if( ( lUpdateAcceptedReturn != EXIT_SUCCESS ) || ( lUpdateDeltaReturn != EXIT_SUCCESS ) ) + if( xDemoStatus == pdPASS ) { - LogError( ( "Callback function failed." ) ); - returnStatus = EXIT_FAILURE; + LogInfo( ( "Demo iteration %lu is successful.", xDemoRunCount ) ); } - } + /* Attempt to retry a failed iteration of demo for up to #SHADOW_MAX_DEMO_COUNT times. */ + else if( xDemoRunCount < SHADOW_MAX_DEMO_COUNT ) + { + LogWarn( ( "Demo iteration %lu failed. Retrying...", xDemoRunCount ) ); + vTaskDelay( DELAY_BETWEEN_DEMO_ITERATIONS_TICKS ); + } + /* Failed all #SHADOW_MAX_DEMO_COUNT demo iterations. */ + else + { + LogError( ( "All %d demo iterations failed.", SHADOW_MAX_DEMO_COUNT ) ); + break; + } + } while( xDemoStatus != pdPASS ); - return returnStatus; + return( ( xDemoStatus == pdPASS ) ? EXIT_SUCCESS : EXIT_FAILURE ); } /*-----------------------------------------------------------*/ diff --git a/demos/greengrass_connectivity/aws_greengrass_discovery_demo.c b/demos/greengrass_connectivity/aws_greengrass_discovery_demo.c index ab94a75db01..64260dbe57d 100644 --- a/demos/greengrass_connectivity/aws_greengrass_discovery_demo.c +++ b/demos/greengrass_connectivity/aws_greengrass_discovery_demo.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/https/CMakeLists.txt b/demos/https/CMakeLists.txt deleted file mode 100644 index d48bbd10e4e..00000000000 --- a/demos/https/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -# AFR HTTPS demo -afr_demo_module(https) - -# The synchronous download demo is the default enabled demo. -afr_set_demo_metadata(ID "HTTPS_SYNC_DOWNLOAD_DEMO") -afr_set_demo_metadata(DESCRIPTION "Examples that demonstrate the HTTPS Client") -afr_set_demo_metadata(DISPLAY_NAME "HTTPS Client Demos") - -afr_module_sources( - ${AFR_CURRENT_MODULE} - INTERFACE - "${CMAKE_CURRENT_LIST_DIR}/iot_demo_https_s3_download_sync.c" - "${CMAKE_CURRENT_LIST_DIR}/iot_demo_https_s3_download_async.c" - "${CMAKE_CURRENT_LIST_DIR}/iot_demo_https_s3_upload_sync.c" - "${CMAKE_CURRENT_LIST_DIR}/iot_demo_https_s3_upload_async.c" - "${CMAKE_CURRENT_LIST_DIR}/iot_demo_https_common.c" -) - -afr_module_dependencies( - ${AFR_CURRENT_MODULE} - INTERFACE - AFR::https -) diff --git a/demos/https/README.md b/demos/https/README.md deleted file mode 100644 index 0798743ea50..00000000000 --- a/demos/https/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# Presigned S3 URLs Generator - -**presigned_url_gen.py** generates pre-signed URLs for S3 GET and PUT HTTP request access. - -### Dependencies -* Python 2.7+ or Python 3+ -* boto3 -* argparse - -### Pre-requisites -1. Install the dependencies. - ``` - pip install boto3 argparse - ``` - -1. You will need an AWS Account with S3 access before beginning. You must install and configure the AWS CLI in order to - use this script. - For information on AWS S3 please see: https://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html - For AWS CLI installation information please see: https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html - For AWS CLI configuration information please see: https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html - ``` - aws configure - ``` - -### Usage -1. Run the presigned_url_gen.py with your s3 **bucket-name** and s3 object key **object-key**. - ``` - python presigned_urls_gen.py --bucket --key - ``` - An example expected output: - ``` - #define IOT_DEMO_HTTPS_PRESIGNED_GET_URL https://aws-s3-endpoint/object-key.txt?AWSAccessKeyId=AAAAAAAAAAAAAAAAAAAA&Expires=1560555644&Signature=SomeHash12345UrlABcdEFgfIjK%3D - #define IOT_DEMO_HTTPS_PRESIGNED_PUT_URL https://aws-s3-endpoint/object-key.txt?AWSAccessKeyId=ABABABABABABABABABAB&Expires=1560555644&Signature=SomeHash12345UrlLMnmOPqrStUvW%3D - ``` -1. Copy and paste the output to **iot_config.h** for macro **IOT_DEMO_HTTPS_PRESIGNED_GET_URL** and **IOT_DEMO_HTTPS_PRESIGNED_PUT_URL**. - ``` - #define IOT_DEMO_HTTPS_PRESIGNED_PUT_URL https://aws-s3-endpoint/object-key.txt?AWSAccessKeyId=AAAAAAAAAAAAAAAAAAAA&Expires=1560555644&Signature=SomeHash12345UrlABcdEFgfIjK%3D - #define IOT_DEMO_HTTPS_PRESIGNED_GET_URL https://aws-s3-endpoint/object-key.txt?AWSAccessKeyId=AAAAAAAAAAAAAAAAAAAA&Expires=1560555644&Signature=SomeHash12345UrlABcdEFgfIjK%3D - ``` - -### Parameter Info -#### --bucket - The name of your S3 bucket where you will download or upload. -#### --key - The name of the existing object you wish to download (GET). - Or the name of the object you wish to upload (PUT). diff --git a/demos/https/iot_demo_https_common.c b/demos/https/iot_demo_https_common.c deleted file mode 100644 index 6c07aacd68b..00000000000 --- a/demos/https/iot_demo_https_common.c +++ /dev/null @@ -1,223 +0,0 @@ -/* - * FreeRTOS V202011.00 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://aws.amazon.com/freertos - * http://www.FreeRTOS.org - */ - -/** - * @file iot_demo_https_common.c - * @brief Implementation of common routines used in the HTTPS S3 access demos. - */ -/* The config header is always included first. */ -#include "iot_config.h" - -/* C Standard headers. */ -#include - -/* Common header. */ -#include "iot_demo_https_common.h" - -/* FreeRTOS includes. */ -#include "iot_https_utils.h" -#include "iot_demo_logging.h" - -/*-----------------------------------------------------------*/ - -/** - * @brief HTTP standard header value for requesting a range of bytes from 0 to 0. - * - * This is used to get the size of the file from S3. A HEAD request is forbidden with a presigned URL. Performing a - * HEAD request with S3 requires generating a Sigv4 signature in an Authorization header field. We work around this by - * performing a GET on Range: bytes=0-0. Then extracting the size of the file from the Content-Range header field in - * the response. */ -#define RANGE_0_TO_0_HEADER_VALUE "bytes=0-0" -#define RANGE_0_TO_0_HEADER_VALUE_LENGTH ( 9 ) - -/** - * @brief HTTP standard header field "Content-Range" - */ -#define CONTENT_RANGE_HEADER_FIELD "Content-Range" -#define CONTENT_RANGE_HEADER_FIELD_LENGTH ( 13 ) - -/*-----------------------------------------------------------*/ - -int _IotHttpsDemo_GetS3ObjectFileSize( uint32_t * pFileSize, - IotHttpsConnectionHandle_t connHandle, - const char * pPath, - uint32_t pathLen, - const char * pAddress, - uint32_t addressLen, - uint8_t * pReqUserBuffer, - uint32_t reqUserBufferLen, - uint8_t * pRespUserBuffer, - uint32_t respUserBufferLen ) -{ - /* Status of HTTPS Client API. */ - IotHttpsReturnCode_t httpsClientStatus = IOT_HTTPS_OK; - /* The HTTPS request configurations for getting the file size. */ - IotHttpsRequestInfo_t fileSizeReqConfig = { 0 }; - /* The HTTPS response configurations for getting the file size. */ - IotHttpsResponseInfo_t fileSizeRespConfig = { 0 }; - /* Synchronous request specific configurations. */ - IotHttpsSyncInfo_t reqSyncInfo = { 0 }; - /* Synchronous response specific configurations. */ - IotHttpsSyncInfo_t respSyncInfo = { 0 }; - - /* Handle identifying the HTTP request. This is valid after the request has been initialized with - * IotHttpsClient_InitializeRequest(). */ - IotHttpsRequestHandle_t fileSizeReqHandle = NULL; - - /* Handle identifying the HTTP response. This is valid after the response has been received with - * IotHttpsClient_SendSync(). */ - IotHttpsResponseHandle_t fileSizeRespHandle = NULL; - - /* The status of HTTP response for this request. */ - uint16_t respStatus = IOT_HTTPS_STATUS_OK; - - - /* String to store the Content-Range header field value. This header field as we are requesting in this demo is of - * the form: "Content-Range: bytes 0-0/FILESIZE", where file size would be the length of the maximum 32 bit integer - * which is 10. Since the header field value "bytes 0-0/FILESIZE" is less than the maximum possible Range header - * field value, we size this string to the Range header field value.*/ - char contentRangeValStr[ RANGE_VALUE_MAX_LENGTH ] = { 0 }; - /* The location of the file size in the contentRangeValStr. */ - char * pFileSizeStr = NULL; - - /* We are retrieving the file size synchronously because we cannot run this demo without the file size anyways - * so it's OK to block. */ - reqSyncInfo.pBody = NULL; /* This is a GET request so there is no data in the body. */ - reqSyncInfo.bodyLen = 0; /* Since there is not data in the body the length is 0. */ - respSyncInfo.pBody = NULL; /* We don't care about the body in this request since we want the file size that will - * be found in a header value. */ - respSyncInfo.bodyLen = 0; /* Since we are not saving any response body the length is 0. */ - - /* Set the request configurations. */ - fileSizeReqConfig.pPath = pPath; - fileSizeReqConfig.pathLen = pathLen; - fileSizeReqConfig.pHost = pAddress; - fileSizeReqConfig.hostLen = addressLen; - fileSizeReqConfig.method = IOT_HTTPS_METHOD_GET; /* Performing a HEAD request with S3 requires generating a Sigv4 signature - * in an Authorization header field. We work around this by performing a GET - * on Range: bytes=0-0. The size of the file is extracted from the Content-Range - * header field in the response. */ - fileSizeReqConfig.userBuffer.pBuffer = pReqUserBuffer; - fileSizeReqConfig.userBuffer.bufferLen = reqUserBufferLen; - fileSizeReqConfig.isAsync = false; - fileSizeReqConfig.u.pSyncInfo = &reqSyncInfo; - - /* Set the response configurations. */ - fileSizeRespConfig.userBuffer.pBuffer = pRespUserBuffer; - fileSizeRespConfig.userBuffer.bufferLen = respUserBufferLen; - fileSizeRespConfig.pSyncInfo = &respSyncInfo; - - /* Initialize the request to retrieve a request handle. */ - httpsClientStatus = IotHttpsClient_InitializeRequest( &fileSizeReqHandle, &fileSizeReqConfig ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred in IotHttpsClient_InitializeRequest() with error code: %d", httpsClientStatus ); - return EXIT_FAILURE; - } - - /* Add the header to get bytes=0-0. S3 will respond with a Content-Range header that contains the size of the file - * in it. This header will look like: "Content-Range: bytes 0-0/FILESIZE". The body will have a single byte that - * we are ignoring. */ - httpsClientStatus = IotHttpsClient_AddHeader( fileSizeReqHandle, RANGE_HEADER_FIELD, RANGE_HEADER_FIELD_LENGTH, RANGE_0_TO_0_HEADER_VALUE, RANGE_0_TO_0_HEADER_VALUE_LENGTH ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "Failed to write the header \"Range: bytes=0-0\" into the request. With error code: %d", httpsClientStatus ); - return EXIT_FAILURE; - } - - /* Send the request synchronously. */ - httpsClientStatus = IotHttpsClient_SendSync( connHandle, fileSizeReqHandle, &fileSizeRespHandle, &fileSizeRespConfig, 0 ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "There has been an error receiving the response. The error code is: %d", httpsClientStatus ); - - /* Even though there is an error we could still read headers and body that may have been - * filled in the buffer depending on the error. */ - } - - /* Read the response status to see if we successfully got a partial content response. If we did not then - * we failed and will exit the demo. */ - httpsClientStatus = IotHttpsClient_ReadResponseStatus( fileSizeRespHandle, &respStatus ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "Could not read the response status. Error code %d", httpsClientStatus ); - return EXIT_FAILURE; - } - - if( respStatus != IOT_HTTPS_STATUS_PARTIAL_CONTENT ) - { - IotLogError( "Could not retrieve the file size. s3 responded with response status: %d", respStatus ); - - if( respStatus == IOT_HTTPS_STATUS_TEMPORARY_REDIRECT ) - { - IotLogInfo( "If the bucket was created less than 24 hours ago, you must add the region the bucket was created to the presigned URL. " ); - IotLogInfo( "You can change the Origin Domain Name from bucketname.s3.amazonaws.com to bucketname.s3-.amazonaws.com." ); - } - - if( respStatus == IOT_HTTPS_STATUS_FORBIDDEN ) - { - IotLogInfo( "Pre-signed URL may have expired or you do not have permissions on this account to access the S3 object." ); - } - - if( respStatus == IOT_HTTPS_STATUS_NOT_FOUND ) - { - IotLogInfo( "The specific object key in the presigned URL was not found in the bucket. " ); - } - - return EXIT_FAILURE; - } - - /* Get the file size by parsing the "bytes 0-0/FILESIZE" Content-Range header value string. */ - httpsClientStatus = IotHttpsClient_ReadHeader( fileSizeRespHandle, CONTENT_RANGE_HEADER_FIELD, CONTENT_RANGE_HEADER_FIELD_LENGTH, contentRangeValStr, sizeof( contentRangeValStr ) ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "Could find the Content-Range header in the response. Error code %d", httpsClientStatus ); - return EXIT_FAILURE; - } - - pFileSizeStr = strstr( contentRangeValStr, "/" ); - - if( pFileSizeStr == NULL ) - { - IotLogError( "'/' not present in Content-Range header value: %s.", contentRangeValStr ); - return EXIT_FAILURE; - } - - pFileSizeStr += sizeof( char ); - *pFileSize = ( uint32_t ) strtoul( pFileSizeStr, NULL, 10 ); - - if( ( *pFileSize == 0 ) || ( *pFileSize == UINT32_MAX ) ) - { - IotLogError( "Error using strtoul to get the file size from %s. Error returned: %d", pFileSizeStr, *pFileSize ); - return EXIT_FAILURE; - } - - return EXIT_SUCCESS; -} diff --git a/demos/https/iot_demo_https_common.h b/demos/https/iot_demo_https_common.h deleted file mode 100644 index d2ec2c3909d..00000000000 --- a/demos/https/iot_demo_https_common.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * FreeRTOS V202011.00 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://aws.amazon.com/freertos - * http://www.FreeRTOS.org - */ - -/** - * @file iot_demo_https_common.h - * @brief Common routines used in the HTTPS S3 access demos. - */ - -#ifndef IOT_DEMO_HTTPS_COMMON_H_ -#define IOT_DEMO_HTTPS_COMMON_H_ - -/* C standard includes shared among the demos. */ -#include - -/* Include of the HTTPS Client library. */ -#include "iot_https_client.h" - -/** - * @brief The maximum size of the header value string for the "Range" field. - * - * This is used to specify which parts of the file - * we want to download. Let's say the maximum file size is what can fit in a 32 bit unsigned integer. 2^32 = 4294967296 - * which is 10 digits. The header value string is of the form: "bytes=N-M" where N and M are integers. So the length - * of this string is strlen(N) + strlen(M) + strlen("bytes=-") + NULL terminator. Given the maximum number of digits is - * 10 we get the maximum length of this header value as: 10 * 2 + 7 + 1. - */ -#define RANGE_VALUE_MAX_LENGTH ( 28 ) - -/** - * @brief HTTP standard header field "Range". - */ -#define RANGE_HEADER_FIELD "Range" -#define RANGE_HEADER_FIELD_LENGTH ( sizeof( RANGE_HEADER_FIELD ) - 1 ) /**< Length of the "Range" header field name. */ - -/** - * @brief A closed connection header field and value strings. - * - * This value appears for the HTTP header "Connection". If this appears in the response, then the server will have - * closed the connection after sending that response. - */ -#define CONNECTION_HEADER_FIELD "Connection" -#define CONNECTION_HEADER_FILED_LENGTH ( sizeof( CONNECTION_HEADER_FIELD ) - 1 ) -#define CONNECTION_CLOSE_HEADER_VALUE "close" -#define CONNECTION_CLOSE_HEADER_VALUE_LENGTH ( sizeof( CONNECTION_CLOSE_HEADER_VALUE ) - 1 ) -#define CONNECTION_KEEP_ALIVE_HEADER_VALUE "keep-alive" -#define CONNECTION_KEEP_ALIVE_HEADER_VALUE_LENGTH ( sizeof( CONNECTION_KEEP_ALIVE_HEADER_VALUE ) - 1 ) - -/** - * @brief Retrieve the size of the S3 object that is specified in pPath. - * - * @param[out] pFileSize - The size of the S3 object. - * @param[in] connHandle - A valid connected connection handle. - * @param[in] pPath - The path to the S3 object. This includes all of the queries in the pre-signed URL as well. - * @param[in] pathLen - The length of the path to the S3 object. This length includes all of the queries following as well. - * @param[in] pAddress - The address of the S3 host extracted from the presigned S3 URL. - * @param[in] addressLen - The length of pAddress. - * @param[in] pReqUserBuffer - Buffer for storing the request context and headers. - * @param[in] reqUserBufferLen - Length of the request user buffer. - * @param[in] pRespUserBuffer - Buffer for storing the response context and headers. - * @param[in] respUserBufferLen - Length of the response user buffer. - */ -int _IotHttpsDemo_GetS3ObjectFileSize( uint32_t * pFileSize, - IotHttpsConnectionHandle_t connHandle, - const char * pPath, - uint32_t pathLen, - const char * pAddress, - uint32_t addressLen, - uint8_t * pReqUserBuffer, - uint32_t reqUserBufferLen, - uint8_t * pRespUserBuffer, - uint32_t respUserBufferLen ); - -#endif /* ifndef IOT_DEMO_HTTPS_COMMON_H_ */ diff --git a/demos/https/iot_demo_https_s3_download_async.c b/demos/https/iot_demo_https_s3_download_async.c deleted file mode 100644 index c774b286b6d..00000000000 --- a/demos/https/iot_demo_https_s3_download_async.c +++ /dev/null @@ -1,1273 +0,0 @@ -/* - * FreeRTOS V202011.00 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://aws.amazon.com/freertos - * http://www.FreeRTOS.org - */ - -/** - * @file iot_demo_https_async.c - * @brief Demonstrates asynchronous usage of the HTTPS library by performing a partial content GET request on a file - * from S3. - */ - -/* The config header is always included first. */ -#include "iot_config.h" - -/* C Standard includes. */ -#include -#include - -/* Set up logging for this demo. */ -#include "iot_demo_logging.h" - -/* FreeRTOS includes. */ -#include "iot_demo_https_common.h" -#include "iot_https_utils.h" -#include "aws_demo_config.h" -#include "platform/iot_network.h" -#include "platform/iot_threads.h" -#include "private/iot_error.h" -#include "platform/iot_clock.h" - -/** - * This demonstrates downloading a file from S3 using a pre-signed URL using the FreeRTOS HTTP Client library. - * The HTTPS Client library is a generic HTTP/1.1 client library that be used to download files from other webservers as - * well. - * - * A presigned URL is required to run this demo. Please see the demos/https/README.md for instructions on how to - * generate one. - * - * The file is downloaded incrementally using HTTP Partial Content headers. This is done by requesting ranges of the - * bytes in a file with the header: "Range: bytes=N-M", where N is the starting range and M is the ending range. The - * S3 HTTP server will response with a 206 Partial Content type of response and the file byte range requested. Please - * note that not all HTTP servers support a Partial Content download with a byte range. - * - * This demo cannot download a file larger than 2^32 - 1 bytes. - */ - -/** - * @cond DOXYGEN_IGNORE - * Doxygen should ignore this section. - * - * Provide default values for undefined configuration settings. You can see these configurations in iot_config.h. - */ - -/* Presigned URL for S3 GET Object access. */ -#ifndef IOT_DEMO_HTTPS_PRESIGNED_GET_URL - #define IOT_DEMO_HTTPS_PRESIGNED_GET_URL "Please configure a presigned GET URL in iot_config.h." -#endif - -/* TLS port for HTTPS. */ -#ifndef IOT_DEMO_HTTPS_PORT - #define IOT_DEMO_HTTPS_PORT ( ( uint16_t ) 443 ) -#endif - -#ifndef IOT_DEMO_HTTPS_TRUSTED_ROOT_CA - /* This the Baltimore Cybertrust associated with the S3 server certificate. */ - #define IOT_DEMO_HTTPS_TRUSTED_ROOT_CA \ - "-----BEGIN CERTIFICATE-----\n" \ - "MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ\n" \ - "RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD\n" \ - "VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX\n" \ - "DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y\n" \ - "ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy\n" \ - "VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr\n" \ - "mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr\n" \ - "IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK\n" \ - "mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu\n" \ - "XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy\n" \ - "dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye\n" \ - "jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1\n" \ - "BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3\n" \ - "DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92\n" \ - "9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx\n" \ - "jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0\n" \ - "Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz\n" \ - "ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS\n" \ - "R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\n" \ - "-----END CERTIFICATE-----\n" -#endif /* ifndef IOT_DEMO_HTTPS_TRUSTED_ROOT_CA */ - -/* The total number of requests in the pool of HTTPS Client library configurations and handles. In order to send - * a request asynchronously the memory for both the request buffers and the response buffers must not be shared between - * other asynchronous requests on the same connection. You can reuse the buffer only after the request/response process - * has been finished. It is finished when the responseCompleteCallback() is invoked. We create a pool of memory so that - * all available requests in the pool can be scheduled right away without over-writing each other. */ -#ifndef IOT_HTTPS_DEMO_MAX_ASYNC_REQUESTS - #define IOT_HTTPS_DEMO_MAX_ASYNC_REQUESTS ( ( int ) 3 ) -#endif - -/* Size in bytes of the User Buffer used to store the internal connection context. The size presented here accounts for - * storage of the internal connection context. The minimum size can be found in extern const unint32_t - * connectionUserBufferMinimumSize. */ -#ifndef IOT_DEMO_HTTPS_CONN_BUFFER_SIZE - #define IOT_DEMO_HTTPS_CONN_BUFFER_SIZE ( ( int ) 400 ) -#endif - -/* Size in bytes of the user buffer used to store the internal request context and HTTP request header lines. - * The size presented here accounts for the storage of the internal context, the first request line in the HTTP - * formatted header and extra headers. The minimum size can be found in extern const uint32_t - * requestUserBufferMinimumSize. Keep in mind that this requestUserBufferMinimumSize does not include the size of the - * path in the request line. The path could be well over 100 characters long as it includes not only the object key name - * in S3, but also the query following. The query following has the AWSAccessKeyId, the expiration time, and the - * AWS Signature Version 4 signature.*/ -#ifndef IOT_DEMO_HTTPS_REQ_USER_BUFFER_SIZE - #define IOT_DEMO_HTTPS_REQ_USER_BUFFER_SIZE ( ( int ) 512 ) -#endif - -/* Size in bytes of the user buffer used to store the internal response context and the HTTP response header lines. - * The size presented here accounts for the storage of the internal context, the first request line in the HTTP - * formatted header and extra headers. The minimum can be found in responseUserBufferMinimumSize. - * Keep in mind that if the headers from the response do not all fit into this buffer, then the rest of the headers - * will be discarded. The minimum size can be found in extern const uint32_t responseUserBufferMinimumSize. */ -#ifndef IOT_DEMO_HTTPS_RESP_USER_BUFFER_SIZE - #define IOT_DEMO_HTTPS_RESP_USER_BUFFER_SIZE ( ( int ) 1024 ) -#endif - -/* Size in bytes of the buffer used to store the response body (parts of it). This should be greater than or equal to - * the size of the file we want to download.*/ -#ifndef IOT_DEMO_HTTPS_RESP_BODY_BUFFER_SIZE - #define IOT_DEMO_HTTPS_RESP_BODY_BUFFER_SIZE ( ( int ) 512 ) -#endif - -/* Timeout in milliseconds to wait for all asynchronous requests to finish. This timeout starts when the last - * IOT_HTTPS_DEMO_MAX_ASYNC_REQUESTS sent has been scheduled. */ -#ifndef IOT_HTTPS_DEMO_ASYNC_TIMEOUT_MS - #define IOT_HTTPS_DEMO_ASYNC_TIMEOUT_MS ( ( uint32_t ) 300000 ) /* 5 minute timeout for this demo. */ -#endif - -/* Time to wait in milliseconds before retrying the HTTPS Connection. A connection is only attempted again if -* IOT_HTTPS_CONNECTION_ERROR is returned from IotHttpsClient_Connect(). This indicates an error in the network -* layer. To view logging for network errors update IOT_LOG_LEVEL_NETWORK to IOT_LOG_ERROR in iot_config.h. */ -#ifndef IOT_DEMO_HTTPS_CONNECTION_RETRY_WAIT_MS - #define IOT_DEMO_HTTPS_CONNECTION_RETRY_WAIT_MS ( ( uint32_t ) 3000 ) -#endif - -/* Number of times to retry the HTTPS connection. A connection is only attempted again if - * IOT_HTTPS_CONNECTION_ERROR is returned from IotHttpsClient_Connect(). This indicates an error in the network - * layer. To view logging for network errors update IOT_LOG_LEVEL_NETWORK to IOT_LOG_ERROR in iot_config.h. */ -#ifndef IOT_DEMO_HTTPS_CONNECTION_NUM_RETRY - #define IOT_DEMO_HTTPS_CONNECTION_NUM_RETRY ( ( uint32_t ) 3 ) -#endif - -/** @endcond */ - -/** - * @brief The time in milliseconds for the demo task to wait before trying again to find a free request from the pool - * of requests. - */ -#define GET_FREE_REQUEST_RETRY_WAIT_TIME_MS ( ( uint32_t ) 300 ) - -/** - * @brief The log2 of the number of bits in a uint8_t. - * - * This is for calculation of how many uint8_t words there should be in the bitmap. - */ -#define LOG2_BITS_PER_BYTE ( ( uint32_t ) 3 ) -#define BITS_PER_BYTE ( ( ( uint32_t ) 1 ) << LOG2_BITS_PER_BYTE ) /**< @brief The number of bits in a byte. */ - -/** - * @brief Bitmask calculation for setting the file download information bitmaps. - */ -#define BITMASK( rangeBlock ) ( ( ( uint32_t ) 1 ) << ( ( ( uint32_t ) rangeBlock ) % BITS_PER_BYTE ) ) - -/** - * @brief Byte offset calculation for indexing to the correct byte in the file download information bitmap. - */ -#define BYTE_OFFSET( rangeBlock ) ( ( ( uint32_t ) rangeBlock ) >> LOG2_BITS_PER_BYTE ) - -/*-----------------------------------------------------------*/ - -/** - * @brief This structure defines data consumed and kept track of in the async callbacks per request. - */ -typedef struct _requestContext -{ - char pRangeValueStr[ RANGE_VALUE_MAX_LENGTH ]; /**< @brief This string is generated outside of the callback context and used to set the request Range header within the callback context. */ - int reqNum; /**< @brief This is the current request number in the static pool of request memory. */ - uint32_t currRange; /**< @brief This is the current range block that is being downloaded. */ - uint32_t currDownloaded; /**< @brief The current number of bytes downloaded in this request. */ - uint32_t numReqBytes; /**< @brief The number of bytes we want to downloaded in this request. */ - IotHttpsConnectionHandle_t * pConnHandle; /**< @brief The connection handle for the request/response. */ - IotHttpsConnectionInfo_t * pConnConfig; /**< @brief Pointer to the connection handle for the request/response. */ - bool scheduled; /**< @brief This is set to true when the request has been scheduled */ -} _requestContext_t; - -/** - * @brief This structure defines information related to the file we wish to download. - * - * This information keeps track of the size of the file, the total number of range blocks, which blocks have completed, - * which ones are scheduled to be requested, and how many range blocks remain. - */ -typedef struct _fileDownloadInfo -{ - uint32_t fileSize; /**< @brief The total size of the file to be downloaded. */ - uint32_t totalRanges; /**< @brief the total number of ranges in the file size. */ - uint8_t * downloadedBitmap; /**< @brief Bitmap to keep track of chunks downloaded. */ - uint8_t * scheduledBitmap; /**< @brief Bitmap of ranges scheduled, but not completed. */ - uint32_t rangesRemaining; /**< @brief The total number of ranges remaining to download. */ -} _fileDownloadInfo_t; - -/** - * @brief The definition for the pool of HTTPS Client library request resources. - * - * This structure definition contains the pool of memory and configurations needed for supported multiple requests and - * their associated responses. - */ -typedef struct _requestPool -{ - /** - * @brief The pool of asynchronous request specific configurations. - */ - IotHttpsAsyncInfo_t pAsyncInfos[ IOT_HTTPS_DEMO_MAX_ASYNC_REQUESTS ]; - - /** - * @brief The pool of HTTPS Client library response configurations. - */ - IotHttpsRequestInfo_t pReqConfigs[ IOT_HTTPS_DEMO_MAX_ASYNC_REQUESTS ]; - - /** - * @brief The pool of HTTPS Client library response configurations. - */ - IotHttpsResponseInfo_t pRespConfigs[ IOT_HTTPS_DEMO_MAX_ASYNC_REQUESTS ]; - - /** - * @brief The pool of HTTPS Client library request handles. - */ - IotHttpsRequestHandle_t pReqHandles[ IOT_HTTPS_DEMO_MAX_ASYNC_REQUESTS ]; - - /** - * @brief The pool of HTTPS Client library response handles. - */ - IotHttpsResponseHandle_t pRespHandles[ IOT_HTTPS_DEMO_MAX_ASYNC_REQUESTS ]; - - /** - * @brief The pool of buffers used to store the request context and the HTTP request header lines. - */ - uint8_t pReqUserBuffers[ IOT_HTTPS_DEMO_MAX_ASYNC_REQUESTS ][ IOT_DEMO_HTTPS_REQ_USER_BUFFER_SIZE ]; - - /** - * @brief The pool of buffers used to store the response context and the HTTP response header lines. - */ - uint8_t pRespUserBuffers[ IOT_HTTPS_DEMO_MAX_ASYNC_REQUESTS ][ IOT_DEMO_HTTPS_RESP_USER_BUFFER_SIZE ]; - - /** - * @brief The pool of data kept track of and used in the callback context for each request. - */ - _requestContext_t pRequestContexts[ IOT_HTTPS_DEMO_MAX_ASYNC_REQUESTS ]; -} _requestPool_t; - -/*-----------------------------------------------------------*/ - -/** - * @brief Buffer to store parts of the response body. - * - * Since all of the requests in this demo are on the same connection, only one async task at a time will be accessing - * this buffer to retrieve data from the network to print. - */ -static uint8_t _pRespBodyBuffer[ IOT_DEMO_HTTPS_RESP_BODY_BUFFER_SIZE ] = { 0 }; - -/** - * @brief Semaphore used to signal that the demo is finished. - * The task that downloads the final increment of the file posts to this semaphore. - */ -static IotSemaphore_t _fileFinishedSem = { 0 }; - -/** - * @brief Array to keep track of HTTPS Client library request and response resources (buffers, handles, and configs) - * in use. - */ -static bool _pInUseRequests[ IOT_HTTPS_DEMO_MAX_ASYNC_REQUESTS ] = { 0 }; - -/** - * @brief Mutex to protect retrieving and setting the requests in use. - * - * This protects the buffers from being reused. - */ -static IotMutex_t _inUseRequestsMutex = { 0 }; - -/** - * @brief Mutex protecting the scheduling of requests. - * - * This protects scheduling activities. If The connection is closed by the server, then the asynchronous callback - * context will reschedule requests that have not been sent yet. The demo application thread also schedules requests - * when there is a request user buffer available. This mutex ensures requests are not schedule multiple times. - */ -static IotMutex_t _requestSchedulingMutex = { 0 }; - -/** - * @brief Configurations for the HTTPS connection. - */ -static IotHttpsConnectionInfo_t _connConfig = { 0 }; - -/** - * @brief Handle identifying the HTTPS connection. - */ -static IotHttpsConnectionHandle_t _connHandle = IOT_HTTPS_CONNECTION_HANDLE_INITIALIZER; - -/** - * @brief Connection buffer use to store the internal connection context. - */ -static uint8_t _pConnUserBuffer[ IOT_DEMO_HTTPS_CONN_BUFFER_SIZE ] = { 0 }; - -/** - * @brief Pool of request and associated response buffers, handles, and configurations. - */ -static _requestPool_t _requestPool = { 0 }; - -/** - * @brief Information about the file that is to be downloaded. - */ -static _fileDownloadInfo_t _fileDownloadInfo = { 0 }; - -/*-----------------------------------------------------------*/ - -/* Declaration of the demo function. */ -int RunHttpsAsyncDownloadDemo( bool awsIotMqttMode, - const char * pIdentifier, - void * pNetworkServerInfo, - void * pNetworkCredentialInfo, - const IotNetworkInterface_t * pNetworkInterface ); - -/*-----------------------------------------------------------*/ - -/** - * @brief Get an index to a free HTTPS Client library request resource. - * - * The resource pool is defined above in the static variables section. - * - * @return The free index if one is found. -1 if one is not found. - */ -static int _getFreeRequestIndex( void ) -{ - int i = 0; - int freeIndex = -1; - - IotMutex_Lock( &( _inUseRequestsMutex ) ); - - for( i = 0; i < IOT_HTTPS_DEMO_MAX_ASYNC_REQUESTS; i++ ) - { - if( !_pInUseRequests[ i ] ) - { - _pInUseRequests[ i ] = true; - freeIndex = i; - break; - } - } - - IotMutex_Unlock( &( _inUseRequestsMutex ) ); - - /* If we exited the loop, then none were found. */ - return freeIndex; -} - -/*-----------------------------------------------------------*/ - -/** - * @brief Clear the request context in preparation for the next request to use. - * - * User buffers and body buffers are zeroed out by the HTTPS Client library. - */ -static void _clearRequestContext( int i ) -{ - memset( &_requestPool.pRequestContexts[ i ], 0, sizeof( _requestContext_t ) ); -} - -/*-----------------------------------------------------------*/ - -/** - * @brief Free an index in the pool HTTPS Client library request resource. - * - * The resource pool is defined above in the static variables section. - * - * @param[in] i The index in the request pool to mark as free for use. - */ -static void _freeRequestIndex( int i ) -{ - IotMutex_Lock( &( _inUseRequestsMutex ) ); - _pInUseRequests[ i ] = false; - _clearRequestContext( i ); - IotMutex_Unlock( &( _inUseRequestsMutex ) ); -} - -/*-----------------------------------------------------------*/ - -/** - * @brief Free all requests in the pool that have been marked as scheduled, except - * for the exception index. - * - * This function is used during reconnection to free any possible requests that - * might still have been scheduled to the HTTPS Client library to run but have - * not been sent yet. Reconnection happens during the _readReadyCallback(). - * The response's memory cannot be used until the _responseCompleteCallback() - * returns, so during reconnection we need to indicate that all memory except - * the current response is to be marked as free. - * - * @param[in] exception Request index to not free. This is -1 for no exceptions. - */ -static void _freeScheduledRequests( int exception ) -{ - /* Index into the request pool. */ - int i = 0; - - IotMutex_Lock( &( _inUseRequestsMutex ) ); - - for( i = 0; i < IOT_HTTPS_DEMO_MAX_ASYNC_REQUESTS; i++ ) - { - if( ( i != exception ) && - ( _requestPool.pRequestContexts[ i ].scheduled == true ) ) - { - _pInUseRequests[ i ] = false; - _clearRequestContext( i ); - } - } - - IotMutex_Unlock( &( _inUseRequestsMutex ) ); -} - -/*-----------------------------------------------------------*/ - -/** - * @brief Initialize the file download information. - * - * @param[in] fileSize - The size of the file that is desired to download. - * - * @return `EXIT_SUCCESS` if _fileDownloadInformation was successfully initialized. `EXIT_FAILURE` otherwise. - */ -static int _initializeFileDownloadInformation( size_t fileSize ) -{ - IOT_FUNCTION_ENTRY( int, EXIT_SUCCESS ); - - /* The length of the bitmap for allocating a new bitmap. */ - uint32_t bitmapLength; - - _fileDownloadInfo.fileSize = fileSize; - - /* Set the total number of ranges needed to download the file. */ - _fileDownloadInfo.totalRanges = ( _fileDownloadInfo.fileSize + IOT_DEMO_HTTPS_RESP_BODY_BUFFER_SIZE - 1 ) / IOT_DEMO_HTTPS_RESP_BODY_BUFFER_SIZE; - _fileDownloadInfo.rangesRemaining = _fileDownloadInfo.totalRanges; - /* Calculate the length of the rangeBitmap to keep track of already downloaded ranges. */ - bitmapLength = ( _fileDownloadInfo.totalRanges + ( BITS_PER_BYTE - 1U ) ) >> LOG2_BITS_PER_BYTE; - _fileDownloadInfo.downloadedBitmap = ( uint8_t * ) IotDemo_Malloc( bitmapLength ); - - if( _fileDownloadInfo.downloadedBitmap == NULL ) - { - IotLogError( "Could not allocate a new bitmap for keeping track of downloaded ranges." ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - _fileDownloadInfo.scheduledBitmap = ( uint8_t * ) IotDemo_Malloc( bitmapLength ); - - if( _fileDownloadInfo.scheduledBitmap == NULL ) - { - IotLogError( "Could not allocate a new bitmap for keeping track of scheduled ranges." ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - memset( _fileDownloadInfo.downloadedBitmap, 0, bitmapLength ); - memset( _fileDownloadInfo.scheduledBitmap, 0, bitmapLength ); - - IOT_FUNCTION_EXIT_NO_CLEANUP(); -} - -/*-----------------------------------------------------------*/ - -/** - * @brief Clean up the file download information. - * - * Deallocates resources taken by the file download information context. - */ -static void _cleanupFileDownloadInformation( void ) -{ - if( _fileDownloadInfo.downloadedBitmap != NULL ) - { - IotDemo_Free( _fileDownloadInfo.downloadedBitmap ); - } - - if( _fileDownloadInfo.scheduledBitmap != NULL ) - { - IotDemo_Free( _fileDownloadInfo.scheduledBitmap ); - } -} - -/*-----------------------------------------------------------*/ - -/** - * @brief Starting from a current range, get the next incomplete file byte range. - * - * A range is incomplete if it is both not completely downloaded and it is unscheduled to an asynchronous request. - * If the currentRange is incomplete, then that is returned, otherwise the next incomplete one is returned. - * If the next incomplete range is before the currentRange, this routine will circle back to the start of the bitmap to - * get the incomplete range. - * - * @param[in out] The currentRange to start checking for an incomplete range. This will get replaced with the incomplete - * range. The value here is valid only if the function returns true. - * - * @return false if there are no incomplete ranges left. - * True if an incomplete range was found. - */ -static bool _getNextIncompleteRange( uint32_t * currentRange ) -{ - bool found = false; - /* An intermediate bitMask calculation for checking if the currentRange is already downloaded or not. */ - uint32_t bitMask = 0; - - /* An intermediate byteOffset into the downloadedBitmap and scheduledBitmap to check if the currentRange is - * already downloaded or already scheduled. */ - uint32_t byteOffset = 0; - - /* A count from 0 to check if the total ranges is reached because, in the logic below, currentRange will wrap - * around to check the start of the bitmap. */ - uint32_t rangeCheckCount = 0; - - do - { - /* Check if the current range in the file is already downloaded or is has already been scheduled. The - * bitmaps contain as many bits as there are blocks of byte ranges. The lines below help to index - * into the bitmaps and check if the bit representing that byte range is set. */ - bitMask = BITMASK( *currentRange ); - byteOffset = BYTE_OFFSET( *currentRange ); - - /* If this range has not been downloaded yet and has not been schedule, then return the current range. */ - if( ( ( _fileDownloadInfo.downloadedBitmap[ byteOffset ] & bitMask ) == ( ( uint8_t ) 0 ) ) && - ( ( _fileDownloadInfo.scheduledBitmap[ byteOffset ] & bitMask ) == ( ( uint8_t ) 0 ) ) ) - { - break; - } - - rangeCheckCount++; - ( *currentRange )++; - - /* This is less expensive than a modulus. */ - if( *currentRange == _fileDownloadInfo.totalRanges ) - { - *currentRange = 0; - } - } while( rangeCheckCount < _fileDownloadInfo.totalRanges ); - - if( rangeCheckCount == _fileDownloadInfo.totalRanges ) - { - found = false; - } - else - { - found = true; - } - - return found; -} - -/*-----------------------------------------------------------*/ - -/** - * @brief Clear all scheduled ranges in the bitmap for the file to download. - */ -static void _clearAllScheduledRanges( void ) -{ - /* The current range to check if it is scheduled. */ - uint32_t rangeIndex = 0; - /* Bit mask to check in the scheduled bit map if the range has been scheduled. */ - uint32_t bitMask = 0; - /* Byte offset into the scheduled bit map where the range will be located. */ - uint32_t byteOffset = 0; - - for( rangeIndex = 0; rangeIndex < _fileDownloadInfo.totalRanges; rangeIndex++ ) - { - bitMask = BITMASK( rangeIndex ); - byteOffset = BYTE_OFFSET( rangeIndex ); - - if( ( _fileDownloadInfo.scheduledBitmap[ byteOffset ] & bitMask ) != ( ( uint8_t ) 0 ) ) - { - _fileDownloadInfo.scheduledBitmap[ byteOffset ] &= ( ~( bitMask ) ); - } - } -} - -/*-----------------------------------------------------------*/ - -/** - * @brief Callback for an asynchronous request to append the Range header to the request header buffer. - * - * @param[in] pPrivData - User private data configured with the HTTPS Client library request configuration. - * @param[in] reqHandle - Identifier for the current request in progress. - */ -static void _appendHeaderCallback( void * pPrivData, - IotHttpsRequestHandle_t reqHandle ) -{ - /* The range value string, of the increment of file to download, from the user private data will be referenced with - * this variable. */ - char * pRangeValueStr = ( ( _requestContext_t * ) ( pPrivData ) )->pRangeValueStr; - - IotLogInfo( "Inside of the append header callback for part %s", pRangeValueStr ); - /* The length of the range value string. */ - uint32_t rangeValueLen = strlen( pRangeValueStr ); - /* Set the header for a range request and check the HTTPS Client library return code. */ - IotHttpsReturnCode_t status = IotHttpsClient_AddHeader( reqHandle, RANGE_HEADER_FIELD, RANGE_HEADER_FIELD_LENGTH, pRangeValueStr, rangeValueLen ); - - if( status != IOT_HTTPS_OK ) - { - IotLogError( "Failed to write the header Range: %.*s into the request. With error code: %d", rangeValueLen, pRangeValueStr, status ); - /* In this demo cancelling the request is an error condition that ends the demo with a failure. */ - IotHttpsClient_CancelRequestAsync( reqHandle ); - } -} - -/*-----------------------------------------------------------*/ - -/** - * @brief Callback for an asynchronous request to read data from the network. - * - * @note If you wanted to read any headers you must do so in this callback. - * - * @param[in] pPrivData - User private data configured with the HTTPS Client library request configuration. - * @param[in] respHandle - Identifier for the current response in progress. - * @param[in] rc - Return code from the HTTPS Client Library signaling a possible error. - * @param[in] status - The HTTP response status. - */ -static void _readReadyCallback( void * pPrivData, - IotHttpsResponseHandle_t respHandle, - IotHttpsReturnCode_t rc, - uint16_t status ) -{ - /* The amount of body read during this callback. */ - uint32_t readLen; - - /* The range value string, of the increment of file to download, from the user private data will be referenced with - * this variable. */ - char * pRangeValueStr; - /* The HTTP Client Library return code. */ - IotHttpsReturnCode_t returnStatus; - /* The user private data dereferenced. */ - _requestContext_t * pRequestContext = ( _requestContext_t * ) ( pPrivData ); - /* The content length of this HTTP response. */ - uint32_t contentLength = 0; - - /* Buffer to read the HTTP "Connection" header value into. The possible values are "close" and "keep-alive". This - * is the length of the longest string, "keep-alive" plus a NULL terminator. */ - char connectionValueStr[ CONNECTION_KEEP_ALIVE_HEADER_VALUE_LENGTH + 1 ] = { 0 }; - - IotLogInfo( "Inside of the read ready callback for part %s with network return code: %d", pRequestContext->pRangeValueStr, rc ); - - /* If this function is invoked multiple times, we may only want to read the Content-Length header and check the - * HTTP response status once. */ - if( pRequestContext->currDownloaded == 0 ) - { - /* If this response is not a successful partial content delivery, as indicated on the HTTP response code 206, - * then cancel this request. In this demo cancelling the request is an error condition that ends the demo.*/ - if( status != IOT_HTTPS_STATUS_PARTIAL_CONTENT ) - { - IotLogError( "Could not retrieve file from S3. Status code %d", status ); - IotHttpsClient_CancelResponseAsync( respHandle ); - return; - } - - IotLogDebug( "Reading the content length for response %p.", respHandle ); - returnStatus = IotHttpsClient_ReadContentLength( respHandle, &contentLength ); - - if( ( returnStatus != IOT_HTTPS_OK ) || ( contentLength == 0 ) ) - { - IotLogError( "Failed to retrieve the Content-Length from the response. " - "Please try increasing the size of IOT_DEMO_HTTPS_RESP_USER_BUFFER_SIZE." ); - IotHttpsClient_CancelResponseAsync( respHandle ); - return; - } - - /* If the content length of the message is not equal to the size of the byte range we want to download then - * cancel the request. In this demo cancelling the request is an error condition that ends the demo. */ - if( contentLength != pRequestContext->numReqBytes ) - { - IotLogError( "The Content-Length found in this file does not equal the number of bytes requested. So we may " - "not have download the file completely. The content length is %d and the requested number of bytes for " - "this request is %d", contentLength, pRequestContext->numReqBytes ); - IotHttpsClient_CancelResponseAsync( respHandle ); - return; - } - } - - /* Get the the amount of data to read. This demo will fill as much data from the network as can fit into the - * response body buffer. */ - readLen = sizeof( _pRespBodyBuffer ); - - /* Read the data from the network. */ - returnStatus = IotHttpsClient_ReadResponseBody( respHandle, _pRespBodyBuffer, &readLen ); - - if( returnStatus != IOT_HTTPS_OK ) - { - IotLogError( "Failed to read the response body with error %d", returnStatus ); - IotHttpsClient_CancelResponseAsync( respHandle ); - return; - } - - /* Process the response body here. */ - pRangeValueStr = pRequestContext->pRangeValueStr; - IotLogInfo( "Response return code: %d for %s", status, pRangeValueStr ); - IotLogInfo( "Response Body for %s:\r\n%.*s", pRangeValueStr, readLen, _pRespBodyBuffer ); - - /* This callback could be invoked again if there is still more data on the network to be read for this response, so - * the current amount downloaded is incremented. */ - pRequestContext->currDownloaded += readLen; - - if( pRequestContext->currDownloaded > pRequestContext->numReqBytes ) - { - IotLogError( "There is more data received on this response than expected. Received %d data, but requested %d.", - pRequestContext->currDownloaded, - pRequestContext->numReqBytes ); - IotHttpsClient_CancelResponseAsync( respHandle ); - return; - } - - /* Only in the non-error case of the downloaded data equalling the number of requested bytes is the ranged marked - * as downloaded. Also, it makes sense only in the non-error case to check if the server closed the connection. - * Error cases, such as the response body not having the number of requested bytes in the range, will stop the - * demo. */ - if( pRequestContext->currDownloaded == pRequestContext->numReqBytes ) - { - /* Defensive check for overflow. */ - if( _fileDownloadInfo.rangesRemaining == 0 ) - { - IotLogError( "An extra range was downloaded; Range: %s.", pRequestContext->pRangeValueStr ); - IotHttpsClient_CancelResponseAsync( respHandle ); - return; - } - - _fileDownloadInfo.rangesRemaining--; - _fileDownloadInfo.downloadedBitmap[ BYTE_OFFSET( pRequestContext->currRange ) ] |= BITMASK( pRequestContext->currRange ); - - /* Check if the server closed the connection. This done in the readReadyCallback() because a possible pending - * request could be sent right after this response's body is finished being read. This means the - * responseCompleteCallback() is invoked at the same time as another request is sending on the same connetion. - * This is done to increase parallelism in the library. Because the responseCompeteCallback() could be executing - * at the same time a request is being sent, a reconnection needs to be made before the next request sends and - * gets a network error ending the demo. Please see the design flow for more information: - * https://docs.aws.amazon.com/freertos/latest/lib-ref/https/https_design.html#Asynchronous_Design */ - IotLogDebug( "Looking for the \"Connection\" header in response %p.", respHandle ); - returnStatus = IotHttpsClient_ReadHeader( respHandle, - CONNECTION_HEADER_FIELD, - CONNECTION_HEADER_FILED_LENGTH, - connectionValueStr, - sizeof( connectionValueStr ) ); - - /* If there is any other error besides "not found", then that is a fatal error. S3's response will include the - * Connection header only if it closes the connection after the response. */ - if( ( returnStatus != IOT_HTTPS_OK ) && ( returnStatus != IOT_HTTPS_NOT_FOUND ) ) - { - IotLogError( "Failed to read header %s. Error code: %d.", CONNECTION_HEADER_FIELD, returnStatus ); - IotHttpsClient_CancelResponseAsync( respHandle ); - return; - } - - if( strncmp( CONNECTION_CLOSE_HEADER_VALUE, connectionValueStr, CONNECTION_CLOSE_HEADER_VALUE_LENGTH ) == 0 ) - { - IotLogInfo( "The S3 server closed the connection. Reconnecting and rescheduling requests." ); - IotMutex_Lock( &( _requestSchedulingMutex ) ); - - /* All requests scheduled on this connection are dropped during a reconnect. Reconnection disconnects - * a connection that is in the open state, then connects to the server configured. When the connection is - * disconnected it's queue of pending requests is cleared. Since this affects the state of what is - * scheduled, this action is performed within the _requestSchedulingMutex. */ - returnStatus = IotHttpsClient_Connect( pRequestContext->pConnHandle, pRequestContext->pConnConfig ); - - if( returnStatus != IOT_HTTPS_OK ) - { - IotLogError( "Failed to reconnect to the server. Error code: %d.", returnStatus ); - IotHttpsClient_CancelResponseAsync( respHandle ); - } - else - { - IotLogInfo( "Successfully reconnected to the server." ); - - /* For all requests from the pool that have been scheduled. We want to free them so they will get - * rescheduled by the main application. When a request from the pool is set to unused its associated - * response is also set to unused. This current response is not set to unused so that it's response - * handle memory is not overwritten. This response cannot be reused until the responseCompleteCallback - * is finished. */ - _freeScheduledRequests( pRequestContext->reqNum ); - - /* For each of the scheduled ranges mark them as unscheduled so that the main application will assign - * them to a free request. This current request's range will not be rescheduled because earlier in this - * function the downloadedBitmap was marked before this routine. */ - _clearAllScheduledRanges(); - } - - IotMutex_Unlock( &( _requestSchedulingMutex ) ); - } - } -} - -/*-----------------------------------------------------------*/ - -/** - * @brief Callback for an asynchronous request to notify that the response is complete. - * - * @param[in] pPrivData - User private data configured with the HTTPS Client library request configuration. - * @param[in] respHandle - Identifier for the current response finished. - * @param[in] rc - Return code from the HTTPS Client Library signaling a possible error. - * @param[in] status - The HTTP response status. - */ -static void _responseCompleteCallback( void * pPrivData, - IotHttpsResponseHandle_t respHandle, - IotHttpsReturnCode_t rc, - uint16_t status ) -{ - _requestContext_t * pRequestContext = ( _requestContext_t * ) ( pPrivData ); - - ( void ) respHandle; - ( void ) status; - - IotLogInfo( "Part %s has been fully processed.", pRequestContext->pRangeValueStr ); - - /* If there is was an error anywhere in the request response processing, including a cancellation, then that will - * end the demo. */ - if( rc != IOT_HTTPS_OK ) - { - IotLogError( "There was a problem with the current response %p. Error code: %d. ", respHandle, rc ); - IotSemaphore_Post( &( _fileFinishedSem ) ); - } - else if( pRequestContext->currDownloaded != pRequestContext->numReqBytes ) - { - /* If in this response the total amount read does not equal the number of bytes we requested, then something - * went wrong. */ - IotLogError( "There was a problem downloading the range of the file. We downloaded %d. but wanted %d.", - pRequestContext->currDownloaded, - pRequestContext->numReqBytes ); - IotSemaphore_Post( &( _fileFinishedSem ) ); - } - else - { - /* The main application is waiting for the response to finish. The demo application task signals that the file - * is finished when the number of ranges downloaded equals the total number of ranges. */ - IotLogInfo( "Downloaded: %d/%d range blocks", _fileDownloadInfo.totalRanges - _fileDownloadInfo.rangesRemaining, _fileDownloadInfo.totalRanges ); - - if( _fileDownloadInfo.rangesRemaining == 0 ) - { - IotLogDebug( "File fully downloaded. Range blocks downloaded: %d", _fileDownloadInfo.totalRanges - _fileDownloadInfo.rangesRemaining ); - IotSemaphore_Post( &( _fileFinishedSem ) ); - } - } - - /* Free up this request from the request pool. This is done last to ensure that the request context is not - * overwritten by a new request. */ - _freeRequestIndex( pRequestContext->reqNum ); - _fileDownloadInfo.scheduledBitmap[ BYTE_OFFSET( pRequestContext->currRange ) ] &= ~( BITMASK( pRequestContext->currRange ) ); -} - -/*-----------------------------------------------------------*/ - -/** - * @brief Callback for an asynchronous request to notify that the connection was closed. - * - * The connection will close and this callback will be invoked if there are network errors or if there was an error - * parsing the response. - * The connection will also close and this callback invoked, if a request is marked as non-persistent in - * #IotHttpsRequestInfo_t.isNonPersistent. - * This demo does not send a non-persistent marked request. - * This callback will not be invoked when the application calls API IotHttpsClient_Disconnect() to disconnect - * explicitly. - * - * @param[in] pPrivData - User private data configured with the HTTPS Client library request configuration. - * @param[in] connHandle - Identifier for the current connection. - * @param[in] rc - Return code from the HTTPS Client Library signaling a possible error.. - */ -static void _connectionClosedCallback( void * pPrivData, - IotHttpsConnectionHandle_t connHandle, - IotHttpsReturnCode_t rc ) -{ - ( void ) pPrivData; - ( void ) connHandle; - ( void ) rc; - IotLogInfo( "Connection with the s3 server has been closed." ); -} - -/*-----------------------------------------------------------*/ - -/** - * @brief Callback to notify of errors that occurred during this asynchronous request. - * - * @param[in] pPrivData - User private data configured with the HTTPS Client library request configuration. - * @param[in] reqHandle - Identifier for the request. - * @param[in] rc - Return code from the HTTPS Client Library of the error. - */ -static void _errorCallback( void * pPrivData, - IotHttpsRequestHandle_t reqHandle, - IotHttpsResponseHandle_t respHandle, - IotHttpsReturnCode_t rc ) -{ - ( void ) reqHandle; - ( void ) respHandle; - - char * pRangeValueStr = ( ( _requestContext_t * ) ( pPrivData ) )->pRangeValueStr; - IotLogError( "An error occurred during range %s with code: %d", pRangeValueStr, rc ); -} - -/*-----------------------------------------------------------*/ - -/** - * @brief Schedule the asynchronous request. - * - * This routine will prepare the request then schedule it. - * - * @param[in] reqIndex The index into the request resource pool. - * @param[in] currentRange The current partial file range to request. - * - * @return `EXIT_SUCCESS` if the request was successfully scheduled. `EXIT_FAILURE` otherwise. - */ -static int _scheduleAsyncRequest( int reqIndex, - uint32_t currentRange ) -{ - IOT_FUNCTION_ENTRY( int, EXIT_SUCCESS ); - - /* HTTPS Client library return status. */ - IotHttpsReturnCode_t httpsClientStatus; - /* The number of bytes we want to request with in each range of the file bytes. */ - uint32_t numReqBytes = 0; - /* curByte indicates which starting byte we want to download next. */ - uint32_t curByte = 0; - - /* The starting byte is found as the start of a multiple of the body buffer. */ - curByte = currentRange * IOT_DEMO_HTTPS_RESP_BODY_BUFFER_SIZE; - - /* The number of bytes requested each time is the size of the body buffer or it is the remaining file range left. */ - numReqBytes = IOT_DEMO_HTTPS_RESP_BODY_BUFFER_SIZE; - - if( ( _fileDownloadInfo.fileSize - curByte ) < numReqBytes ) - { - numReqBytes = _fileDownloadInfo.fileSize - curByte; - } - - /* Generate the "Range" header's value string of the form "bytes=N-M". */ - int numWritten = snprintf( _requestPool.pRequestContexts[ reqIndex ].pRangeValueStr, - sizeof( _requestPool.pRequestContexts[ reqIndex ].pRangeValueStr ), - "bytes=%u-%u", - ( unsigned int ) curByte, - ( unsigned int ) ( curByte + numReqBytes - 1 ) ); - - if( ( numWritten < 0 ) || ( numWritten >= ( ( int ) sizeof( _requestPool.pRequestContexts[ reqIndex ].pRangeValueStr ) ) ) ) - { - IotLogError( "Failed to write the header value: \"bytes=%d-%d\" . Error code: %d", - curByte, - curByte + numReqBytes - 1, - numWritten ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Set the user private data to use in the asynchronous callback context. */ - _requestPool.pRequestContexts[ reqIndex ].pConnHandle = &_connHandle; - _requestPool.pRequestContexts[ reqIndex ].pConnConfig = &_connConfig; - _requestPool.pRequestContexts[ reqIndex ].reqNum = reqIndex; - _requestPool.pRequestContexts[ reqIndex ].currRange = currentRange; - _requestPool.pRequestContexts[ reqIndex ].currDownloaded = 0; - _requestPool.pRequestContexts[ reqIndex ].numReqBytes = numReqBytes; - - /* Re-initialize the request to reuse the request. If we do not reinitialize, then data from the last response - * associated with a different request will linger. */ - httpsClientStatus = IotHttpsClient_InitializeRequest( &( _requestPool.pReqHandles[ reqIndex ] ), - &( _requestPool.pReqConfigs[ reqIndex ] ) ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred in IotHttpsClient_InitializeRequest() with error code: %d", - httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Send the request and receive the response asynchronously. This will schedule the async request. This function - * will return immediately after scheduling. */ - IotLogDebug( "Sending asynchronously %s, req num: %p", _requestPool.pRequestContexts[ reqIndex ].pRangeValueStr, _requestPool.pReqHandles[ reqIndex ] ); - httpsClientStatus = IotHttpsClient_SendAsync( _connHandle, - _requestPool.pReqHandles[ reqIndex ], - &( _requestPool.pRespHandles[ reqIndex ] ), - &( _requestPool.pRespConfigs[ reqIndex ] ) ); - _fileDownloadInfo.scheduledBitmap[ BYTE_OFFSET( currentRange ) ] |= BITMASK( currentRange ); - _requestPool.pRequestContexts[ reqIndex ].scheduled = true; - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "Failed to send the request asynchronously with error code: %d", httpsClientStatus ); - /* If we failed to schedule an async request then this is an error and we should exit the loop. */ - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - IOT_FUNCTION_EXIT_NO_CLEANUP(); -} - -/*-----------------------------------------------------------*/ - -/** - * @brief The function that runs the HTTPS Asynchronous demo. - * - * @param[in] awsIotMqttMode Specify if this demo is running with the AWS IoT MQTT server. This is ignored in this demo. - * @param[in] pIdentifier NULL-terminated MQTT client identifier. This is ignored in this demo. - * @param[in] pNetworkServerInfo Contains network information specific for the MQTT demo. This is ignored in this demo. - * @param[in] pNetworkCredentialInfo Contains credential info for a TLS connection. - * @param[in] pNetworkInterface Network interface to use for this demo. - * - * @return `EXIT_SUCCESS` if the demo completes successfully; `EXIT_FAILURE` otherwise. - */ -int RunHttpsAsyncDownloadDemo( bool awsIotMqttMode, - const char * pIdentifier, - void * pNetworkServerInfo, - void * pNetworkCredentialInfo, - const IotNetworkInterface_t * pNetworkInterface ) -{ - IOT_FUNCTION_ENTRY( int, EXIT_SUCCESS ); - - /* Unused parameters. */ - ( void ) awsIotMqttMode; - ( void ) pIdentifier; - ( void ) pNetworkServerInfo; - - /* HTTPS Client library return status. */ - IotHttpsReturnCode_t httpsClientStatus; - - /* The location of the path within string IOT_DEMO_HTTPS_PRESIGNED_GET_URL. */ - const char * pPath = NULL; - /* The length of the path within string IOT_DEMO_HTTPS_PRESIGNED_GET_URL. */ - size_t pathLen = 0; - /* The location of the address within string IOT_DEMO_HTTPS_PRESIGNED_GET_URL. */ - const char * pAddress = NULL; - /* The length of the address within string IOT_DEMO_HTTPS_PRESIGNED_GET_URL. */ - size_t addressLen = 0; - - /* The current attempt in the number of connection tries. */ - uint32_t connAttempt = 0; - /* The current request index being processed. */ - int reqIndex = 0; - /* The current range that is getting ready to schedule a request for. */ - uint32_t currentRange = 0; - /* The length of file that is desired to download. */ - size_t fileSize = 0; - - /* Signal if the global semaphores were created for cleanup. */ - bool inUseRequestMutexCreated = false; - bool fileFinishedSemCreated = false; - bool requestSchedulingMutexCreated = false; - - IotLogInfo( "HTTPS Client Asynchronous S3 download demo using pre-signed URL: %s", IOT_DEMO_HTTPS_PRESIGNED_GET_URL ); - - /* Retrieve the path location from IOT_DEMO_HTTPS_PRESIGNED_GET_URL. This function returns the length of the path - * without the query into pathLen. */ - httpsClientStatus = IotHttpsClient_GetUrlPath( IOT_DEMO_HTTPS_PRESIGNED_GET_URL, strlen( IOT_DEMO_HTTPS_PRESIGNED_GET_URL ), &pPath, &pathLen ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred in IotHttpsClient_GetUrlPath() with error code %d.", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* The path is everything that is not the address. It also includes the query. So we get the strlen( pPath ) to - * acquire everything following in IOT_DEMO_HTTPS_PRESIGNED_GET_URL. */ - pathLen = strlen( pPath ); - - /* Retrieve the address location and length from the IOT_DEMO_HTTPS_PRESIGNED_GET_URL. */ - httpsClientStatus = IotHttpsClient_GetUrlAddress( IOT_DEMO_HTTPS_PRESIGNED_GET_URL, strlen( IOT_DEMO_HTTPS_PRESIGNED_GET_URL ), &pAddress, &addressLen ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred in IotHttpsClient_GetUrlAddress() with error code %d.", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Set the connection configurations. - * Note: TLS Connection to AWS S3 service does not need a client certificate. - * The client authentication is performed at the HTTP protocol layer with a pre-signed URL. */ - _connConfig.pAddress = pAddress; - _connConfig.addressLen = addressLen; - _connConfig.port = IOT_DEMO_HTTPS_PORT; - _connConfig.pCaCert = IOT_DEMO_HTTPS_TRUSTED_ROOT_CA; - _connConfig.caCertLen = sizeof( IOT_DEMO_HTTPS_TRUSTED_ROOT_CA ); - _connConfig.userBuffer.pBuffer = _pConnUserBuffer; - _connConfig.userBuffer.bufferLen = sizeof( _pConnUserBuffer ); - _connConfig.pNetworkInterface = pNetworkInterface; - - /* Initialize the request pool by setting up constant request information shared by all requests. */ - for( reqIndex = 0; reqIndex < IOT_HTTPS_DEMO_MAX_ASYNC_REQUESTS; reqIndex++ ) - { - /* Set the HTTP request configurations. */ - _requestPool.pReqConfigs[ reqIndex ].pPath = pPath; - - _requestPool.pReqConfigs[ reqIndex ].pathLen = pathLen; - _requestPool.pReqConfigs[ reqIndex ].pHost = pAddress; - _requestPool.pReqConfigs[ reqIndex ].hostLen = addressLen; - _requestPool.pReqConfigs[ reqIndex ].method = IOT_HTTPS_METHOD_GET; - _requestPool.pReqConfigs[ reqIndex ].userBuffer.pBuffer = _requestPool.pReqUserBuffers[ reqIndex ]; - _requestPool.pReqConfigs[ reqIndex ].userBuffer.bufferLen = sizeof( _requestPool.pReqUserBuffers[ reqIndex ] ); - _requestPool.pReqConfigs[ reqIndex ].isAsync = true; - - /* Set the HTTP response configurations. */ - _requestPool.pRespConfigs[ reqIndex ].userBuffer.pBuffer = _requestPool.pRespUserBuffers[ reqIndex ]; - _requestPool.pRespConfigs[ reqIndex ].userBuffer.bufferLen = sizeof( _requestPool.pRespUserBuffers[ reqIndex ] ); - _requestPool.pRespConfigs[ reqIndex ].pSyncInfo = NULL; - - /* Set the configurations needed for an asynchronous request. */ - _requestPool.pAsyncInfos[ reqIndex ].callbacks.appendHeaderCallback = _appendHeaderCallback; - _requestPool.pAsyncInfos[ reqIndex ].callbacks.readReadyCallback = _readReadyCallback; - _requestPool.pAsyncInfos[ reqIndex ].callbacks.responseCompleteCallback = _responseCompleteCallback; - _requestPool.pAsyncInfos[ reqIndex ].callbacks.connectionClosedCallback = _connectionClosedCallback; - _requestPool.pAsyncInfos[ reqIndex ].callbacks.errorCallback = _errorCallback; - _requestPool.pAsyncInfos[ reqIndex ].pPrivData = ( void * ) ( &( _requestPool.pRequestContexts[ reqIndex ] ) ); - _requestPool.pReqConfigs[ reqIndex ].u.pAsyncInfo = &( _requestPool.pAsyncInfos[ reqIndex ] ); - } - - /* Create the mutex to protect the pool of requests. */ - inUseRequestMutexCreated = IotMutex_Create( &( _inUseRequestsMutex ), false ); - - if( inUseRequestMutexCreated == false ) - { - IotLogError( "Failed to create a mutex to protect the request pool." ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Create the semaphore for waiting for the response to finish. */ - fileFinishedSemCreated = IotSemaphore_Create( &( _fileFinishedSem ), 0 /* Initial count. */, 1 /* Max count. */ ); - - if( fileFinishedSemCreated == false ) - { - IotLogError( "Failed to create a semaphore to wait for the file to finish." ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Create the mutex protecting the file download information. */ - requestSchedulingMutexCreated = IotMutex_Create( &( _requestSchedulingMutex ), false ); - - if( requestSchedulingMutexCreated == false ) - { - IotLogError( "Failed to create a mutex to protect the file download data." ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Initialize the HTTPS library. */ - httpsClientStatus = IotHttpsClient_Init(); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred initializing the HTTPS library. Error code: %d", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Connect to S3. To lower demo failures due to transient network connection errors, the connection is re-attempted - * at a fixed interval a few times. */ - for( connAttempt = 1; connAttempt <= IOT_DEMO_HTTPS_CONNECTION_NUM_RETRY; connAttempt++ ) - { - httpsClientStatus = IotHttpsClient_Connect( &_connHandle, &_connConfig ); - - if( ( httpsClientStatus == IOT_HTTPS_CONNECTION_ERROR ) && - ( connAttempt < IOT_DEMO_HTTPS_CONNECTION_NUM_RETRY ) ) - { - IotLogError( "Failed to connect to the S3 server, retrying after %d ms.", - IOT_DEMO_HTTPS_CONNECTION_RETRY_WAIT_MS ); - IotClock_SleepMs( IOT_DEMO_HTTPS_CONNECTION_RETRY_WAIT_MS ); - } - else - { - break; - } - } - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "Failed to connect to the server. Error code: %d.", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Retrieve the size of the file specified in the S3 pre-signed URL. */ - if( _IotHttpsDemo_GetS3ObjectFileSize( ( uint32_t * ) ( &fileSize ), - _connHandle, - pPath, - strlen( pPath ), - pAddress, - addressLen, - _requestPool.pReqUserBuffers[ 0 ], - IOT_DEMO_HTTPS_REQ_USER_BUFFER_SIZE, - _requestPool.pRespUserBuffers[ 0 ], - IOT_DEMO_HTTPS_RESP_USER_BUFFER_SIZE ) != EXIT_SUCCESS ) - { - IotLogError( "Failed to retrieve the s3 object size." ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Initialize the file download information context. */ - if( _initializeFileDownloadInformation( fileSize ) != EXIT_SUCCESS ) - { - IotLogError( "Failed to initialize the global file download information." ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - while( IotSemaphore_GetCount( &( _fileFinishedSem ) ) == 0 ) - { - /* Retrieve a free request. If there are no free requests then put the application thread to sleep to check - * again later if there is one. */ - reqIndex = _getFreeRequestIndex(); - - if( reqIndex == -1 ) - { - IotClock_SleepMs( GET_FREE_REQUEST_RETRY_WAIT_TIME_MS ); - continue; - } - - /* Checking for a scheduledBitmap and scheduling the request is locked in the entirety. This is just in case the - * closed connection is reconnected during one of the asynchronous responses. */ - IotMutex_Lock( &( _requestSchedulingMutex ) ); - - if( !( _getNextIncompleteRange( ¤tRange ) ) ) - { - IotLogWarn( "All ranges have been marked as downloaded or are already scheduled." ); - } - else - { - if( _scheduleAsyncRequest( reqIndex, currentRange ) != EXIT_SUCCESS ) - { - IotLogError( "Error scheduling the asynchronous request." ); - IotMutex_Unlock( &( _requestSchedulingMutex ) ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - } - - IotMutex_Unlock( &( _requestSchedulingMutex ) ); - } - - IOT_FUNCTION_CLEANUP_BEGIN(); - - /* Clean up all resources created with this demo. */ - if( inUseRequestMutexCreated ) - { - IotMutex_Destroy( &( _inUseRequestsMutex ) ); - } - - if( fileFinishedSemCreated ) - { - IotSemaphore_Destroy( &( _fileFinishedSem ) ); - } - - if( requestSchedulingMutexCreated ) - { - IotMutex_Destroy( &( _requestSchedulingMutex ) ); - } - - _cleanupFileDownloadInformation(); - - /* Disconnect from the server even if it is already disconnected. */ - IotHttpsClient_Disconnect( _connHandle ); - /* Clean up the library because we are done using it. */ - IotHttpsClient_Cleanup(); - - IOT_FUNCTION_CLEANUP_END(); -} diff --git a/demos/https/iot_demo_https_s3_download_sync.c b/demos/https/iot_demo_https_s3_download_sync.c deleted file mode 100644 index 725d09a4884..00000000000 --- a/demos/https/iot_demo_https_s3_download_sync.c +++ /dev/null @@ -1,571 +0,0 @@ -/* - * FreeRTOS V202011.00 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://aws.amazon.com/freertos - * http://www.FreeRTOS.org - */ - -/** - * @file iot_demo_https_s3_download_sync.c - * @brief Demonstrates synchronous usage of the HTTPS library by performing partial content GET requests on a file from - * S3. - */ - -/* The config header is always included first. */ -#include "iot_config.h" - -/* C Standard includes. */ -#include -#include - -/* Set up logging for this demo. */ -#include "iot_demo_logging.h" - -/* FreeRTOS includes. */ -#include "iot_https_client.h" -#include "iot_https_utils.h" -#include "aws_demo_config.h" -#include "platform/iot_network.h" -#include "private/iot_error.h" -#include "iot_demo_https_common.h" -#include "platform/iot_clock.h" - -/** - * This demonstrates downloading a file from S3 using a pre-signed URL using the FreeRTOS HTTP Client library. - * The HTTPS Client library is a generic HTTP/1.1 client library that be used to download files from other webservers as - * well. - * - * A presigned URL is required to run this demo. Please see the demos/https/README.md for instructions on how to - * generate one. - * - * The file is downloaded incrementally using HTTP Partial Content headers. This is done by requesting ranges of the - * bytes in a file with the header: "Range: bytes=N-M", where N is the starting range and M is the ending range. The - * S3 HTTP server will response with a 206 Partial Content type of response and the file byte range requested. Please - * note that not all HTTP servers support a Partial Content download with a byte range. - * - * This demo cannot download a file larger than 2^32 - 1 bytes. - */ - -/** - * @cond DOXYGEN_IGNORE - * Doxygen should ignore this section. - * - * Provide default values for undefined configuration settings. - */ - -/* Presigned URL for S3 GET Object access. */ -#ifndef IOT_DEMO_HTTPS_PRESIGNED_GET_URL - #define IOT_DEMO_HTTPS_PRESIGNED_GET_URL "Please configure a presigned GET URL in iot_config.h." -#endif - -/* TLS port for HTTPS. */ -#ifndef IOT_DEMO_HTTPS_PORT - #define IOT_DEMO_HTTPS_PORT ( ( uint16_t ) 443 ) -#endif - -#ifndef IOT_DEMO_HTTPS_TRUSTED_ROOT_CA - /* This the Baltimore Cybertrust root CA associated with the S3 server certificate. */ - #define IOT_DEMO_HTTPS_TRUSTED_ROOT_CA \ - "-----BEGIN CERTIFICATE-----\n" \ - "MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ\n" \ - "RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD\n" \ - "VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX\n" \ - "DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y\n" \ - "ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy\n" \ - "VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr\n" \ - "mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr\n" \ - "IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK\n" \ - "mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu\n" \ - "XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy\n" \ - "dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye\n" \ - "jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1\n" \ - "BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3\n" \ - "DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92\n" \ - "9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx\n" \ - "jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0\n" \ - "Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz\n" \ - "ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS\n" \ - "R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\n" \ - "-----END CERTIFICATE-----\n" -#endif /* ifndef IOT_DEMO_HTTPS_TRUSTED_ROOT_CA */ - -/* Size in bytes of the User Buffer used to store the internal connection context. The size presented here accounts for - * storage of the internal connection context. The minimum size can be found in extern const unint32_t connectionUserBufferMinimumSize. */ -#ifndef IOT_DEMO_HTTPS_CONN_BUFFER_SIZE - #define IOT_DEMO_HTTPS_CONN_BUFFER_SIZE ( ( int ) 512 ) -#endif - -/* Size in bytes of the user buffer used to store the internal request context and HTTP request header lines. - * The size presented here accounts for the storage of the internal context, the first request line in the HTTP - * formatted header and extra headers. The minimum size can be found in extern const uint32_t requestUserBufferMinimumSize. */ -#ifndef IOT_DEMO_HTTPS_REQ_USER_BUFFER_SIZE - #define IOT_DEMO_HTTPS_REQ_USER_BUFFER_SIZE ( ( int ) 512 ) -#endif - -/* Size in bytes of the user buffer used to store the internal response context and the HTTP response header lines. - * The size presented here accounts for the storage of the internal context, the first request line in the HTTP - * formatted header and extra headers. The minimum can be found in responseUserBufferMinimumSize. - * Keep in mind that if the headers from the response do not all fit into this buffer, then the rest of the headers - * will be discarded. The minimum size can be found in extern const uint32_t responseUserBufferMinimumSize. */ -#ifndef IOT_DEMO_HTTPS_RESP_USER_BUFFER_SIZE - #define IOT_DEMO_HTTPS_RESP_USER_BUFFER_SIZE ( ( int ) 1024 ) -#endif - -/* Size in bytes of the buffer used to store the response body (parts of it). This should be less than or equal to - * the size of the file we want to download. */ -#ifndef IOT_DEMO_HTTPS_RESP_BODY_BUFFER_SIZE - #define IOT_DEMO_HTTPS_RESP_BODY_BUFFER_SIZE ( ( int ) 512 ) -#endif - -/* Time to wait in milliseconds before retrying the HTTPS Connection. A connection is only attempted again if - * IOT_HTTPS_CONNECTION_ERROR is returned from IotHttpsClient_Connect(). This indicates an error in the network - * layer. To view logging for network errors update IOT_LOG_LEVEL_NETWORK to IOT_LOG_ERROR in iot_config.h */ -#ifndef IOT_DEMO_HTTPS_CONNECTION_RETRY_WAIT_MS - #define IOT_DEMO_HTTPS_CONNECTION_RETRY_WAIT_MS ( ( uint32_t ) 3000 ) -#endif - -/* Number of times to retry the HTTPS connection. A connection is only attempted again if - * IOT_HTTPS_CONNECTION_ERROR is returned from IotHttpsClient_Connect(). This indicates an error in the network - * layer. To view logging for network errors update IOT_LOG_LEVEL_NETWORK to IOT_LOG_ERROR in iot_config.h */ -#ifndef IOT_DEMO_HTTPS_CONNECTION_NUM_RETRY - #define IOT_DEMO_HTTPS_CONNECTION_NUM_RETRY ( ( uint32_t ) 3 ) -#endif - -/* The timeout in milliseconds to wait on IotHttpsClient_SendSync(). This timeout is how long the routine will block - * for waiting for an HTTP response. It is possible that the server could close the connection after receiving a - * request, so never sending the response. */ -#ifndef IOT_DEMO_HTTPS_SYNC_TIMEOUT_MS - #define IOT_DEMO_HTTPS_SYNC_TIMEOUT_MS ( ( uint32_t ) 60000 ) -#endif - -/** @endcond */ - -/*-----------------------------------------------------------*/ - -/** - * @brief Buffer used to store the internal connection context. - */ -static uint8_t _pConnUserBuffer[ IOT_DEMO_HTTPS_CONN_BUFFER_SIZE ] = { 0 }; - -/** - * @brief Buffer used to store the request context and the HTTP request header lines. - */ -static uint8_t _pReqUserBuffer[ IOT_DEMO_HTTPS_REQ_USER_BUFFER_SIZE ] = { 0 }; - -/** - * @brief Buffer used to store the response context and the HTTP response header lines. - */ -static uint8_t _pRespUserBuffer[ IOT_DEMO_HTTPS_RESP_USER_BUFFER_SIZE ] = { 0 }; - -/** - * @brief Buffer used to store parts of the response body. - */ -static uint8_t _pRespBodyBuffer[ IOT_DEMO_HTTPS_RESP_BODY_BUFFER_SIZE ] = { 0 }; - -/*-----------------------------------------------------------*/ - -/* Declaration of demo function. */ -int RunHttpsSyncDownloadDemo( bool awsIotMqttMode, - const char * pIdentifier, - void * pNetworkServerInfo, - void * pNetworkCredentialInfo, - const IotNetworkInterface_t * pNetworkInterface ); - -/*-----------------------------------------------------------*/ - -/** - * @brief The function that runs the HTTPS Synchronous Download demo. - * - * @param[in] awsIotMqttMode Specify if this demo is running with the AWS IoT MQTT server. This is ignored in this demo. - * @param[in] pIdentifier NULL-terminated MQTT client identifier. This is ignored in this demo. - * @param[in] pNetworkServerInfo Contains network information specific for the MQTT demo. This is ignored in this demo. - * @param[in] pNetworkCredentialInfo Contains credential Info for a TLS connection. - * @param[in] pNetworkInterface Network interface to use for this demo. - * - * @return `EXIT_SUCCESS` if the demo completes successfully; `EXIT_FAILURE` otherwise. - */ -int RunHttpsSyncDownloadDemo( bool awsIotMqttMode, - const char * pIdentifier, - void * pNetworkServerInfo, - void * pNetworkCredentialInfo, - const IotNetworkInterface_t * pNetworkInterface ) -{ - IOT_FUNCTION_ENTRY( int, EXIT_SUCCESS ); - - /* Unused parameters. */ - ( void ) awsIotMqttMode; - ( void ) pIdentifier; - ( void ) pNetworkServerInfo; - - /* HTTPS Client library return status. */ - IotHttpsReturnCode_t httpsClientStatus = IOT_HTTPS_OK; - - /* Configurations for the HTTPS connection. */ - IotHttpsConnectionInfo_t connConfig = { 0 }; - /* Handle identifying the HTTPS connection. */ - IotHttpsConnectionHandle_t connHandle = IOT_HTTPS_CONNECTION_HANDLE_INITIALIZER; - /* Configurations for the HTTPS request. */ - IotHttpsRequestInfo_t reqConfig = { 0 }; - /* Configurations for the HTTPS response. */ - IotHttpsResponseInfo_t respConfig = { 0 }; - - /* Handle identifying the HTTP request. This is valid after the request has been initialized with - * IotHttpsClient_InitializeRequest(). */ - IotHttpsRequestHandle_t reqHandle = IOT_HTTPS_REQUEST_HANDLE_INITIALIZER; - - /* Handle identifying the HTTP response. This is valid after the response has been received with - * IotHttpsClient_SendSync(). */ - IotHttpsResponseHandle_t respHandle = IOT_HTTPS_RESPONSE_HANDLE_INITIALIZER; - /* Synchronous request specific configurations. */ - IotHttpsSyncInfo_t reqSyncInfo = { 0 }; - /* Synchronous response specific configurations. */ - IotHttpsSyncInfo_t respSyncInfo = { 0 }; - - /* The location of the path within string IOT_DEMO_HTTPS_PRESIGNED_GET_URL. */ - const char * pPath = NULL; - /* The length of the path within string IOT_DEMO_HTTPS_PRESIGNED_GET_URL. */ - size_t pathLen = 0; - /* The location of the address within string IOT_DEMO_HTTPS_PRESIGNED_GET_URL. */ - const char * pAddress = NULL; - /* The length of the address within string IOT_DEMO_HTTPS_PRESIGNED_GET_URL. */ - size_t addressLen = 0; - - /* The status of HTTP responses for each request. */ - uint16_t respStatus = IOT_HTTPS_STATUS_OK; - /* The content length of HTTP responses for each request. */ - uint32_t contentLength = 0; - - /* The size of the file we are trying to download in S3. */ - uint32_t fileSize = 0; - /* The number of bytes we want to request with in each range of the file bytes. */ - uint32_t numReqBytes = 0; - /* curByte indicates which starting byte we want to download next. */ - uint32_t curByte = 0; - /* Buffer to write the Range: header value string. */ - char pRangeValueStr[ RANGE_VALUE_MAX_LENGTH ] = { 0 }; - /* The current attempt in the number of connection tries. */ - uint32_t connAttempt = 0; - - /* Buffer to read the Connection header value into. The possible values are "close" and "keep-alive". This is the - * length of the longest string, "keep-alive" plus a NULL terminator. */ - char connectionValueStr[ CONNECTION_KEEP_ALIVE_HEADER_VALUE_LENGTH + 1 ] = { 0 }; - - IotLogInfo( "HTTPS Client Synchronous S3 download demo using pre-signed URL: %s", IOT_DEMO_HTTPS_PRESIGNED_GET_URL ); - - /* Retrieve the path location from IOT_DEMO_HTTPS_PRESIGNED_GET_URL. This function returns the length of the path - * without the query into pathLen. */ - httpsClientStatus = IotHttpsClient_GetUrlPath( IOT_DEMO_HTTPS_PRESIGNED_GET_URL, - strlen( IOT_DEMO_HTTPS_PRESIGNED_GET_URL ), - &pPath, - &pathLen ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred in IotHttpsClient_GetUrlPath() on URL %s. Error code: %d", - IOT_DEMO_HTTPS_PRESIGNED_GET_URL, - httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Retrieve the address location and length from the IOT_DEMO_HTTPS_PRESIGNED_GET_URL. */ - httpsClientStatus = IotHttpsClient_GetUrlAddress( IOT_DEMO_HTTPS_PRESIGNED_GET_URL, - strlen( IOT_DEMO_HTTPS_PRESIGNED_GET_URL ), - &pAddress, - &addressLen ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred in IotHttpsClient_GetUrlAddress() on URL %s\r\n. Error code %d", - IOT_DEMO_HTTPS_PRESIGNED_GET_URL, - httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Set the connection configurations. - * Note: TLS Connection to AWS S3 service does not need a client certificate. - * The client authentication is performed at the HTTP protocol layer with a pre-signed URL. */ - connConfig.pAddress = pAddress; - connConfig.addressLen = addressLen; - connConfig.port = IOT_DEMO_HTTPS_PORT; - connConfig.pCaCert = IOT_DEMO_HTTPS_TRUSTED_ROOT_CA; - connConfig.caCertLen = sizeof( IOT_DEMO_HTTPS_TRUSTED_ROOT_CA ); - connConfig.userBuffer.pBuffer = _pConnUserBuffer; - connConfig.userBuffer.bufferLen = sizeof( _pConnUserBuffer ); - connConfig.pNetworkInterface = pNetworkInterface; - - /* Set the configurations needed for a synchronous request. */ - reqSyncInfo.pBody = NULL; /* This is a GET request so there is no data in the body. */ - reqSyncInfo.bodyLen = 0; /* Since there is not data in the body the length is 0. */ - - /* Set the configurations needed for a synchronous response. */ - respSyncInfo.pBody = _pRespBodyBuffer; /* This is a GET request so should configure a place to retreive the - * response body. */ - respSyncInfo.bodyLen = sizeof( _pRespBodyBuffer ); /* The length of the GET request's response body. This should be - * greater than or equal to the size of the file requested, for the - * best performance. */ - - /* Set the request configurations. */ - reqConfig.pPath = pPath; - - /* The path is everything that is not the address. It also includes the query. So we get the strlen( pPath ) to - * acquire everything following in IOT_DEMO_HTTPS_PRESIGNED_GET_URL. */ - reqConfig.pathLen = strlen( pPath ); - reqConfig.pHost = pAddress; - reqConfig.hostLen = addressLen; - reqConfig.method = IOT_HTTPS_METHOD_GET; - reqConfig.isNonPersistent = false; - reqConfig.userBuffer.pBuffer = _pReqUserBuffer; - reqConfig.userBuffer.bufferLen = sizeof( _pReqUserBuffer ); - reqConfig.isAsync = false; - reqConfig.u.pSyncInfo = &reqSyncInfo; - - /* Set the response configurations. */ - respConfig.userBuffer.pBuffer = _pRespUserBuffer; - respConfig.userBuffer.bufferLen = sizeof( _pRespUserBuffer ); - respConfig.pSyncInfo = &respSyncInfo; - - /* Initialize the HTTPS library. */ - httpsClientStatus = IotHttpsClient_Init(); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred initializing the HTTPS library. Error code: %d", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Connect to S3. */ - for( connAttempt = 1; connAttempt <= IOT_DEMO_HTTPS_CONNECTION_NUM_RETRY; connAttempt++ ) - { - httpsClientStatus = IotHttpsClient_Connect( &connHandle, &connConfig ); - - if( ( httpsClientStatus == IOT_HTTPS_CONNECTION_ERROR ) && - ( connAttempt < IOT_DEMO_HTTPS_CONNECTION_NUM_RETRY ) ) - { - IotLogError( "Failed to connect to the S3 server, retrying after %d ms.", - IOT_DEMO_HTTPS_CONNECTION_RETRY_WAIT_MS ); - IotClock_SleepMs( IOT_DEMO_HTTPS_CONNECTION_RETRY_WAIT_MS ); - continue; - } - else - { - break; - } - } - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "Failed to connect to the server. Error code: %d.", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Get the size of the file specified in the S3 presigned URL. */ - - /* Verify the file exists by retrieving the file size. */ - if( _IotHttpsDemo_GetS3ObjectFileSize( &fileSize, - connHandle, - pPath, - strlen( pPath ), - pAddress, - addressLen, - _pReqUserBuffer, - IOT_DEMO_HTTPS_REQ_USER_BUFFER_SIZE, - _pRespUserBuffer, - IOT_DEMO_HTTPS_RESP_USER_BUFFER_SIZE ) != EXIT_SUCCESS ) - { - IotLogError( "Failed to retrieve the s3 object size." ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* The number of bytes we want to request each time is the size of the buffer or the file size if it is smaller than - * the buffer size, then the size of the file. */ - numReqBytes = IOT_DEMO_HTTPS_RESP_BODY_BUFFER_SIZE; - - if( fileSize < IOT_DEMO_HTTPS_RESP_BODY_BUFFER_SIZE ) - { - numReqBytes = fileSize; - } - - /* Here we iterate sending byte range requests until the full file has been downloaded. We keep track of the next - * byte to download with curByte. When this reaches the fileSize we stop downloading. - */ - while( curByte < fileSize ) - { - /* Re-initialize the request to reuse the request. If we do not reinitialize then data from the last response - * associated with this request will linger. We reuse reqHandle because we are sending a new sequential - * synchronous request. IotHttpsClient_InitializeRequest will create a new request from the reqConfig and return - * a reqHandle that is ready to use as a NEW request. */ - httpsClientStatus = IotHttpsClient_InitializeRequest( &reqHandle, &reqConfig ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred in IotHttpsClient_InitializeRequest() with error code: %d", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Get the Range header value string. */ - int numWritten = snprintf( pRangeValueStr, - RANGE_VALUE_MAX_LENGTH, - "bytes=%u-%u", - ( unsigned int ) curByte, - ( unsigned int ) ( curByte + numReqBytes - 1 ) ); - - if( ( numWritten < 0 ) || ( numWritten >= RANGE_VALUE_MAX_LENGTH ) ) - { - IotLogError( "Failed to write the header value: \"bytes=%d-%d\" . Error code: %d", - curByte, - curByte + numReqBytes - 1, - numWritten ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Set the header for a range request. */ - httpsClientStatus = IotHttpsClient_AddHeader( reqHandle, RANGE_HEADER_FIELD, RANGE_HEADER_FIELD_LENGTH, pRangeValueStr, numWritten ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "Failed to write the header Range: %.*s into the request. With error code: %d", numWritten, pRangeValueStr, httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Send the request and receive the response synchronously. */ - IotLogInfo( "Now requesting Range: %s.", pRangeValueStr ); - - /* A new response handle is returned from IotHttpsClient_SendSync(). We reuse the respHandle variable because - * the last response was already processed fully. */ - - httpsClientStatus = IotHttpsClient_SendSync( connHandle, reqHandle, &respHandle, &respConfig, 0 ); - - /* If there was network error try again one more time. */ - if( httpsClientStatus == IOT_HTTPS_NETWORK_ERROR ) - { - /* Maybe the network error was because the server disconnected us. */ - httpsClientStatus = IotHttpsClient_Connect( &connHandle, &connConfig ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "Failed to reconnect to the S3 server after a network error on IotHttpsClient_SendSync(). Error code %d.", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - httpsClientStatus = IotHttpsClient_SendSync( connHandle, reqHandle, &respHandle, &respConfig, IOT_DEMO_HTTPS_SYNC_TIMEOUT_MS ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "Failed receiving the response on a second try after a network error. The error code is: %d", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - } - else if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "There has been an error receiving the response. The error code is: %d", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - httpsClientStatus = IotHttpsClient_ReadResponseStatus( respHandle, &respStatus ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "Error in retreiving the response status. Error code %d", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - if( respStatus != IOT_HTTPS_STATUS_PARTIAL_CONTENT ) - { - IotLogError( "Failed to retrieve the partial content response from s3. Response status: %d", respStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Get the content length of the body for printing without a NULL terminator. */ - httpsClientStatus = IotHttpsClient_ReadContentLength( respHandle, &contentLength ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "Failed to read the Content-Length from the response. Error code %d", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* The response has been fully received. */ - IotLogInfo( "Response return code: %d", respStatus ); - - /* The logging buffer may not fit all of the response body received and the output on the console will be - * truncated to the first configLOGGING_MAX_MESSAGE_LENGTH number of characters. */ - IotLogInfo( "Response Body: \r\n%.*s", contentLength, _pRespBodyBuffer ); - - /* We increment by the contentLength because the server may not have sent us the range we request. */ - curByte += contentLength; - - IotLogInfo( "Downloaded %d/%d", curByte, fileSize ); - - /* If amount of file remaining to request is less than the current amount of bytes to request next time, then - * update the amount of bytes to request, on the next iteration, to be the amount remaining. */ - if( curByte > fileSize ) - { - IotLogError( "Received more data than the size of the file specified." ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - if( ( fileSize - curByte ) < numReqBytes ) - { - numReqBytes = fileSize - curByte; - } - - /* S3 will close the connection after 100 requests, so check the "Connection" header for a response with a - * "close" value. */ - memset( connectionValueStr, 0, sizeof( connectionValueStr ) ); - httpsClientStatus = IotHttpsClient_ReadHeader( respHandle, - CONNECTION_HEADER_FIELD, - CONNECTION_HEADER_FILED_LENGTH, - connectionValueStr, - sizeof( connectionValueStr ) ); - - /* If there is any other error besides not found, then that is a fatal error. */ - if( ( httpsClientStatus != IOT_HTTPS_OK ) && ( httpsClientStatus != IOT_HTTPS_NOT_FOUND ) ) - { - IotLogError( "Failed to read header %s. Error code: %d.", CONNECTION_HEADER_FIELD, httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - if( strncmp( CONNECTION_CLOSE_HEADER_VALUE, connectionValueStr, CONNECTION_CLOSE_HEADER_VALUE_LENGTH ) == 0 ) - { - /* Reconnect. */ - httpsClientStatus = IotHttpsClient_Connect( &connHandle, &connConfig ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "Failed to reconnect to the server. Error code: %d.", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - } - } - - IOT_FUNCTION_CLEANUP_BEGIN(); - - /* Disconnect from the server even if the server may have already disconnected us. */ - if( connHandle != NULL ) - { - IotHttpsClient_Disconnect( connHandle ); - } - - /* Clean up the library because we are done using it. */ - IotHttpsClient_Cleanup(); - - IOT_FUNCTION_CLEANUP_END(); -} diff --git a/demos/https/iot_demo_https_s3_upload_async.c b/demos/https/iot_demo_https_s3_upload_async.c deleted file mode 100755 index b492372a0df..00000000000 --- a/demos/https/iot_demo_https_s3_upload_async.c +++ /dev/null @@ -1,541 +0,0 @@ -/* - * FreeRTOS V202011.00 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://aws.amazon.com/freertos - * http://www.FreeRTOS.org - */ - -/** - * @file iot_demo_https_s3_upload_async.c - * @brief Demonstrates asynchronous usage of the HTTPS library by performing a PUT requests on a file to S3. - */ - -/* The config header is always included first. */ -#include "iot_config.h" - -/* C Standard includes. */ -#include -#include - -/* Set up logging for this demo. */ -#include "iot_demo_logging.h" - -/* FreeRTOS includes. */ -#include "iot_demo_https_common.h" -#include "iot_https_utils.h" -#include "aws_demo_config.h" -#include "platform/iot_network.h" -#include "platform/iot_threads.h" -#include "private/iot_error.h" -#include "platform/iot_clock.h" - -/** - * This demonstrates uploading a file to S3 using a pre-signed URL using the FreeRTOS HTTP Client library. - * The HTTPS Client library is a generic HTTP/1.1 client library that be used to upload files to other webservers as - * well. - * - * A presigned URL is required to run this demo. Please see the demos/https/README.md for instructions on how to - * generate one. - */ - -/** - * @cond DOXYGEN_IGNORE - * Doxygen should ignore this section. - * - * Provide default values for undefined configuration settings. - */ - -/* Presigned URL for S3 PUT Object access. A GET URL is defined to verify the demo.*/ -#ifndef IOT_DEMO_HTTPS_PRESIGNED_PUT_URL - #define IOT_DEMO_HTTPS_PRESIGNED_PUT_URL "Please configure a presigned PUT URL in iot_config.h." -#endif - -/* TLS port for HTTPS. */ -#ifndef IOT_DEMO_HTTPS_PORT - #define IOT_DEMO_HTTPS_PORT ( ( uint16_t ) 443 ) -#endif - -#ifndef IOT_DEMO_HTTPS_TRUSTED_ROOT_CA - /* This the Baltimore Cybertrust root CA associated with the S3 server certificate. */ - #define IOT_DEMO_HTTPS_TRUSTED_ROOT_CA \ - "-----BEGIN CERTIFICATE-----\n" \ - "MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ\n" \ - "RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD\n" \ - "VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX\n" \ - "DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y\n" \ - "ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy\n" \ - "VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr\n" \ - "mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr\n" \ - "IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK\n" \ - "mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu\n" \ - "XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy\n" \ - "dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye\n" \ - "jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1\n" \ - "BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3\n" \ - "DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92\n" \ - "9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx\n" \ - "jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0\n" \ - "Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz\n" \ - "ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS\n" \ - "R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\n" \ - "-----END CERTIFICATE-----\n" -#endif /* ifndef IOT_DEMO_HTTPS_TRUSTED_ROOT_CA */ - -/* Size in bytes of the User Buffer used to store the internal connection context. The size presented here accounts for - * storage of the internal connection context. The minimum size can be found in extern const unint32_t - * connectionUserBufferMinimumSize. */ -#ifndef IOT_DEMO_HTTPS_CONN_BUFFER_SIZE - #define IOT_DEMO_HTTPS_CONN_BUFFER_SIZE ( ( int ) 512 ) -#endif - -/* Size in bytes of the user buffer used to store the internal request context and HTTP request header lines. - * The size presented here accounts for the storage of the internal context, the first request line in the HTTP - * formatted header and extra headers. The minimum size can be found in extern const uint32_t - * requestUserBufferMinimumSize. Keep in mind that this requestUserBufferMinimumSize does not include the size of the - * path in the request line. The path could be well over 100 characters long as it includes not only the object key name - * in S3, but also the query following. The query following has the AWSAccessKeyId, the expiration time, and the - * AWS Signature Version 4 signature.*/ -#ifndef IOT_DEMO_HTTPS_REQ_USER_BUFFER_SIZE - #define IOT_DEMO_HTTPS_REQ_USER_BUFFER_SIZE ( ( int ) 512 ) -#endif - -/* Size in bytes of the user buffer used to store the internal response context and the HTTP response header lines. - * The size presented here accounts for the storage of the internal context, the first request line in the HTTP - * formatted header and extra headers. The minimum can be found in responseUserBufferMinimumSize. - * Keep in mind that if the headers from the response do not all fit into this buffer, then the rest of the headers - * will be discarded. The minimum size can be found in extern const uint32_t responseUserBufferMinimumSize. */ -#ifndef IOT_DEMO_HTTPS_RESP_USER_BUFFER_SIZE - #define IOT_DEMO_HTTPS_RESP_USER_BUFFER_SIZE ( ( int ) 1024 ) -#endif - -/* Pointer to the data to upload.*/ -#ifndef IOT_DEMO_HTTPS_UPLOAD_DATA - #define IOT_DEMO_HTTPS_UPLOAD_DATA "Hello World!" -#endif - -/* The size of the data in bytes to upload. */ -#ifndef IOT_DEMO_HTTPS_UPLOAD_DATA_SIZE - #define IOT_DEMO_HTTPS_UPLOAD_DATA_SIZE ( sizeof( IOT_DEMO_HTTPS_UPLOAD_DATA ) - 1 ) -#endif - -/* Time to wait in milliseconds before retrying the HTTPS Connection. A connection is only attempted again if - * IOT_HTTPS_CONNECTION_ERROR is returned from IotHttpsClient_Connect(). This indicates an error in the network - * layer. To view logging for network errors update IOT_LOG_LEVEL_NETWORK to IOT_LOG_ERROR in iot_config.h */ -#ifndef IOT_DEMO_HTTPS_CONNECTION_RETRY_WAIT_MS - #define IOT_DEMO_HTTPS_CONNECTION_RETRY_WAIT_MS ( ( uint32_t ) 3000 ) -#endif - -/* Number of times to retry the HTTPS connection. A connection is only attempted again if - * IOT_HTTPS_CONNECTION_ERROR is returned from IotHttpsClient_Connect(). This indicates an error in the network - * layer. To view logging for network errors update IOT_LOG_LEVEL_NETWORK to IOT_LOG_ERROR in iot_config.h */ -#ifndef IOT_DEMO_HTTPS_CONNECTION_NUM_RETRY - #define IOT_DEMO_HTTPS_CONNECTION_NUM_RETRY ( ( uint32_t ) 3 ) -#endif - -/* Timeout in milliseconds to wait for the asynchronous request to finish. This timeout starts when the last - * IOT_HTTPS_DEMO_MAX_ASYNC_REQUESTS sent has been scheduled. */ -#ifndef IOT_HTTPS_DEMO_ASYNC_TIMEOUT_MS - #define IOT_HTTPS_DEMO_ASYNC_TIMEOUT_MS ( ( uint32_t ) 300000 ) /* 5 minute timeout for this demo. */ -#endif - -/** @endcond */ - -/*-----------------------------------------------------------*/ - -/** - * @brief Buffer used to store the internal connection context. - */ -static uint8_t _pConnUserBuffer[ IOT_DEMO_HTTPS_CONN_BUFFER_SIZE ] = { 0 }; - -/** - * @brief Buffer used to store the request context and the HTTP request header lines. - */ -static uint8_t _pReqUserBuffer[ IOT_DEMO_HTTPS_REQ_USER_BUFFER_SIZE ] = { 0 }; - -/** - * @brief Buffer used to store the response context and the HTTP response header lines. - */ -static uint8_t _pRespUserBuffer[ IOT_DEMO_HTTPS_RESP_USER_BUFFER_SIZE ] = { 0 }; - -/*-----------------------------------------------------------*/ - -/* Declaration of demo function. */ -int RunHttpsAsyncUploadDemo( bool awsIotMqttMode, - const char * pIdentifier, - void * pNetworkServerInfo, - void * pNetworkCredentialInfo, - const IotNetworkInterface_t * pNetworkInterface ); - -/*-----------------------------------------------------------*/ - -/** - * @brief Semaphore use to signal that the demo is finished. - * - * The upload is completely finished when the response is fully received with a 200 HTTP response status. - */ -static IotSemaphore_t _uploadFinishedSem = { 0 }; - -/*-----------------------------------------------------------*/ - -/** - * @brief Callback for an asynchronous request to write data to the network. - * - * @param[in] pPrivData - User private data configured with the HTTPS Client library request configuration. - * @param[in] reqHandle - Identifier for the current request in progress. - */ -static void _writeCallback( void * pPrivData, - IotHttpsRequestHandle_t reqHandle ) -{ - IotHttpsReturnCode_t writeStatus = IOT_HTTPS_OK; - bool * pUploadSuccess = ( bool * ) pPrivData; - - /* Write the upload data to the network. isComplete the last parameter must always be set to 1. */ - writeStatus = IotHttpsClient_WriteRequestBody( reqHandle, - ( uint8_t * ) IOT_DEMO_HTTPS_UPLOAD_DATA, - IOT_DEMO_HTTPS_UPLOAD_DATA_SIZE, - 1 ); - - if( writeStatus != IOT_HTTPS_OK ) - { - IotLogError( "Error writing the request body to the network. Return code %d.", writeStatus ); - *pUploadSuccess = false; - IotHttpsClient_CancelRequestAsync( reqHandle ); - } -} - -/*-----------------------------------------------------------*/ - -/** - * @brief Callback for an asynchronous request to notify that the response is complete. - * - * @param[in] pPrivData - User private data configured with the HTTPS Client library request configuration. - * @param[in] respHandle - Identifier for the current response finished. - * @param[in] rc - Return code from the HTTPS Client Library signaling a possible error. - * @param[in] status - The HTTP response status. - */ -static void _responseCompleteCallback( void * pPrivData, - IotHttpsResponseHandle_t respHandle, - IotHttpsReturnCode_t rc, - uint16_t status ) -{ - ( void ) rc; - ( void ) respHandle; - - bool * pUploadSuccess = ( bool * ) pPrivData; - - /* When the remote server response with 200 OK, the file was successfully uploaded. */ - if( status == IOT_HTTPS_STATUS_OK ) - { - *pUploadSuccess = true; - } - else - { - *pUploadSuccess = false; - } - - /* Post to the semaphore that the upload is finished. */ - IotSemaphore_Post( &( _uploadFinishedSem ) ); -} - -/*-----------------------------------------------------------*/ - -/** - * @brief The function that runs the HTTPS Asynchronous Upload demo. - * - * @param[in] awsIotMqttMode Specify if this demo is running with the AWS IoT MQTT server. This is ignored in this demo. - * @param[in] pIdentifier NULL-terminated MQTT client identifier. This is ignored in this demo. - * @param[in] pNetworkServerInfo Contains network information specific for the MQTT demo. This is ignored in this demo. - * @param[in] pNetworkCredentialInfo Contains credential info for a TLS connection. - * @param[in] pNetworkInterface Network interface to use for this demo. - * - * @return `EXIT_SUCCESS` if the demo completes successfully; `EXIT_FAILURE` otherwise. - */ -int RunHttpsAsyncUploadDemo( bool awsIotMqttMode, - const char * pIdentifier, - void * pNetworkServerInfo, - void * pNetworkCredentialInfo, - const IotNetworkInterface_t * pNetworkInterface ) -{ - IOT_FUNCTION_ENTRY( int, EXIT_SUCCESS ); - - /* Unused parameters. */ - ( void ) awsIotMqttMode; - ( void ) pIdentifier; - ( void ) pNetworkServerInfo; - - /* HTTPS Client library return status. */ - IotHttpsReturnCode_t httpsClientStatus = IOT_HTTPS_OK; - - /* Configurations for the HTTPS connection. */ - IotHttpsConnectionInfo_t connConfig = { 0 }; - /* Handle identifying the HTTPS connection. */ - IotHttpsConnectionHandle_t connHandle = IOT_HTTPS_CONNECTION_HANDLE_INITIALIZER; - /* Configurations for the HTTPS request. */ - IotHttpsRequestInfo_t reqConfig = { 0 }; - /* Configurations for the HTTPS response. */ - IotHttpsResponseInfo_t respConfig = { 0 }; - - /* Handle identifying the HTTP request. This is valid after the request has been initialized with - * IotHttpsClient_InitializeRequest(). */ - IotHttpsRequestHandle_t reqHandle = IOT_HTTPS_REQUEST_HANDLE_INITIALIZER; - /* Handle identifying the HTTP response. This handle is used only in the asynchronous callback. */ - IotHttpsResponseHandle_t respHandle = IOT_HTTPS_RESPONSE_HANDLE_INITIALIZER; - - /* Asynchronous request specific configurations. */ - IotHttpsAsyncInfo_t asyncInfo = { 0 }; - - /* Signal if the global upload finished semaphore was created for cleanup. */ - bool uploadFinishedSemCreated = false; - - /* The location of the path within string IOT_DEMO_HTTPS_PRESIGNED_PUT_URL. */ - const char * pPath = NULL; - /* The length of the path within string IOT_DEMO_HTTPS_PRESIGNED_PUT_URL. */ - size_t pathLen = 0; - /* The location of the address within string IOT_DEMO_HTTPS_PRESIGNED_PUT_URL. */ - const char * pAddress = NULL; - /* The length of the address within string IOT_DEMO_HTTPS_PRESIGNED_PUT_URL. */ - size_t addressLen = 0; - /* The current attempt in the number of connection tries. */ - uint32_t connAttempt = 0; - /* Context into the asynchronous callback to denote a success or failure back to the application. */ - bool uploadSuccess = true; - - IotLogInfo( "HTTPS Client Asynchronous S3 upload demo using pre-signed URL: %s", IOT_DEMO_HTTPS_PRESIGNED_PUT_URL ); - - /* Retrieve the path location from IOT_DEMO_HTTPS_PRESIGNED_GET_URL. This function returns the length of the path - * without the query into pathLen. */ - httpsClientStatus = IotHttpsClient_GetUrlPath( IOT_DEMO_HTTPS_PRESIGNED_PUT_URL, - strlen( IOT_DEMO_HTTPS_PRESIGNED_PUT_URL ), - &pPath, - &pathLen ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred in IotHttpsClient_GetUrlPath() on URL %s. Error code: %d", - IOT_DEMO_HTTPS_PRESIGNED_PUT_URL, - httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Retrieve the address location and length from the IOT_DEMO_HTTPS_PRESIGNED_PUT_URL. */ - httpsClientStatus = IotHttpsClient_GetUrlAddress( IOT_DEMO_HTTPS_PRESIGNED_PUT_URL, - strlen( IOT_DEMO_HTTPS_PRESIGNED_PUT_URL ), - &pAddress, - &addressLen ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred in IotHttpsClient_GetUrlAddress() on URL %s\r\n. Error code %d", - IOT_DEMO_HTTPS_PRESIGNED_PUT_URL, - httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Set the connection configurations. - * Note: TLS Connection to AWS S3 service does not need a client certificate. - * The client authentication is performed at the HTTP protocol layer with a pre-signed URL. */ - connConfig.pAddress = pAddress; - connConfig.addressLen = addressLen; - connConfig.port = IOT_DEMO_HTTPS_PORT; - connConfig.pCaCert = IOT_DEMO_HTTPS_TRUSTED_ROOT_CA; - connConfig.caCertLen = sizeof( IOT_DEMO_HTTPS_TRUSTED_ROOT_CA ); - connConfig.userBuffer.pBuffer = _pConnUserBuffer; - connConfig.userBuffer.bufferLen = sizeof( _pConnUserBuffer ); - connConfig.pNetworkInterface = pNetworkInterface; - - asyncInfo.callbacks.writeCallback = _writeCallback; - asyncInfo.callbacks.responseCompleteCallback = _responseCompleteCallback; - asyncInfo.pPrivData = &uploadSuccess; - - /* The path is everything that is not the address. It also includes the query. So we get the strlen( pPath ) to - * acquire everything following in IOT_DEMO_HTTPS_PRESIGNED_PUT_URL. */ - reqConfig.pPath = pPath; - reqConfig.pathLen = strlen( pPath ); - reqConfig.pHost = pAddress; - reqConfig.hostLen = addressLen; - - /* The PUT method is used to upload an object to S3 because it is simpler than using POST. POST requires AWS S3 - * access specific header fields in the body of the message in a multipart/form-data encoded message. See - * https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html for more information about POST object. See - * https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html for more information about PUT object. */ - reqConfig.method = IOT_HTTPS_METHOD_PUT; - reqConfig.isNonPersistent = false; - reqConfig.userBuffer.pBuffer = _pReqUserBuffer; - reqConfig.userBuffer.bufferLen = sizeof( _pReqUserBuffer ); - reqConfig.isAsync = true; - reqConfig.u.pAsyncInfo = &asyncInfo; - - respConfig.userBuffer.pBuffer = _pRespUserBuffer; - respConfig.userBuffer.bufferLen = sizeof( _pRespUserBuffer ); - respConfig.pSyncInfo = NULL; - - /* Create the semaphore for waiting for the whole upload response to finish. */ - uploadFinishedSemCreated = IotSemaphore_Create( &( _uploadFinishedSem ), 0 /* Initial value. */, 1 /* Max value. */ ); - - if( uploadFinishedSemCreated == false ) - { - IotLogError( "Failed to create a semaphore to wait for the response to finish." ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Initialize the HTTPS library. */ - httpsClientStatus = IotHttpsClient_Init(); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred initializing the HTTPS library. Error code: %d", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Initialize the request to initialize internal request context, write the HTTP request first line to the - * _pReqUserBuffer header space, and write headers User-Agent and Host. */ - httpsClientStatus = IotHttpsClient_InitializeRequest( &reqHandle, &reqConfig ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred in IotHttpsClient_InitializeRequest() with error code: %d", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Connect to S3. */ - for( connAttempt = 1; connAttempt <= IOT_DEMO_HTTPS_CONNECTION_NUM_RETRY; connAttempt++ ) - { - httpsClientStatus = IotHttpsClient_Connect( &connHandle, &connConfig ); - - if( ( httpsClientStatus == IOT_HTTPS_CONNECTION_ERROR ) && - ( connAttempt < IOT_DEMO_HTTPS_CONNECTION_NUM_RETRY ) ) - { - IotLogError( "Failed to connect to the S3 server, retrying after %d ms.", - IOT_DEMO_HTTPS_CONNECTION_RETRY_WAIT_MS ); - IotClock_SleepMs( IOT_DEMO_HTTPS_CONNECTION_RETRY_WAIT_MS ); - continue; - } - else - { - break; - } - } - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "Failed to connect to the server. Error code: %d.", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Send the request and receive the response asynchronously. This will schedule the async request. We - * will return immediately after scheduling. */ - httpsClientStatus = IotHttpsClient_SendAsync( connHandle, reqHandle, &respHandle, &respConfig ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "Failed to send the request asynchronously with error code: %d", httpsClientStatus ); - /* If we failed to schedule an async request then this is an error and we should exit the loop. */ - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Timing out waiting for the response to finish will fail the demo. */ - if( IotSemaphore_TimedWait( &( _uploadFinishedSem ), IOT_HTTPS_DEMO_ASYNC_TIMEOUT_MS ) == false ) - { - IotLogError( "Timed out waiting for the asynchronous request to complete." ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Check that the upload was successful. This variable is set during the _responseCompleteCallback(). */ - if( uploadSuccess == false ) - { - IotLogError( "Upload did not complete successfully." ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - #if defined( IOT_DEMO_HTTPS_PRESIGNED_GET_URL ) - /* The size of uploaded file from a GET of the file size. */ - uint32_t fileSize = 0; - - IotLogInfo( "Now checking %.*s for the file uploaded...", addressLen, pAddress ); - - /* Retrieve the path location and length from IOT_DEMO_HTTPS_PRESIGNED_GET_URL. */ - httpsClientStatus = IotHttpsClient_GetUrlPath( IOT_DEMO_HTTPS_PRESIGNED_GET_URL, - strlen( IOT_DEMO_HTTPS_PRESIGNED_GET_URL ), - &pPath, - &pathLen ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred in IotHttpsClient_GetUrlPath() on URL %s. Error code: %d", - IOT_DEMO_HTTPS_PRESIGNED_GET_URL, - httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Retrieve the address location and length from the IOT_DEMO_HTTPS_PRESIGNED_GET_URL. */ - httpsClientStatus = IotHttpsClient_GetUrlAddress( IOT_DEMO_HTTPS_PRESIGNED_GET_URL, - strlen( IOT_DEMO_HTTPS_PRESIGNED_GET_URL ), - &pAddress, - &addressLen ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred in IotHttpsClient_GetUrlAddress() on URL %s\r\n. Error code %d", - IOT_DEMO_HTTPS_PRESIGNED_GET_URL, - httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Verify the file was uploaded by retrieving the file size. */ - if( _IotHttpsDemo_GetS3ObjectFileSize( &fileSize, - connHandle, - pPath, - strlen( pPath ), - pAddress, - addressLen, - _pReqUserBuffer, - IOT_DEMO_HTTPS_REQ_USER_BUFFER_SIZE, - _pRespUserBuffer, - IOT_DEMO_HTTPS_RESP_USER_BUFFER_SIZE ) != EXIT_SUCCESS ) - { - IotLogError( "Failed to retrieve the s3 object size." ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - if( fileSize != IOT_DEMO_HTTPS_UPLOAD_DATA_SIZE ) - { - IotLogError( "Failed to upload the data to s3. Found the file size to be %d, but it should be %d.", - fileSize, - IOT_DEMO_HTTPS_UPLOAD_DATA ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - IotLogInfo( "Verified file size on S3 is %d. File size specified to upload is %d.", fileSize, IOT_DEMO_HTTPS_UPLOAD_DATA_SIZE ); - #endif /* if defined( IOT_DEMO_HTTPS_PRESIGNED_GET_URL ) */ - - IOT_FUNCTION_CLEANUP_BEGIN(); - - if( uploadFinishedSemCreated ) - { - IotSemaphore_Destroy( &( _uploadFinishedSem ) ); - } - - /* Disconnect from the server even if it is already disconnected. */ - IotHttpsClient_Disconnect( connHandle ); - /* Clean up the library because we are done using it. */ - IotHttpsClient_Cleanup(); - - IOT_FUNCTION_CLEANUP_END(); -} diff --git a/demos/https/iot_demo_https_s3_upload_sync.c b/demos/https/iot_demo_https_s3_upload_sync.c deleted file mode 100644 index d5eacf67d5c..00000000000 --- a/demos/https/iot_demo_https_s3_upload_sync.c +++ /dev/null @@ -1,485 +0,0 @@ -/* - * FreeRTOS V202011.00 - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://aws.amazon.com/freertos - * http://www.FreeRTOS.org - */ - -/** - * @file iot_demo_https_s3_upload_sync.c - * @brief Demonstrates synchronous usage of the HTTPS library by performing a PUT requests on a file to S3. - */ - -/* The config header is always included first. */ -#include "iot_config.h" - -/* C Standard includes. */ -#include -#include - -/* Set up logging for this demo. */ -#include "iot_demo_logging.h" - -/* FreeRTOS includes. */ -#include "iot_https_client.h" -#include "iot_https_utils.h" -#include "aws_demo_config.h" -#include "platform/iot_network.h" -#include "private/iot_error.h" -#include "iot_demo_https_common.h" -#include "platform/iot_clock.h" - -/** - * This demonstrates uploading a file to S3 using a pre-signed URL using the FreeRTOS HTTP Client library. - * The HTTPS Client library is a generic HTTP/1.1 client library that be used to upload files to other webservers as - * well. - * - * A presigned URL is required to run this demo. Please see the demos/https/README.md for instructions on how to - * generate one. - */ - -/** - * @cond DOXYGEN_IGNORE - * Doxygen should ignore this section. - * - * Provide default values for undefined configuration settings. - */ - -/* Presigned URL for S3 PUT Object access. A GET URL is defined to verify the demo.*/ -#ifndef IOT_DEMO_HTTPS_PRESIGNED_PUT_URL - #define IOT_DEMO_HTTPS_PRESIGNED_PUT_URL "Please configure a presigned PUT URL in iot_config.h." -#endif - -/* TLS port for HTTPS. */ -#ifndef IOT_DEMO_HTTPS_PORT - #define IOT_DEMO_HTTPS_PORT ( ( uint16_t ) 443 ) -#endif - -#ifndef IOT_DEMO_HTTPS_TRUSTED_ROOT_CA - /* This the Baltimore Cybertrust root CA associated with the S3 server certificate. */ - #define IOT_DEMO_HTTPS_TRUSTED_ROOT_CA \ - "-----BEGIN CERTIFICATE-----\n" \ - "MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ\n" \ - "RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD\n" \ - "VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX\n" \ - "DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y\n" \ - "ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy\n" \ - "VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr\n" \ - "mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr\n" \ - "IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK\n" \ - "mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu\n" \ - "XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy\n" \ - "dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye\n" \ - "jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1\n" \ - "BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3\n" \ - "DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92\n" \ - "9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx\n" \ - "jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0\n" \ - "Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz\n" \ - "ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS\n" \ - "R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\n" \ - "-----END CERTIFICATE-----\n" -#endif /* ifndef IOT_DEMO_HTTPS_TRUSTED_ROOT_CA */ - -/* Size in bytes of the User Buffer used to store the internal connection context. The size presented here accounts for - * storage of the internal connection context. The minimum size can be found in extern const unint32_t - * connectionUserBufferMinimumSize. */ -#ifndef IOT_DEMO_HTTPS_CONN_BUFFER_SIZE - #define IOT_DEMO_HTTPS_CONN_BUFFER_SIZE ( ( int ) 512 ) -#endif - -/* Size in bytes of the user buffer used to store the internal request context and HTTP request header lines. - * The size presented here accounts for the storage of the internal context, the first request line in the HTTP - * formatted header and extra headers. The minimum size can be found in extern const uint32_t - * requestUserBufferMinimumSize. Keep in mind that this requestUserBufferMinimumSize does not include the size of the - * path in the request line. The path could be well over 100 characters long as it includes not only the object key name - * in S3, but also the query following. The query following has the AWSAccessKeyId, the expiration time, and the - * AWS Signature Version 4 signature.*/ -#ifndef IOT_DEMO_HTTPS_REQ_USER_BUFFER_SIZE - #define IOT_DEMO_HTTPS_REQ_USER_BUFFER_SIZE ( ( int ) 512 ) -#endif - -/* Size in bytes of the user buffer used to store the internal response context and the HTTP response header lines. - * The size presented here accounts for the storage of the internal context, the first request line in the HTTP - * formatted header and extra headers. The minimum can be found in responseUserBufferMinimumSize. - * Keep in mind that if the headers from the response do not all fit into this buffer, then the rest of the headers - * will be discarded. The minimum size can be found in extern const uint32_t responseUserBufferMinimumSize. */ -#ifndef IOT_DEMO_HTTPS_RESP_USER_BUFFER_SIZE - #define IOT_DEMO_HTTPS_RESP_USER_BUFFER_SIZE ( ( int ) 1024 ) -#endif - -/* Pointer to the data to upload.*/ -#ifndef IOT_DEMO_HTTPS_UPLOAD_DATA - #define IOT_DEMO_HTTPS_UPLOAD_DATA "Hello World!" -#endif - -/* The size of the data in bytes to upload. */ -#ifndef IOT_DEMO_HTTPS_UPLOAD_DATA_SIZE - #define IOT_DEMO_HTTPS_UPLOAD_DATA_SIZE ( sizeof( IOT_DEMO_HTTPS_UPLOAD_DATA ) - 1 ) -#endif - -/* Time to wait in milliseconds before retrying the HTTPS Connection. A connection is only attempted again if - * IOT_HTTPS_CONNECTION_ERROR is returned from IotHttpsClient_Connect(). This indicates an error in the network - * layer. To view logging for network errors update IOT_LOG_LEVEL_NETWORK to IOT_LOG_ERROR in iot_config.h */ -#ifndef IOT_DEMO_HTTPS_CONNECTION_RETRY_WAIT_MS - #define IOT_DEMO_HTTPS_CONNECTION_RETRY_WAIT_MS ( ( uint32_t ) 3000 ) -#endif - -/* Number of times to retry the HTTPS connection. A connection is only attempted again if - * IOT_HTTPS_CONNECTION_ERROR is returned from IotHttpsClient_Connect(). This indicates an error in the network - * layer. To view logging for network errors update IOT_LOG_LEVEL_NETWORK to IOT_LOG_ERROR in iot_config.h */ -#ifndef IOT_DEMO_HTTPS_CONNECTION_NUM_RETRY - #define IOT_DEMO_HTTPS_CONNECTION_NUM_RETRY ( ( uint32_t ) 3 ) -#endif - -/* The timeout in milliseconds to wait on IotHttpsClient_SendSync(). This timeout is how long the routine will block - * for waiting for an HTTP response. It is possible that the server could close the connection after receiving a - * request, so never sending the response. */ -#ifndef IOT_DEMO_HTTPS_SYNC_TIMEOUT_MS - #define IOT_DEMO_HTTPS_SYNC_TIMEOUT_MS ( ( uint32_t ) 60000 ) -#endif - -/** @endcond */ - -/*-----------------------------------------------------------*/ - -/** - * @brief Buffer used to store the internal connection context. - */ -static uint8_t _pConnUserBuffer[ IOT_DEMO_HTTPS_CONN_BUFFER_SIZE ] = { 0 }; - -/** - * @brief Buffer used to store the request context and the HTTP request header lines. - */ -static uint8_t _pReqUserBuffer[ IOT_DEMO_HTTPS_REQ_USER_BUFFER_SIZE ] = { 0 }; - -/** - * @brief Buffer used to store the response context and the HTTP response header lines. - */ -static uint8_t _pRespUserBuffer[ IOT_DEMO_HTTPS_RESP_USER_BUFFER_SIZE ] = { 0 }; - -/*-----------------------------------------------------------*/ - -/* Declaration of demo function. */ -int RunHttpsSyncUploadDemo( bool awsIotMqttMode, - const char * pIdentifier, - void * pNetworkServerInfo, - void * pNetworkCredentialInfo, - const IotNetworkInterface_t * pNetworkInterface ); - -/*-----------------------------------------------------------*/ - -/** - * @brief The function that runs the HTTPS Synchronous Upload demo. - * - * @param[in] awsIotMqttMode Specify if this demo is running with the AWS IoT MQTT server. This is ignored in this demo. - * @param[in] pIdentifier NULL-terminated MQTT client identifier. This is ignored in this demo. - * @param[in] pNetworkServerInfo Contains network information specific for the MQTT demo. This is ignored in this demo. - * @param[in] pNetworkCredentialInfo Contains credential Info for a TLS connection. - * @param[in] pNetworkInterface Network interface to use for this demo. - * - * @return `EXIT_SUCCESS` if the demo completes successfully; `EXIT_FAILURE` otherwise. - */ -int RunHttpsSyncUploadDemo( bool awsIotMqttMode, - const char * pIdentifier, - void * pNetworkServerInfo, - void * pNetworkCredentialInfo, - const IotNetworkInterface_t * pNetworkInterface ) -{ - IOT_FUNCTION_ENTRY( int, EXIT_SUCCESS ); - - /* Unused parameters. */ - ( void ) awsIotMqttMode; - ( void ) pIdentifier; - ( void ) pNetworkServerInfo; - - /* HTTPS Client library return status. */ - IotHttpsReturnCode_t httpsClientStatus = IOT_HTTPS_OK; - - /* Configurations for the HTTPS connection. */ - IotHttpsConnectionInfo_t connConfig = { 0 }; - /* Handle identifying the HTTPS connection. */ - IotHttpsConnectionHandle_t connHandle = IOT_HTTPS_CONNECTION_HANDLE_INITIALIZER; - /* Configurations for the HTTPS request. */ - IotHttpsRequestInfo_t reqConfig = { 0 }; - /* Configurations for the HTTPS response. */ - IotHttpsResponseInfo_t respConfig = { 0 }; - - /* Handle identifying the HTTP request. This is valid after the request has been initialized with - * IotHttpsClient_InitializeRequest(). */ - IotHttpsRequestHandle_t reqHandle = IOT_HTTPS_REQUEST_HANDLE_INITIALIZER; - - /* Handle identifying the HTTP response. This is valid after the response has been received with - * IotHttpsClient_SendSync(). */ - IotHttpsResponseHandle_t respHandle = IOT_HTTPS_RESPONSE_HANDLE_INITIALIZER; - /* Synchronous request specific configurations. */ - IotHttpsSyncInfo_t reqSyncInfo = { 0 }; - /* Synchronous response specific configurations. */ - IotHttpsSyncInfo_t respSyncInfo = { 0 }; - - /* The location of the path within string IOT_DEMO_HTTPS_PRESIGNED_PUT_URL. */ - const char * pPath = NULL; - /* The length of the path within string IOT_DEMO_HTTPS_PRESIGNED_PUT_URL. */ - size_t pathLen = 0; - /* The location of the address within string IOT_DEMO_HTTPS_PRESIGNED_PUT_URL. */ - const char * pAddress = NULL; - /* The length of the address within string IOT_DEMO_HTTPS_PRESIGNED_PUT_URL. */ - size_t addressLen = 0; - /* The status of HTTP response. */ - uint16_t respStatus = IOT_HTTPS_STATUS_OK; - /* The current attempt in the number of connection tries. */ - uint32_t connAttempt = 0; - - IotLogInfo( "HTTPS Client Synchronous S3 upload demo using pre-signed URL: %s", IOT_DEMO_HTTPS_PRESIGNED_PUT_URL ); - - /* Retrieve the path location from IOT_DEMO_HTTPS_PRESIGNED_GET_URL. This function returns the length of the path - * without the query into pathLen. */ - httpsClientStatus = IotHttpsClient_GetUrlPath( IOT_DEMO_HTTPS_PRESIGNED_PUT_URL, - strlen( IOT_DEMO_HTTPS_PRESIGNED_PUT_URL ), - &pPath, - &pathLen ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred in IotHttpsClient_GetUrlPath() on URL %s. Error code: %d", - IOT_DEMO_HTTPS_PRESIGNED_PUT_URL, - httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Retrieve the address location and length from the IOT_DEMO_HTTPS_PRESIGNED_PUT_URL. */ - httpsClientStatus = IotHttpsClient_GetUrlAddress( IOT_DEMO_HTTPS_PRESIGNED_PUT_URL, - strlen( IOT_DEMO_HTTPS_PRESIGNED_PUT_URL ), - &pAddress, - &addressLen ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred in IotHttpsClient_GetUrlAddress() on URL %s\r\n. Error code %d", - IOT_DEMO_HTTPS_PRESIGNED_PUT_URL, - httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Set the connection configurations. - * Note: TLS Connection to AWS S3 service does not need a client certificate. - * The client authentication is performed at the HTTP protocol layer with a pre-signed URL. */ - connConfig.pAddress = pAddress; - connConfig.addressLen = addressLen; - connConfig.port = IOT_DEMO_HTTPS_PORT; - connConfig.pCaCert = IOT_DEMO_HTTPS_TRUSTED_ROOT_CA; - connConfig.caCertLen = sizeof( IOT_DEMO_HTTPS_TRUSTED_ROOT_CA ); - connConfig.userBuffer.pBuffer = _pConnUserBuffer; - connConfig.userBuffer.bufferLen = sizeof( _pConnUserBuffer ); - connConfig.pNetworkInterface = pNetworkInterface; - - /* Set the configurations needed for a synchronous request. */ - reqSyncInfo.pBody = ( uint8_t * ) ( IOT_DEMO_HTTPS_UPLOAD_DATA ); /* Pointer to the file/buffer of data we want to upload. */ - reqSyncInfo.bodyLen = IOT_DEMO_HTTPS_UPLOAD_DATA_SIZE; - - /* Ignore the response body in the synchronous response. */ - respSyncInfo.pBody = NULL; - respSyncInfo.bodyLen = 0; - - /* The path is everything that is not the address. It also includes the query. So we get the strlen( pPath ) to - * acquire everything following in IOT_DEMO_HTTPS_PRESIGNED_PUT_URL. */ - /* Set the request configurations. */ - reqConfig.pPath = pPath; - reqConfig.pathLen = strlen( pPath ); - reqConfig.pHost = pAddress; - reqConfig.hostLen = addressLen; - - /* The PUT method is used to upload an object to S3 because it is simpler than using POST. POST requires AWS S3 - * access specific header fields in the body of the message in a multipart/form-data encoded message. See - * https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html for more information about POST object. See - * https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html for more information about PUT object. */ - reqConfig.method = IOT_HTTPS_METHOD_PUT; - reqConfig.isNonPersistent = false; - reqConfig.userBuffer.pBuffer = _pReqUserBuffer; - reqConfig.userBuffer.bufferLen = sizeof( _pReqUserBuffer ); - reqConfig.isAsync = false; - reqConfig.u.pSyncInfo = &reqSyncInfo; - - /* Set the response configurations. */ - respConfig.userBuffer.pBuffer = _pRespUserBuffer; - respConfig.userBuffer.bufferLen = sizeof( _pRespUserBuffer ); - - /* Even though the body is being ignored, #IotHttpsResponseInfo_t.pSyncInfo should only be set to NULL if the - * response is being received asynchronously. */ - respConfig.pSyncInfo = &respSyncInfo; - - /* Initialize the HTTPS library. */ - httpsClientStatus = IotHttpsClient_Init(); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred initializing the HTTPS library. Error code: %d", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Initialize the request to initialize internal request context, write the HTTP request first line to the - * _pReqUserBuffer header space, and write headers User-Agent and Host. */ - httpsClientStatus = IotHttpsClient_InitializeRequest( &reqHandle, &reqConfig ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred in IotHttpsClient_InitializeRequest() with error code: %d", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Connect to S3. */ - for( connAttempt = 1; connAttempt <= IOT_DEMO_HTTPS_CONNECTION_NUM_RETRY; connAttempt++ ) - { - httpsClientStatus = IotHttpsClient_Connect( &connHandle, &connConfig ); - - if( ( httpsClientStatus == IOT_HTTPS_CONNECTION_ERROR ) && - ( connAttempt < IOT_DEMO_HTTPS_CONNECTION_NUM_RETRY ) ) - { - IotLogError( "Failed to connect to the S3 server, retrying after %d ms.", - IOT_DEMO_HTTPS_CONNECTION_RETRY_WAIT_MS ); - IotClock_SleepMs( IOT_DEMO_HTTPS_CONNECTION_RETRY_WAIT_MS ); - continue; - } - else - { - break; - } - } - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "Failed to connect to the server. Error code: %d.", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Send the upload request. */ - httpsClientStatus = IotHttpsClient_SendSync( connHandle, reqHandle, &respHandle, &respConfig, 0 ); - - /* If there was network error try again one more time. */ - if( httpsClientStatus == IOT_HTTPS_NETWORK_ERROR ) - { - /* Maybe the network error was because the server disconnected us. */ - httpsClientStatus = IotHttpsClient_Connect( &connHandle, &connConfig ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "Failed to reconnect to the S3 server after a network error on IotHttpsClient_SendSync(). Error code %d.", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - httpsClientStatus = IotHttpsClient_SendSync( connHandle, reqHandle, &respHandle, &respConfig, IOT_DEMO_HTTPS_SYNC_TIMEOUT_MS ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "Failed receiving the response on a second try after a network error. The error code is: %d", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - } - - httpsClientStatus = IotHttpsClient_ReadResponseStatus( respHandle, &respStatus ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "Error in retreiving the response status. Error code %d", httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - if( respStatus != IOT_HTTPS_STATUS_OK ) - { - IotLogError( "Failed to upload the data to s3. Response status: %d", respStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - IotLogInfo( "File was successfully uploaded." ); - - #if defined( IOT_DEMO_HTTPS_PRESIGNED_GET_URL ) - /* The size of uploaded file from a GET of the file size. */ - uint32_t fileSize = 0; - - IotLogInfo( "Now checking %.*s for the file uploaded...", addressLen, pAddress ); - - /* Retrieve the path location and length from IOT_DEMO_HTTPS_PRESIGNED_GET_URL. */ - httpsClientStatus = IotHttpsClient_GetUrlPath( IOT_DEMO_HTTPS_PRESIGNED_GET_URL, - strlen( IOT_DEMO_HTTPS_PRESIGNED_GET_URL ), - &pPath, - &pathLen ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred in IotHttpsClient_GetUrlPath() on URL %s. Error code: %d", - IOT_DEMO_HTTPS_PRESIGNED_GET_URL, - httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Retrieve the address location and length from the IOT_DEMO_HTTPS_PRESIGNED_GET_URL. */ - httpsClientStatus = IotHttpsClient_GetUrlAddress( IOT_DEMO_HTTPS_PRESIGNED_GET_URL, - strlen( IOT_DEMO_HTTPS_PRESIGNED_GET_URL ), - &pAddress, - &addressLen ); - - if( httpsClientStatus != IOT_HTTPS_OK ) - { - IotLogError( "An error occurred in IotHttpsClient_GetUrlAddress() on URL %s\r\n. Error code %d", - IOT_DEMO_HTTPS_PRESIGNED_GET_URL, - httpsClientStatus ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - /* Verify the file was uploaded by retrieving the file size. */ - if( _IotHttpsDemo_GetS3ObjectFileSize( &fileSize, - connHandle, - pPath, - strlen( pPath ), - pAddress, - addressLen, - _pReqUserBuffer, - IOT_DEMO_HTTPS_REQ_USER_BUFFER_SIZE, - _pRespUserBuffer, - IOT_DEMO_HTTPS_RESP_USER_BUFFER_SIZE ) != EXIT_SUCCESS ) - { - IotLogError( "Failed to retrieve the s3 object size." ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - - if( fileSize != IOT_DEMO_HTTPS_UPLOAD_DATA_SIZE ) - { - IotLogError( "Failed to upload the data to s3. Found the file size to be %d, but it should be %d.", - fileSize, - IOT_DEMO_HTTPS_UPLOAD_DATA ); - IOT_SET_AND_GOTO_CLEANUP( EXIT_FAILURE ); - } - IotLogInfo( "Verified file size on S3 is %d. File size specified to upload is %d.", fileSize, IOT_DEMO_HTTPS_UPLOAD_DATA_SIZE ); - #endif /* if defined( IOT_DEMO_HTTPS_PRESIGNED_GET_URL ) */ - - IOT_FUNCTION_CLEANUP_BEGIN(); - - /* Disconnect from the server even if the server may have already disconnected us. */ - if( connHandle != NULL ) - { - IotHttpsClient_Disconnect( connHandle ); - } - - /* Clean up the library because we are done using it. */ - IotHttpsClient_Cleanup(); - - IOT_FUNCTION_CLEANUP_END(); -} diff --git a/demos/https/presigned_urls_gen.py b/demos/https/presigned_urls_gen.py deleted file mode 100644 index fa50b7591f1..00000000000 --- a/demos/https/presigned_urls_gen.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/python - -import boto3 -from botocore.client import Config -import argparse - -def get_presigned_urls(bucket_name, key_name): - # Get the service client. - # SigV2 is being deprecated. If the boto3 installation in the current Python environment has an older version of - # the package, then this configuration forces the use of SigV4. - s3 = boto3.client('s3', config=Config(signature_version='s3v4')) - - client_method_dict = { - 'GET': 'get_object', - 'PUT': 'put_object' - } - - # Generate the URL to get 'key-name' from 'bucket-name' - for method in client_method_dict.keys(): - url = s3.generate_presigned_url( - ClientMethod=client_method_dict[method], - Params={ - 'Bucket': bucket_name, - 'Key': key_name - } - ) - print('#define IOT_DEMO_HTTPS_PRESIGNED_' + method + '_URL' + ' ' + '\"' + url + '\"') - -def main(): - parser = argparse.ArgumentParser(description='S3 Presigned URL Generator. See README.md') - parser.add_argument('--bucket', action='store', required=True, dest='bucket_name', help='The name of the S3 bucket of interest.') - parser.add_argument('--key', action='store', required=True, dest='key_name', help='The name of the S3 Object in the bucket. This is referred to as a \'key\'') - args = parser.parse_args() - - get_presigned_urls(args.bucket_name, args.key_name) - -if __name__ == '__main__': # pragma: no cover - main() diff --git a/demos/include/aws_application_version.h b/demos/include/aws_application_version.h index 6901fa9c64b..0b270861ff3 100644 --- a/demos/include/aws_application_version.h +++ b/demos/include/aws_application_version.h @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/include/aws_ble_gatt_server_demo.h b/demos/include/aws_ble_gatt_server_demo.h index 51dd79f0026..2c9a9c2dedb 100644 --- a/demos/include/aws_ble_gatt_server_demo.h +++ b/demos/include/aws_ble_gatt_server_demo.h @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/include/aws_clientcredential.h b/demos/include/aws_clientcredential.h index 038eb7b9d06..c3bda361fda 100644 --- a/demos/include/aws_clientcredential.h +++ b/demos/include/aws_clientcredential.h @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/include/aws_clientcredential_keys.h b/demos/include/aws_clientcredential_keys.h index 626c39f775b..ac861f23e68 100644 --- a/demos/include/aws_clientcredential_keys.h +++ b/demos/include/aws_clientcredential_keys.h @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/include/aws_demo.h b/demos/include/aws_demo.h index 08b83dcab59..bcd057ed202 100644 --- a/demos/include/aws_demo.h +++ b/demos/include/aws_demo.h @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/include/aws_iot_demo_network.h b/demos/include/aws_iot_demo_network.h index a651f9ec4b7..15ecdcdf93d 100644 --- a/demos/include/aws_iot_demo_network.h +++ b/demos/include/aws_iot_demo_network.h @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/include/aws_ota_codesigner_certificate.h b/demos/include/aws_ota_codesigner_certificate.h index 52bd107c1d8..f63e4519a15 100644 --- a/demos/include/aws_ota_codesigner_certificate.h +++ b/demos/include/aws_ota_codesigner_certificate.h @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/include/aws_wifi_connect_task.h b/demos/include/aws_wifi_connect_task.h index 89f6c53c8e5..b4964f90a4e 100644 --- a/demos/include/aws_wifi_connect_task.h +++ b/demos/include/aws_wifi_connect_task.h @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/include/iot_ble_numericComparison.h b/demos/include/iot_ble_numericComparison.h index 1769a51a7b0..da0a20a8b83 100644 --- a/demos/include/iot_ble_numericComparison.h +++ b/demos/include/iot_ble_numericComparison.h @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/include/iot_config_common.h b/demos/include/iot_config_common.h index 68d996f54c5..31ab122f886 100644 --- a/demos/include/iot_config_common.h +++ b/demos/include/iot_config_common.h @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/include/iot_demo_logging.h b/demos/include/iot_demo_logging.h index ab18eef9ce5..b974e6542c7 100644 --- a/demos/include/iot_demo_logging.h +++ b/demos/include/iot_demo_logging.h @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/include/iot_demo_runner.h b/demos/include/iot_demo_runner.h index f8341ad3179..9c5ae472213 100644 --- a/demos/include/iot_demo_runner.h +++ b/demos/include/iot_demo_runner.h @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -58,6 +58,14 @@ #undef democonfigDEMO_PRIORITY #define democonfigDEMO_PRIORITY democonfigCORE_MQTT_CONNECTION_SHARING_DEMO_TASK_PRIORITY #endif +#elif defined( CONFIG_CORE_HTTP_MUTUAL_AUTH_DEMO_ENABLED ) + #define DEMO_entryFUNCTION RunCoreHttpMutualAuthDemo +#elif defined( CONFIG_CORE_HTTP_S3_DOWNLOAD_DEMO_ENABLED ) + #define DEMO_entryFUNCTION RunCoreHttpS3DownloadDemo +#elif defined( CONFIG_CORE_HTTP_S3_DOWNLOAD_MULTITHREADED_DEMO_ENABLED ) + #define DEMO_entryFUNCTION RunCoreHttpS3DownloadMultithreadedDemo +#elif defined( CONFIG_CORE_HTTP_S3_UPLOAD_DEMO_ENABLED ) + #define DEMO_entryFUNCTION RunCoreHttpS3UploadDemo #elif defined( CONFIG_DEVICE_SHADOW_DEMO_ENABLED ) #define DEMO_entryFUNCTION RunDeviceShadowDemo #if defined( democonfigSHADOW_DEMO_TASK_STACK_SIZE ) @@ -68,6 +76,16 @@ #undef democonfigDEMO_PRIORITY #define democonfigDEMO_PRIORITY democonfigSHADOW_DEMO_TASK_PRIORITY #endif +#elif defined( CONFIG_JOBS_DEMO_ENABLED ) + #define DEMO_entryFUNCTION RunJobsDemo + #if defined( democonfigJOBS_DEMO_TASK_STACK_SIZE ) + #undef democonfigDEMO_STACKSIZE + #define democonfigDEMO_STACKSIZE democonfigJOBS_DEMO_TASK_STACK_SIZE + #endif + #if defined( democonfigJOBS_DEMO_TASK_PRIORITY ) + #undef democonfigDEMO_PRIORITY + #define democonfigDEMO_PRIORITY democonfigJOBS_DEMO_TASK_PRIORITY + #endif #elif defined( CONFIG_GREENGRASS_DISCOVERY_DEMO_ENABLED ) #define DEMO_entryFUNCTION vStartGreenGrassDiscoveryTask #if defined( democonfigGREENGRASS_DISCOVERY_TASK_STACK_SIZE ) @@ -88,8 +106,6 @@ #undef democonfigDEMO_PRIORITY #define democonfigDEMO_PRIORITY democonfigTCP_ECHO_TASKS_SINGLE_TASK_PRIORITY #endif -#elif defined( CONFIG_DEFENDER_DEMO_ENABLED ) - #define DEMO_entryFUNCTION RunDefenderDemo #elif defined( CONFIG_POSIX_DEMO_ENABLED ) #define DEMO_entryFUNCTION vStartPOSIXDemo #elif defined( CONFIG_OTA_UPDATE_DEMO_ENABLED ) @@ -120,17 +136,10 @@ #undef democonfigNETWORK_TYPES #define democonfigNETWORK_TYPES ( AWSIOT_NETWORK_TYPE_BLE ) #endif -#elif defined( CONFIG_HTTPS_SYNC_DOWNLOAD_DEMO_ENABLED ) - #define DEMO_entryFUNCTION RunHttpsSyncDownloadDemo -#elif defined( CONFIG_HTTPS_ASYNC_DOWNLOAD_DEMO_ENABLED ) - #define DEMO_entryFUNCTION RunHttpsAsyncDownloadDemo -#elif defined( CONFIG_HTTPS_SYNC_UPLOAD_DEMO_ENABLED ) - #define DEMO_entryFUNCTION RunHttpsSyncUploadDemo -#elif defined( CONFIG_HTTPS_ASYNC_UPLOAD_DEMO_ENABLED ) - #define DEMO_entryFUNCTION RunHttpsAsyncUploadDemo - #elif defined( CONFIG_CLI_UART_DEMO_ENABLED ) #define DEMO_entryFUNCTION vRunCLIUartDemo +#elif defined( CONFIG_DEVICE_DEFENDER_DEMO_ENABLED ) + #define DEMO_entryFUNCTION RunDeviceDefenderDemo #else /* if defined( CONFIG_CORE_MQTT_BASIC_TLS_DEMO_ENABLED ) */ /* if no demo was defined there will be no entry point defined and we will not be able to run the demo */ #error "No demo to run. One demo should be enabled" diff --git a/demos/jobs_for_aws/CMakeLists.txt b/demos/jobs_for_aws/CMakeLists.txt new file mode 100644 index 00000000000..f160a077334 --- /dev/null +++ b/demos/jobs_for_aws/CMakeLists.txt @@ -0,0 +1,35 @@ +# Demo module for AWS IoT Jobs library. +afr_demo_module(jobs) + +afr_set_demo_metadata(ID "JOBS_DEMO") +afr_set_demo_metadata(DESCRIPTION "An example that demonstrates the use of the AWS IoT Jobs library.") +afr_set_demo_metadata(DISPLAY_NAME "Jobs Demo") + +# Add the CMakeLists.txt file of module to metadata list. +afr_module_cmake_files(${AFR_CURRENT_MODULE} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt +) + +afr_module_sources( + ${AFR_CURRENT_MODULE} + INTERFACE + "${CMAKE_CURRENT_LIST_DIR}/jobs_demo.c" +) + +afr_module_include_dirs( + ${AFR_CURRENT_MODULE} + INTERFACE + ${AFR_DEMOS_DIR}/common/mqtt_demo_helpers +) + +afr_module_dependencies( + ${AFR_CURRENT_MODULE} + INTERFACE + AFR::mqtt_demo_helpers + AFR::core_json + AFR::jobs + # Add dependency on the device_shadow_demo_dependencies + # metadata module so that this demo is only shown when the + # Device Shadow library is selected on the FreeRTOS console. + AFR::jobs_demo_dependencies +) diff --git a/demos/jobs_for_aws/jobs_demo.c b/demos/jobs_for_aws/jobs_demo.c new file mode 100755 index 00000000000..bd8923b6fa5 --- /dev/null +++ b/demos/jobs_for_aws/jobs_demo.c @@ -0,0 +1,901 @@ +/* + * FreeRTOS V202012.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/** + * @file jobs_demo.c + * + * @brief Demo for showing use of the Jobs library API. This demo uses the Jobs library + * along with the coreMQTT and Secure Sockets libraries to communicate with the AWS IoT Jobs service. + * Please refer to AWS documentation for more information about AWS IoT Jobs. + * https://docs.aws.amazon.com/iot/latest/developerguide/iot-jobs.html + * + * The Jobs library API provides macros and helper functions for assembling MQTT topics strings, + * and for determining whether an incoming MQTT message is related to the AWS IoT Jobs service. + * The Jobs library does not depend on an MQTT library, and therefore, the code for MQTT operations + * is placed in another file (mqtt_demo_helpers.c) for improving readability of the demo code about using + * the Jobs library. + * + * @note This demo requires setup of an AWS account, provisioning of a Thing resource on the AWS IoT account, + * and the creation of Jobs for the Thing resource. Please refer to AWS CLI documentation for more information + * in creating a job document. + * https://docs.aws.amazon.com/cli/latest/reference/iot/create-job.html + * + * This demo connects to the AWS IoT broker and calls the MQTT APIs of the AWS IoT Jobs service to receive + * jobs queued (as JSON documents) for the Thing resource (associated with this demo application) on the cloud, + * then executes the jobs and updates the status of the jobs back to the cloud. + * The demo expects job documents to have an "action" JSON key. Actions can + * be one of "print", "publish", or "exit". + * A "print" job logs a message to the local console, and must contain a "message", + * e.g. { "action": "print", "message": "Hello World!" }. + * A "publish" job publishes a message to an MQTT Topic. The job document must + * contain a "message" and "topic" to publish to, e.g. + * { "action": "publish", "topic": "demo/jobs", "message": "Hello World!" }. + * An "exit" job exits the demo. Sending { "action": "exit" } will end the demo program. + * + * @note This demo uses retry logic to connect to AWS IoT broker if connection attempts fail. + * The FreeRTOS/backoffAlgorithm library is used to calculate the retry interval with an exponential + * backoff and jitter algorithm. For generating random number required by the algorithm, the PKCS11 + * module is used as it allows access to a True Random Number Generator (TRNG) if the vendor platform + * supports it. + * It is RECOMMENDED to seed the random number generator with a device-specific entropy source so that + * probability of collisions from devices in connection retries is mitigated. + * + */ + +/* Standard includes. */ +#include +#include +#include + +/* Demo Specific config file. */ +#include "jobs_demo_config.h" + +#include "aws_demo.h" + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Jobs library header. */ +#include "jobs.h" + +/* JSON library includes. */ +#include "core_json.h" + +/* Include common MQTT demo helpers. */ +#include "mqtt_demo_helpers.h" +#include "core_json.h" + +/*------------- Demo configurations -------------------------*/ + +#ifndef democonfigTHING_NAME + +/** + * @brief Predefined thing name. + * + * This is the example predefine thing name and could be compiled in ROM code. + */ + #define democonfigTHING_NAME clientcredentialIOT_THING_NAME +#endif + +/** + * @brief The length of #democonfigTHING_NAME. + */ +#define THING_NAME_LENGTH ( ( uint16_t ) ( sizeof( democonfigTHING_NAME ) - 1 ) ) + +/*-----------------------------------------------------------*/ + +/*-----------------------------------------------------------*/ + +/** + * @brief The JSON key of the execution object. + * + * Job documents received from the AWS IoT Jobs service are in JSON format. + * All such JSON documents will contain this key, whose value represents the unique + * identifier of a Job. + */ +#define jobsexampleEXECUTION_KEY "execution" + +/** + * @brief The length of #jobsexampleEXECUTION_KEY. + */ +#define jobsexampleEXECUTION_KEY_LENGTH ( sizeof( jobsexampleEXECUTION_KEY ) - 1 ) + +/** + * @brief The query key to use for searching the Job ID key in message payload + * from AWS IoT Jobs service. + * + * Job documents received from the AWS IoT Jobs service are in JSON format. + * All such JSON documents will contain this key, whose value represents the unique + * identifier of a Job. + */ +#define jobsexampleQUERY_KEY_FOR_JOB_ID jobsexampleEXECUTION_KEY ".jobId" + +/** + * @brief The length of #jobsexampleQUERY_KEY_FOR_JOB_ID. + */ +#define jobsexampleQUERY_KEY_FOR_JOB_ID_LENGTH ( sizeof( jobsexampleQUERY_KEY_FOR_JOB_ID ) - 1 ) + +/** + * @brief The query key to use for searching the Jobs document ID key in message payload + * from AWS IoT Jobs service. + * + * Job documents received from the AWS IoT Jobs service are in JSON format. + * All such JSON documents will contain this key, whose value represents the unique + * identifier of a Job. + */ +#define jobsexampleQUERY_KEY_FOR_JOBS_DOC jobsexampleEXECUTION_KEY ".jobDocument" + +/** + * @brief The length of #jobsexampleQUERY_KEY_FOR_JOBS_DOC. + */ +#define jobsexampleQUERY_KEY_FOR_JOBS_DOC_LENGTH ( sizeof( jobsexampleQUERY_KEY_FOR_JOBS_DOC ) - 1 ) + +/** + * @brief The query key to use for searching the Action key in Jobs document + * from AWS IoT Jobs service. + * + * This demo program expects this key to be in the Job document. It is a key + * specific to this demo. + */ +#define jobsexampleQUERY_KEY_FOR_ACTION jobsexampleQUERY_KEY_FOR_JOBS_DOC ".action" + +/** + * @brief The length of #jobsexampleQUERY_KEY_FOR_ACTION. + */ +#define jobsexampleQUERY_KEY_FOR_ACTION_LENGTH ( sizeof( jobsexampleQUERY_KEY_FOR_ACTION ) - 1 ) + +/** + * @brief The query key to use for searching the Message key in Jobs document + * from AWS IoT Jobs service. + * + * This demo program expects this key to be in the Job document if the "action" + * is either "publish" or "print". It represents the message that should be + * published or printed, respectively. + */ +#define jobsexampleQUERY_KEY_FOR_MESSAGE jobsexampleQUERY_KEY_FOR_JOBS_DOC ".message" + +/** + * @brief The length of #jobsexampleQUERY_KEY_FOR_MESSAGE. + */ +#define jobsexampleQUERY_KEY_FOR_MESSAGE_LENGTH ( sizeof( jobsexampleQUERY_KEY_FOR_MESSAGE ) - 1 ) + +/** + * @brief The query key to use for searching the topic key in Jobs document + * from AWS IoT Jobs service. + * + * This demo program expects this key to be in the Job document if the "action" + * is "publish". It represents the MQTT topic on which the message should be + * published. + */ +#define jobsexampleQUERY_KEY_FOR_TOPIC jobsexampleQUERY_KEY_FOR_JOBS_DOC ".topic" + +/** + * @brief The length of #jobsexampleQUERY_KEY_FOR_TOPIC. + */ +#define jobsexampleQUERY_KEY_FOR_TOPIC_LENGTH ( sizeof( jobsexampleQUERY_KEY_FOR_TOPIC ) - 1 ) + +/** + * @brief Utility macro to generate the PUBLISH topic string to the + * DescribePendingJobExecution API of AWS IoT Jobs service for requesting + * the next pending job information. + * + * @param[in] thingName The name of the Thing resource to query for the + * next pending job. + */ +#define START_NEXT_JOB_TOPIC( thingName ) \ + ( JOBS_API_PREFIX thingName JOBS_API_BRIDGE JOBS_API_STARTNEXT ) + +/** + * @brief Utility macro to generate the subscription topic string for the + * NextJobExecutionChanged API of AWS IoT Jobs service that is required + * for getting notification about changes in the next pending job in the queue. + * + * @param[in] thingName The name of the Thing resource to query for the + * next pending Job. + */ +#define NEXT_JOB_EXECUTION_CHANGED_TOPIC( thingName ) \ + ( JOBS_API_PREFIX thingName JOBS_API_BRIDGE JOBS_API_NEXTJOBCHANGED ) + +/** + * @brief Format a JSON status message. + * + * @param[in] x one of "IN_PROGRESS", "SUCCEEDED", or "FAILED" + */ +#define MAKE_STATUS_REPORT( x ) "{\"status\":\"" x "\"}" + +/** + * @brief The maximum number of times to run the loop in this demo. + */ +#ifndef JOBS_MAX_DEMO_COUNT + #define JOBS_MAX_DEMO_COUNT ( 3 ) +#endif + +/** + * @brief Time in ticks to wait between each iteration of the demo execution, + * in case a retry is required from demo execution failure. + */ +#define DELAY_BETWEEN_DEMO_ITERATIONS_TICKS ( pdMS_TO_TICKS( 5000U ) ) + +/*-----------------------------------------------------------*/ + +/** + * @brief Currently supported actions that a job document can specify. + */ +typedef enum JobActionType +{ + JOB_ACTION_PRINT, /**< Print a message. */ + JOB_ACTION_PUBLISH, /**< Publish a message to an MQTT topic. */ + JOB_ACTION_EXIT, /**< Exit the demo. */ + JOB_ACTION_UNKNOWN /**< Unknown action. */ +} JobActionType; + +/*-----------------------------------------------------------*/ + +/** + * @brief The MQTT context used for MQTT operation. + */ +static MQTTContext_t xMqttContext; + +/** + * @brief The network context used for Openssl operation. + */ +static NetworkContext_t xNetworkContext; + +/** + * @brief Static buffer used to hold MQTT messages being sent and received. + */ +static uint8_t ucSharedBuffer[ democonfigNETWORK_BUFFER_SIZE ]; + +/** + * @brief Static buffer used to hold MQTT messages being sent and received. + */ +static MQTTFixedBuffer_t xBuffer = +{ + .pBuffer = ucSharedBuffer, + .size = democonfigNETWORK_BUFFER_SIZE +}; + +/** + * @brief A global flag which represents whether a job for the "Exit" action + * has been received from AWS IoT Jobs service. + */ +static BaseType_t xExitActionJobReceived = pdFALSE; + +/** + * @brief A global flag which represents whether an error was encountered while + * executing the demo. + * + * @note When this flag is set, the demo terminates execution. + */ +static BaseType_t xDemoEncounteredError = pdFALSE; + +/*-----------------------------------------------------------*/ + +/** + * @brief Converts a string in a job document to a #JobActionType + * value. + * + * @param[in] pcAction The job action as a string. + * @param[in] xActionLength The length of @p pcAction. + * + * @return A #JobActionType equivalent to the given string. + */ +static JobActionType prvGetAction( const char * pcAction, + size_t xActionLength ); + +/** + * @brief This example uses the MQTT library of the AWS IoT Device SDK for + * Embedded C. This is the prototype of the callback function defined by + * that library. It will be invoked whenever the MQTT library receives an + * incoming message. + * + * @param[in] pxMqttContext MQTT context pointer. + * @param[in] pxPacketInfo Packet Info pointer for the incoming packet. + * @param[in] pxDeserializedInfo Deserialized information from the incoming packet. + */ +static void prvEventCallback( MQTTContext_t * pxMqttContext, + MQTTPacketInfo_t * pxPacketInfo, + MQTTDeserializedInfo_t * pxDeserializedInfo ); + +/** + * @brief Process payload from NextJobExecutionChanged and StartNextPendingJobExecution + * API MQTT topics of AWS IoT Jobs service. + * + * This handler parses the payload received about the next pending job to identify + * the action requested in the job document, and perform the appropriate + * action to execute the job. + * + * @param[in] pPublishInfo Deserialized publish info pointer for the incoming + * packet. + */ +static void prvNextJobHandler( MQTTPublishInfo_t * pxPublishInfo ); + +/** + * @brief Sends an update for a job to the UpdateJobExecution API of the AWS IoT Jobs service. + * + * @param[in] pcJobId The job ID whose status has to be updated. + * @param[in] usJobIdLength The length of the job ID string. + * @param[in] pcJobStatusReport The JSON formatted report to send to the AWS IoT Jobs service + * to update the status of @p pcJobId. + */ +static void prvSendUpdateForJob( char * pcJobId, + uint16_t usJobIdLength, + const char * pcJobStatusReport ); + +/** + * @brief Executes a job received from AWS IoT Jobs service and sends an update back to the service. + * It parses the received job document, executes the job depending on the job "Action" type, and + * sends an update to AWS for the Job. + * + * @param[in] pxPublishInfo The PUBLISH packet containing the job document received from the + * AWS IoT Jobs service. + * @param[in] pcJobId The ID of the job to execute. + * @param[in] usJobIdLength The length of the job ID string. + */ +static void prvProcessJobDocument( MQTTPublishInfo_t * pxPublishInfo, + char * pcJobId, + uint16_t usJobIdLength ); + +/*-----------------------------------------------------------*/ + +static JobActionType prvGetAction( const char * pcAction, + size_t xActionLength ) +{ + JobActionType xAction = JOB_ACTION_UNKNOWN; + + configASSERT( pcAction != NULL ); + + if( strncmp( pcAction, "print", xActionLength ) == 0 ) + { + xAction = JOB_ACTION_PRINT; + } + else if( strncmp( pcAction, "publish", xActionLength ) == 0 ) + { + xAction = JOB_ACTION_PUBLISH; + } + else if( strncmp( pcAction, "exit", xActionLength ) == 0 ) + { + xAction = JOB_ACTION_EXIT; + } + + return xAction; +} + +static void prvSendUpdateForJob( char * pcJobId, + uint16_t usJobIdLength, + const char * pcJobStatusReport ) +{ + char pUpdateJobTopic[ JOBS_API_MAX_LENGTH( THING_NAME_LENGTH ) ]; + size_t ulTopicLength = 0; + JobsStatus_t xStatus = JobsSuccess; + + configASSERT( ( pcJobId != NULL ) && ( usJobIdLength > 0 ) ); + configASSERT( pcJobStatusReport != NULL ); + + /* Generate the PUBLISH topic string for the UpdateJobExecution API of AWS IoT Jobs service. */ + xStatus = Jobs_Update( pUpdateJobTopic, + sizeof( pUpdateJobTopic ), + democonfigTHING_NAME, + THING_NAME_LENGTH, + pcJobId, + usJobIdLength, + &ulTopicLength ); + + if( xStatus == JobsSuccess ) + { + if( PublishToTopic( &xMqttContext, + pUpdateJobTopic, + ulTopicLength, + pcJobStatusReport, + strlen( pcJobStatusReport ) ) == pdFALSE ) + { + /* Set global flag to terminate demo as PUBLISH operation to update job status failed. */ + xDemoEncounteredError = pdTRUE; + + LogError( ( "Failed to update the status of job: JobID=%.*s, NewStatePayload=%s", + usJobIdLength, pcJobId, pcJobStatusReport ) ); + } + } + else + { + /* Set global flag to terminate demo as topic generation for UpdateJobExecution API failed. */ + xDemoEncounteredError = pdTRUE; + + LogError( ( "Failed to generate Publish topic string for sending job update: " + "JobID=%.*s, NewStatePayload=%s", + usJobIdLength, pcJobId, pcJobStatusReport ) ); + } +} + +static void prvProcessJobDocument( MQTTPublishInfo_t * pxPublishInfo, + char * pcJobId, + uint16_t usJobIdLength ) +{ + char * pcAction = NULL; + size_t uActionLength = 0U; + JSONStatus_t xJsonStatus = JSONSuccess; + + configASSERT( pxPublishInfo != NULL ); + configASSERT( ( pxPublishInfo->pPayload != NULL ) && ( pxPublishInfo->payloadLength > 0 ) ); + + xJsonStatus = JSON_Search( ( char * ) pxPublishInfo->pPayload, + pxPublishInfo->payloadLength, + jobsexampleQUERY_KEY_FOR_ACTION, + jobsexampleQUERY_KEY_FOR_ACTION_LENGTH, + &pcAction, + &uActionLength ); + + if( xJsonStatus != JSONSuccess ) + { + LogError( ( "Job document schema is invalid. Missing expected \"action\" key in document." ) ); + prvSendUpdateForJob( pcJobId, usJobIdLength, MAKE_STATUS_REPORT( "FAILED" ) ); + } + else + { + JobActionType xActionType = JOB_ACTION_UNKNOWN; + char * pcMessage = NULL; + size_t ulMessageLength = 0U; + + xActionType = prvGetAction( pcAction, uActionLength ); + + switch( xActionType ) + { + case JOB_ACTION_EXIT: + LogInfo( ( "Received job contains \"exit\" action. Updating state of demo." ) ); + xExitActionJobReceived = pdTRUE; + prvSendUpdateForJob( pcJobId, usJobIdLength, MAKE_STATUS_REPORT( "SUCCEEDED" ) ); + break; + + case JOB_ACTION_PRINT: + LogInfo( ( "Received job contains \"print\" action." ) ); + + xJsonStatus = JSON_Search( ( char * ) pxPublishInfo->pPayload, + pxPublishInfo->payloadLength, + jobsexampleQUERY_KEY_FOR_MESSAGE, + jobsexampleQUERY_KEY_FOR_MESSAGE_LENGTH, + &pcMessage, + &ulMessageLength ); + + if( xJsonStatus == JSONSuccess ) + { + /* Print the given message if the action is "print". */ + LogInfo( ( "\r\n" + "/*-----------------------------------------------------------*/\r\n" + "\r\n" + "%.*s\r\n" + "\r\n" + "/*-----------------------------------------------------------*/\r\n" + "\r\n", ulMessageLength, pcMessage ) ); + prvSendUpdateForJob( pcJobId, usJobIdLength, MAKE_STATUS_REPORT( "SUCCEEDED" ) ); + } + else + { + LogError( ( "Job document schema is invalid. Missing \"message\" for \"print\" action type." ) ); + prvSendUpdateForJob( pcJobId, usJobIdLength, MAKE_STATUS_REPORT( "FAILED" ) ); + } + + break; + + case JOB_ACTION_PUBLISH: + LogInfo( ( "Received job contains \"publish\" action." ) ); + char * pcTopic = NULL; + size_t ulTopicLength = 0U; + + xJsonStatus = JSON_Search( ( char * ) pxPublishInfo->pPayload, + pxPublishInfo->payloadLength, + jobsexampleQUERY_KEY_FOR_TOPIC, + jobsexampleQUERY_KEY_FOR_TOPIC_LENGTH, + &pcTopic, + &ulTopicLength ); + + /* Search for "topic" key in the Jobs document.*/ + if( xJsonStatus != JSONSuccess ) + { + LogError( ( "Job document schema is invalid. Missing \"topic\" key for \"publish\" action type." ) ); + prvSendUpdateForJob( pcJobId, usJobIdLength, MAKE_STATUS_REPORT( "FAILED" ) ); + } + else + { + xJsonStatus = JSON_Search( ( char * ) pxPublishInfo->pPayload, + pxPublishInfo->payloadLength, + jobsexampleQUERY_KEY_FOR_MESSAGE, + jobsexampleQUERY_KEY_FOR_MESSAGE_LENGTH, + &pcMessage, + &ulMessageLength ); + + /* Search for "message" key in Jobs document.*/ + if( xJsonStatus == JSONSuccess ) + { + /* Publish to the parsed MQTT topic with the message obtained from + * the Jobs document.*/ + if( PublishToTopic( &xMqttContext, + pcTopic, + ulTopicLength, + pcMessage, + ulMessageLength ) == pdFALSE ) + { + /* Set global flag to terminate demo as PUBLISH operation to execute job failed. */ + xDemoEncounteredError = pdTRUE; + + LogError( ( "Failed to execute job with \"publish\" action: Failed to publish to topic. " + "JobID=%.*s, Topic=%.*s", + usJobIdLength, pcJobId, ulTopicLength, pcTopic ) ); + } + + prvSendUpdateForJob( pcJobId, usJobIdLength, MAKE_STATUS_REPORT( "SUCCEEDED" ) ); + } + else + { + LogError( ( "Job document schema is invalid. Missing \"message\" key for \"publish\" action type." ) ); + prvSendUpdateForJob( pcJobId, usJobIdLength, MAKE_STATUS_REPORT( "FAILED" ) ); + } + } + + break; + + default: + configPRINTF( ( "Received Job document with unknown action %.*s.", + uActionLength, pcAction ) ); + break; + } + } +} + +static void prvNextJobHandler( MQTTPublishInfo_t * pxPublishInfo ) +{ + configASSERT( pxPublishInfo != NULL ); + configASSERT( ( pxPublishInfo->pPayload != NULL ) && ( pxPublishInfo->payloadLength > 0 ) ); + + /* Check validity of JSON message response from server.*/ + if( JSON_Validate( pxPublishInfo->pPayload, pxPublishInfo->payloadLength ) != JSONSuccess ) + { + LogError( ( "Received invalid JSON payload from AWS IoT Jobs service" ) ); + } + else + { + char * pcJobId = NULL; + size_t ulJobIdLength = 0U; + + /* Parse the Job ID of the next pending job execution from the JSON payload. */ + if( JSON_Search( ( char * ) pxPublishInfo->pPayload, + pxPublishInfo->payloadLength, + jobsexampleQUERY_KEY_FOR_JOB_ID, + jobsexampleQUERY_KEY_FOR_JOB_ID_LENGTH, + &pcJobId, + &ulJobIdLength ) != JSONSuccess ) + { + LogWarn( ( "Failed to parse Job ID in message received from AWS IoT Jobs service: " + "IncomingTopic=%.*s, Payload=%.*s", + pxPublishInfo->topicNameLength, pxPublishInfo->pTopicName, + pxPublishInfo->payloadLength, pxPublishInfo->pPayload ) ); + } + else + { + configASSERT( ulJobIdLength < JOBS_JOBID_MAX_LENGTH ); + LogInfo( ( "Received a Job from AWS IoT Jobs service: JobId=%.*s", + ulJobIdLength, pcJobId ) ); + + /* Process the Job document and execute the job. */ + prvProcessJobDocument( pxPublishInfo, pcJobId, ( uint16_t ) ulJobIdLength ); + } + } +} + +/*-----------------------------------------------------------*/ + +/* This is the callback function invoked by the MQTT stack when it receives + * incoming messages. This function demonstrates how to use the Jobs_MatchTopic + * function to determine whether the incoming message is a Jobs message + * or not. If it is, it handles the message depending on the message type. + */ +static void prvEventCallback( MQTTContext_t * pxMqttContext, + MQTTPacketInfo_t * pxPacketInfo, + MQTTDeserializedInfo_t * pxDeserializedInfo ) +{ + uint16_t usPacketIdentifier; + + ( void ) pxMqttContext; + + configASSERT( pxDeserializedInfo != NULL ); + configASSERT( pxMqttContext != NULL ); + configASSERT( pxPacketInfo != NULL ); + + usPacketIdentifier = pxDeserializedInfo->packetIdentifier; + + /* Handle incoming publish. The lower 4 bits of the publish packet + * type is used for the dup, QoS, and retain flags. Hence masking + * out the lower bits to check if the packet is publish. */ + if( ( pxPacketInfo->type & 0xF0U ) == MQTT_PACKET_TYPE_PUBLISH ) + { + configASSERT( pxDeserializedInfo->pPublishInfo != NULL ); + JobsTopic_t topicType = JobsMaxTopic; + JobsStatus_t xStatus = JobsError; + + LogDebug( ( "Received an incoming publish message: TopicName=%.*s", + pxDeserializedInfo->pPublishInfo->topicNameLength, + ( const char * ) pxDeserializedInfo->pPublishInfo->pTopicName ) ); + + /* Let the Jobs library tell us whether this is a Jobs message. */ + xStatus = Jobs_MatchTopic( ( char * ) pxDeserializedInfo->pPublishInfo->pTopicName, + pxDeserializedInfo->pPublishInfo->topicNameLength, + democonfigTHING_NAME, + THING_NAME_LENGTH, + &topicType, + NULL, + NULL ); + + if( xStatus == JobsSuccess ) + { + /* Upon successful return, the messageType has been filled in. */ + if( ( topicType == JobsStartNextSuccess ) || ( topicType == JobsNextJobChanged ) ) + { + /* Handler function to process payload. */ + prvNextJobHandler( pxDeserializedInfo->pPublishInfo ); + } + else if( topicType == JobsUpdateSuccess ) + { + LogInfo( ( "Job update status request has been accepted by AWS Iot Jobs service." ) ); + } + else if( topicType == JobsStartNextFailed ) + { + LogWarn( ( "Request for next job description rejected: RejectedResponse=%.*s.", + pxDeserializedInfo->pPublishInfo->payloadLength, + ( const char * ) pxDeserializedInfo->pPublishInfo->pPayload ) ); + } + else if( topicType == JobsUpdateFailed ) + { + /* Set the global flag to terminate the demo, because the request for updating and executing the job status + * has been rejected by the AWS IoT Jobs service. */ + xDemoEncounteredError = pdTRUE; + + LogWarn( ( "Request for job update rejected: RejectedResponse=%.*s.", + pxDeserializedInfo->pPublishInfo->payloadLength, + ( const char * ) pxDeserializedInfo->pPublishInfo->pPayload ) ); + + LogError( ( "Terminating demo as request to update job status has been rejected by " + "AWS IoT Jobs service..." ) ); + } + else + { + LogWarn( ( "Received an unexpected messages from AWS IoT Jobs service: " + "JobsTopicType=%u", topicType ) ); + } + } + else if( xStatus == JobsNoMatch ) + { + LogWarn( ( "Incoming message topic does not belong to AWS IoT Jobs!: topic=%.*s", + pxDeserializedInfo->pPublishInfo->topicNameLength, + ( const char * ) pxDeserializedInfo->pPublishInfo->pTopicName ) ); + } + else + { + LogError( ( "Failed to parse incoming publish job. Topic=%.*s!", + pxDeserializedInfo->pPublishInfo->topicNameLength, + ( const char * ) pxDeserializedInfo->pPublishInfo->pTopicName ) ); + } + } + else + { + vHandleOtherIncomingPacket( pxPacketInfo, usPacketIdentifier ); + } +} + +/*-----------------------------------------------------------*/ + +/** + * @brief Entry point of the Jobs demo. + * + * This main function demonstrates how to use the Jobs library API library. + * + * This demo uses helper functions for MQTT operations that have internal + * loops to process incoming messages. Those are not the focus of this demo + * and therefore, are placed in a separate file mqtt_demo_helpers.c. + * + * This function also shows that the communication with the AWS IoT Jobs services does + * not require explicit subscriptions to the response MQTT topics for request commands that + * sent to the MQTT APIs (like DescribeJobExecution API) of the service. The service + * will send messages on the response topics for the request commands on the same + * MQTT connection irrespective of whether the client subscribes to the response topics. + * Therefore, this demo processes incoming messages from response topics of DescribeJobExecution + * and UpdateJobExecution APIs without explicitly subscribing to the topics. + */ +int RunJobsDemo( bool awsIotMqttMode, + const char * pIdentifier, + void * pNetworkServerInfo, + void * pNetworkCredentialInfo, + const void * pNetworkInterface ) +{ + BaseType_t xDemoStatus = pdPASS; + UBaseType_t uxDemoRunCount = 0UL; + BaseType_t retryDemoLoop = pdFALSE; + + /* Remove compiler warnings about unused parameters. */ + ( void ) awsIotMqttMode; + ( void ) pIdentifier; + ( void ) pNetworkServerInfo; + ( void ) pNetworkCredentialInfo; + ( void ) pNetworkInterface; + + /* This demo runs a single loop unless there are failures in the demo execution. + * In case of failures in the demo execution, demo loop will be retried for up to + * JOBS_MAX_DEMO_COUNT times. */ + do + { + /* Establish an MQTT connection with AWS IoT over a mutually authenticated TLS session. */ + xDemoStatus = EstablishMqttSession( &xMqttContext, + &xNetworkContext, + &xBuffer, + prvEventCallback ); + + if( xDemoStatus == pdFAIL ) + { + /* Log error to indicate connection failure. */ + LogError( ( "Failed to connect to AWS IoT broker." ) ); + } + else + { + /* Print out a short user guide to the console. The default logging + * limit of 255 characters can be changed in demo_logging.c, but breaking + * up the only instance of a 1000+ character string is more practical. */ + LogInfo( ( "\r\n" + "/*-----------------------------------------------------------*/\r\n" + "\r\n" + "The Jobs demo is now ready to accept Jobs.\r\n" + "Jobs may be created using the AWS IoT console or AWS CLI.\r\n" + "See the following link for more information.\r\n" ) ); + LogInfo( ( "\r" + "https://docs.aws.amazon.com/cli/latest/reference/iot/create-job.html\r\n" + "\r\n" + "This demo expects Job documents to have an \"action\" JSON key.\r\n" + "The following actions are currently supported:\r\n" ) ); + LogInfo( ( "\r" + " - print \r\n" + " Logs a message to the local console. The Job document must also contain a \"message\".\r\n" + " For example: { \"action\": \"print\", \"message\": \"Hello world!\"} will cause\r\n" + " \"Hello world!\" to be printed on the console.\r\n" ) ); + LogInfo( ( "\r" + " - publish \r\n" + " Publishes a message to an MQTT topic. The Job document must also contain a \"message\" and \"topic\".\r\n" ) ); + LogInfo( ( "\r" + " For example: { \"action\": \"publish\", \"topic\": \"demo/jobs\", \"message\": \"Hello world!\"} will cause\r\n" + " \"Hello world!\" to be published to the topic \"demo/jobs\".\r\n" ) ); + LogInfo( ( "\r" + " - exit \r\n" + " Exits the demo program. This program will run until { \"action\": \"exit\" } is received.\r\n" + "\r\n" + "/*-----------------------------------------------------------*/\r\n" ) ); + + /* Subscribe to the NextJobExecutionChanged API topic to receive notifications about the next pending + * job in the queue for the Thing resource used by this demo. */ + if( SubscribeToTopic( &xMqttContext, + NEXT_JOB_EXECUTION_CHANGED_TOPIC( democonfigTHING_NAME ), + sizeof( NEXT_JOB_EXECUTION_CHANGED_TOPIC( democonfigTHING_NAME ) ) - 1 ) != pdPASS ) + { + xDemoStatus = pdFAIL; + LogError( ( "Failed to subscribe to NextJobExecutionChanged API of AWS IoT Jobs service: Topic=%s", + NEXT_JOB_EXECUTION_CHANGED_TOPIC( democonfigTHING_NAME ) ) ); + } + } + + if( xDemoStatus == pdPASS ) + { + /* Publish to AWS IoT Jobs on the StartNextPendingJobExecution API to request the next pending job. + * + * Note: It is not required to make MQTT subscriptions to the response topics of the + * StartNextPendingJobExecution API because the AWS IoT Jobs service sends responses for + * the PUBLISH commands on the same MQTT connection irrespective of whether the client has subscribed + * to the response topics or not. + * This demo processes incoming messages from the response topics of the API in the prvEventCallback() + * handler that is supplied to the coreMQTT library. */ + if( PublishToTopic( &xMqttContext, + START_NEXT_JOB_TOPIC( democonfigTHING_NAME ), + sizeof( START_NEXT_JOB_TOPIC( democonfigTHING_NAME ) ) - 1, + NULL, + 0 ) != pdPASS ) + { + xDemoStatus = pdFAIL; + LogError( ( "Failed to publish to StartNextPendingJobExecution API of AWS IoT Jobs service: " + "Topic=%s", START_NEXT_JOB_TOPIC( democonfigTHING_NAME ) ) ); + } + } + + /* Keep on running the demo until we receive a job for the "exit" action to exit the demo. */ + while( ( xExitActionJobReceived == pdFALSE ) && + ( xDemoEncounteredError == pdFALSE ) && + ( xDemoStatus == pdPASS ) ) + { + MQTTStatus_t xMqttStatus = MQTTSuccess; + + /* Check if we have notification for the next pending job in the queue from the + * NextJobExecutionChanged API of the AWS IoT Jobs service. */ + xMqttStatus = MQTT_ProcessLoop( &xMqttContext, 300U ); + + if( xMqttStatus != MQTTSuccess ) + { + xDemoStatus = pdFAIL; + LogError( ( "Failed to receive notification about next pending job: " + "MQTT_ProcessLoop failed" ) ); + } + } + + /* Increment the demo run count. */ + uxDemoRunCount++; + + /* Retry demo loop only if there is a failure before completing + * the processing of any pending jobs. Any failure in MQTT unsubscribe + * or disconnect is considered a failure in demo execution and retry + * will not be attempted since a retry without any pending jobs will + * make this demo indefinitely wait. */ + if( ( xDemoStatus == pdFAIL ) || ( xDemoEncounteredError == pdTRUE ) ) + { + if( uxDemoRunCount < JOBS_MAX_DEMO_COUNT ) + { + LogWarn( ( "Demo iteration %lu failed. Retrying...", uxDemoRunCount ) ); + retryDemoLoop = pdTRUE; + } + else + { + LogError( ( "All %d demo iterations failed.", JOBS_MAX_DEMO_COUNT ) ); + retryDemoLoop = pdFALSE; + } + } + else + { + /* Reset the flag for demo retry. */ + retryDemoLoop = pdFALSE; + } + + /* Unsubscribe from the NextJobExecutionChanged API topic. */ + if( UnsubscribeFromTopic( &xMqttContext, + NEXT_JOB_EXECUTION_CHANGED_TOPIC( democonfigTHING_NAME ), + sizeof( NEXT_JOB_EXECUTION_CHANGED_TOPIC( democonfigTHING_NAME ) ) - 1 ) != pdPASS ) + { + xDemoStatus = pdFAIL; + LogError( ( "Failed to unsubscribe from the NextJobExecutionChanged API of AWS IoT Jobs service: " + "Topic=%s", NEXT_JOB_EXECUTION_CHANGED_TOPIC( democonfigTHING_NAME ) ) ); + } + + /* Disconnect the MQTT and network connections with AWS IoT. */ + if( DisconnectMqttSession( &xMqttContext, &xNetworkContext ) != pdPASS ) + { + xDemoStatus = pdFAIL; + LogError( ( "Disconnection from AWS Iot failed..." ) ); + } + + /* Add a delay if a retry is required. */ + if( retryDemoLoop == pdTRUE ) + { + /* Clear the flag that indicates that indicates the demo error + * before attempting a retry. */ + xDemoEncounteredError = pdFALSE; + + LogInfo( ( "A short delay before the next demo iteration." ) ); + vTaskDelay( DELAY_BETWEEN_DEMO_ITERATIONS_TICKS ); + } + } while( retryDemoLoop == pdTRUE ); + + return( ( ( xDemoStatus == pdPASS ) && ( xDemoEncounteredError == pdFALSE ) ) ? + EXIT_SUCCESS : EXIT_FAILURE ); +} + +/*-----------------------------------------------------------*/ diff --git a/demos/network_manager/aws_iot_demo_network.c b/demos/network_manager/aws_iot_demo_network.c index 3f47578db36..5efabc0830e 100644 --- a/demos/network_manager/aws_iot_demo_network.c +++ b/demos/network_manager/aws_iot_demo_network.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/network_manager/aws_iot_network_manager.c b/demos/network_manager/aws_iot_network_manager.c index 23c77c5b76c..4590144c9a3 100644 --- a/demos/network_manager/aws_iot_network_manager.c +++ b/demos/network_manager/aws_iot_network_manager.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/network_manager/iot_network_manager_private.h b/demos/network_manager/iot_network_manager_private.h index dc575370153..99d03a6faec 100644 --- a/demos/network_manager/iot_network_manager_private.h +++ b/demos/network_manager/iot_network_manager_private.h @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/ota/aws_iot_ota_update_demo.c b/demos/ota/aws_iot_ota_update_demo.c index 6b2e7da90d8..2c06ed448db 100644 --- a/demos/ota/aws_iot_ota_update_demo.c +++ b/demos/ota/aws_iot_ota_update_demo.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/posix/aws_posix_demo.c b/demos/posix/aws_posix_demo.c index 922e7221236..d6577237772 100644 --- a/demos/posix/aws_posix_demo.c +++ b/demos/posix/aws_posix_demo.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/tcp/aws_tcp_echo_client_single_task.c b/demos/tcp/aws_tcp_echo_client_single_task.c index bdf11f2b5b7..237a8380169 100644 --- a/demos/tcp/aws_tcp_echo_client_single_task.c +++ b/demos/tcp/aws_tcp_echo_client_single_task.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/tcp/aws_tcp_echo_client_single_tasks.h b/demos/tcp/aws_tcp_echo_client_single_tasks.h index 9522ceb37ee..e22c3f1c24d 100644 --- a/demos/tcp/aws_tcp_echo_client_single_tasks.h +++ b/demos/tcp/aws_tcp_echo_client_single_tasks.h @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/demos/wifi_provisioning/aws_wifi_connect_task.c b/demos/wifi_provisioning/aws_wifi_connect_task.c index 8658382fdce..a578a882486 100644 --- a/demos/wifi_provisioning/aws_wifi_connect_task.c +++ b/demos/wifi_provisioning/aws_wifi_connect_task.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202011.00 + * FreeRTOS V202012.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/doc/freertos_port_qual/FreeRTOS_Porting_Guide.pdf b/doc/freertos_port_qual/FreeRTOS_Porting_Guide.pdf index ceca087d03e74d7fda28b3c42c890d0ff52ab2de..88b0a52dbc3e57b29167c3fa5407414fc6b704dd 100644 GIT binary patch delta 550405 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�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

=bd%zESX9%)gG>!m+omxq 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㔛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® z0~ZX8LBhd+F%ZriW3IAS+1u>*S9euq{a;JCp?pS0M#ej_s|$mqE*Px@u&yhNe>96B z$G8{6&v0(n9|B_SC1XffAm29Q1^)|GQ&yp3+?e=`^2tjsQ5$=-OyOAJOqlF#z(VHF zB=)W0xRg4@e#NTssq4zdFW%_Kv?;>ezqs#o#TdsectTs^>A0~a_oHrz;HVO$tDTzf z)6ud20sUq^L_P=$NiJ+k&*wXa5oKRA!`3!O$NcehV31Tpv^K%4a1iz_?uf}p4-q$3 zJOE=Z^xu;p&=}V5Hj6%^VxiINdScdCUc1?%62JYCAr11MtGxy@og)=k*V7BE>t_bm z72^ZrX&W~j`Hz~K;sNkM$%I5y>d{GLV+$JuFv)bgj~F~ooOuxw**`aMBtoRj=5VB0 z3$0k|WY+^G_MM6~O-I zh-Uc@VAr*yGonwSIb8$t(`@$&wx)KB&S;k4BdSValA^o|LuXbwj-ha{g=Ngn(`NBJ*6oo9-=^zPu8!UCq3 z)(aW0e;i}S@ZhE`LVF~5(y;5O&>7BE@*l7+>XLR8AE=`Xrkna%%A`{U|10`Qdh;Y_ z7Py#C#=d8c3HhVx2xG^H)y&VTxr>^Zz|E3wX}8q8S{F@NwvGuQ)8ol~!+7`1Qs~06 z(NZf}x&1LqN{K9({VzL7rI#iUtQalvVmw*v+s=0zgGDWq2!`}Y3=lqn6x4(XsL!M3b3#_iEhH04%0+%56MvvG5g z{{VKBH<-aD+kBpVv_%V!qJS`9h+VyC4t~p!?wJJqi!wTmH+XGpgYq+6hvVVT)M3@)X_|(E^FXGi;InD1T<6d96UKKQP<0E&xn1 zxxnND0M>=!NZliR$LEBrUFafxMn}Q}Gw)>Kgd{+2&lvQR6)kKLtSA_1W`XZH9axM-Y(Zf?yYamEdQk_Lq9~x7U*k-6+_|`*#bq?2@mXa=fEiKR5t?t z%k~P09Y|s|x@?zN7`M}OB8g;L^BmWbiJ@rnoZ0JY`78R=b15pD~tHpiEmeCx? zYJwa2kH=FYG&+c`STY=hRxC7HAhqhXIZOn@Vvh1(%pwDDdOk6q=)S}BbdNF7=sk$~ zsPTwQXr8jazW0k2FRWHggoV&bO=RsD!Cyy$eCqK|#b8JIkBn5k`BYYsQi(aHz2!uK z@&8|+acUzNwy}~=@?UgHtq_pT_?1HQn7Av*LH#i#_r%;;EoOg-{;!5OaRuw|Dl&a!Ew#sHkm{C7c2|;NjnoPoF%xzIyoYs{hlTW*gi{~G{{<^*3%bES|=4SWf?(_G% WpWko4?0AOJNiKKKo*mx5+x-vN?_h5L diff --git a/doc/freertos_port_qual/FreeRTOS_Qualification_Guide.pdf b/doc/freertos_port_qual/FreeRTOS_Qualification_Guide.pdf index 18b99a08913631b637aa232d27ad9038b2390ea2..af15b883a0445e56592bd48020476e9cab6d43f1 100644 GIT binary patch delta 117614 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 Qo0e9OUUSX%-4mn#0~iHV+5i9m delta 104774 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
m|Nimp?l^B;Agf;(=Ja+C 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�&IQOK)Io31H*2{&MK68W6e zTqocihRr)I1V6=&fs^kvrG(*aQ_Eu~o3?4+Ra;NYLUe}(CdfKhE%0pPqUuG7>Wg3V z9YxfaWJfS-eZRV}0Bh?qdeR8w#T?L?3glfKIXkEC^&p+%B1XLm+F4l+;s}X}hjZ6g zG5P{#5)9>b?j`bA3|@5tpGEpo57WEF8^&ce;JzG9IKa=kfe$Y!a*bsJ78fivfm*%4 z`d5u0t+m!yhGzu*a92JUpj@fSdy}5InJsJbSzJs1%CbVsLYF^&Z^Wtg-9Xn?^;1Nh z)!dzRap}`S-7?84CP!OCsfb^pIjy^&OzknjnI_)>6ZCaWvg-Nz&vkKkO>cOmtiC9! z&A%uvDDJHcswL8$|IUzRYZNKOPV}01Fur>TCmlTm^p?g7!HRmZT)BgLoJF0~3r~Ii zCsD*U7k*8C!_z*Lyw``j-iAMzrkQC?*3>Fg3s?-hCudir-!!Gbs8%1sX)7qPCQ;E<5O;>>)>?|2ba+5%`G~1KnDD*ej zjqpOLh<6qUWy5U!SmI|hw^1jn-ICPd;1C;}c7LRo42m2DC~0U@nQHJE{f3DW+^#04 z&lQ9BI#Kz^%#TwxB7%{nb5BsaRGxM4MPOSoWVA4fQ5D%j@BJ)ZFaos%kgA8cm}9Y7 zj|3au!K+4`tbV0_59lP*2DKci;S1&0R||c|m-XqLcs5-6vEwI^8jM6AC&*_W%aw)Jfj#QqRFN zbq*?bh_@HLUjzE+nJ#wRgzs~&PhhUI=U4Fn^Ut)i)kV$4D4|`gwoT#LteY$lN#S~S zYv(L%*f8~(4vR{qi#WIp& z6@HQPt+QX?757>ER27JvlZ`7`D-$yj-(o1&O2I7+E~hWEPg8KUqJ(lLSsr{A$Ku&z zNR_;5q@}!F!-t zl*=t&ji({gmhryQ26_pBhZguf;90mvZPs_a7Rut9yqVbrQck%#g2rS1l~*Crq_UMwaSP_HmPe8F$nS+KRXx>FyugI48xKcV3cQ;BhVD(T z1&Lwf)gn!)tbrSQL83!1?ZT7&;T@8P6C|?3-6D2O&%a{PB45EtR??a#qg=!1Jv;2}elK^!Eht~#+M)%LWL^WAbS^|f6QCoH!{O+2-9 z9USZARh@t$WHrOE5CaPEeuaQjjIV!1e|n@}edYeEn#B}G*;h>7mevBUfkJVc(sfgz zi06ZwN@>3WLxmborKfu)KJb{5RO>-tKkv~T3C)6AUhKBFqa2o!GphQ>$(^RvxSAH4 z0KG>&70)DdRCeMvnV{Dkcug|-htZjkUa%4q21c&w9`CQ$YM4fW$&46l88155k#AqMzWZ7;hlC`CC&5(zEAxlD+bnPV*TY=GbqYWkPmZ_)+DV_>{fC)bOh&hl z{;B2IjnVI>;M;3HhT~`ie%jr`WHkPP6>^cUP|2jBGXVVzyGdhoedYdu3X3UE*`)+~+Pj>ccT!=XeZV>C>mNfpf%(Lri^p za3p6_nUriks3_UtddA0#Xe?rN27vGW+mTfTvP(WGNWr?7&&Wj!y?Yx{MBG#Bne@Nw zp%}f{8blZ&#x^Y>joe=*p+ol2QzD`OWaB2J8jd{sA_XIi9tY;M10@=q?)4J-7`)=q3;V{_0I}$yB-&i~_UG-Y9w8%+KpiOu&GQ=-M0EwdIhC+> zHh+;&@zp7Rw@=`WZy#t13cG8Dzo?|cKx7yQr9Hj|)Bjo{(EjclGLCBjQAgoGQG1Gh)rgDCow_@rQt}Ao2Sa7T_-Zso|dBh`}FiQ_gd5haqymJk& zLwohK<^)IWBC|YAl~7=;r%f{Gd9wgDZMd|d6wAORmb{r4I9@v1n2b`eXM7$c(alZ9 zuxL#x$l(2>mL#`%-k|4PluwHG{eC-|EH((A-C2dRZe2MTW#h|>EhIJmIM(t0k#&UW z0B_2rbdzk>0`4xlurQxOl^zP-9dJnYjIHSR*5w#|m6+G6n-x)F6G6_`Iju!+R@^{PUvDx zX1@BHL&%meSN}8c<=$n+myGgH6c~nnp%aE|TsxP8S#m_xySF$@m3psF`s2;BK56^m zUtPq*uSeID%58i2DY{|b97DhG$zXIK%y0>CME}CW@E-B=@o;xFv*(=$(bvk08O+Bw z>H`kpE+5yHAdanoho?t;TLEFH_-vdYc5YruPCgD0D+dQ9H#<9smy1ss z2UHbk6Lt_cHxDHzCl`pD2VzVDq=hJA0f`{WLjX3CKL>wTeNc&$>p!b54gvV^*rD`6 z)#6~~0C7Et!T}|S2Xd4Ll{2jaKm@TH1_a@;@`CtSc^`Ft0Ak~L;OvoV#t}dhIXf3S zh>MMzk{#L;J1-QBog2grt^z(x4t913 z)&#UOhB3ewQXZ(Jtn8HRtk4di)Nyh_DTLaVosApB`kOn}acDJmJ`f)t2PGRf6rP8h zk_*Zr8wV#P8+;Bny6rp@UD-l8F zCIBV4P=&Z3#ODC9L*-+GiqFpRo71n802*XDb9)O{OG>CHkSswUEm(ineyx_M^+L4| zMSS@R1{eO#sxQH#^zm9Z(|B5@MTR#-H@qKG>FOue!bpy z@4g=Cs^@=mH95LDiB%uU(?{|xse)iuD<4$Wrr!!)zFuJ|Ypdn)xLe<5S%$ls?A-;Y ztL2bUAgT+{kznOx1U0se5Vx{f&WO%irpwpeB@U!G4b=qYAA#kfgIY5Ns@N8y!zHYF zP~Rz9)l!tADFkos~jnW z!k94xZ0;s3!!!j)oZld(l-3A-i9$CHwyf81`LvR+{906#yZP#EvXFiV2_4r$tz@nv z;LA4~@8FnTyj7Ho+;!r()se}2?GYv^#^xjlmEo3EM6W+M0)-)6sJH+`&YO<4i?Q3y z*c>>H0*8{bVD}=_SEhJ;I>HIT0fq;=?IYnrq=mRb*fZ#ZKVf85Z_q!|ks#P=?3>8@ zzelc%`H_2r+K>9_El z`9V}))K=dGgLg%{j?HO4&?bI#XtBrbwcLYeLTVYJgbmiA{POd|6A8ygDY!1_wxgZH zkRf!mV@Z^T3dk1oux-7aBR3K0C3Rcww)Gv~Prhw7KR{i)AgNI>#RU0C7xf%$KnW9kw4&1w&5JV5_rz*1@j14V^ly516hl412 zSz}(b2Lq8P(5C|w=F%M;^@e*>A`856Fhy=x14FN7wsr2vsq>;?nNNrt{dJotAb$cXT9F}t9;dwnaTF|_2XcX5O zgm_dZ8V-i_Hg6L3h#I_*FLsIiu`07*@0fHguQ?81ENNs_|D?3hq|b zZyWC8?|z^n9}l1D+8+-C1QCNK=XopiluIGFTB+g3^1?z{%JnzAytc8eFV)72xZK9X zBmm$_Zuj8Sk?ai693JtCw)I`(n~JC)wN_LW%re9(N?3=r8=~S6N#1b!TSkkgO%N~g z?Q3_1+=qQnar-jAsbD(arPTpg=im2@6!!&-O_OB*#AN&MTI~2`+s}9J(=s*NgCuka z&Zk6wzN35o?6q(7;TBtO7ow}kPn$5SBlqUeru&=w8R)|!ra9ZC5sOC_Mh^0qc`KqC z@Hou*+0Eu2M5BfHcQtx)9tF`8I&##-BnNUltybc>3MKS!-8+_Wr>BD#D`iBP9s4z} z!Ih&yxxj6qt5fxpb^di?{u<1wZf^rjF|ol8Z*)^jGmvO4Eb?LEHECbzQ&x)Sa-J%& zZT_DMMTx!MS|EnO;h*Vnmv9?z+=Ck@Q4(l(7fpJF{J)~>Z(#+Ir+&=D`Wj5RJ+VOS zIkW8@_6lD`Z96>!pyDMQ_#qo1k>$d39;`BUU<#7AMb83Iy0UUsFQa@`kdU;|s;`ru zKC)Nf3J`A|_3^AbFs#>pJrqUQ8F#$`E6v!z#VhXKg)Qol&XU}WG{Afrjy%#{YX3cx zU%C~>IjJO$cEJ2O9rotrTdh}b6hD$buiU0@?ioV>lOCsSj!?pUd1{p=o#M5?Nc7&^q3YR)o*EG;eCnaE7wip>>mMzN$}U}9{?4cHrBJm2^l!~7KuUy6{3|s zG=Muyd{MMrBP*E?Yi@k1l4dRxm>nf2;?!Mh(>FgLevH*bh~q|iNp3ZT@%d|Dh+m^_ z-NjaTha&$ggu55jFx0rz2uEwqojVg1yV`CX6@erMt#}Z%HUfEI8 z)39cg<0;Ul@FIF#cUL&jdzrD?4)=#*!hl$*zsmH$NCV(Dpr9bR;k2?>yeK%PcrR zmE~+`b@?Ed<8|}NL&BUQi9a3IhLQZeMOQQa-t~xK7pDn!L}d7>q000(LCDwRP`1@H zfZp>3(d(~~ne<)+`%Ika;G;a2yCk!vE(9AIDGg@kRCwyo=TQ}NH-&hy&wtu>HpP}t z1%TZ@1Dtsq<8?97%Vh0DKKFzeO+LR!smWAcHS-Rug)~e_XsX;fAm);_3?A$EY1zK$ z>uQxkp0@4e3Hiy5Je@M@nEs;P+=RV(bv`^gP$Gl}kBpX@M9}q~1k4u>1|MC^cO|~# z-PSgZJTh>^FrUl6%S^ILQjKH`JD?Qlw>aE_ABCmjOZV?X#ES@3cO8Juzt6u~vV}3w zO5qegG3H)g?n7)WBRE#J-1;Kw3^en-egiuQ@}Hd`;zSW3aYZ1RnnlJRTEsLFRTr;J z-E03eRSd@tPX^pZ0>_*VQExrN^xf9EfquGdo~^P6N%j3mroo3+OzZ=t%aqdX47GDv z#ZrBTU@!e-SM`!DtLrIx85kkyE?^;y0s4Op`({K++iQfbEkvd3Z@&e`Hx;El;ro|X5YCTkA9LtCX`D=7QWMcR6%5$Hr zPb7%dg46=TyM3r&XD=tR+M(jOE5|2u8YwgUX;nRNLX6L92a0%dh;H0F8>!C|=5^~6 z0Mm&fcw?V@v`BSmRY7ug%_2Q{HZHDb=5GtPfA(~ZzDmCm-!pV;Cvvvg;l^Kl$1~@0 zfa(GqERAg`ubwUfD>3HXlx}lPBaZcz&C+(lT?rj+`KV!o0cgf%Kk4wO5M=n1?F3TF zmqq9(jVw3YpCtgYm6|+EN+VZ!}E12!1C!Rm4nZ=!#K1!O{++(Mt?;q%4usf@tP z*C%&{{lE&;^JZn()PV@k^AXq(dW=-(tALxB;TUgNPF<@X2ZQkT(nl9bPgL{t&{yPl zP$kBA=di%(8Hlgh;EAf0iYa>?8--rhJ#nz2FeQwm>Vvlua0AxAMrEWS?l<%9+#16# zEjG{DwSfL*VnG#uMI&r13koYO*Zm zpN5x)j+d7Dc+cLOjXlqWQwL<@w-C(mB|kTdu1`g>HtpWC{xJPjOXtKtl);D7*{`(^ zR?90M%k@N64(X|C;bpw6By!+YlWw@%_7LsxFjb188}cHSt1i7w?~S^iMaZK5YA66b z<$0JTc&CwnxMpPZa&$hq1J`kXrN0YXudwigyO94AJC{OsEeuju+}?6cA>5^HdL8p` zIO@>X|F-bwYYnZ2la7}B#C1G&lAhJ~AhmJjS9On86XW>=DU6cP#%C)ci2z4z?jICN zJ5S$reNeX>ExgpuDy`ai`##_ijEnPo&Et|0gp*zaX6zpvHdl+TTd|wTds>we=B3e@E8?xWtN=#!%e?mB< zIR6S=+Cxsz{)zI%hO41ZqL6L@4H;HR<^{zw@0D&h^F+yQjna6Z>-PKpye+;7*A8^> zvIIWqDV@%|c8S~in}V-v+r}u)5-Rf_*AO}7b$PBhVy36a&ym&2inntljdoC*OimDF z9VyaTYAzHQ={hb>+v8OMPRY+}T-x{37%&Rg1WJr(V3{|4r$*YWQl2;ZO4F>Sup4-N zIGV5N$*sf7FVNr15I(*4dKcGW;Anyi)>b!gz-ajRT%CSr_j>6dzQ>WX6~A1_OZNcJ zjzGq{A5J8q;8cgZn%69YitQ`Pig#UG_DR*9Sl5Bt^&B5uD;R5Ig~ZA8jteD@V^PW> zTbgM}btP@~g-@fdV9-;3a^bVZn&q>7+ECNrqz1D3RWuwnrPcWrq{TMiXp!M47>^d7 zOxd-j3Eeq#M|Y@h>ob5Dls&{q{AelU(8*oICa;ioedoAp?doJ!l!d(TB_-IXadk|!QJ z#oMGt1_|U( z)f$1WwBXepKp3oV`1;@+Ns)(ykCV9LiBKx7;?rIvq83a9QayoS#6Z2WX9z;F4zYqn z5^K{QV9n_$#QRctasMgM$TnC}k7W$9P3boj+rR=-Whw>!h>6gAyrNf{xR{up;H@cG2zo|Pdo)(`fK1WcM@9zhm6`;K z=w$^-5YWB(`6t`?yZ9pYrxAz8rC7#rw=x04h*_M;J2 ze+Qq{kzoquR6|O%h(7+fsUs+IAD)#T)x388+YEv;`DQ-mDFBvOVJ|nG%IdI2KpTGp1~Kx7_SBu9i%CV z5i$N6Yf8^)ns&E0C!g;g?!Rr&N2k*?eF4m;~ouRF08>1*+ z(<@}FmP3C%gfY7Z(8$CX`*Dq|^Ya=TP%o_nMw@kQNi7s^JH}Q7Oqz*mVl;N8#8Bh* zgr_ii{HkiFUYy!m^koob_RLpAomwq4R#4&Fz;G?$`0U{d-B*#^-|g`#s^BS9-()ik zMW5`ud+U!8rBBD&;*5G|Wz39z!tg!i|AZ-aI^%v}ckuN3Cigkn!kxk=sdu(@gZtxg zK7J(h1a~f#Ty?wQlVCwbk?#kyHaDB-7kiUw3qco-mLhGD2LpHprYKZG(I=;$$?cE4 zvm}#HCofnn4^BpQWPEpUo{R?DjVN%=)w3?P>hmNL==9UtrVd{)pLjMOvax5x{BR*e zWolymN~7=T-9OCv3}ZQ=*Sc`qbj`UhFv>#{$$O16z#&Y*0O~<&uxT^M(FTHb<1@=Q zsy_@|SEs*`b#JDnx=L_^I;k)0wR_{fs4Vmzc7(K%DOv|CwYuV5?*ZU5TW1@7MyQZ8g`oI^^m1MdyTn|_N9wwhd@H=}k z^dqNtHntkDtg2w+5R>5)!d6$=p9?Z9UV<5?OR!60haa4E@5w5|5N>`g3`}F}ERbR` z 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, sizeof( CK_SESSION_HANDLE ) ); - xResult = xFindObjectWithLabelAndClass( xSession, pkcs11testLABEL_DEVICE_PRIVATE_KEY_FOR_TLS, CKO_PRIVATE_KEY, &xPrivateKey ); + xResult = xFindObjectWithLabelAndClass( xSession, + pkcs11testLABEL_DEVICE_PRIVATE_KEY_FOR_TLS, + sizeof( pkcs11testLABEL_DEVICE_PRIVATE_KEY_FOR_TLS ) - 1, + CKO_PRIVATE_KEY, + &xPrivateKey ); if( ( xResult != CKR_OK ) || ( xPrivateKey == CK_INVALID_HANDLE ) ) { @@ -2317,7 +2400,11 @@ static void prvECGetAttributeValueMultiThreadTask( void * pvParameters ) configPRINTF( ( "Failed to find private key. Return Value: %d Handle: %d \r\n", xResult, xPrivateKey ) ); } - xResult = xFindObjectWithLabelAndClass( xSession, pkcs11testLABEL_DEVICE_CERTIFICATE_FOR_TLS, CKO_CERTIFICATE, &xCertificate ); + xResult = xFindObjectWithLabelAndClass( xSession, + pkcs11testLABEL_DEVICE_CERTIFICATE_FOR_TLS, + sizeof( pkcs11testLABEL_DEVICE_CERTIFICATE_FOR_TLS ) - 1, + CKO_CERTIFICATE, + &xCertificate ); if( ( xResult != CKR_OK ) || ( xCertificate == CK_INVALID_HANDLE ) ) { diff --git a/libraries/abstractions/pkcs11/test/iot_test_pkcs11_globals.h b/libraries/abstractions/pkcs11/test/iot_test_pkcs11_globals.h index 5727d230251..8ac4a04ef75 100644 --- a/libraries/abstractions/pkcs11/test/iot_test_pkcs11_globals.h +++ b/libraries/abstractions/pkcs11/test/iot_test_pkcs11_globals.h @@ -1,5 +1,5 @@ /* - * FreeRTOS PKCS #11 V2.1.1 + * FreeRTOS PKCS #11 V2.2.0 * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -51,6 +51,7 @@ void prvProvisionCredentialsWithKeyImport( CK_OBJECT_HANDLE_PTR pxPrivateKeyHand CK_OBJECT_HANDLE_PTR pxPublicKeyHandle ); void prvProvisionRsaTestCredentials( CK_OBJECT_HANDLE_PTR pxPrivateKeyHandle, + CK_OBJECT_HANDLE_PTR pxPublicKeyHandle, CK_OBJECT_HANDLE_PTR pxCertificateHandle ); void resetCredentials(); diff --git a/libraries/abstractions/posix/include/FreeRTOS_POSIX/time.h b/libraries/abstractions/posix/include/FreeRTOS_POSIX/time.h index 0cc1d686498..3cd42370884 100644 --- a/libraries/abstractions/posix/include/FreeRTOS_POSIX/time.h +++ b/libraries/abstractions/posix/include/FreeRTOS_POSIX/time.h @@ -70,6 +70,26 @@ #define TIMER_ABSTIME 0x01 /**@} */ +#if !defined( posixconfigENABLE_TM ) || ( posixconfigENABLE_TM == 1 ) + +/** + * @ingroup posix_datatypes_paramstructs + * @brief represents calendar time + */ + struct tm + { + int tm_sec; /**< Second. */ + int tm_min; /**< Minute. */ + int tm_hour; /**< Hour. */ + int tm_mday; /**< Day of month. */ + int tm_mon; /**< Month of year. */ + int tm_year; /**< Years since 1900. */ + int tm_wday; /**< Day of week. */ + int tm_yday; /**< Day of year. */ + int tm_isdst; /**< Daylight Savings flag. */ + }; +#endif /* if !defined( posixconfigENABLE_TM ) || ( posixconfigENABLE_TM == 1 ) */ + #if !defined( posixconfigENABLE_TIMESPEC ) || ( posixconfigENABLE_TIMESPEC == 1 ) /** diff --git a/libraries/abstractions/retry_utils/CMakeLists.txt b/libraries/abstractions/retry_utils/CMakeLists.txt deleted file mode 100644 index be3b14e8d68..00000000000 --- a/libraries/abstractions/retry_utils/CMakeLists.txt +++ /dev/null @@ -1,20 +0,0 @@ -afr_module(NAME retry_utils INTERNAL) - -afr_module_sources( - ${AFR_CURRENT_MODULE} - PRIVATE - "${CMAKE_CURRENT_LIST_DIR}/freertos/retry_utils_freertos.c" - "${CMAKE_CURRENT_LIST_DIR}/retry_utils.h" -) - -afr_module_dependencies( - ${AFR_CURRENT_MODULE} - PRIVATE - AFR::kernel -) - -afr_module_include_dirs( - ${AFR_CURRENT_MODULE} - PUBLIC - ${CMAKE_CURRENT_LIST_DIR} -) diff --git a/libraries/abstractions/retry_utils/freertos/retry_utils_freertos.c b/libraries/abstractions/retry_utils/freertos/retry_utils_freertos.c deleted file mode 100644 index 8598ca0215c..00000000000 --- a/libraries/abstractions/retry_utils/freertos/retry_utils_freertos.c +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/** - * @file retry_utils_freertos.c - * @brief Utility implementation of backoff logic, used for attempting retries of failed processes. - */ - -/* Standard includes. */ -#include -#include - -/* Kernel includes. */ -#include "FreeRTOS.h" -#include "task.h" - -/* Include header of retry library API. */ -#include "retry_utils.h" - -#define MILLISECONDS_PER_SECOND ( 1000U ) /**< @brief Milliseconds per second. */ - -/*-----------------------------------------------------------*/ - -/* @brief This is used by the pseudo random number generator. */ -static uint32_t ulNextRand; - -/** - * @brief A psuedo random generator function. - * - * @note This is not a secure method of generating a random number. - * Production devices should use a True Random Number Generator (TRNG). - * - * @return The generated random number. - */ -static uint32_t generateRandNum(); - -/** - * @brief Seeds the psuedo random number generator. - */ -static void initializeRand(); - -/*-----------------------------------------------------------*/ - -static uint32_t generateRandNum() -{ - const uint32_t ulMultiplier = 0x015a4e35UL, ulIncrement = 1UL; - - /* - * Utility function to generate a pseudo random number. - * - * !!!NOTE!!! - * This is not a secure method of generating a random number. Production - * devices should use a True Random Number Generator (TRNG). - */ - ulNextRand = ( ulMultiplier * ulNextRand ) + ulIncrement; - return( ( int ) ( ulNextRand >> 16UL ) & 0x7fffUL ); -} - -/*-----------------------------------------------------------*/ - -static void initializeRand() -{ - /* - * Seed random number generator. - * - * !!!NOTE!!! - * This is not a secure method of generating a random number. Production - * devices should use a True Random Number Generator (TRNG). - */ - ulNextRand = ( uint32_t ) xTaskGetTickCount(); -} - -/*-----------------------------------------------------------*/ - -RetryUtilsStatus_t RetryUtils_BackoffAndSleep( RetryUtilsParams_t * pRetryParams ) -{ - RetryUtilsStatus_t status = RetryUtilsRetriesExhausted; - int32_t backOffDelayMs = 0; - - /* If pRetryParams->maxRetryAttempts is set to 0, try forever. */ - if( ( pRetryParams->attemptsDone < pRetryParams->maxRetryAttempts ) || - ( 0 == pRetryParams->maxRetryAttempts ) ) - { - /* Choose a random value for back-off time between 0 and the max jitter value. */ - backOffDelayMs = ( generateRandNum() % pRetryParams->nextJitterMax ); - - /* Wait for backoff time to expire for the next retry. */ - vTaskDelay( pdMS_TO_TICKS( backOffDelayMs * MILLISECONDS_PER_SECOND ) ); - - /* Increment backoff counts. */ - pRetryParams->attemptsDone++; - - /* Double the max jitter value for the next retry attempt, only - * if the new value will be less than the max backoff time value. */ - if( pRetryParams->nextJitterMax < ( MAX_RETRY_BACKOFF_SECONDS / 2U ) ) - { - pRetryParams->nextJitterMax += pRetryParams->nextJitterMax; - } - else - { - pRetryParams->nextJitterMax = MAX_RETRY_BACKOFF_SECONDS; - } - - status = RetryUtilsSuccess; - } - else - { - /* When max retry attempts are exhausted, let application know by - * returning RetryUtilsRetriesExhausted. Application may choose to - * restart the retry process after calling RetryUtils_ParamsReset(). */ - status = RetryUtilsRetriesExhausted; - RetryUtils_ParamsReset( pRetryParams ); - } - - return status; -} - -/*-----------------------------------------------------------*/ - -void RetryUtils_ParamsReset( RetryUtilsParams_t * pRetryParams ) -{ - uint32_t jitter = 0; - - initializeRand(); - - /* Reset attempts done to zero so that the next retry cycle can start. */ - pRetryParams->attemptsDone = 0; - - /* Calculate jitter value using picking a random number. */ - jitter = ( generateRandNum() % MAX_JITTER_VALUE_SECONDS ); - - /* Reset the backoff value to the initial time out value plus jitter. */ - pRetryParams->nextJitterMax = INITIAL_RETRY_BACKOFF_SECONDS + jitter; -} - -/*-----------------------------------------------------------*/ diff --git a/libraries/abstractions/retry_utils/retry_utils.h b/libraries/abstractions/retry_utils/retry_utils.h deleted file mode 100644 index 57f328403d5..00000000000 --- a/libraries/abstractions/retry_utils/retry_utils.h +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/** - * @file retry_utils.h - * @brief Declaration of the exponential backoff retry logic utility functions - * and constants. - */ - -#ifndef RETRY_UTILS_H_ -#define RETRY_UTILS_H_ - -/* Standard include. */ -#include - -/** - * @page retryutils_page Retry Utilities - * @brief An abstraction of utilities for retrying with exponential back off and - * jitter. - * - * @section retryutils_overview Overview - * The retry utilities are a set of APIs that aid in retrying with exponential - * backoff and jitter. Exponential backoff with jitter is strongly recommended - * for retrying failed actions over the network with servers. Please see - * https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/ for - * more information about the benefits with AWS. - * - * Exponential backoff with jitter is typically used when retrying a failed - * connection to the server. In an environment with poor connectivity, a client - * can get disconnected at any time. A backoff strategy helps the client to - * conserve battery by not repeatedly attempting reconnections when they are - * unlikely to succeed. - * - * Before retrying the failed communication to the server there is a quiet period. - * In this quiet period, the task that is retrying must sleep for some random - * amount of seconds between 0 and the lesser of a base value and a predefined - * maximum. The base is doubled with each retry attempt until the maximum is - * reached.
- * - * > sleep_seconds = random_between( 0, min( 2attempts_count * base_seconds, maximum_seconds ) ) - * - * @section retryutils_implementation Implementing Retry Utils - * - * The functions that must be implemented are:
- * - @ref RetryUtils_ParamsReset - * - @ref RetryUtils_BackoffAndSleep - * - * The functions are used as shown in the diagram below. This is the exponential - * backoff with jitter loop: - * - * @image html retry_utils_flow.png width=25% - * - * The following steps give guidance on implementing the Retry Utils. An example - * implementation of the Retry Utils for a POSIX platform can be found in file - * @ref retry_utils_posix.c. - * - * -# Implementing @ref RetryUtils_ParamsReset - * @snippet this define_retryutils_paramsreset - *
- * This function initializes @ref RetryUtilsParams_t. It is expected to set - * @ref RetryUtilsParams_t.attemptsDone to zero. It is also expected to set - * @ref RetryUtilsParams_t.nextJitterMax to @ref INITIAL_RETRY_BACKOFF_SECONDS - * plus some random amount of seconds, jitter. This jitter is a random number - * between 0 and @ref MAX_JITTER_VALUE_SECONDS. This function must be called - * before entering the exponential backoff with jitter loop using - * @ref RetryUtils_BackoffAndSleep.

- * Please follow the example below to implement your own @ref RetryUtils_ParamsReset. - * The lines with FIXME comments should be updated. - * @code{c} - * void RetryUtils_ParamsReset( RetryUtilsParams_t * pRetryParams ) - * { - * uint32_t jitter = 0; - * - * // Reset attempts done to zero so that the next retry cycle can start. - * pRetryParams->attemptsDone = 0; - * - * // Seed pseudo random number generator with the current time. FIXME: Your - * // system may have another method to retrieve the current time to seed the - * // pseudo random number generator. - * srand( time( NULL ) ); - * - * // Calculate jitter value using picking a random number. - * jitter = ( rand() % MAX_JITTER_VALUE_SECONDS ); - * - * // Reset the backoff value to the initial time out value plus jitter. - * pRetryParams->nextJitterMax = INITIAL_RETRY_BACKOFF_SECONDS + jitter; - * } - * @endcode
- * - * -# Implementing @ref RetryUtils_BackoffAndSleep - * @snippet this define_retryutils_backoffandsleep - *
- * When this function is invoked, the calling task is expected to sleep a random - * number of seconds between 0 and @ref RetryUtilsParams_t.nextJitterMax. After - * sleeping this function must double @ref RetryUtilsParams_t.nextJitterMax, but - * not exceeding @ref MAX_RETRY_BACKOFF_SECONDS. When @ref RetryUtilsParams_t.maxRetryAttempts - * are reached this function should return @ref RetryUtilsRetriesExhausted, unless - * @ref RetryUtilsParams_t.maxRetryAttempts is set to zero. - * When @ref RetryUtilsRetriesExhausted is returned the calling application can - * stop trying with a failure, or it can call @ref RetryUtils_ParamsReset again - * and restart the exponential back off with jitter loop.

- * Please follow the example below to implement your own @ref RetryUtils_BackoffAndSleep. - * The lines with FIXME comments should be updated. - * @code{c} - * RetryUtilsStatus_t RetryUtils_BackoffAndSleep( RetryUtilsParams_t * pRetryParams ) - * { - * RetryUtilsStatus_t status = RetryUtilsRetriesExhausted; - * // The quiet period delay in seconds. - * int backOffDelay = 0; - * - * // If pRetryParams->maxRetryAttempts is set to 0, try forever. - * if( ( pRetryParams->attemptsDone < pRetryParams->maxRetryAttempts ) || - * ( 0 == pRetryParams->maxRetryAttempts ) ) - * { - * // Choose a random value for back-off time between 0 and the max jitter value. - * backOffDelay = rand() % pRetryParams->nextJitterMax; - * - * // Wait for backoff time to expire for the next retry. - * ( void ) myThreadSleepFunction( backOffDelay ); // FIXME: Replace with your system's thread sleep function. - * - * // Increment backoff counts. - * pRetryParams->attemptsDone++; - * - * // Double the max jitter value for the next retry attempt, only - * // if the new value will be less than the max backoff time value. - * if( pRetryParams->nextJitterMax < ( MAX_RETRY_BACKOFF_SECONDS / 2U ) ) - * { - * pRetryParams->nextJitterMax += pRetryParams->nextJitterMax; - * } - * else - * { - * pRetryParams->nextJitterMax = MAX_RETRY_BACKOFF_SECONDS; - * } - * - * status = RetryUtilsSuccess; - * } - * else - * { - * // When max retry attempts are exhausted, let application know by - * // returning RetryUtilsRetriesExhausted. Application may choose to - * // restart the retry process after calling RetryUtils_ParamsReset(). - * status = RetryUtilsRetriesExhausted; - * RetryUtils_ParamsReset( pRetryParams ); - * } - * - * return status; - * } - * @endcode - */ - -/** - * @brief Max number of retry attempts. Set this value to 0 if the client must - * retry forever. - */ -#define MAX_RETRY_ATTEMPTS 4U - -/** - * @brief Initial fixed backoff value in seconds between two successive - * retries. A random jitter value is added to every backoff value. - */ -#define INITIAL_RETRY_BACKOFF_SECONDS 1U - -/** - * @brief Max backoff value in seconds. - */ -#define MAX_RETRY_BACKOFF_SECONDS 128U - -/** - * @brief Max jitter value in seconds. - */ -#define MAX_JITTER_VALUE_SECONDS 5U - -/** - * @brief Status for @ref RetryUtils_BackoffAndSleep. - */ -typedef enum RetryUtilsStatus -{ - RetryUtilsSuccess = 0, /**< @brief The function returned successfully after sleeping. */ - RetryUtilsRetriesExhausted /**< @brief The function exhausted all retry attempts. */ -} RetryUtilsStatus_t; - -/** - * @brief Represents parameters required for retry logic. - */ -typedef struct RetryUtilsParams -{ - /** - * @brief Max number of retry attempts. Set this value to 0 if the client must - * retry forever. - */ - uint32_t maxRetryAttempts; - - /** - * @brief The cumulative count of backoff delay cycles completed - * for retries. - */ - uint32_t attemptsDone; - - /** - * @brief The max jitter value for backoff time in retry attempt. - */ - uint32_t nextJitterMax; -} RetryUtilsParams_t; - - -/** - * @brief Resets the retry timeout value and number of attempts. - * This function must be called by the application before a new retry attempt. - * - * @param[in, out] pRetryParams Structure containing attempts done and timeout - * value. - */ -void RetryUtils_ParamsReset( RetryUtilsParams_t * pRetryParams ); - -/** - * @brief Simple platform specific exponential backoff function. The application - * must use this function between retry failures to add exponential delay. - * This function will block the calling task for the current timeout value. - * - * @param[in, out] pRetryParams Structure containing retry parameters. - * - * @return #RetryUtilsSuccess after a successful sleep, #RetryUtilsRetriesExhausted - * when all attempts are exhausted. - */ -RetryUtilsStatus_t RetryUtils_BackoffAndSleep( RetryUtilsParams_t * pRetryParams ); - -#endif /* ifndef RETRY_UTILS_H_ */ diff --git a/libraries/abstractions/transport/secure_sockets/transport_secure_sockets.c b/libraries/abstractions/transport/secure_sockets/transport_secure_sockets.c index 6acb449e9c8..705c7687b75 100755 --- a/libraries/abstractions/transport/secure_sockets/transport_secure_sockets.c +++ b/libraries/abstractions/transport/secure_sockets/transport_secure_sockets.c @@ -1,5 +1,5 @@ /* - * FreeRTOS V202002.00 + * FreeRTOS Transport Secure Sockets V1.0.0 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/abstractions/transport/secure_sockets/transport_secure_sockets.h b/libraries/abstractions/transport/secure_sockets/transport_secure_sockets.h index bd4b3a8dcfc..a6c9d1fd5b8 100755 --- a/libraries/abstractions/transport/secure_sockets/transport_secure_sockets.h +++ b/libraries/abstractions/transport/secure_sockets/transport_secure_sockets.h @@ -1,4 +1,5 @@ /* + * FreeRTOS Transport Secure Sockets V1.0.0 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/abstractions/transport/transport_interface_secure_sockets.cmake b/libraries/abstractions/transport/transport_interface_secure_sockets.cmake index ee311c93b24..2b7177f8fbd 100644 --- a/libraries/abstractions/transport/transport_interface_secure_sockets.cmake +++ b/libraries/abstractions/transport/transport_interface_secure_sockets.cmake @@ -11,15 +11,17 @@ set(src_dir "${CMAKE_CURRENT_LIST_DIR}/secure_sockets") # Include filepaths for source and include. include( ${CMAKE_CURRENT_LIST_DIR}/transport_interface.cmake ) +# Add cmake files of module to metadata. +afr_module_cmake_files(${AFR_CURRENT_MODULE} + ${CMAKE_CURRENT_LIST_DIR}/transport_interface.cmake + ${CMAKE_CURRENT_LIST_DIR}/transport_interface_secure_sockets.cmake +) + afr_module_sources( ${AFR_CURRENT_MODULE} PRIVATE "${src_dir}/transport_secure_sockets.h" "${src_dir}/transport_secure_sockets.c" - # Following files are added to the source list to generate their - # metadata so that are part of code downloaded from FreeRTOS console. - "${CMAKE_CURRENT_LIST_DIR}/transport_interface.cmake" - "${CMAKE_CURRENT_LIST_DIR}/transport_interface_secure_sockets.cmake" ) afr_module_dependencies( diff --git a/libraries/c_sdk/aws/defender/CMakeLists.txt b/libraries/c_sdk/aws/defender/CMakeLists.txt index 5d4c40e9866..d1d786217ff 100644 --- a/libraries/c_sdk/aws/defender/CMakeLists.txt +++ b/libraries/c_sdk/aws/defender/CMakeLists.txt @@ -1,12 +1,5 @@ afr_module() -afr_set_lib_metadata(ID "defender") -afr_set_lib_metadata(DESCRIPTION "This library enables metrics reporting with AWS IoT Device Defender.") -afr_set_lib_metadata(DISPLAY_NAME "Device Defender") -afr_set_lib_metadata(CATEGORY "Amazon Services") -afr_set_lib_metadata(VERSION "1.0.0") -afr_set_lib_metadata(IS_VISIBLE "true") - set(src_dir "${CMAKE_CURRENT_LIST_DIR}/src") set(inc_dir "${CMAKE_CURRENT_LIST_DIR}/include") set(test_dir "${CMAKE_CURRENT_LIST_DIR}/test") diff --git a/libraries/c_sdk/aws/defender/include/aws_defender.h b/libraries/c_sdk/aws/defender/include/aws_defender.h index cfaa6c3b975..e11e3c8fc01 100644 --- a/libraries/c_sdk/aws/defender/include/aws_defender.h +++ b/libraries/c_sdk/aws/defender/include/aws_defender.h @@ -1,5 +1,5 @@ /* - * FreeRTOS Defender V3.0.2 + * FreeRTOS Defender V3.0.3 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/aws/defender/include/aws_iot_defender.h b/libraries/c_sdk/aws/defender/include/aws_iot_defender.h index ce430f9c321..bf732b3e8aa 100644 --- a/libraries/c_sdk/aws/defender/include/aws_iot_defender.h +++ b/libraries/c_sdk/aws/defender/include/aws_iot_defender.h @@ -1,5 +1,5 @@ /* - * FreeRTOS Defender V3.0.2 + * FreeRTOS Defender V3.0.3 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/aws/defender/src/aws_iot_defender_api.c b/libraries/c_sdk/aws/defender/src/aws_iot_defender_api.c index 177b1451e80..d96f62afbe8 100644 --- a/libraries/c_sdk/aws/defender/src/aws_iot_defender_api.c +++ b/libraries/c_sdk/aws/defender/src/aws_iot_defender_api.c @@ -1,5 +1,5 @@ /* - * FreeRTOS Defender V3.0.2 + * FreeRTOS Defender V3.0.3 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/aws/defender/src/aws_iot_defender_collector.c b/libraries/c_sdk/aws/defender/src/aws_iot_defender_collector.c index 82f877facc9..2f3d1dc8350 100644 --- a/libraries/c_sdk/aws/defender/src/aws_iot_defender_collector.c +++ b/libraries/c_sdk/aws/defender/src/aws_iot_defender_collector.c @@ -1,5 +1,5 @@ /* - * FreeRTOS Defender V3.0.2 + * FreeRTOS Defender V3.0.3 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/aws/defender/src/aws_iot_defender_mqtt.c b/libraries/c_sdk/aws/defender/src/aws_iot_defender_mqtt.c index de468849097..65f1bdde5a7 100644 --- a/libraries/c_sdk/aws/defender/src/aws_iot_defender_mqtt.c +++ b/libraries/c_sdk/aws/defender/src/aws_iot_defender_mqtt.c @@ -1,5 +1,5 @@ /* - * FreeRTOS Defender V3.0.2 + * FreeRTOS Defender V3.0.3 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/aws/defender/src/aws_iot_defender_v1.c b/libraries/c_sdk/aws/defender/src/aws_iot_defender_v1.c index bc3f89e78a1..b4689825d34 100644 --- a/libraries/c_sdk/aws/defender/src/aws_iot_defender_v1.c +++ b/libraries/c_sdk/aws/defender/src/aws_iot_defender_v1.c @@ -1,5 +1,5 @@ /* - * FreeRTOS Defender V3.0.2 + * FreeRTOS Defender V3.0.3 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/aws/defender/src/private/aws_iot_defender_internal.h b/libraries/c_sdk/aws/defender/src/private/aws_iot_defender_internal.h index a15891d116e..49cbe80a1af 100644 --- a/libraries/c_sdk/aws/defender/src/private/aws_iot_defender_internal.h +++ b/libraries/c_sdk/aws/defender/src/private/aws_iot_defender_internal.h @@ -1,5 +1,5 @@ /* - * FreeRTOS Defender V3.0.2 + * FreeRTOS Defender V3.0.3 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/aws/defender/test/system/aws_iot_tests_defender_system.c b/libraries/c_sdk/aws/defender/test/system/aws_iot_tests_defender_system.c index b590fbac27b..d337735ffad 100644 --- a/libraries/c_sdk/aws/defender/test/system/aws_iot_tests_defender_system.c +++ b/libraries/c_sdk/aws/defender/test/system/aws_iot_tests_defender_system.c @@ -1,5 +1,5 @@ /* - * FreeRTOS Defender V3.0.2 + * FreeRTOS Defender V3.0.3 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/aws/defender/test/unit/aws_iot_tests_defender_unit.c b/libraries/c_sdk/aws/defender/test/unit/aws_iot_tests_defender_unit.c index 6ad641a1dbe..31e2e9b3c41 100644 --- a/libraries/c_sdk/aws/defender/test/unit/aws_iot_tests_defender_unit.c +++ b/libraries/c_sdk/aws/defender/test/unit/aws_iot_tests_defender_unit.c @@ -1,5 +1,5 @@ /* - * FreeRTOS Defender V3.0.2 + * FreeRTOS Defender V3.0.3 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/ble/include/iot_ble_mqtt_serialize.h b/libraries/c_sdk/standard/ble/include/iot_ble_mqtt_serialize.h index 03843bbde66..19fda6f3ecc 100644 --- a/libraries/c_sdk/standard/ble/include/iot_ble_mqtt_serialize.h +++ b/libraries/c_sdk/standard/ble/include/iot_ble_mqtt_serialize.h @@ -233,6 +233,11 @@ typedef struct MQTTBLEPublishInfo * @brief Pending flag for continuation of publish packet. */ bool pending; + + /** + * @brief Packet Identifier for QoS1, QoS2 publish packet. + */ + uint16_t packetIdentifier; } MQTTBLEPublishInfo_t; /** @} */ diff --git a/libraries/c_sdk/standard/ble/src/services/mqtt_ble/iot_ble_mqtt_transport.c b/libraries/c_sdk/standard/ble/src/services/mqtt_ble/iot_ble_mqtt_transport.c index e15aa165f88..5b7fd1bda92 100644 --- a/libraries/c_sdk/standard/ble/src/services/mqtt_ble/iot_ble_mqtt_transport.c +++ b/libraries/c_sdk/standard/ble/src/services/mqtt_ble/iot_ble_mqtt_transport.c @@ -685,7 +685,6 @@ static MQTTBLEStatus_t handleOutgoingPublish( MQTTBLEPublishInfo_t * pPublishInf size_t * pSerializedBufLength ) { MQTTBLEStatus_t status = MQTTBLESuccess; - uint16_t packetIdentifier; LogDebug( ( "Processing outgoing PUBLISH." ) ); @@ -697,12 +696,20 @@ static MQTTBLEStatus_t handleOutgoingPublish( MQTTBLEPublishInfo_t * pPublishInf } else { - pPublishInfo->pending = parsePublish( buf, bytesToSend, pPublishInfo, &packetIdentifier ); + pPublishInfo->pending = parsePublish( buf, + bytesToSend, + pPublishInfo, + &pPublishInfo->packetIdentifier ); } + LogDebug( ( "IotBleMqtt_SerializePublish before if" ) ); + if( pPublishInfo->pending == false ) { - status = IotBleMqtt_SerializePublish( pPublishInfo, pSerializedBuf, pSerializedBufLength, packetIdentifier ); + status = IotBleMqtt_SerializePublish( pPublishInfo, + pSerializedBuf, + pSerializedBufLength, + pPublishInfo->packetIdentifier ); if( pPublishInfo->pTopicName != NULL ) { @@ -735,7 +742,9 @@ static MQTTBLEStatus_t handleOutgoingPuback( const void * buf, packetIdentifier = UINT16_DECODE( &buffer[ 2 ] ); - status = IotBleMqtt_SerializePuback( packetIdentifier, pSerializedBuf, pSerializedBufLength ); + status = IotBleMqtt_SerializePuback( packetIdentifier, + pSerializedBuf, + pSerializedBufLength ); return status; } @@ -911,7 +920,10 @@ static MQTTBLEStatus_t handleIncomingSuback( StreamBufferHandle_t streamBuffer, buffer[ 3 ] = ( uint8_t ) ( packetIdentifier & 0x00FFU ); buffer[ 4 ] = statusCode; - ( void ) xStreamBufferSend( streamBuffer, buffer, SIZE_OF_SUB_ACK, pdMS_TO_TICKS( RECV_TIMEOUT_MS ) ); + ( void ) xStreamBufferSend( streamBuffer, + buffer, + SIZE_OF_SUB_ACK, + pdMS_TO_TICKS( RECV_TIMEOUT_MS ) ); } return status; @@ -987,14 +999,18 @@ int32_t IotBleMqttTransportSend( NetworkContext_t * pContext, /* The send function returns the CBOR bytes written, so need to return 0 or full amount of bytes sent. */ int32_t bytesWritten = ( int32_t ) bytesToWrite; - /* * The payload of publish can be send as a separate packet from the header. The flag is used to check for pending publish * payload information and process the payload part of the publish. */ + if( pContext->publishInfo.pending == true ) { - status = handleOutgoingPublish( ( MQTTBLEPublishInfo_t * ) &pContext->publishInfo, pBuffer, bytesToWrite, &pSerializedPacket, &serializedLength ); + status = handleOutgoingPublish( ( MQTTBLEPublishInfo_t * ) &pContext->publishInfo, + pBuffer, + bytesToWrite, + &pSerializedPacket, + &serializedLength ); } else { @@ -1005,31 +1021,45 @@ int32_t IotBleMqttTransportSend( NetworkContext_t * pContext, switch( packetType ) { case IOT_BLE_MQTT_MSG_TYPE_CONNECT: - status = handleOutgoingConnect( pBuffer, &pSerializedPacket, &serializedLength ); + status = handleOutgoingConnect( pBuffer, + &pSerializedPacket, + &serializedLength ); break; case IOT_BLE_MQTT_MSG_TYPE_PUBLISH: - status = handleOutgoingPublish( ( MQTTBLEPublishInfo_t * ) &pContext->publishInfo, pBuffer, bytesToWrite, &pSerializedPacket, &serializedLength ); + status = handleOutgoingPublish( ( MQTTBLEPublishInfo_t * ) &pContext->publishInfo, + pBuffer, + bytesToWrite, + &pSerializedPacket, + &serializedLength ); break; case IOT_BLE_MQTT_MSG_TYPE_PUBACK: - status = handleOutgoingPuback( pBuffer, &pSerializedPacket, &serializedLength ); + status = handleOutgoingPuback( pBuffer, + &pSerializedPacket, + &serializedLength ); break; case IOT_BLE_MQTT_MSG_TYPE_SUBSCRIBE: - status = handleOutgoingSubscribe( pBuffer, &pSerializedPacket, &serializedLength ); + status = handleOutgoingSubscribe( pBuffer, + &pSerializedPacket, + &serializedLength ); break; case IOT_BLE_MQTT_MSG_TYPE_UNSUBSCRIBE: - status = handleOutgoingUnsubscribe( pBuffer, &pSerializedPacket, &serializedLength ); + status = handleOutgoingUnsubscribe( pBuffer, + &pSerializedPacket, + &serializedLength ); break; case IOT_BLE_MQTT_MSG_TYPE_PINGREQ: - status = handleOutgoingPingReq( &pSerializedPacket, &serializedLength ); + status = handleOutgoingPingReq( &pSerializedPacket, + &serializedLength ); break; case IOT_BLE_MQTT_MSG_TYPE_DISCONNECT: - status = handleOutgoingDisconnect( &pSerializedPacket, &serializedLength ); + status = handleOutgoingDisconnect( &pSerializedPacket, + &serializedLength ); break; /* QoS 2 cases, currently not supported by BLE */ @@ -1053,16 +1083,20 @@ int32_t IotBleMqttTransportSend( NetworkContext_t * pContext, { if( serializedLength > 0 ) { - bytesSent = IotBleDataTransfer_Send( pContext->pChannel, pSerializedPacket, serializedLength ); + bytesSent = IotBleDataTransfer_Send( pContext->pChannel, + pSerializedPacket, + serializedLength ); if( bytesSent != serializedLength ) { - LogError( ( "Cannot send %lu bytes through BLE channel, sent %lu bytes.", serializedLength, bytesSent ) ); + LogError( ( "Cannot send %lu bytes through BLE channel, sent %lu bytes.", + serializedLength, bytesSent ) ); bytesWritten = 0; } else { - LogDebug( ( "Successfully sent %lu bytes through BLE channel.", serializedLength ) ); + LogDebug( ( "Successfully sent %d bytes through BLE channel.", + serializedLength ) ); } IotMqtt_FreeMessage( pSerializedPacket ); @@ -1084,14 +1118,14 @@ MQTTBLEStatus_t IotBleMqttTransportAcceptData( const NetworkContext_t * pContext uint8_t * pPacket; size_t packetLength; - IotBleDataTransfer_PeekReceiveBuffer( pContext->pChannel, ( const uint8_t ** ) &pPacket, &packetLength ); + configASSERT( pContext != NULL ); + IotBleDataTransfer_PeekReceiveBuffer( pContext->pChannel, + ( const uint8_t ** ) &pPacket, + &packetLength ); packetType = IotBleMqtt_GetPacketType( pPacket, packetLength ); - - LogDebug( ( "Receiving a packet from the server." ) ); - switch( packetType ) { case IOT_BLE_MQTT_MSG_TYPE_CONNACK: diff --git a/libraries/c_sdk/standard/ble/test/iot_mqtt_ble_system_test.c b/libraries/c_sdk/standard/ble/test/iot_mqtt_ble_system_test.c index ee95436807d..312bba6487e 100644 --- a/libraries/c_sdk/standard/ble/test/iot_mqtt_ble_system_test.c +++ b/libraries/c_sdk/standard/ble/test/iot_mqtt_ble_system_test.c @@ -314,6 +314,11 @@ static SemaphoreHandle_t bleChannelSem; */ static uint32_t getTimeMs(); +/** + * @brief Global variable to keep track of BLE status and enable only once. + */ +static BaseType_t bleEnabled = pdFALSE; + /** * @brief Sends an MQTT CONNECT packet over connected BLE Channel. * @@ -809,6 +814,12 @@ static void testSetUp() packetTypeForDisconnection = MQTT_PACKET_TYPE_INVALID; memset( &incomingInfo, 0u, sizeof( MQTTPublishInfo_t ) ); + if( bleEnabled == pdFALSE ) + { + bleEnable(); + bleEnabled = pdTRUE; + } + /* setup BLE transport interface. */ setupBleTransportInterface( &networkContext ); @@ -852,15 +863,15 @@ TEST_TEAR_DOWN( coreMQTT_Integration_BLE ) */ TEST_GROUP_RUNNER( coreMQTT_Integration_BLE ) { - /* Enable BLE middleware and GATT services only once for all tests in the group. */ - bleEnable(); - RUN_TEST_CASE( coreMQTT_Integration_BLE, Subscribe_Publish_With_Qos_0 ); RUN_TEST_CASE( coreMQTT_Integration_BLE, Subscribe_Publish_With_Qos_1 ); RUN_TEST_CASE( coreMQTT_Integration_BLE, ProcessLoop_KeepAlive ); /* Disconnect and turn off BLE after all tests in the group. */ - bleDisable(); + if( bleEnabled == pdTRUE ) + { + bleDisable(); + } } /* ========================== Test Cases ============================ */ diff --git a/libraries/c_sdk/standard/ble/test/iot_test_ble_mqtt_serialize.c b/libraries/c_sdk/standard/ble/test/iot_test_ble_mqtt_serialize.c index 419e82c9e3a..d505117ad34 100644 --- a/libraries/c_sdk/standard/ble/test/iot_test_ble_mqtt_serialize.c +++ b/libraries/c_sdk/standard/ble/test/iot_test_ble_mqtt_serialize.c @@ -653,9 +653,9 @@ static void prvCreatePUBLISHPacket( uint8_t * pBuffer, TEST( BLE_Unit_MQTT_Serialize, DeserializePUBLISH ) { MQTTBLEStatus_t status; - uint8_t buffer[ TEST_MESG_LEN ]; + uint8_t buffer[ TEST_MESG_LEN ] = { 0 }; size_t length = TEST_MESG_LEN; - MQTTBLEPublishInfo_t publishInfo; + MQTTBLEPublishInfo_t publishInfo = { 0 }; uint16_t packetIdentifier; @@ -761,7 +761,7 @@ TEST( BLE_Unit_MQTT_Serialize, DeserializePUBLISH_QOS0 ) MQTTBLEStatus_t status = MQTTBLESuccess; uint8_t buffer[ TEST_MESG_LEN ] = { 0 }; size_t length = TEST_MESG_LEN; - MQTTBLEPublishInfo_t publishInfo; + MQTTBLEPublishInfo_t publishInfo = { 0 }; uint16_t packetIdentifier; @@ -840,7 +840,7 @@ static void prvCreateSUBACKPacket( uint8_t * pBuffer, TEST( BLE_Unit_MQTT_Serialize, DeserializeSUBACK ) { MQTTBLEStatus_t status; - uint8_t buffer[ TEST_MESG_LEN ]; + uint8_t buffer[ TEST_MESG_LEN ] = { 0 }; size_t length = TEST_MESG_LEN; uint16_t packetIdentifier; uint8_t statusCode; @@ -853,6 +853,7 @@ TEST( BLE_Unit_MQTT_Serialize, DeserializeSUBACK ) TEST_ASSERT_EQUAL( TEST_QOS1, statusCode ); /** Malformed message **/ + memset( buffer, 0x00, TEST_MESG_LEN ); length = TEST_MESG_LEN; prvCreateSUBACKPacket( buffer, &length, TEST_QOS1, TEST_PACKET_IDENTIFIER, 2 ); buffer[ 0 ] = 0x00; diff --git a/libraries/c_sdk/standard/ble/utest/ble_mqtt_transport/CMakeLists.txt b/libraries/c_sdk/standard/ble/utest/ble_mqtt_transport/CMakeLists.txt index b2442a2b430..7afc1bc2ef8 100644 --- a/libraries/c_sdk/standard/ble/utest/ble_mqtt_transport/CMakeLists.txt +++ b/libraries/c_sdk/standard/ble/utest/ble_mqtt_transport/CMakeLists.txt @@ -65,7 +65,6 @@ "${AFR_ROOT_DIR}/freertos_kernel/include/" "${AFR_ROOT_DIR}/libraries/c_sdk/standard/common/include" "${AFR_ROOT_DIR}/libraries/coreMQTT/source/include" - "${AFR_ROOT_DIR}/libraries/coreMQTT/source/interface" "${AFR_ROOT_DIR}/tests/unit_test/linux/logging-stack" "${CMAKE_CURRENT_BINARY_DIR}/mocks" ${abstraction_dir}/ble_hal/include diff --git a/libraries/c_sdk/standard/https/CMakeLists.txt b/libraries/c_sdk/standard/https/CMakeLists.txt index c54113b7d1e..6496ca153e8 100644 --- a/libraries/c_sdk/standard/https/CMakeLists.txt +++ b/libraries/c_sdk/standard/https/CMakeLists.txt @@ -1,12 +1,5 @@ afr_module() -afr_set_lib_metadata(ID "https") -afr_set_lib_metadata(DESCRIPTION "This library implements the HTTPS client side protocol.") -afr_set_lib_metadata(DISPLAY_NAME "HTTPS Client") -afr_set_lib_metadata(CATEGORY "Connectivity") -afr_set_lib_metadata(VERSION "1.0.0") -afr_set_lib_metadata(IS_VISIBLE "true") - set(src_dir "${CMAKE_CURRENT_LIST_DIR}/src") set(inc_dir "${CMAKE_CURRENT_LIST_DIR}/include") set(test_dir "${CMAKE_CURRENT_LIST_DIR}/test") @@ -36,8 +29,13 @@ afr_module_dependencies( ${AFR_CURRENT_MODULE} PUBLIC AFR::common - PRIVATE - 3rdparty::http_parser + AFR::core_http + # This dependency is required for auto-including + # coreHTTP library on FreeRTOS console when a library + # depends on AFR::https. + # AFR::core_http_demo_dependencies is the visible library + # target on FreeRTOS console. + AFR::core_http_demo_dependencies ) # HTTPS Client test @@ -63,5 +61,4 @@ afr_module_dependencies( ${AFR_CURRENT_MODULE} INTERFACE AFR::https - 3rdparty::http_parser ) diff --git a/libraries/c_sdk/standard/https/CODESIZE.md b/libraries/c_sdk/standard/https/CODESIZE.md new file mode 100644 index 00000000000..67206ff24b0 --- /dev/null +++ b/libraries/c_sdk/standard/https/CODESIZE.md @@ -0,0 +1,24 @@ +# Code size of HTTPS Compatibility Layer + +Code size for the HTTPS Compatibility Layer is calculated using GCC for ARM Cortex-M4 on [FreeRTOS 202012.00 release](https://github.com/aws/amazon-freertos/releases/tag/202012.00). Build for calculating code size is done using build configuration for [Cypress CY8CKIT-064S0S2-4343W](https://docs.aws.amazon.com/freertos/latest/userguide/getting_started_cypress_psoc64.html) by using the Release configuration. All logs were disabled in this build. Refer to the table below for calculated code sizes. + +| File | With -O1 Optimization | With -Os Optimization | +| :-: | :-: | :-: | +| iot_https_client.c | 21.0K | 19.6K | +| iot_https_utils.c | 0.5K | 0.5K | +| **Total estimate** | **21.5K** | **21.1K** | + +The HTTPS Compatibility Layer is implemented using the [coreHTTP library](https://github.com/FreeRTOS/coreHTTP/blob/master/README.md). In addition, the HTTPS Compatibility Layer maintains the dependency of the network abstraction and linear containers from the HTTP V1.x.x library. The task pool dependency is removed in order to allow statically-allocated tasks. To account for the total code size of the HTTPS Compatibility Layer, code sizes for all dependencies have been considered (see below). + +1. **The coreHTTP library** : The HTTPS Compatibility Layer is implemented using [coreHTTP library](https://github.com/FreeRTOS/coreHTTP/blob/master/README.md). Memory estimates for [coreHTTP library](https://github.com/FreeRTOS/coreHTTP/blob/master/README.md) can be found in the documentation [here](https://freertos.org/mqtt/index.html). + +2. **Platform Abstraction** : This HTTPS Compatibility Layer depends on the platform-specific implementation of network abstraction. The code size is calculated for the [FreeRTOS implementation of Abstraction Layer](../../../abstractions/platform/freertos) and is added in the table below. + +| File | With -O1 Optimization | With -Os Optimization | +| :-: | :-: | :-: | +| iot_network_freertos.c | 1.2K | 1.1K | +| **Total estimate** | **1.2K** | **1.1K** | + +Note that the implementation for network abstraction may not be exclusively used by the HTTPS Compatibility Layer, but may be shared by other libraries. However, this network abstraction is not used by any of the [redesigned libraries for LTS](https://www.freertos.org/ltsroadmap.html). + +3. **Linear Containers** : This HTTPS Compatibility Layer depends on [Linear Containers](https://docs.aws.amazon.com/freertos/latest/lib-ref/embedded-csdk/v4.0_beta_deprecated/lib-ref/c-sdk/linear_containers/index.html). However, this implementation can be found in a [c header file](../common/include/iot_linear_containers.h), and its code sizes are already accounted for in the calculated sizes of this HTTPS Compatibility Layer. diff --git a/libraries/c_sdk/standard/https/README.md b/libraries/c_sdk/standard/https/README.md new file mode 100644 index 00000000000..f1ad1cc9e33 --- /dev/null +++ b/libraries/c_sdk/standard/https/README.md @@ -0,0 +1,30 @@ +# HTTPS Compatibility Layer + +HTTPS Compatibility Layer provides backward compatibility from [coreHTTP library](https://github.com/FreeRTOS/coreHTTP/blob/master/README.md) to [HTTP V1.x.x APIs](include/iot_https_client.h). **We recommend that you use the coreHTTP library for optimized memory usage and modularity, but you can use the HTTPS Compatibility Layer when you do not have the flexibility.** + + +## Configs for HTTPS Compatibility Layer + +Configuration settings for the HTTPS Compatibility Layer, are available in addition to the [configurations of HTTPS V1.x.x library](https://docs.aws.amazon.com/freertos/latest/lib-ref/html2/https/https_config.html). + +Configuration settings are C pre-processor constants. They can be set with a #define in the config file (iot_config.h) or by using a compiler option such as -D in gcc. If a configuration setting is not defined, the HTTPS Compatibility Layer will use a "sensible" default value (unless otherwise noted). Because they are compile-time constants, this HTTPS Compatibility Layer must be rebuilt if a configuration setting is changed. + +1. `IOT_HTTPS_DISPATCH_QUEUE_SIZE` - The number of requests in the queue that are ready to be sent to the HTTP server. +2. `IOT_HTTPS_DISPATCH_TASK_COUNT` - The number of tasks that are responsible for sending requests from the dispatch queue. +3. `IOT_HTTPS_DISPATCH_TASK_STACK_SIZE` - The stack size of each dispatch task, sized appropriately for each board. +4. `IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY` - If set to 1, the memory used by the dispatch task will be allocated statically by the library. Otherwise, memory will be allocated on the heap. +5. `IOT_HTTPS_DISPATCH_TASK_PRIORITY` - The priority of each dispatch task. This priority is deliberately chosen to match the original taskpool's priority. Doing so prevents starvation of the network-receive task and tasks potentially used by other libraries. + + +## Code size of HTTPS Compatibility Layer + +Code sizes are calculated for the HTTPS Compatibility Layer on [FreeRTOS 202011.00 release](https://github.com/aws/amazon-freertos/releases/tag/202011.00). In order to calculate the total cost to memory of the HTTPS Compatibility Layer, the code sizes of its dependencies are also included. HTTPS Compatibility Layer and its dependencies have a code size of **30.4KB** with `-Os` compiler optimization. +Please be aware that, this code size is about **22.2KB** higher than the [code size](https://docs.aws.amazon.com/embedded-csdk/202011.00/lib-ref/libraries/standard/coreHTTP/docs/doxygen/output/html/index.html) required by the [coreHTTP library](https://github.com/FreeRTOS/coreHTTP/blob/master/README.md). + +**Note** Refer to the [CODESIZE.md](CODESIZE.md) for more details about the calculation of code sizes for the HTTPS Compatibility Layer and the [coreHTTP FreeRTOS documentation](https://freertos.org/http/index.html) for coreHTTP library. + + +## Tasks required for HTTPS Compatibility Layer + +The HTTPS Compatibility Layer has a run time dependency on tasks created by each dispatch task and Network Abstraction implementation, in addition to the system tasks. The Network Abstraction implementation creates a task to receive from the network. + diff --git a/libraries/c_sdk/standard/https/include/iot_https_client.h b/libraries/c_sdk/standard/https/include/iot_https_client.h index aefb4a4d5f4..486e0e5c181 100644 --- a/libraries/c_sdk/standard/https/include/iot_https_client.h +++ b/libraries/c_sdk/standard/https/include/iot_https_client.h @@ -1,5 +1,5 @@ /* - * FreeRTOS HTTPS Client V1.1.3 + * FreeRTOS HTTPS Client V1.2.0 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/https/include/iot_https_utils.h b/libraries/c_sdk/standard/https/include/iot_https_utils.h index 2ab614c36f3..638121b73b8 100644 --- a/libraries/c_sdk/standard/https/include/iot_https_utils.h +++ b/libraries/c_sdk/standard/https/include/iot_https_utils.h @@ -1,5 +1,5 @@ /* - * FreeRTOS HTTPS Client V1.1.3 + * FreeRTOS HTTPS Client V1.2.0 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/https/include/types/iot_https_types.h b/libraries/c_sdk/standard/https/include/types/iot_https_types.h index 9b1e70c0585..3fbba57e038 100644 --- a/libraries/c_sdk/standard/https/include/types/iot_https_types.h +++ b/libraries/c_sdk/standard/https/include/types/iot_https_types.h @@ -1,5 +1,5 @@ /* - * FreeRTOS HTTPS Client V1.1.3 + * FreeRTOS HTTPS Client V1.2.0 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/https/src/iot_https_client.c b/libraries/c_sdk/standard/https/src/iot_https_client.c index c8eff83cecd..2891c1a68cf 100644 --- a/libraries/c_sdk/standard/https/src/iot_https_client.c +++ b/libraries/c_sdk/standard/https/src/iot_https_client.c @@ -1,5 +1,5 @@ /* - * FreeRTOS HTTPS Client V1.1.3 + * FreeRTOS HTTPS Client V1.2.0 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -43,7 +43,7 @@ * The minimum path is "/" because we cannot know how long the application requested path is is going to be. * CONNECT is the longest string length HTTP method according to RFC 2616. */ -#define HTTPS_PARTIAL_REQUEST_LINE HTTPS_CONNECT_METHOD " " HTTPS_EMPTY_PATH " " HTTPS_PROTOCOL_VERSION +#define HTTPS_PARTIAL_REQUEST_LINE HTTPS_CONNECT_METHOD " " HTTPS_EMPTY_PATH " " HTTPS_PROTOCOL_VERSION /** * @brief The User-Agent header line string. @@ -52,7 +52,7 @@ * "User-Agent: \r\n" * This is used for the calculation of the requestUserBufferMinimumSize. */ -#define HTTPS_USER_AGENT_HEADER_LINE HTTPS_USER_AGENT_HEADER HTTPS_HEADER_FIELD_SEPARATOR IOT_HTTPS_USER_AGENT HTTPS_END_OF_HEADER_LINES_INDICATOR +#define HTTPS_USER_AGENT_HEADER_LINE HTTPS_USER_AGENT_HEADER HTTPS_HEADER_FIELD_SEPARATOR IOT_HTTPS_USER_AGENT HTTPS_END_OF_HEADER_LINES_INDICATOR /** * @brief The Host header line with the field only and not the value. @@ -62,27 +62,7 @@ * This is used for the calculation of the requestUserBufferMinimumSize. The Host value is not specified because we * cannot anticipate what server the client is making requests to. */ -#define HTTPS_PARTIAL_HOST_HEADER_LINE HTTPS_HOST_HEADER HTTPS_HEADER_FIELD_SEPARATOR HTTPS_END_OF_HEADER_LINES_INDICATOR - -/** - * String constants for the Connection header and possible values. - * - * This is used for writing headers automatically during the sending of the HTTP request. - * "Connection: keep-alive\r\n" is written automatically for a persistent connection. - * "Connection: close\r\n" is written automatically for a non-persistent connection. - */ -#define HTTPS_CONNECTION_KEEP_ALIVE_HEADER_LINE HTTPS_CONNECTION_HEADER HTTPS_HEADER_FIELD_SEPARATOR HTTPS_CONNECTION_KEEP_ALIVE_HEADER_VALUE HTTPS_END_OF_HEADER_LINES_INDICATOR /**< @brief String literal for "Connection: keep-alive\r\n". */ -#define HTTPS_CONNECTION_CLOSE_HEADER_LINE HTTPS_CONNECTION_HEADER HTTPS_HEADER_FIELD_SEPARATOR HTTPS_CONNECTION_CLOSE_HEADER_VALUE HTTPS_END_OF_HEADER_LINES_INDICATOR /**< @brief String literal for "Connection: close\r\n". */ - -/** - * @brief The length of the "Connection: keep-alive\r\n" header. - * - * This is used for sizing a local buffer for the final headers to send that include the "Connection: keep-alive\r\n" - * header line. - * - * This is used to initialize a local array for the final headers to send. - */ -#define HTTPS_CONNECTION_KEEP_ALIVE_HEADER_LINE_LENGTH ( 24 ) +#define HTTPS_PARTIAL_HOST_HEADER_LINE HTTPS_HOST_HEADER HTTPS_HEADER_FIELD_SEPARATOR HTTPS_END_OF_HEADER_LINES_INDICATOR /** * Indicates for the http-parser parsing execution function to tell it to keep parsing or to stop parsing. @@ -90,8 +70,8 @@ * A value of 0 means the parser should keep parsing if there is more unparsed length. * A value greater than 0 tells the parser to stop parsing. */ -#define KEEP_PARSING ( ( int ) 0 ) /**< @brief Indicator in the http-parser callback to keep parsing when the function returns. */ -#define STOP_PARSING ( ( int ) 1 ) /**< @brief Indicator in the http-parser callback to stop parsing when the function returns. */ +#define KEEP_PARSING ( ( int ) 0 ) /**< @brief Indicator in the http-parser callback to keep parsing when the function returns. */ +#define STOP_PARSING ( ( int ) 1 ) /**< @brief Indicator in the http-parser callback to stop parsing when the function returns. */ /*-----------------------------------------------------------*/ @@ -336,40 +316,6 @@ static void _networkDisconnect( _httpsConnection_t * pHttpsConnection ); */ static void _networkDestroy( _httpsConnection_t * pHttpsConnection ); -/** - * @brief Add a header to the current HTTP request. - * - * The headers are stored in reqHandle->pHeaders. - * - * @param[in] pHttpsRequest - HTTP request context. - * @param[in] pName - The name of the header to add. - * @param[in] nameLen - The length of the header name string. - * @param[in] pValue - The buffer containing the value string. - * @param[in] valueLen - The length of the header value string. - * - * @return #IOT_HTTPS_OK if the header was added to the request successfully. - * #IOT_HTTPS_INSUFFICIENT_MEMORY if there was not enough room in the IotHttpsRequestHandle_t->pHeaders. - */ -static IotHttpsReturnCode_t _addHeader( _httpsRequest_t * pHttpsRequest, - const char * pName, - uint32_t nameLen, - const char * pValue, - uint32_t valueLen ); - -/** - * @brief Send data on the network. - * - * @param[in] pHttpsConnection - HTTP connection context. - * @param[in] pBuf - The buffer containing the data to send. - * @param[in] len - The length of the data to send. - * - * @return #IOT_HTTPS_OK if the data sent successfully. - * #IOT_HTTPS_NETWORK_ERROR if there was an error sending the data on the network. - */ -static IotHttpsReturnCode_t _networkSend( _httpsConnection_t * pHttpsConnection, - uint8_t * pBuf, - size_t len ); - /** * @brief Receive data on the network. * @@ -386,42 +332,6 @@ static IotHttpsReturnCode_t _networkRecv( _httpsConnection_t * pHttpsConnection, size_t bufLen, size_t * numBytesRecv ); -/** - * @brief Send all of the HTTP request headers in the pHeadersBuf and the final Content-Length and Connection headers. - * - * All of the headers in headerbuf are sent first followed by the computed content length and persistent connection - * indication. - * - * @param[in] pHttpsConnection - HTTP connection context. - * @param[in] pHeadersBuf - The buffer containing the request headers to send. This buffer must contain HTTP headers - * lines without the indicator for the the end of the HTTP headers. - * @param[in] headersLength - The length of the request headers to send. - * @param[in] isNonPersistent - Indicator of whether the connection is persistent or not. - * @param[in] contentLength - The length of the request body used for automatically creating a "Content-Length" header. - * - * @return #IOT_HTTPS_OK if the headers were fully sent successfully. - * #IOT_HTTPS_NETWORK_ERROR if there was an error receiving the data on the network. - */ -static IotHttpsReturnCode_t _sendHttpsHeaders( _httpsConnection_t * pHttpsConnection, - uint8_t * pHeadersBuf, - uint32_t headersLength, - bool isNonPersistent, - uint32_t contentLength ); - -/** - * @brief Send all of the HTTP request body in pBodyBuf. - * - * @param[in] pHttpsConnection - HTTP connection context. - * @param[in] pBodyBuf - Buffer of the request body to send. - * @param[in] bodyLength - The length of the body to send. - * - * @return #IOT_HTTPS_OK if the body was fully sent successfully. - * #IOT_HTTPS_NETWORK_ERROR if there was an error receiving the data on the network. - */ -static IotHttpsReturnCode_t _sendHttpsBody( _httpsConnection_t * pHttpsConnection, - uint8_t * pBodyBuf, - uint32_t bodyLength ); - /** * @brief Parse the HTTP response message in pBuf. * @@ -525,25 +435,20 @@ static IotHttpsReturnCode_t _flushHttpsNetworkData( _httpsConnection_t * pHttpsC _httpsResponse_t * pHttpsResponse ); /** - * @brief Task pool job routine to send the HTTP request within the pUserContext. + * @brief Send an HTTP request from the dispatch queue. * - * @param[in] pTaskPool Pointer to the system task pool. - * @param[in] pJob Pointer the to the HTTP request sending job. - * @param[in] pUserContext Pointer to an HTTP request, passed as an opaque context. + * @param[in] pHttpsRequest - Pointer to an HTTP request. */ -static void _sendHttpsRequest( IotTaskPool_t pTaskPool, - IotTaskPoolJob_t pJob, - void * pUserContext ); - +static void _sendHttpsRequest( _httpsRequest_t * pHttpsRequest ); /** * @brief Receive the HTTPS body specific to an asynchronous type of response. * * @param[in] pHttpsResponse - HTTP response context. * - * @return #IOT_HTTPS_OK - If the the response body was received with no issues. - * #IOT_HTTPS_RECEIVE_ABORT - If the request was cancelled by the Application - * #IOT_HTTPS_PARSING_ERROR - If there was an issue parsing the HTTP response body. + * @return #IOT_HTTPS_OK if the the response body was received with no issues. + * #IOT_HTTPS_RECEIVE_ABORT if the request was cancelled by the Application + * #IOT_HTTPS_PARSING_ERROR if there was an issue parsing the HTTP response body. * #IOT_HTTPS_NETWORK_ERROR if there was an error receiving the data on the network. */ static IotHttpsReturnCode_t _receiveHttpsBodyAsync( _httpsResponse_t * pHttpsResponse ); @@ -553,21 +458,69 @@ static IotHttpsReturnCode_t _receiveHttpsBodyAsync( _httpsResponse_t * pHttpsRes * * @param[in] pHttpsResponse - HTTP response context. * - * @return #IOT_HTTPS_OK - If the the response body was received with no issues. - * #IOT_HTTPS_MESSAGE_TOO_LARGE - If the body from the network is too large to fit into the configured body buffer. - * #IOT_HTTPS_PARSING_ERROR - If there was an issue parsing the HTTP response body. + * @return #IOT_HTTPS_OK if the the response body was received with no issues. + * #IOT_HTTPS_MESSAGE_TOO_LARGE if the body from the network is too large to fit into the configured body buffer. + * #IOT_HTTPS_PARSING_ERROR if there was an issue parsing the HTTP response body. * #IOT_HTTPS_NETWORK_ERROR if there was an error receiving the data on the network. */ static IotHttpsReturnCode_t _receiveHttpsBodySync( _httpsResponse_t * pHttpsResponse ); +/** + * @brief A dummy function for the transport interface receive. + * + * HTTP V1 library handles receiving from the network and hence the transport + * implementation for receive is called by the coreHTTP library. However, it + * will always returns all bytes as successfully read so that `HTTPClient_Send` + * can return a successful status if there are no errors from sending the request. + * + * @param[in] pNetworkContext Implementation-defined network context. + * @param[in] pBuffer Buffer to receive the data into. + * @param[in] bytesToRecv Number of bytes requested from the network. + * + * @return Always returns bytesToRecv or INT32_MAX if bytesToRecv > INT32_MAX. + */ +static int32_t transportRecv( NetworkContext_t * pNetworkContext, + void * pBuffer, + size_t bytesToRecv ); + +/** + * @brief Function for sending data over the network. + * + * @param[in] pNetworkContext Implementation-defined network context. + * @param[in] pBuffer Buffer containing the bytes to send over the network stack. + * @param[in] bytesToSend Number of bytes to send over the network. + * + * @return The number of bytes sent or a negative error code. + */ +static int32_t transportSend( NetworkContext_t * pNetworkContext, + const void * pMessage, + size_t bytesToSend ); + +/** + * @brief A task handle that sends an HTTPS request. + */ +static TaskHandle_t httpsDispatchTask[ IOT_HTTPS_DISPATCH_TASK_COUNT ]; + +/** + * @brief A queue that holds requests that are ready to be sent to the server. + */ +static QueueHandle_t dispatchQueue; + +/** + * @brief Sends requests from the dispatch queue. + * + * @param[in] pParameters User-provided parameters that are left unused. + */ +static void _dispatchTaskRoutine( void * pParameters ); + /** * @brief Schedule the task to send the the HTTP request. * * @param[in] pHttpsRequest - HTTP request context. * - * @return #IOT_HTTPS_OK - If the task to send the HTTP request was successfully scheduled. - * #IOT_HTTPS_INTERNAL_ERROR - If a taskpool job could not be created. - * #IOT_HTTPS_ASYNC_SCHEDULING_ERROR - If there was an error scheduling the job. + * @return #IOT_HTTPS_OK if the task to send the HTTP request was successfully scheduled. + * #IOT_HTTPS_INTERNAL_ERROR if the dispatch queue was full. + * #IOT_HTTPS_ASYNC_SCHEDULING_ERROR if there was an error scheduling the job. */ IotHttpsReturnCode_t _scheduleHttpsRequestSend( _httpsRequest_t * pHttpsRequest ); @@ -578,9 +531,9 @@ IotHttpsReturnCode_t _scheduleHttpsRequestSend( _httpsRequest_t * pHttpsRequest * * @param[in] pHttpsRequest - HTTP request context. * - * @return #IOT_HTTPS_OK - If the request was successfully added to the connection's request queue. - * #IOT_HTTPS_INTERNAL_ERROR - If a taskpool job could not be created. - * #IOT_HTTPS_ASYNC_SCHEDULING_ERROR - If there was an error scheduling the job. + * @return #IOT_HTTPS_OK if the request was successfully added to the connection's request queue. + * #IOT_HTTPS_INTERNAL_ERROR if the dispatch queue was full. + * #IOT_HTTPS_ASYNC_SCHEDULING_ERROR if there was an error scheduling the job. */ IotHttpsReturnCode_t _addRequestToConnectionReqQ( _httpsRequest_t * pHttpsRequest ); @@ -614,11 +567,28 @@ static void _cancelResponse( _httpsResponse_t * pHttpsResponse ); * @param[in] pRespHandle - Non-null HTTP response context. * @param[in] pRespInfo - Response configuration information. * @param[in] pHttpsRequest - HTTP request to grab async information, persistence, and method from. + * + * @return #IOT_HTTPS_OK if the request was successfully added to the connection's request queue. + * #IOT_HTTPS_INSUFFICIENT_MEMORY if the user-provided buffer was on insufficient size. + * #IOT_HTTPS_INVALID_PARAMETER if a parameter was NULL. */ static IotHttpsReturnCode_t _initializeResponse( IotHttpsResponseHandle_t * pRespHandle, IotHttpsResponseInfo_t * pRespInfo, _httpsRequest_t * pHttpsRequest ); +/** + * @brief Convert a status code from coreHTTP to an equivalent status code in the HTTP V1 Library. + * + * @param[in] coreHttpStatus - The status code from coreHTTP. + * + * @return #IOT_HTTPS_OK if the coreHTTP status was #HTTPSuccess. + * #IOT_HTTPS_INVALID_PARAMETER if the coreHTTP status was #HTTPInvalidParameter. + * #IOT_HTTPS_NETWORK_ERROR if the coreHTTP status was #HTTPNetworkError. + * #IOT_HTTPS_INSUFFICIENT_MEMORY if the coreHTTP status was #HTTPInsufficientMemory. + * #IOT_HTTPS_NOT_FOUND if the coreHTTP status was #HTTPHeaderNotFound. + */ +static IotHttpsReturnCode_t _shimConvertStatus( HTTPStatus_t coreHttpStatus ); + /** * @brief Increment the pointer stored in pBufCur depending on the character found in there. * @@ -637,6 +607,9 @@ static void _incrementNextLocationToWriteBeyondParsed( uint8_t ** pBufCur, * * @param[in] pHttpsConnection - HTTPS connection context. * @param[in] pHttpsRequest - HTTPS request context. + * + * @return #IOT_HTTPS_OK if the headers were fully sent successfully. + * #IOT_HTTPS_NETWORK_ERROR if there was an error receiving the data on the network. */ static IotHttpsReturnCode_t _sendHttpsHeadersAndBody( _httpsConnection_t * pHttpsConnection, _httpsRequest_t * pHttpsRequest ); @@ -1049,6 +1022,68 @@ static IotHttpsReturnCode_t _receiveHttpsBodySync( _httpsResponse_t * pHttpsResp /*-----------------------------------------------------------*/ +/** + * @brief Defining a network context for sending packets through the network interface. + * The declaration of the structure is mentioned in the transport_interface.h file. + */ +struct NetworkContext +{ + void * pNetworkConnection; /**< @brief The network connection used for sending packets on the network. */ + const IotNetworkInterface_t * pNetworkInterface; /**< @brief The network interface used to send packets on the network using the above network connection. */ +}; + +/*-----------------------------------------------------------*/ + +static int32_t transportRecv( NetworkContext_t * pNetworkContext, + void * pBuffer, + size_t bytesToRecv ) +{ + int32_t bytesReceived = -1; + + /* This dummy implementation is used for passing a non-NULL parameter. */ + ( void ) pNetworkContext; + ( void ) pBuffer; + ( void ) bytesToRecv; + + /* Always return the number of bytes requested or as many bytes as we can. */ + if( bytesToRecv > ( size_t ) INT32_MAX ) + { + bytesReceived = INT32_MAX; + } + else + { + bytesReceived = bytesToRecv; + } + + return bytesReceived; +} + +/*-----------------------------------------------------------*/ + +static int32_t transportSend( NetworkContext_t * pNetworkContext, + const void * pMessage, + size_t bytesToSend ) +{ + int32_t bytesSent = 0; + + /* Sending the bytes on the network using the network interface. */ + bytesSent = pNetworkContext->pNetworkInterface->send( pNetworkContext->pNetworkConnection, + ( const uint8_t * ) pMessage, + bytesToSend ); + + /* 0 bytes returned for the old HTTP library implied a network error. However, + * #HTTPClient_Send from coreHTTP will block while the return value is 0, so + * the return value must be manually set to -1 to also denote a network error. */ + if( bytesSent == 0 ) + { + bytesSent = -1; + } + + return bytesSent; +} + +/*-----------------------------------------------------------*/ + static void _networkReceiveCallback( void * pNetworkConnection, void * pReceiveContext ) { @@ -1188,7 +1223,7 @@ static void _networkReceiveCallback( void * pNetworkConnection, } else /* Any other error. */ { - IotLogError( "Failed to retrive the HTTPS body for response %p. Error code: %d", pCurrentHttpsResponse, status ); + IotLogError( "Failed to retrieve the HTTPS body for response %p. Error code: %d", pCurrentHttpsResponse, status ); } HTTPS_GOTO_CLEANUP(); @@ -1275,7 +1310,7 @@ static void _networkReceiveCallback( void * pNetworkConnection, pQItem = IotDeQueue_PeekHead( &( pHttpsConnection->reqQ ) ); IotMutex_Unlock( &( pHttpsConnection->connectionMutex ) ); - /* If there is a next request to process, then create a taskpool job to send the request. */ + /* If there is a next request to process, then add a dispatch task to the queue. */ if( pQItem != NULL ) { /* Set this next request to send. */ @@ -1567,86 +1602,6 @@ static void _networkDestroy( _httpsConnection_t * pHttpsConnection ) /*-----------------------------------------------------------*/ -static IotHttpsReturnCode_t _addHeader( _httpsRequest_t * pHttpsRequest, - const char * pName, - uint32_t nameLen, - const char * pValue, - uint32_t valueLen ) -{ - HTTPS_FUNCTION_ENTRY( IOT_HTTPS_OK ); - - int headerFieldSeparatorLen = HTTPS_HEADER_FIELD_SEPARATOR_LENGTH; - uint32_t additionalLength = nameLen + headerFieldSeparatorLen + valueLen + HTTPS_END_OF_HEADER_LINES_INDICATOR_LENGTH; - uint32_t possibleLastHeaderAdditionalLength = HTTPS_END_OF_HEADER_LINES_INDICATOR_LENGTH; - - /* Check if there is enough space to add the header field and value - * (name:value\r\n). We need to add a "\r\n" at the end of headers. The use of - * possibleLastHeaderAdditionalLength is to make sure that there is always - * space for the last "\r\n". */ - if( ( additionalLength + possibleLastHeaderAdditionalLength ) > ( ( uint32_t ) ( pHttpsRequest->pHeadersEnd - pHttpsRequest->pHeadersCur ) ) ) - { - IotLogError( "There is %d space left in the header buffer, but we want to add %d more of header.", - pHttpsRequest->pHeadersEnd - pHttpsRequest->pHeadersCur, - additionalLength + possibleLastHeaderAdditionalLength ); - HTTPS_SET_AND_GOTO_CLEANUP( IOT_HTTPS_INSUFFICIENT_MEMORY ); - } - - memcpy( pHttpsRequest->pHeadersCur, pName, nameLen ); - pHttpsRequest->pHeadersCur += nameLen; - memcpy( pHttpsRequest->pHeadersCur, HTTPS_HEADER_FIELD_SEPARATOR, headerFieldSeparatorLen ); - pHttpsRequest->pHeadersCur += headerFieldSeparatorLen; - memcpy( pHttpsRequest->pHeadersCur, pValue, valueLen ); - pHttpsRequest->pHeadersCur += valueLen; - memcpy( pHttpsRequest->pHeadersCur, HTTPS_END_OF_HEADER_LINES_INDICATOR, HTTPS_END_OF_HEADER_LINES_INDICATOR_LENGTH ); - pHttpsRequest->pHeadersCur += HTTPS_END_OF_HEADER_LINES_INDICATOR_LENGTH; - IotLogDebug( "Wrote header: \"%s: %.*s\r\n\". Space left in request user buffer: %d", - pName, - valueLen, - pValue, - pHttpsRequest->pHeadersEnd - pHttpsRequest->pHeadersCur ); - - HTTPS_FUNCTION_EXIT_NO_CLEANUP(); -} - -/*-----------------------------------------------------------*/ - -static IotHttpsReturnCode_t _networkSend( _httpsConnection_t * pHttpsConnection, - uint8_t * pBuf, - size_t len ) -{ - HTTPS_FUNCTION_ENTRY( IOT_HTTPS_OK ); - - size_t numBytesSent = 0; - size_t numBytesSentTotal = 0; - size_t sendLength = len; - - while( numBytesSentTotal < sendLength ) - { - numBytesSent = pHttpsConnection->pNetworkInterface->send( pHttpsConnection->pNetworkConnection, - &( pBuf[ numBytesSentTotal ] ), - sendLength - numBytesSentTotal ); - - /* pNetworkInterface->send returns 0 on error. */ - if( numBytesSent == 0 ) - { - IotLogError( "Error in sending the HTTPS headers. Error code: %d", numBytesSent ); - break; - } - - numBytesSentTotal += numBytesSent; - } - - if( numBytesSentTotal != sendLength ) - { - IotLogError( "Error sending data on the network. We sent %d but there were total %d.", numBytesSentTotal, sendLength ); - HTTPS_SET_AND_GOTO_CLEANUP( IOT_HTTPS_NETWORK_ERROR ); - } - - HTTPS_FUNCTION_EXIT_NO_CLEANUP(); -} - -/*-----------------------------------------------------------*/ - static IotHttpsReturnCode_t _networkRecv( _httpsConnection_t * pHttpsConnection, uint8_t * pBuf, size_t bufLen, @@ -1684,104 +1639,6 @@ static IotHttpsReturnCode_t _networkRecv( _httpsConnection_t * pHttpsConnection, /*-----------------------------------------------------------*/ -static IotHttpsReturnCode_t _sendHttpsHeaders( _httpsConnection_t * pHttpsConnection, - uint8_t * pHeadersBuf, - uint32_t headersLength, - bool isNonPersistent, - uint32_t contentLength ) -{ - HTTPS_FUNCTION_ENTRY( IOT_HTTPS_OK ); - - const char * connectionHeader = NULL; - int numWritten = 0; - int connectionHeaderLen = 0; - /* The Content-Length header of the form "Content-Length: N\r\n" with a NULL terminator for snprintf. */ - char contentLengthHeaderStr[ HTTPS_MAX_CONTENT_LENGTH_LINE_LENGTH + 1 ]; - - /* The HTTP headers to send after the headers in pHeadersBuf are the Content-Length and the Connection type and - * the final "\r\n" to indicate the end of the the header lines. Note that we are using - * HTTPS_CONNECTION_KEEP_ALIVE_HEADER_LINE_LENGTH because length of "Connection: keep-alive\r\n" is - * more than "Connection: close\r\n". Creating a buffer of bigger size ensures that - * both the connection type strings will fit in the buffer. */ - char finalHeaders[ HTTPS_MAX_CONTENT_LENGTH_LINE_LENGTH + HTTPS_CONNECTION_KEEP_ALIVE_HEADER_LINE_LENGTH + HTTPS_END_OF_HEADER_LINES_INDICATOR_LENGTH ] = { 0 }; - - /* Send the headers passed into this function first. These headers are not terminated with a second set of "\r\n". */ - status = _networkSend( pHttpsConnection, pHeadersBuf, headersLength ); - - if( HTTPS_FAILED( status ) ) - { - IotLogError( "Error sending the HTTPS headers in the request user buffer. Error code: %d", status ); - HTTPS_GOTO_CLEANUP(); - } - - /* If there is a Content-Length, then write that to the finalHeaders to send. */ - if( contentLength > 0 ) - { - numWritten = snprintf( contentLengthHeaderStr, - sizeof( contentLengthHeaderStr ), - "%s: %u\r\n", - HTTPS_CONTENT_LENGTH_HEADER, - ( unsigned int ) contentLength ); - } - - if( ( numWritten < 0 ) || ( numWritten >= ( ( int ) sizeof( contentLengthHeaderStr ) ) ) ) - { - IotLogError( "Internal error in snprintf() in _sendHttpsHeaders(). Error code %d.", numWritten ); - HTTPS_SET_AND_GOTO_CLEANUP( IOT_HTTPS_INTERNAL_ERROR ); - } - - /* snprintf() succeeded so copy that to the finalHeaders. */ - memcpy( finalHeaders, contentLengthHeaderStr, numWritten ); - - /* Write the connection persistence type to the final headers. */ - if( isNonPersistent ) - { - connectionHeader = HTTPS_CONNECTION_CLOSE_HEADER_LINE; - connectionHeaderLen = FAST_MACRO_STRLEN( HTTPS_CONNECTION_CLOSE_HEADER_LINE ); - } - else - { - connectionHeader = HTTPS_CONNECTION_KEEP_ALIVE_HEADER_LINE; - connectionHeaderLen = FAST_MACRO_STRLEN( HTTPS_CONNECTION_KEEP_ALIVE_HEADER_LINE ); - } - - memcpy( &finalHeaders[ numWritten ], connectionHeader, connectionHeaderLen ); - numWritten += connectionHeaderLen; - memcpy( &finalHeaders[ numWritten ], HTTPS_END_OF_HEADER_LINES_INDICATOR, HTTPS_END_OF_HEADER_LINES_INDICATOR_LENGTH ); - numWritten += HTTPS_END_OF_HEADER_LINES_INDICATOR_LENGTH; - - status = _networkSend( pHttpsConnection, ( uint8_t * ) finalHeaders, numWritten ); - - if( HTTPS_FAILED( status ) ) - { - IotLogError( "Error sending final HTTPS Headers \r\n%s. Error code: %d", finalHeaders, status ); - HTTPS_GOTO_CLEANUP(); - } - - HTTPS_FUNCTION_EXIT_NO_CLEANUP(); -} - -/*-----------------------------------------------------------*/ - -static IotHttpsReturnCode_t _sendHttpsBody( _httpsConnection_t * pHttpsConnection, - uint8_t * pBodyBuf, - uint32_t bodyLength ) -{ - HTTPS_FUNCTION_ENTRY( IOT_HTTPS_OK ); - - status = _networkSend( pHttpsConnection, pBodyBuf, bodyLength ); - - if( HTTPS_FAILED( status ) ) - { - IotLogError( "Error sending final HTTPS body at location %p. Error code: %d", pBodyBuf, status ); - HTTPS_GOTO_CLEANUP(); - } - - HTTPS_FUNCTION_EXIT_NO_CLEANUP(); -} - -/*-----------------------------------------------------------*/ - static IotHttpsReturnCode_t _parseHttpsMessage( _httpParserInfo_t * pHttpParserInfo, char * pBuf, size_t len ) @@ -2086,46 +1943,53 @@ static IotHttpsReturnCode_t _sendHttpsHeadersAndBody( _httpsConnection_t * pHttp { HTTPS_FUNCTION_ENTRY( IOT_HTTPS_OK ); - /* Send the HTTP headers. */ - status = _sendHttpsHeaders( pHttpsConnection, - pHttpsRequest->pHeaders, - pHttpsRequest->pHeadersCur - pHttpsRequest->pHeaders, - pHttpsRequest->isNonPersistent, - pHttpsRequest->bodyLength ); + HTTPStatus_t coreHttpStatus = HTTPSuccess; + HTTPRequestHeaders_t coreHttpRequestHeaders; + HTTPResponse_t coreHttpResponse; + TransportInterface_t transportInterface; + NetworkContext_t networkContext; + char pHttpsMinimalMockedResponse[ FAST_MACRO_STRLEN( HTTPS_MINIMAL_MOCKED_RESPONSE ) + 1 ] = HTTPS_MINIMAL_MOCKED_RESPONSE; + uint32_t sendFlags = 0; + + coreHttpRequestHeaders.pBuffer = pHttpsRequest->pHeaders; + coreHttpRequestHeaders.bufferLen = ( size_t ) ( pHttpsRequest->pHeadersEnd - pHttpsRequest->pHeaders ); + coreHttpRequestHeaders.headersLen = ( size_t ) ( pHttpsRequest->pHeadersCur - pHttpsRequest->pHeaders ); + + networkContext.pNetworkConnection = pHttpsConnection->pNetworkConnection; + networkContext.pNetworkInterface = pHttpsConnection->pNetworkInterface; + + transportInterface.send = transportSend; + transportInterface.recv = transportRecv; + transportInterface.pNetworkContext = &networkContext; + + /* Fill buffer with a mocked response so that http-parser returns successfully. */ + memset( &coreHttpResponse, 0, sizeof( HTTPResponse_t ) ); + coreHttpResponse.pBuffer = ( uint8_t * ) pHttpsMinimalMockedResponse; + coreHttpResponse.bufferLen = FAST_MACRO_STRLEN( HTTPS_MINIMAL_MOCKED_RESPONSE ); + + coreHttpStatus = HTTPClient_Send( &transportInterface, + &coreHttpRequestHeaders, + pHttpsRequest->pBody, + ( size_t ) pHttpsRequest->bodyLength, + &coreHttpResponse, + sendFlags ); + status = _shimConvertStatus( coreHttpStatus ); if( HTTPS_FAILED( status ) ) { - IotLogError( "Error sending the HTTPS headers with error code: %d", status ); + IotLogError( "Error sending the HTTPS request with error code: %d", status ); HTTPS_GOTO_CLEANUP(); } - IotLogDebug( "Sent HTTPS headers for request %p.", pHttpsRequest ); - - if( ( pHttpsRequest->pBody != NULL ) && ( pHttpsRequest->bodyLength > 0 ) ) - { - status = _sendHttpsBody( pHttpsConnection, pHttpsRequest->pBody, pHttpsRequest->bodyLength ); - - if( HTTPS_FAILED( status ) ) - { - IotLogError( "Error sending final HTTPS body. Return code: %d", status ); - HTTPS_GOTO_CLEANUP(); - } - - IotLogDebug( "Sent HTTPS body for request %p.", pHttpsRequest ); - } - HTTPS_FUNCTION_EXIT_NO_CLEANUP(); } /*-----------------------------------------------------------*/ -static void _sendHttpsRequest( IotTaskPool_t pTaskPool, - IotTaskPoolJob_t pJob, - void * pUserContext ) +static void _sendHttpsRequest( _httpsRequest_t * pHttpsRequest ) { HTTPS_FUNCTION_ENTRY( IOT_HTTPS_OK ); - _httpsRequest_t * pHttpsRequest = ( _httpsRequest_t * ) ( pUserContext ); _httpsConnection_t * pHttpsConnection = pHttpsRequest->pHttpsConnection; _httpsResponse_t * pHttpsResponse = pHttpsRequest->pHttpsResponse; IotHttpsReturnCode_t disconnectStatus = IOT_HTTPS_OK; @@ -2133,9 +1997,6 @@ static void _sendHttpsRequest( IotTaskPool_t pTaskPool, IotLink_t * pQItem = NULL; _httpsRequest_t * pNextHttpsRequest = NULL; - ( void ) pTaskPool; - ( void ) pJob; - IotLogDebug( "Task with request ID: %p started.", pHttpsRequest ); if( pHttpsRequest->cancelled == true ) @@ -2321,36 +2182,49 @@ static void _sendHttpsRequest( IotTaskPool_t pTaskPool, /*-----------------------------------------------------------*/ +static void _dispatchTaskRoutine( void * pParameters ) +{ + ( void ) pParameters; + + _httpsRequest_t * pHttpsRequest = NULL; + + for( ; ; ) + { + /* If there are no requests in the dispatch queue, try again. */ + if( xQueueReceive( dispatchQueue, + &pHttpsRequest, + IOT_HTTPS_QUEUE_RECV_TICKS ) == pdFALSE ) + { + IotLogDebug( "No requests to send. Trying again." ); + continue; + } + + _sendHttpsRequest( pHttpsRequest ); + } +} + +/*-----------------------------------------------------------*/ + IotHttpsReturnCode_t _scheduleHttpsRequestSend( _httpsRequest_t * pHttpsRequest ) { HTTPS_FUNCTION_ENTRY( IOT_HTTPS_OK ); - IotTaskPoolError_t taskPoolStatus = IOT_TASKPOOL_SUCCESS; - _httpsConnection_t * pHttpsConnection = pHttpsRequest->pHttpsConnection; + BaseType_t queueStatus = pdTRUE; /* Set the request to scheduled even if scheduling fails. */ pHttpsRequest->scheduled = true; - taskPoolStatus = IotTaskPool_CreateJob( _sendHttpsRequest, - ( void * ) ( pHttpsRequest ), - &( pHttpsConnection->taskPoolJobStorage ), - &( pHttpsConnection->taskPoolJob ) ); + queueStatus = xQueueSendToBack( dispatchQueue, &pHttpsRequest, IOT_HTTPS_QUEUE_SEND_TICKS ); - /* Creating a task pool job should never fail when parameters are valid. */ - if( taskPoolStatus != IOT_TASKPOOL_SUCCESS ) + /* Occurs when the queue remains full for #IOT_HTTPS_QUEUE_SEND_TICKS. */ + if( queueStatus != pdTRUE ) { - IotLogError( "Error creating a taskpool job for request servicing. Error code: %d", taskPoolStatus ); + IotLogError( "Failed to add request to full dispatch queue of size %u. Error code: %d", + IOT_HTTPS_DISPATCH_QUEUE_SIZE, + ( int ) queueStatus ); HTTPS_SET_AND_GOTO_CLEANUP( IOT_HTTPS_INTERNAL_ERROR ); } - taskPoolStatus = IotTaskPool_Schedule( IOT_SYSTEM_TASKPOOL, pHttpsConnection->taskPoolJob, 0 ); - - if( taskPoolStatus != IOT_TASKPOOL_SUCCESS ) - { - IotLogError( "Failed to schedule taskpool job. Error code: %d", taskPoolStatus ); - HTTPS_SET_AND_GOTO_CLEANUP( IOT_HTTPS_ASYNC_SCHEDULING_ERROR ); - } - HTTPS_FUNCTION_EXIT_NO_CLEANUP(); } @@ -2399,17 +2273,17 @@ IotHttpsReturnCode_t _addRequestToConnectionReqQ( _httpsRequest_t * pHttpsReques if( ( IotDeQueue_IsEmpty( &( pHttpsConnection->reqQ ) ) ) && ( IotDeQueue_IsEmpty( &( pHttpsConnection->respQ ) ) ) ) { - IotLogDebug( "Both the request and response queue are empty, so schedule the request to run in the taskpool." ); + IotLogDebug( "Both the request and response queue are empty, so schedule the request to run in the dispatch queue." ); scheduleRequest = true; } - /* Place into the connection's request to have a taskpool worker schedule to serve it later. */ + /* Place into the connection's request to have a dispatch task serve it later. */ IotDeQueue_EnqueueTail( &( pHttpsConnection->reqQ ), &( pHttpsRequest->link ) ); IotMutex_Unlock( &( pHttpsConnection->connectionMutex ) ); if( scheduleRequest ) { - /* This routine schedules a task pool worker to send the request. If a worker is available immediately, then + /* This routine schedules a dispatch task to send the request. If a task is available immediately, then * the request is sent right away. */ status = _scheduleHttpsRequestSend( pHttpsRequest ); @@ -2449,6 +2323,73 @@ IotHttpsReturnCode_t IotHttpsClient_Init( void ) { HTTPS_FUNCTION_ENTRY( IOT_HTTPS_OK ); + uint8_t dispatchTaskIndex = 0; + + /* Allocate the dispatch queue. */ + #if IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY == 1 + /* An array that holds the TCB of each dispatch task. */ + static StaticTask_t dispatchTaskBuffer[ IOT_HTTPS_DISPATCH_TASK_COUNT ]; + + /* An array that holds the stack of each dispatch task. + * The size of StackType_t is dependent on the RTOS port. */ + static StackType_t dispatchTaskStack[ IOT_HTTPS_DISPATCH_TASK_COUNT ][ IOT_HTTPS_DISPATCH_TASK_STACK_SIZE ]; + + /* A data structure to contain a statically allocated queue. */ + static StaticQueue_t dispatchQueueBuffer; + + /* A buffer to hold static memory for the dispatch queue. */ + static uint8_t dispatchQueueStorageBuffer[ IOT_HTTPS_DISPATCH_QUEUE_SIZE * sizeof( _httpsRequest_t * ) ]; + + dispatchQueue = xQueueCreateStatic( IOT_HTTPS_DISPATCH_QUEUE_SIZE, + sizeof( _httpsRequest_t * ), + dispatchQueueStorageBuffer, + &dispatchQueueBuffer ); + #else /* if IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY == 1 */ + BaseType_t taskCreationResult = pdFALSE; + + dispatchQueue = xQueueCreate( IOT_HTTPS_DISPATCH_QUEUE_SIZE, sizeof( _httpsRequest_t * ) ); + #endif /* if IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY == 1 */ + + if( dispatchQueue == NULL ) + { + /* Queue was not created and must not be used. */ + IotLogError( "Failed to allocate resources for dispatch queue.", status ); + HTTPS_SET_AND_GOTO_CLEANUP( IOT_HTTPS_INTERNAL_ERROR ); + } + + /* Start tasks that send requests from the dispatch queue. */ + for( dispatchTaskIndex = 0; dispatchTaskIndex < IOT_HTTPS_DISPATCH_TASK_COUNT; ++dispatchTaskIndex ) + { + #if IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY == 1 + httpsDispatchTask[ dispatchTaskIndex ] = xTaskCreateStatic( _dispatchTaskRoutine, + "iot_thread", + IOT_HTTPS_DISPATCH_TASK_STACK_SIZE, + NULL, + IOT_HTTPS_DISPATCH_TASK_PRIORITY, + dispatchTaskStack[ dispatchTaskIndex ], + &dispatchTaskBuffer[ dispatchTaskIndex ] ); + + if( httpsDispatchTask[ dispatchTaskIndex ] == NULL ) + { + IotLogError( "Failed to allocate static memory for request task.", status ); + HTTPS_SET_AND_GOTO_CLEANUP( IOT_HTTPS_INTERNAL_ERROR ); + } + #else /* ifdef IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY */ + taskCreationResult = xTaskCreate( _dispatchTaskRoutine, + "iot_thread", + IOT_HTTPS_DISPATCH_TASK_STACK_SIZE, + NULL, + IOT_HTTPS_DISPATCH_TASK_PRIORITY, + &httpsDispatchTask[ dispatchTaskIndex ] ); + + if( taskCreationResult != pdPASS ) + { + IotLogError( "Failed to allocate dynamic memory for request task.", status ); + HTTPS_SET_AND_GOTO_CLEANUP( IOT_HTTPS_INTERNAL_ERROR ); + } + #endif /* ifdef IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY */ + } + /* This sets all member in the _httpParserSettings to zero. It does not return any errors. */ http_parser_settings_init( &_httpParserSettings ); @@ -2461,14 +2402,42 @@ IotHttpsReturnCode_t IotHttpsClient_Init( void ) _httpParserSettings.on_body = _httpParserOnBodyCallback; _httpParserSettings.on_message_complete = _httpParserOnMessageCompleteCallback; -/* This code prints debugging information and is, therefore, compiled only when - * log level is set to IOT_LOG_DEBUG. */ + /* This code prints debugging information and is, therefore, compiled only when + * log level is set to IOT_LOG_DEBUG. */ #if ( LIBRARY_LOG_LEVEL == IOT_LOG_DEBUG ) _httpParserSettings.on_chunk_header = _httpParserOnChunkHeaderCallback; _httpParserSettings.on_chunk_complete = _httpParserOnChunkCompleteCallback; #endif - HTTPS_GOTO_CLEANUP(); - HTTPS_FUNCTION_EXIT_NO_CLEANUP(); + HTTPS_FUNCTION_CLEANUP_BEGIN(); + + /* Upon error, reset to original state, freeing up any dynamic memory. */ + if( HTTPS_FAILED( status ) ) + { + #if IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY != 1 + /* Free memory used for the dispatch queue. */ + if( dispatchQueue != NULL ) + { + vQueueDelete( dispatchQueue ); + } + #endif /* if IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY != 1 */ + dispatchQueue = NULL; + + /* Delete the tasks that send requests from the dispatch queue. */ + for( dispatchTaskIndex = 0; dispatchTaskIndex < IOT_HTTPS_DISPATCH_TASK_COUNT; ++dispatchTaskIndex ) + { + if( httpsDispatchTask[ dispatchTaskIndex ] != NULL ) + { + #if IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY == 1 + vTaskSuspend( httpsDispatchTask[ dispatchTaskIndex ] ); + #else + vTaskDelete( httpsDispatchTask[ dispatchTaskIndex ] ); + #endif + httpsDispatchTask[ dispatchTaskIndex ] = NULL; + } + } + } + + HTTPS_FUNCTION_CLEANUP_END(); } /*-----------------------------------------------------------*/ @@ -2579,9 +2548,70 @@ static IotHttpsReturnCode_t _initializeResponse( IotHttpsResponseHandle_t * pRes /*-----------------------------------------------------------*/ +static IotHttpsReturnCode_t _shimConvertStatus( HTTPStatus_t coreHttpStatus ) +{ + IotHttpsReturnCode_t returnStatus = IOT_HTTPS_OK; + + /* Note that coreHTTP will not receive any data so status codes relating + * to receiving a response are not mapped. */ + switch( coreHttpStatus ) + { + case HTTPSuccess: + returnStatus = IOT_HTTPS_OK; + break; + + case HTTPInvalidParameter: + returnStatus = IOT_HTTPS_INVALID_PARAMETER; + break; + + case HTTPNetworkError: + returnStatus = IOT_HTTPS_NETWORK_ERROR; + break; + + case HTTPInsufficientMemory: + returnStatus = IOT_HTTPS_INSUFFICIENT_MEMORY; + break; + + case HTTPHeaderNotFound: + returnStatus = IOT_HTTPS_NOT_FOUND; + break; + + default: + returnStatus = IOT_HTTPS_FATAL; + break; + } + + return returnStatus; +} + +/* --------------------------------------------------------- */ + void IotHttpsClient_Cleanup( void ) { - /* There is nothing to clean up here as of now. */ + uint8_t dispatchTaskIndex = 0; + + #if IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY != 1 + /* Free memory used for the dispatch queue. */ + if( dispatchQueue != NULL ) + { + vQueueDelete( dispatchQueue ); + } + #endif /* if IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY != 1 */ + dispatchQueue = NULL; + + /* Delete the tasks that send requests from the dispatch queue. */ + for( dispatchTaskIndex = 0; dispatchTaskIndex < IOT_HTTPS_DISPATCH_TASK_COUNT; ++dispatchTaskIndex ) + { + if( httpsDispatchTask[ dispatchTaskIndex ] != NULL ) + { + #if IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY == 1 + vTaskSuspend( httpsDispatchTask[ dispatchTaskIndex ] ); + #else + vTaskDelete( httpsDispatchTask[ dispatchTaskIndex ] ); + #endif + httpsDispatchTask[ dispatchTaskIndex ] = NULL; + } + } } /* --------------------------------------------------------- */ @@ -2606,7 +2636,7 @@ IotHttpsReturnCode_t IotHttpsClient_Connect( IotHttpsConnectionHandle_t * pConnH if( HTTPS_FAILED( status ) ) { - IotLogError( "Error disconnecting a connected *pConnHandle passed to IotHttpsClient_Connect().Error code %d", status ); + IotLogError( "Error disconnecting a connected *pConnHandle passed to IotHttpsClient_Connect(). Error code %d", status ); *pConnHandle = NULL; HTTPS_GOTO_CLEANUP(); } @@ -2637,7 +2667,7 @@ IotHttpsReturnCode_t IotHttpsClient_Disconnect( IotHttpsConnectionHandle_t connH HTTPS_ON_NULL_ARG_GOTO_CLEANUP( connHandle ); - /* If this routine is currently is progress by another thread, for instance the taskpool worker that received a + /* If this routine is currently is progress by another thread, for instance the dispatch task that received a * network error after sending, then return right away because connection resources are being used. */ if( IotMutex_TryLock( &( connHandle->connectionMutex ) ) == false ) { @@ -2733,12 +2763,11 @@ IotHttpsReturnCode_t IotHttpsClient_InitializeRequest( IotHttpsRequestHandle_t * { HTTPS_FUNCTION_ENTRY( IOT_HTTPS_OK ); + HTTPStatus_t coreHttpStatus = HTTPSuccess; + HTTPRequestHeaders_t coreHttpRequestHeaders; + HTTPRequestInfo_t coreHttpRequestInfo; + _httpsRequest_t * pHttpsRequest = NULL; - size_t additionalLength = 0; - size_t spaceLen = 1; - char * pSpace = " "; - size_t httpsMethodLen = 0; - size_t httpsProtocolVersionLen = FAST_MACRO_STRLEN( HTTPS_PROTOCOL_VERSION ); /* Check for NULL parameters in the public API. */ HTTPS_ON_NULL_ARG_GOTO_CLEANUP( pReqHandle ); @@ -2762,79 +2791,41 @@ IotHttpsReturnCode_t IotHttpsClient_InitializeRequest( IotHttpsRequestHandle_t * pReqInfo->userBuffer.bufferLen, requestUserBufferMinimumSize ); - /* Set the request contet to the start of the userbuffer. */ + /* Set the request context to the start of the user buffer. */ pHttpsRequest = ( _httpsRequest_t * ) ( pReqInfo->userBuffer.pBuffer ); - /* Clear out the user buffer. */ - memset( pReqInfo->userBuffer.pBuffer, 0, pReqInfo->userBuffer.bufferLen ); /* Set the start of the headers to the end of the request context in the user buffer. */ pHttpsRequest->pHeaders = ( uint8_t * ) pHttpsRequest + sizeof( _httpsRequest_t ); pHttpsRequest->pHeadersEnd = ( uint8_t * ) pHttpsRequest + pReqInfo->userBuffer.bufferLen; pHttpsRequest->pHeadersCur = pHttpsRequest->pHeaders; - /* Get the length of the HTTP method. */ - httpsMethodLen = strlen( _pHttpsMethodStrings[ pReqInfo->method ] ); + /* Map coreHTTP objects to be used by #HTTPClient_InitializeRequestHeaders. */ + coreHttpRequestHeaders.pBuffer = pHttpsRequest->pHeaders; + coreHttpRequestHeaders.bufferLen = ( size_t ) ( pHttpsRequest->pHeadersEnd - pHttpsRequest->pHeaders ); - /* Add the request line to the header buffer. */ - additionalLength = httpsMethodLen + \ - spaceLen + \ - pReqInfo->pathLen + \ - spaceLen + \ - httpsProtocolVersionLen + \ - HTTPS_END_OF_HEADER_LINES_INDICATOR_LENGTH; + coreHttpRequestInfo.pMethod = _pHttpsMethodStrings[ pReqInfo->method ]; + coreHttpRequestInfo.methodLen = ( size_t ) strlen( _pHttpsMethodStrings[ pReqInfo->method ] ); + coreHttpRequestInfo.pPath = pReqInfo->pPath; + coreHttpRequestInfo.pathLen = ( size_t ) pReqInfo->pathLen; + coreHttpRequestInfo.pHost = pReqInfo->pHost; + coreHttpRequestInfo.hostLen = ( size_t ) pReqInfo->hostLen; - if( ( additionalLength + pHttpsRequest->pHeadersCur ) > ( pHttpsRequest->pHeadersEnd ) ) + if( pHttpsRequest->isNonPersistent == false ) { - IotLogError( "Request line does not fit into the request user buffer: \"%s %.*s HTTP/1.1\\r\\n\" . ", - _pHttpsMethodStrings[ pReqInfo->method ], - pReqInfo->pathLen, - pReqInfo->pPath ); - IotLogError( "The length needed is %d and the space available is %d.", additionalLength, pHttpsRequest->pHeadersEnd - pHttpsRequest->pHeadersCur ); - HTTPS_SET_AND_GOTO_CLEANUP( IOT_HTTPS_INSUFFICIENT_MEMORY ); + coreHttpRequestInfo.reqFlags = HTTP_REQUEST_KEEP_ALIVE_FLAG; } - /* Write " HTTP/1.1\r\n" to the start of the header space. */ - memcpy( pHttpsRequest->pHeadersCur, _pHttpsMethodStrings[ pReqInfo->method ], httpsMethodLen ); - pHttpsRequest->pHeadersCur += httpsMethodLen; - memcpy( pHttpsRequest->pHeadersCur, pSpace, spaceLen ); - pHttpsRequest->pHeadersCur += spaceLen; - - if( pReqInfo->pPath == NULL ) - { - pReqInfo->pPath = HTTPS_EMPTY_PATH; - pReqInfo->pathLen = FAST_MACRO_STRLEN( HTTPS_EMPTY_PATH ); - } - - memcpy( pHttpsRequest->pHeadersCur, pReqInfo->pPath, pReqInfo->pathLen ); - pHttpsRequest->pHeadersCur += pReqInfo->pathLen; - memcpy( pHttpsRequest->pHeadersCur, pSpace, spaceLen ); - pHttpsRequest->pHeadersCur += spaceLen; - memcpy( pHttpsRequest->pHeadersCur, HTTPS_PROTOCOL_VERSION, httpsProtocolVersionLen ); - pHttpsRequest->pHeadersCur += httpsProtocolVersionLen; - memcpy( pHttpsRequest->pHeadersCur, HTTPS_END_OF_HEADER_LINES_INDICATOR, HTTPS_END_OF_HEADER_LINES_INDICATOR_LENGTH ); - pHttpsRequest->pHeadersCur += HTTPS_END_OF_HEADER_LINES_INDICATOR_LENGTH; - - /* Add the User-Agent header. */ - status = _addHeader( pHttpsRequest, HTTPS_USER_AGENT_HEADER, FAST_MACRO_STRLEN( HTTPS_USER_AGENT_HEADER ), IOT_HTTPS_USER_AGENT, FAST_MACRO_STRLEN( IOT_HTTPS_USER_AGENT ) ); + coreHttpStatus = HTTPClient_InitializeRequestHeaders( &coreHttpRequestHeaders, + &coreHttpRequestInfo ); + status = _shimConvertStatus( coreHttpStatus ); if( HTTPS_FAILED( status ) ) { - IotLogError( "Failed to write header to the request user buffer: \"User-Agent: %s\\r\\n\" . Error code: %d", - IOT_HTTPS_USER_AGENT, - status ); HTTPS_GOTO_CLEANUP(); } - status = _addHeader( pHttpsRequest, HTTPS_HOST_HEADER, FAST_MACRO_STRLEN( HTTPS_HOST_HEADER ), pReqInfo->pHost, pReqInfo->hostLen ); - - if( HTTPS_FAILED( status ) ) - { - IotLogError( "Failed to write \"Host: %.*s\\r\\n\" to the request user buffer. Error code: %d", - pReqInfo->hostLen, - pReqInfo->pHost, - status ); - HTTPS_GOTO_CLEANUP(); - } + /* Update the original library based on coreHTTP's output. */ + pHttpsRequest->pHeadersCur = pHttpsRequest->pHeaders + coreHttpRequestHeaders.headersLen; if( pReqInfo->isAsync ) { @@ -2889,6 +2880,9 @@ IotHttpsReturnCode_t IotHttpsClient_AddHeader( IotHttpsRequestHandle_t reqHandle { HTTPS_FUNCTION_ENTRY( IOT_HTTPS_OK ); + HTTPStatus_t coreHttpStatus = HTTPSuccess; + HTTPRequestHeaders_t coreHttpRequestHeaders; + /* Check for NULL pointer paramters. */ HTTPS_ON_NULL_ARG_GOTO_CLEANUP( pName ); HTTPS_ON_NULL_ARG_GOTO_CLEANUP( pValue ); @@ -2938,8 +2932,13 @@ IotHttpsReturnCode_t IotHttpsClient_AddHeader( IotHttpsRequestHandle_t reqHandle "Attempting to add auto-generated header %s. This is not allowed.", HTTPS_USER_AGENT_HEADER ); + /* Map coreHTTP objects to be used by #HTTPClient_AddHeader. */ + coreHttpRequestHeaders.pBuffer = reqHandle->pHeaders; + coreHttpRequestHeaders.bufferLen = ( size_t ) ( reqHandle->pHeadersEnd - reqHandle->pHeaders ); + coreHttpRequestHeaders.headersLen = ( size_t ) ( reqHandle->pHeadersCur - reqHandle->pHeaders ); - status = _addHeader( reqHandle, pName, nameLen, pValue, valueLen ); + coreHttpStatus = HTTPClient_AddHeader( &coreHttpRequestHeaders, pName, nameLen, pValue, valueLen ); + status = _shimConvertStatus( coreHttpStatus ); if( HTTPS_FAILED( status ) ) { @@ -2947,6 +2946,9 @@ IotHttpsReturnCode_t IotHttpsClient_AddHeader( IotHttpsRequestHandle_t reqHandle HTTPS_GOTO_CLEANUP(); } + /* Update the original library based on coreHTTP's output. */ + reqHandle->pHeadersCur = reqHandle->pHeaders + coreHttpRequestHeaders.headersLen; + HTTPS_FUNCTION_EXIT_NO_CLEANUP(); } diff --git a/libraries/c_sdk/standard/https/src/iot_https_utils.c b/libraries/c_sdk/standard/https/src/iot_https_utils.c index 673c592f80e..5134f11c780 100644 --- a/libraries/c_sdk/standard/https/src/iot_https_utils.c +++ b/libraries/c_sdk/standard/https/src/iot_https_utils.c @@ -1,5 +1,5 @@ /* - * FreeRTOS HTTPS Client V1.1.3 + * FreeRTOS HTTPS Client V1.2.0 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/https/src/private/iot_https_internal.h b/libraries/c_sdk/standard/https/src/private/iot_https_internal.h index 50a7949c6bb..118bf24722d 100644 --- a/libraries/c_sdk/standard/https/src/private/iot_https_internal.h +++ b/libraries/c_sdk/standard/https/src/private/iot_https_internal.h @@ -1,5 +1,5 @@ /* - * FreeRTOS HTTPS Client V1.1.3 + * FreeRTOS HTTPS Client V1.2.0 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -29,27 +29,27 @@ /* The config header is always included first. */ #include "iot_config.h" -/* Standard Includes. */ +/* Standard includes. */ #include #include #include #include +/* Kernel includes. */ +#include "queue.h" + +/* coreHTTP includes. */ +#include "core_http_client.h" + /* Third party http-parser include. */ #include "http_parser.h" /* HTTPS Client library includes. */ #include "iot_https_client.h" -/* Task pool include. */ -#include "iot_taskpool.h" - /* Linear containers (lists and queues) include. */ #include "iot_linear_containers.h" -/* Types include. */ -#include "types/iot_taskpool_types.h" - /* Platform layer includes. */ #include "platform/iot_threads.h" #include "platform/iot_network.h" @@ -133,16 +133,23 @@ /* Configure logs for HTTPS Client functions. */ #ifdef IOT_LOG_LEVEL_HTTPS - #define LIBRARY_LOG_LEVEL IOT_LOG_LEVEL_HTTPS + #ifndef LIBRARY_LOG_LEVEL + #define LIBRARY_LOG_LEVEL IOT_LOG_LEVEL_HTTPS + #endif #else - #ifdef IOT_LOG_LEVEL_GLOBAL - #define LIBRARY_LOG_LEVEL IOT_LOG_LEVEL_GLOBAL - #else - #define LIBRARY_LOG_LEVEL IOT_LOG_NONE + #ifndef LIBRARY_LOG_LEVEL + #ifdef IOT_LOG_LEVEL_GLOBAL + #define LIBRARY_LOG_LEVEL IOT_LOG_LEVEL_GLOBAL + #else + #define LIBRARY_LOG_LEVEL IOT_LOG_NONE + #endif #endif +#endif /* ifdef IOT_LOG_LEVEL_HTTPS */ + +#ifndef LIBRARY_LOG_NAME + #define LIBRARY_LOG_NAME ( "HTTPS Client" ) #endif -#define LIBRARY_LOG_NAME ( "HTTPS Client" ) #include "iot_logging_setup.h" /* @@ -151,6 +158,9 @@ */ #if IOT_STATIC_MEMORY_ONLY == 1 #include "private/iot_static_memory.h" + #ifndef IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY + #define IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY ( 1 ) /* Use static memory for dispatch queue and tasks. */ + #endif #endif /** @@ -160,26 +170,60 @@ * Provide default values for undefined configuration constants. */ #ifndef AWS_IOT_HTTPS_ENABLE_METRICS - #define AWS_IOT_HTTPS_ENABLE_METRICS ( 1 ) -#endif -#ifndef IOT_HTTPS_USER_AGENT - #define IOT_HTTPS_USER_AGENT "amazon-freertos" + #define AWS_IOT_HTTPS_ENABLE_METRICS ( 1 ) #endif #ifndef IOT_HTTPS_MAX_FLUSH_BUFFER_SIZE - #define IOT_HTTPS_MAX_FLUSH_BUFFER_SIZE ( 1024 ) + #define IOT_HTTPS_MAX_FLUSH_BUFFER_SIZE ( 1024 ) #endif #ifndef IOT_HTTPS_RESPONSE_WAIT_MS - #define IOT_HTTPS_RESPONSE_WAIT_MS ( 1000 ) + #define IOT_HTTPS_RESPONSE_WAIT_MS ( 1000 ) #endif #ifndef IOT_HTTPS_MAX_HOST_NAME_LENGTH - #define IOT_HTTPS_MAX_HOST_NAME_LENGTH ( 255 ) /* Per FQDN, the maximum host name length is 255 bytes. */ + #define IOT_HTTPS_MAX_HOST_NAME_LENGTH ( 255 ) /* Per FQDN, the maximum host name length is 255 bytes. */ #endif #ifndef IOT_HTTPS_MAX_ALPN_PROTOCOLS_LENGTH - #define IOT_HTTPS_MAX_ALPN_PROTOCOLS_LENGTH ( 255 ) /* The maximum alpn protocols length is chosen arbitrarily. */ + #define IOT_HTTPS_MAX_ALPN_PROTOCOLS_LENGTH ( 255 ) /* The maximum alpn protocols length is chosen arbitrarily. */ +#endif +#ifndef IOT_HTTPS_QUEUE_RECV_TICKS + #define IOT_HTTPS_QUEUE_RECV_TICKS ( portMAX_DELAY ) /* The ticks to wait for a #xQueueReceive to complete. */ +#endif +#ifndef IOT_HTTPS_QUEUE_SEND_TICKS + #define IOT_HTTPS_QUEUE_SEND_TICKS ( 0U ) /* The ticks to wait for a #xQueueSendToBack to complete. */ +#endif +#ifndef IOT_HTTPS_DISPATCH_QUEUE_SIZE + #define IOT_HTTPS_DISPATCH_QUEUE_SIZE ( 4U ) /* The size of the queue containing requests ready to send to the server. */ +#endif +#ifndef IOT_HTTPS_DISPATCH_TASK_COUNT + #define IOT_HTTPS_DISPATCH_TASK_COUNT ( 2U ) /* The number of tasks that send requests from the queue. */ +#endif +#ifndef IOT_HTTPS_DISPATCH_TASK_STACK_SIZE + #define IOT_HTTPS_DISPATCH_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE * 2 ) /* The stack size of each dispatch task. */ +#endif +#ifndef IOT_HTTPS_DISPATCH_TASK_PRIORITY + #define IOT_HTTPS_DISPATCH_TASK_PRIORITY ( IOT_THREAD_DEFAULT_PRIORITY ) /* Priority is deliberately chosen to match the original taskpool's priority. */ +#endif +#ifndef IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY + #define IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY ( 0 ) /* The dispatch queue and tasks will not use static memory by default. */ +#endif + +/* Provide the User-Agent Value definition fom coreHTTP. */ +#ifdef HTTP_USER_AGENT_VALUE + #define IOT_HTTPS_USER_AGENT HTTP_USER_AGENT_VALUE #endif /** @endcond */ +/* Error checking of macro configurations. */ +#if IOT_HTTPS_DISPATCH_TASK_COUNT < 1 + #error "IOT_HTTPS_DISPATCH_TASK_COUNT must be at least 1." +#endif +#if IOT_HTTPS_DISPATCH_QUEUE_SIZE < 1 + #error "IOT_HTTPS_DISPATCH_QUEUE_SIZE must be at least 1." +#endif +#if IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY == 1 && configSUPPORT_STATIC_ALLOCATION != 1 + #error "IOT_HTTPS_DISPATCH_USE_STATIC_MEMORY is 1, but configSUPPORT_STATIC_ALLOCATION is not set to 1." +#endif + /** * @brief The HTTP protocol version of this library is HTTP/1.1. */ @@ -237,6 +281,11 @@ #define HTTPS_CONTENT_LENGTH_HEADER "Content-Length" #define HTTPS_CONNECTION_HEADER "Connection" +/* + * Constant for a mocked response so that #HTTPClient_Send returns #HTTPSuccess. + */ +#define HTTPS_MINIMAL_MOCKED_RESPONSE "HTTP/1.1 404\r\nContent-Length: 0\r\n\r\n" + /** * @brief The maximum Content-Length header line size. * @@ -384,12 +433,10 @@ typedef struct _httpsConnection * disconnect with a network error, or an explicit disconnect with a call to @ref https_client_function_disconnect. */ bool isConnected; - bool isDestroyed; /**< @brief true if the connection is already destroyed and we should call anymore */ - IotMutex_t connectionMutex; /**< @brief Mutex protecting operations on this entire connection context. */ - IotDeQueue_t reqQ; /**< @brief The queue for the requests that are not finished yet. */ - IotDeQueue_t respQ; /**< @brief The queue for the responses that are waiting to be processed. */ - IotTaskPoolJobStorage_t taskPoolJobStorage; /**< @brief An asynchronous operation requires storage for the task pool job. */ - IotTaskPoolJob_t taskPoolJob; /**< @brief The task pool job identifier for an asynchronous request. */ + bool isDestroyed; /**< @brief true if the connection is already destroyed and we should not make calls on it anymore. */ + IotMutex_t connectionMutex; /**< @brief Mutex protecting operations on this entire connection context. */ + IotDeQueue_t reqQ; /**< @brief The queue for the requests that are not finished yet. */ + IotDeQueue_t respQ; /**< @brief The queue for the responses that are waiting to be processed. */ } _httpsConnection_t; /** @@ -477,7 +524,7 @@ typedef struct _httpsRequest IotHttpsClientCallbacks_t * pCallbacks; /**< @brief Pointer to the asynchronous request callbacks. */ bool cancelled; /**< @brief Set this to true to stop the response processing in the asynchronous workflow. */ IotHttpsReturnCode_t bodyTxStatus; /**< @brief The status of network sending the HTTPS body to be returned during the #IotHttpsClientCallbacks_t.writeCallback. */ - bool scheduled; /**< @brief Set to true when this request has already been scheduled to the task pool. */ + bool scheduled; /**< @brief Set to true when this request has already been added to the dispatch queue. */ } _httpsRequest_t; /*-----------------------------------------------------------*/ diff --git a/libraries/c_sdk/standard/https/test/access/iot_test_access_https.h b/libraries/c_sdk/standard/https/test/access/iot_test_access_https.h index 8d1c18e99f3..dd9616a77b4 100644 --- a/libraries/c_sdk/standard/https/test/access/iot_test_access_https.h +++ b/libraries/c_sdk/standard/https/test/access/iot_test_access_https.h @@ -1,5 +1,5 @@ /* - * FreeRTOS HTTPS Client V1.1.3 + * FreeRTOS HTTPS Client V1.2.0 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/https/test/access/iot_test_access_https_client.c b/libraries/c_sdk/standard/https/test/access/iot_test_access_https_client.c index 7faf30d0b8b..14cd7a2a8fc 100644 --- a/libraries/c_sdk/standard/https/test/access/iot_test_access_https_client.c +++ b/libraries/c_sdk/standard/https/test/access/iot_test_access_https_client.c @@ -1,5 +1,5 @@ /* - * FreeRTOS HTTPS Client V1.1.3 + * FreeRTOS HTTPS Client V1.2.0 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/https/test/system/iot_tests_https_system.c b/libraries/c_sdk/standard/https/test/system/iot_tests_https_system.c index e8a2954bd09..c9f66d6fca0 100644 --- a/libraries/c_sdk/standard/https/test/system/iot_tests_https_system.c +++ b/libraries/c_sdk/standard/https/test/system/iot_tests_https_system.c @@ -1,5 +1,5 @@ /* - * FreeRTOS HTTPS Client V1.1.3 + * FreeRTOS HTTPS Client V1.2.0 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -240,7 +240,6 @@ static IotHttpsConnectionInfo_t _connInfo = .pAddress = IOT_TEST_HTTPS_SERVER_HOST_NAME, .addressLen = sizeof( IOT_TEST_HTTPS_SERVER_HOST_NAME ) - 1, .port = IOT_TEST_HTTPS_PORT, - .flags = 0, .userBuffer.pBuffer = _pConnUserBuffer, .userBuffer.bufferLen = sizeof( _pConnUserBuffer ), #if IOT_TEST_SECURED_CONNECTION == 1 @@ -252,7 +251,10 @@ static IotHttpsConnectionInfo_t _connInfo = .privateKeyLen = sizeof( IOT_TEST_HTTPS_CLIENT_PRIVATE_KEY ), .pAlpnProtocols = IOT_TEST_HTTPS_ALPN_PROTOCOLS, .alpnProtocolsLen = sizeof( IOT_TEST_HTTPS_ALPN_PROTOCOLS ), - #endif + .flags = 0, + #else + .flags = IOT_HTTPS_IS_NON_TLS_FLAG, + #endif /* if IOT_TEST_SECURED_CONNECTION == 1 */ .pNetworkInterface = NULL /* This will be set during TEST_SETUP(). */ }; diff --git a/libraries/c_sdk/standard/https/test/unit/iot_tests_https_async.c b/libraries/c_sdk/standard/https/test/unit/iot_tests_https_async.c index a96782e863a..e7bc99141ad 100644 --- a/libraries/c_sdk/standard/https/test/unit/iot_tests_https_async.c +++ b/libraries/c_sdk/standard/https/test/unit/iot_tests_https_async.c @@ -1,5 +1,5 @@ /* - * FreeRTOS HTTPS Client V1.1.3 + * FreeRTOS HTTPS Client V1.2.0 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/https/test/unit/iot_tests_https_client.c b/libraries/c_sdk/standard/https/test/unit/iot_tests_https_client.c index d2f57022363..ef847fac69a 100644 --- a/libraries/c_sdk/standard/https/test/unit/iot_tests_https_client.c +++ b/libraries/c_sdk/standard/https/test/unit/iot_tests_https_client.c @@ -1,5 +1,5 @@ /* - * FreeRTOS HTTPS Client V1.1.3 + * FreeRTOS HTTPS Client V1.2.0 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -850,7 +850,7 @@ TEST( HTTPS_Client_Unit_API, AddHeaderMultipleHeaders ) IotHttpsReturnCode_t returnCode = IOT_HTTPS_OK; IotHttpsRequestHandle_t reqHandle = IOT_HTTPS_REQUEST_HANDLE_INITIALIZER; - /* Intead of iterating in a loop, all the dummy headers are declared immediately because in the unit testing + /* Instead of iterating in a loop, all the dummy headers are declared immediately because in the unit testing * infrastructure and workflow the number of repetitions is typically not changed from the original. */ char * pHeader0 = "header0"; char * pHeader1 = "header1"; diff --git a/libraries/c_sdk/standard/https/test/unit/iot_tests_https_common.c b/libraries/c_sdk/standard/https/test/unit/iot_tests_https_common.c index 293e424df76..665627c0fcd 100644 --- a/libraries/c_sdk/standard/https/test/unit/iot_tests_https_common.c +++ b/libraries/c_sdk/standard/https/test/unit/iot_tests_https_common.c @@ -1,5 +1,5 @@ /* - * FreeRTOS HTTPS Client V1.1.3 + * FreeRTOS HTTPS Client V1.2.0 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/https/test/unit/iot_tests_https_common.h b/libraries/c_sdk/standard/https/test/unit/iot_tests_https_common.h index 0eda036bbec..8d1c7431b46 100644 --- a/libraries/c_sdk/standard/https/test/unit/iot_tests_https_common.h +++ b/libraries/c_sdk/standard/https/test/unit/iot_tests_https_common.h @@ -1,5 +1,5 @@ /* - * FreeRTOS HTTPS Client V1.1.3 + * FreeRTOS HTTPS Client V1.2.0 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/https/test/unit/iot_tests_https_sync.c b/libraries/c_sdk/standard/https/test/unit/iot_tests_https_sync.c index 8d00e1ce79a..3fa46494b2e 100644 --- a/libraries/c_sdk/standard/https/test/unit/iot_tests_https_sync.c +++ b/libraries/c_sdk/standard/https/test/unit/iot_tests_https_sync.c @@ -1,5 +1,5 @@ /* - * FreeRTOS HTTPS Client V1.1.3 + * FreeRTOS HTTPS Client V1.2.0 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/https/test/unit/iot_tests_https_utils.c b/libraries/c_sdk/standard/https/test/unit/iot_tests_https_utils.c index 747e7f8ca59..d7409bd8521 100644 --- a/libraries/c_sdk/standard/https/test/unit/iot_tests_https_utils.c +++ b/libraries/c_sdk/standard/https/test/unit/iot_tests_https_utils.c @@ -1,5 +1,5 @@ /* - * FreeRTOS HTTPS Client V1.1.3 + * FreeRTOS HTTPS Client V1.2.0 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/CODESIZE.md b/libraries/c_sdk/standard/mqtt/CODESIZE.md new file mode 100644 index 00000000000..4688a0b8e6d --- /dev/null +++ b/libraries/c_sdk/standard/mqtt/CODESIZE.md @@ -0,0 +1,45 @@ +# Code size of MQTT Compatibility Layer + +Code size for the MQTT Compatibility Layer is calculated using GCC for ARM Cortex-M4 on [FreeRTOS 202011.00 release](https://github.com/aws/amazon-freertos/releases/tag/202011.00). Build for calculating code size is done using build configuration for [Cypress CY8CKIT-064S0S2-4343W](https://docs.aws.amazon.com/freertos/latest/userguide/getting_started_cypress_psoc64.html) by using the Release configuration. All logs were disabled in this build. Refer to the table below for calculated code sizes. + +| File | With -O1 Optimization | With -Os Optimization | +| :-: | :-: | :-: | +| iot_mqtt_agent.c | 1.3K | 1.1K | +| iot_mqtt_api.c | 3.8K | 3.3K | +| iot_mqtt_context_connection.c | 0.2K | 0.2K | +| iot_mqtt_managed_function_wrapper.c | 0.9K | 0.9K | +| iot_mqtt_mutex_wrapper.c | 0.4K | 0.3K | +| iot_mqtt_network.c | 1.2K | 1.1K | +| iot_mqtt_operation.c | 2.6K | 2.4K | +| iot_mqtt_publish_duplicates.c | 0.2K | 0.2K | +| iot_mqtt_serializer_deserializer_wrapper.c | 2.0K | 1.8K | +| iot_mqtt_subscription.c | 1.3K | 1.2K | +| iot_mqtt_subscription_container.c | 0.6K | 0.6K | +| iot_mqtt_validate.c | 0.5K | 0.4K | +| **Total estimate** | **15K** | **13.5K** | + +The MQTT Compatibility Layer is implemented using the [coreMQTT library](https://github.com/FreeRTOS/coreMQTT/blob/master/README.md). In addition, the MQTT Compatibility Layer maintains all dependencies of MQTT V2.x.x library. To account for the total code size of the MQTT Compatibility Layer, code sizes for all dependencies have been considered (see below). + +1. **The coreMQTT library** : The MQTT Compatibility Layer is implemented using [coreMQTT library](https://github.com/FreeRTOS/coreMQTT/blob/master/README.md). Memory estimates for [coreMQTT library](https://github.com/FreeRTOS/coreMQTT/blob/master/README.md) can be found in the documentation [here](https://freertos.org/mqtt/index.html). + +2. **Task Pool library** : The MQTT Compatibility Layer depends on [Task Pool library](https://docs.aws.amazon.com/freertos/latest/lib-ref/embedded-csdk/v4.0_beta_deprecated/lib-ref/c-sdk/taskpool/index.html). Refer to the table below for calculated code size of Task Pool library. + +| File | With -O1 Optimization | With -Os Optimization | +| :-: | :-: | :-: | +| iot_taskpool.c | 3.8K | 3.0K | +| **Total estimate** | **3.8K** | **3.0K** | + +Note that the Task Pool library may not be exclusively used by the MQTT Compatibility Layer, but may be shared by other libraries. However, this Task Pool library is not used by any of the [redesigned libraries for LTS](https://www.freertos.org/ltsroadmap.html). + +3. **Platform Abstraction** : This MQTT Compatibility Layer depends on the implementation of Platform Abstraction for Network, Clock and Threads. The code size is calculated for the [FreeRTOS implementation of Abstraction Layer](../../../abstractions/platform/freertos) and is added in the table below. + +| File | With -O1 Optimization | With -Os Optimization | +| :-: | :-: | :-: | +| iot_clock_freertos.c | 0.5K | 0.5K | +| iot_network_freertos.c | 1.2K | 1.1K | +| iot_threads_freertos.c | 0.7K | 0.7K | +| **Total estimate** | **2.4K** | **2.3K** | + +Note that the implementation for Platform Abstraction may not be exclusively used by the MQTT Compatibility Layer, but may be shared by other libraries. However, this Platform Abstraction is not used by any of the [redesigned libraries for LTS](https://www.freertos.org/ltsroadmap.html). + +4. **Linear Containers** : This MQTT Compatibility Layer depends on [Linear Containers](https://docs.aws.amazon.com/freertos/latest/lib-ref/embedded-csdk/v4.0_beta_deprecated/lib-ref/c-sdk/linear_containers/index.html). However, this implementation is in [c header file](../common/include/iot_linear_containers.h) and the code sizes are already accounted for in the calculated sizes of this MQTT Compatibility Layer. diff --git a/libraries/c_sdk/standard/mqtt/README.md b/libraries/c_sdk/standard/mqtt/README.md index 5d6dd196e7c..2fdbe9cda1c 100644 --- a/libraries/c_sdk/standard/mqtt/README.md +++ b/libraries/c_sdk/standard/mqtt/README.md @@ -1,18 +1,29 @@ -# MQTT Shim for MQTT V2.x.x APIs +# MQTT Compatibility Layer -This MQTT shim library supports backward compatibility for the MQTT V2.x.x APIs using the [coreMQTT library](../../../coreMQTT/README.md). All the [APIs in MQTT v2.x.x](include/iot_mqtt.h) are supported in this shim implementation. -This shim will be supported only as a short term solution to provide backward compatibility. We recommend using the redesigned [coreMQTT library](../../../coreMQTT/README.md) for applications requiring long term support. +MQTT Compatibility Layer provides backward compatibility from [coreMQTT library](https://github.com/FreeRTOS/coreMQTT/blob/master/README.md) to [MQTT V2.x.x APIs](include/iot_mqtt.h). **We recommend that you use the coreMQTT library for optimized memory usage and modularity, but you can use the MQTT Compatibility Layer when you do not have the flexibility.** -## MQTT Shim library configs +## Configs for MQTT Compatibility Layer -Configuration settings of the MQTT shim library. These configurations are available in addition to the configurations of MQTT V2.x.x library. +Configuration settings for the MQTT Compatibility Layer, are available in addition to the [configurations of MQTT V2.x.x library](https://docs.aws.amazon.com/freertos/latest/lib-ref/embedded-csdk/v4.0_beta_deprecated/lib-ref/c-sdk/mqtt/mqtt_config.html). -Configuration settings are C pre-processor constants. They can be set with a #define in the config file (iot_config.h) or by using a compiler option such as -D in gcc. If a configuration setting is not defined, the library will use a "sensible" default value (unless otherwise noted). Because they are compile-time constants, a library must be rebuilt if a configuration setting is changed. +Configuration settings are C pre-processor constants. They can be set with a #define in the config file (iot_config.h) or by using a compiler option such as -D in gcc. If a configuration setting is not defined, the MQTT Compatibility Layer will use a "sensible" default value (unless otherwise noted). Because they are compile-time constants, this MQTT Compatibility Layer must be rebuilt if a configuration setting is changed. -1. `MAX_NO_OF_MQTT_CONNECTIONS` - Maximum number of MQTT connections that can be handled by the MQTT shim at a time. Default value is 2. +1. `MAX_NO_OF_MQTT_CONNECTIONS` - Maximum number of MQTT connections that can be handled by the MQTT Compatibility Layer at a time. Default value is 2. 2. `MAX_NO_OF_MQTT_SUBSCRIPTIONS` - Maximum number of active MQTT subscriptions per MQTT connection. Default value is 10. -3. `NETWORK_BUFFER_SIZE` - Static network buffer size for the MQTT packets to be sent using the MQTT shim. Please note that a different buffer is used for receiving MQTT packets and is dynamically allocated. Default value is 1024. +3. `NETWORK_BUFFER_SIZE` - Static network buffer size for the MQTT packets to be sent using the MQTT Compatibility Layer. Please note that a different buffer is used for receiving MQTT packets. Default value is 1024. -**Note:** The config `IOT_MQTT_ENABLE_SERIALIZER_OVERRIDES` to override serializer APIs is not supported in this MQTT shim implementation. [MQTT over BLE](https://docs.aws.amazon.com/freertos/latest/userguide/ble-demo.html#ble-demo-mqtt) is redesigned to avoid the dependency on this config by using a [BLE transport implementation](../ble/src/services/mqtt_ble/iot_ble_mqtt_transport.c). +**Note:** The config `IOT_MQTT_ENABLE_SERIALIZER_OVERRIDES` to override serializer APIs is not supported in the MQTT Compatibility Layer. [MQTT over BLE](https://docs.aws.amazon.com/freertos/latest/userguide/ble-demo.html#ble-demo-mqtt) was dependent on this config. However, starting from [FreeRTOS 202011.00 release](https://github.com/aws/amazon-freertos/releases/tag/202011.00), MQTT over BLE is redesigned to avoid the dependency on this config by using a [BLE transport implementation](../ble/src/services/mqtt_ble/iot_ble_mqtt_transport.c). Please note that applications using MQTT over BLE with MQTT V2.x.x APIs will continue to work with this MQTT Compatibility Layer without having a dependency on the config `IOT_MQTT_ENABLE_SERIALIZER_OVERRIDES`. + +## Code size of MQTT Compatibility Layer + +Code sizes are calculated for the MQTT Compatibility Layer on [FreeRTOS 202011.00 release](https://github.com/aws/amazon-freertos/releases/tag/202011.00). In order to calculate the total cost to memory of the MQTT Compatibility Layer, the code sizes of its dependencies are also included. MQTT Compatibility Layer and its dependencies have a code size of **24.5KB** with `-Os` compiler optimization. +Please be aware that, this code size is about 18KB higher than the code size required by the [coreMQTT library](https://github.com/FreeRTOS/coreMQTT/blob/master/README.md). + +**Note** Refer to the [CODESIZE.md](CODESIZE.md) for more details about the calculation of code sizes for the MQTT Compatibility Layer and the [coreMQTT FreeRTOS documentation](https://freertos.org/mqtt/index.html) for coreMQTT library. + + +## Tasks required for MQTT Compatibility Layer + +The MQTT Compatibility Layer has a run time dependency on tasks created by Task Pool and Network Interface implementation, in addition to the system tasks. Task Pool creates `IotTaskPoolInfo.minThreads` number of tasks and the Network Interface implementation creates a task to receive from the network. diff --git a/libraries/c_sdk/standard/mqtt/include/iot_mqtt.h b/libraries/c_sdk/standard/mqtt/include/iot_mqtt.h index 420f350f7af..06a3194e09e 100644 --- a/libraries/c_sdk/standard/mqtt/include/iot_mqtt.h +++ b/libraries/c_sdk/standard/mqtt/include/iot_mqtt.h @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/include/iot_mqtt_agent.h b/libraries/c_sdk/standard/mqtt/include/iot_mqtt_agent.h index f27746ee78c..8b5b6da4b86 100644 --- a/libraries/c_sdk/standard/mqtt/include/iot_mqtt_agent.h +++ b/libraries/c_sdk/standard/mqtt/include/iot_mqtt_agent.h @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/include/iot_mqtt_agent_config_defaults.h b/libraries/c_sdk/standard/mqtt/include/iot_mqtt_agent_config_defaults.h index 4bca5f1693f..d0ab25e40ad 100644 --- a/libraries/c_sdk/standard/mqtt/include/iot_mqtt_agent_config_defaults.h +++ b/libraries/c_sdk/standard/mqtt/include/iot_mqtt_agent_config_defaults.h @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/include/iot_mqtt_config_defaults.h b/libraries/c_sdk/standard/mqtt/include/iot_mqtt_config_defaults.h index b5764e8fa6f..17ccc57fad8 100644 --- a/libraries/c_sdk/standard/mqtt/include/iot_mqtt_config_defaults.h +++ b/libraries/c_sdk/standard/mqtt/include/iot_mqtt_config_defaults.h @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/include/iot_mqtt_lib.h b/libraries/c_sdk/standard/mqtt/include/iot_mqtt_lib.h index 5b5ecf546b8..49803c8796e 100644 --- a/libraries/c_sdk/standard/mqtt/include/iot_mqtt_lib.h +++ b/libraries/c_sdk/standard/mqtt/include/iot_mqtt_lib.h @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/include/types/iot_mqtt_types.h b/libraries/c_sdk/standard/mqtt/include/types/iot_mqtt_types.h index 9c9568cdbdd..bd7ca6a1717 100644 --- a/libraries/c_sdk/standard/mqtt/include/types/iot_mqtt_types.h +++ b/libraries/c_sdk/standard/mqtt/include/types/iot_mqtt_types.h @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_agent.c b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_agent.c index 52a19b03f9f..2734107e3ed 100644 --- a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_agent.c +++ b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_agent.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_api.c b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_api.c index 66ad63a8de8..7e4775c99a7 100644 --- a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_api.c +++ b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_api.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -78,26 +78,6 @@ static SemaphoreHandle_t connContextMutex; /*-----------------------------------------------------------*/ -/** - * @brief Set the unsubscribed flag of an MQTT subscription. - * - * @param[in] pSubscriptionLink Pointer to the link member of an #_mqttSubscription_t. - * @param[in] pMatch Not used. - * - * @return Always returns `true`. - */ -static bool _mqttSubscription_setUnsubscribe( const IotLink_t * pSubscriptionLink, - void * pMatch ); - -/** - * @brief Destroy an MQTT subscription if its reference count is 0. - * - * @param[in] pData The subscription to destroy. This parameter is of type - * `void*` for compatibility with [free] - * (http://pubs.opengroup.org/onlinepubs/9699919799/functions/free.html). - */ -static void _mqttSubscription_tryDestroy( void * pData ); - /** * @brief Decrement the reference count of an MQTT operation and attempt to * destroy it. @@ -218,51 +198,6 @@ static int32_t transportSend( NetworkContext_t * pNetworkContext, /*-----------------------------------------------------------*/ -static bool _mqttSubscription_setUnsubscribe( const IotLink_t * pSubscriptionLink, - void * pMatch ) -{ - /* Because this function is called from a container function, the given link - * must never be NULL. */ - IotMqtt_Assert( pSubscriptionLink != NULL ); - - _mqttSubscription_t * pSubscription = IotLink_Container( _mqttSubscription_t, - pSubscriptionLink, - link ); - - /* Silence warnings about unused parameters. */ - ( void ) pMatch; - - /* Set the unsubscribed flag. */ - pSubscription->unsubscribed = true; - - return true; -} - -/*-----------------------------------------------------------*/ - -static void _mqttSubscription_tryDestroy( void * pData ) -{ - _mqttSubscription_t * pSubscription = ( _mqttSubscription_t * ) pData; - - /* Reference count must not be negative. */ - IotMqtt_Assert( pSubscription->references >= 0 ); - - /* Unsubscribed flag should be set. */ - IotMqtt_Assert( pSubscription->unsubscribed == true ); - - /* Free the subscription if it has no references. */ - if( pSubscription->references == 0 ) - { - IotMqtt_FreeSubscription( pSubscription ); - } - else - { - EMPTY_ELSE_MARKER; - } -} - -/*-----------------------------------------------------------*/ - static void _mqttOperation_tryDestroy( void * pData ) { _mqttOperation_t * pOperation = ( _mqttOperation_t * ) pData; @@ -1666,7 +1601,6 @@ IotMqttError_t IotMqtt_Publish( IotMqttConnection_t mqttConnection, { IOT_FUNCTION_ENTRY( IotMqttError_t, IOT_MQTT_SUCCESS ); _mqttOperation_t * pOperation = NULL; - uint8_t ** pPacketIdentifierHigh = NULL; /* Check that the PUBLISH information is valid. */ if( _IotMqtt_ValidatePublish( mqttConnection->awsIotMqttMode, @@ -1751,16 +1685,6 @@ IotMqttError_t IotMqtt_Publish( IotMqttConnection_t mqttConnection, IotMqtt_Assert( pOperation->u.operation.status == IOT_MQTT_STATUS_PENDING ); pOperation->u.operation.type = IOT_MQTT_PUBLISH_TO_SERVER; - /* In AWS IoT MQTT mode, a pointer to the packet identifier must be saved. */ - if( mqttConnection->awsIotMqttMode == true ) - { - pPacketIdentifierHigh = &( pOperation->u.operation.pPacketIdentifierHigh ); - } - else - { - EMPTY_ELSE_MARKER; - } - /* Initialize PUBLISH retry if retryLimit is set. */ if( pPublishInfo->retryLimit > 0 ) { diff --git a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_context_connection.c b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_context_connection.c index 2b9f00f9d27..04c0ff1050f 100644 --- a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_context_connection.c +++ b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_context_connection.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_managed_function_wrapper.c b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_managed_function_wrapper.c index 944e6c73cdb..d43cd71d808 100644 --- a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_managed_function_wrapper.c +++ b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_managed_function_wrapper.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT SHIM V1.1.1 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_mutex_wrapper.c b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_mutex_wrapper.c index a458b4289a9..8db90a593dc 100644 --- a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_mutex_wrapper.c +++ b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_mutex_wrapper.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright(C) 2020 Amazon.com, Inc. or its affiliates.All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_network.c b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_network.c index 1401ab18247..4e4e39f39f6 100644 --- a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_network.c +++ b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_network.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_operation.c b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_operation.c index 764b42999fb..e414a8191ff 100644 --- a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_operation.c +++ b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_operation.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_publish_duplicates.c b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_publish_duplicates.c index e9411940fda..3bace2bb459 100644 --- a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_publish_duplicates.c +++ b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_publish_duplicates.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -98,22 +98,6 @@ static uint16_t _nextPacketIdentifier( void ); /*-----------------------------------------------------------*/ -#if LIBRARY_LOG_LEVEL > IOT_LOG_NONE - -/** - * @brief If logging is enabled, define a log configuration that only prints the log - * string. This is used when printing out details of deserialized MQTT packets. - */ - static const IotLogConfig_t _logHideAll = - { - .hideLibraryName = true, - .hideLogLevel = true, - .hideTimestring = true - }; -#endif - -/*-----------------------------------------------------------*/ - static uint16_t _nextPacketIdentifier( void ) { /* MQTT specifies 2 bytes for the packet identifier; however, operating on diff --git a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_serializer_deserializer_wrapper.c b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_serializer_deserializer_wrapper.c index e11eee1e153..5d446edf8ac 100644 --- a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_serializer_deserializer_wrapper.c +++ b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_serializer_deserializer_wrapper.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_static_memory.c b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_static_memory.c index 36a82a25ada..8cf391cce0d 100644 --- a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_static_memory.c +++ b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_static_memory.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_subscription.c b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_subscription.c index 843fbb9e8c3..06f072d3e29 100644 --- a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_subscription.c +++ b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_subscription.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -49,251 +49,6 @@ extern _connContext_t connToContext[ MAX_NO_OF_MQTT_CONNECTIONS ]; /*-----------------------------------------------------------*/ -/*-----------------------------------------------------------*/ - -/** - * @brief Matches a topic name (from a publish) with a topic filter (from a - * subscription). - * - * @param[in] pSubscriptionLink Pointer to the link member of an #_mqttSubscription_t. - * @param[in] pMatch Pointer to a #_topicMatchParams_t. - * - * @return `true` if the arguments match the subscription topic filter; `false` - * otherwise. - */ -static bool _topicMatch( const IotLink_t * pSubscriptionLink, - void * pMatch ); - -/** - * @brief Matches a packet identifier and order. - * - * @param[in] pSubscriptionLink Pointer to the link member of an #_mqttSubscription_t. - * @param[in] pMatch Pointer to a #_packetMatchParams_t. - * - * @return `true` if the arguments match the subscription's packet info; `false` - * otherwise. - */ -static bool _packetMatch( const IotLink_t * pSubscriptionLink, - void * pMatch ); - -/*-----------------------------------------------------------*/ - -static bool _topicMatch( const IotLink_t * pSubscriptionLink, - void * pMatch ) -{ - IOT_FUNCTION_ENTRY( bool, false ); - uint16_t nameIndex = 0, filterIndex = 0; - - /* Because this function is called from a container function, the given link - * must never be NULL. */ - IotMqtt_Assert( pSubscriptionLink != NULL ); - - _mqttSubscription_t * pSubscription = IotLink_Container( _mqttSubscription_t, - pSubscriptionLink, - link ); - _topicMatchParams_t * pParam = ( _topicMatchParams_t * ) pMatch; - - /* Extract the relevant strings and lengths from parameters. */ - const char * pTopicName = pParam->pTopicName; - const char * pTopicFilter = pSubscription->pTopicFilter; - const uint16_t topicNameLength = pParam->topicNameLength; - const uint16_t topicFilterLength = pSubscription->topicFilterLength; - - /* Check for an exact match. */ - if( topicNameLength == topicFilterLength ) - { - status = ( strncmp( pTopicName, pTopicFilter, topicNameLength ) == 0 ); - - IOT_GOTO_CLEANUP(); - } - else - { - EMPTY_ELSE_MARKER; - } - - /* If the topic lengths are different but an exact match is required, return - * false. */ - if( pParam->exactMatchOnly == true ) - { - IOT_SET_AND_GOTO_CLEANUP( false ); - } - else - { - EMPTY_ELSE_MARKER; - } - - while( ( nameIndex < topicNameLength ) && ( filterIndex < topicFilterLength ) ) - { - /* Check if the character in the topic name matches the corresponding - * character in the topic filter string. */ - if( pTopicName[ nameIndex ] == pTopicFilter[ filterIndex ] ) - { - /* Handle special corner cases as documented by the MQTT protocol spec. */ - - /* Filter "sport/#" also matches "sport" since # includes the parent level. */ - if( nameIndex == topicNameLength - 1 ) - { - if( filterIndex == topicFilterLength - 3 ) - { - if( pTopicFilter[ filterIndex + 1 ] == '/' ) - { - if( pTopicFilter[ filterIndex + 2 ] == '#' ) - { - IOT_SET_AND_GOTO_CLEANUP( true ); - } - else - { - EMPTY_ELSE_MARKER; - } - } - else - { - EMPTY_ELSE_MARKER; - } - } - else - { - EMPTY_ELSE_MARKER; - } - } - else - { - EMPTY_ELSE_MARKER; - } - - /* Filter "sport/+" also matches the "sport/" but not "sport". */ - if( nameIndex == topicNameLength - 1 ) - { - if( filterIndex == topicFilterLength - 2 ) - { - if( pTopicFilter[ filterIndex + 1 ] == '+' ) - { - IOT_SET_AND_GOTO_CLEANUP( true ); - } - else - { - EMPTY_ELSE_MARKER; - } - } - else - { - EMPTY_ELSE_MARKER; - } - } - else - { - EMPTY_ELSE_MARKER; - } - } - else - { - /* Check for wildcards. */ - if( pTopicFilter[ filterIndex ] == '+' ) - { - /* Move topic name index to the end of the current level. - * This is identified by '/'. */ - while( nameIndex < topicNameLength && pTopicName[ nameIndex ] != '/' ) - { - nameIndex++; - } - - /* Increment filter index to skip '/'. */ - filterIndex++; - continue; - } - else if( pTopicFilter[ filterIndex ] == '#' ) - { - /* Subsequent characters don't need to be checked if the for the - * multi-level wildcard. */ - IOT_SET_AND_GOTO_CLEANUP( true ); - } - else - { - /* Any character mismatch other than '+' or '#' means the topic - * name does not match the topic filter. */ - IOT_SET_AND_GOTO_CLEANUP( false ); - } - } - - /* Increment indexes. */ - nameIndex++; - filterIndex++; - } - - /* If the end of both strings has been reached, they match. */ - if( ( nameIndex == topicNameLength ) && ( filterIndex == topicFilterLength ) ) - { - IOT_SET_AND_GOTO_CLEANUP( true ); - } - else - { - EMPTY_ELSE_MARKER; - } - - IOT_FUNCTION_EXIT_NO_CLEANUP(); -} - -/*-----------------------------------------------------------*/ - -static bool _packetMatch( const IotLink_t * pSubscriptionLink, - void * pMatch ) -{ - bool match = false; - - /* Because this function is called from a container function, the given link - * must never be NULL. */ - IotMqtt_Assert( pSubscriptionLink != NULL ); - - _mqttSubscription_t * pSubscription = IotLink_Container( _mqttSubscription_t, - pSubscriptionLink, - link ); - _packetMatchParams_t * pParam = ( _packetMatchParams_t * ) pMatch; - - /* Compare packet identifiers. */ - if( pParam->packetIdentifier == pSubscription->packetInfo.identifier ) - { - /* Compare orders if order is not -1. */ - if( pParam->order == -1 ) - { - match = true; - } - else - { - match = ( ( size_t ) pParam->order ) == pSubscription->packetInfo.order; - } - } - - /* If this subscription should be removed, check the reference count. */ - if( match == true ) - { - /* Reference count must not be negative. */ - IotMqtt_Assert( pSubscription->references >= 0 ); - - /* If the reference count is positive, this subscription cannot be - * removed yet because there are subscription callbacks using it. */ - if( pSubscription->references > 0 ) - { - match = false; - - /* Set the unsubscribed flag. The last active subscription callback - * will remove and clean up this subscription. */ - pSubscription->unsubscribed = true; - } - else - { - EMPTY_ELSE_MARKER; - } - } - else - { - EMPTY_ELSE_MARKER; - } - - return match; -} - -/*-----------------------------------------------------------*/ - IotMqttError_t _IotMqtt_AddSubscriptions( _mqttConnection_t * pMqttConnection, uint16_t subscribePacketIdentifier, const IotMqttSubscription_t * pSubscriptionList, @@ -675,8 +430,3 @@ bool IotMqtt_IsSubscribed( IotMqttConnection_t mqttConnection, } /*-----------------------------------------------------------*/ - -/* Provide access to internal functions and variables if testing. */ -#if IOT_BUILD_TESTS == 1 - #include "iot_test_access_mqtt_subscription.c" -#endif diff --git a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_subscription_container.c b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_subscription_container.c index 199d8c4c7da..2c2dc78b6c0 100644 --- a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_subscription_container.c +++ b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_subscription_container.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright(C) 2020 Amazon.com, Inc. or its affiliates.All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -343,3 +343,8 @@ int8_t IotMqtt_FindFirstMatch( _mqttSubscription_t * pSubscriptionArray, } /*-----------------------------------------------------------*/ + +/* Provide access to internal functions and variables if testing. */ +#if IOT_BUILD_TESTS == 1 + #include "iot_test_access_mqtt_subscription.c" +#endif diff --git a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_validate.c b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_validate.c index bd635f2bd99..604772fe585 100644 --- a/libraries/c_sdk/standard/mqtt/src/iot_mqtt_validate.c +++ b/libraries/c_sdk/standard/mqtt/src/iot_mqtt_validate.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/src/private/iot_mqtt_internal.h b/libraries/c_sdk/standard/mqtt/src/private/iot_mqtt_internal.h index da7b830df4e..fc968de7d47 100644 --- a/libraries/c_sdk/standard/mqtt/src/private/iot_mqtt_internal.h +++ b/libraries/c_sdk/standard/mqtt/src/private/iot_mqtt_internal.h @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt.h b/libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt.h index 77db92762c5..67eeaedeefb 100644 --- a/libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt.h +++ b/libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt.h @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -67,7 +67,7 @@ _mqttConnection_t * IotTestMqtt_createMqttConnection( bool awsIotMqttMode, * * @see #_topicMatch. */ -bool IotTestMqtt_topicMatch( const IotLink_t * pSubscriptionLink, +bool IotTestMqtt_topicMatch( _mqttSubscription_t * pSubscription, void * pMatch ); /** @@ -75,7 +75,7 @@ bool IotTestMqtt_topicMatch( const IotLink_t * pSubscriptionLink, * * @see #_packetMatch. */ -bool IotTestMqtt_packetMatch( const IotLink_t * pSubscriptionLink, +bool IotTestMqtt_packetMatch( _mqttSubscription_t * pSubscription, void * pMatch ); /** diff --git a/libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt_api.c b/libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt_api.c index 72f47176806..a2bccb2a245 100644 --- a/libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt_api.c +++ b/libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt_api.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt_context_connection.c b/libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt_context_connection.c index e579a83f11d..ce0e81a6647 100644 --- a/libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt_context_connection.c +++ b/libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt_context_connection.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt_subscription.c b/libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt_subscription.c index 14b46c33f68..3aec48d0030 100644 --- a/libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt_subscription.c +++ b/libraries/c_sdk/standard/mqtt/test/access/iot_test_access_mqtt_subscription.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -26,32 +26,32 @@ /** * @file iot_test_access_mqtt_subscription.c * @brief Provides access to the internal functions and variables of - * iot_mqtt_subscription.c + * iot_mqtt_subscription_container.c * - * This file should only be included at the bottom of iot_mqtt_subscription.c + * This file should only be included at the bottom of iot_mqtt_subscription_container.c * and never compiled by itself. */ -bool IotTestMqtt_topicMatch( const IotLink_t * pSubscriptionLink, +bool IotTestMqtt_topicMatch( _mqttSubscription_t * pSubscription, void * pMatch ); -bool IotTestMqtt_packetMatch( const IotLink_t * pSubscriptionLink, +bool IotTestMqtt_packetMatch( _mqttSubscription_t * pSubscription, void * pMatch ); /*-----------------------------------------------------------*/ -bool IotTestMqtt_topicMatch( const IotLink_t * pSubscriptionLink, +bool IotTestMqtt_topicMatch( _mqttSubscription_t * pSubscription, void * pMatch ) { - return _topicMatch( pSubscriptionLink, pMatch ); + return _topicMatch( pSubscription, pMatch ); } /*-----------------------------------------------------------*/ -bool IotTestMqtt_packetMatch( const IotLink_t * pSubscriptionLink, +bool IotTestMqtt_packetMatch( _mqttSubscription_t * pSubscription, void * pMatch ) { - return _packetMatch( pSubscriptionLink, pMatch ); + return _packetMatch( pSubscription, pMatch ); } /*-----------------------------------------------------------*/ diff --git a/libraries/c_sdk/standard/mqtt/test/iot_test_mqtt_agent.c b/libraries/c_sdk/standard/mqtt/test/iot_test_mqtt_agent.c index badb0984a56..dc615232296 100644 --- a/libraries/c_sdk/standard/mqtt/test/iot_test_mqtt_agent.c +++ b/libraries/c_sdk/standard/mqtt/test/iot_test_mqtt_agent.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/test/mock/iot_tests_mqtt_mock.c b/libraries/c_sdk/standard/mqtt/test/mock/iot_tests_mqtt_mock.c index ef95057234a..c67abcfe177 100644 --- a/libraries/c_sdk/standard/mqtt/test/mock/iot_tests_mqtt_mock.c +++ b/libraries/c_sdk/standard/mqtt/test/mock/iot_tests_mqtt_mock.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/test/mock/iot_tests_mqtt_mock.h b/libraries/c_sdk/standard/mqtt/test/mock/iot_tests_mqtt_mock.h index a27f5743d05..d9db0b1fa7e 100644 --- a/libraries/c_sdk/standard/mqtt/test/mock/iot_tests_mqtt_mock.h +++ b/libraries/c_sdk/standard/mqtt/test/mock/iot_tests_mqtt_mock.h @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/test/system/iot_tests_mqtt_system.c b/libraries/c_sdk/standard/mqtt/test/system/iot_tests_mqtt_system.c index a04b23e8783..b237914e5ee 100644 --- a/libraries/c_sdk/standard/mqtt/test/system/iot_tests_mqtt_system.c +++ b/libraries/c_sdk/standard/mqtt/test/system/iot_tests_mqtt_system.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_api.c b/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_api.c index 8740e2f82a8..d27e9af1ae2 100644 --- a/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_api.c +++ b/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_api.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_metrics.c b/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_metrics.c index f9260c5e896..51619290b1c 100644 --- a/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_metrics.c +++ b/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_metrics.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_receive.c b/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_receive.c index df256dad73a..36938b70de0 100644 --- a/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_receive.c +++ b/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_receive.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_subscription.c b/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_subscription.c index 2df459257fc..61bd0545949 100644 --- a/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_subscription.c +++ b/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_subscription.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -118,21 +118,21 @@ extern _connContext_t connToContext[ MAX_NO_OF_MQTT_CONNECTIONS ]; * @note This macro may only be used when a #_mqttSubscription_t pointer named pTopicFilter * is in scope. */ -#define TEST_TOPIC_MATCH( topicNameString, topicFilterString, exactMatch, expectedResult ) \ - { \ - _topicMatchParams_t _topicMatchParams = { 0 }; \ - _topicMatchParams.pTopicName = topicNameString; \ - _topicMatchParams.topicNameLength = ( uint16_t ) strlen( _topicMatchParams.pTopicName ); \ - _topicMatchParams.exactMatchOnly = exactMatch; \ - \ - pTopicFilter->pTopicFilter = IotMqtt_MallocMessage( TOPIC_FILTER_MATCH_MAX_LENGTH ); \ - pTopicFilter->topicFilterLength = ( uint16_t ) snprintf( pTopicFilter->pTopicFilter, \ - TOPIC_FILTER_MATCH_MAX_LENGTH, \ - topicFilterString ); \ - \ - TEST_ASSERT_EQUAL_INT( expectedResult, \ - IotTestMqtt_topicMatch( &( pTopicFilter->link ), &_topicMatchParams ) ); \ - IotMqtt_FreeMessage( pTopicFilter->pTopicFilter ); \ +#define TEST_TOPIC_MATCH( topicNameString, topicFilterString, exactMatch, expectedResult ) \ + { \ + _topicMatchParams_t _topicMatchParams = { 0 }; \ + _topicMatchParams.pTopicName = topicNameString; \ + _topicMatchParams.topicNameLength = ( uint16_t ) strlen( _topicMatchParams.pTopicName ); \ + _topicMatchParams.exactMatchOnly = exactMatch; \ + \ + pTopicFilter->pTopicFilter = IotMqtt_MallocMessage( TOPIC_FILTER_MATCH_MAX_LENGTH ); \ + pTopicFilter->topicFilterLength = ( uint16_t ) snprintf( pTopicFilter->pTopicFilter, \ + TOPIC_FILTER_MATCH_MAX_LENGTH, \ + topicFilterString ); \ + \ + TEST_ASSERT_EQUAL_INT( expectedResult, \ + IotTestMqtt_topicMatch( pTopicFilter, &_topicMatchParams ) ); \ + IotMqtt_FreeMessage( pTopicFilter->pTopicFilter ); \ } /*-----------------------------------------------------------*/ diff --git a/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_validate.c b/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_validate.c index df0eb002345..6db8425eb01 100644 --- a/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_validate.c +++ b/libraries/c_sdk/standard/mqtt/test/unit/iot_tests_mqtt_validate.c @@ -1,5 +1,5 @@ /* - * FreeRTOS MQTT V2.3.0 + * FreeRTOS MQTT V2.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/coreHTTP b/libraries/coreHTTP new file mode 160000 index 00000000000..b349f89e67f --- /dev/null +++ b/libraries/coreHTTP @@ -0,0 +1 @@ +Subproject commit b349f89e67f5feef51438dc09ed89959dedc18d5 diff --git a/libraries/coreJSON b/libraries/coreJSON index 7954c9b4bcc..26fe707548f 160000 --- a/libraries/coreJSON +++ b/libraries/coreJSON @@ -1 +1 @@ -Subproject commit 7954c9b4bcc6db40ee1a83f9d013d28fdcf2556a +Subproject commit 26fe707548fc4e975c453aa4475ae056bb70247b diff --git a/libraries/coreMQTT b/libraries/coreMQTT index 3d4a123fcb2..ff9830a338b 160000 --- a/libraries/coreMQTT +++ b/libraries/coreMQTT @@ -1 +1 @@ -Subproject commit 3d4a123fcb25fd86e6f890804a66bc0d6df92cdc +Subproject commit ff9830a338b6a759c5574f991b02d6f99abadc42 diff --git a/libraries/core_http_demo_dependencies.cmake b/libraries/core_http_demo_dependencies.cmake new file mode 100644 index 00000000000..29813f91287 --- /dev/null +++ b/libraries/core_http_demo_dependencies.cmake @@ -0,0 +1,108 @@ +# core_http module. +afr_module(NAME core_http INTERNAL ) + +# Include HTTP library's source and header path variables. +include("${CMAKE_CURRENT_LIST_DIR}/coreHTTP/httpFilePaths.cmake") + +# Create a list of all header files in the coreHTTP library. +# The list of header files will be added to metadata required +# for the FreeRTOS console. +set(HTTP_HEADER_FILES "") +foreach(http_public_include_dir ${HTTP_INCLUDE_PUBLIC_DIRS}) + file(GLOB http_public_include_header_files + LIST_DIRECTORIES false + ${http_public_include_dir}/*.h ) + list(APPEND HTTP_HEADER_FILES ${http_public_include_header_files}) +endforeach() + +# Add cmake files of module to metadata. +afr_module_cmake_files(${AFR_CURRENT_MODULE} + ${CMAKE_CURRENT_LIST_DIR}/coreHTTP/httpFilePaths.cmake +) + +afr_module_sources( + ${AFR_CURRENT_MODULE} + PRIVATE + ${HTTP_SOURCES} + # Header files added to the target so that these are available + # in code downloaded from the FreeRTOS console. + ${HTTP_HEADER_FILES} +) + +afr_module_include_dirs( + ${AFR_CURRENT_MODULE} + PUBLIC + ${HTTP_INCLUDE_PUBLIC_DIRS} +) + +# Dependency of module on logging stack. +afr_module_dependencies( + ${AFR_CURRENT_MODULE} + PUBLIC + AFR::logging +) +################################################################ + +# core_http_demo_dependencies module. +# Metadata module used for the HTTP library in the FreeRTOS console. +# It represents a collection of module dependencies required +# by the coreHTTP demos. +# This module enables the FreeRTOS console experience of enabling +# library dependencies when selecting the HTTP library, so that the +# coreHTTP demos can be downloaded. +afr_module(NAME core_http_demo_dependencies ) + +afr_set_lib_metadata(ID "core_http_demo_dependencies") +afr_set_lib_metadata(DESCRIPTION "This library implements the HTTP 1.1 client-side protocol.") +afr_set_lib_metadata(DISPLAY_NAME "coreHTTP") +afr_set_lib_metadata(CATEGORY "Connectivity") +afr_set_lib_metadata(VERSION "1.0.0") +afr_set_lib_metadata(IS_VISIBLE "true") + +# Add cmake files of module to metadata. +afr_module_cmake_files(${AFR_CURRENT_MODULE} + ${CMAKE_CURRENT_LIST_DIR}/core_http_demo_dependencies.cmake +) + +afr_module_sources( + ${AFR_CURRENT_MODULE} + PRIVATE + # Adding sources so that CMake can generate the + # core_http_demo_dependencies target; otherwise, it gives the + # "Cannot determine link language for target" error. + ${HTTP_SOURCES} +) + +# Add dependencies of the coreHTTP demos in this target +# to support metadata required for FreeRTOS console. +afr_module_dependencies( + ${AFR_CURRENT_MODULE} + PUBLIC + AFR::core_http + AFR::http_demo_helpers + AFR::backoff_algorithm + AFR::pkcs11_helpers +) + +# Add more dependencies for Secure Sockets based HTTP demo +# (at demos/coreHTTP folder) ONLY if the board supports +# the Secure Sockets library. +if(TARGET AFR::secure_sockets::mcu_port) + afr_module_dependencies( + ${AFR_CURRENT_MODULE} + PUBLIC + AFR::transport_interface_secure_sockets + AFR::secure_sockets + ) +endif() + +# Add dependency on WiFi module so that WiFi library is auto-included +# when selecting core HTTP library on FreeRTOS console for boards that +# support the WiFi library. +if(TARGET AFR::wifi::mcu_port) + afr_module_dependencies( + ${AFR_CURRENT_MODULE} + PUBLIC + AFR::wifi + ) +endif() \ No newline at end of file diff --git a/libraries/core_json.cmake b/libraries/core_json.cmake index cca9cfbf0a3..63b4d6c0acc 100644 --- a/libraries/core_json.cmake +++ b/libraries/core_json.cmake @@ -14,14 +14,18 @@ foreach(json_public_include_dir ${JSON_INCLUDE_PUBLIC_DIRS}) list(APPEND JSON_HEADER_FILES ${json_public_include_header_files}) endforeach() +# Add cmake files of module to metadata. +afr_module_cmake_files(${AFR_CURRENT_MODULE} + ${CMAKE_CURRENT_LIST_DIR}/coreJSON/jsonFilePaths.cmake + ${CMAKE_CURRENT_LIST_DIR}/core_json.cmake +) + afr_module_sources( ${AFR_CURRENT_MODULE} PRIVATE ${JSON_SOURCES} - # List of files added to the target so that these are available + # List of header files added to the target so that these are available # in code downloaded from the FreeRTOS console. - ${CMAKE_CURRENT_LIST_DIR}/coreJSON/jsonFilePaths.cmake - ${CMAKE_CURRENT_LIST_DIR}/core_json.cmake ${JSON_HEADER_FILES} ) diff --git a/libraries/core_mqtt_demo_dependencies.cmake b/libraries/core_mqtt_demo_dependencies.cmake index 711d8603416..0173fabddd4 100644 --- a/libraries/core_mqtt_demo_dependencies.cmake +++ b/libraries/core_mqtt_demo_dependencies.cmake @@ -11,18 +11,20 @@ set(MQTT_HEADER_FILES "") foreach(mqtt_public_include_dir ${MQTT_INCLUDE_PUBLIC_DIRS}) file(GLOB mqtt_public_include_header_files LIST_DIRECTORIES false - ${mqtt_public_include_dir}/* ) + ${mqtt_public_include_dir}/*.h ) list(APPEND MQTT_HEADER_FILES ${mqtt_public_include_header_files}) endforeach() +# Add cmake files of module to metadata. +afr_module_cmake_files(${AFR_CURRENT_MODULE} + ${CMAKE_CURRENT_LIST_DIR}/coreMQTT/mqttFilePaths.cmake +) + afr_module_sources( ${AFR_CURRENT_MODULE} PRIVATE ${MQTT_SOURCES} ${MQTT_SERIALIZER_SOURCES} - # List of files added to the target so that these are available - # in code downloaded from the FreeRTOS console. - ${CMAKE_CURRENT_LIST_DIR}/coreMQTT/mqttFilePaths.cmake ${MQTT_HEADER_FILES} ) @@ -57,6 +59,11 @@ afr_set_lib_metadata(CATEGORY "Connectivity") afr_set_lib_metadata(VERSION "1.0.0") afr_set_lib_metadata(IS_VISIBLE "true") +# Add cmake files of module to metadata. +afr_module_cmake_files(${AFR_CURRENT_MODULE} + ${CMAKE_CURRENT_LIST_DIR}/core_mqtt_demo_dependencies.cmake +) + afr_module_sources( ${AFR_CURRENT_MODULE} PRIVATE @@ -64,9 +71,6 @@ afr_module_sources( # core_mqtt_demo_dependencies target; otherwise, it gives the # "Cannot determine link language for target" error. ${MQTT_SOURCES} - # This file is added to the target so that it is available - # in code downloaded from the FreeRTOS console. - ${CMAKE_CURRENT_LIST_DIR}/core_mqtt_demo_dependencies.cmake ) # Add dependencies of the coreMQTT demos in this target @@ -75,8 +79,20 @@ afr_module_dependencies( ${AFR_CURRENT_MODULE} PUBLIC AFR::core_mqtt + AFR::backoff_algorithm ) +# Add dependency on PKCS11 Helpers module, that is required +# by the Secure Sockets based coreMQTT demo, ONLY if the board +# supports the PKCS11 module. +if(TARGET AFR::pkcs11_implementation::mcu_port) + afr_module_dependencies( + ${AFR_CURRENT_MODULE} + PUBLIC + AFR::pkcs11_helpers + ) +endif() + # Add more dependencies for Secure Sockets based MQTT demo # (at demos/coreMQTT folder) ONLY if the board supports # the Secure Sockets library. @@ -84,7 +100,6 @@ if(TARGET AFR::secure_sockets::mcu_port) afr_module_dependencies( ${AFR_CURRENT_MODULE} PUBLIC - AFR::retry_utils AFR::transport_interface_secure_sockets AFR::secure_sockets ) @@ -110,4 +125,4 @@ if(BLE_SUPPORTED) PUBLIC AFR::ble ) -endif() \ No newline at end of file +endif() diff --git a/libraries/device_defender_demo_dependencies.cmake b/libraries/device_defender_demo_dependencies.cmake new file mode 100644 index 00000000000..1ce7e5f3c68 --- /dev/null +++ b/libraries/device_defender_demo_dependencies.cmake @@ -0,0 +1,97 @@ +# device_defender module. +afr_module(NAME device_defender ) + +# Include Defender library's source and header path variables. +include("${CMAKE_CURRENT_LIST_DIR}/device_defender_for_aws/defenderFilePaths.cmake") + +# Create a list of all header files in the Device Defender library. +# The list of header files will be added to metadata required +# for the FreeRTOS console. +set(DEVICE_DEFENDER_HEADER_FILES "") +foreach(defender_public_include_dir ${DEFENDER_INCLUDE_PUBLIC_DIRS}) + file(GLOB defender_public_include_header_files + LIST_DIRECTORIES false + ${defender_public_include_dir}/*.h ) + list(APPEND DEVICE_DEFENDER_HEADER_FILES ${defender_public_include_header_files}) +endforeach() + +afr_module_cmake_files(${AFR_CURRENT_MODULE} + ${CMAKE_CURRENT_LIST_DIR}/device_defender_for_aws/defenderFilePaths.cmake +) + +afr_module_sources( + ${AFR_CURRENT_MODULE} + PRIVATE + ${DEFENDER_SOURCES} + # List of header files added to the target so that these are available + # in code downloaded from the FreeRTOS console. + ${DEVICE_DEFENDER_HEADER_FILES} +) + +afr_module_include_dirs( + ${AFR_CURRENT_MODULE} + PUBLIC + ${DEFENDER_INCLUDE_PUBLIC_DIRS} +) + +# Dependency of module on logging stack. +afr_module_dependencies( + ${AFR_CURRENT_MODULE} + PUBLIC + AFR::logging +) + +################################################################ + +# device_defender_demo_dependencies module. +# Metadata module used for the Device Defender library in the FreeRTOS console. +# It represents a collection of module dependencies required +# by the Device Defender demo. +# This module enables the FreeRTOS console experience of enabling +# library dependencies when selecting the Device Defender library, so that the +# Device Defender demo can be downloaded. +afr_module(NAME device_defender_demo_dependencies ) + +afr_set_lib_metadata(ID "device_defender_demo_dependencies") +afr_set_lib_metadata(DESCRIPTION "This library enables device metrics reporting with AWS IoT Device Defender.") +afr_set_lib_metadata(DISPLAY_NAME "Device Defender") +afr_set_lib_metadata(CATEGORY "Amazon Services") +afr_set_lib_metadata(VERSION "1.0.0") +afr_set_lib_metadata(IS_VISIBLE "true") + +afr_module_cmake_files(${AFR_CURRENT_MODULE} + ${CMAKE_CURRENT_LIST_DIR}/device_defender_demo_dependencies.cmake +) + +afr_module_sources( + ${AFR_CURRENT_MODULE} + PRIVATE + # Adding sources so that CMake can generate the + # device_defender_demo_dependencies target; otherwise, it gives the + # "Cannot determine link language for target" error. + ${DEFENDER_SOURCES} +) + +# Add dependencies of the Device Defender demo in this target +# to support metadata required for FreeRTOS console. +afr_module_dependencies( + ${AFR_CURRENT_MODULE} + PUBLIC + AFR::device_defender + AFR::core_json + AFR::mqtt_demo_helpers + # Add dependency on core_mqtt_demo_dependencies module + # so that coreMQTT library is auto-included when selecting + # Device Defender library on the FreeRTOS console. + AFR::core_mqtt_demo_dependencies +) + +# If using the FreeRTOS+TCP metrics collector implementation, the defender demo +# depends on the FreeRTOS+TCP tcp utils. +if(TARGET AFR::freertos_plus_tcp::mcu_port) + afr_module_dependencies( + ${AFR_CURRENT_MODULE} + PUBLIC + AFR::freertos_plus_tcp_utils + ) +endif() diff --git a/libraries/device_defender_for_aws b/libraries/device_defender_for_aws new file mode 160000 index 00000000000..e15db4c22cf --- /dev/null +++ b/libraries/device_defender_for_aws @@ -0,0 +1 @@ +Subproject commit e15db4c22cfdd534d1e0693cdbdf467c7b09e897 diff --git a/libraries/device_shadow_demo_dependencies.cmake b/libraries/device_shadow_demo_dependencies.cmake index f55fb683342..d9c66d59094 100644 --- a/libraries/device_shadow_demo_dependencies.cmake +++ b/libraries/device_shadow_demo_dependencies.cmake @@ -11,17 +11,21 @@ set(DEVICE_SHADOW_HEADER_FILES "") foreach(shadow_public_include_dir ${SHADOW_INCLUDE_PUBLIC_DIRS}) file(GLOB shadow_public_include_header_files LIST_DIRECTORIES false - ${shadow_public_include_dir}/* ) + ${shadow_public_include_dir}/*.h ) list(APPEND DEVICE_SHADOW_HEADER_FILES ${shadow_public_include_header_files}) endforeach() +# Add cmake files of module to metadata. +afr_module_cmake_files(${AFR_CURRENT_MODULE} + ${CMAKE_CURRENT_LIST_DIR}/device_shadow_for_aws/shadowFilePaths.cmake +) + afr_module_sources( ${AFR_CURRENT_MODULE} PRIVATE ${SHADOW_SOURCES} - # List of files added to the target so that these are available + # Header files added to the target so that these are available # in code downloaded from the FreeRTOS console. - ${CMAKE_CURRENT_LIST_DIR}/device_shadow_for_aws/shadowFilePaths.cmake ${DEVICE_SHADOW_HEADER_FILES} ) @@ -49,9 +53,13 @@ afr_module_dependencies( # Device Shadow demo can be downloaded. afr_module(NAME device_shadow_demo_dependencies ) +# Add cmake files of module to metadata. +afr_module_cmake_files(${AFR_CURRENT_MODULE} + ${CMAKE_CURRENT_LIST_DIR}/device_shadow_demo_dependencies.cmake +) + afr_set_lib_metadata(ID "device_shadow_demo_dependencies") -afr_set_lib_metadata(DESCRIPTION "This library enables you to store and retrieve the \ -current state (the \"shadow\") of every registered device on AWS IoT.") +afr_set_lib_metadata(DESCRIPTION "This library enables a registered device to update and retrieve its current state (the \"shadow\") on AWS IoT.") afr_set_lib_metadata(DISPLAY_NAME "Device Shadow") afr_set_lib_metadata(CATEGORY "Amazon Services") afr_set_lib_metadata(VERSION "1.0.0") @@ -64,9 +72,6 @@ afr_module_sources( # device_shadow_demo_dependencies target; otherwise, it gives the # "Cannot determine link language for target" error. ${SHADOW_SOURCES} - # This file is added to the target so that it is available - # in code downloaded from the FreeRTOS console. - ${CMAKE_CURRENT_LIST_DIR}/device_shadow_demo_dependencies.cmake ) # Add dependencies of the Device Shadow demo in this target @@ -81,3 +86,15 @@ afr_module_dependencies( # Device Shadow library on the FreeRTOS console. AFR::core_mqtt_demo_dependencies ) + +# Add dependency on "mqtt_demo_helpers" module for the +# Device Shadow demo that uses Secure Sockets +# (present at demos/device_shadow_for_aws folder) ONLY if +# the board supports the Secure Sockets library. +if(TARGET AFR::secure_sockets::mcu_port) + afr_module_dependencies( + ${AFR_CURRENT_MODULE} + PUBLIC + AFR::mqtt_demo_helpers + ) +endif() diff --git a/libraries/device_shadow_for_aws b/libraries/device_shadow_for_aws index 0bd9f3eb950..508ce43a225 160000 --- a/libraries/device_shadow_for_aws +++ b/libraries/device_shadow_for_aws @@ -1 +1 @@ -Subproject commit 0bd9f3eb9504a58f8ab324248d9f2b97b594a9a7 +Subproject commit 508ce43a2257be5d38bfd2a778607fa921cb2dac diff --git a/libraries/freertos_plus/standard/crypto/include/iot_crypto.h b/libraries/freertos_plus/standard/crypto/include/iot_crypto.h index bbbd3a4d8cd..0069b111b8b 100644 --- a/libraries/freertos_plus/standard/crypto/include/iot_crypto.h +++ b/libraries/freertos_plus/standard/crypto/include/iot_crypto.h @@ -1,5 +1,5 @@ /* - * FreeRTOS Crypto V1.1.1 + * FreeRTOS Crypto V1.1.2 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/freertos_plus/standard/crypto/src/iot_crypto.c b/libraries/freertos_plus/standard/crypto/src/iot_crypto.c index 1dc889367db..32945f65110 100644 --- a/libraries/freertos_plus/standard/crypto/src/iot_crypto.c +++ b/libraries/freertos_plus/standard/crypto/src/iot_crypto.c @@ -1,5 +1,5 @@ /* - * FreeRTOS Crypto V1.1.1 + * FreeRTOS Crypto V1.1.2 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/freertos_plus/standard/crypto/test/iot_test_crypto.c b/libraries/freertos_plus/standard/crypto/test/iot_test_crypto.c index a49a268653b..c09cdfc10bc 100644 --- a/libraries/freertos_plus/standard/crypto/test/iot_test_crypto.c +++ b/libraries/freertos_plus/standard/crypto/test/iot_test_crypto.c @@ -1,5 +1,5 @@ /* - * FreeRTOS Crypto V1.1.1 + * FreeRTOS Crypto V1.1.2 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/freertos_plus/standard/freertos_plus_posix/include/FreeRTOS_POSIX_portable_default.h b/libraries/freertos_plus/standard/freertos_plus_posix/include/FreeRTOS_POSIX_portable_default.h index 356f1661e20..749592a5e3e 100644 --- a/libraries/freertos_plus/standard/freertos_plus_posix/include/FreeRTOS_POSIX_portable_default.h +++ b/libraries/freertos_plus/standard/freertos_plus_posix/include/FreeRTOS_POSIX_portable_default.h @@ -128,6 +128,9 @@ #ifndef posixconfigENABLE_USECONDS_T #define posixconfigENABLE_USECONDS_T 1 /**< useconds_t in sys/types.h */ #endif +#ifndef posixconfigENABLE_TM + #define posixconfigENABLE_TM 1 /**< struct tm in time.h */ +#endif #ifndef posixconfigENABLE_TIMESPEC #define posixconfigENABLE_TIMESPEC 1 /**< struct timespec in time.h */ #endif diff --git a/libraries/freertos_plus/standard/freertos_plus_tcp b/libraries/freertos_plus/standard/freertos_plus_tcp index d1e521d5a2d..9a25860e761 160000 --- a/libraries/freertos_plus/standard/freertos_plus_tcp +++ b/libraries/freertos_plus/standard/freertos_plus_tcp @@ -1 +1 @@ -Subproject commit d1e521d5a2dc1c1f27bb693ea8c6fb89d6bedad6 +Subproject commit 9a25860e761036a9eb780799c9db632e3eff60c9 diff --git a/libraries/freertos_plus/standard/freertos_plus_tcp.cmake b/libraries/freertos_plus/standard/freertos_plus_tcp.cmake index 632b2f4b7ad..23b1d1daee7 100644 --- a/libraries/freertos_plus/standard/freertos_plus_tcp.cmake +++ b/libraries/freertos_plus/standard/freertos_plus_tcp.cmake @@ -9,6 +9,11 @@ set(inc_dir "${CMAKE_CURRENT_LIST_DIR}/freertos_plus_tcp/include") # for the FreeRTOS console. file(GLOB FREERTOS_PLUS_TCP_HEADER_FILES "${inc_dir}/*.h") +# Add cmake files of module to metadata. +afr_module_cmake_files(${AFR_CURRENT_MODULE} + ${CMAKE_CURRENT_LIST_DIR}/freertos_plus_tcp.cmake +) + afr_module_sources( ${AFR_CURRENT_MODULE} PRIVATE @@ -21,10 +26,9 @@ afr_module_sources( "${src_dir}/FreeRTOS_TCP_IP.c" "${src_dir}/FreeRTOS_TCP_WIN.c" "${src_dir}/FreeRTOS_UDP_IP.c" - # List of files added to the target so that these are available + # Header files are added to the target so that these are available # in code downloaded from the FreeRTOS console. ${FREERTOS_PLUS_TCP_HEADER_FILES} - ${CMAKE_CURRENT_LIST_DIR}/freertos_plus_tcp.cmake ) afr_module_include_dirs( @@ -43,4 +47,5 @@ endif() afr_module_dependencies( ${AFR_CURRENT_MODULE} PUBLIC AFR::${AFR_CURRENT_MODULE}::mcu_port -) \ No newline at end of file +) + diff --git a/libraries/freertos_plus/standard/freertos_plus_tcp_utils.cmake b/libraries/freertos_plus/standard/freertos_plus_tcp_utils.cmake new file mode 100644 index 00000000000..df70ba5a18b --- /dev/null +++ b/libraries/freertos_plus/standard/freertos_plus_tcp_utils.cmake @@ -0,0 +1,32 @@ +afr_module(NAME "freertos_plus_tcp_utils" INTERNAL) + +set(utils_src_dir "${CMAKE_CURRENT_LIST_DIR}/freertos_plus_tcp/tools/tcp_utilities") +set(utils_inc_dir "${CMAKE_CURRENT_LIST_DIR}/freertos_plus_tcp/tools/tcp_utilities/include") + +# Add cmake files of module to metadata. +afr_module_cmake_files(${AFR_CURRENT_MODULE} + ${CMAKE_CURRENT_LIST_DIR}/freertos_plus_tcp_utils.cmake +) + +afr_module_sources( + ${AFR_CURRENT_MODULE} + PRIVATE + "${utils_src_dir}/tcp_dump_packets.c" + "${utils_src_dir}/tcp_mem_stats.c" + "${utils_src_dir}/tcp_netstat.c" + # Header files are added to the target so that these are available + # in code downloaded from the FreeRTOS console. + "${utils_inc_dir}/tcp_dump_packets.h" + "${utils_inc_dir}/tcp_mem_stats.h" + "${utils_inc_dir}/tcp_netstat.h" +) + +afr_module_include_dirs( + ${AFR_CURRENT_MODULE} + PUBLIC "${utils_inc_dir}" +) + +afr_module_dependencies( + ${AFR_CURRENT_MODULE} + PUBLIC AFR::freertos_plus_tcp +) diff --git a/libraries/freertos_plus/standard/tls/include/iot_tls.h b/libraries/freertos_plus/standard/tls/include/iot_tls.h index e6384bef662..a9cb4efbd8a 100644 --- a/libraries/freertos_plus/standard/tls/include/iot_tls.h +++ b/libraries/freertos_plus/standard/tls/include/iot_tls.h @@ -1,5 +1,5 @@ /* - * FreeRTOS TLS V1.3.0 + * FreeRTOS TLS V1.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/freertos_plus/standard/tls/src/iot_tls.c b/libraries/freertos_plus/standard/tls/src/iot_tls.c index 798749a4da5..65503c6bc63 100644 --- a/libraries/freertos_plus/standard/tls/src/iot_tls.c +++ b/libraries/freertos_plus/standard/tls/src/iot_tls.c @@ -1,5 +1,5 @@ /* - * FreeRTOS TLS V1.3.0 + * FreeRTOS TLS V1.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -457,6 +457,7 @@ static int prvReadCertificateIntoContext( TLSContext_t * pxTlsContext, /* Get the handle of the certificate. */ xResult = xFindObjectWithLabelAndClass( pxTlsContext->xP11Session, pcLabelName, + strlen( pcLabelName ), xClass, &xCertObj ); @@ -555,6 +556,7 @@ static int prvInitializeClientCredential( TLSContext_t * pxCtx ) /* Get the handle of the device private key. */ xResult = xFindObjectWithLabelAndClass( pxCtx->xP11Session, pkcs11configLABEL_DEVICE_PRIVATE_KEY_FOR_TLS, + sizeof( pkcs11configLABEL_DEVICE_PRIVATE_KEY_FOR_TLS ) - 1, CKO_PRIVATE_KEY, &pxCtx->xP11PrivateKey ); } diff --git a/libraries/freertos_plus/standard/tls/test/iot_test_tls.c b/libraries/freertos_plus/standard/tls/test/iot_test_tls.c index 62009c1539d..460d4841381 100644 --- a/libraries/freertos_plus/standard/tls/test/iot_test_tls.c +++ b/libraries/freertos_plus/standard/tls/test/iot_test_tls.c @@ -1,5 +1,5 @@ /* - * FreeRTOS TLS V1.3.0 + * FreeRTOS TLS V1.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/freertos_plus/standard/tls/test/iot_test_tls.h b/libraries/freertos_plus/standard/tls/test/iot_test_tls.h index 6e8f00608af..b20272d5452 100644 --- a/libraries/freertos_plus/standard/tls/test/iot_test_tls.h +++ b/libraries/freertos_plus/standard/tls/test/iot_test_tls.h @@ -1,5 +1,5 @@ /* - * FreeRTOS TLS V1.3.0 + * FreeRTOS TLS V1.3.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/freertos_plus/standard/utils/include/iot_system_init.h b/libraries/freertos_plus/standard/utils/include/iot_system_init.h index 3af2eefbbde..ba086c54ad8 100644 --- a/libraries/freertos_plus/standard/utils/include/iot_system_init.h +++ b/libraries/freertos_plus/standard/utils/include/iot_system_init.h @@ -1,5 +1,5 @@ /* - * FreeRTOS Utils V1.2.0 + * FreeRTOS Utils V1.2.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/freertos_plus/standard/utils/src/iot_system_init.c b/libraries/freertos_plus/standard/utils/src/iot_system_init.c index 94d497eb123..b90fa0f0f2e 100644 --- a/libraries/freertos_plus/standard/utils/src/iot_system_init.c +++ b/libraries/freertos_plus/standard/utils/src/iot_system_init.c @@ -1,5 +1,5 @@ /* - * FreeRTOS Utils V1.2.0 + * FreeRTOS Utils V1.2.1 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/jobs_demo_dependencies.cmake b/libraries/jobs_demo_dependencies.cmake new file mode 100644 index 00000000000..b0a56335023 --- /dev/null +++ b/libraries/jobs_demo_dependencies.cmake @@ -0,0 +1,82 @@ +# jobs module. +afr_module(NAME jobs ) + +# Include Jobs library's source and header path variables. +include("${CMAKE_CURRENT_LIST_DIR}/jobs_for_aws/jobsFilePaths.cmake") + +# Create a list of all header files in the Jobs library. +# The list of header files will be added to metadata required +# for the FreeRTOS console. +set(JOBS_HEADER_FILES "") +foreach(jobs_public_include_dir ${JOBS_INCLUDE_PUBLIC_DIRS}) + file(GLOB jobs_public_include_header_files + LIST_DIRECTORIES false + ${jobs_public_include_dir}/*.h ) + list(APPEND JOBS_HEADER_FILES ${jobs_public_include_header_files}) +endforeach() + +# Add cmake files of module to metadata. +afr_module_cmake_files(${AFR_CURRENT_MODULE} + ${CMAKE_CURRENT_LIST_DIR}/jobs_for_aws/jobsFilePaths.cmake +) + +afr_module_sources( + ${AFR_CURRENT_MODULE} + PRIVATE + ${JOBS_SOURCES} + # Header files added to the target so that these are available + # in code downloaded from the FreeRTOS console. + ${JOBS_HEADER_FILES} +) + +afr_module_include_dirs( + ${AFR_CURRENT_MODULE} + PUBLIC + ${JOBS_INCLUDE_PUBLIC_DIRS} +) + +################################################################ + +# jobs_demo_dependencies module. +# Metadata module used for the Jobs library in the FreeRTOS console. +# It represents a collection of module dependencies required +# by the Jobs demo. +# This module enables the FreeRTOS console experience of enabling +# library dependencies when selecting the Jobs library, so that the +# Jobs demo can be downloaded. +afr_module(NAME jobs_demo_dependencies ) + +afr_set_lib_metadata(ID "jobs_demo_dependencies") +afr_set_lib_metadata(DESCRIPTION "This library enables a device registered on AWS IoT to receive pending job requests and post job updates to the AWS IoT Jobs service.") +afr_set_lib_metadata(DISPLAY_NAME "Jobs") +afr_set_lib_metadata(CATEGORY "Amazon Services") +afr_set_lib_metadata(VERSION "1.0.0") +afr_set_lib_metadata(IS_VISIBLE "true") + +# Add cmake files of module to metadata. +afr_module_cmake_files(${AFR_CURRENT_MODULE} + ${CMAKE_CURRENT_LIST_DIR}/jobs_demo_dependencies.cmake +) + +afr_module_sources( + ${AFR_CURRENT_MODULE} + PRIVATE + # Adding sources so that CMake can generate the + # jobs_demo_dependencies target; otherwise, it gives the + # "Cannot determine link language for target" error. + ${JOBS_SOURCES} +) + +# Add dependencies of the Jobs demo in this target +# to support metadata required for FreeRTOS console. +afr_module_dependencies( + ${AFR_CURRENT_MODULE} + PUBLIC + AFR::jobs + AFR::core_json + AFR::mqtt_demo_helpers + # Add dependency on core_mqtt_demo_dependencies module + # so that coreMQTT library is auto-included when selecting + # Jobs library on the FreeRTOS console. + AFR::core_mqtt_demo_dependencies +) diff --git a/libraries/jobs_for_aws b/libraries/jobs_for_aws new file mode 160000 index 00000000000..5844fb9a7c6 --- /dev/null +++ b/libraries/jobs_for_aws @@ -0,0 +1 @@ +Subproject commit 5844fb9a7c6bc3d12f0e4ef143d873d516cf4cce diff --git a/libraries/logging/include/iot_logging_task.h b/libraries/logging/include/iot_logging_task.h index ddc7c3edf39..f680a9632c8 100644 --- a/libraries/logging/include/iot_logging_task.h +++ b/libraries/logging/include/iot_logging_task.h @@ -1,5 +1,5 @@ /* - * FreeRTOS Common V1.1.2 + * FreeRTOS Common V1.1.3 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/logging/include/logging_levels.h b/libraries/logging/include/logging_levels.h index eed53dcfee6..f3f4f64aa15 100644 --- a/libraries/logging/include/logging_levels.h +++ b/libraries/logging/include/logging_levels.h @@ -1,5 +1,5 @@ /* - * Logging Level Macros + * FreeRTOS Common V1.1.3 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/logging/include/logging_stack.h b/libraries/logging/include/logging_stack.h index 1d22fa95ec2..926e151b2b8 100644 --- a/libraries/logging/include/logging_stack.h +++ b/libraries/logging/include/logging_stack.h @@ -1,5 +1,5 @@ /* - * Logging Stack V1.0.0 + * FreeRTOS Common V1.1.3 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -36,6 +36,7 @@ /* Standard Include. */ #include +#include /* Metadata information to prepend to every log message. */ diff --git a/libraries/logging/iot_logging.c b/libraries/logging/iot_logging.c index ab918368247..139ea8ecd09 100644 --- a/libraries/logging/iot_logging.c +++ b/libraries/logging/iot_logging.c @@ -1,5 +1,5 @@ /* - * FreeRTOS Common V1.1.2 + * FreeRTOS Common V1.1.3 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/libraries/logging/iot_logging_task_dynamic_buffers.c b/libraries/logging/iot_logging_task_dynamic_buffers.c index 07abd96bb00..83fe8fca7c9 100644 --- a/libraries/logging/iot_logging_task_dynamic_buffers.c +++ b/libraries/logging/iot_logging_task_dynamic_buffers.c @@ -1,5 +1,5 @@ /* - * FreeRTOS Common V1.1.2 + * FreeRTOS Common V1.1.3 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/projects/cypress/CY8CKIT_064S0S2_4343W/mtb/aws_demos/.project b/projects/cypress/CY8CKIT_064S0S2_4343W/mtb/aws_demos/.project index e7d50f0db71..3d546f6f5c8 100644 --- a/projects/cypress/CY8CKIT_064S0S2_4343W/mtb/aws_demos/.project +++ b/projects/cypress/CY8CKIT_064S0S2_4343W/mtb/aws_demos/.project @@ -337,11 +337,6 @@ 2 PARENT-5-PROJECT_LOC/libraries/c_sdk/aws/shadow/include/types - - libraries/c_sdk/aws/defender/include - 2 - PARENT-5-PROJECT_LOC/libraries/c_sdk/aws/defender/include - libraries/freertos_plus/standard/crypto 2 diff --git a/projects/cypress/CY8CKIT_064S0S2_4343W/mtb/aws_demos/afr.mk b/projects/cypress/CY8CKIT_064S0S2_4343W/mtb/aws_demos/afr.mk index 91a8c17f43b..38f7633c977 100755 --- a/projects/cypress/CY8CKIT_064S0S2_4343W/mtb/aws_demos/afr.mk +++ b/projects/cypress/CY8CKIT_064S0S2_4343W/mtb/aws_demos/afr.mk @@ -174,31 +174,40 @@ SOURCES+=\ $(CY_AFR_ROOT)/demos/demo_runner/aws_demo_version.c\ $(CY_AFR_ROOT)/demos/demo_runner/iot_demo_freertos.c\ $(CY_AFR_ROOT)/demos/demo_runner/iot_demo_runner.c\ + $(CY_AFR_ROOT)/demos/common/http_demo_helpers/http_demo_utils.c\ + $(CY_AFR_ROOT)/demos/common/mqtt_demo_helpers/mqtt_demo_helpers.c\ + $(CY_AFR_ROOT)/demos/common/pkcs11_helpers/pkcs11_helpers.c\ $(wildcard $(CY_AFR_ROOT)/demos/dev_mode_key_provisioning/src/*.c)\ $(wildcard $(CY_AFR_ROOT)/demos/greengrass_connectivity/*.c)\ - $(wildcard $(CY_AFR_ROOT)/demos/defender/*.c)\ - $(wildcard $(CY_AFR_ROOT)/demos/https/*.c)\ + $(wildcard $(CY_AFR_ROOT)/demos/mqtt/*.c)\ $(wildcard $(CY_AFR_ROOT)/demos/coreMQTT/*.c)\ + $(wildcard $(CY_AFR_ROOT)/demos/coreHTTP/*.c)\ $(wildcard $(CY_AFR_ROOT)/demos/network_manager/*.c)\ $(wildcard $(CY_AFR_ROOT)/demos/tcp/*.c)\ - $(wildcard $(CY_AFR_ROOT)/demos/device_shadow_for_aws/*.c) + $(wildcard $(CY_AFR_ROOT)/demos/shadow/*.c)\ + $(wildcard $(CY_AFR_ROOT)/demos/device_shadow_for_aws/*.c)\ + $(wildcard $(CY_AFR_ROOT)/demos/jobs_for_aws/*.c)\ + $(wildcard $(CY_AFR_ROOT)/demos/device_defender_for_aws/*.c)\ + $(wildcard $(CY_AFR_ROOT)/demos/device_defender_for_aws/metrics_collector/lwip/*.c) INCLUDES+=\ $(CY_EXTAPP_PATH)/common\ $(CY_AFR_ROOT)/demos/dev_mode_key_provisioning\ $(CY_AFR_ROOT)/demos/dev_mode_key_provisioning/include\ - $(CY_AFR_ROOT)/demos/https\ $(CY_AFR_ROOT)/demos/include\ $(CY_AFR_ROOT)/demos/network_manager\ $(CY_AFR_ROOT)/demos/tcp\ - $(CY_AFR_ROOT)/demos/device_shadow_for_aws\ + $(CY_AFR_ROOT)/demos/common/http_demo_helpers\ + $(CY_AFR_ROOT)/demos/common/mqtt_demo_helpers\ + $(CY_AFR_ROOT)/demos/common/pkcs11_helpers\ + $(CY_AFR_ROOT)/demos/device_defender_for_aws\ + $(CY_AFR_ROOT)/demos/device_defender_for_aws/metrics_collector/lwip\ ################################################################################ # libraries (3rd party) ################################################################################ SOURCES+=\ - $(wildcard $(CY_AFR_ROOT)/libraries/3rdparty/http_parser/http_parser.c)\ $(wildcard $(CY_AFR_ROOT)/libraries/3rdparty/lwip/src/api/*c)\ $(wildcard $(CY_AFR_ROOT)/libraries/3rdparty/lwip/src/core/*c)\ $(wildcard $(CY_AFR_ROOT)/libraries/3rdparty/lwip/src/core/ipv4/*c)\ @@ -224,7 +233,6 @@ endif INCLUDES+=\ $(CY_AFR_ROOT)/libraries/3rdparty/pkcs11\ - $(CY_AFR_ROOT)/libraries/3rdparty/http_parser\ $(CY_AFR_ROOT)/libraries/3rdparty/lwip/src/include\ $(CY_AFR_ROOT)/libraries/3rdparty/lwip_osal/include\ $(CY_AFR_ROOT)/libraries/3rdparty/mbedtls_config\ @@ -247,18 +255,17 @@ SOURCES+=\ $(wildcard $(CY_AFR_ROOT)/libraries/abstractions/secure_sockets/lwip/*c)\ $(wildcard $(CY_AFR_ROOT)/libraries/abstractions/pkcs11/corePKCS11/source/*.c)\ $(wildcard $(CY_AFR_ROOT)/libraries/abstractions/transport/secure_sockets/*.c)\ - $(wildcard $(CY_AFR_ROOT)/libraries/abstractions/retry_utils/freertos/*.c)\ + $(wildcard $(CY_AFR_ROOT)/libraries/abstractions/backoff_algorithm/source/*.c)\ INCLUDES+=\ $(CY_AFR_ROOT)/libraries/abstractions/pkcs11/corePKCS11/source/include\ - $(CY_AFR_ROOT)/libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/include\ $(CY_AFR_ROOT)/libraries/abstractions/platform/freertos\ $(CY_AFR_ROOT)/libraries/abstractions/platform/freertos/include\ $(CY_AFR_ROOT)/libraries/abstractions/platform/freertos/include/platform\ $(CY_AFR_ROOT)/libraries/abstractions/platform/include\ $(CY_AFR_ROOT)/libraries/abstractions/platform/include/platform\ $(CY_AFR_ROOT)/libraries/abstractions/platform/include/types\ - $(CY_AFR_ROOT)/libraries/abstractions/retry_utils\ + $(CY_AFR_ROOT)/libraries/abstractions/backoff_algorithm/source/include\ $(CY_AFR_ROOT)/libraries/abstractions/secure_sockets\ $(CY_AFR_ROOT)/libraries/abstractions/secure_sockets/include\ $(CY_AFR_ROOT)/libraries/abstractions/transport/secure_sockets\ @@ -301,15 +308,19 @@ SOURCES+=\ $(CY_AFR_ROOT)/libraries/c_sdk/standard/mqtt/src/iot_mqtt_subscription_container.c \ $(CY_AFR_ROOT)/libraries/c_sdk/standard/mqtt/src/iot_mqtt_mutex_wrapper.c \ $(CY_AFR_ROOT)/libraries/c_sdk/standard/mqtt/src/iot_mqtt_publish_duplicates.c \ - $(CY_AFR_ROOT)/libraries/c_sdk/standard/mqtt/src/iot_mqtt_validate.c\ - $(CY_AFR_ROOT)/libraries/coreMQTT/source/core_mqtt_serializer.c\ - $(CY_AFR_ROOT)/libraries/coreMQTT/source/core_mqtt_state.c\ - $(CY_AFR_ROOT)/libraries/coreMQTT/source/core_mqtt.c + $(CY_AFR_ROOT)/libraries/c_sdk/standard/mqtt/src/iot_mqtt_validate.c -# Device Shadow and core JSON +# Device Shadow, Device Defender, Jobs, coreJSON, coreMQTT and coreHTTP SOURCES+=\ $(CY_AFR_ROOT)/libraries/device_shadow_for_aws/source/shadow.c\ - $(CY_AFR_ROOT)/libraries/coreJSON/source/core_json.c + $(CY_AFR_ROOT)/libraries/coreJSON/source/core_json.c \ + $(CY_AFR_ROOT)/libraries/device_defender_for_aws/source/defender.c\ + $(CY_AFR_ROOT)/libraries/jobs_for_aws/source/jobs.c\ + $(CY_AFR_ROOT)/libraries/coreMQTT/source/core_mqtt_serializer.c\ + $(CY_AFR_ROOT)/libraries/coreMQTT/source/core_mqtt_state.c\ + $(CY_AFR_ROOT)/libraries/coreMQTT/source/core_mqtt.c\ + $(CY_AFR_ROOT)/libraries/coreHTTP/source/core_http_client.c\ + $(CY_AFR_ROOT)/libraries/coreHTTP/source/dependency/3rdparty/http_parser/http_parser.c INCLUDES+=\ $(CY_AFR_ROOT)/libraries/c_sdk/standard/common\ @@ -327,8 +338,6 @@ INCLUDES+=\ $(CY_AFR_ROOT)/libraries/c_sdk/standard/mqtt/include/types\ $(CY_AFR_ROOT)/libraries/c_sdk/standard/mqtt/src\ $(CY_AFR_ROOT)/libraries/c_sdk/standard/mqtt/src/private\ - $(CY_AFR_ROOT)/libraries/coreMQTT/source/include\ - $(CY_AFR_ROOT)/libraries/coreMQTT/source/interface\ $(CY_AFR_ROOT)/libraries/c_sdk/standard/serializer\ $(CY_AFR_ROOT)/libraries/c_sdk/standard/serializer/include\ $(CY_AFR_ROOT)/libraries/c_sdk/aws/shadow/include\ @@ -336,8 +345,13 @@ INCLUDES+=\ $(CY_AFR_ROOT)/libraries/c_sdk/aws/defender/include\ $(CY_AFR_ROOT)/libraries/coreMQTT/source/include\ $(CY_AFR_ROOT)/libraries/coreMQTT/source/interface\ + $(CY_AFR_ROOT)/libraries/coreHTTP/source/include\ + $(CY_AFR_ROOT)/libraries/coreHTTP/source/interface\ + $(CY_AFR_ROOT)/libraries/coreHTTP/source/dependency/3rdparty/http_parser\ $(CY_AFR_ROOT)/libraries/device_shadow_for_aws/source/include\ $(CY_AFR_ROOT)/libraries/coreJSON/source/include\ + $(CY_AFR_ROOT)/libraries/device_defender_for_aws/source/include\ + $(CY_AFR_ROOT)/libraries/jobs_for_aws/source/include ################################################################################ # libraries (freertos_plus) diff --git a/projects/cypress/CY8CKIT_064S0S2_4343W/mtb/aws_tests/afr.mk b/projects/cypress/CY8CKIT_064S0S2_4343W/mtb/aws_tests/afr.mk index 8cad1cf4eaa..7ef21a7120d 100644 --- a/projects/cypress/CY8CKIT_064S0S2_4343W/mtb/aws_tests/afr.mk +++ b/projects/cypress/CY8CKIT_064S0S2_4343W/mtb/aws_tests/afr.mk @@ -190,7 +190,6 @@ INCLUDES+=\ ################################################################################ SOURCES+=\ - $(wildcard $(CY_AFR_ROOT)/libraries/3rdparty/http_parser/http_parser.c)\ $(wildcard $(CY_AFR_ROOT)/libraries/3rdparty/lwip/src/api/*c)\ $(wildcard $(CY_AFR_ROOT)/libraries/3rdparty/lwip/src/core/*c)\ $(wildcard $(CY_AFR_ROOT)/libraries/3rdparty/lwip/src/core/ipv4/*c)\ @@ -216,7 +215,6 @@ endif INCLUDES+=\ $(CY_AFR_ROOT)/tests/include\ $(CY_AFR_ROOT)/libraries/3rdparty/pkcs11\ - $(CY_AFR_ROOT)/libraries/3rdparty/http_parser\ $(CY_AFR_ROOT)/libraries/3rdparty/lwip/src/include\ $(CY_AFR_ROOT)/libraries/3rdparty/lwip_osal/include\ $(CY_AFR_ROOT)/libraries/3rdparty/mbedtls_config\ @@ -237,7 +235,7 @@ SOURCES+=\ $(wildcard $(CY_AFR_ROOT)/libraries/abstractions/pkcs11/corePKCS11/source/*.c)\ $(wildcard $(CY_AFR_ROOT)/libraries/abstractions/pkcs11/corePKCS11/source/*.c)\ $(wildcard $(CY_AFR_ROOT)/libraries/abstractions/transport/secure_sockets/*.c)\ - $(wildcard $(CY_AFR_ROOT)/libraries/abstractions/retry_utils/freertos/*.c)\ + $(wildcard $(CY_AFR_ROOT)/libraries/abstractions/backoff_algorithm/source/*.c)\ # Test code SOURCES+=\ @@ -249,14 +247,13 @@ SOURCES+=\ INCLUDES+=\ $(CY_AFR_ROOT)/libraries/abstractions/pkcs11/corePKCS11/source/include\ - $(CY_AFR_ROOT)/libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/include\ $(CY_AFR_ROOT)/libraries/abstractions/platform/freertos\ $(CY_AFR_ROOT)/libraries/abstractions/platform/freertos/include\ $(CY_AFR_ROOT)/libraries/abstractions/platform/freertos/include/platform\ $(CY_AFR_ROOT)/libraries/abstractions/platform/include\ $(CY_AFR_ROOT)/libraries/abstractions/platform/include/platform\ $(CY_AFR_ROOT)/libraries/abstractions/platform/include/types\ - $(CY_AFR_ROOT)/libraries/abstractions/retry_utils\ + $(CY_AFR_ROOT)/libraries/abstractions/backoff_algorithm/source/include\ $(CY_AFR_ROOT)/libraries/abstractions/secure_sockets\ $(CY_AFR_ROOT)/libraries/abstractions/secure_sockets/include\ $(CY_AFR_ROOT)/libraries/abstractions/transport/secure_sockets\ @@ -311,15 +308,19 @@ SOURCES+=\ $(CY_AFR_ROOT)/libraries/c_sdk/standard/mqtt/src/iot_mqtt_managed_function_wrapper.c\ $(CY_AFR_ROOT)/libraries/c_sdk/standard/mqtt/src/iot_mqtt_subscription_container.c\ $(CY_AFR_ROOT)/libraries/c_sdk/standard/mqtt/src/iot_mqtt_mutex_wrapper.c\ - $(CY_AFR_ROOT)/libraries/c_sdk/standard/mqtt/src/iot_mqtt_publish_duplicates.c\ - $(CY_AFR_ROOT)/libraries/coreMQTT/source/core_mqtt_serializer.c\ - $(CY_AFR_ROOT)/libraries/coreMQTT/source/core_mqtt_state.c\ - $(CY_AFR_ROOT)/libraries/coreMQTT/source/core_mqtt.c + $(CY_AFR_ROOT)/libraries/c_sdk/standard/mqtt/src/iot_mqtt_publish_duplicates.c -# Device Shadow and core JSON +# Device Shadow, Device Defender, Jobs, coreJSON, coreMQTT and coreHTTP SOURCES+=\ $(CY_AFR_ROOT)/libraries/device_shadow_for_aws/source/shadow.c\ - $(CY_AFR_ROOT)/libraries/coreJSON/source/core_json.c + $(CY_AFR_ROOT)/libraries/coreJSON/source/core_json.c \ + $(CY_AFR_ROOT)/libraries/device_defender_for_aws/source/defender.c\ + $(CY_AFR_ROOT)/libraries/jobs_for_aws/source/jobs.c\ + $(CY_AFR_ROOT)/libraries/coreMQTT/source/core_mqtt_serializer.c\ + $(CY_AFR_ROOT)/libraries/coreMQTT/source/core_mqtt_state.c\ + $(CY_AFR_ROOT)/libraries/coreMQTT/source/core_mqtt.c\ + $(CY_AFR_ROOT)/libraries/coreHTTP/source/core_http_client.c\ + $(CY_AFR_ROOT)/libraries/coreHTTP/source/dependency/3rdparty/http_parser/http_parser.c # Test code SOURCES+=\ @@ -328,6 +329,7 @@ SOURCES+=\ $(wildcard $(CY_AFR_ROOT)/libraries/c_sdk/standard/mqtt/test/system/*.c)\ $(CY_AFR_ROOT)/libraries/c_sdk/standard/mqtt/test/iot_test_mqtt_agent.c\ $(CY_AFR_ROOT)/tests/integration_test/core_mqtt_system_test.c\ + $(CY_AFR_ROOT)/tests/integration_test/core_http_system_test.c\ $(CY_AFR_ROOT)/tests/integration_test/shadow_system_test.c @@ -350,8 +352,6 @@ INCLUDES+=\ $(CY_AFR_ROOT)/libraries/c_sdk/standard/mqtt/src/private\ $(CY_AFR_ROOT)/libraries/c_sdk/standard/mqtt/test/mock\ $(CY_AFR_ROOT)/libraries/c_sdk/standard/mqtt/test/access\ - $(CY_AFR_ROOT)/libraries/coreMQTT/source/include\ - $(CY_AFR_ROOT)/libraries/coreMQTT/source/interface\ $(CY_AFR_ROOT)/libraries/c_sdk/standard/ble/include\ $(CY_AFR_ROOT)/libraries/c_sdk/standard/serializer\ $(CY_AFR_ROOT)/libraries/c_sdk/standard/serializer/include\ @@ -364,8 +364,13 @@ INCLUDES+=\ $(CY_AFR_ROOT)/libraries/c_sdk/aws/defender/src/private\ $(CY_AFR_ROOT)/libraries/coreMQTT/source/include\ $(CY_AFR_ROOT)/libraries/coreMQTT/source/interface\ + $(CY_AFR_ROOT)/libraries/coreHTTP/source/include\ + $(CY_AFR_ROOT)/libraries/coreHTTP/source/interface\ + $(CY_AFR_ROOT)/libraries/coreHTTP/source/dependency/3rdparty/http_parser\ $(CY_AFR_ROOT)/libraries/device_shadow_for_aws/source/include\ $(CY_AFR_ROOT)/libraries/coreJSON/source/include\ + $(CY_AFR_ROOT)/libraries/device_defender_for_aws/source/include\ + $(CY_AFR_ROOT)/libraries/jobs_for_aws/source/include ################################################################################ # libraries (freertos_plus) diff --git a/projects/cypress/CYW943907AEVAL1F/wicedstudio/aws_demos/.project b/projects/cypress/CYW943907AEVAL1F/wicedstudio/aws_demos/.project index 458053d6f41..428a3aacadb 100644 --- a/projects/cypress/CYW943907AEVAL1F/wicedstudio/aws_demos/.project +++ b/projects/cypress/CYW943907AEVAL1F/wicedstudio/aws_demos/.project @@ -316,6 +316,56 @@ 1 BASE_DIR/libraries/c_sdk/standard/common/include/private/iot_taskpool_internal.h + + libraries/coreMQTT/source/core_mqtt.c + 1 + BASE_DIR/libraries/coreMQTT/source/core_mqtt.c + + + libraries/coreMQTT/source/core_mqtt_state.c + 1 + BASE_DIR/libraries/coreMQTT/source/core_mqtt_state.c + + + libraries/coreMQTT/source/core_mqtt_serializer.c + 1 + BASE_DIR/libraries/coreMQTT/source/core_mqtt_serializer.c + + + libraries/coreMQTT/source/include/core_mqtt.h + 1 + BASE_DIR/libraries/coreMQTT/source/include/core_mqtt.h + + + libraries/coreMQTT/source/include/core_mqtt_config_defaults.h + 1 + BASE_DIR/libraries/coreMQTT/source/include/core_mqtt_config_defaults.h + + + libraries/coreMQTT/source/include/core_mqtt_serializer.h + 1 + BASE_DIR/libraries/coreMQTT/source/include/core_mqtt_serializer.h + + + libraries/coreMQTT/source/include/core_mqtt_state.h + 1 + BASE_DIR/libraries/coreMQTT/source/include/core_mqtt_state.h + + + libraries/coreMQTT/source/interface/transport_interface.h + 1 + BASE_DIR/libraries/coreMQTT/source/interface/transport_interface.h + + + libraries/abstractions/backoff_algorithm/source/backoff_algorithm.c + 1 + BASE_DIR/libraries/abstractions/backoff_algorithm/source/backoff_algorithm.c + + + libraries/abstractions/backoff_algorithm/source/include/backoff_algorithm.h + 1 + BASE_DIR/libraries/abstractions/backoff_algorithm/source/include/backoff_algorithm.h + libraries/abstractions/platform/include/platform/iot_clock.h 1 @@ -427,9 +477,9 @@ BASE_DIR/libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/core_pkcs11_mbedtls.c - libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/include/threading_alt.h + libraries/3rdparty/mbedtls_config/threading_alt.h 1 - BASE_DIR/libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/include/threading_alt.h + BASE_DIR/libraries/3rdparty/mbedtls_config/threading_alt.h libraries/abstractions/wifi/include/iot_wifi.h @@ -506,6 +556,46 @@ 1 BASE_DIR/libraries/c_sdk/standard/mqtt/src/iot_mqtt_agent.c + + libraries/coreHTTP/source/core_http_client.c + 1 + BASE_DIR/libraries/coreHTTP/source/core_http_client.c + + + libraries/coreHTTP/source/dependency/3rdparty/http_parser/http_parser.c + 1 + BASE_DIR/libraries/coreHTTP/source/dependency/3rdparty/http_parser/http_parser.c + + + libraries/coreHTTP/source/include/core_http_client.h + 1 + BASE_DIR/libraries/coreHTTP/source/include/core_http_client.h + + + libraries/coreHTTP/source/include/core_http_client_private.h + 1 + BASE_DIR/libraries/coreHTTP/source/include/core_http_client_private.h + + + libraries/coreHTTP/source/include/core_http_config_defaults.h + 1 + BASE_DIR/libraries/coreHTTP/source/include/core_http_config_defaults.h + + + libraries/coreHTTP/source/interface/transport_interface.h + 1 + BASE_DIR/libraries/coreHTTP/source/interface/transport_interface.h + + + libraries/coreHTTP/source/dependency/3rdparty/http_parser/http_parser.h + 1 + BASE_DIR/libraries/coreHTTP/source/dependency/3rdparty/http_parser/http_parser.h + + + demos/common/http_demo_helpers/http_demo_utils.c + 1 + BASE_DIR/demos/common/http_demo_helpers/http_demo_utils.c + libraries/freertos_plus/aws/greengrass/src/aws_greengrass_discovery.c 1 @@ -531,11 +621,136 @@ 1 BASE_DIR/libraries/freertos_plus/aws/greengrass/include/aws_greengrass_discovery.h + + libraries/coreJSON/source/core_json.c + 1 + BASE_DIR/libraries/coreJSON/source/core_json.c + + + libraries/coreJSON/source/include/core_json.h + 1 + BASE_DIR/libraries/coreJSON/source/include/core_json.h + + + libraries/device_shadow_for_aws/source/shadow.c + 1 + BASE_DIR/libraries/device_shadow_for_aws/source/shadow.c + + + libraries/device_shadow_for_aws/source/include/shadow.h + 1 + BASE_DIR/libraries/device_shadow_for_aws/source/include/shadow.h + + + libraries/device_shadow_for_aws/source/include/shadow_config_defaults.h + 1 + BASE_DIR/libraries/device_shadow_for_aws/source/include/shadow_config_defaults.h + + + demos/common/mqtt_demo_helpers/mqtt_demo_helpers.c + 1 + BASE_DIR/demos/common/mqtt_demo_helpers/mqtt_demo_helpers.c + + + libraries/device_defender_for_aws/source/defender.c + 1 + BASE_DIR/libraries/device_defender_for_aws/source/defender.c + + + libraries/device_defender_for_aws/source/include/defender.h + 1 + BASE_DIR/libraries/device_defender_for_aws/source/include/defender.h + + + libraries/device_defender_for_aws/source/include/defender_config_defaults.h + 1 + BASE_DIR/libraries/device_defender_for_aws/source/include/defender_config_defaults.h + + + libraries/jobs_for_aws/source/jobs.c + 1 + BASE_DIR/libraries/jobs_for_aws/source/jobs.c + + + libraries/jobs_for_aws/source/include/jobs.h + 1 + BASE_DIR/libraries/jobs_for_aws/source/include/jobs.h + + + demos/coreHTTP/http_demo_mutual_auth.c + 1 + BASE_DIR/demos/coreHTTP/http_demo_mutual_auth.c + + + demos/coreHTTP/http_demo_s3_download.c + 1 + BASE_DIR/demos/coreHTTP/http_demo_s3_download.c + + + demos/coreHTTP/http_demo_s3_download_multithreaded.c + 1 + BASE_DIR/demos/coreHTTP/http_demo_s3_download_multithreaded.c + + + demos/coreHTTP/http_demo_s3_upload.c + 1 + BASE_DIR/demos/coreHTTP/http_demo_s3_upload.c + + + demos/coreMQTT/mqtt_demo_mutual_auth.c + 1 + BASE_DIR/demos/coreMQTT/mqtt_demo_mutual_auth.c + + + demos/coreMQTT/mqtt_demo_connection_sharing.c + 1 + BASE_DIR/demos/coreMQTT/mqtt_demo_connection_sharing.c + + + demos/device_defender_for_aws/defender_demo.c + 1 + BASE_DIR/demos/device_defender_for_aws/defender_demo.c + + + demos/device_defender_for_aws/report_builder.c + 1 + BASE_DIR/demos/device_defender_for_aws/report_builder.c + + + demos/device_defender_for_aws/metrics_collector/lwip/metrics_collector.c + 1 + BASE_DIR/demos/device_defender_for_aws/metrics_collector/lwip/metrics_collector.c + + + demos/device_defender_for_aws/metrics_collector/lwip/netif_port.h + 1 + BASE_DIR/demos/device_defender_for_aws/metrics_collector/lwip/netif_port.h + + + demos/device_defender_for_aws/report_builder.h + 1 + BASE_DIR/demos/device_defender_for_aws/report_builder.h + + + demos/device_defender_for_aws/metrics_collector.h + 1 + BASE_DIR/demos/device_defender_for_aws/metrics_collector.h + + + demos/device_shadow_for_aws/shadow_demo_main.c + 1 + BASE_DIR/demos/device_shadow_for_aws/shadow_demo_main.c + demos/greengrass_connectivity/aws_greengrass_discovery_demo.c 1 BASE_DIR/demos/greengrass_connectivity/aws_greengrass_discovery_demo.c + + demos/jobs_for_aws/jobs_demo.c + 1 + BASE_DIR/demos/jobs_for_aws/jobs_demo.c + application_code/cypress_code/app_dct.c 1 @@ -616,6 +831,76 @@ 1 BASE_DIR/vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/lwipopts.h + + config_files/core_http_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/core_http_config.h + + + config_files/core_mqtt_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/core_mqtt_config.h + + + config_files/core_pkcs11_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/core_pkcs11_config.h + + + config_files/defender_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/defender_config.h + + + config_files/http_demo_mutual_auth_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/http_demo_mutual_auth_config.h + + + config_files/http_demo_s3_download_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/http_demo_s3_download_config.h + + + config_files/http_demo_s3_download_multithreaded_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h + + + config_files/http_demo_s3_upload_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/http_demo_s3_upload_config.h + + + config_files/jobs_demo_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/jobs_demo_config.h + + + config_files/mqtt_demo_connection_sharing_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/mqtt_demo_connection_sharing_config.h + + + config_files/mqtt_demo_mutual_auth_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/mqtt_demo_mutual_auth_config.h + + + config_files/mqtt_demo_plaintext_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/mqtt_demo_plaintext_config.h + + + config_files/shadow_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/shadow_config.h + + + config_files/shadow_demo_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW943907AEVAL1F/aws_demos/config_files/shadow_demo_config.h + application_code/main.c 1 diff --git a/projects/cypress/CYW943907AEVAL1F/wicedstudio/aws_tests/.project b/projects/cypress/CYW943907AEVAL1F/wicedstudio/aws_tests/.project index e1a856df0b4..79fabd6bffc 100644 --- a/projects/cypress/CYW943907AEVAL1F/wicedstudio/aws_tests/.project +++ b/projects/cypress/CYW943907AEVAL1F/wicedstudio/aws_tests/.project @@ -252,9 +252,9 @@ AWS_IOT_MCU_ROOT/libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/core_pkcs11_mbedtls.c - libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/include/threading_alt.h + libraries/3rdparty/mbedtls_config/threading_alt.h 1 - AWS_IOT_MCU_ROOT/libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/include/threading_alt.h + AWS_IOT_MCU_ROOT/libraries/3rdparty/mbedtls_config/threading_alt.h libraries/freertos_plus/standard/crypto/src/iot_crypto.c diff --git a/projects/cypress/CYW954907AEVAL1F/wicedstudio/aws_demos/.project b/projects/cypress/CYW954907AEVAL1F/wicedstudio/aws_demos/.project index 8986656525c..971722ee78e 100644 --- a/projects/cypress/CYW954907AEVAL1F/wicedstudio/aws_demos/.project +++ b/projects/cypress/CYW954907AEVAL1F/wicedstudio/aws_demos/.project @@ -316,6 +316,56 @@ 1 BASE_DIR/libraries/c_sdk/standard/common/include/private/iot_taskpool_internal.h + + libraries/coreMQTT/source/core_mqtt.c + 1 + BASE_DIR/libraries/coreMQTT/source/core_mqtt.c + + + libraries/coreMQTT/source/core_mqtt_state.c + 1 + BASE_DIR/libraries/coreMQTT/source/core_mqtt_state.c + + + libraries/coreMQTT/source/core_mqtt_serializer.c + 1 + BASE_DIR/libraries/coreMQTT/source/core_mqtt_serializer.c + + + libraries/coreMQTT/source/include/core_mqtt.h + 1 + BASE_DIR/libraries/coreMQTT/source/include/core_mqtt.h + + + libraries/coreMQTT/source/include/core_mqtt_config_defaults.h + 1 + BASE_DIR/libraries/coreMQTT/source/include/core_mqtt_config_defaults.h + + + libraries/coreMQTT/source/include/core_mqtt_serializer.h + 1 + BASE_DIR/libraries/coreMQTT/source/include/core_mqtt_serializer.h + + + libraries/coreMQTT/source/include/core_mqtt_state.h + 1 + BASE_DIR/libraries/coreMQTT/source/include/core_mqtt_state.h + + + libraries/coreMQTT/source/interface/transport_interface.h + 1 + BASE_DIR/libraries/coreMQTT/source/interface/transport_interface.h + + + libraries/abstractions/backoff_algorithm/source/backoff_algorithm.c + 1 + BASE_DIR/libraries/abstractions/backoff_algorithm/source/backoff_algorithm.c + + + libraries/abstractions/backoff_algorithm/source/include/backoff_algorithm.h + 1 + BASE_DIR/libraries/abstractions/backoff_algorithm/source/include/backoff_algorithm.h + libraries/abstractions/platform/include/platform/iot_clock.h 1 @@ -427,9 +477,9 @@ BASE_DIR/libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/core_pkcs11_mbedtls.c - libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/include/threading_alt.h + libraries/3rdparty/mbedtls_config/threading_alt.h 1 - BASE_DIR/libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/include/threading_alt.h + BASE_DIR/libraries/3rdparty/mbedtls_config/threading_alt.h libraries/abstractions/wifi/include/iot_wifi.h @@ -506,6 +556,46 @@ 1 BASE_DIR/libraries/c_sdk/standard/mqtt/src/iot_mqtt_agent.c + + libraries/coreHTTP/source/core_http_client.c + 1 + BASE_DIR/libraries/coreHTTP/source/core_http_client.c + + + libraries/coreHTTP/source/dependency/3rdparty/http_parser/http_parser.c + 1 + BASE_DIR/libraries/coreHTTP/source/dependency/3rdparty/http_parser/http_parser.c + + + libraries/coreHTTP/source/include/core_http_client.h + 1 + BASE_DIR/libraries/coreHTTP/source/include/core_http_client.h + + + libraries/coreHTTP/source/include/core_http_client_private.h + 1 + BASE_DIR/libraries/coreHTTP/source/include/core_http_client_private.h + + + libraries/coreHTTP/source/include/core_http_config_defaults.h + 1 + BASE_DIR/libraries/coreHTTP/source/include/core_http_config_defaults.h + + + libraries/coreHTTP/source/interface/transport_interface.h + 1 + BASE_DIR/libraries/coreHTTP/source/interface/transport_interface.h + + + libraries/coreHTTP/source/dependency/3rdparty/http_parser/http_parser.h + 1 + BASE_DIR/libraries/coreHTTP/source/dependency/3rdparty/http_parser/http_parser.h + + + demos/common/http_demo_helpers/http_demo_utils.c + 1 + BASE_DIR/demos/common/http_demo_helpers/http_demo_utils.c + libraries/freertos_plus/aws/greengrass/src/aws_greengrass_discovery.c 1 @@ -531,11 +621,136 @@ 1 BASE_DIR/libraries/freertos_plus/aws/greengrass/include/aws_greengrass_discovery.h + + libraries/coreJSON/source/core_json.c + 1 + BASE_DIR/libraries/coreJSON/source/core_json.c + + + libraries/coreJSON/source/include/core_json.h + 1 + BASE_DIR/libraries/coreJSON/source/include/core_json.h + + + libraries/device_shadow_for_aws/source/shadow.c + 1 + BASE_DIR/libraries/device_shadow_for_aws/source/shadow.c + + + libraries/device_shadow_for_aws/source/include/shadow.h + 1 + BASE_DIR/libraries/device_shadow_for_aws/source/include/shadow.h + + + libraries/device_shadow_for_aws/source/include/shadow_config_defaults.h + 1 + BASE_DIR/libraries/device_shadow_for_aws/source/include/shadow_config_defaults.h + + + demos/common/mqtt_demo_helpers/mqtt_demo_helpers.c + 1 + BASE_DIR/demos/common/mqtt_demo_helpers/mqtt_demo_helpers.c + + + libraries/device_defender_for_aws/source/defender.c + 1 + BASE_DIR/libraries/device_defender_for_aws/source/defender.c + + + libraries/device_defender_for_aws/source/include/defender.h + 1 + BASE_DIR/libraries/device_defender_for_aws/source/include/defender.h + + + libraries/device_defender_for_aws/source/include/defender_config_defaults.h + 1 + BASE_DIR/libraries/device_defender_for_aws/source/include/defender_config_defaults.h + + + libraries/jobs_for_aws/source/jobs.c + 1 + BASE_DIR/libraries/jobs_for_aws/source/jobs.c + + + libraries/jobs_for_aws/source/include/jobs.h + 1 + BASE_DIR/libraries/jobs_for_aws/source/include/jobs.h + + + demos/coreHTTP/http_demo_mutual_auth.c + 1 + BASE_DIR/demos/coreHTTP/http_demo_mutual_auth.c + + + demos/coreHTTP/http_demo_s3_download.c + 1 + BASE_DIR/demos/coreHTTP/http_demo_s3_download.c + + + demos/coreHTTP/http_demo_s3_download_multithreaded.c + 1 + BASE_DIR/demos/coreHTTP/http_demo_s3_download_multithreaded.c + + + demos/coreHTTP/http_demo_s3_upload.c + 1 + BASE_DIR/demos/coreHTTP/http_demo_s3_upload.c + + + demos/coreMQTT/mqtt_demo_mutual_auth.c + 1 + BASE_DIR/demos/coreMQTT/mqtt_demo_mutual_auth.c + + + demos/coreMQTT/mqtt_demo_connection_sharing.c + 1 + BASE_DIR/demos/coreMQTT/mqtt_demo_connection_sharing.c + + + demos/device_defender_for_aws/defender_demo.c + 1 + BASE_DIR/demos/device_defender_for_aws/defender_demo.c + + + demos/device_defender_for_aws/report_builder.c + 1 + BASE_DIR/demos/device_defender_for_aws/report_builder.c + + + demos/device_defender_for_aws/metrics_collector/lwip/metrics_collector.c + 1 + BASE_DIR/demos/device_defender_for_aws/metrics_collector/lwip/metrics_collector.c + + + demos/device_defender_for_aws/metrics_collector/lwip/netif_port.h + 1 + BASE_DIR/demos/device_defender_for_aws/metrics_collector/lwip/netif_port.h + + + demos/device_defender_for_aws/report_builder.h + 1 + BASE_DIR/demos/device_defender_for_aws/report_builder.h + + + demos/device_defender_for_aws/metrics_collector.h + 1 + BASE_DIR/demos/device_defender_for_aws/metrics_collector.h + + + demos/device_shadow_for_aws/shadow_demo_main.c + 1 + BASE_DIR/demos/device_shadow_for_aws/shadow_demo_main.c + demos/greengrass_connectivity/aws_greengrass_discovery_demo.c 1 BASE_DIR/demos/greengrass_connectivity/aws_greengrass_discovery_demo.c + + demos/jobs_for_aws/jobs_demo.c + 1 + BASE_DIR/demos/jobs_for_aws/jobs_demo.c + application_code/cypress_code/app_dct.c 1 @@ -616,6 +831,76 @@ 1 BASE_DIR/vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/lwipopts.h + + config_files/core_http_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/core_http_config.h + + + config_files/core_mqtt_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/core_mqtt_config.h + + + config_files/core_pkcs11_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/core_pkcs11_config.h + + + config_files/defender_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/defender_config.h + + + config_files/http_demo_mutual_auth_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/http_demo_mutual_auth_config.h + + + config_files/http_demo_s3_download_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/http_demo_s3_download_config.h + + + config_files/http_demo_s3_download_multithreaded_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/http_demo_s3_download_multithreaded_config.h + + + config_files/http_demo_s3_upload_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/http_demo_s3_upload_config.h + + + config_files/jobs_demo_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/jobs_demo_config.h + + + config_files/mqtt_demo_connection_sharing_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/mqtt_demo_connection_sharing_config.h + + + config_files/mqtt_demo_mutual_auth_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/mqtt_demo_mutual_auth_config.h + + + config_files/mqtt_demo_plaintext_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/mqtt_demo_plaintext_config.h + + + config_files/shadow_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/shadow_config.h + + + config_files/shadow_demo_config.h + 1 + BASE_DIR/vendors/cypress/boards/CYW954907AEVAL1F/aws_demos/config_files/shadow_demo_config.h + application_code/main.c 1 diff --git a/projects/cypress/CYW954907AEVAL1F/wicedstudio/aws_tests/.project b/projects/cypress/CYW954907AEVAL1F/wicedstudio/aws_tests/.project index 5653e9d8435..02e65e5bfb7 100644 --- a/projects/cypress/CYW954907AEVAL1F/wicedstudio/aws_tests/.project +++ b/projects/cypress/CYW954907AEVAL1F/wicedstudio/aws_tests/.project @@ -252,9 +252,9 @@ AWS_IOT_MCU_ROOT/libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/core_pkcs11_mbedtls.c - libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/include/threading_alt.h + libraries/3rdparty/mbedtls_config/threading_alt.h 1 - AWS_IOT_MCU_ROOT/libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/include/threading_alt.h + AWS_IOT_MCU_ROOT/libraries/3rdparty/mbedtls_config/threading_alt.h libraries/freertos_plus/standard/crypto/src/iot_crypto.c diff --git a/projects/espressif/esp32/make/aws_demos/.project b/projects/espressif/esp32/make/aws_demos/.project index 68274670e72..f35f5e037b4 100644 --- a/projects/espressif/esp32/make/aws_demos/.project +++ b/projects/espressif/esp32/make/aws_demos/.project @@ -1232,9 +1232,9 @@ PARENT-1-BASE_DIR_ROOT/libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/core_pkcs11_mbedtls.c - libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/include/threading_alt.h + libraries/3rdparty/mbedtls_config/threading_alt.h 1 - PARENT-1-BASE_DIR_ROOT/libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/include/threading_alt.h + PARENT-1-BASE_DIR_ROOT/libraries/3rdparty/mbedtls_config/threading_alt.h libraries/abstractions/pkcs11/test/iot_test_pkcs11.c diff --git a/projects/espressif/esp32/make/aws_tests/.project b/projects/espressif/esp32/make/aws_tests/.project index db7a4b52098..6c9c56eef13 100644 --- a/projects/espressif/esp32/make/aws_tests/.project +++ b/projects/espressif/esp32/make/aws_tests/.project @@ -1516,9 +1516,9 @@ PARENT-1-BASE_DIR_ROOT/libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/core_pkcs11_mbedtls.c - libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/include/threading_alt.h + libraries/3rdparty/mbedtls_config/threading_alt.h 1 - PARENT-1-BASE_DIR_ROOT/libraries/abstractions/pkcs11/corePKCS11/source/portable/mbedtls/include/threading_alt.h + PARENT-1-BASE_DIR_ROOT/libraries/3rdparty/mbedtls_config/threading_alt.h libraries/abstractions/pkcs11/test/iot_test_pkcs11.c diff --git a/projects/infineon/xmc4800_iotkit/dave4/aws_demos/.cproject b/projects/infineon/xmc4800_iotkit/dave4/aws_demos/.cproject index 3d699d59e65..ab51471e34a 100644 --- a/projects/infineon/xmc4800_iotkit/dave4/aws_demos/.cproject +++ b/projects/infineon/xmc4800_iotkit/dave4/aws_demos/.cproject @@ -59,11 +59,16 @@ - + + + + + + @@ -71,12 +76,14 @@ + + + + - - + -

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�Wl5z9k!9GrZlr9f;mg7_38~@a@msWFm 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