Re-sync with upstream and stripping away none kernel related.
diff --git a/FreeRTOS+TCP.url b/FreeRTOS+TCP.url
deleted file mode 100644
index 2da199c..0000000
--- a/FreeRTOS+TCP.url
+++ /dev/null
@@ -1,5 +0,0 @@
-[{000214A0-0000-0000-C000-000000000046}]
-Prop3=19,2
-[InternetShortcut]
-URL=http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html
-IDList=
diff --git a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/Common/FreeRTOS_TCP_server.c b/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/Common/FreeRTOS_TCP_server.c
deleted file mode 100644
index 3b9f8fb..0000000
--- a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/Common/FreeRTOS_TCP_server.c
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * FreeRTOS+TCP V2.0.3
- * Copyright (C) 2017 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 <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-#include "task.h"
-
-/* FreeRTOS+TCP includes. */
-#include "FreeRTOS_IP.h"
-#include "FreeRTOS_Sockets.h"
-#include "FreeRTOS_TCP_server.h"
-#include "FreeRTOS_server_private.h"
-
-/* Remove the entire file if TCP is not being used. */
-#if( ipconfigUSE_TCP == 1 ) && ( ( ipconfigUSE_HTTP == 1 ) || ( ipconfigUSE_FTP == 1 ) )
-
-#if !defined( ARRAY_SIZE )
- #define ARRAY_SIZE(x) ( BaseType_t ) (sizeof( x ) / sizeof( x )[ 0 ] )
-#endif
-
-
-static void prvReceiveNewClient( TCPServer_t *pxServer, BaseType_t xIndex, Socket_t xNexSocket );
-static char *strnew( const char *pcString );
-/* Remove slashes at the end of a path. */
-static void prvRemoveSlash( char *pcDir );
-
-TCPServer_t *FreeRTOS_CreateTCPServer( const struct xSERVER_CONFIG *pxConfigs, BaseType_t xCount )
-{
-TCPServer_t *pxServer;
-SocketSet_t xSocketSet;
-
- /* Create a new server.
- xPort / xPortAlt : Make the service available on 1 or 2 public port numbers. */
- xSocketSet = FreeRTOS_CreateSocketSet();
-
- if( xSocketSet != NULL )
- {
- BaseType_t xSize;
-
- xSize = sizeof( *pxServer ) - sizeof( pxServer->xServers ) + xCount * sizeof( pxServer->xServers[ 0 ] );
-
- pxServer = ( TCPServer_t * ) pvPortMallocLarge( xSize );
- if( pxServer != NULL )
- {
- struct freertos_sockaddr xAddress;
- BaseType_t xNoTimeout = 0;
- BaseType_t xIndex;
-
- memset( pxServer, '\0', xSize );
- pxServer->xServerCount = xCount;
- pxServer->xSocketSet = xSocketSet;
-
- for( xIndex = 0; xIndex < xCount; xIndex++ )
- {
- BaseType_t xPortNumber = pxConfigs[ xIndex ].xPortNumber;
-
- if( xPortNumber > 0 )
- {
- Socket_t xSocket;
-
- xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
- FreeRTOS_printf( ( "TCP socket on port %d\n", ( int )xPortNumber ) );
-
- if( xSocket != FREERTOS_NO_SOCKET )
- {
- xAddress.sin_addr = FreeRTOS_GetIPAddress(); // Single NIC, currently not used
- xAddress.sin_port = FreeRTOS_htons( xPortNumber );
-
- FreeRTOS_bind( xSocket, &xAddress, sizeof( xAddress ) );
- FreeRTOS_listen( xSocket, pxConfigs[ xIndex ].xBackLog );
-
- FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, ( void * ) &xNoTimeout, sizeof( BaseType_t ) );
- FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_SNDTIMEO, ( void * ) &xNoTimeout, sizeof( BaseType_t ) );
-
- #if( ipconfigHTTP_RX_BUFSIZE > 0 )
- {
- if( pxConfigs[ xIndex ].eType == eSERVER_HTTP )
- {
- WinProperties_t xWinProps;
-
- memset( &xWinProps, '\0', sizeof( xWinProps ) );
- /* The parent socket itself won't get connected. The properties below
- will be inherited by each new child socket. */
- xWinProps.lTxBufSize = ipconfigHTTP_TX_BUFSIZE;
- xWinProps.lTxWinSize = ipconfigHTTP_TX_WINSIZE;
- xWinProps.lRxBufSize = ipconfigHTTP_RX_BUFSIZE;
- xWinProps.lRxWinSize = ipconfigHTTP_RX_WINSIZE;
-
- /* Set the window and buffer sizes. */
- FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_WIN_PROPERTIES, ( void * ) &xWinProps, sizeof( xWinProps ) );
- }
- }
- #endif
-
- FreeRTOS_FD_SET( xSocket, xSocketSet, eSELECT_READ|eSELECT_EXCEPT );
- pxServer->xServers[ xIndex ].xSocket = xSocket;
- pxServer->xServers[ xIndex ].eType = pxConfigs[ xIndex ].eType;
- pxServer->xServers[ xIndex ].pcRootDir = strnew( pxConfigs[ xIndex ].pcRootDir );
- prvRemoveSlash( ( char * ) pxServer->xServers[ xIndex ].pcRootDir );
- }
- }
- }
- }
- else
- {
- /* Could not allocate the server, delete the socket set */
- FreeRTOS_DeleteSocketSet( xSocketSet );
- }
- }
- else
- {
- /* Could not create a socket set, return NULL */
- pxServer = NULL;
- }
-
- return pxServer;
-}
-/*-----------------------------------------------------------*/
-
-static void prvReceiveNewClient( TCPServer_t *pxServer, BaseType_t xIndex, Socket_t xNexSocket )
-{
-TCPClient_t *pxClient = NULL;
-BaseType_t xSize = 0;
-FTCPWorkFunction fWorkFunc = NULL;
-FTCPDeleteFunction fDeleteFunc = NULL;
-const char *pcType = "Unknown";
-
- /*_RB_ Can the work and delete functions be part of the xSERVER_CONFIG structure
- becomes generic, with no pre-processing required? */
- #if( ipconfigUSE_HTTP != 0 )
- {
- if( pxServer->xServers[ xIndex ].eType == eSERVER_HTTP )
- {
- xSize = sizeof( HTTPClient_t );
- fWorkFunc = xHTTPClientWork;
- fDeleteFunc = vHTTPClientDelete;
- pcType = "HTTP";
- }
- }
- #endif /* ipconfigUSE_HTTP != 0 */
-
- #if( ipconfigUSE_FTP != 0 )
- {
- if( pxServer->xServers[ xIndex ].eType == eSERVER_FTP )
- {
- xSize = sizeof( FTPClient_t );
- fWorkFunc = xFTPClientWork;
- fDeleteFunc = vFTPClientDelete;
- pcType = "FTP";
- }
- }
- #endif /* ipconfigUSE_FTP != 0 */
-
- /* Malloc enough space for a new HTTP-client */
- if( xSize )
- {
- pxClient = ( TCPClient_t* ) pvPortMallocLarge( xSize );
- }
-
- if( pxClient != NULL )
- {
- memset( pxClient, '\0', xSize );
-
- /* Put the new client in front of the list. */
- pxClient->eType = pxServer->xServers[ xIndex ].eType;
- pxClient->pcRootDir = pxServer->xServers[ xIndex ].pcRootDir;
- pxClient->pxParent = pxServer;
- pxClient->xSocket = xNexSocket;
- pxClient->pxNextClient = pxServer->pxClients;
- pxClient->fWorkFunction = fWorkFunc;
- pxClient->fDeleteFunction = fDeleteFunc;
- pxServer->pxClients = pxClient;
-
- FreeRTOS_FD_SET( xNexSocket, pxServer->xSocketSet, eSELECT_READ|eSELECT_EXCEPT );
- }
- else
- {
- pcType = "closed";
- FreeRTOS_closesocket( xNexSocket );
- }
- {
- struct freertos_sockaddr xRemoteAddress;
- FreeRTOS_GetRemoteAddress( pxClient->xSocket, &xRemoteAddress );
- FreeRTOS_printf( ( "TPC-server: new %s client %xip\n", pcType, (unsigned)FreeRTOS_ntohl( xRemoteAddress.sin_addr ) ) );
- }
-
- /* Remove compiler warnings in case FreeRTOS_printf() is not used. */
- ( void ) pcType;
-}
-/*-----------------------------------------------------------*/
-
-void FreeRTOS_TCPServerWork( TCPServer_t *pxServer, TickType_t xBlockingTime )
-{
-TCPClient_t **ppxClient;
-BaseType_t xIndex;
-BaseType_t xRc;
-
- /* Let the server do one working cycle */
- xRc = FreeRTOS_select( pxServer->xSocketSet, xBlockingTime );
-
- if( xRc != 0 )
- {
- for( xIndex = 0; xIndex < pxServer->xServerCount; xIndex++ )
- {
- struct freertos_sockaddr xAddress;
- Socket_t xNexSocket;
- socklen_t xSocketLength;
-
- if( pxServer->xServers[ xIndex ].xSocket == FREERTOS_NO_SOCKET )
- {
- continue;
- }
-
- xSocketLength = sizeof( xAddress );
- xNexSocket = FreeRTOS_accept( pxServer->xServers[ xIndex ].xSocket, &xAddress, &xSocketLength);
-
- if( ( xNexSocket != FREERTOS_NO_SOCKET ) && ( xNexSocket != FREERTOS_INVALID_SOCKET ) )
- {
- prvReceiveNewClient( pxServer, xIndex, xNexSocket );
- }
- }
- }
-
- ppxClient = &pxServer->pxClients;
-
- while( ( * ppxClient ) != NULL )
- {
- TCPClient_t *pxThis = *ppxClient;
-
- /* Almost C++ */
- xRc = pxThis->fWorkFunction( pxThis );
-
- if (xRc < 0 )
- {
- *ppxClient = pxThis->pxNextClient;
- /* Close handles, resources */
- pxThis->fDeleteFunction( pxThis );
- /* Free the space */
- vPortFreeLarge( pxThis );
- }
- else
- {
- ppxClient = &( pxThis->pxNextClient );
- }
- }
-}
-/*-----------------------------------------------------------*/
-
-static char *strnew( const char *pcString )
-{
-BaseType_t xLength;
-char *pxBuffer;
-
- xLength = strlen( pcString ) + 1;
- pxBuffer = ( char * ) pvPortMalloc( xLength );
- if( pxBuffer != NULL )
- {
- memcpy( pxBuffer, pcString, xLength );
- }
-
- return pxBuffer;
-}
-/*-----------------------------------------------------------*/
-
-static void prvRemoveSlash( char *pcDir )
-{
-BaseType_t xLength = strlen( pcDir );
-
- while( ( xLength > 0 ) && ( pcDir[ xLength - 1 ] == '/' ) )
- {
- pcDir[ --xLength ] = '\0';
- }
-}
-/*-----------------------------------------------------------*/
-
-#if( ipconfigSUPPORT_SIGNALS != 0 )
-
- /* FreeRTOS_TCPServerWork() calls select().
- The two functions below provide a possibility to interrupt
- the call to select(). After the interruption, resume
- by calling FreeRTOS_TCPServerWork() again. */
- BaseType_t FreeRTOS_TCPServerSignal( TCPServer_t *pxServer )
- {
- BaseType_t xIndex;
- BaseType_t xResult = pdFALSE;
- for( xIndex = 0; xIndex < pxServer->xServerCount; xIndex++ )
- {
- if( pxServer->xServers[ xIndex ].xSocket != FREERTOS_NO_SOCKET )
- {
- FreeRTOS_SignalSocket( pxServer->xServers[ xIndex ].xSocket );
- xResult = pdTRUE;
- break;
- }
- }
-
- return xResult;
- }
-
-#endif /* ipconfigSUPPORT_SIGNALS */
-/*-----------------------------------------------------------*/
-
-#if( ipconfigSUPPORT_SIGNALS != 0 )
-
- /* Same as above: this function may be called from an ISR,
- for instance a GPIO interrupt. */
- BaseType_t FreeRTOS_TCPServerSignalFromISR( TCPServer_t *pxServer, BaseType_t *pxHigherPriorityTaskWoken )
- {
- BaseType_t xIndex;
- BaseType_t xResult = pdFALSE;
- for( xIndex = 0; xIndex < pxServer->xServerCount; xIndex++ )
- {
- if( pxServer->xServers[ xIndex ].xSocket != FREERTOS_NO_SOCKET )
- {
- FreeRTOS_SignalSocketFromISR( pxServer->xServers[ xIndex ].xSocket, pxHigherPriorityTaskWoken );
- xResult = pdTRUE;
- break;
- }
- }
-
- return xResult;
- }
-#endif /* ipconfigSUPPORT_SIGNALS */
-/*-----------------------------------------------------------*/
-
-#endif /* ( ipconfigUSE_TCP == 1 ) && ( ( ipconfigUSE_HTTP == 1 ) || ( ipconfigUSE_FTP == 1 ) ) */
diff --git a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/FTP/FreeRTOS_FTP_commands.c b/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/FTP/FreeRTOS_FTP_commands.c
deleted file mode 100644
index b399f36..0000000
--- a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/FTP/FreeRTOS_FTP_commands.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * FreeRTOS+TCP V2.0.3
- * Copyright (C) 2017 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
- */
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-
-/* FreeRTOS+TCP includes. */
-#include "FreeRTOS_FTP_commands.h"
-
-const FTPCommand_t xFTPCommands[ FTP_CMD_COUNT ] =
-{
-/* cmdLen cmdName[7] cmdType checkLogin checkNullArg */
- { 4, "USER", ECMD_USER, pdFALSE, pdFALSE },
- { 4, "PASS", ECMD_PASS, pdFALSE, pdFALSE },
- { 4, "ACCT", ECMD_ACCT, pdTRUE, pdFALSE },
- { 3, "CWD", ECMD_CWD, pdTRUE, pdTRUE },
- { 4, "CDUP", ECMD_CDUP, pdTRUE, pdFALSE },
- { 4, "SMNT", ECMD_SMNT, pdTRUE, pdFALSE },
- { 4, "QUIT", ECMD_QUIT, pdTRUE, pdFALSE },
- { 4, "REIN", ECMD_REIN, pdTRUE, pdFALSE },
- { 4, "PORT", ECMD_PORT, pdTRUE, pdFALSE },
- { 4, "PASV", ECMD_PASV, pdTRUE, pdFALSE },
- { 4, "TYPE", ECMD_TYPE, pdTRUE, pdFALSE },
- { 4, "STRU", ECMD_STRU, pdTRUE, pdFALSE },
- { 4, "MODE", ECMD_MODE, pdTRUE, pdFALSE },
- { 4, "RETR", ECMD_RETR, pdTRUE, pdTRUE },
- { 4, "STOR", ECMD_STOR, pdTRUE, pdTRUE },
- { 4, "STOU", ECMD_STOU, pdTRUE, pdFALSE },
- { 4, "APPE", ECMD_APPE, pdTRUE, pdFALSE },
- { 4, "ALLO", ECMD_ALLO, pdTRUE, pdFALSE },
- { 4, "REST", ECMD_REST, pdTRUE, pdFALSE },
- { 4, "RNFR", ECMD_RNFR, pdTRUE, pdTRUE },
- { 4, "RNTO", ECMD_RNTO, pdTRUE, pdTRUE },
- { 4, "ABOR", ECMD_ABOR, pdTRUE, pdFALSE },
- { 4, "SIZE", ECMD_SIZE, pdTRUE, pdTRUE },
- { 4, "MDTM", ECMD_MDTM, pdTRUE, pdTRUE },
- { 4, "DELE", ECMD_DELE, pdTRUE, pdTRUE },
- { 3, "RMD", ECMD_RMD, pdTRUE, pdTRUE },
- { 3, "MKD", ECMD_MKD, pdTRUE, pdTRUE },
- { 3, "PWD", ECMD_PWD, pdTRUE, pdFALSE },
- { 4, "LIST", ECMD_LIST, pdTRUE, pdFALSE },
- { 4, "NLST", ECMD_NLST, pdTRUE, pdFALSE },
- { 4, "SITE", ECMD_SITE, pdTRUE, pdFALSE },
- { 4, "SYST", ECMD_SYST, pdFALSE, pdFALSE },
- { 4, "FEAT", ECMD_FEAT, pdFALSE, pdFALSE },
- { 4, "STAT", ECMD_STAT, pdTRUE, pdFALSE },
- { 4, "HELP", ECMD_HELP, pdFALSE, pdFALSE },
- { 4, "NOOP", ECMD_NOOP, pdFALSE, pdFALSE },
- { 4, "EMPT", ECMD_EMPTY, pdFALSE, pdFALSE },
- { 4, "CLOS", ECMD_CLOSE, pdTRUE, pdFALSE },
- { 4, "UNKN", ECMD_UNKNOWN, pdFALSE, pdFALSE },
-};
diff --git a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/FTP/FreeRTOS_FTP_server.c b/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/FTP/FreeRTOS_FTP_server.c
deleted file mode 100644
index a2a6ba1..0000000
--- a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/FTP/FreeRTOS_FTP_server.c
+++ /dev/null
@@ -1,2637 +0,0 @@
-/*
- * FreeRTOS+TCP V2.0.3
- * Copyright (C) 2017 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 <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-#include "task.h"
-#include "portmacro.h"
-
-/* FreeRTOS+TCP includes. */
-#include "FreeRTOS_IP.h"
-#include "FreeRTOS_TCP_IP.h"
-#include "FreeRTOS_Sockets.h"
-#include "FreeRTOS_Stream_Buffer.h"
-
-/* FreeRTOS Protocol includes. */
-#include "FreeRTOS_FTP_commands.h"
-#include "FreeRTOS_TCP_server.h"
-#include "FreeRTOS_server_private.h"
-
-/* Remove the whole file if FTP is not supported. */
-#if( ipconfigUSE_FTP == 1 )
-
-#ifndef HTTP_SERVER_BACKLOG
- #define HTTP_SERVER_BACKLOG ( 12 )
-#endif
-
-#if !defined( ARRAY_SIZE )
- #define ARRAY_SIZE( x ) ( BaseType_t ) (sizeof( x ) / sizeof( x )[ 0 ] )
-#endif
-
-#if defined(__WIN32__) && !defined(ipconfigFTP_FS_USES_BACKSLAH)
- #define ipconfigFTP_FS_USES_BACKSLAH 1
-#endif
-
-/* Some defines to make the code more readbale */
-#define pcCOMMAND_BUFFER pxClient->pxParent->pcCommandBuffer
-#define pcNEW_DIR pxClient->pxParent->pcNewDir
-#define pcFILE_BUFFER pxClient->pxParent->pcFileBuffer
-
-/* This FTP server will only do binary transfers */
-#define TMODE_BINARY 1
-#define TMODE_ASCII 2
-#define TMODE_7BITS 3
-#define TMODE_8BITS 4
-
-/* Ascii character definitions. */
-#define ftpASCII_CR 13
-#define ftpASCII_LF 10
-
-#if defined( FTP_WRITES_ALIGNED ) || defined( ipconfigFTP_WRITES_ALIGNED )
- #error Name change : please rename the define to the new name 'ipconfigFTP_ZERO_COPY_ALIGNED_WRITES'
-#endif
-
-/*
- * ipconfigFTP_ZERO_COPY_ALIGNED_WRITES : experimental optimisation option.
- * If non-zero, receiving data will be done with the zero-copy method and also
- * writes to disk will be done with sector-alignment as much as possible.
- */
-#ifndef ipconfigFTP_ZERO_COPY_ALIGNED_WRITES
- #define ipconfigFTP_ZERO_COPY_ALIGNED_WRITES 0
-#endif
-
-/*
- * This module only has 2 public functions:
- */
-BaseType_t xFTPClientWork( TCPClient_t *pxClient );
-void vFTPClientDelete( TCPClient_t *pxClient );
-
-/*
- * Process a single command.
- */
-static BaseType_t prvProcessCommand( FTPClient_t *pxClient, BaseType_t xIndex, char *pcRestCommand );
-
-/*
- * Create a socket for a data connection to the FTP client.
- */
-static BaseType_t prvTransferConnect( FTPClient_t *pxClient, BaseType_t xDoListen );
-
-/*
- * Either call listen() or connect() to start the transfer connection.
- */
-static BaseType_t prvTransferStart( FTPClient_t *pxClient );
-
-/*
- * See if the socket has got connected or disconnected. Close the socket if
- * necessary.
- */
-static void prvTransferCheck( FTPClient_t *pxClient );
-
-/*
- * Close the data socket and issue some informative logging.
- */
-static void prvTransferCloseSocket( FTPClient_t *pxClient );
-
-/*
- * Close the file handle (pxReadHandle or pxWriteHandle).
- */
-static void prvTransferCloseFile( FTPClient_t *pxClient );
-
-/*
- * Close a directory (-handle).
- */
-static void prvTransferCloseDir( FTPClient_t *pxClient );
-
-/*
- * Translate a string (indicating a transfer type) to a number.
- */
-static BaseType_t prvGetTransferType( const char *pcType );
-
-#if( ipconfigHAS_PRINTF != 0 )
- /*
- * For nice logging: write an amount (number of bytes), e.g. 3512200 as
- * "3.45 MB"
- */
- static const char *pcMkSize( uint32_t ulAmount, char *pcBuffer, BaseType_t xBufferSize );
-#endif
-
-#if( ipconfigHAS_PRINTF != 0 )
- /*
- * Calculate the average as bytes-per-second, when amount and milliseconds
- * are known.
- */
- static uint32_t ulGetAverage( uint32_t ulAmount, TickType_t xDeltaMs );
-#endif
-
-/*
- * A port command looks like: PORT h1,h2,h3,h4,p1,p2. Parse it and translate it
- * to an IP-address and a port number.
- */
-static UBaseType_t prvParsePortData( const char *pcCommand, uint32_t *pulIPAddress );
-
-/*
- * CWD: Change current working directory.
- */
-
-static BaseType_t prvChangeDir( FTPClient_t *pxClient, char *pcDirectory );
-
-/*
- * RNFR: Rename from ...
- */
-static BaseType_t prvRenameFrom( FTPClient_t *pxClient, const char *pcFileName );
-
-/*
- * RNTO: Rename to ...
- */
-static BaseType_t prvRenameTo( FTPClient_t *pxClient, const char *pcFileName );
-
-/*
- * SITE: Change file permissions.
- */
-static BaseType_t prvSiteCmd( FTPClient_t *pxClient, char *pcRestCommand );
-
-/*
- * DELE: Delete a file.
- */
-static BaseType_t prvDeleteFile( FTPClient_t *pxClient, char *pcFileName );
-
-/*
- * SIZE: get the size of a file (xSendDate = 0).
- * MDTM: get data and time properties (xSendDate = 1).
- */
-static BaseType_t prvSizeDateFile( FTPClient_t *pxClient, char *pcFileName, BaseType_t xSendDate );
-
-/*
- * MKD: Make / create a directory (xDoRemove = 0).
- * RMD: Remove a directory (xDoRemove = 1).
- */
-static BaseType_t prvMakeRemoveDir( FTPClient_t *pxClient, const char *pcDirectory, BaseType_t xDoRemove );
-
-/*
- * The next three commands: LIST, RETR and STOR all require a data socket.
- * The data connection is either started with a 'PORT' or a 'PASV' command.
- * Each of the commands has a prepare- (Prep) and a working- (Work) function.
- * The Work function should be called as long as the data socket is open, and
- * there is data to be transmitted.
- */
-
-/*
- * LIST: Send a directory listing in Unix style.
- */
-static BaseType_t prvListSendPrep( FTPClient_t *pxClient );
-static BaseType_t prvListSendWork( FTPClient_t *pxClient );
-
-/*
- * RETR: Send a file to the FTP client.
- */
-static BaseType_t prvRetrieveFilePrep( FTPClient_t *pxClient, char *pcFileName );
-static BaseType_t prvRetrieveFileWork( FTPClient_t *pxClient );
-
-/*
- * STOR: Receive a file from the FTP client and store it.
- */
-static BaseType_t prvStoreFilePrep( FTPClient_t *pxClient, char *pcFileName );
-static BaseType_t prvStoreFileWork( FTPClient_t *pxClient );
-
-/*
- * Print/format a single directory entry in Unix style.
- */
-static BaseType_t prvGetFileInfoStat( FF_DirEnt_t *pxEntry, char *pcLine, BaseType_t xMaxLength );
-
-/*
- * Send a reply to a socket, either the command- or the data-socket.
- */
-static BaseType_t prvSendReply( Socket_t xSocket, const char *pcBuffer, BaseType_t xLength );
-
-/*
- * Prepend the root directory (if any), plus the current working directory
- * (always), to get an absolute path.
- */
-BaseType_t xMakeAbsolute( FTPClient_t *pxClient, char *pcBuffer, BaseType_t xBufferLength, const char *pcPath );
-
-/*
-
-####### ##### ###### # # ##
- # ## # # # # # # # #
- # # # # # # #
- # # # # # # # #### ### ## # #
- ##### # ##### # # # # # # # # # #
- # # # # # # # # # ## # ####
- # # # ## ## # # # # #
- # # # ## ## # # # # #
-#### #### #### ## ## #### #### ## ##
-
- * xFTPClientWork()
- * will be called by FreeRTOS_TCPServerWork(), after select has expired().
- * FD_ISSET will not be used. This work function will always be called at
- * regular intervals, and also after a select() event has occurred.
- */
-BaseType_t xFTPClientWork( TCPClient_t *pxTCPClient )
-{
-FTPClient_t *pxClient = ( FTPClient_t * ) pxTCPClient;
-BaseType_t xRc;
-
- if( pxClient->bits.bHelloSent == pdFALSE_UNSIGNED )
- {
- BaseType_t xLength;
-
- pxClient->bits.bHelloSent = pdTRUE_UNSIGNED;
-
- xLength = snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ),
- "220 Welcome to the FreeRTOS+TCP FTP server\r\n" );
- prvSendReply( pxClient->xSocket, pcCOMMAND_BUFFER, xLength );
- }
-
- /* Call recv() in a non-blocking way, to see if there is an FTP command
- sent to this server. */
- xRc = FreeRTOS_recv( pxClient->xSocket, ( void * )pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ), 0 );
-
- if( xRc > 0 )
- {
- BaseType_t xIndex;
- const FTPCommand_t *pxCommand;
- char *pcRestCommand;
-
- if( xRc < ( BaseType_t ) sizeof( pcCOMMAND_BUFFER ) )
- {
- pcCOMMAND_BUFFER[ xRc ] = '\0';
- }
-
- while( xRc && ( ( pcCOMMAND_BUFFER[ xRc - 1 ] == ftpASCII_CR ) || ( pcCOMMAND_BUFFER[ xRc - 1 ] == ftpASCII_LF ) ) )
- {
- pcCOMMAND_BUFFER[ --xRc ] = '\0';
- }
-
- /* Now iterate through a list of FTP commands, and look for a match. */
- pxCommand = xFTPCommands;
- pcRestCommand = pcCOMMAND_BUFFER;
- for( xIndex = 0; xIndex < FTP_CMD_COUNT - 1; xIndex++, pxCommand++ )
- {
- BaseType_t xLength;
-
- /* The length of each command is stored as well, just to be a bit
- quicker here. */
- xLength = pxCommand->xCommandLength;
-
- if( ( xRc >= xLength ) && ( memcmp( ( const void * ) pxCommand->pcCommandName, ( const void * ) pcCOMMAND_BUFFER, xLength ) == 0 ) )
- {
- /* A match with an existing command is found. Skip any
- whitespace to get the first parameter. */
- pcRestCommand += xLength;
- while( ( *pcRestCommand == ' ' ) || ( *pcRestCommand == '\t' ) )
- {
- pcRestCommand++;
- }
- break;
- }
- }
-
- /* If the command received was not recognised, xIndex will point to a
- fake entry called 'ECMD_UNKNOWN'. */
- prvProcessCommand( pxClient, xIndex, pcRestCommand );
- }
- else if( xRc < 0 )
- {
- /* The connection will be closed and the client will be deleted. */
- FreeRTOS_printf( ( "xFTPClientWork: xRc = %ld\n", xRc ) );
- }
-
- /* Does it have an open data connection? */
- if( pxClient->xTransferSocket != FREERTOS_NO_SOCKET )
- {
- /* See if the connection has changed. */
- prvTransferCheck( pxClient );
-
- /* "pcConnectionAck" contains a string like:
- "Response: 150 Accepted data connection from 192.168.2.3:6789"
- The socket can only be used once this acknowledgement has been sent. */
- if( ( pxClient->xTransferSocket != FREERTOS_NO_SOCKET ) && ( pxClient->pcConnectionAck[ 0 ] == '\0' ) )
- {
- BaseType_t xClientRc = 0;
-
- if( pxClient->bits1.bDirHasEntry )
- {
- /* Still listing a directory. */
- xClientRc = prvListSendWork( pxClient );
- }
- else if( pxClient->pxReadHandle != NULL )
- {
- /* Sending a file. */
- xClientRc = prvRetrieveFileWork( pxClient );
- }
- else if( pxClient->pxWriteHandle != NULL )
- {
- /* Receiving a file. */
- xClientRc = prvStoreFileWork( pxClient );
- }
-
- if( xClientRc < 0 )
- {
- prvTransferCloseSocket( pxClient );
- prvTransferCloseFile( pxClient );
- }
- }
- }
-
- return xRc;
-}
-/*-----------------------------------------------------------*/
-
-static void prvTransferCloseDir( FTPClient_t *pxClient )
-{
- /* Nothing to close for +FAT. */
- ( void ) pxClient;
-}
-/*-----------------------------------------------------------*/
-
-void vFTPClientDelete( TCPClient_t *pxTCPClient )
-{
-FTPClient_t *pxClient = ( FTPClient_t * ) pxTCPClient;
-
- /* Close any directory-listing-handles (not used by +FAT ). */
- prvTransferCloseDir( pxClient );
- /* Close the data-socket. */
- prvTransferCloseSocket( pxClient );
- /* Close any open file handle. */
- prvTransferCloseFile( pxClient );
-
- /* Close the FTP command socket */
- if( pxClient->xSocket != FREERTOS_NO_SOCKET )
- {
- FreeRTOS_FD_CLR( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_ALL );
- FreeRTOS_closesocket( pxClient->xSocket );
- pxClient->xSocket = FREERTOS_NO_SOCKET;
- }
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvProcessCommand( FTPClient_t *pxClient, BaseType_t xIndex, char *pcRestCommand )
-{
-const FTPCommand_t *pxFTPCommand = &( xFTPCommands[ xIndex ] );
-const char *pcMyReply = NULL;
-BaseType_t xResult = 0;
-
- if( ( pxFTPCommand->ucCommandType != ECMD_PASS ) && ( pxFTPCommand->ucCommandType != ECMD_PORT ) )
- {
- FreeRTOS_printf( ( " %s %s\n", pxFTPCommand->pcCommandName, pcRestCommand ) );
- }
-
- if( ( pxFTPCommand->checkLogin != pdFALSE ) && ( pxClient->bits.bLoggedIn == pdFALSE_UNSIGNED ) )
- {
- pcMyReply = REPL_530; /* Please first log in. */
- }
- else if( ( pxFTPCommand->checkNullArg != pdFALSE ) && ( ( pcRestCommand == NULL ) || ( pcRestCommand[ 0 ] == '\0' ) ) )
- {
- pcMyReply = REPL_501; /* Command needs a parameter. */
- }
-
- if( pcMyReply == NULL )
- {
- switch( pxFTPCommand->ucCommandType )
- {
- case ECMD_USER: /* User. */
- /* User name has been entered, expect password. */
- pxClient->bits.bStatusUser = pdTRUE_UNSIGNED;
-
- #if( ipconfigFTP_HAS_USER_PASSWORD_HOOK != 0 )/*_RB_ Needs defaulting and adding to the web documentation. */
- {
- /* Save the user name in 'pcFileName'. */
- snprintf( pxClient->pcFileName, sizeof( pxClient->pcFileName ), "%s", pcRestCommand );
-
- /* The USER name is presented to the application. The function
- may return a const string like "331 Please enter your
- password\r\n". */
- pcMyReply = pcApplicationFTPUserHook( pxClient->pcFileName );
- if( pcMyReply == NULL )
- {
- pcMyReply = REPL_331_ANON;
- }
- }
- #else
- {
- /* No password checks, any password will be accepted. */
- pcMyReply = REPL_331_ANON;
- }
- #endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK != 0 */
-
- #if( ipconfigFTP_HAS_USER_PROPERTIES_HOOK != 0 )/*_RB_ Needs defaulting and adding to the web documentation. */
- {
- FTPUserProperties_t xProperties;
-
- xProperties.pcRootDir = pxClient->pcRootDir;
- xProperties.xReadOnly = pdFALSE;
- xProperties.usPortNumber = pxClient->usClientPort;
- vApplicationFTPUserPropertiesHook( pxClient->pcFileName, &( xProperties ) );
-
- if( xProperties.pcRootDir != NULL )
- {
- pxClient->pcRootDir = xProperties.pcRootDir;
- }
- pxClient->bits.bReadOnly = ( xProperties.xReadOnly != pdFALSE_UNSIGNED );
- }
- #endif /* ipconfigFTP_HAS_USER_PROPERTIES_HOOK */
- break;
-
- case ECMD_PASS: /* Password. */
- pxClient->ulRestartOffset = 0;
- if( pxClient->bits.bStatusUser == pdFALSE_UNSIGNED )
- {
- pcMyReply = REPL_503; /* "503 Bad sequence of commands.\r\n". */
- }
- else
- {
- BaseType_t xAllow;
-
- pxClient->bits.bStatusUser = pdFALSE_UNSIGNED;
- #if( ipconfigFTP_HAS_USER_PASSWORD_HOOK != 0 )
- {
- xAllow = xApplicationFTPPasswordHook( pxClient->pcFileName, pcRestCommand );
- }
- #else
- {
- xAllow = 1;
- }
- #endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK */
-
- if( xAllow > 0 )
- {
- pxClient->bits.bLoggedIn = pdTRUE_UNSIGNED; /* Client has now logged in. */
- pcMyReply = "230 OK. Current directory is /\r\n";
- }
- else
- {
- pcMyReply = "530 Login incorrect\r\n"; /* 530 Login incorrect. */
- }
-
- strcpy( pxClient->pcCurrentDir, ( const char * ) "/" );
- }
- break;
-
- case ECMD_SYST: /* System. */
- snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ), "215 UNIX Type: L8\r\n" );
- pcMyReply = pcCOMMAND_BUFFER;
- break;
-
- case ECMD_PWD: /* Get working directory. */
- xMakeRelative( pxClient, pcFILE_BUFFER, sizeof( pcFILE_BUFFER ), pxClient->pcCurrentDir );
- snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ), REPL_257_PWD, pcFILE_BUFFER );
- pcMyReply = pcCOMMAND_BUFFER;
- break;
-
- case ECMD_REST:
- if( pxClient->bits.bReadOnly != pdFALSE_UNSIGNED )
- {
- pcMyReply = REPL_553_READ_ONLY;
- }
- else
- {
- const char *pcPtr = pcRestCommand;
-
- while( *pcPtr == ' ' )
- {
- pcPtr++;
- }
-
- if( ( *pcPtr >= '0' ) && ( *pcPtr <= '9' ) )
- {
- sscanf( pcPtr, "%lu", &pxClient->ulRestartOffset );
- snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ),
- "350 Restarting at %lu. Send STORE or RETRIEVE\r\n", pxClient->ulRestartOffset );
- pcMyReply = pcCOMMAND_BUFFER;
- }
- else
- {
- pcMyReply = REPL_500; /* 500 Syntax error, command unrecognised. */
- }
- }
- break;
-
- case ECMD_NOOP: /* NOP operation */
- if( pxClient->xTransferSocket != FREERTOS_NO_SOCKET )
- {
- pcMyReply = REPL_200_PROGRESS;
- }
- else
- {
- pcMyReply = REPL_200;
- }
- break;
-
- case ECMD_TYPE: /* Ask or set transfer type. */
- {
- /* e.g. "TYPE I" for Images (binary). */
- BaseType_t xType = prvGetTransferType( pcRestCommand );
-
- if( xType < 0 )
- {
- /* TYPE not recognised. */
- pcMyReply = REPL_500;
- }
- else
- {
- pxClient->xTransType = xType;
- pcMyReply = REPL_200;
- }
- }
- break;
-
- case ECMD_PASV: /* Enter passive mode. */
- /* Connect passive: Server will listen() and wait for a connection.
- Start up a new data connection with 'xDoListen' set to true. */
- if( prvTransferConnect( pxClient, pdTRUE ) == pdFALSE )
- {
- pcMyReply = REPL_502;
- }
- else
- {
- uint32_t ulIP;
- uint16_t ulPort;
- struct freertos_sockaddr xLocalAddress;
- struct freertos_sockaddr xRemoteAddress;
-
- FreeRTOS_GetLocalAddress( pxClient->xTransferSocket, &xLocalAddress );
- FreeRTOS_GetRemoteAddress( pxClient->xSocket, &xRemoteAddress );
-
- ulIP = FreeRTOS_ntohl( xLocalAddress.sin_addr );
- pxClient->ulClientIP = FreeRTOS_ntohl( xRemoteAddress.sin_addr );
- ulPort = FreeRTOS_ntohs( xLocalAddress.sin_port );
-
- pxClient->usClientPort = FreeRTOS_ntohs( xRemoteAddress.sin_port );
-
- /* REPL_227_D "227 Entering Passive Mode (%d,%d,%d,%d,%d,%d). */
- snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ), REPL_227_D,
- ( unsigned )ulIP >> 24,
- ( unsigned )( ulIP >> 16 ) & 0xFF,
- ( unsigned )( ulIP >> 8 ) & 0xFF,
- ( unsigned )ulIP & 0xFF,
- ( unsigned )ulPort >> 8,
- ( unsigned )ulPort & 0xFF );
-
- pcMyReply = pcCOMMAND_BUFFER;
- }
- break;
-
- case ECMD_PORT: /* Active connection to the client. */
- /* The client uses this command to tell the server to what
- client-side port the server should contact; use of this command
- indicates an active data transfer. e.g. PORT 192,168,1,2,4,19. */
- {
- uint32_t ulIPAddress = 0;
- UBaseType_t uxPort;
-
- uxPort = prvParsePortData( pcRestCommand, &ulIPAddress );
- FreeRTOS_printf( (" PORT %lxip:%ld\n", ulIPAddress, uxPort ) );
-
- if( uxPort == 0u )
- {
- pcMyReply = REPL_501;
- }
- else if( prvTransferConnect( pxClient, pdFALSE ) == pdFALSE )
- {
- /* Call prvTransferConnect() with 'xDoListen' = false for an
- active connect(). */
- pcMyReply = REPL_501;
- }
- else
- {
- pxClient->usClientPort = ( uint16_t ) uxPort;
- pxClient->ulClientIP = ulIPAddress;
- FreeRTOS_printf( ("Client address %lxip:%lu\n", ulIPAddress, uxPort ) );
- pcMyReply = REPL_200;
- }
- }
- break;
-
- case ECMD_CWD: /* Change current working directory. */
- prvChangeDir( pxClient, pcRestCommand );
- break;
-
- case ECMD_RNFR:
- if( pxClient->bits.bReadOnly != pdFALSE_UNSIGNED )
- {
- pcMyReply = REPL_553_READ_ONLY;
- }
- else
- {
- prvRenameFrom( pxClient, pcRestCommand );
- }
- break;
-
- case ECMD_RNTO:
- if( pxClient->bits.bInRename == pdFALSE_UNSIGNED )
- {
- pcMyReply = REPL_503; /* "503 Bad sequence of commands. */
- }
- else
- {
- prvRenameTo( pxClient, pcRestCommand );
- }
- break;
-
- case ECMD_SITE: /* Set file permissions */
- if( pxClient->bits.bReadOnly != pdFALSE_UNSIGNED )
- {
- pcMyReply = REPL_553_READ_ONLY;
- }
- else if( prvSiteCmd( pxClient, pcRestCommand ) == pdFALSE )
- {
- pcMyReply = REPL_202;
- }
- break;
-
- case ECMD_DELE:
- if( pxClient->bits.bReadOnly != pdFALSE_UNSIGNED )
- {
- pcMyReply = REPL_553_READ_ONLY;
- }
- else
- {
- prvDeleteFile( pxClient, pcRestCommand );
- }
- break;
-
- case ECMD_MDTM:
- prvSizeDateFile( pxClient, pcRestCommand, pdTRUE );
- break;
-
- case ECMD_SIZE:
- if( pxClient->pxWriteHandle != NULL )
- {
- /* This SIZE query is probably about a file which is now being
- received. If so, return the value of pxClient->ulRecvBytes,
- pcRestCommand points to 'pcCommandBuffer', make it free by
- copying it to pcNewDir. */
-
- xMakeAbsolute( pxClient, pcNEW_DIR, sizeof( pcNEW_DIR ), pcRestCommand );
-
- if( strcmp( pcNEW_DIR, pcRestCommand ) == 0 )
- {
- BaseType_t xCount;
- for( xCount = 0; xCount < 3 && pxClient->pxWriteHandle; xCount++ )
- {
- prvStoreFileWork( pxClient );
- }
- if( pxClient->pxWriteHandle != NULL )
- {
- /* File being queried is still open, return number of
- bytes received until now. */
- snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ), "213 %lu\r\n", pxClient->ulRecvBytes );
- pcMyReply = pcCOMMAND_BUFFER;
- } /* otherwise, do a normal stat(). */
- }
- strcpy( pcRestCommand, pcNEW_DIR );
- }
- if( pcMyReply == NULL )
- {
- prvSizeDateFile( pxClient, pcRestCommand, pdFALSE );
- }
- break;
- case ECMD_MKD:
- case ECMD_RMD:
- if( pxClient->bits.bReadOnly != pdFALSE_UNSIGNED )
- {
- pcMyReply = REPL_553_READ_ONLY;
- }
- else
- {
- prvMakeRemoveDir( pxClient, pcRestCommand, pxFTPCommand->ucCommandType == ECMD_RMD );
- }
- break;
- case ECMD_CDUP:
- prvChangeDir( pxClient, ".." );
- break;
-
- case ECMD_QUIT:
- prvSendReply( pxClient->xSocket, REPL_221, 0 );
- pxClient->bits.bLoggedIn = pdFALSE_UNSIGNED;
- break;
- case ECMD_LIST:
- case ECMD_RETR:
- case ECMD_STOR:
- if( ( pxClient->xTransferSocket == FREERTOS_NO_SOCKET ) &&
- ( ( pxFTPCommand->ucCommandType != ECMD_STOR ) ||
- ( pxClient->bits1.bEmptyFile == pdFALSE_UNSIGNED ) ) )
- {
- /* Sending "425 Can't open data connection." :
- Before receiving any of these commands, there must have been a
- PORT or PASV command, which causes the creation of a data socket. */
- /* There is one exception: a STOR command is received while the
- data connection has already been closed. This is tested with the
- 'bEmptyFile' flag. */
- pcMyReply = REPL_425;
- }
- else
- {
- /* In case an empty file was received ( bits1.bEmptyFile ), the
- transfer socket never delivered any data. Check if the transfer
- socket is still open: */
- if( pxClient->xTransferSocket != FREERTOS_NO_SOCKET )
- {
- prvTransferCheck( pxClient );
- }
- switch( pxFTPCommand->ucCommandType )
- {
- case ECMD_LIST:
- prvListSendPrep( pxClient );
- break;
- case ECMD_RETR:
- prvRetrieveFilePrep( pxClient, pcRestCommand );
- break;
- case ECMD_STOR:
- if( pxClient->bits.bReadOnly != pdFALSE_UNSIGNED )
- {
- pcMyReply = REPL_553_READ_ONLY;
- }
- else
- {
- prvStoreFilePrep( pxClient, pcRestCommand );
- if( pxClient->bits1.bEmptyFile != pdFALSE_UNSIGNED )
- {
- /* Although the 'xTransferSocket' is closed already,
- call this function just for the logging. */
- prvTransferCloseSocket( pxClient );
-
- /* Close an empty file. */
- prvTransferCloseFile( pxClient );
- }
- }
- break;
- }
- }
- break;
-
- case ECMD_FEAT:
- {
- static const char pcFeatAnswer[] =
- "211-Features:\x0a"
- /* The MDTM command is only allowed when
- there is support for date&time. */
- #if( ffconfigTIME_SUPPORT != 0 )
- " MDTM\x0a"
- #endif
- " REST STREAM\x0a"
- " SIZE\x0d\x0a"
- "211 End\x0d\x0a";
- pcMyReply = pcFeatAnswer;
- }
- break;
-
- case ECMD_UNKNOWN:
- FreeRTOS_printf( ("ftp::processCmd: Cmd %s unknown\n", pcRestCommand ) );
- pcMyReply = REPL_500;
- break;
- }
- }
- if( pxFTPCommand->ucCommandType != ECMD_RNFR )
- {
- pxClient->bits.bInRename = pdFALSE_UNSIGNED;
- }
-
- if( pcMyReply != NULL )
- {
- xResult = prvSendReply( pxClient->xSocket, pcMyReply, strlen( pcMyReply ) );
- }
-
- return xResult;
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvTransferConnect( FTPClient_t *pxClient, BaseType_t xDoListen )
-{
-Socket_t xSocket;
-BaseType_t xResult;
-
- /* Open a socket for a data connection with the FTP client.
- Happens after a PORT or a PASV command. */
-
- /* Make sure the previous socket is deleted and flags reset */
- prvTransferCloseSocket( pxClient );
-
- pxClient->bits1.bEmptyFile = pdFALSE_UNSIGNED;
-
- xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
-
- if( ( xSocket != FREERTOS_NO_SOCKET ) && ( xSocket != FREERTOS_INVALID_SOCKET ) )
- {
- BaseType_t xSmallTimeout = pdMS_TO_TICKS( 100 );
- struct freertos_sockaddr xAddress;
-
- #if( ipconfigFTP_TX_BUFSIZE > 0 )
- WinProperties_t xWinProps;
- #endif
- xAddress.sin_addr = FreeRTOS_GetIPAddress( ); /* Single NIC, currently not used */
- xAddress.sin_port = FreeRTOS_htons( 0 ); /* Bind to any available port number */
-
- FreeRTOS_bind( xSocket, &xAddress, sizeof( xAddress ) );
-
- #if( ipconfigFTP_TX_BUFSIZE > 0 )
- {
- /* Fill in the buffer and window sizes that will be used by the
- socket. */
- xWinProps.lTxBufSize = ipconfigFTP_TX_BUFSIZE;
- xWinProps.lTxWinSize = ipconfigFTP_TX_WINSIZE;
- xWinProps.lRxBufSize = ipconfigFTP_RX_BUFSIZE;
- xWinProps.lRxWinSize = ipconfigFTP_RX_WINSIZE;
-
- /* Set the window and buffer sizes. */
- FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_WIN_PROPERTIES, ( void * ) &xWinProps, sizeof( xWinProps ) );
- }
- #endif
-
- FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, ( void * ) &xSmallTimeout, sizeof( BaseType_t ) );
- FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_SNDTIMEO, ( void * ) &xSmallTimeout, sizeof( BaseType_t ) );
-
- /* The same instance of the socket will be used for the connection and
- data transport. */
- if( xDoListen != pdFALSE )
- {
- BaseType_t xTrueValue = pdTRUE;
- FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_REUSE_LISTEN_SOCKET, ( void * ) &xTrueValue, sizeof( xTrueValue ) );
- }
- pxClient->bits1.bIsListen = xDoListen;
- pxClient->xTransferSocket = xSocket;
-
- if( xDoListen != pdFALSE )
- {
- FreeRTOS_FD_SET( xSocket, pxClient->pxParent->xSocketSet, eSELECT_EXCEPT | eSELECT_READ );
- /* Calling FreeRTOS_listen( ) */
- xResult = prvTransferStart( pxClient );
- if( xResult >= 0 )
- {
- xResult = pdTRUE;
- }
- }
- else
- {
- FreeRTOS_FD_SET( xSocket, pxClient->pxParent->xSocketSet, eSELECT_EXCEPT | eSELECT_READ | eSELECT_WRITE );
- xResult = pdTRUE;
- }
- }
- else
- {
- FreeRTOS_printf( ( "FreeRTOS_socket() failed\n" ) );
- xResult = -pdFREERTOS_ERRNO_ENOMEM;
- }
-
- /* An active socket (PORT) should connect() later. */
- return xResult;
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvTransferStart( FTPClient_t *pxClient )
-{
-BaseType_t xResult;
-
- /* A transfer socket has been opened, now either call listen() for 'PASV'
- or connect() for the 'PORT' command. */
- if( pxClient->bits1.bIsListen != pdFALSE_UNSIGNED )
- {
- xResult = FreeRTOS_listen( pxClient->xTransferSocket, 1 );
- }
- else
- {
- struct freertos_sockaddr xAddress;
-
- xAddress.sin_addr = FreeRTOS_htonl( pxClient->ulClientIP );
- xAddress.sin_port = FreeRTOS_htons( pxClient->usClientPort );
- /* Start an active connection for this data socket */
- xResult = FreeRTOS_connect( pxClient->xTransferSocket, &xAddress, sizeof( xAddress ) );
- }
-
- return xResult;
-}
-/*-----------------------------------------------------------*/
-
-static void prvTransferCheck( FTPClient_t *pxClient )
-{
-BaseType_t xRxSize;
-
- /* A data transfer is busy. Check if there are changes in connectedness. */
- xRxSize = FreeRTOS_rx_size( pxClient->xTransferSocket );
-
- if( pxClient->bits1.bClientConnected == pdFALSE_UNSIGNED )
- {
- /* The time to receive a small file can be so short, that we don't even
- see that the socket gets connected and disconnected. Therefore, check
- the sizeof of the RX buffer. */
- {
- struct freertos_sockaddr xAddress;
- Socket_t xNexSocket;
- socklen_t xSocketLength = sizeof( xAddress );
-
- if( pxClient->bits1.bIsListen != pdFALSE_UNSIGNED )
- {
- xNexSocket = FreeRTOS_accept( pxClient->xTransferSocket, &xAddress, &xSocketLength);
- if( ( ( xNexSocket != FREERTOS_NO_SOCKET ) && ( xNexSocket != FREERTOS_INVALID_SOCKET ) ) ||
- xRxSize > 0 )
- {
- pxClient->bits1.bClientConnected = pdTRUE_UNSIGNED;
- }
- }
- else
- {
- if( FreeRTOS_issocketconnected( pxClient->xTransferSocket ) > 0 ||
- xRxSize > 0 )
- {
- pxClient->bits1.bClientConnected = pdTRUE_UNSIGNED;
- }
- }
- if( pxClient->bits1.bClientConnected != pdFALSE_UNSIGNED )
- {
- pxClient->bits1.bEmptyFile = pdFALSE_UNSIGNED;
- #if( ipconfigHAS_PRINTF != 0 )
- {
- struct freertos_sockaddr xRemoteAddress, xLocalAddress;
- FreeRTOS_GetRemoteAddress( pxClient->xTransferSocket, &xRemoteAddress );
- FreeRTOS_GetLocalAddress( pxClient->xTransferSocket, &xLocalAddress );
- FreeRTOS_printf( ( "%s Connected from %u to %u\n",
- pxClient->bits1.bIsListen != pdFALSE_UNSIGNED ? "PASV" : "PORT",
- ( unsigned ) FreeRTOS_ntohs( xLocalAddress.sin_port ),
- ( unsigned ) FreeRTOS_ntohs( xRemoteAddress.sin_port ) ) );
- }
- #endif /* ipconfigHAS_PRINTF */
- FreeRTOS_FD_CLR( pxClient->xTransferSocket, pxClient->pxParent->xSocketSet, eSELECT_WRITE );
- FreeRTOS_FD_SET( pxClient->xTransferSocket, pxClient->pxParent->xSocketSet, eSELECT_READ|eSELECT_EXCEPT );
- }
- }
- }
-
- if ( pxClient->bits1.bClientConnected != pdFALSE_UNSIGNED )
- {
- if( pxClient->pcConnectionAck[ 0 ] != '\0' )
- {
- BaseType_t xLength;
- BaseType_t xRemotePort;
- struct freertos_sockaddr xRemoteAddress;
-
- FreeRTOS_GetRemoteAddress( pxClient->xTransferSocket, &xRemoteAddress );
- xRemotePort = FreeRTOS_ntohs( xRemoteAddress.sin_port );
-
- /* Tell on the command port 21 we have a data connection */
- xLength = snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ),
- pxClient->pcConnectionAck, pxClient->ulClientIP, xRemotePort );
-
- prvSendReply( pxClient->xSocket, pcCOMMAND_BUFFER, xLength );
- pxClient->pcConnectionAck[ 0 ] = '\0';
- }
-
- if( ( FreeRTOS_issocketconnected( pxClient->xTransferSocket ) == pdFALSE ) && FreeRTOS_rx_size( pxClient->xTransferSocket ) == 0 )
- {
- prvTransferCloseSocket( pxClient );
- prvTransferCloseFile( pxClient );
- }
- }
-}
-/*-----------------------------------------------------------*/
-
-static void prvTransferCloseSocket( FTPClient_t *pxClient )
-{
- if( pxClient->xTransferSocket != FREERTOS_NO_SOCKET )
- {
- /* DEBUGGING ONLY */
- BaseType_t xRxSize = FreeRTOS_rx_size( pxClient->xTransferSocket );
- if( xRxSize > 0 )
- {
- BaseType_t xRxSize2;
- BaseType_t xStatus;
- prvStoreFileWork( pxClient );
- xStatus = FreeRTOS_connstatus( pxClient->xTransferSocket );
- xRxSize2 = FreeRTOS_rx_size( pxClient->xTransferSocket );
- FreeRTOS_printf( ( "FTP: WARNING: %s: RX size = %ld -> %ld (%s)\n",
- FreeRTOS_GetTCPStateName( xStatus ),
- xRxSize, xRxSize2, pxClient->pcFileName ) );
- if( xRxSize2 > 1 )
- {
- return;
- }
-
- /* Remove compiler warnings in case FreeRTOS_printf() is not
- defined. */
- ( void ) xStatus;
- }
- }
-
- if( ( pxClient->pxWriteHandle != NULL ) || ( pxClient->pxReadHandle != NULL ) )
- {
- BaseType_t xLength;
- char pcStrBuf[ 32 ];
-
- if( pxClient->bits1.bHadError == pdFALSE_UNSIGNED )
- {
- xLength = snprintf( pxClient->pcClientAck, sizeof( pxClient->pcClientAck ),
- "226 Closing connection %d bytes transmitted\r\n", ( int ) pxClient->ulRecvBytes );
- }
- else
- {
- xLength = snprintf( pxClient->pcClientAck, sizeof( pxClient->pcClientAck ),
- "451 Requested action aborted after %d bytes\r\n", ( int ) pxClient->ulRecvBytes );
- }
-
- /* Tell on the command socket the data connection is now closed. */
- prvSendReply( pxClient->xSocket, pxClient->pcClientAck, xLength );
-
- #if( ipconfigHAS_PRINTF != 0 )
- {
- TickType_t xDelta;
- uint32_t ulAverage;
- xDelta = xTaskGetTickCount( ) - pxClient->xStartTime;
- ulAverage = ulGetAverage( pxClient->ulRecvBytes, xDelta );
-
- FreeRTOS_printf( ("FTP: %s: '%s' %lu Bytes (%s/sec)\n",
- pxClient->pxReadHandle ? "sent" : "recv",
- pxClient->pcFileName,
- pxClient->ulRecvBytes,
- pcMkSize( ulAverage, pcStrBuf, sizeof( pcStrBuf ) ) ) );
- }
- #endif
- }
-
- if( pxClient->xTransferSocket != FREERTOS_NO_SOCKET )
- {
- FreeRTOS_FD_CLR( pxClient->xTransferSocket, pxClient->pxParent->xSocketSet, eSELECT_ALL );
- FreeRTOS_closesocket( pxClient->xTransferSocket );
- pxClient->xTransferSocket = FREERTOS_NO_SOCKET;
- if( pxClient->ulRecvBytes == 0ul )
- {
- /* Received zero bytes: an empty file */
- pxClient->bits1.bEmptyFile = pdTRUE_UNSIGNED;
- }
- else
- {
- pxClient->bits1.bEmptyFile = pdFALSE_UNSIGNED;
- }
- }
- pxClient->bits1.bIsListen = pdFALSE_UNSIGNED;
- pxClient->bits1.bDirHasEntry = pdFALSE_UNSIGNED;
- pxClient->bits1.bClientConnected = pdFALSE_UNSIGNED;
- pxClient->bits1.bHadError = pdFALSE_UNSIGNED;
-}
-/*-----------------------------------------------------------*/
-
-static void prvTransferCloseFile( FTPClient_t *pxClient )
-{
- if( pxClient->pxWriteHandle != NULL )
- {
- ff_fclose( pxClient->pxWriteHandle );
- pxClient->pxWriteHandle = NULL;
- #if( ipconfigFTP_HAS_RECEIVED_HOOK != 0 )
- {
- vApplicationFTPReceivedHook( pxClient->pcFileName, pxClient->ulRecvBytes, pxClient );
- }
- #endif
-
- }
- if( pxClient->pxReadHandle != NULL )
- {
- ff_fclose( pxClient->pxReadHandle );
- pxClient->pxReadHandle = NULL;
- }
- /* These two field are only used for logging / file-statistics */
- pxClient->ulRecvBytes = 0ul;
- pxClient->xStartTime = 0ul;
-}
-/*-----------------------------------------------------------*/
-
-/**
- * Guess the transfer type, given the client requested type.
- * Actually in unix there is no difference between binary and
- * ascii mode when we work with file descriptors.
- * If #type is not recognized as a valid client request, -1 is returned.
- */
-static BaseType_t prvGetTransferType( const char *pcType )
-{
-BaseType_t xResult = -1;
-
- if( pcType != NULL )
- {
- BaseType_t xLength = strlen( pcType );
- if( xLength == 0 )
- {
- return -1;
- }
- switch( pcType[ 0 ] ) {
- case 'I':
- xResult = TMODE_BINARY;
- break;
- case 'A':
- xResult = TMODE_ASCII;
- break;
- case 'L':
- if( xLength >= 3 )
- {
- if( pcType[ 2 ] == '7' )
- {
- xResult = TMODE_7BITS;
- }
- else if( pcType[ 2 ] == '8' )
- {
- xResult = TMODE_7BITS;
- }
- }
- break;
- }
- }
- return xResult;
-}
-/*-----------------------------------------------------------*/
-
-#if( ipconfigHAS_PRINTF != 0 )
- #define SIZE_1_GB ( 1024ul * 1024ul * 1024ul )
- #define SIZE_1_MB ( 1024ul * 1024ul )
- #define SIZE_1_KB ( 1024ul )
-
- static const char *pcMkSize( uint32_t ulAmount, char *pcBuffer, BaseType_t xBufferSize )
- {
- uint32_t ulGB, ulMB, ulKB, ulByte;
-
- ulGB = ( ulAmount / SIZE_1_GB );
- ulAmount -= ( ulGB * SIZE_1_GB );
- ulMB = ( ulAmount / SIZE_1_MB );
- ulAmount -= ( ulMB * SIZE_1_MB );
- ulKB = ( ulAmount / SIZE_1_KB );
- ulAmount -= ( ulKB * SIZE_1_KB );
- ulByte = ( ulAmount );
-
- if (ulGB != 0ul )
- {
- snprintf( pcBuffer, xBufferSize, "%lu.%02lu GB", ulGB, (100 * ulMB) / SIZE_1_KB );
- }
- else if( ulMB != 0ul )
- {
- snprintf( pcBuffer, xBufferSize, "%lu.%02lu MB", ulMB, (100 * ulKB) / SIZE_1_KB );
- }
- else if( ulKB != 0ul )
- {
- snprintf(pcBuffer, xBufferSize, "%lu.%02lu KB", ulKB, (100 * ulByte) / SIZE_1_KB );
- }
- else
- {
- snprintf( pcBuffer, xBufferSize, "%lu bytes", ulByte );
- }
-
- return pcBuffer;
- }
- /*-----------------------------------------------------------*/
-#endif /* ipconfigHAS_PRINTF != 0 */
-
-#if( ipconfigHAS_PRINTF != 0 )
- static uint32_t ulGetAverage( uint32_t ulAmount, TickType_t xDeltaMs )
- {
- uint32_t ulAverage;
-
- /* Get the average amount of bytes per seconds. Ideally this is
- calculated by Multiplying with 1000 and dividing by milliseconds:
- ulAverage = ( 1000ul * ulAmount ) / xDeltaMs;
- Now get a maximum precision, while avoiding an arithmetic overflow:
- */
- if( xDeltaMs == 0ul )
- {
- /* Time is zero, there is no average */
- ulAverage = 0ul;
- }
- else if( ulAmount >= ( ~0ul / 10ul ) )
- {
- /* More than 409 MB has been transferred, do not multiply. */
- ulAverage = ( ulAmount / ( xDeltaMs / 1000ul ) );
- }
- else if( ulAmount >= ( ~0ul / 100ul ) )
- {
- /* Between 409 and 41 MB has been transferred, can multiply by 10. */
- ulAverage = ( ( ulAmount * 10ul ) / ( xDeltaMs / 100ul ) );
- }
- else if( ulAmount >= ( ~0ul / 1000ul ) )
- {
- /* Between 4.1 MB and 41 has been transferred, can multiply by 100. */
- ulAverage = ( ( ulAmount * 100ul ) / ( xDeltaMs / 10ul ) );
- }
- else
- {
- /* Less than 4.1 MB: can multiply by 1000. */
- ulAverage = ( ( ulAmount * 1000ul ) / xDeltaMs );
- }
-
- return ulAverage;
- }
- /*-----------------------------------------------------------*/
-#endif /* ipconfigHAS_PRINTF != 0 */
-
-static UBaseType_t prvParsePortData( const char *pcCommand, uint32_t *pulIPAddress )
-{
-/*_HT_ Using 'unsigned' here because when sscanf() sees '%u', it expects a pointer to 'unsigned'.
-Not sure about the sscanf() format for UBaseType_t ? */
-unsigned h1, h2, h3, h4, p1, p2;
-char sep;
-UBaseType_t uxResult;
-
- /* Expect PORT h1,h2,h3,h4,p1,p2 */
- if (sscanf (pcCommand, "%u%c%u%c%u%c%u%c%u%c%u", &h1, &sep, &h2, &sep, &h3, &sep, &h4, &sep, &p1, &sep, &p2) != 11)
- {
- uxResult= 0u;
- }
- else
- {
- /* Put in network byte order. */
- *pulIPAddress =
- ( ( uint32_t ) h1 << 24 ) |
- ( ( uint32_t ) h2 << 16 ) |
- ( ( uint32_t ) h3 << 8 ) |
- ( ( uint32_t ) h4 );
- uxResult = ( p1 << 8 ) | p2;
- }
- return uxResult;
-}
-/*-----------------------------------------------------------*/
-
-/*
-
- #### ####### # ###
-# # # # ## # #
-# # # # # #
-# ###### #### ### ## #### # # ### # ####
- ## # # # # # # # # ##### # # # #
- ## # # # ## # ###### # # # # ######
-# # # # # # # # # # #
-# # # ## # # # # ## # # # # ##
- #### ## #### #### #### #### ##### ##### ####
-
-*/
-
-static BaseType_t prvStoreFilePrep( FTPClient_t *pxClient, char *pcFileName )
-{
-BaseType_t xResult;
-FF_FILE *pxNewHandle;
-size_t uxFileSize = 0ul;
-int iErrorNo;
-
- /* Close previous handle (if any) and reset file transfer parameters. */
- prvTransferCloseFile( pxClient );
-
- xMakeAbsolute( pxClient, pxClient->pcFileName, sizeof( pxClient->pcFileName ), pcFileName );
-
- pxNewHandle = NULL;
-
- if( pxClient->ulRestartOffset != 0 )
- {
- size_t uxOffset = pxClient->ulRestartOffset;
- int32_t lRc;
-
- pxClient->ulRestartOffset = 0ul; /* Only use 1 time. */
- pxNewHandle = ff_fopen( pxClient->pcFileName, "ab" );
-
- if( pxNewHandle != NULL )
- {
- uxFileSize = pxNewHandle->ulFileSize;
-
- if( uxOffset <= uxFileSize )
- {
- lRc = ff_fseek( pxNewHandle, uxOffset, FF_SEEK_SET );
- }
- else
- {
- /* Won't even try to seek after EOF */
- lRc = -pdFREERTOS_ERRNO_EINVAL;
- }
- if( lRc != 0 )
- {
- BaseType_t xLength;
-
- xLength = snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ),
- "450 Seek invalid %u length %u\r\n",
- ( unsigned ) uxOffset, ( unsigned ) uxFileSize );
-
- /* "Requested file action not taken". */
- prvSendReply( pxClient->xSocket, pcCOMMAND_BUFFER, xLength );
-
- FreeRTOS_printf( ( "ftp::storeFile: create %s: Seek %u length %u\n",
- pxClient->pcFileName, ( unsigned ) uxOffset, ( unsigned ) uxFileSize ) );
-
- ff_fclose( pxNewHandle );
- pxNewHandle = NULL;
- }
- }
- }
- else
- {
- pxNewHandle = ff_fopen( pxClient->pcFileName, "wb" );
- }
-
- if( pxNewHandle == NULL )
- {
- iErrorNo = stdioGET_ERRNO();
- if( iErrorNo == pdFREERTOS_ERRNO_ENOSPC )
- {
- prvSendReply( pxClient->xSocket, REPL_552, 0 );
- }
- else
- {
- /* "Requested file action not taken". */
- prvSendReply( pxClient->xSocket, REPL_450, 0 );
- }
- FreeRTOS_printf( ( "ftp::storeFile: create %s: %s (errno %d)\n",
- pxClient->pcFileName,
- ( const char* ) strerror( iErrorNo ), iErrorNo ) );
-
- xResult = pdFALSE;
- }
- else
- {
- if( pxClient->bits1.bIsListen )
- {
- /* True if PASV is used. */
- snprintf( pxClient->pcConnectionAck, sizeof( pxClient->pcConnectionAck ),
- "150 Accepted data connection from %%xip:%%u\r\n" );
- prvTransferCheck( pxClient );
- }
- else
- {
- BaseType_t xLength;
-
- xLength = snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ), "150 Opening BIN connection to store file\r\n" );
- prvSendReply( pxClient->xSocket, pcCOMMAND_BUFFER, xLength );
- pxClient->pcConnectionAck[ 0 ] = '\0';
- prvTransferStart( pxClient ); /* Now active connect. */
- }
-
- pxClient->pxWriteHandle = pxNewHandle;
-
- /* To get some statistics about the performance. */
- pxClient->xStartTime = xTaskGetTickCount( );
-
- xResult = pdTRUE;
- }
-
- return xResult;
-}
-/*-----------------------------------------------------------*/
-
-#if( ipconfigFTP_ZERO_COPY_ALIGNED_WRITES == 0 )
-
- static BaseType_t prvStoreFileWork( FTPClient_t *pxClient )
- {
- BaseType_t xRc, xWritten;
-
- /* Read from the data socket until all has been read or until a negative value
- is returned. */
- for( ; ; )
- {
- char *pcBuffer;
-
- /* The "zero-copy" method: */
- xRc = FreeRTOS_recv( pxClient->xTransferSocket, ( void * ) &pcBuffer,
- 0x20000u, FREERTOS_ZERO_COPY | FREERTOS_MSG_DONTWAIT );
- if( xRc <= 0 )
- {
- break;
- }
- pxClient->ulRecvBytes += xRc;
- xWritten = ff_fwrite( pcBuffer, 1, xRc, pxClient->pxWriteHandle );
- FreeRTOS_recv( pxClient->xTransferSocket, ( void * ) NULL, xRc, 0 );
- if( xWritten != xRc )
- {
- xRc = -1;
- /* bHadError: a transfer got aborted because of an error. */
- pxClient->bits1.bHadError = pdTRUE_UNSIGNED;
- break;
- }
- }
- return xRc;
- }
-
-#else /* ipconfigFTP_ZERO_COPY_ALIGNED_WRITES != 0 */
-
- #if !defined( ipconfigFTP_PREFERRED_WRITE_SIZE )
- /* If you store data on flash, it may be profitable to give 'ipconfigFTP_PREFERRED_WRITE_SIZE'
- the same size as the size of the flash' erase blocks, e.g. 4KB */
- #define ipconfigFTP_PREFERRED_WRITE_SIZE 512ul
- #endif
-
- static BaseType_t prvStoreFileWork( FTPClient_t *pxClient )
- {
- BaseType_t xRc, xWritten;
-
- /* Read from the data socket until all has been read or until a negative
- value is returned. */
- for( ; ; )
- {
- char *pcBuffer;
- UBaseType_t xStatus;
-
- /* The "zero-copy" method: */
- xRc = FreeRTOS_recv( pxClient->xTransferSocket, ( void * ) &pcBuffer,
- 0x20000u, FREERTOS_ZERO_COPY | FREERTOS_MSG_DONTWAIT );
-
- if( xRc <= 0 )
- {
- /* There are no data or the connection is closed. */
- break;
- }
- xStatus = FreeRTOS_connstatus( pxClient->xTransferSocket );
- if( xStatus != eESTABLISHED )
- {
- /* The connection is not established (any more), therefore
- accept any amount of bytes, probably the last few bytes. */
- }
- else
- {
- if( xRc >= ipconfigFTP_PREFERRED_WRITE_SIZE )
- {
- /* More than a sector to write, round down to a multiple of
- PREFERRED_WRITE_SIZE bytes. */
- xRc = ( xRc / ipconfigFTP_PREFERRED_WRITE_SIZE ) * ipconfigFTP_PREFERRED_WRITE_SIZE;
- }
- else
- {
- const StreamBuffer_t *pxBuffer = FreeRTOS_get_rx_buf( pxClient->xTransferSocket );
- size_t uxSpace = pxBuffer->LENGTH - pxBuffer->uxTail;
-
- if( uxSpace >= ipconfigFTP_PREFERRED_WRITE_SIZE )
- {
- /* At this moment there are les than PREFERRED_WRITE_SIZE bytes in the RX
- buffer, but there is space for more. Just return and
- wait for more. */
- xRc = 0;
- }
- else
- {
- /* Now reading beyond the end of the circular buffer,
- use a normal read. */
- pcBuffer = pcFILE_BUFFER;
- xRc = FreeRTOS_recvcount( pxClient->xTransferSocket );
- xRc = ( xRc / ipconfigFTP_PREFERRED_WRITE_SIZE ) * ipconfigFTP_PREFERRED_WRITE_SIZE;
- if( xRc > 0 )
- {
- xRc = FreeRTOS_recv( pxClient->xTransferSocket, ( void * ) pcBuffer,
- sizeof( pcFILE_BUFFER ), FREERTOS_MSG_DONTWAIT );
- }
- }
- }
- }
- if( xRc == 0 )
- {
- break;
- }
- pxClient->ulRecvBytes += xRc;
-
- xWritten = ff_fwrite( pcBuffer, 1, xRc, pxClient->pxWriteHandle );
- if( pcBuffer != pcFILE_BUFFER )
- {
- FreeRTOS_recv( pxClient->xTransferSocket, ( void * ) NULL, xRc, 0 );
- }
- if( xWritten != xRc )
- {
- xRc = -1;
- /* bHadError: a transfer got aborted because of an error. */
- pxClient->bits1.bHadError = pdTRUE_UNSIGNED;
- break;
- }
- }
- return xRc;
- }
-
-#endif /* ipconfigFTP_ZERO_COPY_ALIGNED_WRITES */
-/*-----------------------------------------------------------*/
-
-/*
-###### # ####### # ###
- # # # # # ## # #
- # # # # # #
- # # #### ###### ### ## ### #### # # #### # # ### # ####
- ###### # # # # # # # # # # # # # ##### # # # #
- # ## ###### # ## # # ###### # # ###### # # # # ######
- # # # # # # # # # # # # # #
- # # # ## # ## # # # ## # # # ## # # # # ##
-### ## #### ## #### ##### #### ## #### #### ##### ##### ####
-*/
-static BaseType_t prvRetrieveFilePrep( FTPClient_t *pxClient, char *pcFileName )
-{
-BaseType_t xResult = pdTRUE;
-size_t uxFileSize;
-
- /* Close previous handle (if any) and reset file transfer parameters */
- prvTransferCloseFile( pxClient );
-
- xMakeAbsolute( pxClient, pxClient->pcFileName, sizeof( pxClient->pcFileName ), pcFileName );
-
- pxClient->pxReadHandle = ff_fopen( pxClient->pcFileName, "rb" );
- if( pxClient->pxReadHandle == NULL )
- {
- int iErrno = stdioGET_ERRNO();
- /* "Requested file action not taken". */
- prvSendReply( pxClient->xSocket, REPL_450, 0 );
- FreeRTOS_printf( ("prvRetrieveFilePrep: open '%s': errno %d: %s\n",
- pxClient->pcFileName, iErrno, ( const char * ) strerror( iErrno ) ) );
- uxFileSize = 0ul;
- xResult = pdFALSE;
- }
- else
- {
- uxFileSize = pxClient->pxReadHandle->ulFileSize;
- pxClient->uxBytesLeft = uxFileSize;
- if( pxClient->ulRestartOffset != 0ul )
- {
- size_t uxOffset = pxClient->ulRestartOffset;
- int32_t iRc;
-
- /* Only use 1 time. */
- pxClient->ulRestartOffset = 0;
-
- if( uxOffset < uxFileSize )
- {
- iRc = ff_fseek( pxClient->pxReadHandle, uxOffset, FF_SEEK_SET );
- }
- else
- {
- iRc = -pdFREERTOS_ERRNO_EINVAL;
- }
- if( iRc != 0 )
- {
- BaseType_t xLength;
-
- xLength = snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ),
- "450 Seek invalid %u length %u\r\n", ( unsigned ) uxOffset, ( unsigned ) uxFileSize );
-
- /* "Requested file action not taken". */
- prvSendReply( pxClient->xSocket, pcCOMMAND_BUFFER, xLength );
-
- FreeRTOS_printf( ( "prvRetrieveFilePrep: create %s: Seek %u length %u\n",
- pxClient->pcFileName, ( unsigned ) uxOffset, ( unsigned ) uxFileSize ) );
-
- ff_fclose( pxClient->pxReadHandle );
- pxClient->pxReadHandle = NULL;
- xResult = pdFALSE;
- }
- else
- {
- pxClient->uxBytesLeft = uxFileSize - pxClient->ulRestartOffset;
- }
- }
- }
- if( xResult != pdFALSE )
- {
- if( pxClient->bits1.bIsListen != pdFALSE_UNSIGNED )
- {
- /* True if PASV is used. */
- snprintf( pxClient->pcConnectionAck, sizeof( pxClient->pcConnectionAck ),
- "150%cAccepted data connection from %%xip:%%u\r\n%s",
- pxClient->xTransType == TMODE_ASCII ? '-' : ' ',
- pxClient->xTransType == TMODE_ASCII ? "150 NOTE: ASCII mode requested, but binary mode used\r\n" : "" );
- } else {
- BaseType_t xLength;
-
- xLength = snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ), "150%cOpening data connection to %lxip:%u\r\n%s",
- pxClient->xTransType == TMODE_ASCII ? '-' : ' ',
- pxClient->ulClientIP,
- pxClient->usClientPort,
- pxClient->xTransType == TMODE_ASCII ? "150 NOTE: ASCII mode requested, but binary mode used\r\n" : "" );
- prvSendReply( pxClient->xSocket, pcCOMMAND_BUFFER, xLength );
- pxClient->pcConnectionAck[ 0 ] = '\0';
- prvTransferStart( pxClient );
- }
-
- /* Prepare the ACK which will be sent when all data has been sent. */
- snprintf( pxClient->pcClientAck, sizeof( pxClient->pcClientAck ), "%s", REPL_226 );
-
- /* To get some statistics about the performance. */
- pxClient->xStartTime = xTaskGetTickCount( );
- if( uxFileSize == 0ul )
- {
- FreeRTOS_shutdown( pxClient->xTransferSocket, FREERTOS_SHUT_RDWR );
- }
- }
-
- return xResult;
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvRetrieveFileWork( FTPClient_t *pxClient )
-{
-size_t uxSpace;
-size_t uxCount, uxItemsRead;
-BaseType_t xRc = 0;
-BaseType_t xSetEvent = pdFALSE;
-
- do
- {
- #if( ipconfigFTP_TX_ZERO_COPY != 0 )
- char *pcBuffer;
- BaseType_t xBufferLength;
- #endif /* ipconfigFTP_TX_ZERO_COPY */
-
- /* Take the lesser of the two: tx_space (number of bytes that can be
- queued for transmission) and uxBytesLeft (the number of bytes left to
- read from the file) */
- uxSpace = FreeRTOS_tx_space( pxClient->xTransferSocket );
-
- if( uxSpace == 0 )
- {
- FreeRTOS_FD_SET( pxClient->xTransferSocket, pxClient->pxParent->xSocketSet, eSELECT_WRITE | eSELECT_EXCEPT );
- xRc = FreeRTOS_select( pxClient->pxParent->xSocketSet, 200 );
- uxSpace = FreeRTOS_tx_space( pxClient->xTransferSocket );
- }
-
- uxCount = FreeRTOS_min_uint32( pxClient->uxBytesLeft, uxSpace );
-
- if( uxCount == 0 )
- {
- break;
- }
-
- #if( ipconfigFTP_TX_ZERO_COPY == 0 )
- {
- if( uxCount > sizeof( pcFILE_BUFFER ) )
- {
- uxCount = sizeof( pcFILE_BUFFER );
- }
- uxItemsRead = ff_fread( pcFILE_BUFFER, 1, uxCount, pxClient->pxReadHandle );
- if( uxItemsRead != uxCount )
- {
- FreeRTOS_printf( ( "prvRetrieveFileWork: Got %u Expected %u\n", ( unsigned )uxItemsRead, ( unsigned ) uxCount ) );
- xRc = FreeRTOS_shutdown( pxClient->xTransferSocket, FREERTOS_SHUT_RDWR );
- pxClient->uxBytesLeft = 0u;
- break;
- }
- pxClient->uxBytesLeft -= uxCount;
-
- if( pxClient->uxBytesLeft == 0u )
- {
- BaseType_t xTrueValue = 1;
-
- FreeRTOS_setsockopt( pxClient->xTransferSocket, 0, FREERTOS_SO_CLOSE_AFTER_SEND, ( void * ) &xTrueValue, sizeof( xTrueValue ) );
- }
-
- xRc = FreeRTOS_send( pxClient->xTransferSocket, pcFILE_BUFFER, uxCount, 0 );
- }
- #else /* ipconfigFTP_TX_ZERO_COPY != 0 */
- {
- /* Use zero-copy transmission:
- FreeRTOS_get_tx_head() returns a direct pointer to the TX stream and
- set xBufferLength to know how much space there is left. */
- pcBuffer = ( char * )FreeRTOS_get_tx_head( pxClient->xTransferSocket, &xBufferLength );
- if( ( pcBuffer != NULL ) && ( xBufferLength >= 512 ) )
- {
- /* Will read disk data directly to the TX stream of the socket. */
- uxCount = FreeRTOS_min_uint32( uxCount, ( uint32_t )xBufferLength );
- if( uxCount > ( size_t ) 0x40000u )
- {
- uxCount = ( size_t ) 0x40000u;
- }
- }
- else
- {
- /* Use the normal file i/o buffer. */
- pcBuffer = pcFILE_BUFFER;
- if( uxCount > sizeof( pcFILE_BUFFER ) )
- {
- uxCount = sizeof( pcFILE_BUFFER );
- }
- }
-
- if ( pxClient->uxBytesLeft >= 1024u )
- {
- uxCount &= ~( ( size_t ) 512u - 1u );
- }
-
- if( uxCount <= 0u )
- {
- /* Nothing to send after rounding down to a multiple of a sector size. */
- break;
- }
-
- uxItemsRead = ff_fread( pcBuffer, 1, uxCount, pxClient->pxReadHandle );
-
- if( uxCount != uxItemsRead )
- {
- FreeRTOS_printf( ( "prvRetrieveFileWork: Got %u Expected %u\n", ( unsigned )uxItemsRead, ( unsigned )uxCount ) );
- xRc = FreeRTOS_shutdown( pxClient->xTransferSocket, FREERTOS_SHUT_RDWR );
- pxClient->uxBytesLeft = 0u;
- break;
- }
- pxClient->uxBytesLeft -= uxCount;
-
- if( pxClient->uxBytesLeft == 0u )
- {
- BaseType_t xTrueValue = 1;
-
- FreeRTOS_setsockopt( pxClient->xTransferSocket, 0, FREERTOS_SO_CLOSE_AFTER_SEND, ( void * ) &xTrueValue, sizeof( xTrueValue ) );
- }
- if( pcBuffer != pcFILE_BUFFER )
- {
- pcBuffer = NULL;
- }
- xRc = FreeRTOS_send( pxClient->xTransferSocket, pcBuffer, uxCount, 0 );
- }
- #endif /* ipconfigFTP_TX_ZERO_COPY */
-
- if( xRc < 0 )
- {
- break;
- }
-
- pxClient->ulRecvBytes += xRc;
- if( pxClient->uxBytesLeft == 0u )
- {
- break;
- }
- } while( uxCount > 0u );
-
- if( xRc < 0 )
- {
- FreeRTOS_printf( ( "prvRetrieveFileWork: already disconnected\n" ) );
- }
- else if( pxClient->uxBytesLeft <= 0u )
- {
- BaseType_t x;
-
- for( x = 0; x < 5; x++ )
- {
- xRc = FreeRTOS_recv( pxClient->xTransferSocket, pcFILE_BUFFER, sizeof( pcFILE_BUFFER ), 0 );
- if( xRc < 0 )
- {
- break;
- }
- }
-// FreeRTOS_printf( ( "prvRetrieveFileWork: %s all sent: xRc %ld\n", pxClient->pcFileName, xRc ) );
- }
- else
- {
- FreeRTOS_FD_SET( pxClient->xTransferSocket, pxClient->pxParent->xSocketSet, eSELECT_WRITE );
- xSetEvent = pdTRUE;
- }
- if( xSetEvent == pdFALSE )
- {
- FreeRTOS_FD_CLR( pxClient->xTransferSocket, pxClient->pxParent->xSocketSet, eSELECT_WRITE );
- }
- return xRc;
-}
-/*-----------------------------------------------------------*/
-
-/*
-### ##### #### #####
- # # # # # # #
- # # # # #
- # # # #
- # # ## #
- # # # ## #
- # # # # # #
- # # # # # #
-####### ##### #### ####
-*/
-/* Prepare sending a directory LIST */
-static BaseType_t prvListSendPrep( FTPClient_t *pxClient )
-{
-BaseType_t xFindResult;
-int iErrorNo;
-
- if( pxClient->bits1.bIsListen != pdFALSE_UNSIGNED )
- {
- /* True if PASV is used */
- snprintf( pxClient->pcConnectionAck, sizeof( pxClient->pcConnectionAck ),
- "150 Accepted data connection from %%xip:%%u\r\n" );
- }
- else
- {
- BaseType_t xLength;
-
- /* Here the FTP server is supposed to connect() */
- xLength = snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ),
- "150 Opening ASCII mode data connection to for /bin/ls \r\n" );
-
- prvSendReply( pxClient->xSocket, pcCOMMAND_BUFFER, xLength );
- /* Clear the current connection acknowledge message */
- pxClient->pcConnectionAck[ 0 ] = '\0';
- prvTransferStart( pxClient );
- }
-
- pxClient->xDirCount = 0;
- xMakeAbsolute( pxClient, pcNEW_DIR, sizeof( pcNEW_DIR ), pxClient->pcCurrentDir );
-
- xFindResult = ff_findfirst( pcNEW_DIR, &pxClient->xFindData );
-
- pxClient->bits1.bDirHasEntry = ( xFindResult >= 0 );
-
- iErrorNo = stdioGET_ERRNO();
- if( ( xFindResult < 0 ) && ( iErrorNo == pdFREERTOS_ERRNO_ENMFILE ) )
- {
- FreeRTOS_printf( ("prvListSendPrep: Empty directory? (%s)\n", pxClient->pcCurrentDir ) );
- prvSendReply( pxClient->xTransferSocket, "total 0\r\n", 0 );
- pxClient->xDirCount++;
- }
- else if( xFindResult < 0 )
- {
- FreeRTOS_printf( ( "prvListSendPrep: rc = %ld iErrorNo = %d\n", xFindResult, iErrorNo ) );
- prvSendReply( pxClient->xSocket, REPL_451, 0 );
- }
- pxClient->pcClientAck[ 0 ] = '\0';
-
- return pxClient->xDirCount;
-}
-/*-----------------------------------------------------------*/
-
-#define MAX_DIR_LIST_ENTRY_SIZE 256
-
-static BaseType_t prvListSendWork( FTPClient_t *pxClient )
-{
-BaseType_t xTxSpace;
-
- while( pxClient->bits1.bClientConnected != pdFALSE_UNSIGNED )
- {
- char *pcWritePtr = pcCOMMAND_BUFFER;
- BaseType_t xWriteLength;
-
- xTxSpace = FreeRTOS_tx_space( pxClient->xTransferSocket );
-
- if( xTxSpace > ( BaseType_t ) sizeof( pcCOMMAND_BUFFER ) )
- {
- xTxSpace = sizeof( pcCOMMAND_BUFFER );
- }
-
- while( ( xTxSpace >= MAX_DIR_LIST_ENTRY_SIZE ) && ( pxClient->bits1.bDirHasEntry != pdFALSE_UNSIGNED ) )
- {
- BaseType_t xLength, xEndOfDir;
- int32_t iRc;
- int iErrorNo;
-
- xLength = prvGetFileInfoStat( &( pxClient->xFindData.xDirectoryEntry ), pcWritePtr, xTxSpace );
-
- pxClient->xDirCount++;
- pcWritePtr += xLength;
- xTxSpace -= xLength;
-
- iRc = ff_findnext( &pxClient->xFindData );
- iErrorNo = stdioGET_ERRNO();
-
- xEndOfDir = ( iRc < 0 ) && ( iErrorNo == pdFREERTOS_ERRNO_ENMFILE );
-
- pxClient->bits1.bDirHasEntry = ( xEndOfDir == pdFALSE ) && ( iRc >= 0 );
-
- if( ( iRc < 0 ) && ( xEndOfDir == pdFALSE ) )
- {
- FreeRTOS_printf( ("prvListSendWork: %s (rc %08x)\n",
- ( const char * ) strerror( iErrorNo ),
- ( unsigned )iRc ) );
- }
- }
- xWriteLength = ( BaseType_t ) ( pcWritePtr - pcCOMMAND_BUFFER );
-
- if( xWriteLength == 0 )
- {
- break;
- }
-
- if( pxClient->bits1.bDirHasEntry == pdFALSE_UNSIGNED )
- {
- uint32_t ulTotalCount;
- uint32_t ulFreeCount;
- uint32_t ulPercentage;
-
- ulTotalCount = 1;
- ulFreeCount = ff_diskfree( pxClient->pcCurrentDir, &ulTotalCount );
- ulPercentage = ( uint32_t ) ( ( 100ULL * ulFreeCount + ulTotalCount / 2 ) / ulTotalCount );
-
- /* Prepare the ACK which will be sent when all data has been sent. */
- snprintf( pxClient->pcClientAck, sizeof( pxClient->pcClientAck ),
- "226-Options: -l\r\n"
- "226-%ld matches total\r\n"
- "226 Total %lu KB (%lu %% free)\r\n",
- pxClient->xDirCount, ulTotalCount /1024, ulPercentage );
- }
-
- if( xWriteLength )
- {
- if( pxClient->bits1.bDirHasEntry == pdFALSE_UNSIGNED )
- {
- BaseType_t xTrueValue = 1;
-
- FreeRTOS_setsockopt( pxClient->xTransferSocket, 0, FREERTOS_SO_CLOSE_AFTER_SEND, ( void * ) &xTrueValue, sizeof( xTrueValue ) );
- }
-
- prvSendReply( pxClient->xTransferSocket, pcCOMMAND_BUFFER, xWriteLength );
- }
-
- if( pxClient->bits1.bDirHasEntry == pdFALSE_UNSIGNED )
- {
- prvSendReply( pxClient->xSocket, pxClient->pcClientAck, 0 );
- break;
- }
-
- } /* while( pxClient->bits1.bClientConnected ) */
-
- return 0;
-}
-/*-----------------------------------------------------------*/
-
-static const char *pcMonthAbbrev( BaseType_t xMonth )
-{
-static const char pcMonthList[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
-
- if( xMonth < 1 || xMonth > 12 )
- xMonth = 12;
-
- return pcMonthList + 3 * ( xMonth - 1 );
-};
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvGetFileInfoStat( FF_DirEnt_t *pxEntry, char *pcLine, BaseType_t xMaxLength )
-{
- char date[ 16 ];
- char mode[ 11 ] = "----------";
- BaseType_t st_nlink = 1;
- const char user[ 9 ] = "freertos";
- const char group[ 8 ] = "plusfat";
-
-/*
- * Creates a unix-style listing, understood by most FTP clients:
- *
- * -rw-rw-r-- 1 freertos FreeRTOS+FAT 10564588 Sep 01 00:17 03. Metaharmoniks - Star (Instrumental).mp3
- * -rw-rw-r-- 1 freertos FreeRTOS+FAT 19087839 Sep 01 00:17 04. Simon Le Grec - Dimitri (Wherever U Are) (Cosmos Mix).mp3
- * -rw-rw-r-- 1 freertos FreeRTOS+FAT 11100621 Sep 01 00:16 05. D-Chill - Mistake (feat. Katy Blue).mp3
- */
-
- #if ( ffconfigTIME_SUPPORT == 1 )
- const FF_SystemTime_t *pxCreateTime = &( pxEntry->xCreateTime );
- #else
- #warning Do not use this.
- FF_SystemTime_t xCreateTime;
- const FF_SystemTime_t *pxCreateTime = &xCreateTime;
- #endif
- size_t ulSize = ( size_t )pxEntry->ulFileSize;
- const char *pcFileName = pxEntry->pcFileName;
-
- mode[ 0 ] = ( ( pxEntry->ucAttrib & FF_FAT_ATTR_DIR ) != 0 ) ? 'd' : '-';
- #if( ffconfigDEV_SUPPORT != 0 )
- {
- if( ( pxEntry->ucAttrib & FF_FAT_ATTR_DIR ) == 0 )
- {
- switch( pxEntry->ucIsDeviceDir )
- {
- case FF_DEV_CHAR_DEV:
- mode[ 0 ] = 'c';
- break;
- case FF_DEV_BLOCK_DEV:
- mode[ 0 ] = 'b';
- break;
- }
- }
- }
- #endif /* ffconfigDEV_SUPPORT != 0 */
-
- mode[ 1 ] = 'r'; /* Owner. */
- mode[ 2 ] = ( ( pxEntry->ucAttrib & FF_FAT_ATTR_READONLY ) != 0 ) ? '-' : 'w';
- mode[ 3 ] = '-'; /* x for executable. */
-
- mode[ 4 ] = 'r'; /* group. */
- mode[ 5 ] = ( ( pxEntry->ucAttrib & FF_FAT_ATTR_READONLY ) != 0 ) ? '-' : 'w';
- mode[ 6 ] = '-'; /* x for executable. */
-
- mode[ 7 ] = 'r'; /* world. */
- mode[ 8 ] = '-';
- mode[ 9 ] = '-'; /* x for executable. */
-
- if( pxCreateTime->Month && pxCreateTime->Day )
- {
- snprintf( date, sizeof( date ), "%-3.3s %02d %02d:%02d",
- pcMonthAbbrev( pxCreateTime->Month ),
- pxCreateTime->Day,
- pxCreateTime->Hour,
- pxCreateTime->Minute );
- }
- else
- {
- snprintf (date, sizeof( date ), "Jan 01 1970");
- }
- return snprintf( pcLine, xMaxLength, "%s %3ld %-4s %-4s %8d %12s %s\r\n",
- mode, st_nlink, user, group, ( int ) ulSize, date, pcFileName );
-}
-/*-----------------------------------------------------------*/
-
-/*
- #### # # #####
- # # # # # #
-# # # # # #
-# # # # # #
-# # # # # #
-# # # # # #
-# # ## ## # #
- # # ## ## # #
- #### ## ## #####
-*/
-static BaseType_t prvChangeDir( FTPClient_t *pxClient, char *pcDirectory )
-{
-BaseType_t xResult;
-BaseType_t xIsRootDir, xLength, xValid;
-BaseType_t xIsDotDir = 0;
-
- if( pcDirectory[ 0 ] == '.' )
- {
- if( ( pcDirectory[ 1 ] == '.' ) &&
- ( pcDirectory[ 2 ] == '\0' ) )
- {
- xIsDotDir = 2;
- }
- else if( pcDirectory[ 1 ] == '\0' )
- {
- xIsDotDir = 1;
- }
- }
-
- if( xIsDotDir != 0 )
- {
- strcpy( pcFILE_BUFFER, pxClient->pcCurrentDir );
-
- if( pcDirectory[ 1 ] == '.' )
- {
- char *p = strrchr( pcFILE_BUFFER, '/' );
- if( p != NULL )
- {
- if( p == pcFILE_BUFFER )
- {
- p[ 1 ] = '\0';
- }
- else
- {
- p[ 0 ] = '\0';
- }
- }
- }
- }
- else
- {
- if(pcDirectory[ 0 ] != '/' )
- {
- BaseType_t xCurLength;
-
- xCurLength = strlen( pxClient->pcCurrentDir );
- snprintf( pcFILE_BUFFER, sizeof( pcFILE_BUFFER ), "%s%s%s",
- pxClient->pcCurrentDir,
- pxClient->pcCurrentDir[ xCurLength - 1 ] == '/' ? "" : "/",
- pcDirectory );
- }
- else
- {
- snprintf( pcFILE_BUFFER, sizeof( pcFILE_BUFFER ), "%s", pcDirectory );
- }
- }
-
- xIsRootDir = ( pcFILE_BUFFER[ 0 ] == '/' ) && ( pcFILE_BUFFER[ 1 ] == '\0' );
- xMakeAbsolute( pxClient, pcNEW_DIR, sizeof( pcNEW_DIR ), pcFILE_BUFFER );
-
- if( ( ( xIsRootDir == pdFALSE ) || ( FF_FS_Count() == 0 ) ) && ( ff_finddir( pcNEW_DIR ) == pdFALSE ) )
- {
- xValid = pdFALSE;
- }
- else
- {
- xValid = pdTRUE;
- }
-
- if( xValid == pdFALSE )
- {
- /* Get the directory cluster, if it exists. */
- FreeRTOS_printf( ("FTP: chdir \"%s\": No such dir\n", pcNEW_DIR ) );
- //#define REPL_550 "550 Requested action not taken.\r\n"
- //550 /home/hein/arch/h8300: No such file or directory
- xLength = snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ),
- "550 %s: No such file or directory\r\n",
- pcNEW_DIR );
- prvSendReply( pxClient->xSocket, pcCOMMAND_BUFFER, xLength );
- xResult = pdFALSE;
- }
- else
- {
- memcpy( pxClient->pcCurrentDir, pcNEW_DIR, sizeof( pxClient->pcCurrentDir ) );
-
- xLength = snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ), "250 Changed to %s\r\n", pcNEW_DIR );
- prvSendReply( pxClient->xSocket, pcCOMMAND_BUFFER, xLength );
- xResult = pdTRUE;
- }
-
- return xResult;
-}
-/*-----------------------------------------------------------*/
-
-/*
-###### ## # ####### ######
- # # ## # # ## # #
- # # ## # # # # #
- # # ### # # # # #
- ###### # ## # ##### ######
- # ## # ## # # # # ##
- # # # ### # # #
- # # # ## # # #
-### ## # ## #### ### ##
-*/
-static BaseType_t prvRenameFrom( FTPClient_t *pxClient, const char *pcFileName )
-{
-const char *myReply;
-FF_FILE *fh;
-
- xMakeAbsolute( pxClient, pxClient->pcFileName, sizeof( pxClient->pcFileName ), pcFileName );
-
- myReply = NULL;
-
- fh = ff_fopen( pxClient->pcFileName, "rb" );
-
- if( fh != NULL )
- {
- ff_fclose( fh );
- /* REPL_350; "350 Requested file action pending further information." */
- snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ),
- "350 Rename '%s' ...\r\n", pxClient->pcFileName );
- myReply = pcCOMMAND_BUFFER;
- pxClient->bits.bInRename = pdTRUE_UNSIGNED;
- }
- else if( stdioGET_ERRNO() == pdFREERTOS_ERRNO_EISDIR )
- {
- snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ),
- "350 Rename directory '%s' ...\r\n", pxClient->pcFileName );
- myReply = pcCOMMAND_BUFFER;
- pxClient->bits.bInRename = pdTRUE_UNSIGNED;
- }
- else
- {
- FreeRTOS_printf( ("ftp::renameFrom[%s]\n%s\n", pxClient->pcFileName, strerror( stdioGET_ERRNO() ) ) );
- myReply = REPL_451; /* "451 Requested action aborted. Local error in processing." */
- }
- if( myReply )
- {
- prvSendReply( pxClient->xSocket, myReply, 0 );
- }
-
- return pdTRUE;
-}
-/*-----------------------------------------------------------*/
-
-/*
-###### ## # ##### ###
- # # ## # # # # ## ##
- # # ## # # ## ##
- # # ### # # # #
- ###### # ## # # # #
- # ## # ## # # # #
- # # # ### # ## ##
- # # # ## # ## ##
-### ## # ## #### ###
-*/
-static BaseType_t prvRenameTo( FTPClient_t *pxClient, const char *pcFileName )
-{
-const char *myReply = NULL;
-int iResult;
-
- xMakeAbsolute( pxClient, pcNEW_DIR, sizeof( pcNEW_DIR ), pcFileName );
-
- /* FreeRTOS+FAT rename has an extra parameter: "remove target if already
- exists". */
- iResult = ff_rename( pxClient->pcFileName, pcNEW_DIR, pdFALSE );
-
- if( iResult < 0 )
- {
- iResult = stdioGET_ERRNO();
- }
- else
- {
- iResult = 0;
- }
-
- switch( iResult )
- {
- case 0:
- FreeRTOS_printf( ( "ftp::renameTo[%s,%s]: Ok\n", pxClient->pcFileName, pcNEW_DIR ) );
- snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ),
- "250 Rename successful to '%s'\r\n", pcNEW_DIR );
- myReply = pcCOMMAND_BUFFER;
- break;
- case pdFREERTOS_ERRNO_EEXIST:
- /* the destination file already exists.
- "450 Requested file action not taken.\r\n"*/
- snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ),
- "450 Already exists '%s'\r\n", pcNEW_DIR );
- myReply = pcCOMMAND_BUFFER;
- break;
- case pdFREERTOS_ERRNO_EIO: /* FF_ERR_FILE_COULD_NOT_CREATE_DIRENT */
- /* if dirent creation failed (fatal error!).
- "553 Requested action not taken.\r\n" */
- FreeRTOS_printf( ("ftp::renameTo[%s,%s]: Error creating DirEnt\n",
- pxClient->pcFileName, pcNEW_DIR ) );
- myReply = REPL_553;
- break;
- case pdFREERTOS_ERRNO_ENXIO:
- case pdFREERTOS_ERRNO_ENOENT:
- /* if the source file was not found.
- "450 Requested file action not taken.\r\n" */
- snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ),
- "450 No such file '%s'\r\n", pxClient->pcFileName );
- myReply = pcCOMMAND_BUFFER;
- break;
- default:
- FreeRTOS_printf( ("ftp::renameTo[%s,%s]: %s\n", pxClient->pcFileName, pcNEW_DIR,
- (const char*)strerror( stdioGET_ERRNO() ) ) );
- myReply = REPL_451; /* "451 Requested action aborted. Local error in processing." */
- break;
- }
- prvSendReply( pxClient->xSocket, myReply, 0 );
-
- return pdTRUE;
-}
-/*-----------------------------------------------------------*/
-
-/*
- #### #
-# # # #
-# # #
-# ### ###### ####
- ## # # # #
- ## # # ######
-# # # # #
-# # # # ## # ##
- #### ##### ## ####
-*/
-static BaseType_t prvSiteCmd( FTPClient_t *pxClient, char *pcRestCommand )
-{
- ( void ) pxClient;
- ( void ) pcRestCommand;
-
- return 0;
-}
-/*-----------------------------------------------------------*/
-
-/*
-##### ###
- # # # #
- # # # #
- # # #### # #### ###### ####
- # # # # # # # # # #
- # # ###### # ###### # ######
- # # # # # # #
- # # # ## # # ## # ## # ##
-##### #### ##### #### ## ####
-*/
-static BaseType_t prvDeleteFile( FTPClient_t *pxClient, char *pcFileName )
-{
-BaseType_t xResult, xLength;
-int32_t iRc;
-int iErrorNo;
-
- /* DELE: Delete a file. */
- xMakeAbsolute( pxClient, pxClient->pcFileName, sizeof( pxClient->pcFileName ), pcFileName );
-
- iRc = ff_remove( pxClient->pcFileName );
-
- if (iRc >= 0 )
- {
- xLength = snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ),
- "250 File \"%s\" removed\r\n", pxClient->pcFileName );
- xResult = pdTRUE;
- }
- else
- {
- const char *errMsg = "other error";
-
- iErrorNo = stdioGET_ERRNO();
- switch( iErrorNo )
- { /*_RB_ What do these negative numbers relate to? */
- case pdFREERTOS_ERRNO_ENOENT: errMsg = "No such file"; break; /* -31 File was not found. */
- case pdFREERTOS_ERRNO_EALREADY: errMsg = "File still open"; break; /* -30 File is in use. */
- case pdFREERTOS_ERRNO_EISDIR: errMsg = "Is a dir"; break; /* -32 Tried to FF_Open() a Directory. */
- case pdFREERTOS_ERRNO_EROFS: errMsg = "Read-only"; break; /* -33 Tried to FF_Open() a file marked read only. */
- case pdFREERTOS_ERRNO_ENOTDIR: errMsg = "Invalid path"; break; /* -34 The path of the file was not found. */
- }
- FreeRTOS_printf( ( "ftp::delFile: '%s' because %s\n",
- pxClient->pcFileName, strerror( iErrorNo ) ) );
-
- xLength = snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ),
- "521-\"%s\" %s;\r\n"
- "521 taking no action\r\n",
- pxClient->pcFileName, errMsg );
-
- xResult = pdFALSE;
- }
-
- prvSendReply( pxClient->xSocket, pcCOMMAND_BUFFER, xLength );
-
- return xResult;
-}
-/*-----------------------------------------------------------*/
-
-/*
- #### # #####
-# # # # # #
-# # # # #
-# ### ###### #### # # #### ###### ####
- ## # # # # # # # # # # #
- ## # # ###### # # ##### # ######
-# # # # # # # # # # #
-# # # # # ## # # # # # ## # ##
- #### ##### ###### #### ##### ### ## ## ####
-*/
-static BaseType_t prvSizeDateFile( FTPClient_t *pxClient, char *pcFileName, BaseType_t xSendDate )
-{
-BaseType_t xResult = pdFALSE;
-char *pcPtr;
-
- /* SIZE: get the size of a file (xSendDate = 0)
- MDTM: get data and time properties (xSendDate = 1) */
- xMakeAbsolute( pxClient, pxClient->pcFileName, sizeof( pxClient->pcFileName ), pcFileName );
-
- pcPtr = strrchr( pxClient->pcFileName, '/' );
-
- if( ( pcPtr != NULL ) && ( pcPtr[ 1 ] != '\0' ) )
- {
- FF_Stat_t xStatBuf;
- int32_t iRc = ff_stat( pxClient->pcFileName, &xStatBuf );
- if (iRc < 0 )
- FreeRTOS_printf( ("In %s: %s\n", pxClient->pcFileName,
- ( const char* )strerror( stdioGET_ERRNO() ) ) );
-
- if( iRc == 0 )
- {
- BaseType_t xLength;
- /* "YYYYMMDDhhmmss" */
- if( xSendDate != pdFALSE )
- {
- #if( ffconfigTIME_SUPPORT != 0 )
- {
- FF_TimeStruct_t tmStruct;
- time_t secs = xStatBuf.st_mtime;
- FreeRTOS_gmtime_r( &secs, &tmStruct );
-
- xLength = snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ), "213 %04u%02u%02u%02u%02u%02u\r\n",
- tmStruct.tm_year + 1900,
- tmStruct.tm_mon+1,
- tmStruct.tm_mday,
- tmStruct.tm_hour,
- tmStruct.tm_min,
- tmStruct.tm_sec );
- }
- #else
- {
- xLength = snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ), "213 19700101000000\r\n",
- }
- #endif
- }
- else
- {
- xLength = snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ), "213 %lu\r\n", xStatBuf.st_size );
- }
- prvSendReply( pxClient->xSocket, pcCOMMAND_BUFFER, xLength );
- xResult = pdTRUE;
- }
- else
- {
- FreeRTOS_printf( ("ftp::sizeDateFile: No such file %s\n", pxClient->pcFileName ) );
- }
- } else {
- FreeRTOS_printf( ("ftp::sizeDateFile: Invalid file name: %s ?\n", pxClient->pcFileName ) );
- }
- if( xResult == pdFALSE )
- {
- prvSendReply( pxClient->xSocket, REPL_450, 0 ); /* "Requested file action not taken". */
- }
-
- return xResult;
-}
-/*-----------------------------------------------------------*/
-
-/*
-## ## ## ## ##### ###### ## ## #####
-### ### # # # # # # ### ### # #
-# ### # # # # # # # # ### # # #
-# # # # # # # # # # # # # #
-# # # #### # # ###### # # # # #
-# # # # # # # ## # # # #
-# # # # # # # # # # # #
-# # # # # # # # # # # #
-# # ### ## ##### ### ## # # #####
-*/
-static BaseType_t prvMakeRemoveDir( FTPClient_t *pxClient, const char *pcDirectory, BaseType_t xDoRemove )
-{
-BaseType_t xResult;
-BaseType_t xLength;
-int32_t iRc;
-int iErrorNo;
-
- /* MKD: Make / create a directory (xDoRemove = 0)
- RMD: Remove a directory (xDoRemove = 1) */
- xMakeAbsolute( pxClient, pxClient->pcFileName, sizeof( pxClient->pcFileName ), pcDirectory );
-
- if( xDoRemove )
- {
- iRc = ff_rmdir( pxClient->pcFileName );
- }
- else
- {
- #if( ffconfigMKDIR_RECURSIVE != 0 )
- {
- iRc = ff_mkdir( pxClient->pcFileName, pdFALSE );
- }
- #else
- {
- iRc = ff_mkdir( pxClient->pcFileName );
- }
- #endif /* ffconfigMKDIR_RECURSIVE */
- }
- xResult = pdTRUE;
-
- if( iRc >= 0 )
- {
- xLength = snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ), "257 \"%s\" directory %s\r\n",
- pxClient->pcFileName, xDoRemove ? "removed" : "created" );
- }
- else
- {
- const char *errMsg = "other error";
- BaseType_t xFTPCode = 521;
-
- xResult = pdFALSE;
- iErrorNo = stdioGET_ERRNO();
- switch( iErrorNo )
- {
- case pdFREERTOS_ERRNO_EEXIST: errMsg = "Directory already exists"; break;
- case pdFREERTOS_ERRNO_ENOTDIR: errMsg = "Invalid path"; break; /* -34 The path of the file was not found. *//*_RB_ As before, what do these negative numbers relate to? */
- case pdFREERTOS_ERRNO_ENOTEMPTY:errMsg = "Dir not empty"; break;
- case pdFREERTOS_ERRNO_EROFS: errMsg = "Read-only"; break; /* -33 Tried to FF_Open() a file marked read only. */
- default: errMsg = strerror( iErrorNo ); break;
- }
- if( iErrorNo == pdFREERTOS_ERRNO_ENOSPC )
- {
- xFTPCode = 552;
- }
- xLength = snprintf( pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ),
- "%ld-\"%s\" %s;\r\n"
- "%ld taking no action\r\n",
- xFTPCode, pxClient->pcFileName, errMsg, xFTPCode );
- FreeRTOS_printf( ( "%sdir '%s': %s\n", xDoRemove ? "rm" : "mk", pxClient->pcFileName, errMsg ) );
- }
- prvSendReply( pxClient->xSocket, pcCOMMAND_BUFFER, xLength );
-
- return xResult;
-}
-/*-----------------------------------------------------------*/
-
-static portINLINE BaseType_t IsDigit( char cChar )
-{
-BaseType_t xResult;
-
- if( cChar >= '0' && cChar <= '9' )
- {
- xResult = pdTRUE;
- }
- else
- {
- xResult = pdFALSE;
- }
- return xResult;
-}
-
-static BaseType_t prvSendReply( Socket_t xSocket, const char *pcBuffer, BaseType_t xLength )
-{
-BaseType_t xResult;
-
- if( xLength == 0 )
- {
- xLength = strlen( pcBuffer );
- }
- xResult = FreeRTOS_send( xSocket, ( const void * )pcBuffer, ( size_t ) xLength, 0 );
- if( IsDigit( ( int ) pcBuffer[ 0 ] ) &&
- IsDigit( ( int ) pcBuffer[ 1 ] ) &&
- IsDigit( ( int ) pcBuffer[ 2 ] ) &&
- IsDigit( ( int ) pcBuffer[ 3 ] ) )
- {
- const char *last = pcBuffer + strlen( pcBuffer );
- int iLength;
- while( ( last > pcBuffer ) && ( ( last[ -1 ] == ftpASCII_CR ) || ( last[ -1 ] == ftpASCII_LF ) ) )
- {
- last--;
- }
- iLength = ( int )( last - pcBuffer );
- FF_PRINTF( " %-*.*s", iLength, iLength, pcBuffer );
- }
- return xResult;
-}
-/*-----------------------------------------------------------*/
-
-#if( ipconfigFTP_HAS_RECEIVED_HOOK != 0 )
-
- /*
- * The following function is called for every file received:
- * void vApplicationFTPReceivedHook( pcFileName, ulSize, pxFTPClient );
- * This callback function may do a callback to vFTPReplyMessage() to send messages
- * to the FTP client like:
- * 200-Please wait: Received new firmware
- * 200-Please wait: Please wait a few seconds for reboot
- */
- void vFTPReplyMessage( struct xFTP_CLIENT *pxFTPClient, const char *pcMessage )
- {
- if( ( pxFTPClient != NULL ) && ( pxFTPClient->xSocket != NULL ) )
- {
- prvSendReply( pxFTPClient->xSocket, pcMessage, 0 );
- }
- }
- /*-----------------------------------------------------------*/
-
-#endif /* ipconfigFTP_HAS_RECEIVED_HOOK != 0 */
-
-/*
- * Some explanation:
- * The FTP client may send: "DELE readme.txt"
- * Here the complete path is constructed consisting of 3 parts:
- *
- * pxClient->pcRootDir + pxClient->pcCurrentDir + pcFileName
- *
- * 'pcCurrentDir' will not be applied for an absolute path like in "DELE /.htaccess"
- */
-BaseType_t xMakeAbsolute( FTPClient_t *pxClient, char *pcBuffer, BaseType_t xBufferLength, const char *pcFileName )
-{
-BaseType_t xLength = strlen( pxClient->pcRootDir );
-
- if( pcFileName[ 0 ] != '/' )
- {
- char *pcNewDirBuffer = pcNEW_DIR;
- BaseType_t xCurLength;
-
- xCurLength = strlen( pxClient->pcCurrentDir );
- if( pcBuffer == pcNEW_DIR )
- {
- /* In one call, the result already goes into pcNEW_DIR.
- Use pcFILE_BUFFER in that case */
- pcNewDirBuffer = pcFILE_BUFFER;
- }
- snprintf( pcNewDirBuffer, sizeof( pcNEW_DIR ), "%s%s%s",
- pxClient->pcCurrentDir,
- pxClient->pcCurrentDir[ xCurLength - 1 ] == '/' ? "" : "/",
- pcFileName );
- pcFileName = pcNewDirBuffer;
- }
- if( strncasecmp( pxClient->pcRootDir, pcFileName, xLength ) == 0 )
- {
- xLength = snprintf( pcBuffer, xBufferLength, "%s", pcFileName );
- }
- else
- {
- xLength = snprintf( pcBuffer, xBufferLength, "%s/%s",
- pxClient->pcRootDir,
- pcFileName[ 0 ] == '/' ? ( pcFileName + 1 ) : pcFileName );
- }
-
- #if( ipconfigFTP_FS_USES_BACKSLAH == 1 )
- for( pcPtr = pcBuffer; *pcPtr; pcPtr++ )
- {
- if( pcPtr[ 0 ] == '/' )
- {
- pcPtr[ 0 ] = '\\';
- }
- }
- #endif
-
- return xLength;
-}
-/*-----------------------------------------------------------*/
-
-BaseType_t xMakeRelative( FTPClient_t *pxClient, char *pcBuffer, BaseType_t xBufferLength, const char *pcFileName )
-{
-BaseType_t xLength = strlen( pxClient->pcRootDir );
-
- if( strncasecmp ( pxClient->pcRootDir, pcFileName, xLength ) == 0 )
- {
- xLength = snprintf( pcBuffer, xBufferLength, "%s", pcFileName + xLength );
- }
- else
- {
- xLength = snprintf( pcBuffer, xBufferLength, "%s", pcFileName );
- }
-
- return xLength;
-}
-/*-----------------------------------------------------------*/
-
-#endif /* ipconfigUSE_FTP */
-
-
-
diff --git a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/HTTP/FreeRTOS_HTTP_commands.c b/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/HTTP/FreeRTOS_HTTP_commands.c
deleted file mode 100644
index f8b5ac2..0000000
--- a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/HTTP/FreeRTOS_HTTP_commands.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * FreeRTOS+TCP V2.0.3
- * Copyright (C) 2017 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 <stdio.h>
-#include <stdlib.h>
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-
-#include "FreeRTOS_HTTP_commands.h"
-
-const struct xWEB_COMMAND xWebCommands[ WEB_CMD_COUNT ] =
-{
- { 3, "GET", ECMD_GET },
- { 4, "HEAD", ECMD_HEAD },
- { 4, "POST", ECMD_POST },
- { 3, "PUT", ECMD_PUT },
- { 6, "DELETE", ECMD_DELETE },
- { 5, "TRACE", ECMD_TRACE },
- { 7, "OPTIONS", ECMD_OPTIONS },
- { 7, "CONNECT", ECMD_CONNECT },
- { 5, "PATCH", ECMD_PATCH },
- { 4, "UNKN", ECMD_UNK },
-};
-
-const char *webCodename (int aCode)
-{
- switch (aCode) {
- case WEB_REPLY_OK: // = 200,
- return "OK";
- case WEB_NO_CONTENT: // 204
- return "No content";
- case WEB_BAD_REQUEST: // = 400,
- return "Bad request";
- case WEB_UNAUTHORIZED: // = 401,
- return "Authorization Required";
- case WEB_NOT_FOUND: // = 404,
- return "Not Found";
- case WEB_GONE: // = 410,
- return "Done";
- case WEB_PRECONDITION_FAILED: // = 412,
- return "Precondition Failed";
- case WEB_INTERNAL_SERVER_ERROR: // = 500,
- return "Internal Server Error";
- }
- return "Unknown";
-}
diff --git a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/HTTP/FreeRTOS_HTTP_server.c b/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/HTTP/FreeRTOS_HTTP_server.c
deleted file mode 100644
index ee69fd1..0000000
--- a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/HTTP/FreeRTOS_HTTP_server.c
+++ /dev/null
@@ -1,428 +0,0 @@
-/*
- * FreeRTOS+TCP V2.0.3
- * Copyright (C) 2017 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 <stdio.h>
-#include <stdlib.h>
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-#include "task.h"
-
-/* FreeRTOS+TCP includes. */
-#include "FreeRTOS_IP.h"
-#include "FreeRTOS_Sockets.h"
-
-/* FreeRTOS Protocol includes. */
-#include "FreeRTOS_HTTP_commands.h"
-#include "FreeRTOS_TCP_server.h"
-#include "FreeRTOS_server_private.h"
-
-/* Remove the whole file if HTTP is not supported. */
-#if( ipconfigUSE_HTTP == 1 )
-
-/* FreeRTOS+FAT includes. */
-#include "ff_stdio.h"
-
-#ifndef HTTP_SERVER_BACKLOG
- #define HTTP_SERVER_BACKLOG ( 12 )
-#endif
-
-#ifndef USE_HTML_CHUNKS
- #define USE_HTML_CHUNKS ( 0 )
-#endif
-
-#if !defined( ARRAY_SIZE )
- #define ARRAY_SIZE(x) ( BaseType_t ) (sizeof( x ) / sizeof( x )[ 0 ] )
-#endif
-
-/* Some defines to make the code more readbale */
-#define pcCOMMAND_BUFFER pxClient->pxParent->pcCommandBuffer
-#define pcNEW_DIR pxClient->pxParent->pcNewDir
-#define pcFILE_BUFFER pxClient->pxParent->pcFileBuffer
-
-#ifndef ipconfigHTTP_REQUEST_CHARACTER
- #define ipconfigHTTP_REQUEST_CHARACTER '?'
-#endif
-
-/*_RB_ Need comment block, although fairly self evident. */
-static void prvFileClose( HTTPClient_t *pxClient );
-static BaseType_t prvProcessCmd( HTTPClient_t *pxClient, BaseType_t xIndex );
-static const char *pcGetContentsType( const char *apFname );
-static BaseType_t prvOpenURL( HTTPClient_t *pxClient );
-static BaseType_t prvSendFile( HTTPClient_t *pxClient );
-static BaseType_t prvSendReply( HTTPClient_t *pxClient, BaseType_t xCode );
-
-static const char pcEmptyString[1] = { '\0' };
-
-typedef struct xTYPE_COUPLE
-{
- const char *pcExtension;
- const char *pcType;
-} TypeCouple_t;
-
-static TypeCouple_t pxTypeCouples[ ] =
-{
- { "html", "text/html" },
- { "css", "text/css" },
- { "js", "text/javascript" },
- { "png", "image/png" },
- { "jpg", "image/jpeg" },
- { "gif", "image/gif" },
- { "txt", "text/plain" },
- { "mp3", "audio/mpeg3" },
- { "wav", "audio/wav" },
- { "flac", "audio/ogg" },
- { "pdf", "application/pdf" },
- { "ttf", "application/x-font-ttf" },
- { "ttc", "application/x-font-ttf" }
-};
-
-void vHTTPClientDelete( TCPClient_t *pxTCPClient )
-{
-HTTPClient_t *pxClient = ( HTTPClient_t * ) pxTCPClient;
-
- /* This HTTP client stops, close / release all resources. */
- if( pxClient->xSocket != FREERTOS_NO_SOCKET )
- {
- FreeRTOS_FD_CLR( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_ALL );
- FreeRTOS_closesocket( pxClient->xSocket );
- pxClient->xSocket = FREERTOS_NO_SOCKET;
- }
- prvFileClose( pxClient );
-}
-/*-----------------------------------------------------------*/
-
-static void prvFileClose( HTTPClient_t *pxClient )
-{
- if( pxClient->pxFileHandle != NULL )
- {
- FreeRTOS_printf( ( "Closing file: %s\n", pxClient->pcCurrentFilename ) );
- ff_fclose( pxClient->pxFileHandle );
- pxClient->pxFileHandle = NULL;
- }
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvSendReply( HTTPClient_t *pxClient, BaseType_t xCode )
-{
-struct xTCP_SERVER *pxParent = pxClient->pxParent;
-BaseType_t xRc;
-
- /* A normal command reply on the main socket (port 21). */
- char *pcBuffer = pxParent->pcFileBuffer;
-
- xRc = snprintf( pcBuffer, sizeof( pxParent->pcFileBuffer ),
- "HTTP/1.1 %d %s\r\n"
-#if USE_HTML_CHUNKS
- "Transfer-Encoding: chunked\r\n"
-#endif
- "Content-Type: %s\r\n"
- "Connection: keep-alive\r\n"
- "%s\r\n",
- ( int ) xCode,
- webCodename (xCode),
- pxParent->pcContentsType[0] ? pxParent->pcContentsType : "text/html",
- pxParent->pcExtraContents );
-
- pxParent->pcContentsType[0] = '\0';
- pxParent->pcExtraContents[0] = '\0';
-
- xRc = FreeRTOS_send( pxClient->xSocket, ( const void * ) pcBuffer, xRc, 0 );
- pxClient->bits.bReplySent = pdTRUE_UNSIGNED;
-
- return xRc;
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvSendFile( HTTPClient_t *pxClient )
-{
-size_t uxSpace;
-size_t uxCount;
-BaseType_t xRc = 0;
-
- if( pxClient->bits.bReplySent == pdFALSE_UNSIGNED )
- {
- pxClient->bits.bReplySent = pdTRUE_UNSIGNED;
-
- strcpy( pxClient->pxParent->pcContentsType, pcGetContentsType( pxClient->pcCurrentFilename ) );
- snprintf( pxClient->pxParent->pcExtraContents, sizeof( pxClient->pxParent->pcExtraContents ),
- "Content-Length: %d\r\n", ( int ) pxClient->uxBytesLeft );
-
- /* "Requested file action OK". */
- xRc = prvSendReply( pxClient, WEB_REPLY_OK );
- }
-
- if( xRc >= 0 ) do
- {
- uxSpace = FreeRTOS_tx_space( pxClient->xSocket );
-
- if( pxClient->uxBytesLeft < uxSpace )
- {
- uxCount = pxClient->uxBytesLeft;
- }
- else
- {
- uxCount = uxSpace;
- }
-
- if( uxCount > 0u )
- {
- if( uxCount > sizeof( pxClient->pxParent->pcFileBuffer ) )
- {
- uxCount = sizeof( pxClient->pxParent->pcFileBuffer );
- }
- ff_fread( pxClient->pxParent->pcFileBuffer, 1, uxCount, pxClient->pxFileHandle );
- pxClient->uxBytesLeft -= uxCount;
-
- xRc = FreeRTOS_send( pxClient->xSocket, pxClient->pxParent->pcFileBuffer, uxCount, 0 );
- if( xRc < 0 )
- {
- break;
- }
- }
- } while( uxCount > 0u );
-
- if( pxClient->uxBytesLeft == 0u )
- {
- /* Writing is ready, no need for further 'eSELECT_WRITE' events. */
- FreeRTOS_FD_CLR( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_WRITE );
- prvFileClose( pxClient );
- }
- else
- {
- /* Wake up the TCP task as soon as this socket may be written to. */
- FreeRTOS_FD_SET( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_WRITE );
- }
-
- return xRc;
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvOpenURL( HTTPClient_t *pxClient )
-{
-BaseType_t xRc;
-char pcSlash[ 2 ];
-
- pxClient->bits.ulFlags = 0;
-
- #if( ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK != 0 )
- {
- if( strchr( pxClient->pcUrlData, ipconfigHTTP_REQUEST_CHARACTER ) != NULL )
- {
- size_t xResult;
-
- xResult = uxApplicationHTTPHandleRequestHook( pxClient->pcUrlData, pxClient->pcCurrentFilename, sizeof( pxClient->pcCurrentFilename ) );
- if( xResult > 0 )
- {
- strcpy( pxClient->pxParent->pcContentsType, "text/html" );
- snprintf( pxClient->pxParent->pcExtraContents, sizeof( pxClient->pxParent->pcExtraContents ),
- "Content-Length: %d\r\n", ( int ) xResult );
- xRc = prvSendReply( pxClient, WEB_REPLY_OK ); /* "Requested file action OK" */
- if( xRc > 0 )
- {
- xRc = FreeRTOS_send( pxClient->xSocket, pxClient->pcCurrentFilename, xResult, 0 );
- }
- /* Although against the coding standard of FreeRTOS, a return is
- done here to simplify this conditional code. */
- return xRc;
- }
- }
- }
- #endif /* ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK */
-
- if( pxClient->pcUrlData[ 0 ] != '/' )
- {
- /* Insert a slash before the file name. */
- pcSlash[ 0 ] = '/';
- pcSlash[ 1 ] = '\0';
- }
- else
- {
- /* The browser provided a starting '/' already. */
- pcSlash[ 0 ] = '\0';
- }
- snprintf( pxClient->pcCurrentFilename, sizeof( pxClient->pcCurrentFilename ), "%s%s%s",
- pxClient->pcRootDir,
- pcSlash,
- pxClient->pcUrlData);
-
- pxClient->pxFileHandle = ff_fopen( pxClient->pcCurrentFilename, "rb" );
-
- FreeRTOS_printf( ( "Open file '%s': %s\n", pxClient->pcCurrentFilename,
- pxClient->pxFileHandle != NULL ? "Ok" : strerror( stdioGET_ERRNO() ) ) );
-
- if( pxClient->pxFileHandle == NULL )
- {
- /* "404 File not found". */
- xRc = prvSendReply( pxClient, WEB_NOT_FOUND );
- }
- else
- {
- pxClient->uxBytesLeft = ( size_t ) pxClient->pxFileHandle->ulFileSize;
- xRc = prvSendFile( pxClient );
- }
-
- return xRc;
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvProcessCmd( HTTPClient_t *pxClient, BaseType_t xIndex )
-{
-BaseType_t xResult = 0;
-
- /* A new command has been received. Process it. */
- switch( xIndex )
- {
- case ECMD_GET:
- xResult = prvOpenURL( pxClient );
- break;
-
- case ECMD_HEAD:
- case ECMD_POST:
- case ECMD_PUT:
- case ECMD_DELETE:
- case ECMD_TRACE:
- case ECMD_OPTIONS:
- case ECMD_CONNECT:
- case ECMD_PATCH:
- case ECMD_UNK:
- {
- FreeRTOS_printf( ( "prvProcessCmd: Not implemented: %s\n",
- xWebCommands[xIndex].pcCommandName ) );
- }
- break;
- }
-
- return xResult;
-}
-/*-----------------------------------------------------------*/
-
-BaseType_t xHTTPClientWork( TCPClient_t *pxTCPClient )
-{
-BaseType_t xRc;
-HTTPClient_t *pxClient = ( HTTPClient_t * ) pxTCPClient;
-
- if( pxClient->pxFileHandle != NULL )
- {
- prvSendFile( pxClient );
- }
-
- xRc = FreeRTOS_recv( pxClient->xSocket, ( void * )pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ), 0 );
-
- if( xRc > 0 )
- {
- BaseType_t xIndex;
- const char *pcEndOfCmd;
- const struct xWEB_COMMAND *curCmd;
- char *pcBuffer = pcCOMMAND_BUFFER;
-
- if( xRc < ( BaseType_t ) sizeof( pcCOMMAND_BUFFER ) )
- {
- pcBuffer[ xRc ] = '\0';
- }
- while( xRc && ( pcBuffer[ xRc - 1 ] == 13 || pcBuffer[ xRc - 1 ] == 10 ) )
- {
- pcBuffer[ --xRc ] = '\0';
- }
- pcEndOfCmd = pcBuffer + xRc;
-
- curCmd = xWebCommands;
-
- /* Pointing to "/index.html HTTP/1.1". */
- pxClient->pcUrlData = pcBuffer;
-
- /* Pointing to "HTTP/1.1". */
- pxClient->pcRestData = pcEmptyString;
-
- /* Last entry is "ECMD_UNK". */
- for( xIndex = 0; xIndex < WEB_CMD_COUNT - 1; xIndex++, curCmd++ )
- {
- BaseType_t xLength;
-
- xLength = curCmd->xCommandLength;
- if( ( xRc >= xLength ) && ( memcmp( curCmd->pcCommandName, pcBuffer, xLength ) == 0 ) )
- {
- char *pcLastPtr;
-
- pxClient->pcUrlData += xLength + 1;
- for( pcLastPtr = (char *)pxClient->pcUrlData; pcLastPtr < pcEndOfCmd; pcLastPtr++ )
- {
- char ch = *pcLastPtr;
- if( ( ch == '\0' ) || ( strchr( "\n\r \t", ch ) != NULL ) )
- {
- *pcLastPtr = '\0';
- pxClient->pcRestData = pcLastPtr + 1;
- break;
- }
- }
- break;
- }
- }
-
- if( xIndex < ( WEB_CMD_COUNT - 1 ) )
- {
- xRc = prvProcessCmd( pxClient, xIndex );
- }
- }
- else if( xRc < 0 )
- {
- /* The connection will be closed and the client will be deleted. */
- FreeRTOS_printf( ( "xHTTPClientWork: rc = %ld\n", xRc ) );
- }
- return xRc;
-}
-/*-----------------------------------------------------------*/
-
-static const char *pcGetContentsType (const char *apFname)
-{
- const char *slash = NULL;
- const char *dot = NULL;
- const char *ptr;
- const char *pcResult = "text/html";
- BaseType_t x;
-
- for( ptr = apFname; *ptr; ptr++ )
- {
- if (*ptr == '.') dot = ptr;
- if (*ptr == '/') slash = ptr;
- }
- if( dot > slash )
- {
- dot++;
- for( x = 0; x < ARRAY_SIZE( pxTypeCouples ); x++ )
- {
- if( strcasecmp( dot, pxTypeCouples[ x ].pcExtension ) == 0 )
- {
- pcResult = pxTypeCouples[ x ].pcType;
- break;
- }
- }
- }
- return pcResult;
-}
-
-#endif /* ipconfigUSE_HTTP */
-
diff --git a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/NTP/NTPDemo.c b/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/NTP/NTPDemo.c
deleted file mode 100644
index 7795c41..0000000
--- a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/NTP/NTPDemo.c
+++ /dev/null
@@ -1,440 +0,0 @@
-/*
- * FreeRTOS+TCP V2.0.3
- * Copyright (C) 2017 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
- */
-
-/*
- * NTPDemo.c
- *
- * An example of how to lookup a domain using DNS
- * And also how to send and receive UDP messages to get the NTP time
- *
- */
-
-/* Standard includes. */
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-#include "task.h"
-#include "semphr.h"
-
-/* FreeRTOS+TCP includes. */
-#include "FreeRTOS_IP.h"
-#include "FreeRTOS_Sockets.h"
-#include "FreeRTOS_DNS.h"
-#include "FreeRTOS_Stream_Buffer.h"
-
-/* Use the date & time functions from +FAT. */
-#include "ff_time.h"
-
-#include "NTPDemo.h"
-#include "ntpClient.h"
-
-#include "date_and_time.h"
-
-enum EStatus {
- EStatusLookup,
- EStatusAsking,
- EStatusPause,
- EStatusFailed,
-};
-
-static struct SNtpPacket xNTPPacket;
-
-#if( ipconfigUSE_CALLBACKS == 0 )
- static char cRecvBuffer[ sizeof( struct SNtpPacket ) + 64 ];
-#endif
-
-static enum EStatus xStatus = EStatusLookup;
-
-static const char *pcTimeServers[] = {
- "0.asia.pool.ntp.org",
- "0.europe.pool.ntp.org",
- "0.id.pool.ntp.org",
- "0.south-america.pool.ntp.org",
- "0.oceania.pool.ntp.org",
- "0.north-america.pool.ntp.org"
-};
-
-static SemaphoreHandle_t xNTPWakeupSem = NULL;
-static uint32_t ulIPAddressFound;
-static Socket_t xUDPSocket = NULL;
-static TaskHandle_t xNTPTaskhandle = NULL;
-static TickType_t uxSendTime;
-
-static void prvNTPTask( void *pvParameters );
-
-static void vSignalTask( void )
-{
- #if( ipconfigUSE_CALLBACKS == 0 )
- if( xUDPSocket != NULL )
- {
- /* Send a signal to the socket so that the
- FreeRTOS_recvfrom will get interrupted. */
- FreeRTOS_SignalSocket( xUDPSocket );
- }
- else
- #endif
- if( xNTPWakeupSem != NULL )
- {
- xSemaphoreGive( xNTPWakeupSem );
- }
-}
-
-void vStartNTPTask( uint16_t usTaskStackSize, UBaseType_t uxTaskPriority )
-{
- /* The only public function in this module: start a task to contact
- some NTP server. */
-
- if( xNTPTaskhandle != NULL )
- {
- switch( xStatus )
- {
- case EStatusPause:
- xStatus = EStatusAsking;
- vSignalTask();
- break;
- case EStatusLookup:
- FreeRTOS_printf( ( "NTP looking up server\n" ) );
- break;
- case EStatusAsking:
- FreeRTOS_printf( ( "NTP still asking\n" ) );
- break;
- case EStatusFailed:
- FreeRTOS_printf( ( "NTP failed somehow\n" ) );
- ulIPAddressFound = 0ul;
- xStatus = EStatusLookup;
- vSignalTask();
- break;
- }
- }
- else
- {
- xUDPSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP );
- if( xUDPSocket != NULL )
- {
- struct freertos_sockaddr xAddress;
- #if( ipconfigUSE_CALLBACKS != 0 )
- BaseType_t xReceiveTimeOut = pdMS_TO_TICKS( 0 );
- #else
- BaseType_t xReceiveTimeOut = pdMS_TO_TICKS( 5000 );
- #endif
-
- xAddress.sin_addr = 0ul;
- xAddress.sin_port = FreeRTOS_htons( NTP_PORT );
-
- FreeRTOS_bind( xUDPSocket, &xAddress, sizeof( xAddress ) );
- FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) );
- xTaskCreate( prvNTPTask, /* The function that implements the task. */
- ( const char * ) "NTP client", /* Just a text name for the task to aid debugging. */
- usTaskStackSize, /* The stack size is defined in FreeRTOSIPConfig.h. */
- NULL, /* The task parameter, not used in this case. */
- uxTaskPriority, /* The priority assigned to the task is defined in FreeRTOSConfig.h. */
- &xNTPTaskhandle ); /* The task handle. */
- }
- else
- {
- FreeRTOS_printf( ( "Creating socket failed\n" ) );
- }
- }
-}
-/*-----------------------------------------------------------*/
-
-static void vDNS_callback( const char *pcName, void *pvSearchID, uint32_t ulIPAddress )
-{
-char pcBuf[16];
-
- /* The DNS lookup has a result, or it has reached the time-out. */
- FreeRTOS_inet_ntoa( ulIPAddress, pcBuf );
- FreeRTOS_printf( ( "IP address of %s found: %s\n", pcName, pcBuf ) );
- if( ulIPAddressFound == 0ul )
- {
- ulIPAddressFound = ulIPAddress;
- }
- /* For testing: in case DNS doen't respond, still try some NTP server
- with a known IP-address. */
- if( ulIPAddressFound == 0ul )
- {
- ulIPAddressFound = FreeRTOS_inet_addr_quick( 184, 105, 182, 7 );
-/* ulIPAddressFound = FreeRTOS_inet_addr_quick( 103, 242, 70, 4 ); */
- }
- xStatus = EStatusAsking;
-
- vSignalTask();
-}
-/*-----------------------------------------------------------*/
-
-static void prvSwapFields( struct SNtpPacket *pxPacket)
-{
- /* NTP messages are big-endian */
- pxPacket->rootDelay = FreeRTOS_htonl( pxPacket->rootDelay );
- pxPacket->rootDispersion = FreeRTOS_htonl( pxPacket->rootDispersion );
-
- pxPacket->referenceTimestamp.seconds = FreeRTOS_htonl( pxPacket->referenceTimestamp.seconds );
- pxPacket->referenceTimestamp.fraction = FreeRTOS_htonl( pxPacket->referenceTimestamp.fraction );
-
- pxPacket->originateTimestamp.seconds = FreeRTOS_htonl( pxPacket->originateTimestamp.seconds );
- pxPacket->originateTimestamp.fraction = FreeRTOS_htonl( pxPacket->originateTimestamp.fraction );
-
- pxPacket->receiveTimestamp.seconds = FreeRTOS_htonl( pxPacket->receiveTimestamp.seconds );
- pxPacket->receiveTimestamp.fraction = FreeRTOS_htonl( pxPacket->receiveTimestamp.fraction );
-
- pxPacket->transmitTimestamp.seconds = FreeRTOS_htonl( pxPacket->transmitTimestamp.seconds );
- pxPacket->transmitTimestamp.fraction = FreeRTOS_htonl( pxPacket->transmitTimestamp.fraction );
-}
-/*-----------------------------------------------------------*/
-
-static void prvNTPPacketInit( )
-{
- memset (&xNTPPacket, '\0', sizeof( xNTPPacket ) );
-
- xNTPPacket.flags = 0xDB; /* value 0xDB : mode 3 (client), version 3, leap indicator unknown 3 */
- xNTPPacket.poll = 10; /* 10 means 1 << 10 = 1024 seconds */
- xNTPPacket.precision = 0xFA; /* = 250 = 0.015625 seconds */
- xNTPPacket.rootDelay = 0x5D2E; /* 0x5D2E = 23854 or (23854/65535)= 0.3640 sec */
- xNTPPacket.rootDispersion = 0x0008CAC8; /* 0x0008CAC8 = 8.7912 seconds */
-
- /* use the recorded NTP time */
- time_t uxSecs = FreeRTOS_time( NULL );/* apTime may be NULL, returns seconds */
-
- xNTPPacket.referenceTimestamp.seconds = uxSecs; /* Current time */
- xNTPPacket.transmitTimestamp.seconds = uxSecs + 3;
-
- /* Transform the contents of the fields from native to big endian. */
- prvSwapFields( &xNTPPacket );
-}
-/*-----------------------------------------------------------*/
-
-static void prvReadTime( struct SNtpPacket * pxPacket )
-{
- FF_TimeStruct_t xTimeStruct;
- time_t uxPreviousSeconds;
- time_t uxPreviousMS;
-
- time_t uxCurrentSeconds;
- time_t uxCurrentMS;
-
- const char *pcTimeUnit;
- int32_t ilDiff;
- TickType_t uxTravelTime;
-
- uxTravelTime = xTaskGetTickCount() - uxSendTime;
-
- /* Transform the contents of the fields from big to native endian. */
- prvSwapFields( pxPacket );
-
- uxCurrentSeconds = pxPacket->receiveTimestamp.seconds - TIME1970;
- uxCurrentMS = pxPacket->receiveTimestamp.fraction / 4294967;
- uxCurrentSeconds += uxCurrentMS / 1000;
- uxCurrentMS = uxCurrentMS % 1000;
-
- // Get the last time recorded
- uxPreviousSeconds = FreeRTOS_get_secs_msec( &uxPreviousMS );
-
- // Set the new time with precision in msec. */
- FreeRTOS_set_secs_msec( &uxCurrentSeconds, &uxCurrentMS );
-
- if( uxCurrentSeconds >= uxPreviousSeconds )
- {
- ilDiff = ( int32_t ) ( uxCurrentSeconds - uxPreviousSeconds );
- }
- else
- {
- ilDiff = 0 - ( int32_t ) ( uxPreviousSeconds - uxCurrentSeconds );
- }
-
- if( ( ilDiff < -5 ) || ( ilDiff > 5 ) )
- {
- /* More than 5 seconds difference. */
- pcTimeUnit = "sec";
- }
- else
- {
- /* Less than or equal to 5 second difference. */
- pcTimeUnit = "ms";
- uint32_t ulLowest = ( uxCurrentSeconds <= uxPreviousSeconds ) ? uxCurrentSeconds : uxPreviousSeconds;
- int32_t iCurMS = 1000 * ( uxCurrentSeconds - ulLowest ) + uxCurrentMS;
- int32_t iPrevMS = 1000 * ( uxPreviousSeconds - ulLowest ) + uxPreviousMS;
- ilDiff = iCurMS - iPrevMS;
- }
- uxCurrentSeconds -= iTimeZone;
-
- FreeRTOS_gmtime_r( &uxCurrentSeconds, &xTimeStruct );
-
- /*
- 378.067 [NTP client] NTP time: 9/11/2015 16:11:19.559 Diff -20 ms (289 ms)
- 379.441 [NTP client] NTP time: 9/11/2015 16:11:20.933 Diff 0 ms (263 ms)
- */
-
- FreeRTOS_printf( ("NTP time: %d/%d/%02d %2d:%02d:%02d.%03u Diff %d %s (%lu ms)\n",
- xTimeStruct.tm_mday,
- xTimeStruct.tm_mon + 1,
- xTimeStruct.tm_year + 1900,
- xTimeStruct.tm_hour,
- xTimeStruct.tm_min,
- xTimeStruct.tm_sec,
- ( unsigned )uxCurrentMS,
- ( unsigned )ilDiff,
- pcTimeUnit,
- uxTravelTime ) );
-
- /* Remove compiler warnings in case FreeRTOS_printf() is not used. */
- ( void ) pcTimeUnit;
- ( void ) uxTravelTime;
-}
-/*-----------------------------------------------------------*/
-
-#if( ipconfigUSE_CALLBACKS != 0 )
-
- static BaseType_t xOnUDPReceive( Socket_t xSocket, void * pvData, size_t xLength,
- const struct freertos_sockaddr *pxFrom, const struct freertos_sockaddr *pxDest )
- {
- if( xLength >= sizeof( xNTPPacket ) )
- {
- prvReadTime( ( struct SNtpPacket *)pvData );
- if( xStatus != EStatusPause )
- {
- xStatus = EStatusPause;
- }
- }
- vSignalTask();
- /* Tell the driver not to store the RX data */
- return 1;
- }
- /*-----------------------------------------------------------*/
-
-#endif /* ipconfigUSE_CALLBACKS != 0 */
-
-static void prvNTPTask( void *pvParameters )
-{
-BaseType_t xServerIndex = 3;
-struct freertos_sockaddr xAddress;
-#if( ipconfigUSE_CALLBACKS != 0 )
- F_TCP_UDP_Handler_t xHandler;
-#endif /* ipconfigUSE_CALLBACKS != 0 */
-
- xStatus = EStatusLookup;
- #if( ipconfigSOCKET_HAS_USER_SEMAPHORE != 0 ) || ( ipconfigUSE_CALLBACKS != 0 )
- {
- xNTPWakeupSem = xSemaphoreCreateBinary();
- }
- #endif
-
- #if( ipconfigUSE_CALLBACKS != 0 )
- {
- memset( &xHandler, '\0', sizeof( xHandler ) );
- xHandler.pxOnUDPReceive = xOnUDPReceive;
- FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_UDP_RECV_HANDLER, ( void * ) &xHandler, sizeof( xHandler ) );
- }
- #endif
- #if( ipconfigSOCKET_HAS_USER_SEMAPHORE != 0 )
- {
- FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_SET_SEMAPHORE, ( void * ) &xNTPWakeupSem, sizeof( xNTPWakeupSem ) );
- }
- #endif
- for( ; ; )
- {
- switch( xStatus )
- {
- case EStatusLookup:
- if( ( ulIPAddressFound == 0ul ) || ( ulIPAddressFound == ~0ul ) )
- {
- if( ++xServerIndex == sizeof( pcTimeServers ) / sizeof( pcTimeServers[ 0 ] ) )
- {
- xServerIndex = 0;
- }
- FreeRTOS_printf( ( "Looking up server '%s'\n", pcTimeServers[ xServerIndex ] ) );
- FreeRTOS_gethostbyname_a( pcTimeServers[ xServerIndex ], vDNS_callback, (void *)NULL, 1200 );
- }
- else
- {
- xStatus = EStatusAsking;
- }
- break;
-
- case EStatusAsking:
- {
- char pcBuf[16];
-
- prvNTPPacketInit( );
- xAddress.sin_addr = ulIPAddressFound;
- xAddress.sin_port = FreeRTOS_htons( NTP_PORT );
-
- FreeRTOS_inet_ntoa( xAddress.sin_addr, pcBuf );
- FreeRTOS_printf( ( "Sending UDP message to %s:%u\n",
- pcBuf,
- FreeRTOS_ntohs( xAddress.sin_port ) ) );
-
- uxSendTime = xTaskGetTickCount( );
- FreeRTOS_sendto( xUDPSocket, ( void * )&xNTPPacket, sizeof( xNTPPacket ), 0, &xAddress, sizeof( xAddress ) );
- }
- break;
-
- case EStatusPause:
- break;
-
- case EStatusFailed:
- break;
- }
-
- #if( ipconfigUSE_CALLBACKS != 0 )
- {
- xSemaphoreTake( xNTPWakeupSem, 5000 );
- }
- #else
- {
- uint32_t xAddressSize;
- BaseType_t xReturned;
-
- xAddressSize = sizeof( xAddress );
- xReturned = FreeRTOS_recvfrom( xUDPSocket, ( void * ) cRecvBuffer, sizeof( cRecvBuffer ), 0, &xAddress, &xAddressSize );
- switch( xReturned )
- {
- case 0:
- case -pdFREERTOS_ERRNO_EAGAIN:
- case -pdFREERTOS_ERRNO_EINTR:
- break;
- default:
- if( xReturned < sizeof( xNTPPacket ) )
- {
- FreeRTOS_printf( ( "FreeRTOS_recvfrom: returns %ld\n", xReturned ) );
- }
- else
- {
- prvReadTime( ( struct SNtpPacket *)cRecvBuffer );
- if( xStatus != EStatusPause )
- {
- xStatus = EStatusPause;
- }
- }
- break;
- }
- }
- #endif
- }
-}
-/*-----------------------------------------------------------*/
diff --git a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/include/FreeRTOS_FTP_commands.h b/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/include/FreeRTOS_FTP_commands.h
deleted file mode 100644
index 6ae2384..0000000
--- a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/include/FreeRTOS_FTP_commands.h
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * FreeRTOS+TCP V2.0.1
- * Copyright (C) 2017 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 __FTPCMD_H__
-
-#define __FTPCMD_H__
-
-#define REPL_110 "110 Restart marker reply.\r\n"
-#define REPL_120 "120 Try again in 2 minutes.\r\n"
-#define REPL_125 "125 Data connection already open; transfer starting.\r\n"
-#define REPL_150 "150 File status okay; about to open data connection.\r\n"
-#define REPL_200 "200 NOOP command successful.\r\n"
-#define REPL_200_PROGRESS "200 NOOP: data transfer in progress.\r\n"
-#define REPL_202 "202 Command not implemented, superfluous at this site.\r\n"
-#define REPL_211 "221 System status, or system help reply.\r\n"
-#define REPL_211_STATUS "221-status of %s.\r\n"
-#define REPL_211_END "221 End of status.\r\n"
-#define REPL_212 "212 Directory status.\r\n"
-#define REPL_213 "213 File status.\r\n"
-#define REPL_214 "214 Help message.\r\n"
-#define REPL_214_END "214 End Help message.\r\n"
-#define REPL_215 "215 %s system type.\r\n"
-#define REPL_220 "220 Service ready for new user.\r\n"
-#define REPL_221 "221 Service closing control connection.\r\n"
-#define REPL_225 "225 Data connection open; no transfer in progress.\r\n"
-#define REPL_226 "226 Closing data connection.\r\n"
-#define REPL_227 "227 Entering Passive Mode (%s,%s,%s,%s,%s,%s).\r\n"
-#define REPL_227_D "227 Entering Passive Mode (%u,%u,%u,%u,%u,%u).\r\n"
-#define REPL_230 "230 User logged in, proceed.\r\n"
-#define REPL_250 "250 Requested file action okay, completed.\r\n"
-#define REPL_257 "257 %s created.\r\n"
-// #define REPL_257_PWD "257 \"%s\" is current working dir.\r\n"
-#define REPL_257_PWD "257 \"%s\"\r\n"
-#define REPL_331 "331 Only anonymous user is accepted.\r\n"
-#define REPL_331_ANON "331 Anonymous login okay\r\n"
-#define REPL_332 "332 Need account for login.\r\n"
-#define REPL_350 "350 Requested file action pending further information.\r\n"
-#define REPL_421 "421 Service not available, closing control connection.\r\n"
-#define REPL_425 "425 Can't open data connection.\r\n"
-#define REPL_426 "426 Connection closed; transfer aborted.\r\n"
-#define REPL_450 "450 Requested file action not taken.\r\n"
-#define REPL_451 "451 Requested action aborted. Local error in processing.\r\n"
-#define REPL_452 "452 Requested action not taken.\r\n"
-#define REPL_500 "500 Syntax error, command unrecognized.\r\n"
-#define REPL_501 "501 Syntax error in parameters or arguments.\r\n"
-#define REPL_502 "502 Command not implemented.\r\n"
-#define REPL_503 "503 Bad sequence of commands.\r\n"
-#define REPL_504 "504 Command not implemented for that parameter.\r\n"
-#define REPL_530 "530 Not logged in.\r\n"
-#define REPL_532 "532 Need account for storing files.\r\n"
-#define REPL_550 "550 Requested action not taken.\r\n"
-#define REPL_551 "551 Requested action aborted. Page type unknown.\r\n"
-#define REPL_552 "552 Requested file action aborted.\r\n"
-#define REPL_553 "553 Requested action not taken.\r\n"
-#define REPL_553_READ_ONLY "553 Read-only file-system.\r\n"
-
-enum EFTPCommand {
- ECMD_USER,
- ECMD_PASS,
- ECMD_ACCT,
- ECMD_CWD,
- ECMD_CDUP,
- ECMD_SMNT,
- ECMD_QUIT,
- ECMD_REIN,
- ECMD_PORT,
- ECMD_PASV,
- ECMD_TYPE,
- ECMD_STRU,
- ECMD_MODE,
- ECMD_RETR,
- ECMD_STOR,
- ECMD_STOU,
- ECMD_APPE,
- ECMD_ALLO,
- ECMD_REST,
- ECMD_RNFR,
- ECMD_RNTO,
- ECMD_ABOR,
- ECMD_SIZE,
- ECMD_MDTM,
- ECMD_DELE,
- ECMD_RMD,
- ECMD_MKD,
- ECMD_PWD,
- ECMD_LIST,
- ECMD_NLST,
- ECMD_SITE,
- ECMD_SYST,
- ECMD_FEAT,
- ECMD_STAT,
- ECMD_HELP,
- ECMD_NOOP,
- ECMD_EMPTY,
- ECMD_CLOSE,
- ECMD_UNKNOWN,
-};
-
-typedef struct xFTP_COMMAND {
- BaseType_t xCommandLength;
- const char pcCommandName[7];
- const unsigned char ucCommandType;
- const unsigned char checkLogin;
- const unsigned char checkNullArg;
-} FTPCommand_t;
-
-#define FTP_CMD_COUNT (ECMD_UNKNOWN+1)
-
-extern const FTPCommand_t xFTPCommands[ FTP_CMD_COUNT ];
-
-#endif // __FTPCMD_H__
diff --git a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/include/FreeRTOS_HTTP_commands.h b/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/include/FreeRTOS_HTTP_commands.h
deleted file mode 100644
index 75eaf5d..0000000
--- a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/include/FreeRTOS_HTTP_commands.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * FreeRTOS+TCP V2.0.3
- * Copyright (C) 2017 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 FREERTOS_HTTP_COMMANDS_H
-#define FREERTOS_HTTP_COMMANDS_H
-
-enum {
- WEB_REPLY_OK = 200,
- WEB_NO_CONTENT = 204,
- WEB_BAD_REQUEST = 400,
- WEB_UNAUTHORIZED = 401,
- WEB_NOT_FOUND = 404,
- WEB_GONE = 410,
- WEB_PRECONDITION_FAILED = 412,
- WEB_INTERNAL_SERVER_ERROR = 500,
-};
-
-enum EWebCommand {
- ECMD_GET,
- ECMD_HEAD,
- ECMD_POST,
- ECMD_PUT,
- ECMD_DELETE,
- ECMD_TRACE,
- ECMD_OPTIONS,
- ECMD_CONNECT,
- ECMD_PATCH,
- ECMD_UNK,
-};
-
-struct xWEB_COMMAND
-{
- BaseType_t xCommandLength;
- const char *pcCommandName;
- const unsigned char ucCommandType;
-};
-
-#define WEB_CMD_COUNT (ECMD_UNK+1)
-
-extern const struct xWEB_COMMAND xWebCommands[WEB_CMD_COUNT];
-
-extern const char *webCodename (int aCode);
-
-#endif /* FREERTOS_HTTP_COMMANDS_H */
-
-
diff --git a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/include/FreeRTOS_TCP_server.h b/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/include/FreeRTOS_TCP_server.h
deleted file mode 100644
index d8140ce..0000000
--- a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/include/FreeRTOS_TCP_server.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * FreeRTOS+TCP V2.0.3
- * Copyright (C) 2017 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
- */
-
-/*
- Some code which is common to TCP servers like HTTP en FTP
-*/
-
-#ifndef FREERTOS_TCP_SERVER_H
-#define FREERTOS_TCP_SERVER_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef FTP_SERVER_USES_RELATIVE_DIRECTORY
- #define FTP_SERVER_USES_RELATIVE_DIRECTORY 0
-#endif
-
-enum eSERVER_TYPE
-{
- eSERVER_NONE,
- eSERVER_HTTP,
- eSERVER_FTP,
-};
-
-struct xFTP_CLIENT;
-
-#if( ipconfigFTP_HAS_RECEIVED_HOOK != 0 )
- extern void vApplicationFTPReceivedHook( const char *pcFileName, uint32_t ulSize, struct xFTP_CLIENT *pxFTPClient );
- extern void vFTPReplyMessage( struct xFTP_CLIENT *pxFTPClient, const char *pcMessage );
-#endif /* ipconfigFTP_HAS_RECEIVED_HOOK != 0 */
-
-#if( ipconfigFTP_HAS_USER_PASSWORD_HOOK != 0 )
- /*
- * Function is called when a user name has been submitted.
- * The function may return a string such as: "331 Please enter your password"
- * or return NULL to use the default reply.
- */
- extern const char *pcApplicationFTPUserHook( const char *pcUserName );
-#endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK */
-
-#if( ipconfigFTP_HAS_USER_PASSWORD_HOOK != 0 )
- /*
- * Function is called when a password was received.
- * Return positive value to allow the user
- */
- extern BaseType_t xApplicationFTPPasswordHook( const char *pcUserName, const char *pcPassword );
-#endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK */
-
-#if( ipconfigFTP_HAS_USER_PROPERTIES_HOOK != 0 )
- /*
- * The FTP server is asking for user-specific properties
- */
- typedef struct
- {
- uint16_t usPortNumber; /* For reference only. Host-endian. */
- const char *pcRootDir;
- BaseType_t xReadOnly;
- }
- FTPUserProperties_t;
- extern void vApplicationFTPUserPropertiesHook( const char *pcUserName, FTPUserProperties_t *pxProperties );
-#endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK */
-
-#if( ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK != 0 )
- /*
- * A GET request is received containing a special character,
- * usually a question mark.
- * const char *pcURLData; // A request, e.g. "/request?limit=75"
- * char *pcBuffer; // Here the answer can be written
- * size_t uxBufferLength; // Size of the buffer
- *
- */
- extern size_t uxApplicationHTTPHandleRequestHook( const char *pcURLData, char *pcBuffer, size_t uxBufferLength );
-#endif /* ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK */
-
-struct xSERVER_CONFIG
-{
- enum eSERVER_TYPE eType; /* eSERVER_HTTP | eSERVER_FTP */
- BaseType_t xPortNumber; /* e.g. 80, 8080, 21 */
- BaseType_t xBackLog; /* e.g. 10, maximum number of connected TCP clients */
- const char * const pcRootDir; /* Treat this directory as the root directory */
-};
-
-struct xTCP_SERVER;
-typedef struct xTCP_SERVER TCPServer_t;
-
-TCPServer_t *FreeRTOS_CreateTCPServer( const struct xSERVER_CONFIG *pxConfigs, BaseType_t xCount );
-void FreeRTOS_TCPServerWork( TCPServer_t *pxServer, TickType_t xBlockingTime );
-
-#if( ipconfigSUPPORT_SIGNALS != 0 )
- /* FreeRTOS_TCPServerWork() calls select().
- The two functions below provide a possibility to interrupt
- the call to select(). After the interruption, resume
- by calling FreeRTOS_TCPServerWork() again. */
- BaseType_t FreeRTOS_TCPServerSignal( TCPServer_t *pxServer );
- BaseType_t FreeRTOS_TCPServerSignalFromISR( TCPServer_t *pxServer, BaseType_t *pxHigherPriorityTaskWoken );
-#endif
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* FREERTOS_TCP_SERVER_H */
diff --git a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/include/FreeRTOS_server_private.h b/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/include/FreeRTOS_server_private.h
deleted file mode 100644
index 7376804..0000000
--- a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/include/FreeRTOS_server_private.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * FreeRTOS+TCP V2.0.3
- * Copyright (C) 2017 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
- */
-
- /*
- Some code which is common to TCP servers like HTTP and FTP
-*/
-
-#ifndef FREERTOS_SERVER_PRIVATE_H
-#define FREERTOS_SERVER_PRIVATE_H
-
-#define FREERTOS_NO_SOCKET NULL
-
-/* FreeRTOS+FAT */
-#include "ff_stdio.h"
-
-/* Each HTTP server has 1, at most 2 sockets */
-#define HTTP_SOCKET_COUNT 2
-
-/*
- * ipconfigTCP_COMMAND_BUFFER_SIZE sets the size of:
- * pcCommandBuffer': a buffer to receive and send TCP commands
- *
- * ipconfigTCP_FILE_BUFFER_SIZE sets the size of:
- * pcFileBuffer' : a buffer to access the file system: read or write data.
- *
- * The buffers are both used for FTP as well as HTTP.
- */
-
-#ifndef ipconfigTCP_COMMAND_BUFFER_SIZE
- #define ipconfigTCP_COMMAND_BUFFER_SIZE ( 2048 )
-#endif
-
-#ifndef ipconfigTCP_FILE_BUFFER_SIZE
- #define ipconfigTCP_FILE_BUFFER_SIZE ( 2048 )
-#endif
-
-struct xTCP_CLIENT;
-
-typedef BaseType_t ( * FTCPWorkFunction ) ( struct xTCP_CLIENT * /* pxClient */ );
-typedef void ( * FTCPDeleteFunction ) ( struct xTCP_CLIENT * /* pxClient */ );
-
-#define TCP_CLIENT_FIELDS \
- enum eSERVER_TYPE eType; \
- struct xTCP_SERVER *pxParent; \
- Socket_t xSocket; \
- const char *pcRootDir; \
- FTCPWorkFunction fWorkFunction; \
- FTCPDeleteFunction fDeleteFunction; \
- struct xTCP_CLIENT *pxNextClient
-
-typedef struct xTCP_CLIENT
-{
- /* This define contains fields which must come first within each of the client structs */
- TCP_CLIENT_FIELDS;
- /* --- Keep at the top --- */
-
-} TCPClient_t;
-
-struct xHTTP_CLIENT
-{
- /* This define contains fields which must come first within each of the client structs */
- TCP_CLIENT_FIELDS;
- /* --- Keep at the top --- */
-
- const char *pcUrlData;
- const char *pcRestData;
- char pcCurrentFilename[ ffconfigMAX_FILENAME ];
- size_t uxBytesLeft;
- FF_FILE *pxFileHandle;
- union {
- struct {
- uint32_t
- bReplySent : 1;
- };
- uint32_t ulFlags;
- } bits;
-};
-
-typedef struct xHTTP_CLIENT HTTPClient_t;
-
-struct xFTP_CLIENT
-{
- /* This define contains fields which must come first within each of the client structs */
- TCP_CLIENT_FIELDS;
- /* --- Keep at the top --- */
-
- uint32_t ulRestartOffset;
- uint32_t ulRecvBytes;
- size_t uxBytesLeft; /* Bytes left to send */
- uint32_t ulClientIP;
- TickType_t xStartTime;
- uint16_t usClientPort;
- Socket_t xTransferSocket;
- BaseType_t xTransType;
- BaseType_t xDirCount;
- FF_FindData_t xFindData;
- FF_FILE *pxReadHandle;
- FF_FILE *pxWriteHandle;
- char pcCurrentDir[ ffconfigMAX_FILENAME ];
- char pcFileName[ ffconfigMAX_FILENAME ];
- char pcConnectionAck[ 128 ];
- char pcClientAck[ 128 ];
- union {
- struct {
- uint32_t
- bHelloSent : 1,
- bLoggedIn : 1,
- bStatusUser : 1,
- bInRename : 1,
- bReadOnly : 1;
- };
- uint32_t ulFTPFlags;
- } bits;
- union {
- struct {
- uint32_t
- bIsListen : 1, /* pdTRUE for passive data connections (using list()). */
- bDirHasEntry : 1, /* pdTRUE if ff_findfirst() was successful. */
- bClientConnected : 1, /* pdTRUE after connect() or accept() has succeeded. */
- bEmptyFile : 1, /* pdTRUE if a connection-without-data was received. */
- bHadError : 1; /* pdTRUE if a transfer got aborted because of an error. */
- };
- uint32_t ulConnFlags;
- } bits1;
-};
-
-typedef struct xFTP_CLIENT FTPClient_t;
-
-BaseType_t xHTTPClientWork( TCPClient_t *pxClient );
-BaseType_t xFTPClientWork( TCPClient_t *pxClient );
-
-void vHTTPClientDelete( TCPClient_t *pxClient );
-void vFTPClientDelete( TCPClient_t *pxClient );
-
-BaseType_t xMakeAbsolute( struct xFTP_CLIENT *pxClient, char *pcBuffer, BaseType_t xBufferLength, const char *pcFileName );
-BaseType_t xMakeRelative( FTPClient_t *pxClient, char *pcBuffer, BaseType_t xBufferLength, const char *pcFileName );
-
-struct xTCP_SERVER
-{
- SocketSet_t xSocketSet;
- /* A buffer to receive and send TCP commands, either HTTP of FTP. */
- char pcCommandBuffer[ ipconfigTCP_COMMAND_BUFFER_SIZE ];
- /* A buffer to access the file system: read or write data. */
- char pcFileBuffer[ ipconfigTCP_FILE_BUFFER_SIZE ];
-
- #if( ipconfigUSE_FTP != 0 )
- char pcNewDir[ ffconfigMAX_FILENAME ];
- #endif
- #if( ipconfigUSE_HTTP != 0 )
- char pcContentsType[40]; /* Space for the msg: "text/javascript" */
- char pcExtraContents[40]; /* Space for the msg: "Content-Length: 346500" */
- #endif
- BaseType_t xServerCount;
- TCPClient_t *pxClients;
- struct xSERVER
- {
- enum eSERVER_TYPE eType; /* eSERVER_HTTP | eSERVER_FTP */
- const char *pcRootDir;
- Socket_t xSocket;
- } xServers[ 1 ];
-};
-
-#endif /* FREERTOS_SERVER_PRIVATE_H */
diff --git a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/include/NTPClient.h b/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/include/NTPClient.h
deleted file mode 100644
index 813539e..0000000
--- a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/include/NTPClient.h
+++ /dev/null
@@ -1,71 +0,0 @@
-//
-// ntpClient.h
-//
-
-#ifndef __NTPCLIENT_H__
-
-#define __NTPCLIENT_H__
-
-#define NTP_PORT 123
-
-typedef uint32_t quint32;
-typedef int32_t qint32;
-typedef uint8_t quint8;
-typedef int8_t qint8;
-
-typedef union _SNtpFlags SNtpFlags;
-
-/**
- * 64-bit NTP timestamp.
- */
-struct __attribute__ ((__packed__)) _SNtpTimestamp {
- /** Number of seconds passed since Jan 1 1900, in big-endian format. */
- quint32 seconds;
-
- /** Fractional time part, in <tt>1/0xFFFFFFFF</tt>s of a second. */
- quint32 fraction;
-};
-
-typedef struct _SNtpTimestamp SNtpTimestamp;
-/**
- * Mandatory part of an NTP packet
- */
-struct SNtpPacket {
- /** Flags. */
- unsigned char flags; // value 0xDB : mode 3 (client), version 3, leap indicator unknown 3
-
- /** Stratum of the clock. */
- quint8 stratum; // value 0 : unspecified
-
- /** Maximum interval between successive messages, in log2 seconds. Note that the value is signed. */
- qint8 poll; // 10 means 1 << 10 = 1024 seconds
-
- /** Precision of the clock, in log2 seconds. Note that the value is signed. */
- qint8 precision; // 0xFA = 250 = 0.015625 seconds
-
- /** Round trip time to the primary reference source, in NTP short format. */
- qint32 rootDelay; // 0x5D2E = 23854 or (23854/65535)= 0.3640 sec
-
- /** Nominal error relative to the primary reference source. */
- qint32 rootDispersion; // 0x0008 CAC8 = 8.7912 seconds
-
- /** Reference identifier (either a 4 character string or an IP address). */
- qint8 referenceID[4]; // or just 0000
-
- /** The time at which the clock was last set or corrected. */
- SNtpTimestamp referenceTimestamp; // Current time
-
- /** The time at which the request departed the client for the server. */
- SNtpTimestamp originateTimestamp; // Keep 0
-
- /** The time at which the request arrived at the server. */
- SNtpTimestamp receiveTimestamp; // Keep 0
-
- /** The time at which the reply departed the server for client. */
- SNtpTimestamp transmitTimestamp;
-};
-
-/* Add this number to get secs since 1-1-1900 */
-#define TIME1970 2208988800UL
-
-#endif // __NTPCLIENT_H__
diff --git a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/include/NTPDemo.h b/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/include/NTPDemo.h
deleted file mode 100644
index e75fb76..0000000
--- a/FreeRTOS-Labs/Demo/Common/Demo_IP_Protocols/include/NTPDemo.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * A simple demo for NTP using FreeRTOS+TCP
- */
-
-#ifndef NTPDEMO_H
-
-#define NTPDEMO_H
-
-void vStartNTPTask( uint16_t usTaskStackSize, UBaseType_t uxTaskPriority );
-
-#endif
\ No newline at end of file
diff --git a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/File-related-CLI-commands.c b/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/File-related-CLI-commands.c
deleted file mode 100644
index ca89864..0000000
--- a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/File-related-CLI-commands.c
+++ /dev/null
@@ -1,669 +0,0 @@
-/*
- FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
- All rights reserved
-
- VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
-
- This file is part of the FreeRTOS distribution.
-
- FreeRTOS is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License (version 2) as published by the
- Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
-
- ***************************************************************************
- >>! NOTE: The modification to the GPL is included to allow you to !<<
- >>! distribute a combined work that includes FreeRTOS without being !<<
- >>! obliged to provide the source code for proprietary components !<<
- >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
-
- FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. Full license text is available on the following
- link: http://www.freertos.org/a00114.html
-
- ***************************************************************************
- * *
- * FreeRTOS provides completely free yet professionally developed, *
- * robust, strictly quality controlled, supported, and cross *
- * platform software that is more than just the market leader, it *
- * is the industry's de facto standard. *
- * *
- * Help yourself get started quickly while simultaneously helping *
- * to support the FreeRTOS project by purchasing a FreeRTOS *
- * tutorial book, reference manual, or both: *
- * http://www.FreeRTOS.org/Documentation *
- * *
- ***************************************************************************
-
- http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
- the FAQ page "My application does not run, what could be wrong?". Have you
- defined configASSERT()?
-
- http://www.FreeRTOS.org/support - In return for receiving this top quality
- embedded software for free we request you assist our global community by
- participating in the support forum.
-
- http://www.FreeRTOS.org/training - Investing in training allows your team to
- be as productive as possible as early as possible. Now you can receive
- FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
- Ltd, and the world's leading authority on the world's leading RTOS.
-
- http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
- including FreeRTOS+Trace - an indispensable productivity tool, a DOS
- compatible FAT file system, and our tiny thread aware UDP/IP stack.
-
- http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
- Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
-
- http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
- Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
- licenses offer ticketed support, indemnification and commercial middleware.
-
- http://www.SafeRTOS.com - High Integrity Systems also provide a safety
- engineered and independently SIL3 certified version for use in safety and
- mission critical applications that require provable dependability.
-
- 1 tab == 4 spaces!
-*/
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-#include "task.h"
-
-/* Standard includes. */
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-/* FreeRTOS+CLI includes. */
-#include "FreeRTOS_CLI.h"
-
-/* FreeRTOS+FAT includes. */
-#include "ff_headers.h"
-#include "ff_stdio.h"
-
-#define cliNEW_LINE "\r\n"
-
-/*******************************************************************************
- * See the URL in the comments within main.c for the location of the online
- * documentation.
- ******************************************************************************/
-
-/*
- * Print out information on a single file.
- */
-static void prvCreateFileInfoString( char *pcBuffer, FF_FindData_t *pxFindStruct );
-
-/*
- * Copies an existing file into a newly created file.
- */
-static BaseType_t prvPerformCopy( const char *pcSourceFile,
- int32_t lSourceFileLength,
- const char *pcDestinationFile,
- char *pxWriteBuffer,
- size_t xWriteBufferLen );
-
-/*
- * Implements the DIR command.
- */
-static BaseType_t prvDIRCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
-
-/*
- * Implements the CD command.
- */
-static BaseType_t prvCDCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
-
-/*
- * Implements the DEL command.
- */
-static BaseType_t prvDELCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
-
-/*
- * Implements the DEL command.
- */
-static BaseType_t prvRMDIRCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
-
-/*
- * Implements the TYPE command.
- */
-static BaseType_t prvTYPECommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
-
-/*
- * Implements the COPY command.
- */
-static BaseType_t prvCOPYCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
-
-/*
- * Implements the PWD (print working directory) command.
- */
-static BaseType_t prvPWDCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
-
-/* Structure that defines the DIR command line command, which lists all the
-files in the current directory. */
-static const CLI_Command_Definition_t xDIR =
-{
- "dir", /* The command string to type. */
- "\r\ndir:\r\n Lists the files in the current directory\r\n",
- prvDIRCommand, /* The function to run. */
- 0 /* No parameters are expected. */
-};
-
-/* Structure that defines the CD command line command, which changes the
-working directory. */
-static const CLI_Command_Definition_t xCD =
-{
- "cd", /* The command string to type. */
- "\r\ncd <dir name>:\r\n Changes the working directory\r\n",
- prvCDCommand, /* The function to run. */
- 1 /* One parameter is expected. */
-};
-
-/* Structure that defines the TYPE command line command, which prints the
-contents of a file to the console. */
-static const CLI_Command_Definition_t xTYPE =
-{
- "type", /* The command string to type. */
- "\r\ntype <filename>:\r\n Prints file contents to the terminal\r\n",
- prvTYPECommand, /* The function to run. */
- 1 /* One parameter is expected. */
-};
-
-/* Structure that defines the DEL command line command, which deletes a file. */
-static const CLI_Command_Definition_t xDEL =
-{
- "del", /* The command string to type. */
- "\r\ndel <filename>:\r\n deletes a file (use rmdir to delete a directory)\r\n",
- prvDELCommand, /* The function to run. */
- 1 /* One parameter is expected. */
-};
-
-/* Structure that defines the RMDIR command line command, which deletes a directory. */
-static const CLI_Command_Definition_t xRMDIR =
-{
- "rmdir", /* The command string to type. */
- "\r\nrmdir <directory name>:\r\n deletes a directory\r\n",
- prvRMDIRCommand, /* The function to run. */
- 1 /* One parameter is expected. */
-};
-
-/* Structure that defines the COPY command line command, which deletes a file. */
-static const CLI_Command_Definition_t xCOPY =
-{
- "copy", /* The command string to type. */
- "\r\ncopy <source file> <dest file>:\r\n Copies <source file> to <dest file>\r\n",
- prvCOPYCommand, /* The function to run. */
- 2 /* Two parameters are expected. */
-};
-
-/* Structure that defines the pwd command line command, which prints the current working directory. */
-static const CLI_Command_Definition_t xPWD =
-{
- "pwd", /* The command string to type. */
- "\r\npwd:\r\n Print Working Directory\r\n",
- prvPWDCommand, /* The function to run. */
- 0 /* No parameters are expected. */
-};
-
-/*-----------------------------------------------------------*/
-
-void vRegisterFileSystemCLICommands( void )
-{
- /* Register all the command line commands defined immediately above. */
- FreeRTOS_CLIRegisterCommand( &xDIR );
- FreeRTOS_CLIRegisterCommand( &xCD );
- FreeRTOS_CLIRegisterCommand( &xTYPE );
- FreeRTOS_CLIRegisterCommand( &xDEL );
- FreeRTOS_CLIRegisterCommand( &xRMDIR );
- FreeRTOS_CLIRegisterCommand( &xCOPY );
- FreeRTOS_CLIRegisterCommand( &xPWD );
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvTYPECommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
-{
-const char *pcParameter;
-BaseType_t xParameterStringLength, xReturn = pdTRUE;
-static FF_FILE *pxFile = NULL;
-int iChar;
-size_t xByte;
-size_t xColumns = 50U;
-
- /* Ensure there is always a null terminator after each character written. */
- memset( pcWriteBuffer, 0x00, xWriteBufferLen );
-
- /* Ensure the buffer leaves space for the \r\n. */
- configASSERT( xWriteBufferLen > ( strlen( cliNEW_LINE ) * 2 ) );
- xWriteBufferLen -= strlen( cliNEW_LINE );
-
- if( xWriteBufferLen < xColumns )
- {
- /* Ensure the loop that uses xColumns as an end condition does not
- write off the end of the buffer. */
- xColumns = xWriteBufferLen;
- }
-
- if( pxFile == NULL )
- {
- /* The file has not been opened yet. Find the file name. */
- pcParameter = FreeRTOS_CLIGetParameter
- (
- pcCommandString, /* The command string itself. */
- 1, /* Return the first parameter. */
- &xParameterStringLength /* Store the parameter string length. */
- );
-
- /* Sanity check something was returned. */
- configASSERT( pcParameter );
-
- /* Attempt to open the requested file. */
- pxFile = ff_fopen( pcParameter, "r" );
- }
-
- if( pxFile != NULL )
- {
- /* Read the next chunk of data from the file. */
- for( xByte = 0; xByte < xColumns; xByte++ )
- {
- iChar = ff_fgetc( pxFile );
-
- if( iChar == -1 )
- {
- /* No more characters to return. */
- ff_fclose( pxFile );
- pxFile = NULL;
- break;
- }
- else
- {
- pcWriteBuffer[ xByte ] = ( char ) iChar;
- }
- }
- }
-
- if( pxFile == NULL )
- {
- /* Either the file was not opened, or all the data from the file has
- been returned and the file is now closed. */
- xReturn = pdFALSE;
- }
-
- strcat( pcWriteBuffer, cliNEW_LINE );
-
- return xReturn;
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvCDCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
-{
-const char *pcParameter;
-BaseType_t xParameterStringLength;
-int iReturned;
-size_t xStringLength;
-
- /* Obtain the parameter string. */
- pcParameter = FreeRTOS_CLIGetParameter
- (
- pcCommandString, /* The command string itself. */
- 1, /* Return the first parameter. */
- &xParameterStringLength /* Store the parameter string length. */
- );
-
- /* Sanity check something was returned. */
- configASSERT( pcParameter );
-
- /* Attempt to move to the requested directory. */
- iReturned = ff_chdir( pcParameter );
-
- if( iReturned == FF_ERR_NONE )
- {
- sprintf( pcWriteBuffer, "In: " );
- xStringLength = strlen( pcWriteBuffer );
- ff_getcwd( &( pcWriteBuffer[ xStringLength ] ), ( unsigned char ) ( xWriteBufferLen - xStringLength ) );
- }
- else
- {
- sprintf( pcWriteBuffer, "Error" );
- }
-
- strcat( pcWriteBuffer, cliNEW_LINE );
-
- return pdFALSE;
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvDIRCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
-{
-static FF_FindData_t *pxFindStruct = NULL;
-int iReturned;
-BaseType_t xReturn = pdFALSE;
-
- /* This assumes pcWriteBuffer is long enough. */
- ( void ) pcCommandString;
-
- /* Ensure the buffer leaves space for the \r\n. */
- configASSERT( xWriteBufferLen > ( strlen( cliNEW_LINE ) * 2 ) );
- xWriteBufferLen -= strlen( cliNEW_LINE );
-
- if( pxFindStruct == NULL )
- {
- /* This is the first time this function has been executed since the Dir
- command was run. Create the find structure. */
- pxFindStruct = ( FF_FindData_t * ) pvPortMalloc( sizeof( FF_FindData_t ) );
-
- if( pxFindStruct != NULL )
- {
- memset( pxFindStruct, 0x00, sizeof( FF_FindData_t ) );
- iReturned = ff_findfirst( "", pxFindStruct );
-
- if( iReturned == FF_ERR_NONE )
- {
- prvCreateFileInfoString( pcWriteBuffer, pxFindStruct );
- xReturn = pdPASS;
- }
- else
- {
- snprintf( pcWriteBuffer, xWriteBufferLen, "Error: ff_findfirst() failed." );
- pxFindStruct = NULL;
- }
- }
- else
- {
- snprintf( pcWriteBuffer, xWriteBufferLen, "Failed to allocate RAM (using heap_4.c will prevent fragmentation)." );
- }
- }
- else
- {
- /* The find struct has already been created. Find the next file in
- the directory. */
- iReturned = ff_findnext( pxFindStruct );
-
- if( iReturned == FF_ERR_NONE )
- {
- prvCreateFileInfoString( pcWriteBuffer, pxFindStruct );
- xReturn = pdPASS;
- }
- else
- {
- vPortFree( pxFindStruct );
- pxFindStruct = NULL;
-
- /* No string to return. */
- pcWriteBuffer[ 0 ] = 0x00;
- }
- }
-
- strcat( pcWriteBuffer, cliNEW_LINE );
-
- return xReturn;
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvRMDIRCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
-{
-const char *pcParameter;
-BaseType_t xParameterStringLength;
-int iReturned;
-
- /* This function assumes xWriteBufferLen is large enough! */
- ( void ) xWriteBufferLen;
-
- /* Obtain the parameter string. */
- pcParameter = FreeRTOS_CLIGetParameter
- (
- pcCommandString, /* The command string itself. */
- 1, /* Return the first parameter. */
- &xParameterStringLength /* Store the parameter string length. */
- );
-
- /* Sanity check something was returned. */
- configASSERT( pcParameter );
-
- /* Attempt to delete the directory. */
- iReturned = ff_rmdir( pcParameter );
-
- if( iReturned == FF_ERR_NONE )
- {
- sprintf( pcWriteBuffer, "%s was deleted", pcParameter );
- }
- else
- {
- sprintf( pcWriteBuffer, "Error. %s was not deleted", pcParameter );
- }
-
- strcat( pcWriteBuffer, cliNEW_LINE );
-
- return pdFALSE;
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvDELCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
-{
-const char *pcParameter;
-BaseType_t xParameterStringLength;
-int iReturned;
-
- /* This function assumes xWriteBufferLen is large enough! */
- ( void ) xWriteBufferLen;
-
- /* Obtain the parameter string. */
- pcParameter = FreeRTOS_CLIGetParameter
- (
- pcCommandString, /* The command string itself. */
- 1, /* Return the first parameter. */
- &xParameterStringLength /* Store the parameter string length. */
- );
-
- /* Sanity check something was returned. */
- configASSERT( pcParameter );
-
- /* Attempt to delete the file. */
- iReturned = ff_remove( pcParameter );
-
- if( iReturned == FF_ERR_NONE )
- {
- sprintf( pcWriteBuffer, "%s was deleted", pcParameter );
- }
- else
- {
- sprintf( pcWriteBuffer, "Error. %s was not deleted", pcParameter );
- }
-
- strcat( pcWriteBuffer, cliNEW_LINE );
-
- return pdFALSE;
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvCOPYCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
-{
-char *pcSourceFile;
-const char *pcDestinationFile;
-BaseType_t xParameterStringLength;
-long lSourceLength, lDestinationLength = 0;
-FF_Stat_t xStat;
-
- /* Obtain the name of the destination file. */
- pcDestinationFile = FreeRTOS_CLIGetParameter
- (
- pcCommandString, /* The command string itself. */
- 2, /* Return the second parameter. */
- &xParameterStringLength /* Store the parameter string length. */
- );
-
- /* Sanity check something was returned. */
- configASSERT( pcDestinationFile );
-
- /* Obtain the name of the source file. */
- pcSourceFile = ( char * ) FreeRTOS_CLIGetParameter
- (
- pcCommandString, /* The command string itself. */
- 1, /* Return the first parameter. */
- &xParameterStringLength /* Store the parameter string length. */
- );
-
- /* Sanity check something was returned. */
- configASSERT( pcSourceFile );
-
- /* Terminate the string. */
- pcSourceFile[ xParameterStringLength ] = 0x00;
-
- /* See if the source file exists, obtain its length if it does. */
- if( ff_stat( pcSourceFile, &xStat ) == FF_ERR_NONE )
- {
- lSourceLength = xStat.st_size;
- }
- else
- {
- lSourceLength = 0;
- }
-
- if( lSourceLength == 0 )
- {
- sprintf( pcWriteBuffer, "Source file does not exist" );
- }
- else
- {
- /* See if the destination file exists. */
- if( ff_stat( pcDestinationFile, &xStat ) == FF_ERR_NONE )
- {
- lDestinationLength = xStat.st_size;
- }
- else
- {
- lDestinationLength = 0;
- }
-
- if( xStat.st_mode == FF_IFDIR )
- {
- sprintf( pcWriteBuffer, "Error: Destination is a directory not a file" );
-
- /* Set lDestinationLength to a non-zero value just to prevent an
- attempt to copy the file. */
- lDestinationLength = 1;
- }
- else if( lDestinationLength != 0 )
- {
- sprintf( pcWriteBuffer, "Error: Destination file already exists" );
- }
- }
-
- /* Continue only if the source file exists and the destination file does
- not exist. */
- if( ( lSourceLength != 0 ) && ( lDestinationLength == 0 ) )
- {
- if( prvPerformCopy( pcSourceFile, lSourceLength, pcDestinationFile, pcWriteBuffer, xWriteBufferLen ) == pdPASS )
- {
- sprintf( pcWriteBuffer, "Copy made" );
- }
- else
- {
- sprintf( pcWriteBuffer, "Error during copy" );
- }
- }
-
- strcat( pcWriteBuffer, cliNEW_LINE );
-
- return pdFALSE;
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvPWDCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
-{
- ( void ) pcCommandString;
-
- /* Copy the current working directory into the output buffer. */
- ff_getcwd( pcWriteBuffer, xWriteBufferLen );
- return pdFALSE;
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvPerformCopy( const char *pcSourceFile,
- int32_t lSourceFileLength,
- const char *pcDestinationFile,
- char *pxWriteBuffer,
- size_t xWriteBufferLen )
-{
-int32_t lBytesRead = 0, lBytesToRead, lBytesRemaining;
-FF_FILE *pxSourceFile, *pxDestinationFile;
-BaseType_t xReturn = pdPASS;
-
- /* NOTE: Error handling has been omitted for clarity. */
-
- pxSourceFile = ff_fopen( pcSourceFile, "r" );
- pxDestinationFile = ff_fopen( pcDestinationFile, "a" );
-
- if( ( pxSourceFile != NULL ) && ( pxDestinationFile != NULL ) )
- {
- while( lBytesRead < lSourceFileLength )
- {
- /* How many bytes are left? */
- lBytesRemaining = lSourceFileLength - lBytesRead;
-
- /* How many bytes should be read this time around the loop. Can't
- read more bytes than will fit into the buffer. */
- if( lBytesRemaining > ( long ) xWriteBufferLen )
- {
- lBytesToRead = ( long ) xWriteBufferLen;
- }
- else
- {
- lBytesToRead = lBytesRemaining;
- }
-
- ff_fread( pxWriteBuffer, lBytesToRead, 1, pxSourceFile );
- ff_fwrite( pxWriteBuffer, lBytesToRead, 1, pxDestinationFile );
-
- lBytesRead += lBytesToRead;
- }
- }
-
- if( pxSourceFile != NULL )
- {
- ff_fclose( pxSourceFile );
- }
-
- if( pxSourceFile != NULL )
- {
- ff_fclose( pxDestinationFile );
- }
-
- if( lBytesRead == lSourceFileLength )
- {
- xReturn = pdPASS;
- }
- else
- {
- xReturn = pdFAIL;
- }
-
- return xReturn;
-}
-/*-----------------------------------------------------------*/
-
-static void prvCreateFileInfoString( char *pcBuffer, FF_FindData_t *pxFindStruct )
-{
-const char * pcWritableFile = "writable file", *pcReadOnlyFile = "read only file", *pcDirectory = "directory";
-const char * pcAttrib;
-
- /* Point pcAttrib to a string that describes the file. */
- if( ( pxFindStruct->ucAttributes & FF_FAT_ATTR_DIR ) != 0 )
- {
- pcAttrib = pcDirectory;
- }
- else if( pxFindStruct->ucAttributes & FF_FAT_ATTR_READONLY )
- {
- pcAttrib = pcReadOnlyFile;
- }
- else
- {
- pcAttrib = pcWritableFile;
- }
-
- /* Create a string that includes the file name, the file size and the
- attributes string. */
- sprintf( pcBuffer, "%s [%s] [size=%d]", pxFindStruct->pcFileName, pcAttrib, ( int ) pxFindStruct->ulFileSize );
-}
-
-
-
diff --git a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/Sample-CLI-commands.c b/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/Sample-CLI-commands.c
deleted file mode 100644
index 3b9728e..0000000
--- a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/Sample-CLI-commands.c
+++ /dev/null
@@ -1,518 +0,0 @@
-/*
- FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
- All rights reserved
-
- VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
-
- This file is part of the FreeRTOS distribution.
-
- FreeRTOS is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License (version 2) as published by the
- Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
-
- ***************************************************************************
- >>! NOTE: The modification to the GPL is included to allow you to !<<
- >>! distribute a combined work that includes FreeRTOS without being !<<
- >>! obliged to provide the source code for proprietary components !<<
- >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
-
- FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. Full license text is available on the following
- link: http://www.freertos.org/a00114.html
-
- ***************************************************************************
- * *
- * FreeRTOS provides completely free yet professionally developed, *
- * robust, strictly quality controlled, supported, and cross *
- * platform software that is more than just the market leader, it *
- * is the industry's de facto standard. *
- * *
- * Help yourself get started quickly while simultaneously helping *
- * to support the FreeRTOS project by purchasing a FreeRTOS *
- * tutorial book, reference manual, or both: *
- * http://www.FreeRTOS.org/Documentation *
- * *
- ***************************************************************************
-
- http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
- the FAQ page "My application does not run, what could be wrong?". Have you
- defined configASSERT()?
-
- http://www.FreeRTOS.org/support - In return for receiving this top quality
- embedded software for free we request you assist our global community by
- participating in the support forum.
-
- http://www.FreeRTOS.org/training - Investing in training allows your team to
- be as productive as possible as early as possible. Now you can receive
- FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
- Ltd, and the world's leading authority on the world's leading RTOS.
-
- http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
- including FreeRTOS+Trace - an indispensable productivity tool, a DOS
- compatible FAT file system, and our tiny thread aware UDP/IP stack.
-
- http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
- Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
-
- http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
- Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
- licenses offer ticketed support, indemnification and commercial middleware.
-
- http://www.SafeRTOS.com - High Integrity Systems also provide a safety
- engineered and independently SIL3 certified version for use in safety and
- mission critical applications that require provable dependability.
-
- 1 tab == 4 spaces!
-*/
-
-
- /******************************************************************************
- *
- * See the following URL for information on the commands defined in this file:
- * http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/Embedded_Ethernet_Examples/Ethernet_Related_CLI_Commands.shtml
- *
- ******************************************************************************/
-
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-#include "task.h"
-
-/* Standard includes. */
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-/* FreeRTOS+CLI includes. */
-#include "FreeRTOS_CLI.h"
-
-#ifndef configINCLUDE_TRACE_RELATED_CLI_COMMANDS
- #define configINCLUDE_TRACE_RELATED_CLI_COMMANDS 0
-#endif
-
-#ifndef configINCLUDE_QUERY_HEAP_COMMAND
- #define configINCLUDE_QUERY_HEAP_COMMAND 0
-#endif
-
-/*
- * The function that registers the commands that are defined within this file.
- */
-void vRegisterSampleCLICommands( void );
-
-/*
- * Implements the task-stats command.
- */
-#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) )
- static BaseType_t prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
-#endif
-
-/*
- * Implements the run-time-stats command.
- */
-#if( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) )
- static BaseType_t prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
-#endif
-
-/*
- * Implements the echo-three-parameters command.
- */
-static BaseType_t prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
-
-/*
- * Implements the echo-parameters command.
- */
-static BaseType_t prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
-
-/*
- * Implements the "query heap" command.
- */
-#if( configINCLUDE_QUERY_HEAP_COMMAND == 1 )
- static BaseType_t prvQueryHeapCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
-#endif
-
-/*
- * Implements the "trace start" and "trace stop" commands;
- */
-#if( configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 )
- static BaseType_t prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
-#endif
-
-/* Structure that defines the "run-time-stats" command line command. This
-generates a table that shows how much run time each task has */
-#if( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) )
- static const CLI_Command_Definition_t xRunTimeStats =
- {
- "run-time-stats", /* The command string to type. */
- "\r\nrun-time-stats:\r\n Displays a table showing how much processing time each FreeRTOS task has used\r\n",
- prvRunTimeStatsCommand, /* The function to run. */
- 0 /* No parameters are expected. */
- };
-#endif
-
-/* Structure that defines the "task-stats" command line command. This generates
-a table that gives information on each task in the system. */
-#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) )
- static const CLI_Command_Definition_t xTaskStats =
- {
- "task-stats", /* The command string to type. */
- "\r\ntask-stats:\r\n Displays a table showing the state of each FreeRTOS task\r\n",
- prvTaskStatsCommand, /* The function to run. */
- 0 /* No parameters are expected. */
- };
-#endif
-
-/* Structure that defines the "echo_3_parameters" command line command. This
-takes exactly three parameters that the command simply echos back one at a
-time. */
-static const CLI_Command_Definition_t xThreeParameterEcho =
-{
- "echo-3-parameters",
- "\r\necho-3-parameters <param1> <param2> <param3>:\r\n Expects three parameters, echos each in turn\r\n",
- prvThreeParameterEchoCommand, /* The function to run. */
- 3 /* Three parameters are expected, which can take any value. */
-};
-
-/* Structure that defines the "echo_parameters" command line command. This
-takes a variable number of parameters that the command simply echos back one at
-a time. */
-static const CLI_Command_Definition_t xParameterEcho =
-{
- "echo-parameters",
- "\r\necho-parameters <...>:\r\n Take variable number of parameters, echos each in turn\r\n",
- prvParameterEchoCommand, /* The function to run. */
- -1 /* The user can enter any number of commands. */
-};
-
-#if( configINCLUDE_QUERY_HEAP_COMMAND == 1 )
- /* Structure that defines the "query_heap" command line command. */
- static const CLI_Command_Definition_t xQueryHeap =
- {
- "query-heap",
- "\r\nquery-heap:\r\n Displays the free heap space, and minimum ever free heap space.\r\n",
- prvQueryHeapCommand, /* The function to run. */
- 0 /* The user can enter any number of commands. */
- };
-#endif /* configQUERY_HEAP_COMMAND */
-
-#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1
- /* Structure that defines the "trace" command line command. This takes a single
- parameter, which can be either "start" or "stop". */
- static const CLI_Command_Definition_t xStartStopTrace =
- {
- "trace",
- "\r\ntrace [start | stop]:\r\n Starts or stops a trace recording for viewing in FreeRTOS+Trace\r\n",
- prvStartStopTraceCommand, /* The function to run. */
- 1 /* One parameter is expected. Valid values are "start" and "stop". */
- };
-#endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */
-
-/*-----------------------------------------------------------*/
-
-void vRegisterSampleCLICommands( void )
-{
- /* Register all the command line commands defined immediately above. */
- FreeRTOS_CLIRegisterCommand( &xThreeParameterEcho );
- FreeRTOS_CLIRegisterCommand( &xParameterEcho );
-
- #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) )
- {
- FreeRTOS_CLIRegisterCommand( &xTaskStats );
- }
- #endif
-
- #if( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) )
- {
- FreeRTOS_CLIRegisterCommand( &xRunTimeStats );
- }
- #endif
-
- #if( configINCLUDE_QUERY_HEAP_COMMAND == 1 )
- {
- FreeRTOS_CLIRegisterCommand( &xQueryHeap );
- }
- #endif
-
- #if( configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 )
- {
- FreeRTOS_CLIRegisterCommand( &xStartStopTrace );
- }
- #endif
-}
-/*-----------------------------------------------------------*/
-
-#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) )
-
- static BaseType_t prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
- {
- const char *const pcHeader = " State\tPriority\tStack\t#\r\n************************************************\r\n";
- BaseType_t xSpacePadding;
-
- /* Remove compile time warnings about unused parameters, and check the
- write buffer is not NULL. NOTE - for simplicity, this example assumes the
- write buffer length is adequate, so does not check for buffer overflows. */
- ( void ) pcCommandString;
- ( void ) xWriteBufferLen;
- configASSERT( pcWriteBuffer );
-
- /* Generate a table of task stats. */
- strcpy( pcWriteBuffer, "Task" );
- pcWriteBuffer += strlen( pcWriteBuffer );
-
- /* Minus three for the null terminator and half the number of characters in
- "Task" so the column lines up with the centre of the heading. */
- configASSERT( configMAX_TASK_NAME_LEN > 3 );
- for( xSpacePadding = strlen( "Task" ); xSpacePadding < ( configMAX_TASK_NAME_LEN - 3 ); xSpacePadding++ )
- {
- /* Add a space to align columns after the task's name. */
- *pcWriteBuffer = ' ';
- pcWriteBuffer++;
-
- /* Ensure always terminated. */
- *pcWriteBuffer = 0x00;
- }
- strcpy( pcWriteBuffer, pcHeader );
- vTaskList( pcWriteBuffer + strlen( pcHeader ) );
-
- /* There is no more data to return after this single string, so return
- pdFALSE. */
- return pdFALSE;
- }
-
-#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) */
-/*-----------------------------------------------------------*/
-
-#if( configINCLUDE_QUERY_HEAP_COMMAND == 1 )
-
- static BaseType_t prvQueryHeapCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
- {
- /* Remove compile time warnings about unused parameters, and check the
- write buffer is not NULL. NOTE - for simplicity, this example assumes the
- write buffer length is adequate, so does not check for buffer overflows. */
- ( void ) pcCommandString;
- ( void ) xWriteBufferLen;
- configASSERT( pcWriteBuffer );
-
- sprintf( pcWriteBuffer, "Current free heap %d bytes, minimum ever free heap %d bytes\r\n", ( int ) xPortGetFreeHeapSize(), ( int ) xPortGetMinimumEverFreeHeapSize() );
-
- /* There is no more data to return after this single string, so return
- pdFALSE. */
- return pdFALSE;
- }
-
-#endif /* configINCLUDE_QUERY_HEAP */
-/*-----------------------------------------------------------*/
-
-#if( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) )
-
- static BaseType_t prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
- {
- const char * const pcHeader = "Task Abs Time % Time\r\n****************************************\r\n";
-
- /* Remove compile time warnings about unused parameters, and check the
- write buffer is not NULL. NOTE - for simplicity, this example assumes the
- write buffer length is adequate, so does not check for buffer overflows. */
- ( void ) pcCommandString;
- ( void ) xWriteBufferLen;
- configASSERT( pcWriteBuffer );
-
- /* Generate a table of task stats. */
- strcpy( pcWriteBuffer, pcHeader );
- vTaskGetRunTimeStats( pcWriteBuffer + strlen( pcHeader ) );
-
- /* There is no more data to return after this single string, so return
- pdFALSE. */
- return pdFALSE;
- }
-
-#endif /* configGENERATE_RUN_TIME_STATS */
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
-{
-const char *pcParameter;
-BaseType_t xParameterStringLength, xReturn;
-static BaseType_t lParameterNumber = 0;
-
- /* Remove compile time warnings about unused parameters, and check the
- write buffer is not NULL. NOTE - for simplicity, this example assumes the
- write buffer length is adequate, so does not check for buffer overflows. */
- ( void ) pcCommandString;
- ( void ) xWriteBufferLen;
- configASSERT( pcWriteBuffer );
-
- if( lParameterNumber == 0 )
- {
- /* The first time the function is called after the command has been
- entered just a header string is returned. */
- sprintf( pcWriteBuffer, "The three parameters were:\r\n" );
-
- /* Next time the function is called the first parameter will be echoed
- back. */
- lParameterNumber = 1L;
-
- /* There is more data to be returned as no parameters have been echoed
- back yet. */
- xReturn = pdPASS;
- }
- else
- {
- /* Obtain the parameter string. */
- pcParameter = FreeRTOS_CLIGetParameter
- (
- pcCommandString, /* The command string itself. */
- lParameterNumber, /* Return the next parameter. */
- &xParameterStringLength /* Store the parameter string length. */
- );
-
- /* Sanity check something was returned. */
- configASSERT( pcParameter );
-
- /* Return the parameter string. */
- memset( pcWriteBuffer, 0x00, xWriteBufferLen );
- sprintf( pcWriteBuffer, "%d: ", ( int ) lParameterNumber );
- strncat( pcWriteBuffer, pcParameter, xParameterStringLength );
- strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) );
-
- /* If this is the last of the three parameters then there are no more
- strings to return after this one. */
- if( lParameterNumber == 3L )
- {
- /* If this is the last of the three parameters then there are no more
- strings to return after this one. */
- xReturn = pdFALSE;
- lParameterNumber = 0L;
- }
- else
- {
- /* There are more parameters to return after this one. */
- xReturn = pdTRUE;
- lParameterNumber++;
- }
- }
-
- return xReturn;
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
-{
-const char *pcParameter;
-BaseType_t xParameterStringLength, xReturn;
-static BaseType_t lParameterNumber = 0;
-
- /* Remove compile time warnings about unused parameters, and check the
- write buffer is not NULL. NOTE - for simplicity, this example assumes the
- write buffer length is adequate, so does not check for buffer overflows. */
- ( void ) pcCommandString;
- ( void ) xWriteBufferLen;
- configASSERT( pcWriteBuffer );
-
- if( lParameterNumber == 0 )
- {
- /* The first time the function is called after the command has been
- entered just a header string is returned. */
- sprintf( pcWriteBuffer, "The parameters were:\r\n" );
-
- /* Next time the function is called the first parameter will be echoed
- back. */
- lParameterNumber = 1L;
-
- /* There is more data to be returned as no parameters have been echoed
- back yet. */
- xReturn = pdPASS;
- }
- else
- {
- /* Obtain the parameter string. */
- pcParameter = FreeRTOS_CLIGetParameter
- (
- pcCommandString, /* The command string itself. */
- lParameterNumber, /* Return the next parameter. */
- &xParameterStringLength /* Store the parameter string length. */
- );
-
- if( pcParameter != NULL )
- {
- /* Return the parameter string. */
- memset( pcWriteBuffer, 0x00, xWriteBufferLen );
- sprintf( pcWriteBuffer, "%d: ", ( int ) lParameterNumber );
- strncat( pcWriteBuffer, pcParameter, xParameterStringLength );
- strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) );
-
- /* There might be more parameters to return after this one. */
- xReturn = pdTRUE;
- lParameterNumber++;
- }
- else
- {
- /* No more parameters were found. Make sure the write buffer does
- not contain a valid string. */
- pcWriteBuffer[ 0 ] = 0x00;
-
- /* No more data to return. */
- xReturn = pdFALSE;
-
- /* Start over the next time this command is executed. */
- lParameterNumber = 0;
- }
- }
-
- return xReturn;
-}
-/*-----------------------------------------------------------*/
-
-#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1
-
- static BaseType_t prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
- {
- const char *pcParameter;
- BaseType_t lParameterStringLength;
-
- /* Remove compile time warnings about unused parameters, and check the
- write buffer is not NULL. NOTE - for simplicity, this example assumes the
- write buffer length is adequate, so does not check for buffer overflows. */
- ( void ) pcCommandString;
- ( void ) xWriteBufferLen;
- configASSERT( pcWriteBuffer );
-
- /* Obtain the parameter string. */
- pcParameter = FreeRTOS_CLIGetParameter
- (
- pcCommandString, /* The command string itself. */
- 1, /* Return the first parameter. */
- &lParameterStringLength /* Store the parameter string length. */
- );
-
- /* Sanity check something was returned. */
- configASSERT( pcParameter );
-
- /* There are only two valid parameter values. */
- if( strncmp( pcParameter, "start", strlen( "start" ) ) == 0 )
- {
- /* Start or restart the trace. */
- vTraceStop();
- vTraceClear();
- vTraceStart();
-
- sprintf( pcWriteBuffer, "Trace recording (re)started.\r\n" );
- }
- else if( strncmp( pcParameter, "stop", strlen( "stop" ) ) == 0 )
- {
- /* End the trace, if one is running. */
- vTraceStop();
- sprintf( pcWriteBuffer, "Stopping trace recording.\r\n" );
- }
- else
- {
- sprintf( pcWriteBuffer, "Valid parameters are 'start' and 'stop'.\r\n" );
- }
-
- /* There is no more data to return after this single string, so return
- pdFALSE. */
- return pdFALSE;
- }
-
-#endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */
diff --git a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/TCP-related-CLI-commands.c b/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/TCP-related-CLI-commands.c
deleted file mode 100644
index a998396..0000000
--- a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/TCP-related-CLI-commands.c
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
- All rights reserved
-
- VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
-
- This file is part of the FreeRTOS distribution.
-
- FreeRTOS is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License (version 2) as published by the
- Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
-
- ***************************************************************************
- >>! NOTE: The modification to the GPL is included to allow you to !<<
- >>! distribute a combined work that includes FreeRTOS without being !<<
- >>! obliged to provide the source code for proprietary components !<<
- >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
-
- FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. Full license text is available on the following
- link: http://www.freertos.org/a00114.html
-
- ***************************************************************************
- * *
- * FreeRTOS provides completely free yet professionally developed, *
- * robust, strictly quality controlled, supported, and cross *
- * platform software that is more than just the market leader, it *
- * is the industry's de facto standard. *
- * *
- * Help yourself get started quickly while simultaneously helping *
- * to support the FreeRTOS project by purchasing a FreeRTOS *
- * tutorial book, reference manual, or both: *
- * http://www.FreeRTOS.org/Documentation *
- * *
- ***************************************************************************
-
- http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
- the FAQ page "My application does not run, what could be wrong?". Have you
- defined configASSERT()?
-
- http://www.FreeRTOS.org/support - In return for receiving this top quality
- embedded software for free we request you assist our global community by
- participating in the support forum.
-
- http://www.FreeRTOS.org/training - Investing in training allows your team to
- be as productive as possible as early as possible. Now you can receive
- FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
- Ltd, and the world's leading authority on the world's leading RTOS.
-
- http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
- including FreeRTOS+Trace - an indispensable productivity tool, a DOS
- compatible FAT file system, and our tiny thread aware UDP/IP stack.
-
- http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
- Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
-
- http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
- Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
- licenses offer ticketed support, indemnification and commercial middleware.
-
- http://www.SafeRTOS.com - High Integrity Systems also provide a safety
- engineered and independently SIL3 certified version for use in safety and
- mission critical applications that require provable dependability.
-
- 1 tab == 4 spaces!
-*/
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-#include "task.h"
-
-/* Standard includes. */
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-/* FreeRTOS+CLI includes. */
-#include "FreeRTOS_CLI.h"
-
-/* FreeRTOS+TCP includes, just to make the stats available to the CLI
-commands. */
-#include "FreeRTOS_IP.h"
-#include "FreeRTOS_Sockets.h"
-
-/*
- * Defines a command that prints out IP address information.
- */
-static BaseType_t prvDisplayIPConfig( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
-
-/*
- * Defines a command that prints out the gathered demo debug stats.
- */
-#if( configINCLUDE_DEMO_DEBUG_STATS != 0 )
- static BaseType_t prvDisplayIPDebugStats( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
-#endif
-
-/*
- * Defines a command that sends an ICMP ping request to an IP address.
- */
-#if( ipconfigSUPPORT_OUTGOING_PINGS == 1 )
- static BaseType_t prvPingCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
-#endif
-
-/*
- * Defines a command that calls FreeRTOS_netstat().
- */
-static BaseType_t prvNetStatCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString );
-
-/* Structure that defines the "ip-config" command line command. */
-static const CLI_Command_Definition_t xIPConfig =
-{
- "ip-config",
- "\r\nip-config:\r\n Displays IP address configuration\r\n",
- prvDisplayIPConfig,
- 0
-};
-
-#if( configINCLUDE_DEMO_DEBUG_STATS != 0 )
- /* Structure that defines the "ip-debug-stats" command line command. */
- static const CLI_Command_Definition_t xIPDebugStats =
- {
- "ip-debug-stats", /* The command string to type. */
- "\r\nip-debug-stats:\r\n Shows some IP stack stats useful for debug - an example only.\r\n",
- prvDisplayIPDebugStats, /* The function to run. */
- 0 /* No parameters are expected. */
- };
-#endif /* configINCLUDE_DEMO_DEBUG_STATS */
-
-#if( ipconfigSUPPORT_OUTGOING_PINGS == 1 )
-
- /* Structure that defines the "ping" command line command. This takes an IP
- address or host name and (optionally) the number of bytes to ping as
- parameters. */
- static const CLI_Command_Definition_t xPing =
- {
- "ping",
- "\r\nping <ipaddress> <optional:bytes to send>:\r\n for example, ping 192.168.0.3 8, or ping www.example.com\r\n",
- prvPingCommand, /* The function to run. */
- -1 /* Ping can take either one or two parameter, so the number of parameters has to be determined by the ping command implementation. */
- };
-
-#endif /* ipconfigSUPPORT_OUTGOING_PINGS */
-
-/* Structure that defines the "task-stats" command line command. This generates
-a table that gives information on each task in the system. */
-static const CLI_Command_Definition_t xNetStats =
-{
- "net-stats", /* The command string to type. */
- "\r\nnet-stats:\r\n Calls FreeRTOS_netstat()\r\n",
- prvNetStatCommand, /* The function to run. */
- 0 /* No parameters are expected. */
-};
-
-/*-----------------------------------------------------------*/
-
-void vRegisterTCPCLICommands( void )
-{
- /* Register all the command line commands defined immediately above. */
- FreeRTOS_CLIRegisterCommand( &xIPConfig );
-
- #if( configINCLUDE_DEMO_DEBUG_STATS == 1 )
- {
- FreeRTOS_CLIRegisterCommand( &xIPDebugStats );
- }
- #endif /* configINCLUDE_DEMO_DEBUG_STATS */
-
- #if( ipconfigSUPPORT_OUTGOING_PINGS == 1 )
- {
- FreeRTOS_CLIRegisterCommand( &xPing );
- }
- #endif /* ipconfigSUPPORT_OUTGOING_PINGS */
-
- FreeRTOS_CLIRegisterCommand( &xNetStats );
-}
-/*-----------------------------------------------------------*/
-
-#if( ipconfigSUPPORT_OUTGOING_PINGS == 1 )
-
- static BaseType_t prvPingCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
- {
- char * pcParameter;
- BaseType_t lParameterStringLength, xReturn = pdFALSE;
- uint32_t ulIPAddress, ulBytesToPing;
- const uint32_t ulDefaultBytesToPing = 8UL;
- char cBuffer[ 16 ];
-
- /* Remove compile time warnings about unused parameters, and check the
- write buffer is not NULL. NOTE - for simplicity, this example assumes the
- write buffer length is adequate, so does not check for buffer overflows. */
- ( void ) pcCommandString;
- ( void ) xWriteBufferLen;
- configASSERT( pcWriteBuffer );
-
- /* Start with an empty string. */
- pcWriteBuffer[ 0 ] = 0x00;
-
- /* Obtain the number of bytes to ping. */
- pcParameter = ( char * ) FreeRTOS_CLIGetParameter
- (
- pcCommandString, /* The command string itself. */
- 2, /* Return the second parameter. */
- &lParameterStringLength /* Store the parameter string length. */
- );
-
- if( pcParameter == NULL )
- {
- /* The number of bytes was not specified, so default it. */
- ulBytesToPing = ulDefaultBytesToPing;
- }
- else
- {
- ulBytesToPing = atol( pcParameter );
- }
-
- /* Obtain the IP address string. */
- pcParameter = ( char * ) FreeRTOS_CLIGetParameter
- (
- pcCommandString, /* The command string itself. */
- 1, /* Return the first parameter. */
- &lParameterStringLength /* Store the parameter string length. */
- );
-
- if( pcParameter != NULL )
- {
- /* Terminate the host name or IP address string. */
- pcParameter[ lParameterStringLength ] = 0x00;
-
- /* Attempt to obtain the IP address. If the first character is not a
- digit, assume the host name has been passed in. */
- if( ( *pcParameter >= '0' ) && ( *pcParameter <= '9' ) )
- {
- ulIPAddress = FreeRTOS_inet_addr( pcParameter );
- }
- else
- {
- /* Attempt to resolve host. */
- ulIPAddress = FreeRTOS_gethostbyname( pcParameter );
- }
-
- /* Convert IP address, which may have come from a DNS lookup, to string. */
- FreeRTOS_inet_ntoa( ulIPAddress, cBuffer );
-
- if( ulIPAddress != 0 )
- {
- xReturn = FreeRTOS_SendPingRequest( ulIPAddress, ( uint16_t ) ulBytesToPing, portMAX_DELAY );
- }
- }
-
- if( xReturn == pdFALSE )
- {
- sprintf( pcWriteBuffer, "%s", "Could not send ping request\r\n" );
- }
- else
- {
- sprintf( pcWriteBuffer, "Ping sent to %s with identifier %d\r\n", cBuffer, ( int ) xReturn );
- }
-
- return pdFALSE;
- }
- /*-----------------------------------------------------------*/
-
-#endif /* ipconfigSUPPORT_OUTGOING_PINGS */
-
-#if( configINCLUDE_DEMO_DEBUG_STATS != 0 )
-
- static BaseType_t prvDisplayIPDebugStats( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
- {
- static BaseType_t xIndex = -1;
- extern ExampleDebugStatEntry_t xIPTraceValues[];
- BaseType_t xReturn;
-
- /* Remove compile time warnings about unused parameters, and check the
- write buffer is not NULL. NOTE - for simplicity, this example assumes the
- write buffer length is adequate, so does not check for buffer overflows. */
- ( void ) pcCommandString;
- ( void ) xWriteBufferLen;
- configASSERT( pcWriteBuffer );
-
- xIndex++;
-
- if( xIndex < xExampleDebugStatEntries() )
- {
- sprintf( pcWriteBuffer, "%s %d\r\n", ( char * ) xIPTraceValues[ xIndex ].pucDescription, ( int ) xIPTraceValues[ xIndex ].ulData );
- xReturn = pdPASS;
- }
- else
- {
- /* Reset the index for the next time it is called. */
- xIndex = -1;
-
- /* Ensure nothing remains in the write buffer. */
- pcWriteBuffer[ 0 ] = 0x00;
- xReturn = pdFALSE;
- }
-
- return xReturn;
- }
- /*-----------------------------------------------------------*/
-
-#endif /* configINCLUDE_DEMO_DEBUG_STATS */
-
-static BaseType_t prvDisplayIPConfig( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
-{
-static BaseType_t xIndex = 0;
-BaseType_t xReturn;
-uint32_t ulAddress;
-
- /* Remove compile time warnings about unused parameters, and check the
- write buffer is not NULL. NOTE - for simplicity, this example assumes the
- write buffer length is adequate, so does not check for buffer overflows. */
- ( void ) pcCommandString;
- ( void ) xWriteBufferLen;
- configASSERT( pcWriteBuffer );
-
- switch( xIndex )
- {
- case 0 :
- FreeRTOS_GetAddressConfiguration( &ulAddress, NULL, NULL, NULL );
- sprintf( pcWriteBuffer, "\r\nIP address " );
- xReturn = pdTRUE;
- xIndex++;
- break;
-
- case 1 :
- FreeRTOS_GetAddressConfiguration( NULL, &ulAddress, NULL, NULL );
- sprintf( pcWriteBuffer, "\r\nNet mask " );
- xReturn = pdTRUE;
- xIndex++;
- break;
-
- case 2 :
- FreeRTOS_GetAddressConfiguration( NULL, NULL, &ulAddress, NULL );
- sprintf( pcWriteBuffer, "\r\nGateway address " );
- xReturn = pdTRUE;
- xIndex++;
- break;
-
- case 3 :
- FreeRTOS_GetAddressConfiguration( NULL, NULL, NULL, &ulAddress );
- sprintf( pcWriteBuffer, "\r\nDNS server address " );
- xReturn = pdTRUE;
- xIndex++;
- break;
-
- default :
- ulAddress = 0;
- sprintf( pcWriteBuffer, "\r\n\r\n" );
- xReturn = pdFALSE;
- xIndex = 0;
- break;
- }
-
- if( ulAddress != 0 )
- {
- FreeRTOS_inet_ntoa( ulAddress, ( &( pcWriteBuffer[ strlen( pcWriteBuffer ) ] ) ) );
- }
-
- return xReturn;
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvNetStatCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
-{
- ( void ) pcWriteBuffer;
- ( void ) xWriteBufferLen;
- ( void ) pcCommandString;
-
- FreeRTOS_netstat();
- snprintf( pcWriteBuffer, xWriteBufferLen, "FreeRTOS_netstat() called - output uses FreeRTOS_printf\r\n" );
- return pdFALSE;
-}
-
diff --git a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/TCPCommandConsole.c b/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/TCPCommandConsole.c
deleted file mode 100644
index 1250ef9..0000000
--- a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/TCPCommandConsole.c
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
- All rights reserved
-
- VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
-
- This file is part of the FreeRTOS distribution.
-
- FreeRTOS is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License (version 2) as published by the
- Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
-
- ***************************************************************************
- >>! NOTE: The modification to the GPL is included to allow you to !<<
- >>! distribute a combined work that includes FreeRTOS without being !<<
- >>! obliged to provide the source code for proprietary components !<<
- >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
-
- FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. Full license text is available on the following
- link: http://www.freertos.org/a00114.html
-
- ***************************************************************************
- * *
- * FreeRTOS provides completely free yet professionally developed, *
- * robust, strictly quality controlled, supported, and cross *
- * platform software that is more than just the market leader, it *
- * is the industry's de facto standard. *
- * *
- * Help yourself get started quickly while simultaneously helping *
- * to support the FreeRTOS project by purchasing a FreeRTOS *
- * tutorial book, reference manual, or both: *
- * http://www.FreeRTOS.org/Documentation *
- * *
- ***************************************************************************
-
- http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
- the FAQ page "My application does not run, what could be wrong?". Have you
- defined configASSERT()?
-
- http://www.FreeRTOS.org/support - In return for receiving this top quality
- embedded software for free we request you assist our global community by
- participating in the support forum.
-
- http://www.FreeRTOS.org/training - Investing in training allows your team to
- be as productive as possible as early as possible. Now you can receive
- FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
- Ltd, and the world's leading authority on the world's leading RTOS.
-
- http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
- including FreeRTOS+Trace - an indispensable productivity tool, a DOS
- compatible FAT file system, and our tiny thread aware UDP/IP stack.
-
- http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
- Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
-
- http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
- Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
- licenses offer ticketed support, indemnification and commercial middleware.
-
- http://www.SafeRTOS.com - High Integrity Systems also provide a safety
- engineered and independently SIL3 certified version for use in safety and
- mission critical applications that require provable dependability.
-
- 1 tab == 4 spaces!
-*/
-
-/* Standard includes. */
-#include <stdint.h>
-#include <stdio.h>
-#include <stdarg.h>
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-#include "task.h"
-#include "semphr.h"
-
-/* FreeRTOS+CLI includes. */
-#include "FreeRTOS_CLI.h"
-
-/* FreeRTOS+TCP includes. */
-#include "FreeRTOS_IP.h"
-#include "FreeRTOS_Sockets.h"
-
-/* Demo app includes. */
-#include "TCPCommandConsole.h"
-
-/* Dimensions the buffer into which input characters are placed. */
-#define cmdMAX_INPUT_SIZE 60
-
-/* Dimensions the buffer into which string outputs can be placed. */
-#define cmdMAX_OUTPUT_SIZE 1024
-
-/* Dimensions the buffer passed to the recv() call. */
-#define cmdSOCKET_INPUT_BUFFER_SIZE 60
-
-/* DEL acts as a backspace. */
-#define cmdASCII_DEL ( 0x7F )
-
-/* The maximum time to wait for a closing socket to close. */
-#define cmdSHUTDOWN_DELAY ( pdMS_TO_TICKS( 5000 ) )
-
-/*
- * The task that runs FreeRTOS+CLI.
- */
-static void prvTCPCommandInterpreterTask( void *pvParameters );
-
-/*
- * Open and configure the TCP socket.
- */
-static Socket_t prvOpenTCPServerSocket( uint16_t usPort );
-
-/*
- * A connected socket is being closed. Ensure the socket is closed at both ends
- * properly.
- */
-static void prvGracefulShutdown( Socket_t xSocket );
-
-/*-----------------------------------------------------------*/
-
-/*
- * Various buffers used by the command lin interpreter.
- */
-static char cOutputString[ cmdMAX_OUTPUT_SIZE ], cLocalBuffer[ cmdSOCKET_INPUT_BUFFER_SIZE ];
-static char cInputString[ cmdMAX_INPUT_SIZE ], cLastInputString[ cmdMAX_INPUT_SIZE ];
-
-/* Const messages output by the command console. */
-static const char * const pcWelcomeMessage = "FreeRTOS command server.\r\nType help to view a list of registered commands.\r\nType quit to end a session.\r\n\r\n>";
-static const char * const pcEndOfOutputMessage = "\r\n[Press ENTER to execute the previous command again]\r\n>";
-static const char * const pcNewLine = "\r\n";
-
-/*-----------------------------------------------------------*/
-
-void vStartTCPCommandInterpreterTask( uint16_t usStackSize, uint32_t ulPort, UBaseType_t uxPriority )
-{
- xTaskCreate( prvTCPCommandInterpreterTask, "TCP CLI", usStackSize, ( void * ) ulPort, uxPriority, NULL );
-}
-/*-----------------------------------------------------------*/
-
-void prvTCPCommandInterpreterTask( void *pvParameters )
-{
-int32_t lBytes, lByte, lSent;
-char cRxedChar, cInputIndex = 0;
-BaseType_t xMoreDataToFollow;
-struct freertos_sockaddr xClient;
-Socket_t xListeningSocket, xConnectedSocket;
-socklen_t xSize = sizeof( xClient );
-
- memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );
-
- for( ;; )
- {
- /* Attempt to open the socket. The port number is passed in the task
- parameter. The strange casting is to remove compiler warnings on 32-bit
- machines. NOTE: The FREERTOS_SO_REUSE_LISTEN_SOCKET option is used,
- so the listening and connecting socket are the same - meaning only one
- connection will be accepted at a time, and that xListeningSocket must
- be created on each iteration. */
- xListeningSocket = prvOpenTCPServerSocket( ( uint16_t ) ( ( uint32_t ) pvParameters ) & 0xffffUL );
-
- /* Nothing for this task to do if the socket cannot be created. */
- if( xListeningSocket == FREERTOS_INVALID_SOCKET )
- {
- vTaskDelete( NULL );
- }
-
- /* Wait for an incoming connection. */
- xConnectedSocket = FreeRTOS_accept( xListeningSocket, &xClient, &xSize );
-
- /* The FREERTOS_SO_REUSE_LISTEN_SOCKET option is set, so the
- connected and listening socket should be the same socket. */
- configASSERT( xConnectedSocket == xListeningSocket );
-
- /* Send the welcome message. */
- lSent = FreeRTOS_send( xConnectedSocket, ( void * ) pcWelcomeMessage, strlen( pcWelcomeMessage ), 0 );
-
- /* Process the socket as long as it remains connected. */
- while( lSent >= 0 )
- {
- /* Receive data on the socket. */
- lBytes = FreeRTOS_recv( xConnectedSocket, cLocalBuffer, sizeof( cLocalBuffer ), 0 );
-
- if( lBytes >= 0 )
- {
- /* Process each received byte in turn. */
- lByte = 0;
- while( lByte < lBytes )
- {
- /* The next character in the input buffer. */
- cRxedChar = cLocalBuffer[ lByte ];
- lByte++;
-
- /* Newline characters are taken as the end of the command
- string. */
- if( cRxedChar == '\n' )
- {
- /* Just to space the output from the input. */
- FreeRTOS_send( xConnectedSocket, pcNewLine, strlen( pcNewLine ), 0 );
-
- /* See if the command is empty, indicating that the last
- command is to be executed again. */
- if( cInputIndex == 0 )
- {
- /* Copy the last command back into the input string. */
- strcpy( cInputString, cLastInputString );
- }
-
- /* If the command was "quit" then close the console. */
- if( strcasecmp( cInputString, "quit" ) == 0 )
- {
- /* Fake an error code so the outer loop exits on the
- assumption there was an error on the socket. The
- socket will then be shut down gracefully. */
- lSent = -1;
- break;
- }
-
- /* Process the input string received prior to the
- newline. */
- do
- {
- /* Pass the string to FreeRTOS+CLI. */
- cOutputString[ 0 ] = 0x00;
- xMoreDataToFollow = FreeRTOS_CLIProcessCommand( cInputString, cOutputString, cmdMAX_OUTPUT_SIZE );
-
- /* Send the output generated by the command's
- implementation. */
- lSent = FreeRTOS_send( xConnectedSocket, cOutputString, strlen( ( const char * ) cOutputString ), 0 );
-
- /* Until the command does not generate any more output. */
- } while( ( xMoreDataToFollow != pdFALSE ) && ( lSent >= 0 ) );
-
- if( lSent >= 0 )
- {
- /* All the strings generated by the command
- processing have been sent. Clear the input string
- ready to receive the next command. Remember the
- previous command so it can be executed again by
- pressing [ENTER]. */
- strcpy( cLastInputString, cInputString );
- cInputIndex = 0;
- memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );
-
- /* Transmit a spacer to make the console easier to
- read. */
- lSent = FreeRTOS_send( xConnectedSocket, ( void * ) pcEndOfOutputMessage, strlen( pcEndOfOutputMessage ), 0 );
- }
-
- if( lSent < 0 )
- {
- /* Socket closed? */
- break;
- }
- }
- else
- {
- if( cRxedChar == '\r' )
- {
- /* Ignore the character. Newlines are used to
- detect the end of the input string. */
- }
- else if( ( cRxedChar == '\b' ) || ( cRxedChar == cmdASCII_DEL ) )
- {
- /* Backspace was pressed. Erase the last character
- in the string - if any. */
- if( cInputIndex > 0 )
- {
- cInputIndex--;
- cInputString[ ( int ) cInputIndex ] = '\0';
- }
- }
- else
- {
- /* A character was entered. Add it to the string
- entered so far. When a \n is entered the complete
- string will be passed to the command interpreter. */
- if( cInputIndex < cmdMAX_INPUT_SIZE )
- {
- if( ( cRxedChar >= ' ' ) && ( cRxedChar <= '~' ) )
- {
- cInputString[ ( int ) cInputIndex ] = cRxedChar;
- cInputIndex++;
- }
- }
- }
- }
- }
- }
- else
- {
- /* Socket closed? */
- break;
- }
- }
-
- /* Close the socket correctly. */
- prvGracefulShutdown( xListeningSocket );
- }
-}
-/*-----------------------------------------------------------*/
-
-static void prvGracefulShutdown( Socket_t xSocket )
-{
-TickType_t xTimeOnShutdown;
-
- /* Initiate a shutdown in case it has not already been initiated. */
- FreeRTOS_shutdown( xSocket, FREERTOS_SHUT_RDWR );
-
- /* Wait for the shutdown to take effect, indicated by FreeRTOS_recv()
- returning an error. */
- xTimeOnShutdown = xTaskGetTickCount();
- do
- {
- if( FreeRTOS_recv( xSocket, cInputString, ipconfigTCP_MSS, 0 ) < 0 )
- {
- break;
- }
- } while( ( xTaskGetTickCount() - xTimeOnShutdown ) < cmdSHUTDOWN_DELAY );
-
- /* Finished with the socket and the task. */
- FreeRTOS_closesocket( xSocket );
-}
-/*-----------------------------------------------------------*/
-
-static Socket_t prvOpenTCPServerSocket( uint16_t usPort )
-{
-struct freertos_sockaddr xBindAddress;
-Socket_t xSocket;
-static const TickType_t xReceiveTimeOut = portMAX_DELAY;
-const BaseType_t xBacklog = 20;
-BaseType_t xReuseSocket = pdTRUE;
-
- /* Attempt to open the socket. */
- xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
- configASSERT( xSocket != FREERTOS_INVALID_SOCKET );
-
- /* Set a time out so accept() will just wait for a connection. */
- FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) );
-
- /* Only one connection will be used at a time, so re-use the listening
- socket as the connected socket. See SimpleTCPEchoServer.c for an example
- that accepts multiple connections. */
- FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_REUSE_LISTEN_SOCKET, &xReuseSocket, sizeof( xReuseSocket ) );
-
- /* NOTE: The CLI is a low bandwidth interface (typing characters is slow),
- so the TCP window properties are left at their default. See
- SimpleTCPEchoServer.c for an example of a higher throughput TCP server that
- uses are larger RX and TX buffer. */
-
- /* Bind the socket to the port that the client task will send to, then
- listen for incoming connections. */
- xBindAddress.sin_port = usPort;
- xBindAddress.sin_port = FreeRTOS_htons( xBindAddress.sin_port );
- FreeRTOS_bind( xSocket, &xBindAddress, sizeof( xBindAddress ) );
- FreeRTOS_listen( xSocket, xBacklog );
-
- return xSocket;
-}
-/*-----------------------------------------------------------*/
-
-
-
-
diff --git a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/UARTCommandConsole.c b/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/UARTCommandConsole.c
deleted file mode 100644
index 3ab14bb..0000000
--- a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/UARTCommandConsole.c
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
- All rights reserved
-
- VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
-
- This file is part of the FreeRTOS distribution.
-
- FreeRTOS is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License (version 2) as published by the
- Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
-
- ***************************************************************************
- >>! NOTE: The modification to the GPL is included to allow you to !<<
- >>! distribute a combined work that includes FreeRTOS without being !<<
- >>! obliged to provide the source code for proprietary components !<<
- >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
-
- FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. Full license text is available on the following
- link: http://www.freertos.org/a00114.html
-
- ***************************************************************************
- * *
- * FreeRTOS provides completely free yet professionally developed, *
- * robust, strictly quality controlled, supported, and cross *
- * platform software that is more than just the market leader, it *
- * is the industry's de facto standard. *
- * *
- * Help yourself get started quickly while simultaneously helping *
- * to support the FreeRTOS project by purchasing a FreeRTOS *
- * tutorial book, reference manual, or both: *
- * http://www.FreeRTOS.org/Documentation *
- * *
- ***************************************************************************
-
- http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
- the FAQ page "My application does not run, what could be wrong?". Have you
- defined configASSERT()?
-
- http://www.FreeRTOS.org/support - In return for receiving this top quality
- embedded software for free we request you assist our global community by
- participating in the support forum.
-
- http://www.FreeRTOS.org/training - Investing in training allows your team to
- be as productive as possible as early as possible. Now you can receive
- FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
- Ltd, and the world's leading authority on the world's leading RTOS.
-
- http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
- including FreeRTOS+Trace - an indispensable productivity tool, a DOS
- compatible FAT file system, and our tiny thread aware UDP/IP stack.
-
- http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
- Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
-
- http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
- Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
- licenses offer ticketed support, indemnification and commercial middleware.
-
- http://www.SafeRTOS.com - High Integrity Systems also provide a safety
- engineered and independently SIL3 certified version for use in safety and
- mission critical applications that require provable dependability.
-
- 1 tab == 4 spaces!
-*/
-
-/*
- * NOTE: This file uses a third party USB CDC driver.
- */
-
-/* Standard includes. */
-#include "string.h"
-#include "stdio.h"
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-#include "task.h"
-#include "semphr.h"
-
-/* Example includes. */
-#include "FreeRTOS_CLI.h"
-
-/* Demo application includes. */
-#include "serial.h"
-
-/* Dimensions the buffer into which input characters are placed. */
-#define cmdMAX_INPUT_SIZE 50
-
-#define cmdQUEUE_LENGTH 25
-
-/* DEL acts as a backspace. */
-#define cmdASCII_DEL ( 0x7F )
-
-#define cmdMAX_MUTEX_WAIT ( ( ( TickType_t ) 300 ) / ( portTICK_PERIOD_MS ) )
-
-#ifndef configCLI_BAUD_RATE
- #define configCLI_BAUD_RATE 115200
-#endif
-
-/*-----------------------------------------------------------*/
-
-/*
- * The task that implements the command console processing.
- */
-static void prvUARTCommandConsoleTask( void *pvParameters );
-void vUARTCommandConsoleStart( uint16_t usStackSize, UBaseType_t uxPriority );
-
-/*-----------------------------------------------------------*/
-
-/* Const messages output by the command console. */
-static const char * const pcWelcomeMessage = "FreeRTOS command server.\r\nType Help to view a list of registered commands.\r\n\r\n>";
-static const char * const pcEndOfOutputMessage = "\r\n[Press ENTER to execute the previous command again]\r\n>";
-static const char * const pcNewLine = "\r\n";
-
-SemaphoreHandle_t xTxMutex = NULL;
-static xComPortHandle xPort = 0;
-
-/* Serial drivers that use task notifications may need the CLI task's handle. */
-TaskHandle_t xCLITaskHandle = NULL;
-
-/*-----------------------------------------------------------*/
-
-void vUARTCommandConsoleStart( uint16_t usStackSize, UBaseType_t uxPriority )
-{
- /* Create the semaphore used to access the UART Tx. */
- xTxMutex = xSemaphoreCreateMutex();
- configASSERT( xTxMutex );
-
- /* Create that task that handles the console itself. */
- xTaskCreate( prvUARTCommandConsoleTask, /* The task that implements the command console. */
- "CLI", /* Text name assigned to the task. This is just to assist debugging. The kernel does not use this name itself. */
- usStackSize, /* The size of the stack allocated to the task. */
- NULL, /* The parameter is not used, so NULL is passed. */
- uxPriority, /* The priority allocated to the task. */
- &xCLITaskHandle ); /* Serial drivers that use task notifications may need the CLI task's handle. */
-}
-/*-----------------------------------------------------------*/
-
-static void prvUARTCommandConsoleTask( void *pvParameters )
-{
-char cRxedChar;
-uint8_t ucInputIndex = 0;
-char *pcOutputString;
-static char cInputString[ cmdMAX_INPUT_SIZE ], cLastInputString[ cmdMAX_INPUT_SIZE ];
-BaseType_t xReturned;
-xComPortHandle xPort;
-
- ( void ) pvParameters;
-
- /* Obtain the address of the output buffer. Note there is no mutual
- exclusion on this buffer as it is assumed only one command console interface
- will be used at any one time. */
- pcOutputString = FreeRTOS_CLIGetOutputBuffer();
-
- /* Initialise the UART. */
- xPort = xSerialPortInitMinimal( configCLI_BAUD_RATE, cmdQUEUE_LENGTH );
-
- /* Send the welcome message. */
- vSerialPutString( xPort, ( char * ) pcWelcomeMessage, strlen( pcWelcomeMessage ) );
-
- for( ;; )
- {
- /* Wait for the next character. The while loop is used in case
- INCLUDE_vTaskSuspend is not set to 1 - in which case portMAX_DELAY will
- be a genuine block time rather than an infinite block time. */
- while( xSerialGetChar( xPort, &cRxedChar, portMAX_DELAY ) != pdPASS );
-
- /* Ensure exclusive access to the UART Tx. */
- if( xSemaphoreTake( xTxMutex, cmdMAX_MUTEX_WAIT ) == pdPASS )
- {
- /* Echo the character back. */
- xSerialPutChar( xPort, cRxedChar, portMAX_DELAY );
-
- /* Was it the end of the line? */
- if( ( cRxedChar == '\n' ) || ( cRxedChar == '\r' ) )
- {
- /* Just to space the output from the input. */
- vSerialPutString( xPort, ( char * ) pcNewLine, strlen( pcNewLine ) );
-
- /* See if the command is empty, indicating that the last command
- is to be executed again. */
- if( ucInputIndex == 0 )
- {
- /* Copy the last command back into the input string. */
- strcpy( cInputString, cLastInputString );
- }
-
- /* Pass the received command to the command interpreter. The
- command interpreter is called repeatedly until it returns
- pdFALSE (indicating there is no more output) as it might
- generate more than one string. */
- do
- {
- /* Get the next output string from the command interpreter. */
- xReturned = FreeRTOS_CLIProcessCommand( cInputString, pcOutputString, configCOMMAND_INT_MAX_OUTPUT_SIZE );
-
- /* Write the generated string to the UART. */
- vSerialPutString( xPort, ( char * ) pcOutputString, strlen( pcOutputString ) );
-
- } while( xReturned != pdFALSE );
-
- /* All the strings generated by the input command have been
- sent. Clear the input string ready to receive the next command.
- Remember the command that was just processed first in case it is
- to be processed again. */
- strcpy( cLastInputString, cInputString );
- ucInputIndex = 0;
- memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );
-
- vSerialPutString( xPort, ( char * ) pcEndOfOutputMessage, strlen( pcEndOfOutputMessage ) );
- }
- else
- {
- if( cRxedChar == '\r' )
- {
- /* Ignore the character. */
- }
- else if( ( cRxedChar == '\b' ) || ( cRxedChar == cmdASCII_DEL ) )
- {
- /* Backspace was pressed. Erase the last character in the
- string - if any. */
- if( ucInputIndex > 0 )
- {
- ucInputIndex--;
- cInputString[ ucInputIndex ] = '\0';
- }
- }
- else
- {
- /* A character was entered. Add it to the string entered so
- far. When a \n is entered the complete string will be
- passed to the command interpreter. */
- if( ( cRxedChar >= ' ' ) && ( cRxedChar <= '~' ) )
- {
- if( ucInputIndex < cmdMAX_INPUT_SIZE )
- {
- cInputString[ ucInputIndex ] = cRxedChar;
- ucInputIndex++;
- }
- }
- }
- }
-
- /* Must ensure to give the mutex back. */
- xSemaphoreGive( xTxMutex );
- }
- }
-}
-/*-----------------------------------------------------------*/
-
-void vOutputString( const char * const pcMessage )
-{
- if( xSemaphoreTake( xTxMutex, cmdMAX_MUTEX_WAIT ) == pdPASS )
- {
- vSerialPutString( xPort, ( char * ) pcMessage, strlen( pcMessage ) );
- xSemaphoreGive( xTxMutex );
- }
-}
-/*-----------------------------------------------------------*/
-
-void vOutputChar( const char cChar, const TickType_t xTicksToWait )
-{
- if( xSemaphoreTake( xTxMutex, xTicksToWait ) == pdPASS )
- {
- xSerialPutChar( xPort, cChar, xTicksToWait );
- xSemaphoreGive( xTxMutex );
- }
-}
-/*-----------------------------------------------------------*/
diff --git a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/UDPCommandConsole.c b/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/UDPCommandConsole.c
deleted file mode 100644
index ffec1a0..0000000
--- a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/UDPCommandConsole.c
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
- All rights reserved
-
- VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
-
- This file is part of the FreeRTOS distribution.
-
- FreeRTOS is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License (version 2) as published by the
- Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
-
- ***************************************************************************
- >>! NOTE: The modification to the GPL is included to allow you to !<<
- >>! distribute a combined work that includes FreeRTOS without being !<<
- >>! obliged to provide the source code for proprietary components !<<
- >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
-
- FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. Full license text is available on the following
- link: http://www.freertos.org/a00114.html
-
- ***************************************************************************
- * *
- * FreeRTOS provides completely free yet professionally developed, *
- * robust, strictly quality controlled, supported, and cross *
- * platform software that is more than just the market leader, it *
- * is the industry's de facto standard. *
- * *
- * Help yourself get started quickly while simultaneously helping *
- * to support the FreeRTOS project by purchasing a FreeRTOS *
- * tutorial book, reference manual, or both: *
- * http://www.FreeRTOS.org/Documentation *
- * *
- ***************************************************************************
-
- http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
- the FAQ page "My application does not run, what could be wrong?". Have you
- defined configASSERT()?
-
- http://www.FreeRTOS.org/support - In return for receiving this top quality
- embedded software for free we request you assist our global community by
- participating in the support forum.
-
- http://www.FreeRTOS.org/training - Investing in training allows your team to
- be as productive as possible as early as possible. Now you can receive
- FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
- Ltd, and the world's leading authority on the world's leading RTOS.
-
- http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
- including FreeRTOS+Trace - an indispensable productivity tool, a DOS
- compatible FAT file system, and our tiny thread aware UDP/IP stack.
-
- http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
- Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
-
- http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
- Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
- licenses offer ticketed support, indemnification and commercial middleware.
-
- http://www.SafeRTOS.com - High Integrity Systems also provide a safety
- engineered and independently SIL3 certified version for use in safety and
- mission critical applications that require provable dependability.
-
- 1 tab == 4 spaces!
-*/
-
-/* Standard includes. */
-#include <stdint.h>
-#include <stdio.h>
-#include <stdarg.h>
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-#include "task.h"
-#include "semphr.h"
-
-/* FreeRTOS+CLI includes. */
-#include "FreeRTOS_CLI.h"
-
-/* FreeRTOS+TCP includes. */
-#include "FreeRTOS_IP.h"
-#include "FreeRTOS_Sockets.h"
-
-/* Demo app includes. */
-#include "UDPCommandConsole.h"
-
-/* Dimensions the buffer into which input characters are placed. */
-#define cmdMAX_INPUT_SIZE 60
-
-/* Dimensions the buffer into which string outputs can be placed. */
-#define cmdMAX_OUTPUT_SIZE 1024
-
-/* Dimensions the buffer passed to the recvfrom() call. */
-#define cmdSOCKET_INPUT_BUFFER_SIZE 60
-
-/* DEL acts as a backspace. */
-#define cmdASCII_DEL ( 0x7F )
-
-/* The socket used by the CLI and debug print messages. */
-static Socket_t xSocket = FREERTOS_INVALID_SOCKET;
-
-/*
- * The task that runs FreeRTOS+CLI.
- */
-static void prvUDPCommandInterpreterTask( void *pvParameters );
-
-/*
- * Open and configure the UDP socket.
- */
-static Socket_t prvOpenUDPServerSocket( uint16_t usPort );
-
-/*-----------------------------------------------------------*/
-
-/* This is required as a parameter to maintain the sendto() Berkeley sockets
-API - but it is not actually used so can take any value. */
-static socklen_t xClientAddressLength = 0;
-
-/* Const messages output by the command console. */
-static const char * const pcEndOfOutputMessage = "\r\n[Press ENTER to execute the previous command again]\r\n>";
-static const char * const pcNewLine = "\r\n";
-
-/*-----------------------------------------------------------*/
-
-void vStartUDPCommandInterpreterTask( uint16_t usStackSize, uint32_t ulPort, UBaseType_t uxPriority )
-{
- xTaskCreate( prvUDPCommandInterpreterTask, "UDP CLI", usStackSize, ( void * ) ulPort, uxPriority, NULL );
-}
-/*-----------------------------------------------------------*/
-
-void prvUDPCommandInterpreterTask( void *pvParameters )
-{
-int32_t lBytes, lByte;
-char cRxedChar, cInputIndex = 0;
-static char cOutputString[ cmdMAX_OUTPUT_SIZE ], cLocalBuffer[ cmdSOCKET_INPUT_BUFFER_SIZE ];
-static char cLastInputString[ cmdMAX_INPUT_SIZE ], cInputString[ cmdMAX_INPUT_SIZE ];
-BaseType_t xMoreDataToFollow;
-struct freertos_sockaddr xClient;
-
- memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );
-
- /* Attempt to open the socket. The port number is passed in the task
- parameter. The strange casting is to remove compiler warnings on 32-bit
- machines. */
- xSocket = prvOpenUDPServerSocket( ( uint16_t ) ( ( uint32_t ) pvParameters ) & 0xffffUL );
-
- if( xSocket != FREERTOS_INVALID_SOCKET )
- {
- for( ;; )
- {
- /* Wait for incoming data on the opened socket. */
- lBytes = FreeRTOS_recvfrom( xSocket, ( void * ) cLocalBuffer, sizeof( cLocalBuffer ), 0, &xClient, &xClientAddressLength );
-
- if( lBytes > 0 )
- {
- /* Process each received byte in turn. */
- lByte = 0;
- while( lByte < lBytes )
- {
- /* The next character in the input buffer. */
- cRxedChar = cLocalBuffer[ lByte ];
- lByte++;
-
- /* Newline characters are taken as the end of the command
- string. */
- if( cRxedChar == '\n' )
- {
- /* Just to space the output from the input. */
- FreeRTOS_sendto( xSocket, pcNewLine, strlen( pcNewLine ), 0, &xClient, xClientAddressLength );
-
- /* See if the command is empty, indicating that the last command
- is to be executed again. */
- if( cInputIndex == 0 )
- {
- /* Copy the last command back into the input string. */
- strcpy( cInputString, cLastInputString );
- }
-
- /* Process the input string received prior to the
- newline. */
- do
- {
- /* Pass the string to FreeRTOS+CLI. */
- cOutputString[ 0 ] = 0x00;
- xMoreDataToFollow = FreeRTOS_CLIProcessCommand( cInputString, cOutputString, cmdMAX_OUTPUT_SIZE );
-
- /* Send the output generated by the command's
- implementation. */
- FreeRTOS_sendto( xSocket, cOutputString, strlen( ( const char * ) cOutputString ), 0, &xClient, xClientAddressLength );
-
- /* Until the command does not generate any more output. */
- } while( xMoreDataToFollow != pdFALSE );
-
- /* All the strings generated by the command processing
- have been sent. Clear the input string ready to receive
- the next command. Remember the previous command so it
- can be repeated if the user just presses the ENTER key. */
- strcpy( cLastInputString, cInputString );
- cInputIndex = 0;
- memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );
-
- /* Transmit a spacer to make the console easier to
- read. */
- FreeRTOS_sendto( xSocket, ( void * ) pcEndOfOutputMessage, strlen( pcEndOfOutputMessage ), 0, &xClient, xClientAddressLength );
- }
- else
- {
- if( cRxedChar == '\r' )
- {
- /* Ignore the character. Newlines are used to
- detect the end of the input string. */
- }
- else if( ( cRxedChar == '\b' ) || ( cRxedChar == cmdASCII_DEL ) )
- {
- /* Backspace was pressed. Erase the last character
- in the string - if any. */
- if( cInputIndex > 0 )
- {
- cInputIndex--;
- cInputString[ ( int ) cInputIndex ] = '\0';
- }
- }
- else
- {
- /* A character was entered. Add it to the string
- entered so far. When a \n is entered the complete
- string will be passed to the command interpreter. */
- if( cInputIndex < cmdMAX_INPUT_SIZE )
- {
- cInputString[ ( int ) cInputIndex ] = cRxedChar;
- cInputIndex++;
- }
- }
- }
- }
- }
- }
- }
- else
- {
- /* The socket could not be opened. */
- vTaskDelete( NULL );
- }
-}
-/*-----------------------------------------------------------*/
-
-static Socket_t prvOpenUDPServerSocket( uint16_t usPort )
-{
-struct freertos_sockaddr xServer;
-Socket_t xServerSocket = FREERTOS_INVALID_SOCKET;
-TickType_t xSendTimeOut = 0;
-
- xServerSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP );
- if( xServerSocket != FREERTOS_INVALID_SOCKET)
- {
- /* Set to non-blocking sends with a timeout of zero as the socket might
- also be used for debug prints which should not block. */
- FreeRTOS_setsockopt( xServerSocket, 0, FREERTOS_SO_SNDTIMEO, &xSendTimeOut, sizeof( xSendTimeOut ) );
-
- /* Zero out the server structure. */
- memset( ( void * ) &xServer, 0x00, sizeof( xServer ) );
-
- /* Set family and port. */
- xServer.sin_port = FreeRTOS_htons( usPort );
-
- /* Bind the address to the socket. */
- if( FreeRTOS_bind( xServerSocket, &xServer, sizeof( xServer ) ) == -1 )
- {
- FreeRTOS_closesocket( xServerSocket );
- xServerSocket = FREERTOS_INVALID_SOCKET;
- }
- }
-
- return xServerSocket;
-}
-/*-----------------------------------------------------------*/
-
diff --git a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/include/TCPCommandConsole.h b/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/include/TCPCommandConsole.h
deleted file mode 100644
index 290fbff..0000000
--- a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/include/TCPCommandConsole.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
- All rights reserved
-
- VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
-
- This file is part of the FreeRTOS distribution.
-
- FreeRTOS is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License (version 2) as published by the
- Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
-
- ***************************************************************************
- >>! NOTE: The modification to the GPL is included to allow you to !<<
- >>! distribute a combined work that includes FreeRTOS without being !<<
- >>! obliged to provide the source code for proprietary components !<<
- >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
-
- FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. Full license text is available on the following
- link: http://www.freertos.org/a00114.html
-
- ***************************************************************************
- * *
- * FreeRTOS provides completely free yet professionally developed, *
- * robust, strictly quality controlled, supported, and cross *
- * platform software that is more than just the market leader, it *
- * is the industry's de facto standard. *
- * *
- * Help yourself get started quickly while simultaneously helping *
- * to support the FreeRTOS project by purchasing a FreeRTOS *
- * tutorial book, reference manual, or both: *
- * http://www.FreeRTOS.org/Documentation *
- * *
- ***************************************************************************
-
- http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
- the FAQ page "My application does not run, what could be wrong?". Have you
- defined configASSERT()?
-
- http://www.FreeRTOS.org/support - In return for receiving this top quality
- embedded software for free we request you assist our global community by
- participating in the support forum.
-
- http://www.FreeRTOS.org/training - Investing in training allows your team to
- be as productive as possible as early as possible. Now you can receive
- FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
- Ltd, and the world's leading authority on the world's leading RTOS.
-
- http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
- including FreeRTOS+Trace - an indispensable productivity tool, a DOS
- compatible FAT file system, and our tiny thread aware UDP/IP stack.
-
- http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
- Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
-
- http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
- Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
- licenses offer ticketed support, indemnification and commercial middleware.
-
- http://www.SafeRTOS.com - High Integrity Systems also provide a safety
- engineered and independently SIL3 certified version for use in safety and
- mission critical applications that require provable dependability.
-
- 1 tab == 4 spaces!
-*/
-
-#ifndef TCP_COMMAND_INTERPRETER_H
-#define TCP_COMMAND_INTERPRETER_H
-
-void vStartTCPCommandInterpreterTask( uint16_t usStackSize, uint32_t ulPort, UBaseType_t uxPriority );
-
-#endif /* TCP_COMMAND_INTERPRETER_H */
diff --git a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/include/UDPCommandConsole.h b/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/include/UDPCommandConsole.h
deleted file mode 100644
index ccea0df..0000000
--- a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_CLI_Demos/include/UDPCommandConsole.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
- All rights reserved
-
- VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
-
- This file is part of the FreeRTOS distribution.
-
- FreeRTOS is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License (version 2) as published by the
- Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
-
- ***************************************************************************
- >>! NOTE: The modification to the GPL is included to allow you to !<<
- >>! distribute a combined work that includes FreeRTOS without being !<<
- >>! obliged to provide the source code for proprietary components !<<
- >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
-
- FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. Full license text is available on the following
- link: http://www.freertos.org/a00114.html
-
- ***************************************************************************
- * *
- * FreeRTOS provides completely free yet professionally developed, *
- * robust, strictly quality controlled, supported, and cross *
- * platform software that is more than just the market leader, it *
- * is the industry's de facto standard. *
- * *
- * Help yourself get started quickly while simultaneously helping *
- * to support the FreeRTOS project by purchasing a FreeRTOS *
- * tutorial book, reference manual, or both: *
- * http://www.FreeRTOS.org/Documentation *
- * *
- ***************************************************************************
-
- http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
- the FAQ page "My application does not run, what could be wrong?". Have you
- defined configASSERT()?
-
- http://www.FreeRTOS.org/support - In return for receiving this top quality
- embedded software for free we request you assist our global community by
- participating in the support forum.
-
- http://www.FreeRTOS.org/training - Investing in training allows your team to
- be as productive as possible as early as possible. Now you can receive
- FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
- Ltd, and the world's leading authority on the world's leading RTOS.
-
- http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
- including FreeRTOS+Trace - an indispensable productivity tool, a DOS
- compatible FAT file system, and our tiny thread aware UDP/IP stack.
-
- http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
- Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
-
- http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
- Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
- licenses offer ticketed support, indemnification and commercial middleware.
-
- http://www.SafeRTOS.com - High Integrity Systems also provide a safety
- engineered and independently SIL3 certified version for use in safety and
- mission critical applications that require provable dependability.
-
- 1 tab == 4 spaces!
-*/
-
-#ifndef UDP_COMMAND_INTERPRETER_H
-#define UDP_COMMAND_INTERPRETER_H
-
-void vStartUDPCommandInterpreterTask( uint16_t usStackSize, uint32_t ulPort, UBaseType_t uxPriority );
-
-#endif /* UDP_COMMAND_INTERPRETER_H */
diff --git a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_FAT_Demos/CreateAndVerifyExampleFiles.c b/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_FAT_Demos/CreateAndVerifyExampleFiles.c
deleted file mode 100644
index 05fe75e..0000000
--- a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_FAT_Demos/CreateAndVerifyExampleFiles.c
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
- All rights reserved
-
- VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
-
- This file is part of the FreeRTOS distribution.
-
- FreeRTOS is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License (version 2) as published by the
- Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
-
- ***************************************************************************
- >>! NOTE: The modification to the GPL is included to allow you to !<<
- >>! distribute a combined work that includes FreeRTOS without being !<<
- >>! obliged to provide the source code for proprietary components !<<
- >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
-
- FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. Full license text is available on the following
- link: http://www.freertos.org/a00114.html
-
- ***************************************************************************
- * *
- * FreeRTOS provides completely free yet professionally developed, *
- * robust, strictly quality controlled, supported, and cross *
- * platform software that is more than just the market leader, it *
- * is the industry's de facto standard. *
- * *
- * Help yourself get started quickly while simultaneously helping *
- * to support the FreeRTOS project by purchasing a FreeRTOS *
- * tutorial book, reference manual, or both: *
- * http://www.FreeRTOS.org/Documentation *
- * *
- ***************************************************************************
-
- http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
- the FAQ page "My application does not run, what could be wrong?". Have you
- defined configASSERT()?
-
- http://www.FreeRTOS.org/support - In return for receiving this top quality
- embedded software for free we request you assist our global community by
- participating in the support forum.
-
- http://www.FreeRTOS.org/training - Investing in training allows your team to
- be as productive as possible as early as possible. Now you can receive
- FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
- Ltd, and the world's leading authority on the world's leading RTOS.
-
- http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
- including FreeRTOS+Trace - an indispensable productivity tool, a DOS
- compatible FAT file system, and our tiny thread aware UDP/IP stack.
-
- http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
- Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
-
- http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
- Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
- licenses offer ticketed support, indemnification and commercial middleware.
-
- http://www.SafeRTOS.com - High Integrity Systems also provide a safety
- engineered and independently SIL3 certified version for use in safety and
- mission critical applications that require provable dependability.
-
- 1 tab == 4 spaces!
-*/
-
-
-/*
- * Create and verify a few example files using both line based and character
- * based reads and writes.
- */
-
-/* FreeRTOS+FAT headers. */
-#include "ff_headers.h"
-#include "ff_stdio.h"
-
-/* FTP headers. */
-#include "FreeRTOSIPConfig.h"
-
-/* Demo headers. */
-#include "DefaultWebPages.h"
-
-/* The number of bytes read/written to the example files at a time. */
-#define fsRAM_BUFFER_SIZE 200
-
-/* The number of bytes written to the file that uses f_putc() and f_getc(). */
-#define fsPUTC_FILE_SIZE 100
-
-/*
- * Create a set of example files in the root directory of the volume using
- * ff_fwrite().
- */
-static void prvCreateDemoFilesUsing_ff_fwrite( const char *pcMountPath );
-
-/*
- * Use ff_fread() to read back and verify the files that were created by
- * prvCreateDemoFilesUsing_ff_fwrite().
- */
-static void prvVerifyDemoFileUsing_ff_fread( void );
-
-/*
- * Create an example file in a sub-directory using f_putc().
- */
-static void prvCreateDemoFileUsing_ff_fputc( const char *pcMountPath );
-
-/*
- * Use f_getc() to read back and verify the file that was created by
- * prvCreateDemoFileUsing_f_putc().
- */
-static void prvVerifyDemoFileUsing_ff_fgetc( const char *pcMountPath );
-
-/*
- * Create the configHTTP_ROOT directory, and add a basic default web page.
- */
-#if( ipconfigUSE_HTTP == 1 )
-
- #ifndef configHTTP_ROOT
- #error configHTTP_ROOT must be defined to a string that holds the directory to be used as the root for the HTTP server
- #endif
-
- static void prvCreateDefaultWebPage( void );
-
-#endif /* ipconfigUSE_HTTP */
-
-/* Names of directories that are created. */
-static const char *pcDirectory1 = "SUB1", *pcDirectory2 = "SUB2", *pcFullPath = "/SUB1/SUB2";
-
-/*-----------------------------------------------------------*/
-
-void vCreateAndVerifyExampleFiles( const char *pcMountPath )
-{
- /* Create and verify a few example files using both line based and character
- based reads and writes. */
- prvCreateDemoFilesUsing_ff_fwrite( pcMountPath );
- prvVerifyDemoFileUsing_ff_fread();
- prvCreateDemoFileUsing_ff_fputc( pcMountPath );
- prvVerifyDemoFileUsing_ff_fgetc( pcMountPath );
-
- #if( ipconfigUSE_HTTP == 1 )
- {
- prvCreateDefaultWebPage();
- }
- #endif /* ipconfigUSE_HTTP */
-}
-/*-----------------------------------------------------------*/
-
-static void prvCreateDemoFilesUsing_ff_fwrite( const char *pcMountPath )
-{
-BaseType_t xFileNumber, xWriteNumber;
-const BaseType_t xMaxFiles = 5;
-int32_t lItemsWritten;
-int32_t lResult;
-FF_FILE *pxFile;
-char *pcRAMBuffer, *pcFileName;
-
- /* Allocate buffers used to hold date written to/from the disk, and the
- file names. */
- pcRAMBuffer = ( char * ) pvPortMalloc( fsRAM_BUFFER_SIZE );
- pcFileName = ( char * ) pvPortMalloc( ffconfigMAX_FILENAME );
- configASSERT( pcRAMBuffer );
- configASSERT( pcFileName );
-
- /* Ensure in the root of the mount being used. */
- lResult = ff_chdir( pcMountPath );
- configASSERT( lResult >= 0 );
-
- /* Create xMaxFiles files. Each created file will be
- ( xFileNumber * fsRAM_BUFFER_SIZE ) bytes in length, and filled
- with a different repeating character. */
- for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ )
- {
- /* Generate a file name. */
- snprintf( pcFileName, ffconfigMAX_FILENAME, "root%03d.txt", ( int ) xFileNumber );
-
- /* Obtain the current working directory and print out the file name and
- the directory into which the file is being written. */
- ff_getcwd( pcRAMBuffer, fsRAM_BUFFER_SIZE );
- FF_PRINTF( "Creating file %s in %s\n", pcFileName, pcRAMBuffer );
-
- /* Open the file, creating the file if it does not already exist. */
- pxFile = ff_fopen( pcFileName, "w" );
- configASSERT( pxFile );
-
- /* Fill the RAM buffer with data that will be written to the file. This
- is just a repeating ascii character that indicates the file number. */
- memset( pcRAMBuffer, ( int ) ( '0' + xFileNumber ), fsRAM_BUFFER_SIZE );
-
- /* Write the RAM buffer to the opened file a number of times. The
- number of times the RAM buffer is written to the file depends on the
- file number, so the length of each created file will be different. */
- for( xWriteNumber = 0; xWriteNumber < xFileNumber; xWriteNumber++ )
- {
- lItemsWritten = ff_fwrite( pcRAMBuffer, fsRAM_BUFFER_SIZE, 1, pxFile );
- configASSERT( lItemsWritten == 1 );
- }
-
- /* Close the file so another file can be created. */
- ff_fclose( pxFile );
- }
-
- vPortFree( pcRAMBuffer );
- vPortFree( pcFileName );
-}
-/*-----------------------------------------------------------*/
-
-static void prvVerifyDemoFileUsing_ff_fread( void )
-{
-BaseType_t xFileNumber, xReadNumber;
-const BaseType_t xMaxFiles = 5;
-size_t xItemsRead, xChar;
-FF_FILE *pxFile;
-char *pcRAMBuffer, *pcFileName;
-
- /* Allocate buffers used to hold date written to/from the disk, and the
- file names. */
- pcRAMBuffer = ( char * ) pvPortMalloc( fsRAM_BUFFER_SIZE );
- pcFileName = ( char * ) pvPortMalloc( ffconfigMAX_FILENAME );
- configASSERT( pcRAMBuffer );
- configASSERT( pcFileName );
-
- /* Read back the files that were created by
- prvCreateDemoFilesUsing_ff_fwrite(). */
- for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ )
- {
- /* Generate the file name. */
- snprintf( pcFileName, ffconfigMAX_FILENAME, "root%03d.txt", ( int ) xFileNumber );
-
- /* Obtain the current working directory and print out the file name and
- the directory from which the file is being read. */
- ff_getcwd( pcRAMBuffer, fsRAM_BUFFER_SIZE );
- FF_PRINTF( "Reading file %s from %s\n", pcFileName, pcRAMBuffer );
-
- /* Open the file for reading. */
- pxFile = ff_fopen( pcFileName, "r" );
- configASSERT( pxFile );
-
- /* Read the file into the RAM buffer, checking the file contents are as
- expected. The size of the file depends on the file number. */
- for( xReadNumber = 0; xReadNumber < xFileNumber; xReadNumber++ )
- {
- /* Start with the RAM buffer clear. */
- memset( pcRAMBuffer, 0x00, fsRAM_BUFFER_SIZE );
-
- xItemsRead = ff_fread( pcRAMBuffer, fsRAM_BUFFER_SIZE, 1, pxFile );
- configASSERT( xItemsRead == 1 );
-
- /* Check the RAM buffer is filled with the expected data. Each
- file contains a different repeating ascii character that indicates
- the number of the file. */
- for( xChar = 0; xChar < fsRAM_BUFFER_SIZE; xChar++ )
- {
- configASSERT( pcRAMBuffer[ xChar ] == ( '0' + ( char ) xFileNumber ) );
- }
- }
-
- /* Close the file. */
- ff_fclose( pxFile );
- }
-
- vPortFree( pcRAMBuffer );
- vPortFree( pcFileName );
-
- /*_RB_ also test what happens when attempting to read using too large item
- sizes, etc. */
-}
-/*-----------------------------------------------------------*/
-
-static void prvCreateDemoFileUsing_ff_fputc( const char *pcMountPath )
-{
-int32_t iReturn, iByte, iReturned;
-FF_FILE *pxFile;
-char *pcRAMBuffer, *pcFileName;
-
- /* Allocate buffers used to hold date written to/from the disk, and the
- file names. */
- pcRAMBuffer = ( char * ) pvPortMalloc( fsRAM_BUFFER_SIZE );
- pcFileName = ( char * ) pvPortMalloc( ffconfigMAX_FILENAME );
- configASSERT( pcRAMBuffer );
- configASSERT( pcFileName );
-
- /* Obtain and print out the working directory. */
- ff_getcwd( pcRAMBuffer, fsRAM_BUFFER_SIZE );
- FF_PRINTF( "In directory %s\n", pcRAMBuffer );
-
- /* Create a sub directory. */
- iReturn = ff_mkdir( pcDirectory1 );
- configASSERT( iReturn == pdFREERTOS_ERRNO_NONE );
-
- /* Move into the created sub-directory. */
- iReturn = ff_chdir( pcDirectory1 );
- configASSERT( iReturn == pdFREERTOS_ERRNO_NONE );
-
- /* Obtain and print out the working directory. */
- ff_getcwd( pcRAMBuffer, fsRAM_BUFFER_SIZE );
- FF_PRINTF( "In directory %s\n", pcRAMBuffer );
-
- /* Create a subdirectory in the new directory. */
- iReturn = ff_mkdir( pcDirectory2 );
- configASSERT( iReturn == pdFREERTOS_ERRNO_NONE );
-
- /* Move into the directory just created - now two directories down from
- the root. */
- iReturn = ff_chdir( pcDirectory2 );
- configASSERT( iReturn == pdFREERTOS_ERRNO_NONE );
-
- /* Obtain and print out the working directory. */
- ff_getcwd( pcRAMBuffer, fsRAM_BUFFER_SIZE );
- FF_PRINTF( "In directory %s\n", pcRAMBuffer );
- snprintf( pcFileName, ffconfigMAX_FILENAME, "%s%s", pcMountPath, pcFullPath );
- configASSERT( strcmp( pcRAMBuffer, pcFileName ) == 0 );
-
- /* Generate the file name. */
- snprintf( pcFileName, ffconfigMAX_FILENAME, "%s.txt", pcDirectory2 );
-
- /* Print out the file name and the directory into which the file is being
- written. */
- FF_PRINTF( "Writing file %s in %s\n", pcFileName, pcRAMBuffer );
-
- pxFile = ff_fopen( pcFileName, "w" );
- configASSERT( pxFile );
-
- /* Create a file 1 byte at a time. The file is filled with incrementing
- ascii characters starting from '0'. */
- for( iByte = 0; iByte < fsPUTC_FILE_SIZE; iByte++ )
- {
- iReturned = ff_fputc( ( ( int ) '0' + iByte ), pxFile );
- configASSERT( iReturned == ( ( int ) '0' + iByte ) );
- }
-
- /* Finished so close the file. */
- ff_fclose( pxFile );
-
- /* Move back to the root directory. */
- iReturned = ff_chdir( "../.." );
- configASSERT( iReturn == pdFREERTOS_ERRNO_NONE );
-
- /* Obtain and print out the working directory. */
- ff_getcwd( pcRAMBuffer, fsRAM_BUFFER_SIZE );
- FF_PRINTF( "Back in root directory %s\n", pcRAMBuffer );
- configASSERT( strcmp( pcRAMBuffer, pcMountPath ) == 0 );
-
- vPortFree( pcRAMBuffer );
- vPortFree( pcFileName );
-}
-/*-----------------------------------------------------------*/
-
-static void prvVerifyDemoFileUsing_ff_fgetc( const char *pcMountPath )
-{
-int iByte, iReturned;
-FF_FILE *pxFile;
-char *pcRAMBuffer, *pcFileName;
-
- /* Allocate buffers used to hold date written to/from the disk, and the
- file names. */
- pcRAMBuffer = ( char * ) pvPortMalloc( fsRAM_BUFFER_SIZE );
- pcFileName = ( char * ) pvPortMalloc( ffconfigMAX_FILENAME );
- configASSERT( pcRAMBuffer );
- configASSERT( pcFileName );
-
- /* Move into the directory in which the file was created. */
- snprintf( pcFileName, ffconfigMAX_FILENAME, "%s%s", pcMountPath, pcFullPath );
- iReturned = ff_chdir( pcFileName );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
-
- /* Obtain and print out the working directory. */
- ff_getcwd( pcRAMBuffer, fsRAM_BUFFER_SIZE );
- FF_PRINTF( "Back in directory %s\n", pcRAMBuffer );
- configASSERT( strcmp( pcRAMBuffer, pcFileName ) == 0 );
-
- /* pcFileName is about to be overwritten - take a copy. */
- strcpy( pcRAMBuffer, pcFileName );
-
- /* Generate the file name. */
- sprintf( pcFileName, "%s.txt", pcDirectory2 );
-
- /* Print out the file name and the directory from which the file is being
- read. */
- FF_PRINTF( "Reading file %s in %s\n", pcFileName, pcRAMBuffer );
-
- /* This time the file is opened for reading. */
- pxFile = ff_fopen( pcFileName, "r" );
-
- /* Read the file 1 byte at a time. */
- for( iByte = 0; iByte < fsPUTC_FILE_SIZE; iByte++ )
- {
- iReturned = ff_fgetc( pxFile );
- configASSERT( iReturned == ( ( int ) '0' + iByte ) );
- }
-
- /* Should not be able to read another bytes. */
- iReturned = ff_fgetc( pxFile );
- configASSERT( iReturned == FF_EOF );
-
- /* Finished so close the file. */
- ff_fclose( pxFile );
-
- /* Move back to the root directory. */
- iReturned = ff_chdir( "../.." );
-
- /* Obtain and print out the working directory. */
- ff_getcwd( pcRAMBuffer, fsRAM_BUFFER_SIZE );
- FF_PRINTF( "Back in root directory %s\n", pcRAMBuffer );
-
- vPortFree( pcRAMBuffer );
- vPortFree( pcFileName );
-}
-/*-----------------------------------------------------------*/
-
-#if( ipconfigUSE_HTTP == 1 )
-
- static void prvCreateDefaultWebPage( void )
- {
- int iReturned;
- size_t x;
- FF_FILE *pxFile;
-
- /* Create the directory used as the root of the HTTP server. */
- iReturned = ff_mkdir( configHTTP_ROOT );
-
- if( iReturned == pdFREERTOS_ERRNO_NONE )
- {
- /* Move into the configHTTP_ROOT directory. */
- ff_chdir( configHTTP_ROOT );
-
- /* Create each file defined by the xHTTPFilesToCopy array, which is
- defined in DefaultWebPages.h. */
- for( x = 0; x < sizeof( xHTTPFilesToCopy ) / sizeof( xFileToCopy_t ); x++ )
- {
- /* Create the file. */
- pxFile = ff_fopen( xHTTPFilesToCopy[ x ].pcFileName, "w+" );
-
- if( pxFile != NULL )
- {
- /* Write out all the data to the file. */
- ff_fwrite( xHTTPFilesToCopy[ x ].pucFileData,
- xHTTPFilesToCopy[ x ].xFileSize,
- 1,
- pxFile );
-
- ff_fclose( pxFile );
- }
- }
- }
- }
-
-#endif /* ipconfigUSE_HTTP */
-/*-----------------------------------------------------------*/
-
diff --git a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_FAT_Demos/test/ff_stdio_tests_with_cwd.c b/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_FAT_Demos/test/ff_stdio_tests_with_cwd.c
deleted file mode 100644
index cc23627..0000000
--- a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_FAT_Demos/test/ff_stdio_tests_with_cwd.c
+++ /dev/null
@@ -1,1194 +0,0 @@
-/*
- FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
- All rights reserved
-
- VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
-
- This file is part of the FreeRTOS distribution.
-
- FreeRTOS is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License (version 2) as published by the
- Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
-
- ***************************************************************************
- >>! NOTE: The modification to the GPL is included to allow you to !<<
- >>! distribute a combined work that includes FreeRTOS without being !<<
- >>! obliged to provide the source code for proprietary components !<<
- >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
-
- FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. Full license text is available on the following
- link: http://www.freertos.org/a00114.html
-
- ***************************************************************************
- * *
- * FreeRTOS provides completely free yet professionally developed, *
- * robust, strictly quality controlled, supported, and cross *
- * platform software that is more than just the market leader, it *
- * is the industry's de facto standard. *
- * *
- * Help yourself get started quickly while simultaneously helping *
- * to support the FreeRTOS project by purchasing a FreeRTOS *
- * tutorial book, reference manual, or both: *
- * http://www.FreeRTOS.org/Documentation *
- * *
- ***************************************************************************
-
- http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
- the FAQ page "My application does not run, what could be wrong?". Have you
- defined configASSERT()?
-
- http://www.FreeRTOS.org/support - In return for receiving this top quality
- embedded software for free we request you assist our global community by
- participating in the support forum.
-
- http://www.FreeRTOS.org/training - Investing in training allows your team to
- be as productive as possible as early as possible. Now you can receive
- FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
- Ltd, and the world's leading authority on the world's leading RTOS.
-
- http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
- including FreeRTOS+Trace - an indispensable productivity tool, a DOS
- compatible FAT file system, and our tiny thread aware UDP/IP stack.
-
- http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
- Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
-
- http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
- Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
- licenses offer ticketed support, indemnification and commercial middleware.
-
- http://www.SafeRTOS.com - High Integrity Systems also provide a safety
- engineered and independently SIL3 certified version for use in safety and
- mission critical applications that require provable dependability.
-
- 1 tab == 4 spaces!
-*/
-
-/*
- * Non-systematic sanity checks for the API defined in ff_stdio.c.
- */
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-
-/* FreeRTOS+FAT headers. */
-#include "ff_headers.h"
-#include "ff_stdio.h"
-
-/* The number of bytes read/written to the example files at a time. */
-#define fsRAM_BUFFER_SIZE 200
-
-/* The number of bytes written to the file that uses f_putc() and f_getc(). */
-#define fsPUTC_FILE_SIZE 100
-
-/* The number of tasks to create if the stdio tests will be executed in
-multiple tasks simultaneously. */
-#define fsTASKS_TO_CREATE 5
-
-/*
- * Examples and basic tests of the ff_truncate() function.
- */
-static void prvTest_ff_truncate( const char *pcMountPath );
-
-/*
- * Examples and basic tests of the ff_findNNN() functions.
- */
-static void prvTest_ff_findfirst_ff_findnext_ff_findclose( const char *pcMountPath );
-
-/*
- * Examples and basic tests of the ff_fopen() function.
- */
-static void prvTest_ff_fopen( const char *pcMountPath );
-
-/*
- * Examples and basic tests of the ff_rename() function.
- */
-static void prvTest_ff_rename( const char *pcMountPath );
-
-/*
- * Examples and basic tests of the ff_mkdir, ff_chdir() and ff_rmdir()
- * functions.
- */
-static void prvTest_ff_fmkdir_ff_chdir_ff_rmdir( const char *pcMountPath );
-
-/*
- * Non-systematic sanity check that aligned and unaligned data can be written
- * within and across sectors.
- */
-static void prvTest_ff_fseek_ff_rewind( const char *pcMountPath );
-
-/*
- * Examples and basic tests of the ff_fgets() function.
- */
-#if( ffconfigFPRINTF_SUPPORT == 1 )
-
- static void prvTest_ff_fgets_ff_printf( const char *pcMountPath );
-
-#endif /* ffconfigFPRINTF_SUPPORT */
-
-/*
- * Non-systematic sanity check that aligned and unaligned data can be written
- * within and across sectors.
- */
-static void prvAlignmentReadWriteTests( const char *pcMountPath );
-
-/*
- * A task that repeatedly creates, tests, then deletes files as an ad hoc test
- * of accessing the file system from more than one task simultaneously.
- */
-static void prvFileSystemAccessTask( void *pvParameters );
-
-/*-----------------------------------------------------------*/
-
-void vStdioWithCWDTest( const char *pcMountPath )
-{
- /* Non-systematic sanity checks for the API defined in ff_stdio.c. */
-
- /* Must come after the prvCreateDemoFilesUsing_fwrite() and
- prvCreateDemoFileUsing_fputc() functions as it expects the files created by
- those functions to exist. */
- prvTest_ff_findfirst_ff_findnext_ff_findclose( pcMountPath );
-
- prvTest_ff_truncate( pcMountPath );
- prvTest_ff_fmkdir_ff_chdir_ff_rmdir( pcMountPath );
- prvTest_ff_fopen( pcMountPath );
- prvTest_ff_rename( pcMountPath );
- prvAlignmentReadWriteTests( pcMountPath );
- prvTest_ff_fseek_ff_rewind( pcMountPath );
-
- #if( ffconfigFPRINTF_SUPPORT == 1 )
- {
- prvTest_ff_fgets_ff_printf( pcMountPath );
- }
- #endif
-}
-/*-----------------------------------------------------------*/
-
-static void prvTest_ff_fmkdir_ff_chdir_ff_rmdir( const char *pcMountPath )
-{
-int iReturned;
-char *pcRAMBuffer, *pcFileName;
-
- /* Allocate buffers used to hold date written to/from the disk, and the
- file names. */
- pcRAMBuffer = ( char * ) pvPortMalloc( fsRAM_BUFFER_SIZE );
- pcFileName = ( char * ) pvPortMalloc( ffconfigMAX_FILENAME );
- configASSERT( pcRAMBuffer );
- configASSERT( pcFileName );
-
- /* Try changing to an invalid absolute directory. This should fail. */
- iReturned = ff_chdir( "/not_a_directory" );
- configASSERT( iReturned == -1 );
-
- /* Try changing to the root. This should not fail. */
- iReturned = ff_chdir( "/" );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
-
- /* Try changing to an invalid relative directory. This should also fail. */
- iReturned = ff_chdir( "not_a_directory" );
- configASSERT( iReturned == -1 );
-
- /* Ensure in the root of the mount being used. */
- iReturned = ff_chdir( pcMountPath );
-
- /* This time the directory should have been entered. */
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
-
- /* For test purposes, move back, then try moving to the root of the mount
- using a relative path. */
- iReturned = ff_chdir( "/" );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
-
- /* Ensure in the root of the mount being used but using a relative path,
- so move past the '/' at the beginning of pcMountPath. */
- iReturned = ff_chdir( pcMountPath + 1 );
-
- /* This time the directory should have been entered. */
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
-
- /* Create nested subdirectories from the root of the mount. */
- iReturned = ff_mkdir( "sub1" );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
- iReturned = ff_mkdir( "sub1/sub2" );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
- iReturned = ff_mkdir( "sub1/sub2/sub3" );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
- iReturned = ff_mkdir( "sub1/sub2/sub3/sub4/" );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
-
- /* This is the non-recursive version, so the following is expected to
- fail. */
- iReturned = ff_mkdir( "sub1/sub2/subx/suby" );
- configASSERT( iReturned == -1 );
-
- /* Move into sub3. */
- iReturned = ff_chdir( "sub1/sub2/sub3" );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
-
- /* Make more directories using relative paths. */
- iReturned = ff_mkdir( "../../sub2/sub3/sub4/sub5" );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
-
- /* Sub6 does not exist, expect this to fail. */
- iReturned = ff_chdir( "../../sub2/sub3/sub4/sub6" );
- configASSERT( iReturned == -1 );
-
- /* Sub5 does exist, expect this to pass. */
- iReturned = ff_chdir( "../../sub2/../../sub1/sub2/sub3/../sub3/sub4/sub5" );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
-
- /* Create a string that contains the expected CWD. */
- snprintf( pcRAMBuffer, fsRAM_BUFFER_SIZE, "%s/%s", pcMountPath, "sub1/sub2/sub3/sub4/sub5" );
-
- /* Attempt to get the CWD, but using a buffer too small. There is no room
- for the NULL terminator in the line below. */
- configASSERT( ff_getcwd( pcFileName, strlen( pcRAMBuffer ) ) == NULL );
-
- /* Ensure the CWD is as expected. */
- configASSERT( ff_getcwd( pcFileName, ffconfigMAX_FILENAME ) == pcFileName );
- configASSERT( strcmp( pcFileName, pcRAMBuffer ) == 0 );
-
- /* Should not be possible to delete a directory in the CWD (although it is
- possible to delete the CWD if it is empty!). */
- iReturned = ff_rmdir( "../../sub4" );
- configASSERT( iReturned == -1 );
-
- /* It should be possible to remove sub5 as it does not contain anything. */
- iReturned = ff_chdir( "../.." );
- configASSERT( iReturned == 0 );
- iReturned = ff_rmdir( "sub4/sub5" );
- configASSERT( iReturned == 0 );
-
- /* Should not now be possible to move to sub4/sub5. */
- iReturned = ff_chdir( "sub4/sub5" );
- configASSERT( iReturned == -1 );
-
- /* Still possible to move to sub4 though. */
- iReturned = ff_chdir( "sub4" );
- configASSERT( iReturned == 0 );
-
- vPortFree( pcRAMBuffer );
- vPortFree( pcFileName );
-}
-/*-----------------------------------------------------------*/
-
-#if( ffconfigFPRINTF_SUPPORT == 1 )
-
- static void prvTest_ff_fgets_ff_printf( const char *pcMountPath )
- {
- FF_FILE *pxFile;
- int iReturned, iString;
- const char *const pcTestFileName = "TestFile.txt";
- const char *const pcStringStart = "Test string";
- const int iMaxStrings = 1000;
- char pcReadString[ 17 ], pcExpectedString[ 17 ], *pcReturned;
- const char *pcMaximumStringLength = "Test string 999\n";
-
- /* For coverage this test wants the buffers to be exactly equal to the
- maximum string length. A one is added as the string must also hold the
- null terminator. */
- configASSERT( ( strlen( pcMaximumStringLength ) + 1 ) == sizeof( pcReadString ) );
-
- /* Move to the root of the mount. */
- iReturned = ff_chdir( pcMountPath );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
-
- /* Open a test file for writing. */
- pxFile = ff_fopen( pcTestFileName, "w+" );
- configASSERT( pxFile );
-
- /* Write the strings to the file. */
- for( iString = 0; iString < iMaxStrings; iString++ )
- {
- /* Call ff_fprintf() to write the formatted string to the file. */
- iReturned = ff_fprintf( pxFile, "%s %d\n", pcStringStart, iString );
-
- /* Generate the expected string so the return value of ff_fprintf()
- can be checked. */
- sprintf( pcExpectedString, "%s %d\n", pcStringStart, iString );
- configASSERT( iReturned == ( int ) strlen( pcExpectedString ) );
- }
-
- /* Read back and check the strings. */
- ff_rewind( pxFile );
- configASSERT( ff_ftell( pxFile ) == 0 );
-
- for( iString = 0; iString < iMaxStrings; iString++ )
- {
- /* Generate the expected string. */
- sprintf( pcExpectedString, "%s %d\n", pcStringStart, iString );
-
- /* Read back the next string. */
- memset( pcReadString, 0x00, sizeof( pcReadString ) );
- pcReturned = ff_fgets( pcReadString, sizeof( pcReadString ), pxFile );
-
- /* The string should have been read back successfully. */
- configASSERT( pcReturned == pcReadString );
- configASSERT( strcmp( pcReadString, pcExpectedString ) == 0 );
- }
-
- /* Should be at the end of the file now. */
- configASSERT( ff_feof( pxFile ) != 0 );
-
- /* Asking for one byte should always pass because the single byte will
- just be the NULL terminator, but asking for two bytes should fail as the
- EOF has been reached. */
- configASSERT( ff_fgets( pcReadString, 1, pxFile ) == pcReadString );
- configASSERT( strlen( pcReadString ) == 0 );
- configASSERT( ff_fgets( pcReadString, 2, pxFile ) == NULL );
-
- /* Back to the start. */
- configASSERT( ff_feof( pxFile ) != 0 );
- iReturned = ff_fseek( pxFile, 0, FF_SEEK_SET );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
- configASSERT( ff_ftell( pxFile ) == 0 );
- configASSERT( ff_feof( pxFile ) == 0 );
-
- /* This time don't read all the way to a newline. Just read the string
- without the number on the end. The +1 is included to accommodate the
- NULL terminator. */
- pcReturned = ff_fgets( pcReadString, strlen( pcStringStart ) + 1, pxFile );
-
- /* The read should have been successful. */
- configASSERT( pcReturned == pcReadString );
- configASSERT( strcmp( pcReadString, pcStringStart ) == 0 );
-
- /* Move to the end of the file. */
- iReturned = ff_fseek( pxFile, 0, FF_SEEK_END );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
-
- /* Write a string without a \n on the end. */
- ff_fprintf( pxFile, pcStringStart );
-
- /* Now seek back and read some characters while attempting to read off
- the end of the file. */
- iReturned = ff_fseek( pxFile, 0 - (int ) strlen( pcStringStart ), FF_SEEK_CUR );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
-
- pcReturned = ff_fgets( pcReadString, sizeof( pcReadString ), pxFile );
- /* pcReturned will contain the last string "Test string", without a linefeed. */
- configASSERT( pcReturned == pcReadString );
- configASSERT( strcmp( pcReadString, pcStringStart ) == 0 );
-
- pcReturned = ff_fgets( pcReadString, sizeof( pcReadString ), pxFile );
- /* pcReturned will be NULL because EOF has been reached. */
- configASSERT( pcReturned == NULL );
-
- ff_fclose( pxFile );
- }
-
-#endif /* ffconfigFPRINTF_SUPPORT */
-/*-----------------------------------------------------------*/
-
-static void prvTest_ff_fseek_ff_rewind( const char *pcMountPath )
-{
-FF_FILE *pxFile;
-int iReturned;
-const size_t xFileSize = 7776UL;
-const size_t xNum32BitValues = xFileSize / sizeof( uint32_t );
-uint32_t x, y;
-
- /* Move to the root of the mount. */
- iReturned = ff_chdir( pcMountPath );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
-
- /* Ensure the file does not already exist. */
- ff_remove( "seek_rewind_test_file" );
-
- /* Open a test file. */
- pxFile = ff_fopen( "seek_rewind_test_file", "a+" );
- configASSERT( pxFile );
-
- /* Fill the file with known data. */
- for( x = 0; x < xNum32BitValues; x++ )
- {
- iReturned = ff_fwrite( &x, 1, sizeof( x ), pxFile );
- configASSERT( iReturned == sizeof( uint32_t ) );
- configASSERT( ff_ftell( pxFile ) == ( long ) ( ( x + 1U ) * sizeof( uint32_t ) ) );
- }
-
- /* Use rewind to get back to the beginning of the file. */
- ff_rewind( pxFile );
- configASSERT( ff_ftell( pxFile ) == 0 );
-
- /* Expect 0 to be read from the start. */
- iReturned = ff_fread( &x, 1, sizeof( x ), pxFile );
- configASSERT( iReturned == sizeof( x ) );
- configASSERT( x == 0 );
-
- /* Move to the end of the file. */
- iReturned = ff_fseek( pxFile, 0, FF_SEEK_END );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
- configASSERT( ff_ftell( pxFile ) == ( long ) xFileSize );
-
- /* Try moving past the front of the file. An error should be returned and
- the position should not change. */
- iReturned = ff_fseek( pxFile, 0 - ( ( long ) xFileSize * 2 ), FF_SEEK_END );
- configASSERT( iReturned != pdFREERTOS_ERRNO_NONE );
- configASSERT( ff_ftell( pxFile ) == ( long ) xFileSize );
-
- /* Reading from here should fail (EOF). */
- iReturned = ( int ) ff_fread( &x, 1, 1, pxFile );
- configASSERT( iReturned == 0 );
-
- /* Now go backwards through the file, reading each uint32_t on the way. */
- for( y = ( xNum32BitValues - 1 ); y >= sizeof( uint32_t ); y -= sizeof( x ) )
- {
- iReturned = ff_fseek( pxFile, ( long ) y * sizeof( uint32_t ), FF_SEEK_SET );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
- configASSERT( ff_ftell( pxFile ) == ( long ) ( y * sizeof( uint32_t ) ) );
-
- /* Data read from here should equal the position. */
- iReturned = ( int ) ff_fread( &x, 1, sizeof( x ), pxFile );
- configASSERT( iReturned == sizeof( x ) );
- configASSERT( x == y );
- }
-
- /* Move forward through the file doing the same thing. Start at the
- front. */
- iReturned = ff_fseek( pxFile, 0 - ( ( long ) xFileSize ), FF_SEEK_END );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
- configASSERT( ff_ftell( pxFile ) == ( long ) 0 );
-
- for( y = 0; y < xNum32BitValues; y++ )
- {
- iReturned = ff_fseek( pxFile, ( long ) ( y * sizeof( x ) ), FF_SEEK_CUR );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
- configASSERT( ff_ftell( pxFile ) == ( long ) ( y * sizeof( uint32_t ) ) );
-
- /* Data read from here should equal the position. */
- iReturned = ( int ) ff_fread( &x, 1, sizeof( x ), pxFile );
- configASSERT( iReturned == sizeof( x ) );
- configASSERT( x == y );
-
- /* Move back to the start of the file. */
- iReturned = ff_fseek( pxFile, 0 - ( long ) ( ( y + 1 ) * sizeof( x ) ), FF_SEEK_CUR );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
- configASSERT( ff_ftell( pxFile ) == 0 );
- }
-
- ff_fclose( pxFile );
-}
-/*-----------------------------------------------------------*/
-
-static void prvTest_ff_findfirst_ff_findnext_ff_findclose( const char* pcMountPath )
-{
-int iReturned;
-size_t i;
-uint8_t ucFoundFiles[ 8 ];
-FF_FindData_t *pxFindStruct = NULL;
-const char *pcExpectedRootFiles[] =
-{
- ".",
- "..",
- "SUB1",
- "root001.txt",
- "root002.txt",
- "root003.txt",
- "root004.txt",
- "root005.txt"
-};
-
-const char *pcExpectedSUB1Files[] =
-{
- ".",
- "..",
- "SUB2",
-};
-
- /* There should be one place in the ucFoundFiles[] array for every place in
- the pcExpectedRootFiles[] array. */
- configASSERT( sizeof( ucFoundFiles ) == ( sizeof( pcExpectedRootFiles ) / sizeof( char * ) ) );
-
- /* No files found yet. */
- memset( ucFoundFiles, 0x00, sizeof( ucFoundFiles ) );
-
- /* Move to the root of the mount. */
- iReturned = ff_chdir( pcMountPath );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
-
- /* FF_FindData_t is quite large, so best to malloc() it on stack challenged
- architectures. */
- pxFindStruct = ( FF_FindData_t * ) pvPortMalloc( sizeof( FF_FindData_t ) );
- configASSERT( pxFindStruct );
-
- if( pxFindStruct != NULL )
- {
- /* Must be initialised to 0. */
- memset( pxFindStruct, 0x00, sizeof( FF_FindData_t ) );
-
- /* The first parameter to ff_findfist() is the directory being searched,
- wildcards are not (currently) supported, so as this is searching the
- current working directory the string is empty. */
- if( ff_findfirst( "", pxFindStruct ) == pdFREERTOS_ERRNO_NONE )
- {
- do
- {
- /* Which file was found? */
- for( i = 0; i < sizeof( ucFoundFiles ); i++ )
- {
- if( strcmp( pcExpectedRootFiles[ i ], pxFindStruct->pcFileName ) == 0 )
- {
- /* The file at this index was found. */
- ucFoundFiles[ i ] = pdTRUE;
- break;
- }
- }
-
- } while( ff_findnext( pxFindStruct ) == pdFREERTOS_ERRNO_NONE );
- }
-
- /* Were all the files found? */
- for( i = 0; i < sizeof( ucFoundFiles ); i++ )
- {
- configASSERT( ucFoundFiles[ i ] == pdTRUE );
- }
-
-
- /* Next check a file can be read from the SUB1 directory. First reset
- the FF_FindData_t structure. */
- memset( pxFindStruct, 0x00, sizeof( FF_FindData_t ) );
- memset( ucFoundFiles, 0x00, sizeof( ucFoundFiles ) );
-
- if( ff_findfirst( "SUB1", pxFindStruct ) == pdFREERTOS_ERRNO_NONE )
- {
- do
- {
- /* Which file was found? */
- for( i = 0; i < ( sizeof( pcExpectedSUB1Files ) / sizeof( char * ) ); i++ )
- {
- if( strcmp( pcExpectedSUB1Files[ i ], pxFindStruct->pcFileName ) == 0 )
- {
- /* The file at this index was found. */
- ucFoundFiles[ i ] = pdTRUE;
- break;
- }
- }
-
- } while( ff_findnext( pxFindStruct ) == pdFREERTOS_ERRNO_NONE );
- }
-
- /* Were all the files found? */
- for( i = 0; i < ( sizeof( pcExpectedSUB1Files ) / sizeof( char * ) ); i++ )
- {
- configASSERT( ucFoundFiles[ i ] == pdTRUE );
- }
-
- /* Must free the find struct again. */
- vPortFree( pxFindStruct );
- }
-}
-/*-----------------------------------------------------------*/
-
-static void prvTest_ff_truncate( const char *pcMountPath )
-{
-int iReturned, x;
-FF_FILE *pxFile;
-/*_RB_ Cannot have / on end due to ff_findfirst() being using if ff_stat(). The
-original file name has to be used at one point as both the findfirst() and fstat()
-functions both use the thread local file name, and having the / on the end prevents
-strcmp being used const char * const pcTestFileName = "truncate.bin/"; */
-const char * const pcTestFileName = "truncate.bin";
-FF_Stat_t xStat;
-int cChar;
-
- /* Move to the root of the mount. */
- iReturned = ff_chdir( pcMountPath );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
-
- /* Ensure the file does not already exist. */
- ff_remove( pcTestFileName );
-
- /* This time the file definitely should not exist. */
- configASSERT( ff_remove( pcTestFileName ) == -1 );
-
- /* Try closing the file before it is opened. */
- pxFile = NULL;
- configASSERT( ff_fclose( pxFile ) == -1 );
-
- /* Create a 1000 byte file. */
- pxFile = ff_truncate( pcTestFileName, 1000L );
-
- /* Check the file has the expected size. */
- ff_fclose( pxFile );
- ff_stat( pcTestFileName, &xStat );
- configASSERT( xStat.st_size == 1000L );
-
- /* The file should have been created full of zeros. */
- pxFile = ff_fopen( pcTestFileName, "r" );
- configASSERT( pxFile != NULL );
-
- /* Calling ff_filelength() should pass as the file is not read only. */
- configASSERT( ff_filelength( pxFile ) == 1000 );
-
- /* Should not be able to write now. */
- iReturned = ff_fputc( 0xff, pxFile );
- configASSERT( iReturned != 0xff );
-
- for( x = 0; x < 1000; x++ )
- {
- cChar = ff_fgetc( pxFile );
- configASSERT( cChar == 0 );
- }
-
- /* Should now be at the end of the file. */
- configASSERT( ff_fgetc( pxFile ) == FF_EOF );
- configASSERT( ff_feof( pxFile ) != 0 );
-
- /* ff_seteof() should fail as the file is read only. As should
- ff_fprintf(). */
- configASSERT( ff_seteof( pxFile ) == -1 );
- #if( ffconfigFPRINTF_SUPPORT != 0 )
- {
- configASSERT( ff_fprintf( pxFile, "this should fail" ) == -1 );
- }
- #endif
-
- /* Fill the file with 0xff. */
- ff_fclose( pxFile );
- pxFile = ff_fopen( pcTestFileName, "r+" );
- configASSERT( pxFile != NULL );
-
- for( x = 0; x < 1000; x++ )
- {
- configASSERT( ff_fputc( 0xff, pxFile ) == 0xff );
- }
-
- /* Extend the file to 2000 bytes using ff_truncate(). */
- ff_fclose( pxFile );
- pxFile = ff_truncate( pcTestFileName, 2000L );
- configASSERT( pxFile );
-
- /* Ensure the file is indeed 2000 bytes long. */
- ff_fclose( pxFile );
- ff_stat( pcTestFileName, &xStat );
- configASSERT( xStat.st_size == 2000L );
-
- /* Now the first 1000 bytes should be 0xff, and the second 1000 bytes should
- be 0x00. */
- pxFile = ff_fopen( pcTestFileName, "r+" );
- configASSERT( pxFile );
- configASSERT( ff_ftell( pxFile ) == 0 );
-
- for( x = 0; x < 1000; x++ )
- {
- cChar = ff_fgetc( pxFile );
- configASSERT( cChar == 0xff );
- }
-
- for( x = 0; x < 1000; x++ )
- {
- cChar = ff_fgetc( pxFile );
- configASSERT( cChar == 0x00 );
- }
-
- /* Use ff_fseek() then ff_seteof() to make the file 1750 bytes long. */
- configASSERT( ff_fseek( pxFile, 1750L, FF_SEEK_SET ) == pdFREERTOS_ERRNO_NONE );
- configASSERT( ff_ftell( pxFile ) == 1750 );
- configASSERT( ff_seteof( pxFile ) == pdFREERTOS_ERRNO_NONE );
-
- /* Attempting another read should result in EOF. */
- configASSERT( ff_feof( pxFile ) != 0 );
- configASSERT( ff_fgetc( pxFile ) == FF_EOF );
-
- /* This time use truncate to make the file shorter by another 250 bytes. */
- ff_fclose( pxFile );
- ff_stat( pcTestFileName, &xStat );
- configASSERT( xStat.st_size == 1750L );
- pxFile = ff_truncate( pcTestFileName, 1500L );
-
- /* Ensure the file is indeed 1500 bytes long. */
- ff_fclose( pxFile );
- ff_stat( pcTestFileName, &xStat );
- configASSERT( xStat.st_size == 1500L );
-
- /* Now the first 1000 bytes should be 0xff, and the second 500 bytes should
- be 0x00. */
- pxFile = ff_fopen( pcTestFileName, "r" );
- configASSERT( pxFile );
- configASSERT( ff_ftell( pxFile ) == 0 );
-
- for( x = 0; x < 1000; x++ )
- {
- cChar = ff_fgetc( pxFile );
- configASSERT( cChar == 0xff );
- }
-
- for( x = 0; x < 500; x++ )
- {
- cChar = ff_fgetc( pxFile );
- configASSERT( cChar == 0x00 );
- }
-
- /* Attempting another read should result in EOF. */
- configASSERT( ff_feof( pxFile ) != 0 );
- configASSERT( ff_fgetc( pxFile ) == FF_EOF );
-
- /* Now truncate the file to 0. */
- ff_fclose( pxFile );
- pxFile = ff_truncate( pcTestFileName, 0L );
- configASSERT( pxFile );
-
- /* Don't expect to be able to delete an open file. */
- configASSERT( ff_remove( pcTestFileName ) == -1 );
-
- /* Ensure the file is indeed 0 bytes long. */
- ff_fclose( pxFile );
- ff_stat( pcTestFileName, &xStat );
- configASSERT( xStat.st_size == 0L );
-
- /* Do expect to be able to delete the file after it is closed. */
- configASSERT( ff_remove( pcTestFileName ) == 0 );
-}
-/*-----------------------------------------------------------*/
-
-static void prvAlignmentReadWriteTests( const char *pcMountPath )
-{
-const char cOverflowCheckByte = 0xc5;
-const size_t xSizeIncrement = 37U;
-const size_t xSectorSize = 512U;
-const size_t xNumSectors = 3U;
-const size_t xOverwriteCheckBytes = 1U;
-const size_t xBufferSize = ( xSectorSize * xNumSectors ) + xSizeIncrement;
-size_t x, xSkippedBytes, x32BitValues;
-char *pcBuffer;
-uint32_t *pulVerifyBuffer;
-uint32_t *pulVerifyValues;
-FF_FILE *pxFile;
-FF_Stat_t xStat;
-const char* pcTestFileName = "test.bin";
-int iReturned, iExpectedReturn;
-
- /* Start in the root of the mounted disk. */
- ff_chdir( pcMountPath );
-
- /* Create an array that will hold 3 whole sectors plus a few additional
- bytes, plus a byte at the end which is used to check it does not get
- overwritten. */
- pcBuffer = ( char * ) pvPortMalloc( xBufferSize + xOverwriteCheckBytes );
- configASSERT( pcBuffer );
- pulVerifyBuffer = ( uint32_t * ) pvPortMalloc( xBufferSize );
-
- /* Write a byte to the end of the buffer which is used to ensure nothing has
- ever written off the end of the buffer. */
- pcBuffer[ xBufferSize ] = cOverflowCheckByte;
-
- /* In case this test has been executed on the disk already - ensure the file
- does not exist. */
- ff_remove( pcTestFileName );
-
- /* Create a file that will hold the entire buffer. */
- pxFile = ff_truncate( pcTestFileName, xBufferSize );
-
- /* Check the file has the expected size. */
- ff_fclose( pxFile );
- ff_stat( pcTestFileName, &xStat );
- configASSERT( xStat.st_size == xBufferSize );
-
- /* Check the file was filled with zeros by reading it back into a buffer
- that was previously set to ff. */
- pxFile = ff_fopen( pcTestFileName, "r" );
- configASSERT( pxFile );
-
- memset( pcBuffer, 0xff, xBufferSize );
-
- /* The +1 is to ensure the xSizeIncrement bytes are also read. */
- iReturned = ff_fread( pcBuffer, xSectorSize, xNumSectors + 1U, pxFile );
-
- /* Expected to have read xNumSectors worth of xSectorSize, but xBufferSize
- bytes. */
- configASSERT( iReturned == ( int ) xNumSectors );
-
- /* Check the buffer is now full of zeros. */
- for( x = 0; x < xBufferSize; x++ )
- {
- configASSERT( pcBuffer[ x ] == 0x00 );
- }
-
- /* Check the byte at the end of the buffer was not overwritten. */
- configASSERT( pcBuffer[ xBufferSize ] == cOverflowCheckByte );
-
- /* Re-open in append mode, the move the write position to the start of the
- file. */
- ff_fclose( pxFile );
- pxFile = ff_fopen( pcTestFileName, "r+" );
- configASSERT( pxFile );
- iReturned = ( int ) ff_ftell( pxFile );
- configASSERT( iReturned == 0 ); /*_RB_ Unexpected, but how the GCC one works. */
-
- /* Fill the file with incrementing 32-bit number starting from various
- different offset. */
- for( xSkippedBytes = 0; xSkippedBytes < xSizeIncrement; xSkippedBytes++ )
- {
- /* The buffer is going to be written to from xSkippedBytes bytes in.
- When that is done, how many 32-bit integers will it hold. */
- x32BitValues = ( xBufferSize - xSkippedBytes ) / sizeof( uint32_t );
-
- /* This time start xSkippedBytes bytes into the file. */
- ff_fseek( pxFile, xSkippedBytes, FF_SEEK_SET );
- iReturned = ( int ) ff_ftell( pxFile );
- configASSERT( iReturned == ( int ) xSkippedBytes );
- iExpectedReturn = xSkippedBytes;
-
- memset( pulVerifyBuffer, 0x00, xBufferSize );
- pulVerifyValues = ( uint32_t * ) pulVerifyBuffer;
-
- for( x = 0; x < x32BitValues; x++ )
- {
- iReturned = ff_fwrite( &x, sizeof( x ), 1, pxFile );
- configASSERT( iReturned == 1 );
-
- /* Also write the value into the verify buffer for easy checking
- when the file is read back. pulVerifyBuffer should remain on a
- 4 byte boundary as it starts from index 0. */
- pulVerifyValues[ x ] = x;
-
- iExpectedReturn += sizeof( x );
- iReturned = ( int ) ff_ftell( pxFile );
- configASSERT( iExpectedReturn == iReturned );
- }
-
- /* Calculate the expected file position. */
- iExpectedReturn = ( x32BitValues * sizeof( uint32_t ) ) + xSkippedBytes;
-
- /* Check the expected file position. */
- iReturned = ff_ftell( pxFile );
- configASSERT( iReturned == iExpectedReturn );
-
- /* Read the entire file back into a buffer to check its contents. */
- ff_fseek( pxFile, 0, FF_SEEK_SET );
- memset( pcBuffer, 0x00, xBufferSize );
- iReturned = ff_fread( pcBuffer, iExpectedReturn, 1, pxFile );
-
- /* The whole file was read back in one. */
- configASSERT( iReturned == 1 );
-
- /* Verify the data. The first xSkippedBytes bytes of the buffer should
- still be zero. */
- for( x = 0; x < xSkippedBytes; x++ )
- {
- configASSERT( pcBuffer[ x ] == 0 );
- }
-
- /* As just verified, the first xSkippedBytes bytes were skipped so the
- first xSkippedBytes bytes in pcBuffer are zero, pulVerifyBuffer was
- written to from its start, and the number of bytes written was the total
- number of uint_32 variables that would fit in the buffer. */
- configASSERT( memcmp( ( void * ) ( pcBuffer + xSkippedBytes ), ( void * ) pulVerifyBuffer, ( x32BitValues * sizeof( uint32_t ) ) ) == 0 );
-
-
- /* Read the file back one byte at a time to check its contents. */
- memset( pcBuffer, 0xff, xBufferSize );
- ff_fseek( pxFile, 0, FF_SEEK_SET );
- for( x = 0; x < ( size_t ) iExpectedReturn; x++ )
- {
- iReturned = ff_fread( &( pcBuffer[ x ] ), sizeof( char ), 1, pxFile );
- configASSERT( iReturned == sizeof( char ) );
- iReturned = ff_ftell( pxFile );
- configASSERT( iReturned == ( long ) ( x + 1U ) );
- }
-
- /* Verify the data using the same offsets as the previous time. */
- configASSERT( memcmp( ( void * ) ( pcBuffer + xSkippedBytes ), ( void * ) pulVerifyBuffer, ( x32BitValues * sizeof( uint32_t ) ) ) == 0 );
-
- /* Read the file back three bytes at a time to check its contents. */
- memset( pcBuffer, 0xff, xBufferSize );
- ff_fseek( pxFile, 0, FF_SEEK_SET );
- for( x = 0; x < ( size_t ) iExpectedReturn; x += 3 )
- {
- iReturned = ff_fread( &( pcBuffer[ x ] ), 1, 3, pxFile );
-
- /* 3 does not go into 4. Don't assert check the last iteration as
- it won't be an exact multiple. */
- if( x < ( iExpectedReturn - sizeof( uint32_t ) ) )
- {
- configASSERT( iReturned == 3 );
- iReturned = ff_ftell( pxFile );
- configASSERT( iReturned == ( long ) ( x + 3 ) );
- }
- }
-
- /* Verify the data. */
- configASSERT( memcmp( ( void * ) ( pcBuffer + xSkippedBytes ), ( void * ) pulVerifyBuffer, ( x32BitValues * sizeof( uint32_t ) ) ) == 0 );
- }
-
- ff_fclose( pxFile );
-
- /* Check the byte at the end of the buffer was not overwritten. */
- configASSERT( pcBuffer[ xBufferSize ] == cOverflowCheckByte );
-
- vPortFree( pcBuffer );
- vPortFree( pulVerifyBuffer );
-}
-/*-----------------------------------------------------------*/
-
-static void prvTest_ff_rename( const char *pcMountPath )
-{
-FF_FILE *pxFile;
-int iReturned;
-const char *pcStringToWrite = "This string is written to the file\n";
-const char *pcSecondStringToWrite = "This is another string written to a file\n";
-char cReadBuffer[ 45 ];
-
- /* cReadBuffer must be at least big enough to hold pcStringToWrite plus a
- null terminator. */
- configASSERT( sizeof( cReadBuffer ) >= ( strlen( pcSecondStringToWrite ) + 1 ) );
-
- /* Move to the root of the mount. */
- iReturned = ff_chdir( pcMountPath );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
-
- /* Attempt to move a file that does not exist. */
- iReturned = ff_rename( "file1.bin", "file2.bin", pdFALSE );
- configASSERT( iReturned == -1 );
-
- /* Create subdirectories into/from which files will be moved. */
- iReturned = ff_mkdir( "source_dir" );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
- iReturned = ff_mkdir( "destination_dir" );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
-
- /* Create a file in source_dir then write some data to it. */
- pxFile = ff_fopen( "source_dir/source.txt", "w" );
- configASSERT( pxFile != NULL );
- ff_fwrite( pcStringToWrite, strlen( pcStringToWrite ), 1, pxFile );
-
- /* Calling ff_filelength() should fail as the file is not read only. */
- /* configASSERT( ff_filelength( pxFile ) == 0 ); _RB_ The behavior of this function has changed, the documentation and or the test will be updated */
-
- /* Ensure the file exists by closing it, reopening it, and reading the
- string back. */
- iReturned = ff_fclose( pxFile );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
- ff_chdir( "source_dir" );
- pxFile = ff_fopen( "source.txt", "r" );
- configASSERT( pxFile != NULL );
- memset( cReadBuffer, 0x00, sizeof( cReadBuffer ) );
- ff_fgets( cReadBuffer, sizeof( cReadBuffer ), pxFile );
- configASSERT( strcmp( cReadBuffer, pcStringToWrite ) == 0 );
-
- /* Calling ff_filelength() should not fail as the file is open for
- reading. */
- configASSERT( ff_filelength( pxFile ) == strlen( pcStringToWrite ) );
-
- /* Should not be able to move the file because it is open. */
- iReturned = ff_rename( "source.txt", "../destination_dir/destination.txt", pdFALSE );
- configASSERT( iReturned == -1 );
-
- /* Close the file so it can be moved. */
- ff_fclose( pxFile );
-
- iReturned = ff_rename( "source.txt", "../destination_dir/destination.txt", pdFALSE );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
-
- /* Attempt to open the file - it should no longer exist. */
- pxFile = ff_fopen( "source.txt", "r" );
- configASSERT( pxFile == NULL );
-
- /* Create a new file to try and copy it over an existing file. */
- pxFile = ff_fopen( "source.txt2", "w" );
- configASSERT( pxFile != NULL );
-
- /* Write different data to the file. */
- iReturned = ff_fwrite( pcSecondStringToWrite, 1, strlen( pcSecondStringToWrite ), pxFile );
- configASSERT( iReturned == ( int ) strlen( pcSecondStringToWrite ) );
-
- /* Now close the file and try moving it to the file that already exists.
- That should fail if the last parameter is pdFALSE. */
- ff_fclose( pxFile );
- iReturned = ff_rename( "source.txt2", "../destination_dir/destination.txt", pdFALSE );
- configASSERT( iReturned == -1 );
-
- /* This time the last parameter is pdTRUE, so the file should be moved even
- through the destination already existed. */
- iReturned = ff_rename( "source.txt2", "../destination_dir/destination.txt", pdTRUE );
- configASSERT( iReturned == 0 );
-
- /* Now open the destination file and ensure it was copied as expected. */
- iReturned = ff_chdir( "../destination_dir" );
- configASSERT( iReturned == pdFREERTOS_ERRNO_NONE );
- pxFile = ff_fopen( "destination.txt", "r" );
- configASSERT( pxFile != NULL );
- configASSERT( ff_filelength( pxFile ) == strlen( pcSecondStringToWrite ) );
- memset( cReadBuffer, 0x00, sizeof( cReadBuffer ) );
- /* +1 to get the \n on the end of the string too. */
- ff_fgets( cReadBuffer, strlen( pcSecondStringToWrite ) + 1, pxFile );
- configASSERT( strcmp( cReadBuffer, pcSecondStringToWrite ) == 0 );
-
- ff_fclose( pxFile );
-}
-/*-----------------------------------------------------------*/
-
-static void prvTest_ff_fopen( const char *pcMountPath )
-{
-FF_FILE *pxFile;
-FF_Stat_t xStat;
-size_t xReturned, xByte;
-const size_t xBytesToWrite = 10U;
-char *pcRAMBuffer, *pcFileName;
-
- /* Allocate buffers used to hold date written to/from the disk, and the
- file names. */
- pcRAMBuffer = ( char * ) pvPortMalloc( fsRAM_BUFFER_SIZE );
- pcFileName = ( char * ) pvPortMalloc( ffconfigMAX_FILENAME );
- configASSERT( pcRAMBuffer );
- configASSERT( pcFileName );
-
- /* Generate file name. */
- snprintf( pcFileName, ffconfigMAX_FILENAME, "%s/Dummy.txt", pcMountPath );
-
- /* Attempt to open a file that does not exist in read only mode. */
- pxFile = ff_fopen( pcFileName, "r" );
-
- /* Do not expect the file to have been opened as it does not exist. */
- configASSERT( pxFile == NULL );
-
- /* Attempt to open the same file, this time using a "+" in addition to the
- "r". */
- pxFile = ff_fopen( pcFileName, "r+" );
-
- /* The file still does not exist. */
- configASSERT( pxFile == NULL );
-
- /* This time attempt to open the file in read/write mode. */
- pxFile = ff_fopen( pcFileName, "w" );
-
- /* The file should have been created. */
- configASSERT( pxFile != NULL );
-
- /* Write some ascii '0's to the file. */
- memset( pcRAMBuffer, ( int ) '0', fsRAM_BUFFER_SIZE );
- xReturned = ff_fwrite( pcRAMBuffer, xBytesToWrite, 1, pxFile );
-
- /* One item was written. */
- configASSERT( xReturned == 1 );
-
- /* The write position should be xBytesToWrite into the file. */
- configASSERT( ff_ftell( pxFile ) == ( long ) xBytesToWrite );
-
- /* The file length as reported by ff_stat() should be zero though as the
- file has not yet been committed. */
- ff_stat( pcFileName, &xStat );
- configASSERT( xStat.st_size == 0 );
-
- /* Close the file so it can be re-opened in append mode. */
- ff_fclose( pxFile );
-
- /* Now the file has been closed its size should be reported. */
- ff_stat( pcFileName, &xStat );
- configASSERT( xStat.st_size == xBytesToWrite );
-
- pxFile = ff_fopen( pcFileName, "a" );
- configASSERT( pxFile );
-
- /* Write some ascii '1's to the file. */
- memset( pcRAMBuffer, ( int ) '1', fsRAM_BUFFER_SIZE );
- xReturned = ff_fwrite( pcRAMBuffer, 1, xBytesToWrite, pxFile );
- configASSERT( xReturned == xBytesToWrite );
-
- /* The size reported by stat should not yet have changed. */
- ff_stat( pcFileName, &xStat );
- configASSERT( xStat.st_size == xBytesToWrite );
-
- /* The file should contain xBytesToWrite lots of '0' and xBytesToWrite lots
- of '1'. The file was opened in append mode so the '1's should appear after
- the '0's. Open the file in read mode to check the bytes appear in the file
- as expected. */
- ff_fclose( pxFile );
-
- /* Now the size reported by ff_stat() should have changed. */
- ff_stat( pcFileName, &xStat );
- configASSERT( xStat.st_size == ( xBytesToWrite * 2UL ) );
-
- pxFile = ff_fopen( pcFileName, "r" );
- configASSERT( pxFile != NULL );
-
- /* Start with the RAM buffer clear. */
- memset( pcRAMBuffer, 0x00, fsRAM_BUFFER_SIZE );
-
- /* Read the data into the RAM buffer. */
- ff_fread( pcRAMBuffer, ( 2 * xBytesToWrite ), 1, pxFile );
-
- /* Check each byte is as expected. */
- for( xByte = 0; xByte < ( 2 * xBytesToWrite ); xByte++ )
- {
- if( xByte < xBytesToWrite )
- {
- configASSERT( pcRAMBuffer[ xByte ] == '0' );
- }
- else
- {
- configASSERT( pcRAMBuffer[ xByte ] == '1' );
- }
- }
-
- /* It should not be possible to write to the file as it was opened read
- only. */
- xReturned = ff_fwrite( pcRAMBuffer, 1, 1, pxFile );
- configASSERT( xReturned == 0 );
-
- /* File size should not have changed. */
- ff_fclose( pxFile );
- ff_stat( pcFileName, &xStat );
- configASSERT( xStat.st_size == ( xBytesToWrite * 2UL ) );
-
- /* The file now contains data. Re-open it using "w" mode again. It should
- be truncated to zero. */
- pxFile = ff_fopen( pcFileName, "w" );
- ff_fclose( pxFile );
- ff_stat( pcFileName, &xStat );
- configASSERT( xStat.st_size == 0 );
-
- vPortFree( pcRAMBuffer );
- vPortFree( pcFileName );
-}
-/*-----------------------------------------------------------*/
-
-void vMultiTaskStdioWithCWDTest( const char *const pcMountPath, uint16_t usStackSizeWords )
-{
-size_t x;
-static char cDirName[ fsTASKS_TO_CREATE ][ 20 ]; /* Static as it must still be available in the task. */
-char cTaskName[ 5 ];
-
- /* Create a set of tasks that also create, check and delete files. These
- are left running as an ad hoc test of multiple tasks accessing the file
- system simultaneously. */
- for( x = 0; x < fsTASKS_TO_CREATE; x++ )
- {
- snprintf( &( cDirName[ x ][ 0 ] ), sizeof( cDirName ), "%s/%d", pcMountPath, x );
- snprintf( cTaskName, sizeof( cTaskName ), "FS%d", x );
- xTaskCreate( prvFileSystemAccessTask,
- cTaskName,
- usStackSizeWords, /* Not used with the Windows port. */
- ( void * ) &( cDirName[ x ][ 0 ] ),
- tskIDLE_PRIORITY,
- NULL );
- }
-}
-/*-----------------------------------------------------------*/
-
-static void prvFileSystemAccessTask( void *pvParameters )
-{
-extern void vCreateAndVerifyExampleFiles( const char *pcMountPath );
-const char * const pcBasePath = ( char * ) pvParameters;
-
- for( ;; )
- {
- /* Create the directory used as a base by this instance of this task. */
- ff_mkdir( pcBasePath );
-
- /* Create a few example files on the disk. */
- vCreateAndVerifyExampleFiles( pcBasePath );
-
- /* A few sanity checks only - can only be called after
- vCreateAndVerifyExampleFiles(). */
- vStdioWithCWDTest( pcBasePath );
-
- /* Remove the base directory again, ready for another loop. */
- ff_deltree( pcBasePath );
- }
-}
-/*-----------------------------------------------------------*/
diff --git a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_FAT_SL_Demos/CreateExampleFiles/File-system-demo.c b/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_FAT_SL_Demos/CreateExampleFiles/File-system-demo.c
deleted file mode 100644
index 0580c0c..0000000
--- a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_FAT_SL_Demos/CreateExampleFiles/File-system-demo.c
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- * FreeRTOS Kernel V10.0.1
- * Copyright (C) 2017 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
- *
- * 1 tab == 4 spaces!
- */
-
-/*******************************************************************************
- * See the URL in the comments within main.c for the location of the online
- * documentation.
- ******************************************************************************/
-
-/* Standard includes. */
-#include <stdio.h>
-#include <string.h>
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-
-/* File system includes. */
-#include "fat_sl.h"
-#include "api_mdriver_ram.h"
-
-/* 8.3 format, plus null terminator. */
-#define fsMAX_FILE_NAME_LEN 13
-
-/* The number of bytes read/written to the example files at a time. */
-#define fsRAM_BUFFER_SIZE 200
-
-/* The number of bytes written to the file that uses f_putc() and f_getc(). */
-#define fsPUTC_FILE_SIZE 100
-
-/*-----------------------------------------------------------*/
-
-/*
- * Creates and verifies different files on the volume, demonstrating the use of
- * various different API functions.
- */
-void vCreateAndVerifySampleFiles( void );
-
-/*
- * Create a set of example files in the root directory of the volume using
- * f_write().
- */
-static void prvCreateDemoFilesUsing_f_write( void );
-
-/*
- * Use f_read() to read back and verify the files that were created by
- * prvCreateDemoFilesUsing_f_write().
- */
-static void prvVerifyDemoFileUsing_f_read( void );
-
-/*
- * Create an example file in a sub-directory using f_putc().
- */
-static void prvCreateDemoFileUsing_f_putc( void );
-
-/*
- * Use f_getc() to read back and verify the file that was created by
- * prvCreateDemoFileUsing_f_putc().
- */
-static void prvVerifyDemoFileUsing_f_getc( void );
-
-/*-----------------------------------------------------------*/
-
-/* A buffer used to both create content to write to disk, and read content back
-from a disk. Note there is no mutual exclusion on this buffer. */
-static char cRAMBuffer[ fsRAM_BUFFER_SIZE ];
-
-/* Names of directories that are created. */
-static const char *pcRoot = "/", *pcDirectory1 = "SUB1", *pcDirectory2 = "SUB2", *pcFullPath = "/SUB1/SUB2";
-
-/*-----------------------------------------------------------*/
-
-void vCreateAndVerifySampleFiles( void )
-{
-unsigned char ucStatus;
-
- /* First create the volume. */
- ucStatus = f_initvolume( ram_initfunc );
-
- /* It is expected that the volume is not formatted. */
- if( ucStatus == F_ERR_NOTFORMATTED )
- {
- /* Format the created volume. */
- ucStatus = f_format( F_FAT12_MEDIA );
- }
-
- if( ucStatus == F_NO_ERROR )
- {
- /* Create a set of files using f_write(). */
- prvCreateDemoFilesUsing_f_write();
-
- /* Read back and verify the files that were created using f_write(). */
- prvVerifyDemoFileUsing_f_read();
-
- /* Create sub directories two deep then create a file using putc. */
- prvCreateDemoFileUsing_f_putc();
-
- /* Read back and verify the file created by
- prvCreateDemoFileUsing_f_putc(). */
- prvVerifyDemoFileUsing_f_getc();
- }
-}
-/*-----------------------------------------------------------*/
-
-static void prvCreateDemoFilesUsing_f_write( void )
-{
-BaseType_t xFileNumber, xWriteNumber;
-char cFileName[ fsMAX_FILE_NAME_LEN ];
-const BaseType_t xMaxFiles = 5;
-long lItemsWritten;
-F_FILE *pxFile;
-
- /* Create xMaxFiles files. Each created file will be
- ( xFileNumber * fsRAM_BUFFER_SIZE ) bytes in length, and filled
- with a different repeating character. */
- for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ )
- {
- /* Generate a file name. */
- sprintf( cFileName, "root%03d.txt", ( int ) xFileNumber );
-
- /* Obtain the current working directory and print out the file name and
- the directory into which the file is being written. */
- f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
-
- /* Open the file, creating the file if it does not already exist. */
- pxFile = f_open( cFileName, "w" );
- configASSERT( pxFile );
-
- /* Fill the RAM buffer with data that will be written to the file. This
- is just a repeating ascii character that indicates the file number. */
- memset( cRAMBuffer, ( int ) ( '0' + xFileNumber ), fsRAM_BUFFER_SIZE );
-
- /* Write the RAM buffer to the opened file a number of times. The
- number of times the RAM buffer is written to the file depends on the
- file number, so the length of each created file will be different. */
- for( xWriteNumber = 0; xWriteNumber < xFileNumber; xWriteNumber++ )
- {
- lItemsWritten = f_write( cRAMBuffer, fsRAM_BUFFER_SIZE, 1, pxFile );
- configASSERT( lItemsWritten == 1 );
- }
-
- /* Close the file so another file can be created. */
- f_close( pxFile );
- }
-}
-/*-----------------------------------------------------------*/
-
-static void prvVerifyDemoFileUsing_f_read( void )
-{
-BaseType_t xFileNumber, xReadNumber;
-char cFileName[ fsMAX_FILE_NAME_LEN ];
-const BaseType_t xMaxFiles = 5;
-long lItemsRead, lChar;
-F_FILE *pxFile;
-
- /* Read back the files that were created by
- prvCreateDemoFilesUsing_f_write(). */
- for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ )
- {
- /* Generate the file name. */
- sprintf( cFileName, "root%03d.txt", ( int ) xFileNumber );
-
- /* Obtain the current working directory and print out the file name and
- the directory from which the file is being read. */
- f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
-
- /* Open the file for reading. */
- pxFile = f_open( cFileName, "r" );
- configASSERT( pxFile );
-
- /* Read the file into the RAM buffer, checking the file contents are as
- expected. The size of the file depends on the file number. */
- for( xReadNumber = 0; xReadNumber < xFileNumber; xReadNumber++ )
- {
- /* Start with the RAM buffer clear. */
- memset( cRAMBuffer, 0x00, fsRAM_BUFFER_SIZE );
-
- lItemsRead = f_read( cRAMBuffer, fsRAM_BUFFER_SIZE, 1, pxFile );
- configASSERT( lItemsRead == 1 );
-
- /* Check the RAM buffer is filled with the expected data. Each
- file contains a different repeating ascii character that indicates
- the number of the file. */
- for( lChar = 0; lChar < fsRAM_BUFFER_SIZE; lChar++ )
- {
- configASSERT( cRAMBuffer[ lChar ] == ( '0' + ( char ) xFileNumber ) );
- }
- }
-
- /* Close the file. */
- f_close( pxFile );
- }
-}
-/*-----------------------------------------------------------*/
-
-static void prvCreateDemoFileUsing_f_putc( void )
-{
-unsigned char ucReturn;
-int iByte, iReturned;
-F_FILE *pxFile;
-char cFileName[ fsMAX_FILE_NAME_LEN ];
-
- /* Obtain and print out the working directory. */
- f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
-
- /* Create a sub directory. */
- ucReturn = f_mkdir( pcDirectory1 );
- configASSERT( ucReturn == F_NO_ERROR );
-
- /* Move into the created sub-directory. */
- ucReturn = f_chdir( pcDirectory1 );
- configASSERT( ucReturn == F_NO_ERROR );
-
- /* Obtain and print out the working directory. */
- f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
-
- /* Create a subdirectory in the new directory. */
- ucReturn = f_mkdir( pcDirectory2 );
- configASSERT( ucReturn == F_NO_ERROR );
-
- /* Move into the directory just created - now two directories down from
- the root. */
- ucReturn = f_chdir( pcDirectory2 );
- configASSERT( ucReturn == F_NO_ERROR );
-
- /* Obtain and print out the working directory. */
- f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
- configASSERT( strcmp( cRAMBuffer, pcFullPath ) == 0 );
-
- /* Generate the file name. */
- sprintf( cFileName, "%s.txt", pcDirectory2 );
-
- /* Print out the file name and the directory into which the file is being
- written. */
- pxFile = f_open( cFileName, "w" );
-
- /* Create a file 1 byte at a time. The file is filled with incrementing
- ascii characters starting from '0'. */
- for( iByte = 0; iByte < fsPUTC_FILE_SIZE; iByte++ )
- {
- iReturned = f_putc( ( ( int ) '0' + iByte ), pxFile );
- configASSERT( iReturned == ( ( int ) '0' + iByte ) );
- }
-
- /* Finished so close the file. */
- f_close( pxFile );
-
- /* Move back to the root directory. */
- ucReturn = f_chdir( "../.." );
- configASSERT( ucReturn == F_NO_ERROR );
-
- /* Obtain and print out the working directory. */
- f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
- configASSERT( strcmp( cRAMBuffer, pcRoot ) == 0 );
-}
-/*-----------------------------------------------------------*/
-
-static void prvVerifyDemoFileUsing_f_getc( void )
-{
-unsigned char ucReturn;
-int iByte, iReturned;
-F_FILE *pxFile;
-char cFileName[ fsMAX_FILE_NAME_LEN ];
-
- /* Move into the directory in which the file was created. */
- ucReturn = f_chdir( pcFullPath );
- configASSERT( ucReturn == F_NO_ERROR );
-
- /* Obtain and print out the working directory. */
- f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
- configASSERT( strcmp( cRAMBuffer, pcFullPath ) == 0 );
-
- /* Generate the file name. */
- sprintf( cFileName, "%s.txt", pcDirectory2 );
-
- /* This time the file is opened for reading. */
- pxFile = f_open( cFileName, "r" );
-
- /* Read the file 1 byte at a time. */
- for( iByte = 0; iByte < fsPUTC_FILE_SIZE; iByte++ )
- {
- iReturned = f_getc( pxFile );
- configASSERT( iReturned == ( ( int ) '0' + iByte ) );
- }
-
- /* Finished so close the file. */
- f_close( pxFile );
-
- /* Move back to the root directory. */
- ucReturn = f_chdir( "../.." );
- configASSERT( ucReturn == F_NO_ERROR );
-
- /* Obtain and print out the working directory. */
- f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE );
-}
-
-
-
-
diff --git a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_TCP_Demos/SimpleTCPEchoServer.c b/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_TCP_Demos/SimpleTCPEchoServer.c
deleted file mode 100644
index 2a2c704..0000000
--- a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_TCP_Demos/SimpleTCPEchoServer.c
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
- All rights reserved
-
- VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
-
- This file is part of the FreeRTOS distribution.
-
- FreeRTOS is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License (version 2) as published by the
- Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
-
- ***************************************************************************
- >>! NOTE: The modification to the GPL is included to allow you to !<<
- >>! distribute a combined work that includes FreeRTOS without being !<<
- >>! obliged to provide the source code for proprietary components !<<
- >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
-
- FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. Full license text is available on the following
- link: http://www.freertos.org/a00114.html
-
- ***************************************************************************
- * *
- * FreeRTOS provides completely free yet professionally developed, *
- * robust, strictly quality controlled, supported, and cross *
- * platform software that is more than just the market leader, it *
- * is the industry's de facto standard. *
- * *
- * Help yourself get started quickly while simultaneously helping *
- * to support the FreeRTOS project by purchasing a FreeRTOS *
- * tutorial book, reference manual, or both: *
- * http://www.FreeRTOS.org/Documentation *
- * *
- ***************************************************************************
-
- http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
- the FAQ page "My application does not run, what could be wrong?". Have you
- defined configASSERT()?
-
- http://www.FreeRTOS.org/support - In return for receiving this top quality
- embedded software for free we request you assist our global community by
- participating in the support forum.
-
- http://www.FreeRTOS.org/training - Investing in training allows your team to
- be as productive as possible as early as possible. Now you can receive
- FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
- Ltd, and the world's leading authority on the world's leading RTOS.
-
- http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
- including FreeRTOS+Trace - an indispensable productivity tool, a DOS
- compatible FAT file system, and our tiny thread aware UDP/IP stack.
-
- http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
- Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
-
- http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
- Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
- licenses offer ticketed support, indemnification and commercial middleware.
-
- http://www.SafeRTOS.com - High Integrity Systems also provide a safety
- engineered and independently SIL3 certified version for use in safety and
- mission critical applications that require provable dependability.
-
- 1 tab == 4 spaces!
-*/
-
-/*
- * FreeRTOS tasks are used with FreeRTOS+TCP to create a TCP echo server on the
- * standard echo port number (7).
- *
- * See the following web page for essential demo usage and configuration
- * details:
- * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/TCP_Echo_Server.html
- */
-
-/* Standard includes. */
-#include <stdint.h>
-#include <stdio.h>
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-#include "task.h"
-#include "semphr.h"
-
-/* FreeRTOS+TCP includes. */
-#include "FreeRTOS_IP.h"
-#include "FreeRTOS_Sockets.h"
-
-/* Remove the whole file if FreeRTOSIPConfig.h is set to exclude TCP. */
-#if( ipconfigUSE_TCP == 1 )
-
-/* The maximum time to wait for a closing socket to close. */
-#define tcpechoSHUTDOWN_DELAY ( pdMS_TO_TICKS( 5000 ) )
-
-/* The standard echo port number. */
-#define tcpechoPORT_NUMBER 7
-
-/* If ipconfigUSE_TCP_WIN is 1 then the Tx sockets will use a buffer size set by
-ipconfigTCP_TX_BUFFER_LENGTH, and the Tx window size will be
-configECHO_SERVER_TX_WINDOW_SIZE times the buffer size. Note
-ipconfigTCP_TX_BUFFER_LENGTH is set in FreeRTOSIPConfig.h as it is a standard TCP/IP
-stack constant, whereas configECHO_SERVER_TX_WINDOW_SIZE is set in
-FreeRTOSConfig.h as it is a demo application constant. */
-#ifndef configECHO_SERVER_TX_WINDOW_SIZE
- #define configECHO_SERVER_TX_WINDOW_SIZE 2
-#endif
-
-/* If ipconfigUSE_TCP_WIN is 1 then the Rx sockets will use a buffer size set by
-ipconfigTCP_RX_BUFFER_LENGTH, and the Rx window size will be
-configECHO_SERVER_RX_WINDOW_SIZE times the buffer size. Note
-ipconfigTCP_RX_BUFFER_LENGTH is set in FreeRTOSIPConfig.h as it is a standard TCP/IP
-stack constant, whereas configECHO_SERVER_RX_WINDOW_SIZE is set in
-FreeRTOSConfig.h as it is a demo application constant. */
-#ifndef configECHO_SERVER_RX_WINDOW_SIZE
- #define configECHO_SERVER_RX_WINDOW_SIZE 2
-#endif
-
-/*-----------------------------------------------------------*/
-
-/*
- * Uses FreeRTOS+TCP to listen for incoming echo connections, creating a task
- * to handle each connection.
- */
-static void prvConnectionListeningTask( void *pvParameters );
-
-/*
- * Created by the connection listening task to handle a single connection.
- */
-static void prvServerConnectionInstance( void *pvParameters );
-
-/*-----------------------------------------------------------*/
-
-/* Stores the stack size passed into vStartSimpleTCPServerTasks() so it can be
-reused when the server listening task creates tasks to handle connections. */
-static uint16_t usUsedStackSize = 0;
-
-/*-----------------------------------------------------------*/
-
-void vStartSimpleTCPServerTasks( uint16_t usStackSize, UBaseType_t uxPriority )
-{
- /* Create the TCP echo server. */
- xTaskCreate( prvConnectionListeningTask, "ServerListener", usStackSize, NULL, uxPriority + 1, NULL );
-
- /* Remember the requested stack size so it can be re-used by the server
- listening task when it creates tasks to handle connections. */
- usUsedStackSize = usStackSize;
-}
-/*-----------------------------------------------------------*/
-
-static void prvConnectionListeningTask( void *pvParameters )
-{
-struct freertos_sockaddr xClient, xBindAddress;
-Socket_t xListeningSocket, xConnectedSocket;
-socklen_t xSize = sizeof( xClient );
-static const TickType_t xReceiveTimeOut = portMAX_DELAY;
-const BaseType_t xBacklog = 20;
-
-#if( ipconfigUSE_TCP_WIN == 1 )
- WinProperties_t xWinProps;
-
- /* Fill in the buffer and window sizes that will be used by the socket. */
- xWinProps.lTxBufSize = ipconfigTCP_TX_BUFFER_LENGTH;
- xWinProps.lTxWinSize = configECHO_SERVER_TX_WINDOW_SIZE;
- xWinProps.lRxBufSize = ipconfigTCP_RX_BUFFER_LENGTH;
- xWinProps.lRxWinSize = configECHO_SERVER_RX_WINDOW_SIZE;
-#endif /* ipconfigUSE_TCP_WIN */
-
- /* Just to prevent compiler warnings. */
- ( void ) pvParameters;
-
- /* Attempt to open the socket. */
- xListeningSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
- configASSERT( xListeningSocket != FREERTOS_INVALID_SOCKET );
-
- /* Set a time out so accept() will just wait for a connection. */
- FreeRTOS_setsockopt( xListeningSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) );
-
- /* Set the window and buffer sizes. */
- #if( ipconfigUSE_TCP_WIN == 1 )
- {
- FreeRTOS_setsockopt( xListeningSocket, 0, FREERTOS_SO_WIN_PROPERTIES, ( void * ) &xWinProps, sizeof( xWinProps ) );
- }
- #endif /* ipconfigUSE_TCP_WIN */
-
- /* Bind the socket to the port that the client task will send to, then
- listen for incoming connections. */
- xBindAddress.sin_port = tcpechoPORT_NUMBER;
- xBindAddress.sin_port = FreeRTOS_htons( xBindAddress.sin_port );
- FreeRTOS_bind( xListeningSocket, &xBindAddress, sizeof( xBindAddress ) );
- FreeRTOS_listen( xListeningSocket, xBacklog );
-
- for( ;; )
- {
- /* Wait for a client to connect. */
- xConnectedSocket = FreeRTOS_accept( xListeningSocket, &xClient, &xSize );
- configASSERT( xConnectedSocket != FREERTOS_INVALID_SOCKET );
-
- /* Spawn a task to handle the connection. */
- xTaskCreate( prvServerConnectionInstance, "EchoServer", usUsedStackSize, ( void * ) xConnectedSocket, tskIDLE_PRIORITY, NULL );
- }
-}
-/*-----------------------------------------------------------*/
-
-static void prvServerConnectionInstance( void *pvParameters )
-{
-int32_t lBytes, lSent, lTotalSent;
-Socket_t xConnectedSocket;
-static const TickType_t xReceiveTimeOut = pdMS_TO_TICKS( 5000 );
-static const TickType_t xSendTimeOut = pdMS_TO_TICKS( 5000 );
-TickType_t xTimeOnShutdown;
-uint8_t *pucRxBuffer;
-
- xConnectedSocket = ( Socket_t ) pvParameters;
-
- /* Attempt to create the buffer used to receive the string to be echoed
- back. This could be avoided using a zero copy interface that just returned
- the same buffer. */
- pucRxBuffer = ( uint8_t * ) pvPortMalloc( ipconfigTCP_MSS );
-
- if( pucRxBuffer != NULL )
- {
- FreeRTOS_setsockopt( xConnectedSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) );
- FreeRTOS_setsockopt( xConnectedSocket, 0, FREERTOS_SO_SNDTIMEO, &xSendTimeOut, sizeof( xReceiveTimeOut ) );
-
- for( ;; )
- {
- /* Zero out the receive array so there is NULL at the end of the string
- when it is printed out. */
- memset( pucRxBuffer, 0x00, ipconfigTCP_MSS );
-
- /* Receive data on the socket. */
- lBytes = FreeRTOS_recv( xConnectedSocket, pucRxBuffer, ipconfigTCP_MSS, 0 );
-
- /* If data was received, echo it back. */
- if( lBytes >= 0 )
- {
- lSent = 0;
- lTotalSent = 0;
-
- /* Call send() until all the data has been sent. */
- while( ( lSent >= 0 ) && ( lTotalSent < lBytes ) )
- {
- lSent = FreeRTOS_send( xConnectedSocket, pucRxBuffer, lBytes - lTotalSent, 0 );
- lTotalSent += lSent;
- }
-
- if( lSent < 0 )
- {
- /* Socket closed? */
- break;
- }
- }
- else
- {
- /* Socket closed? */
- break;
- }
- }
- }
-
- /* Initiate a shutdown in case it has not already been initiated. */
- FreeRTOS_shutdown( xConnectedSocket, FREERTOS_SHUT_RDWR );
-
- /* Wait for the shutdown to take effect, indicated by FreeRTOS_recv()
- returning an error. */
- xTimeOnShutdown = xTaskGetTickCount();
- do
- {
- if( FreeRTOS_recv( xConnectedSocket, pucRxBuffer, ipconfigTCP_MSS, 0 ) < 0 )
- {
- break;
- }
- } while( ( xTaskGetTickCount() - xTimeOnShutdown ) < tcpechoSHUTDOWN_DELAY );
-
- /* Finished with the socket, buffer, the task. */
- vPortFree( pucRxBuffer );
- FreeRTOS_closesocket( xConnectedSocket );
-
- vTaskDelete( NULL );
-}
-/*-----------------------------------------------------------*/
-
-/* The whole file is excluded if TCP is not compiled in. */
-#endif /* ipconfigUSE_TCP */
-
diff --git a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_TCP_Demos/TCPEchoClient_SingleTasks.c b/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_TCP_Demos/TCPEchoClient_SingleTasks.c
deleted file mode 100644
index d9de1a9..0000000
--- a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_TCP_Demos/TCPEchoClient_SingleTasks.c
+++ /dev/null
@@ -1,433 +0,0 @@
-/*
- FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
- All rights reserved
-
- VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
-
- This file is part of the FreeRTOS distribution.
-
- FreeRTOS is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License (version 2) as published by the
- Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
-
- ***************************************************************************
- >>! NOTE: The modification to the GPL is included to allow you to !<<
- >>! distribute a combined work that includes FreeRTOS without being !<<
- >>! obliged to provide the source code for proprietary components !<<
- >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
-
- FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. Full license text is available on the following
- link: http://www.freertos.org/a00114.html
-
- ***************************************************************************
- * *
- * FreeRTOS provides completely free yet professionally developed, *
- * robust, strictly quality controlled, supported, and cross *
- * platform software that is more than just the market leader, it *
- * is the industry's de facto standard. *
- * *
- * Help yourself get started quickly while simultaneously helping *
- * to support the FreeRTOS project by purchasing a FreeRTOS *
- * tutorial book, reference manual, or both: *
- * http://www.FreeRTOS.org/Documentation *
- * *
- ***************************************************************************
-
- http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
- the FAQ page "My application does not run, what could be wrong?". Have you
- defined configASSERT()?
-
- http://www.FreeRTOS.org/support - In return for receiving this top quality
- embedded software for free we request you assist our global community by
- participating in the support forum.
-
- http://www.FreeRTOS.org/training - Investing in training allows your team to
- be as productive as possible as early as possible. Now you can receive
- FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
- Ltd, and the world's leading authority on the world's leading RTOS.
-
- http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
- including FreeRTOS+Trace - an indispensable productivity tool, a DOS
- compatible FAT file system, and our tiny thread aware UDP/IP stack.
-
- http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
- Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
-
- http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
- Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
- licenses offer ticketed support, indemnification and commercial middleware.
-
- http://www.SafeRTOS.com - High Integrity Systems also provide a safety
- engineered and independently SIL3 certified version for use in safety and
- mission critical applications that require provable dependability.
-
- 1 tab == 4 spaces!
-*/
-
-/*
- * A set of tasks are created that send TCP echo requests to the standard echo
- * port (port 7) on the IP address set by the configECHO_SERVER_ADDR0 to
- * configECHO_SERVER_ADDR3 constants, then wait for and verify the reply
- * (another demo is available that demonstrates the reception being performed in
- * a task other than that from with the request was made).
- *
- * See the following web page for essential demo usage and configuration
- * details:
- * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/TCP_Echo_Clients.html
- */
-
-/* Standard includes. */
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-#include "task.h"
-#include "queue.h"
-
-/* FreeRTOS+TCP includes. */
-#include "FreeRTOS_IP.h"
-#include "FreeRTOS_Sockets.h"
-
-/* Exclude the whole file if FreeRTOSIPConfig.h is configured to use UDP only. */
-#if( ipconfigUSE_TCP == 1 )
-
-/* The echo tasks create a socket, send out a number of echo requests, listen
-for the echo reply, then close the socket again before starting over. This
-delay is used between each iteration to ensure the network does not get too
-congested. */
-#define echoLOOP_DELAY ( ( TickType_t ) 150 / portTICK_PERIOD_MS )
-
-/* The echo server is assumed to be on port 7, which is the standard echo
-protocol port. */
-#ifndef configTCP_ECHO_CLIENT_PORT
- #define echoECHO_PORT ( 7 )
-#else
- #define echoECHO_PORT ( configTCP_ECHO_CLIENT_PORT )
-#endif
-
-/* The size of the buffers is a multiple of the MSS - the length of the data
-sent is a pseudo random size between 20 and echoBUFFER_SIZES. */
-#define echoBUFFER_SIZE_MULTIPLIER ( 2 )
-#define echoBUFFER_SIZES ( ipconfigTCP_MSS * echoBUFFER_SIZE_MULTIPLIER )
-
-/* The number of instances of the echo client task to create. */
-#define echoNUM_ECHO_CLIENTS ( 1 )
-
-/* If ipconfigUSE_TCP_WIN is 1 then the Tx socket will use a buffer size set by
-ipconfigTCP_TX_BUFFER_LENGTH, and the Tx window size will be
-configECHO_CLIENT_TX_WINDOW_SIZE times the buffer size. Note
-ipconfigTCP_TX_BUFFER_LENGTH is set in FreeRTOSIPConfig.h as it is a standard TCP/IP
-stack constant, whereas configECHO_CLIENT_TX_WINDOW_SIZE is set in
-FreeRTOSConfig.h as it is a demo application constant. */
-#ifndef configECHO_CLIENT_TX_WINDOW_SIZE
- #define configECHO_CLIENT_TX_WINDOW_SIZE 2
-#endif
-
-/* If ipconfigUSE_TCP_WIN is 1 then the Rx socket will use a buffer size set by
-ipconfigTCP_RX_BUFFER_LENGTH, and the Rx window size will be
-configECHO_CLIENT_RX_WINDOW_SIZE times the buffer size. Note
-ipconfigTCP_RX_BUFFER_LENGTH is set in FreeRTOSIPConfig.h as it is a standard TCP/IP
-stack constant, whereas configECHO_CLIENT_RX_WINDOW_SIZE is set in
-FreeRTOSConfig.h as it is a demo application constant. */
-#ifndef configECHO_CLIENT_RX_WINDOW_SIZE
- #define configECHO_CLIENT_RX_WINDOW_SIZE 2
-#endif
-
-/*-----------------------------------------------------------*/
-
-/*
- * Uses a socket to send data to, then receive data from, the standard echo
- * port number 7.
- */
-static void prvEchoClientTask( void *pvParameters );
-
-/*
- * Creates a pseudo random sized buffer of data to send to the echo server.
- */
-static BaseType_t prvCreateTxData( char *ucBuffer, uint32_t ulBufferLength );
-
-/*-----------------------------------------------------------*/
-
-/* Rx and Tx time outs are used to ensure the sockets do not wait too long for
-missing data. */
-static const TickType_t xReceiveTimeOut = pdMS_TO_TICKS( 4000 );
-static const TickType_t xSendTimeOut = pdMS_TO_TICKS( 2000 );
-
-/* Counters for each created task - for inspection only. */
-static uint32_t ulTxRxCycles[ echoNUM_ECHO_CLIENTS ] = { 0 },
- ulTxRxFailures[ echoNUM_ECHO_CLIENTS ] = { 0 },
- ulConnections[ echoNUM_ECHO_CLIENTS ] = { 0 };
-
-/* Rx and Tx buffers for each created task. */
-static char cTxBuffers[ echoNUM_ECHO_CLIENTS ][ echoBUFFER_SIZES ],
- cRxBuffers[ echoNUM_ECHO_CLIENTS ][ echoBUFFER_SIZES ];
-
-/*-----------------------------------------------------------*/
-
-void vStartTCPEchoClientTasks_SingleTasks( uint16_t usTaskStackSize, UBaseType_t uxTaskPriority )
-{
-BaseType_t x;
-
- /* Create the echo client tasks. */
- for( x = 0; x < echoNUM_ECHO_CLIENTS; x++ )
- {
- xTaskCreate( prvEchoClientTask, /* The function that implements the task. */
- "Echo0", /* Just a text name for the task to aid debugging. */
- usTaskStackSize, /* The stack size is defined in FreeRTOSIPConfig.h. */
- ( void * ) x, /* The task parameter, not used in this case. */
- uxTaskPriority, /* The priority assigned to the task is defined in FreeRTOSConfig.h. */
- NULL ); /* The task handle is not used. */
- }
-}
-/*-----------------------------------------------------------*/
-
-static void prvEchoClientTask( void *pvParameters )
-{
-Socket_t xSocket;
-struct freertos_sockaddr xEchoServerAddress;
-int32_t lLoopCount = 0UL;
-const int32_t lMaxLoopCount = 1;
-volatile uint32_t ulTxCount = 0UL;
-BaseType_t xReceivedBytes, xReturned, xInstance;
-BaseType_t lTransmitted, lStringLength;
-char *pcTransmittedString, *pcReceivedString;
-TickType_t xTimeOnEntering;
-
- #if( ipconfigUSE_TCP_WIN == 1 )
-
- WinProperties_t xWinProps;
-
- /* Fill in the buffer and window sizes that will be used by the socket. */
- xWinProps.lTxBufSize = ipconfigTCP_TX_BUFFER_LENGTH;
- xWinProps.lTxWinSize = configECHO_CLIENT_TX_WINDOW_SIZE;
- xWinProps.lRxBufSize = ipconfigTCP_RX_BUFFER_LENGTH;
- xWinProps.lRxWinSize = configECHO_CLIENT_RX_WINDOW_SIZE;
-
- #endif /* ipconfigUSE_TCP_WIN */
-
- /* This task can be created a number of times. Each instance is numbered
- to enable each instance to use a different Rx and Tx buffer. The number is
- passed in as the task's parameter. */
- xInstance = ( BaseType_t ) pvParameters;
-
- /* Point to the buffers to be used by this instance of this task. */
- pcTransmittedString = &( cTxBuffers[ xInstance ][ 0 ] );
- pcReceivedString = &( cRxBuffers[ xInstance ][ 0 ] );
-
- /* Echo requests are sent to the echo server. The address of the echo
- server is configured by the constants configECHO_SERVER_ADDR0 to
- configECHO_SERVER_ADDR3 in FreeRTOSConfig.h. */
- xEchoServerAddress.sin_port = FreeRTOS_htons( echoECHO_PORT );
- xEchoServerAddress.sin_addr = FreeRTOS_inet_addr_quick( configECHO_SERVER_ADDR0,
- configECHO_SERVER_ADDR1,
- configECHO_SERVER_ADDR2,
- configECHO_SERVER_ADDR3 );
-
- for( ;; )
- {
- /* Create a TCP socket. */
- xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
- configASSERT( xSocket != FREERTOS_INVALID_SOCKET );
-
- /* Set a time out so a missing reply does not cause the task to block
- indefinitely. */
- FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) );
- FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_SNDTIMEO, &xSendTimeOut, sizeof( xSendTimeOut ) );
-
- #if( ipconfigUSE_TCP_WIN == 1 )
- {
- /* Set the window and buffer sizes. */
- FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_WIN_PROPERTIES, ( void * ) &xWinProps, sizeof( xWinProps ) );
- }
- #endif /* ipconfigUSE_TCP_WIN */
-
- /* Connect to the echo server. */
- if( FreeRTOS_connect( xSocket, &xEchoServerAddress, sizeof( xEchoServerAddress ) ) == 0 )
- {
- ulConnections[ xInstance ]++;
-
- /* Send a number of echo requests. */
- for( lLoopCount = 0; lLoopCount < lMaxLoopCount; lLoopCount++ )
- {
- /* Create the string that is sent to the echo server. */
- lStringLength = prvCreateTxData( pcTransmittedString, echoBUFFER_SIZES );
-
- /* Add in some unique text at the front of the string. */
- sprintf( pcTransmittedString, "TxRx message number %u", ( unsigned ) ulTxCount );
- ulTxCount++;
-
- /* Send the string to the socket. */
- lTransmitted = FreeRTOS_send( xSocket, /* The socket being sent to. */
- ( void * ) pcTransmittedString, /* The data being sent. */
- lStringLength, /* The length of the data being sent. */
- 0 ); /* No flags. */
-
- if( lTransmitted < 0 )
- {
- /* Error? */
- break;
- }
-
- /* Clear the buffer into which the echoed string will be
- placed. */
- memset( ( void * ) pcReceivedString, 0x00, echoBUFFER_SIZES );
- xReceivedBytes = 0;
-
- /* Receive data echoed back to the socket. */
- while( xReceivedBytes < lTransmitted )
- {
- xReturned = FreeRTOS_recv( xSocket, /* The socket being received from. */
- &( pcReceivedString[ xReceivedBytes ] ),/* The buffer into which the received data will be written. */
- lStringLength - xReceivedBytes, /* The size of the buffer provided to receive the data. */
- 0 ); /* No flags. */
-
- if( xReturned < 0 )
- {
- /* Error occurred. Latch it so it can be detected
- below. */
- xReceivedBytes = xReturned;
- break;
- }
- else if( xReturned == 0 )
- {
- /* Timed out. */
- break;
- }
- else
- {
- /* Keep a count of the bytes received so far. */
- xReceivedBytes += xReturned;
- }
- }
-
- /* If an error occurred it will be latched in xReceivedBytes,
- otherwise xReceived bytes will be just that - the number of
- bytes received from the echo server. */
- if( xReceivedBytes > 0 )
- {
- /* Compare the transmitted string to the received string. */
- configASSERT( strncmp( pcReceivedString, pcTransmittedString, lTransmitted ) == 0 );
- if( strncmp( pcReceivedString, pcTransmittedString, lTransmitted ) == 0 )
- {
- /* The echo reply was received without error. */
- ulTxRxCycles[ xInstance ]++;
- }
- else
- {
- /* The received string did not match the transmitted
- string. */
- ulTxRxFailures[ xInstance ]++;
- break;
- }
- }
- else if( xReceivedBytes < 0 )
- {
- /* FreeRTOS_recv() returned an error. */
- break;
- }
- else
- {
- /* Timed out without receiving anything? */
- break;
- }
- }
-
- /* Finished using the connected socket, initiate a graceful close:
- FIN, FIN+ACK, ACK. */
- FreeRTOS_shutdown( xSocket, FREERTOS_SHUT_RDWR );
-
- /* Expect FreeRTOS_recv() to return an error once the shutdown is
- complete. */
- xTimeOnEntering = xTaskGetTickCount();
- do
- {
- xReturned = FreeRTOS_recv( xSocket, /* The socket being received from. */
- &( pcReceivedString[ 0 ] ), /* The buffer into which the received data will be written. */
- echoBUFFER_SIZES, /* The size of the buffer provided to receive the data. */
- 0 );
-
- if( xReturned < 0 )
- {
- break;
- }
-
- } while( ( xTaskGetTickCount() - xTimeOnEntering ) < xReceiveTimeOut );
- }
-
- /* Close this socket before looping back to create another. */
- FreeRTOS_closesocket( xSocket );
-
- /* Pause for a short while to ensure the network is not too
- congested. */
- vTaskDelay( echoLOOP_DELAY );
- }
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvCreateTxData( char *cBuffer, uint32_t ulBufferLength )
-{
-BaseType_t lCharactersToAdd, lCharacter;
-char cChar = '0';
-const BaseType_t lMinimumLength = 60;
-
- /* Randomise the number of characters that will be sent in the echo
- request. */
- do
- {
- lCharactersToAdd = ipconfigRAND32() % ( ulBufferLength - 20UL );
- } while ( ( lCharactersToAdd == 0 ) || ( lCharactersToAdd < lMinimumLength ) ); /* Must be at least enough to add the unique text to the start of the string later. */
-
- /* Fill the buffer. */
- for( lCharacter = 0; lCharacter < lCharactersToAdd; lCharacter++ )
- {
- cBuffer[ lCharacter ] = cChar;
- cChar++;
-
- if( cChar > '~' )
- {
- cChar = '0';
- }
- }
-
- return lCharactersToAdd;
-}
-/*-----------------------------------------------------------*/
-
-BaseType_t xAreSingleTaskTCPEchoClientsStillRunning( void )
-{
-static uint32_t ulLastEchoSocketCount[ echoNUM_ECHO_CLIENTS ] = { 0 }, ulLastConnections[ echoNUM_ECHO_CLIENTS ] = { 0 };
-BaseType_t xReturn = pdPASS, x;
-
- /* Return fail is the number of cycles does not increment between
- consecutive calls. */
- for( x = 0; x < echoNUM_ECHO_CLIENTS; x++ )
- {
- if( ulTxRxCycles[ x ] == ulLastEchoSocketCount[ x ] )
- {
- xReturn = pdFAIL;
- }
- else
- {
- ulLastEchoSocketCount[ x ] = ulTxRxCycles[ x ];
- }
-
- if( ulConnections[ x ] == ulLastConnections[ x ] )
- {
- xReturn = pdFAIL;
- }
- else
- {
- ulConnections[ x ] = ulLastConnections[ x ];
- }
- }
-
- return xReturn;
-}
-
-#endif /* ipconfigUSE_TCP */
-
diff --git a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_TCP_Demos/TFTPServer.c b/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_TCP_Demos/TFTPServer.c
deleted file mode 100644
index 0e93f77..0000000
--- a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_TCP_Demos/TFTPServer.c
+++ /dev/null
@@ -1,582 +0,0 @@
-/*
- FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
- All rights reserved
-
- VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
-
- This file is part of the FreeRTOS distribution.
-
- FreeRTOS is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License (version 2) as published by the
- Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
-
- ***************************************************************************
- >>! NOTE: The modification to the GPL is included to allow you to !<<
- >>! distribute a combined work that includes FreeRTOS without being !<<
- >>! obliged to provide the source code for proprietary components !<<
- >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
-
- FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. Full license text is available on the following
- link: http://www.freertos.org/a00114.html
-
- ***************************************************************************
- * *
- * FreeRTOS provides completely free yet professionally developed, *
- * robust, strictly quality controlled, supported, and cross *
- * platform software that is more than just the market leader, it *
- * is the industry's de facto standard. *
- * *
- * Help yourself get started quickly while simultaneously helping *
- * to support the FreeRTOS project by purchasing a FreeRTOS *
- * tutorial book, reference manual, or both: *
- * http://www.FreeRTOS.org/Documentation *
- * *
- ***************************************************************************
-
- http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
- the FAQ page "My application does not run, what could be wrong?". Have you
- defined configASSERT()?
-
- http://www.FreeRTOS.org/support - In return for receiving this top quality
- embedded software for free we request you assist our global community by
- participating in the support forum.
-
- http://www.FreeRTOS.org/training - Investing in training allows your team to
- be as productive as possible as early as possible. Now you can receive
- FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
- Ltd, and the world's leading authority on the world's leading RTOS.
-
- http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
- including FreeRTOS+Trace - an indispensable productivity tool, a DOS
- compatible FAT file system, and our tiny thread aware UDP/IP stack.
-
- http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
- Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
-
- http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
- Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
- licenses offer ticketed support, indemnification and commercial middleware.
-
- http://www.SafeRTOS.com - High Integrity Systems also provide a safety
- engineered and independently SIL3 certified version for use in safety and
- mission critical applications that require provable dependability.
-
- 1 tab == 4 spaces!
-*/
-
-/*
- * A basic TFTP server that can currently only be used to receive files, and not
- * send files. This is a slim implementation intended for use in boot loaders
- * and other applications that require over the air reception of files.
- */
-
-/* Standard includes. */
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-#include "task.h"
-
-/* FreeRTOS+TCP includes. */
-#include "FreeRTOS_IP.h"
-#include "FreeRTOS_Sockets.h"
-
-/* FreeRTOS+FAT includes. */
-#include "ff_stdio.h"
-
-#if( ipconfigALLOW_SOCKET_SEND_WITHOUT_BIND != 1 )
- #error ipconfigALLOW_SOCKET_SEND_WITHOUT_BIND must be set to one to use this TFTP server.
-#endif
-
-#if( configTICK_RATE_HZ > 1000 )
- #error The TFTP server uses the pdMS_TO_TICKS() macro, so configTICK_RATE_HZ must be less than or equal to 1000
-#endif
-
-#ifndef ipconfigTFTP_TIME_OUT_MS
- #define ipconfigTFTP_TIME_OUT_MS ( 10000 )
-#endif
-
-#ifndef ipconfigTFTP_MAX_RETRIES
- #define ipconfigTFTP_MAX_RETRIES ( 6 )
-#endif
-
-/* Standard/expected TFTP port number. */
-#define tftpPORT_NUMBER ( ( uint16_t ) 69 )
-
-/* Offset to the file name within the frame. */
-#define tftpFILE_NAME_OFFSET ( 2 )
-
-/* Number of bytes in the Ack message. */
-#define tftpACK_MESSAGE_LENGTH 4
-
-/* Files are sent in fixed length blocks of 512 (the original maximum). */
-#define tftpMAX_DATA_LENGTH ( ( size_t ) 512 )
-
-/* Standard TFTP opcodes. */
-typedef enum
-{
- eReadRequest = 1,
- eWriteRequest,
- eData,
- eAck,
- eError
-} eTFTPOpcode_t;
-
-/* Error codes from the RFC. */
-typedef enum
-{
- eFileNotFound = 1,
- eAccessViolation,
- eDiskFull,
- eIllegalTFTPOperation,
- eUnknownTransferID,
- eFileAlreadyExists
-} eTFTPErrorCode_t;
-
-/* Header used in data transfer packets. */
-#include "pack_struct_start.h"
-struct DataPacketHeader
-{
- uint16_t usOpcode;
- uint16_t usBlockNumber;
-}
-#include "pack_struct_end.h"
-typedef struct DataPacketHeader TFTPBlockNumberHeader_t;
-
-/*
- * Manages a single TFTP connection at a time.
- */
-static void prvSimpleTFTPServerTask( void *pvParameters );
-
-/*
- * Manage the reception of a file. If the file is received correctly then
- * return pdPASS, otherwise return pdFAIL.
- */
-static BaseType_t prvReceiveFile( FF_FILE *pxFile, struct freertos_sockaddr *pxClient );
-
-/*
- * Send an error frame to the client.
- */
-static void prvSendTFTPError( Socket_t xSocket, struct freertos_sockaddr *pxClient, eTFTPErrorCode_t eErrorCode );
-
-/*
- * Check a received write request contains a potentially valid file name string,
- * and is a binary mode transfer. If so return a pointer to the file name with
- * the write request packet received from the network, otherwise return NULL.
- */
-static const char* prvValidateWriteRequest( Socket_t xSocket, struct freertos_sockaddr *pxClient, uint8_t *pucUDPPayloadBuffer );
-
-/*
- * Called after a valid write request has been received to first check the file
- * does not already exist, and if the file does not exist, create the file ready
- * to be written. If the file did already exist, or if the file could not be
- * created, then NULL is returned - otherwise a handle to the created file is
- * returned.
- */
-static FF_FILE* prvValidateFileToWrite( Socket_t xSocket, struct freertos_sockaddr *pxClient, const char *pcFileName );
-
-/*
- * Send an acknowledgement packet to pxClient with block number usBlockNumber.
- */
-static void prvSendAcknowledgement( Socket_t xSocket, struct freertos_sockaddr *pxClient, uint16_t usBlockNumber );
-
-/* The index for the error string below MUST match the value of the applicable
-eTFTPErrorCode_t error code value. */
-static const char *cErrorStrings[] =
-{
- NULL, /* Not valid. */
- "File not found.",
- "Access violation.",
- "Disk full or allocation exceeded.",
- "Illegal TFTP operation.",
- "Unknown transfer ID.",
- "File already exists.",
- "No such user."
-};
-
-/*-----------------------------------------------------------*/
-
-void vStartTFTPServerTask( uint16_t usStackSize, UBaseType_t uxPriority )
-{
- /* A single server task is created. Currently this is only capable of
- managing one TFTP transfer at a time. */
- xTaskCreate( prvSimpleTFTPServerTask, "TFTPd", usStackSize, NULL, uxPriority, NULL );
-}
-/*-----------------------------------------------------------*/
-
-static void prvSimpleTFTPServerTask( void *pvParameters )
-{
-int32_t lBytes;
-uint8_t *pucUDPPayloadBuffer;
-struct freertos_sockaddr xClient, xBindAddress;
-uint32_t xClientLength = sizeof( xClient ), ulIPAddress;
-Socket_t xTFTPListeningSocket;
-const char *pcFileName;
-FF_FILE *pxFile;
-
- /* Just to prevent compiler warnings. */
- ( void ) pvParameters;
-
- /* Attempt to open the socket. The receive block time defaults to the max
- delay, so there is no need to set that separately. */
- xTFTPListeningSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP );
- configASSERT( xTFTPListeningSocket != FREERTOS_INVALID_SOCKET );
-
- /* Bind to the standard TFTP port. */
- FreeRTOS_GetAddressConfiguration( &ulIPAddress, NULL, NULL, NULL );
- xBindAddress.sin_addr = ulIPAddress;
- xBindAddress.sin_port = FreeRTOS_htons( tftpPORT_NUMBER );
- FreeRTOS_bind( xTFTPListeningSocket, &xBindAddress, sizeof( xBindAddress ) );
-
- for( ;; )
- {
- /* Look for the start of a new transfer on the TFTP port. ulFlags has
- the zero copy bit set (FREERTOS_ZERO_COPY) indicating to the stack that
- a reference to the received data should be passed out to this task using
- the second parameter to the FreeRTOS_recvfrom() call. When this is done
- the IP stack is no longer responsible for releasing the buffer, and the
- task *must* return the buffer to the stack when it is no longer
- needed. */
- lBytes = FreeRTOS_recvfrom( xTFTPListeningSocket, ( void * ) &pucUDPPayloadBuffer, 0, FREERTOS_ZERO_COPY, &xClient, &xClientLength );
-
- if( lBytes >= 0 )
- {
- /* Could this be a new write request? The opcode is contained in
- the first two bytes of the received data. */
- if( ( pucUDPPayloadBuffer[ 0 ] == ( uint8_t ) 0 ) && ( pucUDPPayloadBuffer[ 1 ] == ( uint8_t ) eWriteRequest ) )
- {
- /* If the write request is valid pcFileName will get set to
- point to the file name within pucWriteRequestBuffer - otherwise
- an appropriate error will be sent on xTFTPListeningSocket. */
- pcFileName = prvValidateWriteRequest( xTFTPListeningSocket, &xClient, pucUDPPayloadBuffer );
-
- if( pcFileName != NULL )
- {
- /* If the file does not already exist, and can be created,
- then xFile will get set to the file's open handle.
- Otherwise an appropriate error will be sent on
- xTFTPListeningSocket. */
- pxFile = prvValidateFileToWrite( xTFTPListeningSocket, &xClient, pcFileName );
-
- if( pxFile != NULL )
- {
- /* Manage reception of the file. */
- prvReceiveFile( pxFile, &xClient );
- }
- }
- }
- else
- {
- /* Not a transfer ID handled by this server. */
- prvSendTFTPError( xTFTPListeningSocket, &xClient, eUnknownTransferID );
- }
-
- /* The buffer was received using zero copy, so *must* be freed. */
- FreeRTOS_ReleaseUDPPayloadBuffer( pucUDPPayloadBuffer );
- }
- }
-}
-/*-----------------------------------------------------------*/
-
-static BaseType_t prvReceiveFile( FF_FILE *pxFile, struct freertos_sockaddr *pxClient )
-{
-BaseType_t xReturn = pdPASS, xRetries = 0;
-uint16_t usExpectedBlockNumber;
-Socket_t xTFTPRxSocket = FREERTOS_INVALID_SOCKET;
-TickType_t xRxTimeout = pdMS_TO_TICKS( ipconfigTFTP_TIME_OUT_MS );
-int32_t lBytes;
-uint8_t *pucFileBuffer;
-struct freertos_sockaddr xClient;
-uint32_t xClientLength = sizeof( xClient );
-TFTPBlockNumberHeader_t *pxHeader;
-size_t xBlocksWritten, xBytesOfFileDataReceived = tftpMAX_DATA_LENGTH;
-const size_t xBlocksToWrite = 1;
-
- /* The file is open for writing, now create the socket on which the file
- will be received from the client. Note the socket is not bound here - so
- will be automatically bound to a port number selected by the IP stack when
- it is used for the first time. */
- xTFTPRxSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP );
-
- if( xTFTPRxSocket != FREERTOS_INVALID_SOCKET )
- {
- /* The socket's Rx block time is set to the user configurable timeout
- value. */
- FreeRTOS_setsockopt( xTFTPRxSocket, 0, FREERTOS_SO_RCVTIMEO, &xRxTimeout, sizeof( xRxTimeout ) );
-
- /* Acknowledge the write request so the client starts to send the file.
- The first acknowledgment does not have a corresponding block number so
- the special case block number 0 is used. */
- usExpectedBlockNumber = 0;
-
- do
- {
- /* The acknowledgment sent here may be a duplicate if the last call
- to FreeRTOS_recvfrom() timee out. */
- prvSendAcknowledgement( xTFTPRxSocket, pxClient, usExpectedBlockNumber );
-
- /* Wait for next data packet. Zero copy is used so it is the
- responsibility of this task to free the received data once it is no
- longer required. */
- lBytes = FreeRTOS_recvfrom( xTFTPRxSocket, ( void * ) &pucFileBuffer, 0, FREERTOS_ZERO_COPY, &xClient, &xClientLength );
-
- if( lBytes == 0 )
- {
- /* Timed out. */
- FreeRTOS_printf( ( "Error: Timeout.\n" ) );
- xRetries++;
-
- if( xRetries > ipconfigTFTP_MAX_RETRIES )
- {
- FreeRTOS_printf( ( "Error: Retry limit exceeded.\n" ) );
- xReturn = pdFAIL;
- }
- }
- else
- {
- /* Data received. It is expected to be the next sequential
- block. */
- usExpectedBlockNumber++;
- pxHeader = ( TFTPBlockNumberHeader_t * ) pucFileBuffer;
- pxHeader->usOpcode = FreeRTOS_ntohs( pxHeader->usOpcode );
- pxHeader->usBlockNumber = FreeRTOS_ntohs( pxHeader->usBlockNumber );
-
- /* Is the data as expected and from the expected IP address and
- port? */
- if( ( pxHeader->usOpcode == ( uint16_t ) eData ) &&
- ( pxHeader->usBlockNumber == usExpectedBlockNumber ) &&
- ( pxClient->sin_addr == xClient.sin_addr ) &&
- ( pxClient->sin_port == xClient.sin_port ) )
- {
- /* Everything in the packet other than the header is file
- data. */
- xBytesOfFileDataReceived = ( size_t ) lBytes - sizeof( TFTPBlockNumberHeader_t );
- FreeRTOS_printf( ( "Received %d bytes of file data.\n", ( int ) xBytesOfFileDataReceived ) );
-
- /* Ack the data then write the data to the file. */
- prvSendAcknowledgement( xTFTPRxSocket, pxClient, usExpectedBlockNumber );
-
- /* The data is located by jumping over the header. */
- /*_RB_ Is it ok to write 0 bytes? */
- xBlocksWritten = ff_fwrite( pucFileBuffer + sizeof( TFTPBlockNumberHeader_t ),
- xBytesOfFileDataReceived,
- xBlocksToWrite,
- pxFile );
-
- if( xBlocksWritten != xBlocksToWrite )
- {
- /* File could not be written. */
- prvSendTFTPError( xTFTPRxSocket, pxClient, eDiskFull );
- xReturn = pdFAIL;
- }
-
- /* Start to receive the next block. */
- xRetries = 0;
- }
- else
- {
- prvSendTFTPError( xTFTPRxSocket, pxClient, eIllegalTFTPOperation );
- xReturn = pdFAIL;
- }
-
- /* pucFileBuffer was obtained using zero copy mode, so the
- buffer must be freed now its contents have been written to the
- disk. */
- FreeRTOS_ReleaseUDPPayloadBuffer( pucFileBuffer );
- }
-
- /* Until a disk write fails, or the maximum number of retries is
- exceeded, or fewer bytes than tftpMAX_DATA_LENGTH are received (which
- indicates the end of the file). */
- } while( ( xReturn != pdFAIL ) && ( xBytesOfFileDataReceived == tftpMAX_DATA_LENGTH ) );
-
- FreeRTOS_printf( ( "Closing connection.\n" ) );
- FreeRTOS_closesocket( xTFTPRxSocket );
- }
- else
- {
- /* An error could be returned here, but it is probably cleaner to just
- time out as the error would have to be sent via the listening socket
- outside of this function. */
- FreeRTOS_printf( ( "Could not create socket to receive file.\n" ) );
- }
-
- ff_fclose( pxFile );
-
- return xReturn;
-}
-/*-----------------------------------------------------------*/
-
-void prvSendAcknowledgement( Socket_t xSocket, struct freertos_sockaddr *pxClient, uint16_t usBlockNumber )
-{
-/* Small fixed size buffer, so not much to be gained by using the zero copy
-interface, just send the buffer directly. */
-TFTPBlockNumberHeader_t xAckMessage;
-
- xAckMessage.usOpcode = FreeRTOS_htons( ( ( uint16_t ) eAck ) );
- xAckMessage.usBlockNumber = FreeRTOS_htons( usBlockNumber );
- FreeRTOS_sendto( xSocket, ( void * ) &xAckMessage, tftpACK_MESSAGE_LENGTH, 0, pxClient, sizeof( struct freertos_sockaddr ) );
-}
-/*-----------------------------------------------------------*/
-
-static FF_FILE* prvValidateFileToWrite( Socket_t xSocket, struct freertos_sockaddr *pxClient, const char *pcFileName )
-{
-FF_FILE *pxFile;
-
- FreeRTOS_printf( ( "Write request for %s received\n", pcFileName ) );
-
- /* The file cannot be received if it already exists. Attempt to open the
- file in read mode to see if it exists. */
- pxFile = ff_fopen( pcFileName, "r" );
-
- if( pxFile != NULL )
- {
- /* Can't receive a new file without deleting the old one first. */
- ff_fclose( pxFile );
- pxFile = NULL;
- prvSendTFTPError( xSocket, pxClient, eFileAlreadyExists );
- }
- else
- {
- /* The file does not already exist. Attempt to open the file in write
- mode, which will cause it to be created. */
- pxFile = ff_fopen( pcFileName, "w" );
-
- if( pxFile == NULL )
- {
- /* The file cannot be created. */
- prvSendTFTPError( xSocket, pxClient, eAccessViolation );
- }
- }
-
- return pxFile;
-}
-/*-----------------------------------------------------------*/
-
-static const char* prvValidateWriteRequest( Socket_t xSocket, struct freertos_sockaddr *pxClient, uint8_t *pucUDPPayloadBuffer )
-{
-char *pcFileName;
-BaseType_t x;
-const char *pcOctedMode = "octet";
-
- /* pcFileName is set to point to the file name which is inside the write
- request frame, so its important not to free the frame until the operation is
- over. The start of the file name string is after the opcode, so two bytes
- into the packet. */
- pcFileName = ( char * ) &( pucUDPPayloadBuffer[ tftpFILE_NAME_OFFSET ] );
-
- /* Sanity check the file name. */
- for( x = 0; x < ffconfigMAX_FILENAME; x++ )
- {
- if( pcFileName[ x ] == 0x00 )
- {
- /* The end of the string was located. */
- break;
- }
- else if( ( pcFileName[ x ] < ' ' ) || ( pcFileName[ x ] > '~' ) )
- {
- /* Not a valid file name character. */
- pcFileName = NULL;
- break;
- }
- else
- {
- /* Just a character in the file name. */
- }
- }
-
- if( pcFileName != NULL )
- {
- /* Only binary transfers are supported, indicated by an 'octet' mode
- string following the file name. +1 to move past the null terminator to
- the start of the next string. */
- x++;
- if( strcmpi( pcOctedMode, ( const char * ) &( pucUDPPayloadBuffer[ tftpFILE_NAME_OFFSET + x ] ) ) != 0 )
- {
- /* Not the expected mode. */
- prvSendTFTPError( xSocket, pxClient, eIllegalTFTPOperation );
- pcFileName = NULL;
- }
- }
- else
- {
- prvSendTFTPError( xSocket, pxClient, eFileNotFound );
- }
-
- return pcFileName;
-}
-/*-----------------------------------------------------------*/
-
-static void prvSendTFTPError( Socket_t xSocket, struct freertos_sockaddr *pxClient, eTFTPErrorCode_t eErrorCode )
-{
-uint8_t *pucUDPPayloadBuffer = NULL;
-const size_t xFixedSizePart = ( size_t ) 5; /* 2 byte opcode, plus two byte error code, plus string terminating 0. */
-const size_t xNumberOfErrorStrings = sizeof( cErrorStrings ) / sizeof( char * );
-size_t xErrorCode = ( size_t ) eErrorCode, xTotalLength = 0; /* Only initialised to keep compiler quiet. */
-const char *pcErrorString = NULL;
-int32_t lReturned;
-
- /* The total size of the packet to be sent depends on the length of the
- error string. */
- if( xErrorCode < xNumberOfErrorStrings )
- {
- pcErrorString = cErrorStrings[ xErrorCode ];
-
- /* This task is going to send using the zero copy interface. The data
- being sent is therefore written directly into a buffer that is passed
- into, rather than copied into, the FreeRTOS_sendto() function. First
- obtain a buffer of adequate length from the IP stack into which the
- error packet will be written. Although a max delay is used, the actual
- delay will be capped to ipconfigMAX_SEND_BLOCK_TIME_TICKS. */
- xTotalLength = strlen( pcErrorString ) + xFixedSizePart;
- pucUDPPayloadBuffer = ( uint8_t * ) FreeRTOS_GetUDPPayloadBuffer( xTotalLength, portMAX_DELAY );
- }
-
- if( pucUDPPayloadBuffer != NULL )
- {
- FreeRTOS_printf( ( "Error: %s\n", pcErrorString ) );
-
- /* Create error packet: Opcode. */
- pucUDPPayloadBuffer[ 0 ] = 0;
- pucUDPPayloadBuffer[ 1 ] = ( uint8_t ) eError;
-
- /* Create error packet: Error code. */
- pucUDPPayloadBuffer[ 2 ] = 0;
- pucUDPPayloadBuffer[ 3 ] = ( uint8_t ) eErrorCode;
-
- /* Create error packet: Error string. */
- strcpy( ( ( char * ) &( pucUDPPayloadBuffer[ 4 ] ) ), pcErrorString );
-
- /* Pass the buffer into the send function. ulFlags has the
- FREERTOS_ZERO_COPY bit set so the IP stack will take control of the
- buffer rather than copy data out of the buffer. */
- lReturned = FreeRTOS_sendto( xSocket, /* The socket to which the error frame is sent. */
- ( void * ) pucUDPPayloadBuffer, /* A pointer to the the data being sent. */
- xTotalLength, /* The length of the data being sent. */
- FREERTOS_ZERO_COPY, /* ulFlags with the FREERTOS_ZERO_COPY bit set. */
- pxClient, /* Where the data is being sent. */
- sizeof( *pxClient ) );
-
- if( lReturned == 0 )
- {
- /* The send operation failed, so this task is still responsible
- for the buffer obtained from the IP stack. To ensure the buffer
- is not lost it must either be used again, or, as in this case,
- returned to the IP stack using FreeRTOS_ReleaseUDPPayloadBuffer(). */
- FreeRTOS_ReleaseUDPPayloadBuffer( ( void * ) pucUDPPayloadBuffer );
- }
- else
- {
- /* The send was successful so the IP stack is now managing the
- buffer pointed to by pucUDPPayloadBuffer, and the IP stack will
- return the buffer once it has been sent. */
- }
- }
-}
-
-
diff --git a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_TCP_Demos/TraceMacros/Example1/DemoIPTrace.c b/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_TCP_Demos/TraceMacros/Example1/DemoIPTrace.c
deleted file mode 100644
index 925c094..0000000
--- a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_TCP_Demos/TraceMacros/Example1/DemoIPTrace.c
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
- All rights reserved
-
- VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
-
- This file is part of the FreeRTOS distribution.
-
- FreeRTOS is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License (version 2) as published by the
- Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
-
- ***************************************************************************
- >>! NOTE: The modification to the GPL is included to allow you to !<<
- >>! distribute a combined work that includes FreeRTOS without being !<<
- >>! obliged to provide the source code for proprietary components !<<
- >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
-
- FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. Full license text is available on the following
- link: http://www.freertos.org/a00114.html
-
- ***************************************************************************
- * *
- * FreeRTOS provides completely free yet professionally developed, *
- * robust, strictly quality controlled, supported, and cross *
- * platform software that is more than just the market leader, it *
- * is the industry's de facto standard. *
- * *
- * Help yourself get started quickly while simultaneously helping *
- * to support the FreeRTOS project by purchasing a FreeRTOS *
- * tutorial book, reference manual, or both: *
- * http://www.FreeRTOS.org/Documentation *
- * *
- ***************************************************************************
-
- http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
- the FAQ page "My application does not run, what could be wrong?". Have you
- defined configASSERT()?
-
- http://www.FreeRTOS.org/support - In return for receiving this top quality
- embedded software for free we request you assist our global community by
- participating in the support forum.
-
- http://www.FreeRTOS.org/training - Investing in training allows your team to
- be as productive as possible as early as possible. Now you can receive
- FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
- Ltd, and the world's leading authority on the world's leading RTOS.
-
- http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
- including FreeRTOS+Trace - an indispensable productivity tool, a DOS
- compatible FAT file system, and our tiny thread aware UDP/IP stack.
-
- http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
- Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
-
- http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
- Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
- licenses offer ticketed support, indemnification and commercial middleware.
-
- http://www.SafeRTOS.com - High Integrity Systems also provide a safety
- engineered and independently SIL3 certified version for use in safety and
- mission critical applications that require provable dependability.
-
- 1 tab == 4 spaces!
-*/
-
-/*
- * This file, along with DemoIPTrace.h, provides a basic example use of the
- * FreeRTOS+TCP trace macros. The statistics gathered here can be viewed in
- * the command line interface.
- * See http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/UDP_CLI.html
- *
- * A simple generic mechanism is used that allocates a structure (see the
- * ExampleDebugStatEntry_t definition in DemoIPTrace.h) to each ID defined in
- * the same header file. The structures are stored in an array (see the
- * xIPTraceValues[] below.
- *
- * The structure associates a function with a data value. See the
- * vPerformAction and ulData members of ExampleDebugStatEntry_t respectively.
- * The function is used to manipulate the data. At the time of writing two
- * functions can be used - these are prvIncrementEventCount() which simply
- * increments the data each time it is called, and prvStoreLowest() which
- * sets the data to the lowest value of an input parameter ever seen. For
- * example, to store the lowest ever number of free network buffer descriptors
- * the parameter value is the current number of network buffer descriptors.
- *
- * The trace macros themselves are defined in DemoIPTrace.h and just invoke
- * vExampleDebugStatUpdate(), passing in an ID value. vExampleDebugStatUpdate()
- * then just executes the function associated with that value (prvStoreLowest(),
- * prvIncrementEventCount(), etc.) as defined in the xIPTraceValues[] array.
- */
-
-/* Standard includes. */
-#include <stdint.h>
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-#include "task.h"
-
-/* FreeRTOS+TCP includes. */
-#include "FreeRTOS_UDP_IP.h"
-#include "DemoIPTrace.h"
-
-/* It is possible to remove the trace macros using the
-configINCLUDE_DEMO_DEBUG_STATS setting in FreeRTOSIPConfig.h. */
-#if configINCLUDE_DEMO_DEBUG_STATS == 1
-
-/*
- * Each row in the xIPTraceValues[] table contains a pointer to a function that
- * updates the value for that row. Rows that latch the lowest value point to
- * this function (for example, this function can be used to latch the lowest
- * number of network buffers that were available during the execution of the
- * stack).
- */
-static void prvStoreLowest( uint32_t *pulCurrentValue, uint32_t ulCount );
-
-/*
- * Each row in the xIPTraceValues[] table contains a pointer to a function that
- * updates the value for that row. Rows that simply increment an event count
- * point to this function.
- */
-static void prvIncrementEventCount( uint32_t *pulCurrentValue, uint32_t ulCount );
-
-/* The header file defines the IDs within this table. The string is used to
-print a friendly message for the stat, and the function pointer is used to
-perform the action for the state - for example, note the lowest ever value for
-a stat, or just count the number of times the event occurs. */
-ExampleDebugStatEntry_t xIPTraceValues[] =
-{
- /* Comment out array entries to remove individual trace items. */
-
- { iptraceID_NETWORK_INTERFACE_RECEIVE, "Packets received by the network interface", prvIncrementEventCount, 0 },
- { iptraceID_NETWORK_INTERFACE_TRANSMIT, "Count of transmitted packets", prvIncrementEventCount, 0 },
- { iptraceID_PACKET_DROPPED_TO_GENERATE_ARP, "Count of packets dropped to generate ARP", prvIncrementEventCount, 0 },
- { iptraceID_NETWORK_BUFFER_OBTAINED, "Lowest ever available network buffers", prvStoreLowest, 0xffffUL },
- { iptraceID_NETWORK_EVENT_RECEIVED, "Lowest ever free space in network event queue", prvStoreLowest, 0xffffUL },
- { iptraceID_FAILED_TO_OBTAIN_NETWORK_BUFFER, "Count of failed attempts to obtain a network buffer", prvIncrementEventCount, 0 },
- { iptraceID_ARP_TABLE_ENTRY_EXPIRED, "Count of expired ARP entries", prvIncrementEventCount, 0 },
- { iptraceID_FAILED_TO_CREATE_SOCKET, "Count of failures to create a socket", prvIncrementEventCount, 0 },
- { iptraceID_RECVFROM_DISCARDING_BYTES, "Count of times recvfrom() has discarding bytes", prvIncrementEventCount, 0 },
- { iptraceID_ETHERNET_RX_EVENT_LOST, "Count of lost Etheret Rx events (event queue full?)", prvIncrementEventCount, 0 },
- { iptraceID_STACK_TX_EVENT_LOST, "Count of lost IP stack events (event queue full?)", prvIncrementEventCount, 0 },
- { ipconfigID_BIND_FAILED, "Count of failed calls to bind()", prvIncrementEventCount, 0 },
- { iptraceID_RECVFROM_TIMEOUT, "Count of receive timeouts", prvIncrementEventCount, 0 },
- { iptraceID_SENDTO_DATA_TOO_LONG, "Count of failed sends due to oversized payload", prvIncrementEventCount, 0 },
- { iptraceID_SENDTO_SOCKET_NOT_BOUND, "Count of failed sends due to unbound socket", prvIncrementEventCount, 0 },
- { iptraceID_NO_BUFFER_FOR_SENDTO, "Count of failed transmits due to timeout", prvIncrementEventCount, 0 },
- { iptraceID_WAIT_FOR_TX_DMA_DESCRIPTOR, "Number of times task had to wait to obtain a DMA Tx descriptor", prvIncrementEventCount, 0 },
- { iptraceID_FAILED_TO_NOTIFY_SELECT_GROUP, "Failed to notify select group", prvIncrementEventCount, 0 },
- { iptraceID_TOTAL_NETWORK_BUFFERS_OBTAINED, "Total network buffers obtained", prvIncrementEventCount, 0 },
- { iptraceID_TOTAL_NETWORK_BUFFERS_RELEASED, "Total network buffers released", prvIncrementEventCount, 0 }
-
-};
-
-/*-----------------------------------------------------------*/
-
-BaseType_t xExampleDebugStatEntries( void )
-{
- /* Return the number of entries in the xIPTraceValues[] table. */
- return ( BaseType_t ) ( sizeof( xIPTraceValues ) / sizeof( ExampleDebugStatEntry_t ) );
-}
-/*-----------------------------------------------------------*/
-
-void vExampleDebugStatUpdate( uint8_t ucIdentifier, uint32_t ulValue )
-{
-BaseType_t xIndex;
-const BaseType_t xEntries = sizeof( xIPTraceValues ) / sizeof( ExampleDebugStatEntry_t );
-
- /* Update an entry in the xIPTraceValues[] table. Each row in the table
- includes a pointer to a function that performs the actual update. This
- function just executes the update function from that table row.
-
- Search the array to find the identifier - this could be made more efficient
- by using the identifier as an index into the array - but that would come
- with the usability cost of needing to change all the identifiers above any
- identifiers that are later inserted into the table. */
- for( xIndex = 0; xIndex < xEntries; xIndex++ )
- {
- if( xIPTraceValues[ xIndex ].ucIdentifier == ucIdentifier )
- {
- xIPTraceValues[ xIndex ].vPerformAction( &( xIPTraceValues[ xIndex ].ulData ), ulValue );
- break;
- }
- }
-
- configASSERT( xIndex != xEntries );
-}
-/*-----------------------------------------------------------*/
-
-static void prvIncrementEventCount( uint32_t *pulCurrentValue, uint32_t ulCount )
-{
- /* Each row in the xIPTraceValues[] table contains a pointer to a function
- that updates the value for that row. Rows that simply increment an event
- count point to this function. */
- ( void ) ulCount;
- ( *pulCurrentValue )++;
-}
-/*-----------------------------------------------------------*/
-
-static void prvStoreLowest( uint32_t *pulCurrentValue, uint32_t ulCount )
-{
- /* Each row in the xIPTraceValues[] table contains a pointer to a function
- that updates the value for that row. Rows that latch the lowest value
- point to this function (for example, this function can be used to latch
- the lowest number of network buffers that were available during the
- execution of the stack). */
- if( ulCount < *pulCurrentValue )
- {
- *pulCurrentValue = ulCount;
- }
-}
-/*-----------------------------------------------------------*/
-
-
-#endif /* configINCLUDE_DEMO_DEBUG_STATS == 1 */
-
-
-
-
diff --git a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_TCP_Demos/TraceMacros/Example1/DemoIPTrace.h b/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_TCP_Demos/TraceMacros/Example1/DemoIPTrace.h
deleted file mode 100644
index 70c15b4..0000000
--- a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_TCP_Demos/TraceMacros/Example1/DemoIPTrace.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
- All rights reserved
-
- VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
-
- This file is part of the FreeRTOS distribution.
-
- FreeRTOS is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License (version 2) as published by the
- Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
-
- ***************************************************************************
- >>! NOTE: The modification to the GPL is included to allow you to !<<
- >>! distribute a combined work that includes FreeRTOS without being !<<
- >>! obliged to provide the source code for proprietary components !<<
- >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
-
- FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. Full license text is available on the following
- link: http://www.freertos.org/a00114.html
-
- ***************************************************************************
- * *
- * FreeRTOS provides completely free yet professionally developed, *
- * robust, strictly quality controlled, supported, and cross *
- * platform software that is more than just the market leader, it *
- * is the industry's de facto standard. *
- * *
- * Help yourself get started quickly while simultaneously helping *
- * to support the FreeRTOS project by purchasing a FreeRTOS *
- * tutorial book, reference manual, or both: *
- * http://www.FreeRTOS.org/Documentation *
- * *
- ***************************************************************************
-
- http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
- the FAQ page "My application does not run, what could be wrong?". Have you
- defined configASSERT()?
-
- http://www.FreeRTOS.org/support - In return for receiving this top quality
- embedded software for free we request you assist our global community by
- participating in the support forum.
-
- http://www.FreeRTOS.org/training - Investing in training allows your team to
- be as productive as possible as early as possible. Now you can receive
- FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
- Ltd, and the world's leading authority on the world's leading RTOS.
-
- http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
- including FreeRTOS+Trace - an indispensable productivity tool, a DOS
- compatible FAT file system, and our tiny thread aware UDP/IP stack.
-
- http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
- Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
-
- http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
- Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
- licenses offer ticketed support, indemnification and commercial middleware.
-
- http://www.SafeRTOS.com - High Integrity Systems also provide a safety
- engineered and independently SIL3 certified version for use in safety and
- mission critical applications that require provable dependability.
-
- 1 tab == 4 spaces!
-*/
-
-/*
- * This file, along with DemoIPTrace.c, provides a basic example use of the
- * FreeRTOS+TCP trace macros. The statistics gathered here can be viewed in
- * the command line interface.
- * See http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/UDP_CLI.html
- *
- * A simple generic mechanism is used that allocates a structure (see the
- * ExampleDebugStatEntry_t definition below) to each ID defined in this file.
- * The structures are stored in an array (see the xIPTraceValues[] array in
- * DemoIPTrace.c).
- *
- * The structure associates a function with a data value. See the
- * vPerformAction and ulData members of ExampleDebugStatEntry_t respectively.
- * The function is used to manipulate the data. At the time of writing two
- * functions can be used - these are prvIncrementEventCount() which simply
- * increments the data each time it is called, and prvStoreLowest() which
- * sets the data to the lowest value of an input parameter ever seen. For
- * example, to store the lowest ever number of free network buffer descriptors
- * the parameter value is the current number of network buffer descriptors.
- *
- * The trace macros themselves are defined in this file and just invoke
- * vExampleDebugStatUpdate(), passing in an ID value. vExampleDebugStatUpdate()
- * then just executes the function associated with that value (prvStoreLowest(),
- * prvIncrementEventCount(), etc.) as defined in the xIPTraceValues[] array.
- */
-
-#ifndef DEMO_IP_TRACE_MACROS_H
-#define DEMO_IP_TRACE_MACROS_H
-
-typedef void ( *vTraceAction_t )( uint32_t *, uint32_t );
-
-/* Type that defines each statistic being gathered. */
-typedef struct ExampleDebugStatEntry
-{
- uint8_t ucIdentifier; /* Unique identifier for statistic. */
- const char * const pucDescription; /* Text description for the statistic. */
- vTraceAction_t vPerformAction; /* Action to perform when the statistic is updated (increment counter, store minimum value, store maximum value, etc. */
- uint32_t ulData; /* The meaning of this data is dependent on the trace macro ID. */
-} ExampleDebugStatEntry_t;
-
-/* Unique identifiers used to locate the entry for each trace macro in the
-xIPTraceValues[] table defined in DemoIPTrace.c. See the comments at the top of
-this file. */
-#define iptraceID_NETWORK_INTERFACE_RECEIVE 0
-#define iptraceID_NETWORK_INTERFACE_TRANSMIT 1
-#define iptraceID_PACKET_DROPPED_TO_GENERATE_ARP 2
-#define iptraceID_NETWORK_BUFFER_OBTAINED 3
-#define iptraceID_NETWORK_BUFFER_OBTAINED_FROM_ISR 4
-#define iptraceID_NETWORK_EVENT_RECEIVED 5
-#define iptraceID_FAILED_TO_OBTAIN_NETWORK_BUFFER 6
-#define iptraceID_ARP_TABLE_ENTRY_EXPIRED 7
-#define iptraceID_FAILED_TO_CREATE_SOCKET 8
-#define iptraceID_RECVFROM_DISCARDING_BYTES 9
-#define iptraceID_ETHERNET_RX_EVENT_LOST 10
-#define iptraceID_STACK_TX_EVENT_LOST 11
-#define ipconfigID_BIND_FAILED 12
-#define iptraceID_RECVFROM_TIMEOUT 13
-#define iptraceID_SENDTO_DATA_TOO_LONG 14
-#define iptraceID_SENDTO_SOCKET_NOT_BOUND 15
-#define iptraceID_NO_BUFFER_FOR_SENDTO 16
-#define iptraceID_WAIT_FOR_TX_DMA_DESCRIPTOR 17
-#define iptraceID_FAILED_TO_NOTIFY_SELECT_GROUP 18
-#define iptraceID_TOTAL_NETWORK_BUFFERS_OBTAINED 19
-#define iptraceID_TOTAL_NETWORK_BUFFERS_RELEASED 20
-
-/* It is possible to remove the trace macros using the
-configINCLUDE_DEMO_DEBUG_STATS setting in FreeRTOSIPConfig.h. */
-#if configINCLUDE_DEMO_DEBUG_STATS == 1
-
- /* The trace macro definitions themselves. Any trace macros left undefined
- will default to be empty macros. See the comments at the top of this
- file. */
- #define iptraceNETWORK_BUFFER_OBTAINED( pxBufferAddress ) vExampleDebugStatUpdate( iptraceID_NETWORK_BUFFER_OBTAINED, uxQueueMessagesWaiting( ( QueueHandle_t ) xNetworkBufferSemaphore ) ); vExampleDebugStatUpdate( iptraceID_TOTAL_NETWORK_BUFFERS_OBTAINED, 0 )
- #define iptraceNETWORK_BUFFER_RELEASED( pxBufferAddress ) vExampleDebugStatUpdate( iptraceID_TOTAL_NETWORK_BUFFERS_RELEASED, 0 )
- #define iptraceNETWORK_BUFFER_OBTAINED_FROM_ISR( pxBufferAddress ) vExampleDebugStatUpdate( iptraceID_NETWORK_BUFFER_OBTAINED, uxQueueMessagesWaiting( ( QueueHandle_t ) xNetworkBufferSemaphore ) )
-
- #define iptraceNETWORK_EVENT_RECEIVED( eEvent ) { \
- uint16_t usSpace; \
- usSpace = ( uint16_t ) uxQueueMessagesWaiting( xNetworkEventQueue ); \
- /* Minus one as an event was removed before the space was queried. */ \
- usSpace = ( ipconfigEVENT_QUEUE_LENGTH - usSpace ) - 1; \
- vExampleDebugStatUpdate( iptraceID_NETWORK_EVENT_RECEIVED, usSpace ); \
- }
-
- #define iptraceFAILED_TO_OBTAIN_NETWORK_BUFFER() vExampleDebugStatUpdate( iptraceID_FAILED_TO_OBTAIN_NETWORK_BUFFER, 0 )
- #define iptraceARP_TABLE_ENTRY_EXPIRED( ulIPAddress ) vExampleDebugStatUpdate( iptraceID_ARP_TABLE_ENTRY_EXPIRED, 0 )
- #define iptracePACKET_DROPPED_TO_GENERATE_ARP( ulIPAddress ) vExampleDebugStatUpdate( iptraceID_PACKET_DROPPED_TO_GENERATE_ARP, 0 )
- #define iptraceFAILED_TO_CREATE_SOCKET() vExampleDebugStatUpdate( iptraceID_FAILED_TO_CREATE_SOCKET, 0 )
- #define iptraceRECVFROM_DISCARDING_BYTES( xNumberOfBytesDiscarded ) vExampleDebugStatUpdate( iptraceID_RECVFROM_DISCARDING_BYTES, 0 )
- #define iptraceETHERNET_RX_EVENT_LOST() vExampleDebugStatUpdate( iptraceID_ETHERNET_RX_EVENT_LOST, 0 )
- #define iptraceSTACK_TX_EVENT_LOST( xEvent ) vExampleDebugStatUpdate( iptraceID_STACK_TX_EVENT_LOST, 0 )
- #define iptraceBIND_FAILED( xSocket, usPort ) vExampleDebugStatUpdate( ipconfigID_BIND_FAILED, 0 )
- #define iptraceNETWORK_INTERFACE_TRANSMIT() vExampleDebugStatUpdate( iptraceID_NETWORK_INTERFACE_TRANSMIT, 0 )
- #define iptraceRECVFROM_TIMEOUT() vExampleDebugStatUpdate( iptraceID_RECVFROM_TIMEOUT, 0 )
- #define iptraceSENDTO_DATA_TOO_LONG() vExampleDebugStatUpdate( iptraceID_SENDTO_DATA_TOO_LONG, 0 )
- #define iptraceSENDTO_SOCKET_NOT_BOUND() vExampleDebugStatUpdate( iptraceID_SENDTO_SOCKET_NOT_BOUND, 0 )
- #define iptraceNO_BUFFER_FOR_SENDTO() vExampleDebugStatUpdate( iptraceID_NO_BUFFER_FOR_SENDTO, 0 )
- #define iptraceWAITING_FOR_TX_DMA_DESCRIPTOR() vExampleDebugStatUpdate( iptraceID_WAIT_FOR_TX_DMA_DESCRIPTOR, 0 )
- #define iptraceFAILED_TO_NOTIFY_SELECT_GROUP( xSocket ) vExampleDebugStatUpdate( iptraceID_FAILED_TO_NOTIFY_SELECT_GROUP, 0 )
- #define iptraceNETWORK_INTERFACE_RECEIVE() vExampleDebugStatUpdate( iptraceID_NETWORK_INTERFACE_RECEIVE, 0 )
-
- /*
- * The function that updates a line in the xIPTraceValues table.
- */
- void vExampleDebugStatUpdate( uint8_t ucIdentifier, uint32_t ulValue );
-
- /*
- * Returns the number of entries in the xIPTraceValues table.
- */
- BaseType_t xExampleDebugStatEntries( void );
-
-#endif /* configINCLUDE_DEMO_DEBUG_STATS == 1 */
-
-
-#endif /* DEMO_IP_TRACE_MACROS_H */
-
diff --git a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_TCP_Demos/include/DefaultWebPages.h b/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_TCP_Demos/include/DefaultWebPages.h
deleted file mode 100644
index 43e6a34..0000000
--- a/FreeRTOS-Labs/Demo/Common/FreeRTOS_Plus_TCP_Demos/include/DefaultWebPages.h
+++ /dev/null
@@ -1,2681 +0,0 @@
-/*
- FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
- All rights reserved
-
- VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
-
- This file is part of the FreeRTOS distribution.
-
- FreeRTOS is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License (version 2) as published by the
- Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
-
- ***************************************************************************
- >>! NOTE: The modification to the GPL is included to allow you to !<<
- >>! distribute a combined work that includes FreeRTOS without being !<<
- >>! obliged to provide the source code for proprietary components !<<
- >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
-
- FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. Full license text is available on the following
- link: http://www.freertos.org/a00114.html
-
- ***************************************************************************
- * *
- * FreeRTOS provides completely free yet professionally developed, *
- * robust, strictly quality controlled, supported, and cross *
- * platform software that is more than just the market leader, it *
- * is the industry's de facto standard. *
- * *
- * Help yourself get started quickly while simultaneously helping *
- * to support the FreeRTOS project by purchasing a FreeRTOS *
- * tutorial book, reference manual, or both: *
- * http://www.FreeRTOS.org/Documentation *
- * *
- ***************************************************************************
-
- http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
- the FAQ page "My application does not run, what could be wrong?". Have you
- defined configASSERT()?
-
- http://www.FreeRTOS.org/support - In return for receiving this top quality
- embedded software for free we request you assist our global community by
- participating in the support forum.
-
- http://www.FreeRTOS.org/training - Investing in training allows your team to
- be as productive as possible as early as possible. Now you can receive
- FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
- Ltd, and the world's leading authority on the world's leading RTOS.
-
- http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
- including FreeRTOS+Trace - an indispensable productivity tool, a DOS
- compatible FAT file system, and our tiny thread aware UDP/IP stack.
-
- http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
- Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
-
- http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
- Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
- licenses offer ticketed support, indemnification and commercial middleware.
-
- http://www.SafeRTOS.com - High Integrity Systems also provide a safety
- engineered and independently SIL3 certified version for use in safety and
- mission critical applications that require provable dependability.
-
- 1 tab == 4 spaces!
-*/
-
-/*
- * This file defines some very basic web content that is used as default web
- * pages when the HTTP server is created. A FAT file is created in the
- * directory set by the configHTTP_ROOT constant (in FreeRTOSConfig.h) from each
- * file definition below. The files were converted to C structures using Hex
- * Edit (http://www.hexedit.com).
- */
-
-/* A structure that defines a single file to be copied to the RAM disk. */
-typedef struct FILE_TO_COPY
-{
- const char *pcFileName; /* The name of the file. */
- size_t xFileSize;
- const uint8_t *pucFileData; /* The C structure that contains the file's data. */
-} xFileToCopy_t;
-
-static const uint8_t pcFreeRTOS_HTML_Data[] =
-{
- 0x3C, 0x21, 0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x48, 0x54, 0x4D, 0x4C, 0x20, 0x50,
- 0x55, 0x42, 0x4C, 0x49, 0x43, 0x20, 0x22, 0x2D, 0x2F, 0x2F, 0x57, 0x33, 0x43, 0x2F, 0x2F, 0x44,
- 0x54, 0x44, 0x20, 0x48, 0x54, 0x4D, 0x4C, 0x20, 0x34, 0x2E, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61,
- 0x6E, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x2F, 0x2F, 0x45, 0x4E, 0x22, 0x20, 0x22,
- 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72,
- 0x67, 0x2F, 0x54, 0x52, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x34, 0x2F, 0x6C, 0x6F, 0x6F, 0x73, 0x65,
- 0x2E, 0x64, 0x74, 0x64, 0x22, 0x3E, 0x0D, 0x0A, 0x3C, 0x68, 0x74, 0x6D, 0x6C, 0x3E, 0x0D, 0x0A,
- 0x09, 0x3C, 0x68, 0x65, 0x61, 0x64, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x74, 0x69, 0x74, 0x6C,
- 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4F, 0x53, 0x2B,
- 0x54, 0x43, 0x50, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4F, 0x53,
- 0x2B, 0x46, 0x41, 0x54, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x57, 0x65, 0x62, 0x20, 0x53, 0x65,
- 0x72, 0x76, 0x65, 0x72, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x20, 0x57, 0x65, 0x62,
- 0x20, 0x50, 0x61, 0x67, 0x65, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x74, 0x69, 0x74, 0x6C, 0x65,
- 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
- 0x09, 0x48, 0x31, 0x20, 0x7B, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x3A, 0x20, 0x23, 0x31, 0x61, 0x33,
- 0x30, 0x36, 0x35, 0x3B, 0x20, 0x66, 0x6F, 0x6E, 0x74, 0x2D, 0x73, 0x69, 0x7A, 0x65, 0x3A, 0x32,
- 0x37, 0x70, 0x78, 0x3B, 0x20, 0x6C, 0x69, 0x6E, 0x65, 0x2D, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74,
- 0x3A, 0x20, 0x33, 0x30, 0x70, 0x78, 0x3B, 0x7D, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x48, 0x31, 0x20,
- 0x73, 0x6D, 0x61, 0x6C, 0x6C, 0x20, 0x7B, 0x66, 0x6F, 0x6E, 0x74, 0x2D, 0x73, 0x69, 0x7A, 0x65,
- 0x3A, 0x31, 0x36, 0x70, 0x78, 0x3B, 0x7D, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x48, 0x32, 0x20, 0x7B,
- 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x3A, 0x20, 0x23, 0x31, 0x61, 0x33, 0x30, 0x36, 0x35, 0x3B, 0x20,
- 0x66, 0x6F, 0x6E, 0x74, 0x2D, 0x73, 0x69, 0x7A, 0x65, 0x3A, 0x32, 0x32, 0x70, 0x78, 0x3B, 0x7D,
- 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x48, 0x33, 0x20, 0x7B, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x3A, 0x20,
- 0x23, 0x31, 0x61, 0x33, 0x30, 0x36, 0x35, 0x3B, 0x20, 0x66, 0x6F, 0x6E, 0x74, 0x2D, 0x73, 0x69,
- 0x7A, 0x65, 0x3A, 0x31, 0x38, 0x70, 0x78, 0x3B, 0x20, 0x6C, 0x69, 0x6E, 0x65, 0x2D, 0x68, 0x65,
- 0x69, 0x67, 0x68, 0x74, 0x3A, 0x20, 0x6E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x3B, 0x7D, 0x0D, 0x0A,
- 0x09, 0x09, 0x09, 0x48, 0x33, 0x20, 0x73, 0x6D, 0x61, 0x6C, 0x6C, 0x20, 0x7B, 0x63, 0x6F, 0x6C,
- 0x6F, 0x72, 0x3A, 0x20, 0x23, 0x31, 0x61, 0x33, 0x30, 0x36, 0x35, 0x3B, 0x20, 0x66, 0x6F, 0x6E,
- 0x74, 0x2D, 0x73, 0x69, 0x7A, 0x65, 0x3A, 0x31, 0x35, 0x70, 0x78, 0x3B, 0x7D, 0x0D, 0x0A, 0x09,
- 0x09, 0x09, 0x48, 0x34, 0x20, 0x7B, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x3A, 0x20, 0x23, 0x31, 0x61,
- 0x33, 0x30, 0x36, 0x35, 0x7D, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x20,
- 0x7B, 0x20, 0x66, 0x6F, 0x6E, 0x74, 0x2D, 0x73, 0x69, 0x7A, 0x65, 0x3A, 0x20, 0x31, 0x34, 0x70,
- 0x78, 0x3B, 0x20, 0x6C, 0x69, 0x6E, 0x65, 0x2D, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3A, 0x20,
- 0x31, 0x2E, 0x35, 0x65, 0x6D, 0x3B, 0x20, 0x7D, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x54, 0x41, 0x42,
- 0x4C, 0x45, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x5F, 0x61, 0x64, 0x20, 0x7B, 0x20, 0x6C, 0x69, 0x6E,
- 0x65, 0x2D, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3A, 0x20, 0x6E, 0x6F, 0x72, 0x6D, 0x61, 0x6C,
- 0x3B, 0x20, 0x7D, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x41, 0x3A, 0x76, 0x69, 0x73, 0x69, 0x74, 0x65,
- 0x64, 0x20, 0x7B, 0x74, 0x65, 0x78, 0x74, 0x2D, 0x64, 0x65, 0x63, 0x6F, 0x72, 0x61, 0x74, 0x69,
- 0x6F, 0x6E, 0x3A, 0x20, 0x6E, 0x6F, 0x6E, 0x65, 0x3B, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x3A,
- 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x65, 0x65, 0x7D, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x41, 0x3A,
- 0x68, 0x6F, 0x76, 0x65, 0x72, 0x20, 0x7B, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2D, 0x64, 0x65, 0x63,
- 0x6F, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x6E, 0x6F, 0x6E, 0x65, 0x3B, 0x20, 0x7D,
- 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x61, 0x20, 0x7B, 0x74, 0x65, 0x78, 0x74, 0x2D, 0x64, 0x65, 0x63,
- 0x6F, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x6E, 0x6F, 0x6E, 0x65, 0x3B, 0x7D, 0x0D,
- 0x0A, 0x09, 0x09, 0x09, 0x42, 0x4F, 0x44, 0x59, 0x20, 0x7B, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x20,
- 0x20, 0x20, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x3A, 0x20, 0x23, 0x32, 0x30, 0x32, 0x30, 0x32, 0x30,
- 0x3B, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x20, 0x20, 0x20, 0x66, 0x6F, 0x6E, 0x74, 0x2D, 0x66, 0x61,
- 0x6D, 0x69, 0x6C, 0x79, 0x3A, 0x20, 0x61, 0x72, 0x69, 0x61, 0x6C, 0x2C, 0x20, 0x68, 0x65, 0x6C,
- 0x76, 0x65, 0x74, 0x69, 0x63, 0x61, 0x2C, 0x20, 0x73, 0x65, 0x72, 0x69, 0x66, 0x3B, 0x0D, 0x0A,
- 0x09, 0x09, 0x09, 0x20, 0x20, 0x20, 0x66, 0x6F, 0x6E, 0x74, 0x2D, 0x73, 0x69, 0x7A, 0x65, 0x3A,
- 0x20, 0x31, 0x34, 0x70, 0x78, 0x3B, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x20, 0x20, 0x20, 0x6C, 0x69,
- 0x6E, 0x65, 0x2D, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3A, 0x20, 0x31, 0x2E, 0x35, 0x65, 0x6D,
- 0x3B, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x20, 0x20, 0x20, 0x6D, 0x61, 0x72, 0x67, 0x69, 0x6E, 0x2D,
- 0x6C, 0x65, 0x66, 0x74, 0x3A, 0x20, 0x30, 0x70, 0x78, 0x3B, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x20,
- 0x20, 0x20, 0x6D, 0x61, 0x72, 0x67, 0x69, 0x6E, 0x2D, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3A, 0x20,
- 0x30, 0x70, 0x78, 0x3B, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x20, 0x20, 0x20, 0x6D, 0x61, 0x72, 0x67,
- 0x69, 0x6E, 0x2D, 0x74, 0x6F, 0x70, 0x3A, 0x30, 0x70, 0x78, 0x3B, 0x0D, 0x0A, 0x09, 0x09, 0x09,
- 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6B, 0x67, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x3A, 0x20, 0x77,
- 0x68, 0x69, 0x74, 0x65, 0x3B, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x7D, 0x0D, 0x0A, 0x09, 0x09, 0x3C,
- 0x2F, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x2F, 0x68, 0x65, 0x61, 0x64,
- 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x62, 0x6F, 0x64, 0x79, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x74,
- 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x3D, 0x22, 0x68, 0x65, 0x69, 0x67,
- 0x68, 0x74, 0x3A, 0x31, 0x30, 0x30, 0x25, 0x3B, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3A, 0x31,
- 0x30, 0x30, 0x38, 0x70, 0x78, 0x3B, 0x20, 0x62, 0x61, 0x63, 0x6B, 0x67, 0x72, 0x6F, 0x75, 0x6E,
- 0x64, 0x3A, 0x77, 0x68, 0x69, 0x74, 0x65, 0x3B, 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x2D,
- 0x72, 0x69, 0x67, 0x68, 0x74, 0x3A, 0x73, 0x6F, 0x6C, 0x69, 0x64, 0x20, 0x31, 0x70, 0x78, 0x20,
- 0x23, 0x65, 0x36, 0x65, 0x36, 0x65, 0x36, 0x3B, 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x2D,
- 0x6C, 0x65, 0x66, 0x74, 0x3A, 0x73, 0x6F, 0x6C, 0x69, 0x64, 0x20, 0x31, 0x70, 0x78, 0x20, 0x23,
- 0x65, 0x36, 0x65, 0x36, 0x65, 0x36, 0x3B, 0x22, 0x20, 0x63, 0x65, 0x6C, 0x6C, 0x70, 0x61, 0x64,
- 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x35, 0x22, 0x20, 0x63, 0x65, 0x6C, 0x6C, 0x73, 0x70, 0x61,
- 0x63, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x30, 0x22, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x22,
- 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x74, 0x72,
- 0x20, 0x76, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x74, 0x6F, 0x70, 0x22, 0x3E, 0x0D, 0x0A,
- 0x09, 0x09, 0x09, 0x09, 0x3C, 0x74, 0x64, 0x20, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x3D, 0x22, 0x77,
- 0x69, 0x64, 0x74, 0x68, 0x3A, 0x31, 0x30, 0x30, 0x25, 0x3B, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68,
- 0x74, 0x3A, 0x31, 0x30, 0x30, 0x70, 0x78, 0x3B, 0x22, 0x3E, 0x20, 0x3C, 0x21, 0x2D, 0x2D, 0x20,
- 0x53, 0x70, 0x61, 0x6E, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x6D,
- 0x65, 0x6E, 0x75, 0x2C, 0x20, 0x62, 0x6C, 0x61, 0x6E, 0x6B, 0x20, 0x6C, 0x69, 0x6E, 0x65, 0x2C,
- 0x20, 0x61, 0x6E, 0x64, 0x20, 0x6D, 0x61, 0x69, 0x6E, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E,
- 0x74, 0x20, 0x63, 0x6F, 0x6C, 0x75, 0x6D, 0x6E, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x65,
- 0x20, 0x6E, 0x65, 0x78, 0x74, 0x20, 0x72, 0x6F, 0x77, 0x2E, 0x20, 0x2D, 0x2D, 0x3E, 0x0D, 0x0A,
- 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x66, 0x61, 0x63, 0x65, 0x3D,
- 0x22, 0x41, 0x72, 0x69, 0x61, 0x6C, 0x2C, 0x20, 0x48, 0x65, 0x6C, 0x76, 0x65, 0x74, 0x69, 0x63,
- 0x61, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x74, 0x61, 0x62, 0x6C,
- 0x65, 0x20, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x3D, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3A, 0x31,
- 0x30, 0x30, 0x25, 0x3B, 0x22, 0x20, 0x63, 0x65, 0x6C, 0x6C, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6E,
- 0x67, 0x3D, 0x22, 0x32, 0x22, 0x20, 0x63, 0x65, 0x6C, 0x6C, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E,
- 0x67, 0x3D, 0x22, 0x30, 0x22, 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x3D, 0x22, 0x30, 0x22,
- 0x3E, 0x20, 0x3C, 0x21, 0x2D, 0x2D, 0x20, 0x52, 0x6F, 0x77, 0x73, 0x20, 0x66, 0x6F, 0x72, 0x20,
- 0x6C, 0x6F, 0x67, 0x6F, 0x73, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x62, 0x61, 0x6E, 0x6E, 0x65, 0x72,
- 0x73, 0x2C, 0x20, 0x62, 0x6C, 0x75, 0x65, 0x20, 0x6C, 0x69, 0x6E, 0x65, 0x73, 0x20, 0x77, 0x69,
- 0x74, 0x68, 0x20, 0x6D, 0x65, 0x6E, 0x75, 0x2E, 0x20, 0x2D, 0x2D, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
- 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x74, 0x72, 0x20, 0x20, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x3D,
- 0x22, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x3A, 0x20, 0x30, 0x70, 0x78, 0x20, 0x30, 0x70,
- 0x78, 0x20, 0x30, 0x70, 0x78, 0x20, 0x30, 0x70, 0x78, 0x3B, 0x22, 0x3E, 0x20, 0x3C, 0x21, 0x2D,
- 0x2D, 0x20, 0x54, 0x6F, 0x70, 0x20, 0x72, 0x6F, 0x77, 0x2C, 0x20, 0x62, 0x61, 0x6E, 0x6E, 0x65,
- 0x72, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x6C, 0x6F, 0x67, 0x6F, 0x2E, 0x20, 0x2D, 0x2D, 0x3E, 0x0D,
- 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x74, 0x64, 0x3E, 0x0D, 0x0A, 0x09,
- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x77,
- 0x69, 0x64, 0x74, 0x68, 0x3D, 0x22, 0x31, 0x30, 0x30, 0x25, 0x22, 0x20, 0x63, 0x65, 0x6C, 0x6C,
- 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x30, 0x22, 0x20, 0x63, 0x65, 0x6C, 0x6C,
- 0x73, 0x70, 0x61, 0x63, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x35, 0x70, 0x78, 0x22, 0x3E, 0x0D, 0x0A,
- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x74, 0x72, 0x3E, 0x0D, 0x0A,
- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x74, 0x64, 0x20, 0x73,
- 0x74, 0x79, 0x6C, 0x65, 0x3D, 0x22, 0x6C, 0x69, 0x6E, 0x65, 0x2D, 0x68, 0x65, 0x69, 0x67, 0x68,
- 0x74, 0x3A, 0x6E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x3B, 0x22, 0x20, 0x76, 0x61, 0x6C, 0x69, 0x67,
- 0x6E, 0x3D, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C, 0x65, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68,
- 0x3D, 0x22, 0x31, 0x37, 0x34, 0x70, 0x78, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09,
- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x76, 0x20, 0x73, 0x74, 0x79, 0x6C,
- 0x65, 0x3D, 0x22, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x3A, 0x6C, 0x65, 0x66, 0x74, 0x3B, 0x22, 0x3E,
- 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C,
- 0x69, 0x6D, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3D, 0x22, 0x6C, 0x6F, 0x67, 0x6F, 0x2E, 0x6A, 0x70,
- 0x67, 0x22, 0x20, 0x61, 0x6C, 0x74, 0x3D, 0x22, 0x46, 0x72, 0x65, 0x65, 0x20, 0x52, 0x54, 0x4F,
- 0x53, 0x20, 0x6C, 0x6F, 0x67, 0x6F, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3D, 0x22, 0x31,
- 0x36, 0x34, 0x70, 0x78, 0x22, 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x3D, 0x22, 0x30, 0x22,
- 0x20, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x3D, 0x22, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x3A,
- 0x20, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20, 0x35, 0x70, 0x78, 0x3B, 0x22, 0x3E, 0x0D, 0x0A, 0x09,
- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x64, 0x69, 0x76,
- 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F,
- 0x74, 0x64, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
- 0x3C, 0x74, 0x64, 0x20, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x3D, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68,
- 0x3A, 0x35, 0x70, 0x78, 0x3B, 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x2D, 0x74, 0x6F, 0x70,
- 0x3A, 0x73, 0x6F, 0x6C, 0x69, 0x64, 0x20, 0x32, 0x70, 0x78, 0x20, 0x23, 0x65, 0x36, 0x65, 0x36,
- 0x65, 0x36, 0x3B, 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x2D, 0x6C, 0x65, 0x66, 0x74, 0x3A,
- 0x73, 0x6F, 0x6C, 0x69, 0x64, 0x20, 0x32, 0x70, 0x78, 0x20, 0x23, 0x65, 0x36, 0x65, 0x36, 0x65,
- 0x36, 0x3B, 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x2D, 0x62, 0x6F, 0x74, 0x74, 0x6F, 0x6D,
- 0x3A, 0x73, 0x6F, 0x6C, 0x69, 0x64, 0x20, 0x32, 0x70, 0x78, 0x20, 0x23, 0x65, 0x36, 0x65, 0x36,
- 0x65, 0x36, 0x3B, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
- 0x09, 0x09, 0x09, 0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09,
- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x74, 0x64, 0x20, 0x76, 0x61, 0x6C, 0x69,
- 0x67, 0x6E, 0x3D, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C, 0x65, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6C,
- 0x65, 0x3D, 0x22, 0x6C, 0x69, 0x6E, 0x65, 0x2D, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3A, 0x6E,
- 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x3B, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x68, 0x33, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74,
- 0x20, 0x57, 0x65, 0x62, 0x20, 0x50, 0x61, 0x67, 0x65, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09,
- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x68, 0x33, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x0D, 0x0A,
- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x74, 0x64, 0x3E, 0x0D,
- 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x74, 0x64,
- 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x74,
- 0x72, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x74,
- 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C,
- 0x2F, 0x74, 0x64, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x74,
- 0x72, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x74, 0x72, 0x20, 0x73,
- 0x74, 0x79, 0x6C, 0x65, 0x3D, 0x22, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3A, 0x35, 0x70, 0x78,
- 0x3B, 0x22, 0x20, 0x62, 0x67, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x3D, 0x22, 0x23, 0x37, 0x30, 0x39,
- 0x35, 0x64, 0x33, 0x22, 0x3E, 0x20, 0x3C, 0x21, 0x2D, 0x2D, 0x20, 0x42, 0x6C, 0x61, 0x6E, 0x6B,
- 0x20, 0x6C, 0x69, 0x6E, 0x65, 0x2E, 0x20, 0x2D, 0x2D, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
- 0x09, 0x09, 0x09, 0x09, 0x3C, 0x74, 0x64, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
- 0x09, 0x09, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
- 0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x74,
- 0x72, 0x20, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x3D, 0x22, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3A,
- 0x31, 0x39, 0x70, 0x78, 0x3B, 0x22, 0x20, 0x62, 0x67, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x3D, 0x22,
- 0x23, 0x62, 0x36, 0x63, 0x66, 0x66, 0x65, 0x22, 0x3E, 0x20, 0x3C, 0x21, 0x2D, 0x2D, 0x20, 0x48,
- 0x6F, 0x72, 0x69, 0x7A, 0x6F, 0x6E, 0x74, 0x61, 0x6C, 0x20, 0x6D, 0x65, 0x6E, 0x75, 0x2E, 0x20,
- 0x2D, 0x2D, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x74, 0x64,
- 0x20, 0x76, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C, 0x65, 0x22,
- 0x20, 0x62, 0x67, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x3D, 0x22, 0x23, 0x62, 0x36, 0x63, 0x66, 0x66,
- 0x65, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x74,
- 0x64, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x74, 0x72, 0x3E,
- 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x3E,
- 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x66, 0x6F, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
- 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x74, 0x64, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F,
- 0x74, 0x72, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x74, 0x72, 0x20, 0x76, 0x61, 0x6C, 0x69,
- 0x67, 0x6E, 0x3D, 0x22, 0x74, 0x6F, 0x70, 0x22, 0x3E, 0x20, 0x3C, 0x21, 0x2D, 0x2D, 0x20, 0x4D,
- 0x61, 0x69, 0x6E, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x20, 0x72, 0x6F, 0x77, 0x20,
- 0x77, 0x69, 0x74, 0x68, 0x20, 0x6D, 0x65, 0x6E, 0x75, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x63, 0x6F,
- 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x20, 0x61, 0x72, 0x65, 0x61, 0x20, 0x63, 0x6F, 0x6C, 0x75, 0x6D,
- 0x6E, 0x73, 0x2E, 0x20, 0x2D, 0x2D, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x74, 0x64,
- 0x20, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x3D, 0x22, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6E, 0x67, 0x3A,
- 0x20, 0x32, 0x30, 0x70, 0x78, 0x20, 0x32, 0x30, 0x70, 0x78, 0x20, 0x32, 0x30, 0x70, 0x78, 0x20,
- 0x32, 0x30, 0x70, 0x78, 0x3B, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64,
- 0x69, 0x76, 0x20, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x3D, 0x22, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x3A,
- 0x72, 0x69, 0x67, 0x68, 0x74, 0x3B, 0x22, 0x20, 0x61, 0x6C, 0x69, 0x67, 0x6E, 0x3D, 0x22, 0x63,
- 0x65, 0x6E, 0x74, 0x65, 0x72, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C,
- 0x69, 0x6D, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3D, 0x22, 0x66, 0x74, 0x70, 0x2E, 0x70, 0x6E, 0x67,
- 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x73, 0x6D, 0x61, 0x6C, 0x6C,
- 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x62, 0x72, 0x3E, 0x0D, 0x0A,
- 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x62, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
- 0x09, 0x09, 0x09, 0x09, 0x46, 0x54, 0x50, 0x27, 0x69, 0x6E, 0x67, 0x20, 0x77, 0x65, 0x62, 0x20,
- 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x20, 0x69, 0x6E, 0x74, 0x6F, 0x20, 0x2F, 0x72, 0x61,
- 0x6D, 0x2F, 0x77, 0x65, 0x62, 0x73, 0x72, 0x63, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
- 0x09, 0x3C, 0x2F, 0x62, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x73,
- 0x6D, 0x61, 0x6C, 0x6C, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x64, 0x69,
- 0x76, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x68, 0x31, 0x3E, 0x0D, 0x0A, 0x09,
- 0x09, 0x09, 0x09, 0x09, 0x09, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4F, 0x53, 0x2B, 0x54, 0x43,
- 0x50, 0x20, 0x57, 0x65, 0x62, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x0D, 0x0A, 0x09, 0x09,
- 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x68, 0x31, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x54,
- 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75,
- 0x6C, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x20, 0x62, 0x65, 0x69, 0x6E, 0x67, 0x20, 0x73, 0x65,
- 0x72, 0x76, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65,
- 0x52, 0x54, 0x4F, 0x53, 0x2B, 0x54, 0x43, 0x50, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x77,
- 0x65, 0x62, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2C, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
- 0x66, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6F,
- 0x6D, 0x20, 0x61, 0x20, 0x64, 0x69, 0x73, 0x6B, 0x20, 0x69, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65,
- 0x6E, 0x74, 0x65, 0x64, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x75, 0x73, 0x69, 0x6E, 0x67,
- 0x20, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4F, 0x53, 0x2B, 0x46, 0x41, 0x54, 0x2E, 0x0D, 0x0A,
- 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x70, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x54,
- 0x68, 0x65, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x72, 0x6F, 0x6F, 0x74, 0x20, 0x64, 0x69, 0x72,
- 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x69, 0x73, 0x20, 0x73, 0x65, 0x74, 0x20, 0x62, 0x79,
- 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x48, 0x54, 0x54, 0x50, 0x5F,
- 0x52, 0x4F, 0x4F, 0x54, 0x20, 0x63, 0x6F, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x74, 0x0D, 0x0A, 0x09,
- 0x09, 0x09, 0x09, 0x09, 0x69, 0x6E, 0x20, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4F, 0x53, 0x43,
- 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x2E, 0x68, 0x2E, 0x20, 0x20, 0x54, 0x68, 0x65, 0x73, 0x65, 0x20,
- 0x64, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x20, 0x77, 0x65, 0x62, 0x20, 0x70, 0x61, 0x67, 0x65,
- 0x73, 0x20, 0x63, 0x61, 0x6E, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6C, 0x61, 0x63, 0x65,
- 0x64, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6E, 0x65, 0x77,
- 0x20, 0x77, 0x65, 0x62, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x20, 0x62, 0x79, 0x20,
- 0x46, 0x54, 0x50, 0x27, 0x69, 0x6E, 0x67, 0x20, 0x66, 0x69, 0x6C, 0x65, 0x73, 0x20, 0x69, 0x6E,
- 0x74, 0x6F, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72,
- 0x79, 0x2E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x70, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
- 0x09, 0x09, 0x09, 0x3C, 0x62, 0x3E, 0x4E, 0x4F, 0x54, 0x45, 0x3A, 0x3C, 0x2F, 0x62, 0x3E, 0x20,
- 0x50, 0x65, 0x72, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x6E, 0x63, 0x65, 0x20, 0x77, 0x69, 0x6C, 0x6C,
- 0x20, 0x62, 0x65, 0x20, 0x6C, 0x69, 0x6D, 0x69, 0x74, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6E,
- 0x20, 0x75, 0x73, 0x69, 0x6E, 0x67, 0x20, 0x74, 0x68, 0x65, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
- 0x09, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4F, 0x53, 0x20, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77,
- 0x73, 0x20, 0x70, 0x6F, 0x72, 0x74, 0x2E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x74,
- 0x64, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x74, 0x72, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
- 0x3C, 0x2F, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x2F, 0x62, 0x6F, 0x64,
- 0x79, 0x3E, 0x0D, 0x0A, 0x3C, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x3E, 0x0D, 0x0A
-};
-
-static const uint8_t pcLogo_JPG_Data[] =
-{
- 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01,
- 0x00, 0x01, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x03, 0x02, 0x02, 0x03, 0x02, 0x02, 0x03,
- 0x03, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x05, 0x08, 0x05, 0x05, 0x04, 0x04, 0x05, 0x0A, 0x07,
- 0x07, 0x06, 0x08, 0x0C, 0x0A, 0x0C, 0x0C, 0x0B, 0x0A, 0x0B, 0x0B, 0x0D, 0x0E, 0x12, 0x10, 0x0D,
- 0x0E, 0x11, 0x0E, 0x0B, 0x0B, 0x10, 0x16, 0x10, 0x11, 0x13, 0x14, 0x15, 0x15, 0x15, 0x0C, 0x0F,
- 0x17, 0x18, 0x16, 0x14, 0x18, 0x12, 0x14, 0x15, 0x14, 0xFF, 0xDB, 0x00, 0x43, 0x01, 0x03, 0x04,
- 0x04, 0x05, 0x04, 0x05, 0x09, 0x05, 0x05, 0x09, 0x14, 0x0D, 0x0B, 0x0D, 0x14, 0x14, 0x14, 0x14,
- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14,
- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14,
- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xFF, 0xC0,
- 0x00, 0x11, 0x08, 0x00, 0x3E, 0x00, 0xA4, 0x03, 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11,
- 0x01, 0xFF, 0xC4, 0x00, 0x1F, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
- 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05,
- 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21,
- 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1, 0x08, 0x23,
- 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17,
- 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A,
- 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A,
- 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A,
- 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
- 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
- 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5,
- 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF1,
- 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xC4, 0x00, 0x1F, 0x01, 0x00, 0x03,
- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
- 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5, 0x11, 0x00,
- 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00,
- 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13,
- 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0, 0x15,
- 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27,
- 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
- 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
- 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88,
- 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
- 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4,
- 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE2,
- 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9,
- 0xFA, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3F, 0x00, 0xFD,
- 0x53, 0xAA, 0x1A, 0xBE, 0xAF, 0x6B, 0xA2, 0x69, 0xB7, 0x37, 0xF7, 0xB2, 0xAD, 0xBD, 0xA5, 0xB2,
- 0x19, 0x65, 0x95, 0xF8, 0x0A, 0xA3, 0x92, 0x4D, 0x5E, 0x35, 0xE4, 0xBF, 0x1C, 0xE7, 0x7D, 0x7A,
- 0x6F, 0x0E, 0xF8, 0x26, 0xDD, 0x88, 0x97, 0x5D, 0xBC, 0x53, 0x73, 0xB4, 0xF2, 0xB6, 0xB1, 0x10,
- 0xF2, 0x13, 0xEC, 0x70, 0x05, 0x73, 0xE2, 0x2A, 0xFB, 0x2A, 0x6E, 0x4B, 0x7E, 0x9E, 0xAF, 0x63,
- 0x9F, 0x11, 0x53, 0xD9, 0x53, 0x73, 0x5B, 0xF4, 0xF5, 0x7A, 0x2F, 0xC4, 0xDE, 0x63, 0xAF, 0xF8,
- 0xEB, 0x43, 0xB3, 0xD4, 0x34, 0x8D, 0x5C, 0xF8, 0x6A, 0xDA, 0xE9, 0x3C, 0xD8, 0xC3, 0x59, 0xAC,
- 0xB3, 0x14, 0x3F, 0x74, 0xB6, 0xE3, 0x85, 0x24, 0x60, 0xE3, 0x1C, 0x67, 0xAD, 0x65, 0x9F, 0x00,
- 0xF8, 0xF5, 0x49, 0xDB, 0xF1, 0x22, 0x52, 0x7F, 0xDB, 0xD2, 0xE1, 0x3F, 0xCA, 0xBD, 0x2A, 0xDE,
- 0x08, 0xED, 0xED, 0x63, 0x8A, 0x34, 0x08, 0x91, 0xA8, 0x55, 0x51, 0xD0, 0x01, 0xC0, 0xAF, 0xCE,
- 0x7F, 0xDB, 0x93, 0xF6, 0xA7, 0xBE, 0xD3, 0x3E, 0x22, 0xF8, 0xDF, 0xE1, 0xFB, 0x7C, 0x44, 0xD5,
- 0x7E, 0x17, 0x0D, 0x17, 0x4E, 0xD3, 0xCE, 0x8E, 0x34, 0xC8, 0xC2, 0x4B, 0xAC, 0x5D, 0x5D, 0x3E,
- 0x24, 0x96, 0x49, 0x8A, 0x92, 0xB6, 0xF0, 0x29, 0x52, 0x42, 0x15, 0x63, 0x87, 0xE7, 0x8C, 0x56,
- 0x6F, 0x0E, 0xA7, 0x67, 0x36, 0xEF, 0xEA, 0xC4, 0xE8, 0x46, 0x7A, 0xC9, 0xBB, 0xFA, 0xB4, 0x7D,
- 0x98, 0x3C, 0x15, 0xF1, 0x16, 0x3F, 0xBB, 0xF1, 0x0E, 0x16, 0xC7, 0xFC, 0xF4, 0xD2, 0x10, 0xFF,
- 0x00, 0x23, 0x4A, 0x7C, 0x29, 0xF1, 0x34, 0x7D, 0xCF, 0x1C, 0xE9, 0xAD, 0xFE, 0xF6, 0x90, 0x3F,
- 0xF8, 0xAA, 0xF1, 0xEF, 0x80, 0x3F, 0x13, 0xFC, 0x43, 0xAF, 0x68, 0xDE, 0x3A, 0xF1, 0x9C, 0x5A,
- 0xAE, 0xA5, 0x79, 0xF0, 0xBE, 0xCE, 0xC6, 0xCB, 0x4A, 0xF0, 0x8B, 0x6A, 0xB1, 0x91, 0x2E, 0xA3,
- 0x24, 0x51, 0x15, 0x9E, 0xFF, 0x00, 0x73, 0x8F, 0x31, 0x96, 0x59, 0x19, 0x40, 0x2C, 0x4E, 0x76,
- 0x16, 0x1D, 0x69, 0xFE, 0x1E, 0xF1, 0xBF, 0x8F, 0xBC, 0x43, 0xA8, 0xA5, 0x8E, 0x9B, 0xAB, 0xDE,
- 0x5D, 0x5D, 0xB2, 0x96, 0x11, 0xE5, 0x3A, 0x0E, 0x49, 0xC9, 0x18, 0xAF, 0x0B, 0x1D, 0x8A, 0xC3,
- 0xE0, 0x6A, 0xC6, 0x8B, 0x53, 0x94, 0xA5, 0xD1, 0x37, 0xFE, 0x67, 0x0D, 0x65, 0x4A, 0x8C, 0x94,
- 0x7D, 0xE6, 0xDF, 0x66, 0xFF, 0x00, 0xCC, 0xF5, 0xDF, 0xF8, 0x47, 0x3E, 0x2A, 0x28, 0xF9, 0x7C,
- 0x61, 0xA2, 0xB7, 0xFB, 0xFA, 0x49, 0xFE, 0x8F, 0x49, 0xFD, 0x8B, 0xF1, 0x69, 0x3A, 0x78, 0x97,
- 0xC3, 0xB2, 0x7F, 0xBD, 0xA7, 0x48, 0x3F, 0x93, 0xD7, 0x99, 0xEB, 0xBE, 0x30, 0xF8, 0x99, 0xE1,
- 0x03, 0x11, 0xD5, 0x6E, 0xEE, 0xAD, 0x55, 0xCE, 0x11, 0xE4, 0x8E, 0x26, 0x46, 0x3E, 0x99, 0x03,
- 0x15, 0xE8, 0x5F, 0x06, 0x7E, 0x2A, 0x6A, 0x5E, 0x34, 0xBE, 0xB9, 0xD2, 0xF5, 0x54, 0x8E, 0x4B,
- 0x88, 0xA1, 0xF3, 0x92, 0xE2, 0x25, 0xDB, 0xB8, 0x64, 0x02, 0x18, 0x74, 0xCF, 0x23, 0x91, 0xEF,
- 0x58, 0xE1, 0xF3, 0x0C, 0x35, 0x7A, 0xEB, 0x0F, 0x2E, 0x78, 0xC9, 0xF7, 0x6F, 0xFC, 0xC9, 0x87,
- 0xB3, 0x9C, 0xF9, 0x2F, 0x24, 0xFC, 0xDB, 0xFF, 0x00, 0x32, 0xD7, 0xF6, 0x77, 0xC5, 0xE5, 0xE9,
- 0xAC, 0x78, 0x62, 0x4F, 0xAD, 0x9C, 0xA3, 0xFF, 0x00, 0x66, 0xA3, 0xEC, 0xFF, 0x00, 0x17, 0xD0,
- 0x71, 0x73, 0xE1, 0x59, 0x3F, 0xED, 0x94, 0xC3, 0xFA, 0xD7, 0x2F, 0xE2, 0xBF, 0x1F, 0xFC, 0x43,
- 0xB3, 0xF1, 0x0E, 0xA5, 0xFD, 0x9D, 0x63, 0x73, 0x1E, 0x99, 0x1C, 0xAC, 0xB0, 0xEE, 0xB1, 0x2C,
- 0x36, 0x0E, 0x33, 0x9C, 0x77, 0xC1, 0x3F, 0x8D, 0x73, 0x09, 0xF1, 0xFF, 0x00, 0xC6, 0x19, 0x03,
- 0xCE, 0xB4, 0x7C, 0xF0, 0x07, 0xD9, 0xB9, 0x3F, 0x91, 0xAC, 0xEA, 0xE6, 0xB8, 0x5A, 0x33, 0x70,
- 0x9B, 0xA8, 0xBA, 0x75, 0x26, 0x53, 0xA5, 0x07, 0x67, 0x29, 0xFD, 0xE7, 0xA7, 0x17, 0xF8, 0xC0,
- 0x83, 0x02, 0x1F, 0x0A, 0x49, 0xFF, 0x00, 0x02, 0x98, 0x52, 0x0B, 0xDF, 0x8B, 0xF1, 0x9E, 0x74,
- 0xBF, 0x0B, 0xC9, 0xF4, 0xB9, 0x98, 0x7F, 0x4A, 0xE1, 0xED, 0xFE, 0x34, 0x78, 0xF9, 0xA7, 0x8A,
- 0x13, 0xA6, 0x45, 0xBA, 0x47, 0x08, 0x37, 0x58, 0xC8, 0x06, 0x49, 0xC7, 0xAD, 0x7A, 0xFF, 0x00,
- 0x8B, 0xFE, 0x22, 0xE9, 0x7E, 0x04, 0xB1, 0x89, 0xF5, 0x49, 0x8C, 0x97, 0x8E, 0xBF, 0x25, 0xB4,
- 0x03, 0x2E, 0xE7, 0xB9, 0x03, 0xB0, 0xCF, 0x73, 0x5D, 0xB8, 0x7C, 0x5D, 0x0A, 0xF0, 0x95, 0x45,
- 0x52, 0x71, 0x51, 0xDD, 0xBD, 0x0D, 0xA0, 0xA1, 0x38, 0xB9, 0x2A, 0x92, 0x49, 0x77, 0x7F, 0xF0,
- 0x0E, 0x60, 0xEB, 0x5F, 0x17, 0x23, 0x3F, 0xF2, 0x2D, 0xF8, 0x76, 0x41, 0xFE, 0xCD, 0xFC, 0x83,
- 0xFF, 0x00, 0x65, 0xA3, 0xFE, 0x12, 0x5F, 0x8B, 0x2B, 0xD7, 0xC1, 0xFA, 0x13, 0xFF, 0x00, 0xBB,
- 0xAA, 0x37, 0xFF, 0x00, 0x13, 0x5C, 0x76, 0xA1, 0xFB, 0x49, 0x6A, 0xB3, 0x4E, 0x57, 0x4F, 0xD2,
- 0x2D, 0xE2, 0x43, 0xF7, 0x44, 0xCC, 0xD2, 0x39, 0xFC, 0x06, 0x05, 0x57, 0xB7, 0xFD, 0xA3, 0xB5,
- 0xF8, 0x25, 0x0B, 0x77, 0xA5, 0xD9, 0x49, 0x8E, 0xAA, 0x03, 0xC6, 0xDF, 0xA9, 0x35, 0xC7, 0x2C,
- 0xDB, 0x06, 0x9E, 0x95, 0xE7, 0xEB, 0x6D, 0x3F, 0x23, 0x1F, 0x6B, 0x4F, 0xFE, 0x7E, 0xCB, 0xF0,
- 0xFF, 0x00, 0x23, 0xB9, 0xFF, 0x00, 0x84, 0xBB, 0xE2, 0xAA, 0x7D, 0xEF, 0x02, 0xE9, 0x6F, 0xFF,
- 0x00, 0x5C, 0xF5, 0x61, 0xFD, 0x56, 0x93, 0xFE, 0x13, 0x9F, 0x89, 0xD1, 0xFD, 0xEF, 0x87, 0x76,
- 0xCD, 0xFE, 0xE6, 0xAC, 0x9F, 0xE1, 0x5B, 0x7F, 0x0F, 0xBE, 0x2B, 0xE9, 0x5E, 0x3C, 0x2D, 0x04,
- 0x6A, 0xD6, 0x5A, 0x8A, 0x2E, 0xE6, 0xB5, 0x94, 0x83, 0x91, 0xEA, 0xA7, 0xB8, 0xAE, 0x9B, 0xC4,
- 0x3E, 0x24, 0xD3, 0x7C, 0x2D, 0xA7, 0x35, 0xEE, 0xA7, 0x72, 0x96, 0xD6, 0xEB, 0xC0, 0x2D, 0xC9,
- 0x63, 0xE8, 0x07, 0x52, 0x6B, 0xD9, 0xA6, 0xE3, 0x56, 0x97, 0xB7, 0x86, 0x21, 0xB8, 0xF7, 0xF7,
- 0x7F, 0xC8, 0xEA, 0x8D, 0x37, 0x28, 0xF3, 0x2A, 0xCE, 0xDF, 0x2F, 0xF2, 0x3C, 0xF7, 0xFE, 0x16,
- 0x1F, 0xC4, 0x75, 0xFB, 0xDF, 0x0D, 0x33, 0xFE, 0xEE, 0xAB, 0x19, 0xFE, 0x94, 0xA3, 0xE2, 0x77,
- 0x8E, 0xD4, 0x7C, 0xFF, 0x00, 0x0C, 0x2F, 0x49, 0xFF, 0x00, 0x63, 0x50, 0x88, 0xD6, 0x5E, 0xA7,
- 0xFB, 0x4A, 0xE9, 0xF1, 0x4A, 0x56, 0xC7, 0x48, 0xB9, 0xB9, 0x41, 0xD1, 0xE6, 0x91, 0x62, 0x07,
- 0xF0, 0xE4, 0xD5, 0x28, 0x7F, 0x69, 0xA5, 0x2F, 0xFB, 0xDD, 0x05, 0xC2, 0xF7, 0xD9, 0x72, 0x09,
- 0xFD, 0x54, 0x57, 0x98, 0xF3, 0x4C, 0x24, 0x5D, 0xBE, 0xB4, 0xFE, 0xE5, 0xFF, 0x00, 0xC8, 0x9C,
- 0xEE, 0xA4, 0x57, 0xFC, 0xBF, 0x7F, 0x72, 0xFF, 0x00, 0x23, 0x7F, 0xFE, 0x16, 0xC7, 0x8C, 0x57,
- 0xFD, 0x67, 0xC2, 0xFD, 0x58, 0x7F, 0xBB, 0x77, 0x11, 0xAD, 0xED, 0x07, 0xE2, 0x79, 0xBC, 0x2A,
- 0x35, 0xBF, 0x0F, 0xEA, 0x9E, 0x19, 0x25, 0x82, 0x09, 0x6F, 0xD1, 0x4C, 0x25, 0x89, 0xC0, 0x1E,
- 0x62, 0x92, 0x06, 0x4F, 0x1C, 0xE3, 0xAD, 0x6A, 0x78, 0x0F, 0xC6, 0x96, 0xFE, 0x3D, 0xD1, 0x8E,
- 0xA3, 0x6F, 0x6B, 0x35, 0xAC, 0x62, 0x46, 0x88, 0xAC, 0xD8, 0xC9, 0x23, 0x19, 0x23, 0x07, 0xA7,
- 0x35, 0xC9, 0xFE, 0xD2, 0x97, 0x02, 0xDB, 0xE0, 0xF6, 0xB8, 0x0F, 0xFC, 0xB5, 0x09, 0x17, 0xE6,
- 0xE2, 0xBD, 0x55, 0x39, 0x46, 0x8F, 0xD6, 0x23, 0x57, 0x9A, 0x36, 0xBE, 0xCB, 0x5F, 0xC1, 0x1B,
- 0x4D, 0xCE, 0x85, 0x29, 0x57, 0xF6, 0x8E, 0x49, 0x2B, 0xEC, 0xBF, 0x44, 0x7A, 0x8A, 0xB0, 0x71,
- 0x91, 0xCD, 0x15, 0xE7, 0x3F, 0xB3, 0xBF, 0x88, 0xAF, 0x3C, 0x57, 0xF0, 0x4B, 0xC1, 0xFA, 0xAE,
- 0xA0, 0xE6, 0x6B, 0xCB, 0x8B, 0x15, 0x32, 0x48, 0x7A, 0xBE, 0xD2, 0x54, 0x31, 0xF7, 0x21, 0x41,
- 0xA2, 0xBD, 0x48, 0xCB, 0x9A, 0x2A, 0x5D, 0xCE, 0xEA, 0x53, 0x55, 0xA9, 0xC6, 0xA2, 0xEA, 0x93,
- 0xFB, 0xCF, 0x44, 0x73, 0xC7, 0x35, 0xE4, 0x5E, 0x00, 0xC7, 0x8E, 0x3E, 0x2E, 0x78, 0xA3, 0xC5,
- 0x0C, 0x7C, 0xCB, 0x2D, 0x2D, 0x46, 0x8D, 0x60, 0x4F, 0x4C, 0xAF, 0x32, 0xB0, 0xFA, 0xB7, 0x15,
- 0xD9, 0x7C, 0x56, 0xF1, 0x6A, 0xF8, 0x27, 0xC0, 0x5A, 0xBE, 0xAB, 0x9C, 0xCD, 0x1C, 0x25, 0x20,
- 0x5E, 0xED, 0x2B, 0x7C, 0xA8, 0x07, 0xE2, 0x45, 0x56, 0xF8, 0x3F, 0xE1, 0x26, 0xF0, 0x6F, 0xC3,
- 0xED, 0x27, 0x4F, 0x97, 0x9B, 0xB6, 0x8F, 0xCF, 0xB9, 0x6E, 0xED, 0x2B, 0xFC, 0xCD, 0x9F, 0xC4,
- 0xE3, 0xF0, 0xAE, 0x3A, 0x9F, 0xBC, 0xAF, 0x0A, 0x7D, 0x17, 0xBC, 0xFF, 0x00, 0x43, 0x96, 0xA3,
- 0xF6, 0x95, 0xE3, 0x4F, 0xA4, 0x75, 0x7F, 0x92, 0xFE, 0xBC, 0x8B, 0x1F, 0x16, 0x7E, 0x24, 0x69,
- 0xBF, 0x07, 0xFE, 0x19, 0xF8, 0x93, 0xC6, 0x9A, 0xBA, 0xC8, 0xFA, 0x6E, 0x89, 0x63, 0x25, 0xEC,
- 0xD1, 0xC5, 0x8D, 0xEE, 0x14, 0x70, 0x8B, 0x9E, 0xEC, 0x70, 0x07, 0xD6, 0xBE, 0x15, 0xF1, 0x17,
- 0xED, 0x09, 0xE3, 0x29, 0xB5, 0xBF, 0x16, 0xF8, 0xA7, 0xE2, 0x2E, 0x91, 0xF0, 0xEB, 0x52, 0xD3,
- 0xB4, 0x0F, 0x0A, 0x41, 0xAD, 0xE9, 0x5A, 0x25, 0xB5, 0x8F, 0xDB, 0x66, 0xFE, 0xD1, 0xBC, 0x66,
- 0x5D, 0x3E, 0xC3, 0xED, 0x4F, 0xCC, 0xB2, 0x1D, 0xA5, 0x98, 0x46, 0xA3, 0xEF, 0x2E, 0x07, 0x3C,
- 0xFA, 0xBF, 0xFC, 0x14, 0x2B, 0xF6, 0x91, 0xD1, 0xFE, 0x0F, 0xE8, 0x7E, 0x11, 0xF0, 0xB6, 0xAE,
- 0xFA, 0x25, 0xDE, 0x89, 0xE2, 0x7B, 0xF1, 0x6B, 0xE2, 0x3D, 0x37, 0x53, 0x8A, 0x49, 0xE6, 0x3A,
- 0x3B, 0x7C, 0x93, 0x4B, 0x0C, 0x68, 0xC0, 0x96, 0x52, 0x41, 0x07, 0x24, 0xF1, 0xC0, 0x35, 0xC7,
- 0xFE, 0xCA, 0x5F, 0x04, 0xFF, 0x00, 0x63, 0xAB, 0xEF, 0x88, 0xAB, 0x7F, 0xF0, 0xAA, 0xEA, 0x2F,
- 0x15, 0x78, 0x97, 0x4F, 0x43, 0x7F, 0x0C, 0x17, 0x97, 0x77, 0x17, 0x2B, 0x64, 0xA0, 0xA8, 0x12,
- 0x08, 0xE4, 0x01, 0x43, 0x02, 0x40, 0x0C, 0xC0, 0xB0, 0xCF, 0x06, 0xBB, 0xB6, 0x47, 0x79, 0xEC,
- 0xFF, 0x00, 0x16, 0xBC, 0x55, 0xA8, 0xCD, 0xE0, 0x1F, 0x08, 0x69, 0x9A, 0x95, 0xAC, 0x1A, 0x76,
- 0xAD, 0x75, 0x69, 0x15, 0xE6, 0xA1, 0x65, 0x6B, 0x91, 0x14, 0x0F, 0xB0, 0x66, 0x35, 0xCF, 0x38,
- 0x0C, 0x5B, 0x1F, 0xEE, 0xD7, 0x11, 0xE0, 0x2F, 0x1C, 0x4D, 0xE0, 0x1D, 0x4A, 0x6B, 0xFB, 0x7B,
- 0x08, 0xAF, 0x25, 0x96, 0x3F, 0x28, 0x19, 0x98, 0xA8, 0x41, 0x9C, 0x9C, 0x11, 0xEB, 0xC5, 0x2F,
- 0xC4, 0xEF, 0x10, 0xFF, 0x00, 0xC2, 0x4D, 0xE3, 0x7D, 0x4E, 0xED, 0x58, 0xBC, 0x09, 0x27, 0x91,
- 0x0F, 0xFB, 0x8B, 0xC7, 0xEA, 0x72, 0x7F, 0x1A, 0xFA, 0x1F, 0xC1, 0xFE, 0x08, 0xB5, 0xB0, 0xF8,
- 0x6D, 0x6B, 0xA4, 0xDD, 0xDB, 0x47, 0x2B, 0x4B, 0x6C, 0x5A, 0x70, 0xEA, 0x0E, 0x5D, 0xC1, 0x27,
- 0xF2, 0x27, 0xF4, 0xAF, 0xCD, 0x94, 0x2B, 0x66, 0x99, 0x8D, 0x4A, 0xF4, 0x67, 0xCB, 0xC9, 0xB3,
- 0xDF, 0x6D, 0x3F, 0xCC, 0xF0, 0xB9, 0x65, 0x88, 0xAF, 0x29, 0x41, 0xDA, 0xC7, 0x85, 0xF8, 0x97,
- 0xC7, 0x5A, 0xCF, 0xC5, 0xAD, 0x47, 0x4F, 0xD3, 0x1D, 0x6D, 0x2C, 0xD0, 0xC9, 0x88, 0x60, 0xDE,
- 0x55, 0x0B, 0x9E, 0x39, 0x63, 0xD4, 0xF6, 0x1F, 0x5A, 0xF6, 0xDF, 0x85, 0x3F, 0x0C, 0x13, 0xC0,
- 0x16, 0xB3, 0xCD, 0x71, 0x32, 0xDC, 0xEA, 0x57, 0x40, 0x09, 0x24, 0x41, 0xF2, 0xA2, 0x8F, 0xE1,
- 0x5F, 0xC7, 0xBF, 0x7A, 0xF9, 0x7E, 0xD2, 0x66, 0xD3, 0xB5, 0x18, 0x25, 0x19, 0xDD, 0x6F, 0x3A,
- 0xB6, 0x7F, 0xDD, 0x61, 0xFE, 0x15, 0xF6, 0xE5, 0xBB, 0x89, 0x60, 0x8D, 0xFB, 0x32, 0x86, 0xFC,
- 0xEB, 0xB3, 0x20, 0x4B, 0x17, 0x5A, 0xA6, 0x23, 0x10, 0xF9, 0xAA, 0x47, 0xAF, 0xFC, 0x03, 0x4C,
- 0x15, 0xAA, 0x4A, 0x55, 0x27, 0xAC, 0x91, 0xC9, 0xFC, 0x58, 0xD7, 0x7F, 0xE1, 0x1F, 0xF0, 0x16,
- 0xAB, 0x70, 0xAD, 0xB6, 0x59, 0x22, 0xF2, 0x23, 0xFF, 0x00, 0x79, 0xFE, 0x51, 0xFC, 0xF3, 0x5F,
- 0x36, 0x7C, 0x33, 0xD1, 0x7F, 0xB7, 0x7C, 0x77, 0xA3, 0x5A, 0x15, 0xDD, 0x18, 0x98, 0x4C, 0xE3,
- 0xFD, 0x94, 0xF9, 0xBF, 0xA0, 0x1F, 0x8D, 0x7A, 0x9F, 0xED, 0x29, 0xAE, 0x05, 0xB5, 0xD2, 0x34,
- 0x84, 0x3C, 0xBB, 0xB5, 0xCC, 0x80, 0x7A, 0x01, 0xB5, 0x7F, 0x52, 0x7F, 0x2A, 0xC9, 0xFD, 0x9B,
- 0x74, 0x5F, 0xB4, 0x6B, 0x9A, 0xA6, 0xA8, 0xC3, 0x22, 0xDE, 0x15, 0x81, 0x09, 0xFE, 0xF3, 0x1C,
- 0x9F, 0xD1, 0x47, 0xE7, 0x51, 0x98, 0x3F, 0xAE, 0xE6, 0xF4, 0xB0, 0xEB, 0x68, 0xDB, 0xFC, 0xD8,
- 0xAB, 0x7E, 0xFB, 0x15, 0x18, 0x76, 0x3D, 0xF3, 0x51, 0xBC, 0x8B, 0x4B, 0xD3, 0xEE, 0x6E, 0xE6,
- 0xF9, 0x62, 0x82, 0x36, 0x91, 0x8F, 0xB0, 0x19, 0x35, 0xF1, 0xA7, 0x88, 0xB5, 0xFB, 0xBF, 0x16,
- 0x6B, 0xB7, 0x1A, 0x8D, 0xCB, 0x34, 0x93, 0xDC, 0xBF, 0xC8, 0x9D, 0x76, 0x8C, 0xFC, 0xA8, 0x3D,
- 0x87, 0x4A, 0xFA, 0xD3, 0xE2, 0x15, 0x9C, 0xD7, 0xFE, 0x08, 0xD7, 0x2D, 0xED, 0xC1, 0x69, 0xE4,
- 0xB4, 0x90, 0x28, 0x1D, 0x49, 0xDB, 0xD2, 0xBE, 0x3E, 0xD3, 0xAE, 0x45, 0x9D, 0xFD, 0xAD, 0xC9,
- 0x5D, 0xEB, 0x0C, 0xA9, 0x21, 0x5F, 0x50, 0x08, 0x38, 0xFD, 0x28, 0xE2, 0x6A, 0x92, 0xE7, 0xA5,
- 0x45, 0xE9, 0x17, 0xAB, 0xFB, 0xEC, 0x3C, 0xC2, 0x4E, 0xF1, 0x8F, 0x43, 0xEA, 0xEF, 0x86, 0xFF,
- 0x00, 0x0E, 0xEC, 0x3C, 0x17, 0xA2, 0x40, 0xA2, 0xDD, 0x1F, 0x51, 0x74, 0x0D, 0x71, 0x72, 0xCA,
- 0x0B, 0x16, 0x23, 0x90, 0x0F, 0x60, 0x3A, 0x62, 0xB3, 0x3E, 0x38, 0x78, 0x72, 0xC3, 0x51, 0xF0,
- 0x35, 0xFD, 0xEC, 0xB0, 0x20, 0xBB, 0xB3, 0x51, 0x2C, 0x53, 0x00, 0x03, 0x0E, 0x46, 0x46, 0x7D,
- 0x08, 0xED, 0x5D, 0xA6, 0x8B, 0xAF, 0xD8, 0x6B, 0x9A, 0x6C, 0x37, 0xB6, 0x57, 0x31, 0xCD, 0x6F,
- 0x22, 0x86, 0x0C, 0xAC, 0x38, 0xF6, 0x3E, 0x86, 0xBC, 0x8F, 0xE3, 0xD7, 0xC4, 0x4B, 0x39, 0x74,
- 0xB3, 0xE1, 0xDD, 0x3E, 0xE1, 0x6E, 0x27, 0x95, 0xC3, 0x5D, 0x34, 0x44, 0x15, 0x8D, 0x41, 0xC8,
- 0x52, 0x7D, 0x49, 0xC7, 0x1E, 0xD5, 0xEF, 0x63, 0x25, 0x85, 0xC2, 0xE5, 0xF2, 0x8E, 0x9C, 0xBC,
- 0xB6, 0x5E, 0x6E, 0xDA, 0x1D, 0x95, 0x5D, 0x3A, 0x74, 0x5F, 0x6B, 0x1E, 0x3B, 0xE0, 0xDD, 0x42,
- 0x6D, 0x2F, 0xC5, 0x9A, 0x3D, 0xCC, 0x0C, 0x56, 0x54, 0xBA, 0x8C, 0x71, 0xDC, 0x16, 0x00, 0x8F,
- 0xC4, 0x13, 0x5E, 0x93, 0xFB, 0x49, 0xC9, 0x74, 0x7C, 0x41, 0xA4, 0xC6, 0xDB, 0x85, 0x88, 0xB7,
- 0x66, 0x8F, 0xFB, 0xA6, 0x4D, 0xDF, 0x37, 0xE3, 0x8D, 0xBF, 0x9D, 0x72, 0xBF, 0x07, 0x7C, 0x2D,
- 0x2F, 0x89, 0xBC, 0x6F, 0x66, 0xFB, 0x09, 0xB4, 0xB2, 0x61, 0x71, 0x3B, 0xF6, 0x18, 0xFB, 0xA3,
- 0xEA, 0x4E, 0x3F, 0x23, 0x5F, 0x4D, 0xEB, 0xBE, 0x1F, 0xD2, 0xFC, 0x53, 0x62, 0xF6, 0x3A, 0x8D,
- 0xBC, 0x57, 0x91, 0x03, 0xCA, 0xB7, 0x54, 0x3E, 0xA0, 0xF5, 0x53, 0x5F, 0x35, 0x95, 0x60, 0x6A,
- 0xE2, 0xF2, 0xEA, 0xB4, 0xD3, 0xB7, 0x33, 0xD3, 0xE4, 0x79, 0xF8, 0x6A, 0x32, 0xAB, 0x42, 0x51,
- 0xDA, 0xE7, 0xCB, 0x9F, 0x0D, 0x75, 0x7F, 0x0E, 0x68, 0xFA, 0xCC, 0xB2, 0x78, 0x92, 0xC3, 0xED,
- 0x96, 0xEE, 0x81, 0x62, 0x66, 0x8F, 0xCC, 0x58, 0x9B, 0x3C, 0x92, 0x9D, 0xF3, 0xFA, 0x57, 0xBB,
- 0xE9, 0x56, 0x5F, 0x0E, 0x3C, 0x61, 0x1F, 0x97, 0x65, 0x6D, 0xA4, 0x5C, 0xB1, 0x1F, 0xEA, 0xD6,
- 0x35, 0x49, 0x07, 0xE1, 0xC1, 0xAE, 0x57, 0xC4, 0x1F, 0xB3, 0x7D, 0x9C, 0xAA, 0xF2, 0x68, 0xFA,
- 0x94, 0xB6, 0xCF, 0xFC, 0x30, 0xDD, 0x0D, 0xE9, 0xF4, 0xDC, 0x30, 0x47, 0xEB, 0x5E, 0x1D, 0xA8,
- 0xD8, 0xDC, 0xE8, 0x7A, 0xAD, 0xC5, 0xA4, 0xC7, 0xCA, 0xBB, 0xB4, 0x94, 0xC6, 0xC6, 0x36, 0xFB,
- 0xAC, 0x0F, 0x50, 0x45, 0x64, 0xAA, 0x62, 0x72, 0x58, 0xAA, 0x78, 0x9A, 0x31, 0x94, 0x5B, 0xDF,
- 0x4F, 0xCC, 0x95, 0x2A, 0x98, 0x44, 0xA3, 0x52, 0x09, 0xA3, 0xEC, 0xBF, 0x0E, 0x78, 0x7A, 0xC3,
- 0xC3, 0x1A, 0x6A, 0x58, 0x69, 0xD0, 0xF9, 0x16, 0xA8, 0xCC, 0xCA, 0x9B, 0x8B, 0x60, 0xB1, 0xC9,
- 0xE4, 0xFB, 0x9A, 0xF2, 0x5F, 0xDA, 0xEE, 0xFC, 0x59, 0xFC, 0x26, 0x95, 0x09, 0xC7, 0x9B, 0x75,
- 0x18, 0xFC, 0xB2, 0x7F, 0xA5, 0x75, 0x9F, 0x04, 0x3C, 0x4B, 0x7B, 0xE2, 0x5F, 0x05, 0x47, 0x25,
- 0xFC, 0x8D, 0x35, 0xC5, 0xBC, 0xCD, 0x6F, 0xE7, 0x37, 0x57, 0x03, 0x04, 0x13, 0xEF, 0xCE, 0x3F,
- 0x0A, 0xF2, 0x8F, 0xDB, 0xB7, 0x53, 0xFB, 0x0F, 0xC3, 0x18, 0x14, 0x1C, 0x36, 0xE9, 0xE5, 0xFF,
- 0x00, 0xBE, 0x62, 0x3F, 0xE3, 0x5F, 0x61, 0x5A, 0xB4, 0x2A, 0xE5, 0xDE, 0xD2, 0x9A, 0xB4, 0x64,
- 0x95, 0xBE, 0x76, 0x34, 0xCC, 0xEA, 0xA5, 0x97, 0x55, 0x9C, 0x7F, 0x94, 0xF5, 0x0F, 0xD9, 0xCF,
- 0x4F, 0x6D, 0x33, 0xE0, 0x37, 0x80, 0x6D, 0xDC, 0x6C, 0x75, 0xD1, 0x6D, 0x49, 0x1E, 0xE6, 0x30,
- 0x7F, 0xAD, 0x15, 0xD3, 0x7C, 0x3B, 0xB0, 0x1A, 0x67, 0x80, 0x3C, 0x35, 0x66, 0x3A, 0x5B, 0xE9,
- 0x96, 0xD1, 0x7E, 0x51, 0x28, 0xA2, 0xBD, 0x98, 0xA6, 0x92, 0x48, 0xF4, 0xE9, 0x53, 0x50, 0xA7,
- 0x18, 0xAE, 0x89, 0x1C, 0x0F, 0xC4, 0xC6, 0x3E, 0x36, 0xF8, 0x9F, 0xE1, 0x1F, 0x07, 0x2F, 0xCF,
- 0x69, 0x6A, 0xE7, 0x59, 0xD4, 0x57, 0xB6, 0xC4, 0xE2, 0x25, 0x3F, 0x56, 0xAF, 0x3A, 0xFF, 0x00,
- 0x82, 0x86, 0xF8, 0x87, 0xE2, 0x07, 0x87, 0xBE, 0x06, 0x5A, 0x7F, 0xC2, 0xBE, 0xD2, 0x75, 0xFD,
- 0x4E, 0xE2, 0xE3, 0x59, 0xB4, 0x5D, 0x52, 0x4F, 0x0C, 0x97, 0x17, 0xF6, 0xF6, 0x2A, 0xC5, 0xE4,
- 0x31, 0xF9, 0x7F, 0x3F, 0xCC, 0x55, 0x50, 0x91, 0xD0, 0x39, 0x27, 0x8C, 0xD7, 0x5B, 0xA0, 0xF8,
- 0xE3, 0xC3, 0x3E, 0x10, 0xF8, 0xBB, 0xE3, 0xEB, 0x8F, 0x12, 0x6A, 0xF1, 0xD9, 0x6A, 0xF2, 0xDC,
- 0x43, 0x04, 0x11, 0xCE, 0x0E, 0x56, 0xD8, 0x44, 0xA5, 0x48, 0xE3, 0xA1, 0x24, 0xFE, 0x55, 0xE8,
- 0x51, 0xFC, 0x5E, 0xF0, 0x3E, 0xA0, 0x8D, 0x1A, 0xF8, 0x9B, 0x4D, 0x60, 0xC3, 0x69, 0x0D, 0x38,
- 0x19, 0x1E, 0x9C, 0xD7, 0x9B, 0x42, 0xAD, 0x38, 0xCE, 0x72, 0xA9, 0x24, 0xA4, 0xDF, 0x7E, 0x8B,
- 0x45, 0xFD, 0x79, 0x9C, 0x38, 0x6A, 0xF4, 0xB9, 0xA7, 0x29, 0x4D, 0x73, 0x37, 0xB5, 0xD6, 0x96,
- 0xD1, 0x7F, 0x9F, 0xCC, 0xFC, 0xF1, 0xF0, 0xF7, 0xFC, 0x14, 0x3F, 0x45, 0xF1, 0xB7, 0x89, 0x3C,
- 0x4B, 0xA8, 0xF8, 0xE7, 0xE0, 0x77, 0x88, 0x3C, 0x53, 0xE1, 0x0C, 0xC3, 0x69, 0xA0, 0xC1, 0x6D,
- 0xE1, 0xB8, 0x6F, 0x67, 0xB6, 0x48, 0x97, 0x6C, 0xC2, 0xE6, 0xE2, 0x46, 0xF9, 0xDF, 0xCC, 0xDD,
- 0xF2, 0xAF, 0xDD, 0xE7, 0x3C, 0xD7, 0xD2, 0xBE, 0x05, 0xF8, 0xDD, 0xF0, 0x3F, 0xE1, 0xEF, 0xC0,
- 0x8D, 0x4B, 0xE3, 0x95, 0x8F, 0x80, 0x07, 0xC3, 0x8F, 0x0F, 0xDC, 0xC8, 0x34, 0xFB, 0x92, 0xBA,
- 0x24, 0x56, 0xB7, 0xF7, 0x38, 0x9B, 0xCB, 0x0A, 0x63, 0x8B, 0x96, 0x1E, 0x63, 0x36, 0x32, 0x7B,
- 0x31, 0xE9, 0x5E, 0xEB, 0xE0, 0x4F, 0xF8, 0x57, 0x9E, 0x06, 0xF0, 0xF5, 0xBE, 0x83, 0xE1, 0x26,
- 0xD0, 0x34, 0x5D, 0x12, 0x02, 0xED, 0x0E, 0x9F, 0xA6, 0x34, 0x50, 0xC1, 0x19, 0x66, 0x2C, 0xC5,
- 0x51, 0x78, 0x19, 0x62, 0x49, 0xF7, 0x26, 0xBA, 0x67, 0x9B, 0x46, 0xD4, 0xE0, 0xF2, 0x5D, 0xEC,
- 0x6E, 0xA1, 0x27, 0x3E, 0x5B, 0x14, 0x75, 0xCF, 0xAE, 0x2B, 0xD2, 0x55, 0x20, 0xF6, 0x68, 0xF4,
- 0x94, 0xE1, 0x2D, 0x9A, 0x3E, 0x20, 0xB5, 0xFF, 0x00, 0x82, 0x84, 0xFE, 0xC8, 0x53, 0xC9, 0x1C,
- 0xAF, 0x79, 0x75, 0x69, 0x20, 0x60, 0xE3, 0x7E, 0x89, 0x77, 0xF2, 0x9C, 0xE7, 0x9D, 0xAA, 0x73,
- 0x5E, 0xB3, 0xA6, 0x7F, 0xC1, 0x48, 0x3F, 0x67, 0x2D, 0x4C, 0xAA, 0x27, 0xC4, 0xAB, 0x28, 0x37,
- 0x0F, 0xF9, 0x79, 0xB6, 0x9E, 0x20, 0x3E, 0xA5, 0x90, 0x01, 0x5E, 0xE9, 0x7B, 0xF0, 0xE7, 0xC1,
- 0xBA, 0xBC, 0x7B, 0x2E, 0xBC, 0x33, 0xA1, 0xDE, 0x27, 0xA4, 0x96, 0x30, 0xB8, 0xFD, 0x56, 0xB9,
- 0x7D, 0x6F, 0xF6, 0x60, 0xF8, 0x41, 0xE2, 0x5D, 0xBF, 0xDA, 0xBF, 0x0C, 0xBC, 0x27, 0x7F, 0xB4,
- 0xE4, 0x79, 0xFA, 0x3C, 0x0D, 0x83, 0xFF, 0x00, 0x7C, 0xD6, 0x74, 0xE9, 0x52, 0xA7, 0x7F, 0x67,
- 0x14, 0xAF, 0xD8, 0x69, 0x45, 0x6C, 0x78, 0x8A, 0xFC, 0x66, 0xFD, 0x94, 0xB5, 0x69, 0x1D, 0xA3,
- 0xF8, 0xAB, 0xA1, 0x40, 0xCE, 0x49, 0x25, 0xF5, 0x8F, 0x2F, 0xAF, 0x5F, 0xBF, 0x5E, 0xCF, 0xE1,
- 0xDF, 0xDA, 0x6F, 0xE0, 0xE6, 0xB1, 0x6A, 0x91, 0x69, 0x5F, 0x14, 0x3C, 0x27, 0x7C, 0x90, 0x28,
- 0x8C, 0x98, 0xF5, 0x98, 0x18, 0x8C, 0x0E, 0xE7, 0x77, 0x5A, 0xE7, 0xEF, 0x3F, 0x61, 0x7F, 0x80,
- 0x17, 0xC4, 0x99, 0x7E, 0x12, 0xF8, 0x5D, 0x3F, 0xEB, 0x8D, 0x88, 0x8B, 0xFF, 0x00, 0x41, 0x22,
- 0xB9, 0x6D, 0x53, 0xFE, 0x09, 0xA9, 0xFB, 0x39, 0x6A, 0xB1, 0xCA, 0x92, 0x7C, 0x39, 0xB6, 0xB7,
- 0x12, 0x02, 0x09, 0xB5, 0xBC, 0xB8, 0x88, 0x8F, 0xA1, 0x59, 0x06, 0x2A, 0x69, 0x61, 0xA8, 0xD0,
- 0x6E, 0x54, 0xA0, 0x93, 0x7B, 0xD8, 0x23, 0x08, 0xC3, 0xE1, 0x56, 0x3B, 0x3F, 0x15, 0xE8, 0xDE,
- 0x05, 0xF8, 0xA1, 0xAC, 0x7F, 0x6B, 0x47, 0xE3, 0xDD, 0x3D, 0x8F, 0x96, 0xB1, 0x2A, 0xDA, 0xDF,
- 0xDB, 0xBA, 0x28, 0x19, 0xE9, 0xCF, 0x72, 0x4D, 0x76, 0x9F, 0x0D, 0xBC, 0x3B, 0xA2, 0xF8, 0x23,
- 0x46, 0x92, 0xD2, 0xC7, 0x57, 0x83, 0x50, 0x13, 0x4C, 0x66, 0x69, 0xCC, 0xA9, 0x96, 0x38, 0x00,
- 0x0E, 0x0F, 0x6C, 0x57, 0xCD, 0xF7, 0x9F, 0xF0, 0x49, 0x7F, 0xD9, 0xCA, 0xE9, 0x08, 0x8B, 0xC3,
- 0x9A, 0xB5, 0x99, 0xFE, 0xF4, 0x3A, 0xD5, 0xC1, 0x23, 0xFE, 0xFA, 0x63, 0x58, 0x37, 0x9F, 0xF0,
- 0x48, 0x3F, 0x83, 0x49, 0x1B, 0x2E, 0x8F, 0xAE, 0xF8, 0xC7, 0x41, 0x66, 0xE7, 0x7D, 0x9E, 0xA8,
- 0xA4, 0x83, 0xEB, 0xF3, 0x46, 0x45, 0x65, 0x0C, 0x0E, 0x1E, 0x9D, 0x77, 0x88, 0x8C, 0x7D, 0xF7,
- 0xD4, 0x85, 0x4A, 0x0A, 0x7C, 0xE9, 0x6A, 0x7D, 0xC6, 0x19, 0x24, 0x4C, 0xA9, 0x0C, 0x31, 0xDB,
- 0x9A, 0xF1, 0xEF, 0x1B, 0x7E, 0xCF, 0xB6, 0xDA, 0xD5, 0xE4, 0xD7, 0xDA, 0x25, 0xCA, 0xE9, 0xF3,
- 0x4A, 0x4B, 0xBD, 0xBC, 0x8A, 0x4C, 0x45, 0x8F, 0x52, 0x31, 0xCA, 0xFD, 0x39, 0x15, 0xF3, 0x98,
- 0xFF, 0x00, 0x82, 0x52, 0x69, 0x76, 0x45, 0x7F, 0xB3, 0x3E, 0x38, 0xFC, 0x4C, 0xB0, 0x0B, 0xF7,
- 0x47, 0xF6, 0x92, 0x9C, 0x7F, 0xDF, 0x2A, 0xB5, 0x13, 0x7F, 0xC1, 0x35, 0xFC, 0x7D, 0xA6, 0xDD,
- 0x2C, 0xFA, 0x37, 0xED, 0x41, 0xF1, 0x06, 0xDC, 0xA7, 0xDC, 0x5B, 0xAB, 0x89, 0xA5, 0x03, 0xEA,
- 0x3C, 0xE0, 0x0F, 0xE5, 0x4F, 0x15, 0x83, 0xA3, 0x8C, 0x87, 0x25, 0x78, 0xDD, 0x05, 0x4A, 0x50,
- 0xAA, 0xAD, 0x34, 0x7A, 0xBB, 0x7C, 0x01, 0xF1, 0x95, 0xBB, 0x32, 0xC5, 0xF6, 0x46, 0x56, 0xEA,
- 0xC9, 0x74, 0x54, 0x1F, 0xC3, 0x15, 0xA9, 0xA1, 0x7E, 0xCD, 0xDA, 0xB4, 0xF2, 0xA3, 0x6A, 0xBA,
- 0x85, 0xBD, 0x9C, 0x39, 0xF9, 0x92, 0xDB, 0x32, 0x39, 0xFC, 0x48, 0x00, 0x7E, 0xB5, 0xE2, 0x71,
- 0xFE, 0xC5, 0x3F, 0xB4, 0xF6, 0x92, 0xC5, 0xF4, 0xDF, 0xDA, 0xBA, 0xFE, 0x56, 0x1F, 0x74, 0x5D,
- 0x69, 0x8E, 0x41, 0xFA, 0xE6, 0x46, 0xFE, 0x55, 0x0D, 0xD7, 0xEC, 0xDF, 0xFB, 0x6E, 0x69, 0x51,
- 0x33, 0x69, 0x9F, 0xB4, 0x66, 0x95, 0x7F, 0x27, 0x64, 0xBB, 0xD3, 0xE3, 0x50, 0x7F, 0x16, 0x81,
- 0xFF, 0x00, 0x95, 0x78, 0xD1, 0xE1, 0xEC, 0x14, 0x65, 0x77, 0x77, 0x6E, 0x8D, 0xE8, 0x73, 0x2C,
- 0x15, 0x14, 0x7D, 0xBF, 0xE1, 0x6F, 0x08, 0xE9, 0xBE, 0x0D, 0xD2, 0x85, 0x96, 0x99, 0x07, 0x94,
- 0x83, 0x97, 0x76, 0x39, 0x79, 0x1B, 0xFB, 0xCC, 0x7B, 0x9A, 0xF0, 0x4F, 0x16, 0xF8, 0x57, 0xC7,
- 0xD6, 0xBE, 0x2E, 0xD4, 0xF5, 0x7B, 0x5B, 0x5B, 0xD8, 0xFE, 0xD1, 0x3B, 0x3A, 0xC9, 0x61, 0x36,
- 0xE0, 0x54, 0x70, 0xB9, 0x00, 0xE7, 0xA0, 0x1D, 0x45, 0x78, 0xED, 0xB7, 0x83, 0xBF, 0xE0, 0xA0,
- 0x7A, 0x0C, 0x22, 0x21, 0xE3, 0x1F, 0x87, 0xDA, 0xFE, 0x06, 0x3C, 0xDB, 0x84, 0x0A, 0xE7, 0xDC,
- 0x81, 0x02, 0x0F, 0xCA, 0x99, 0x73, 0xE2, 0x4F, 0xF8, 0x28, 0x2E, 0x8C, 0xBB, 0x47, 0x86, 0x7E,
- 0x1E, 0xEB, 0x1B, 0x7F, 0x8E, 0x22, 0x32, 0x7F, 0x39, 0x93, 0xF9, 0x57, 0xA1, 0x8B, 0xCB, 0x69,
- 0xE2, 0xA9, 0x46, 0x92, 0x6E, 0x0A, 0x3B, 0x72, 0xE8, 0x6D, 0x56, 0x84, 0x6A, 0x45, 0x46, 0xF6,
- 0xB7, 0x63, 0xD5, 0x5F, 0xC4, 0x5F, 0x13, 0x36, 0x98, 0x19, 0xF5, 0xB1, 0x91, 0x8C, 0x7D, 0x94,
- 0xE7, 0xF3, 0xDB, 0x55, 0xB4, 0x3F, 0x83, 0xFE, 0x2C, 0xF1, 0x2D, 0xDE, 0xE9, 0x6C, 0x64, 0xB2,
- 0x8E, 0x46, 0xDD, 0x25, 0xD5, 0xF1, 0xDA, 0x79, 0xEA, 0x71, 0xF7, 0x89, 0xAF, 0x2D, 0xB5, 0xFD,
- 0xA1, 0xBF, 0x6E, 0x7D, 0x2D, 0x76, 0x6A, 0x5F, 0xB3, 0xF6, 0x87, 0xA8, 0x98, 0xF8, 0x79, 0x2D,
- 0x2E, 0xE3, 0x40, 0xF8, 0xEE, 0xA0, 0x5C, 0xB7, 0x5A, 0x96, 0x7F, 0xDB, 0x53, 0xF6, 0xA6, 0xD1,
- 0xA3, 0x32, 0x6A, 0x3F, 0xB2, 0xAD, 0xDC, 0xCA, 0xBF, 0x7B, 0xEC, 0xB7, 0xD2, 0x12, 0x7E, 0x81,
- 0x51, 0xEB, 0xC8, 0xFF, 0x00, 0x57, 0xA1, 0x39, 0x27, 0x5E, 0xB4, 0xA6, 0x97, 0x46, 0x73, 0x7D,
- 0x4A, 0x2D, 0xFB, 0xF2, 0x6C, 0xFB, 0x83, 0xC1, 0x9E, 0x15, 0xB6, 0xF0, 0x6F, 0x87, 0xAD, 0x74,
- 0xBB, 0x62, 0x59, 0x61, 0x04, 0xB4, 0x8D, 0xD5, 0xDC, 0xF2, 0xCC, 0x7E, 0xA6, 0xBE, 0x68, 0xFD,
- 0xBC, 0xE5, 0x37, 0x5A, 0x36, 0x91, 0xA7, 0x02, 0x0B, 0x4D, 0x1C, 0xAA, 0x14, 0xF7, 0x2E, 0xCA,
- 0x83, 0xF9, 0xD7, 0xD1, 0xBF, 0x0C, 0x3C, 0x49, 0xAA, 0xF8, 0xCB, 0xE1, 0xD7, 0x86, 0xF5, 0xDD,
- 0x73, 0x45, 0x7F, 0x0D, 0xEB, 0x1A, 0x9E, 0x9F, 0x0D, 0xDD, 0xDE, 0x8F, 0x2B, 0x16, 0x7B, 0x29,
- 0x1D, 0x03, 0x34, 0x2C, 0x48, 0x04, 0x95, 0x27, 0x07, 0x20, 0x72, 0x3A, 0x57, 0xCC, 0x9F, 0xB6,
- 0x43, 0xFF, 0x00, 0x68, 0x7C, 0x46, 0xF0, 0x66, 0x9B, 0xC9, 0x12, 0x5E, 0x69, 0xF1, 0x10, 0x3D,
- 0x1E, 0xF2, 0x30, 0x7F, 0x4A, 0xF5, 0x31, 0xD0, 0x8D, 0x2C, 0x34, 0x69, 0x41, 0x69, 0x78, 0xAF,
- 0xC4, 0xE4, 0xCE, 0x2D, 0x1C, 0x13, 0x82, 0xEA, 0xD2, 0xFC, 0x51, 0xF5, 0xCD, 0x84, 0x1F, 0x66,
- 0xB1, 0xB7, 0x84, 0x0D, 0xA2, 0x38, 0xD5, 0x00, 0xFA, 0x00, 0x28, 0xAB, 0x0A, 0x0E, 0x28, 0xAF,
- 0x63, 0x53, 0xDC, 0x4B, 0x43, 0xCE, 0x3E, 0x26, 0xFE, 0xCF, 0xFE, 0x10, 0xF8, 0xB1, 0x73, 0x05,
- 0xE6, 0xB7, 0x67, 0x32, 0x6A, 0x50, 0xA7, 0x97, 0x1D, 0xFD, 0x94, 0xED, 0x04, 0xC1, 0x3A, 0xED,
- 0x2C, 0xBF, 0x78, 0x67, 0x9C, 0x1C, 0xD7, 0x9A, 0xDD, 0xFE, 0xC3, 0xBE, 0x1A, 0x71, 0x8B, 0x4F,
- 0x13, 0xF8, 0x86, 0xD7, 0xEB, 0x3A, 0x49, 0xFF, 0x00, 0xA1, 0x2D, 0x7D, 0x29, 0x49, 0x5C, 0xF5,
- 0x30, 0xB4, 0x6A, 0xBB, 0xCE, 0x29, 0xB3, 0xCE, 0xAD, 0x96, 0xE0, 0xEB, 0xC9, 0xCE, 0xA5, 0x24,
- 0xDB, 0xEB, 0x63, 0xE5, 0x5B, 0x9F, 0xD8, 0x6B, 0x6E, 0x4D, 0xA7, 0x8F, 0xB5, 0x15, 0x3D, 0x85,
- 0xC5, 0x9C, 0x2F, 0xFC, 0x80, 0xAC, 0xB9, 0xFF, 0x00, 0x62, 0xBF, 0x16, 0x5B, 0xE4, 0xD9, 0x78,
- 0xF6, 0xD0, 0x9E, 0xDE, 0x76, 0x9E, 0xCB, 0xFF, 0x00, 0xA0, 0xBD, 0x7D, 0x7D, 0x8A, 0x08, 0xAE,
- 0x57, 0x96, 0x61, 0x5F, 0xD8, 0x38, 0xDE, 0x47, 0x80, 0x7B, 0x42, 0xDE, 0x8D, 0xFF, 0x00, 0x99,
- 0xF1, 0xC1, 0xFD, 0x96, 0x7E, 0x2D, 0xE9, 0xB9, 0x36, 0x7E, 0x2F, 0xD2, 0xA7, 0x23, 0xA6, 0xD9,
- 0x2E, 0x21, 0x3F, 0xCC, 0xD4, 0x6D, 0xF0, 0x7F, 0xF6, 0x81, 0xD2, 0x7F, 0xE3, 0xDB, 0x52, 0xB5,
- 0xB8, 0x03, 0xFE, 0x79, 0x6B, 0x32, 0xAF, 0xE8, 0xCB, 0x5F, 0x65, 0x81, 0x8A, 0x4D, 0xB5, 0x9F,
- 0xF6, 0x5E, 0x1F, 0xA5, 0xD7, 0xCC, 0x8F, 0xEC, 0x3C, 0x32, 0xF8, 0x25, 0x25, 0xE9, 0x26, 0x7C,
- 0x66, 0x74, 0xEF, 0xDA, 0x47, 0x4A, 0xFF, 0x00, 0x97, 0x3B, 0xBB, 0x80, 0x3F, 0xE7, 0x86, 0xA7,
- 0x14, 0x9F, 0xFA, 0x10, 0x19, 0xA6, 0x37, 0x8F, 0xBF, 0x68, 0x6D, 0x23, 0x99, 0xBC, 0x33, 0xAD,
- 0x4A, 0xA3, 0xA9, 0x58, 0x60, 0x97, 0xF9, 0x1A, 0xFB, 0x3F, 0x68, 0xA3, 0x6D, 0x1F, 0xD9, 0x90,
- 0x5F, 0x0C, 0xE4, 0xBE, 0x64, 0xBC, 0x9D, 0xAF, 0x83, 0x11, 0x35, 0xF3, 0x3E, 0x31, 0x3F, 0xB4,
- 0x57, 0xC6, 0x2D, 0x28, 0xE2, 0xFB, 0xC2, 0x9A, 0xA8, 0xC7, 0x53, 0x26, 0x8A, 0xED, 0xFF, 0x00,
- 0xA0, 0x50, 0x9F, 0xB6, 0x77, 0x8C, 0x2C, 0x38, 0xBD, 0xF0, 0xEB, 0x2E, 0x3A, 0xF9, 0xDA, 0x65,
- 0xC4, 0x7F, 0xD2, 0xBE, 0xCF, 0xC7, 0xAD, 0x47, 0x25, 0xBC, 0x72, 0x0C, 0x32, 0x2B, 0x7D, 0x54,
- 0x1A, 0x9F, 0xA8, 0x55, 0x5F, 0x0D, 0x69, 0x0F, 0xFB, 0x37, 0x17, 0x1F, 0x83, 0x15, 0x2F, 0x9A,
- 0x4C, 0xF9, 0x02, 0x0F, 0xDB, 0xC9, 0xA1, 0xFF, 0x00, 0x8F, 0xCD, 0x1E, 0xCD, 0x3D, 0x77, 0x49,
- 0x24, 0x5F, 0xFA, 0x12, 0xD6, 0xC5, 0x97, 0xED, 0xE1, 0xA2, 0xCE, 0x07, 0x9B, 0xA5, 0xC2, 0x73,
- 0xDE, 0x2B, 0xE5, 0xFE, 0xA2, 0xBE, 0x9A, 0xB8, 0xF0, 0xEE, 0x97, 0x77, 0x9F, 0x3F, 0x4E, 0xB4,
- 0x9B, 0xFE, 0xBA, 0x40, 0xA7, 0xF9, 0x8A, 0xC5, 0xBE, 0xF8, 0x57, 0xE0, 0xED, 0x43, 0x3F, 0x69,
- 0xF0, 0xB6, 0x91, 0x31, 0x3D, 0x77, 0x59, 0x47, 0xFE, 0x14, 0x7D, 0x57, 0x17, 0x1F, 0x86, 0xBB,
- 0xFB, 0x90, 0xBE, 0xA7, 0x99, 0xC7, 0xE1, 0xC4, 0xA7, 0xEB, 0x13, 0xC7, 0x6C, 0xFF, 0x00, 0x6D,
- 0x7F, 0x0B, 0xDC, 0x01, 0xE6, 0x69, 0x97, 0x4B, 0xEB, 0xB2, 0x78, 0xDB, 0xFA, 0xD6, 0xDD, 0xA7,
- 0xED, 0x75, 0xE0, 0xAB, 0x80, 0x37, 0xC7, 0xA8, 0x45, 0xFF, 0x00, 0x6C, 0x95, 0xBF, 0x91, 0xAE,
- 0xA2, 0xFB, 0xF6, 0x6D, 0xF8, 0x63, 0xA8, 0xFF, 0x00, 0xAE, 0xF0, 0x4E, 0x8E, 0x7F, 0xDC, 0xB7,
- 0x0B, 0xFC, 0xB1, 0x58, 0x77, 0x5F, 0xB2, 0x07, 0xC2, 0x9B, 0x9C, 0xED, 0xF0, 0xBA, 0x5B, 0x13,
- 0xDE, 0xDE, 0xE2, 0x58, 0xF1, 0xF9, 0x35, 0x1E, 0xCB, 0x1F, 0x1D, 0xAA, 0x27, 0xF2, 0x0F, 0x67,
- 0x9C, 0x47, 0x6A, 0x90, 0x7F, 0x26, 0x5C, 0xB6, 0xFD, 0xA8, 0x7C, 0x03, 0x70, 0x39, 0xD4, 0x2E,
- 0x21, 0xF7, 0x92, 0xD5, 0xFF, 0x00, 0xA0, 0xAD, 0x5B, 0x6F, 0xDA, 0x13, 0xC0, 0x17, 0x58, 0xC7,
- 0x88, 0x20, 0x4C, 0xFF, 0x00, 0xCF, 0x45, 0x65, 0xFE, 0x62, 0xB8, 0x5B, 0xAF, 0xD8, 0x93, 0xE1,
- 0xBC, 0xA0, 0xF9, 0x2B, 0xAC, 0x59, 0x93, 0xFF, 0x00, 0x3C, 0x75, 0x29, 0x3F, 0xAE, 0x6B, 0x2A,
- 0xEB, 0xF6, 0x18, 0xF0, 0xB1, 0xCF, 0xD9, 0x3C, 0x4D, 0xE2, 0x1B, 0x4C, 0xF4, 0x1F, 0x68, 0x49,
- 0x31, 0xFF, 0x00, 0x7D, 0x2D, 0x1F, 0xF0, 0xA3, 0x1F, 0xE5, 0x7F, 0x78, 0x73, 0xE7, 0x11, 0xFB,
- 0x10, 0x7F, 0x36, 0x7B, 0x25, 0xB7, 0xC6, 0x0F, 0x05, 0xDD, 0xE3, 0xCA, 0xF1, 0x2E, 0x9C, 0x73,
- 0xEB, 0x38, 0x1F, 0xCE, 0xB5, 0x6D, 0xFC, 0x6F, 0xE1, 0xFB, 0xBC, 0x79, 0x3A, 0xDE, 0x9F, 0x2E,
- 0x7F, 0xBB, 0x72, 0x87, 0xFA, 0xD7, 0xCD, 0xD7, 0x5F, 0xB0, 0xB0, 0x56, 0xCD, 0xA7, 0xC4, 0x0D,
- 0x51, 0x71, 0xD1, 0x6E, 0x2D, 0x62, 0x71, 0xFA, 0x01, 0x58, 0xD7, 0x7F, 0xB1, 0x37, 0x89, 0xA1,
- 0x24, 0xDA, 0x78, 0xEE, 0xD5, 0xC0, 0x1C, 0x7D, 0xA3, 0x4D, 0xFF, 0x00, 0xE2, 0x5A, 0xA1, 0xD7,
- 0xC7, 0xC3, 0x78, 0x47, 0xEF, 0x33, 0xFA, 0xF6, 0x67, 0x0F, 0x8F, 0x0E, 0xBE, 0x52, 0x47, 0xD7,
- 0x31, 0xEB, 0x16, 0x53, 0x8F, 0xDD, 0x5E, 0x5B, 0xC9, 0xFE, 0xE4, 0xAA, 0x7F, 0xAD, 0x7C, 0x8B,
- 0xF1, 0x82, 0x75, 0xF1, 0x8F, 0xED, 0x81, 0xE0, 0x7F, 0x0F, 0x59, 0x01, 0x79, 0x2C, 0x57, 0x36,
- 0xF7, 0xB7, 0x02, 0x33, 0xB8, 0x43, 0x04, 0x00, 0xCA, 0xCE, 0xDE, 0x83, 0x70, 0x45, 0xFA, 0xB0,
- 0xAC, 0xA6, 0xFD, 0x8F, 0x7E, 0x23, 0x4D, 0x70, 0xB0, 0x47, 0xE3, 0xCD, 0x22, 0xC6, 0x26, 0xEB,
- 0x34, 0x16, 0x52, 0x99, 0x00, 0xF6, 0x1B, 0x80, 0xCF, 0xE3, 0x5F, 0x41, 0x7C, 0x0F, 0xFD, 0x9D,
- 0x3C, 0x3D, 0xF0, 0x4E, 0x0B, 0xAB, 0x8B, 0x49, 0xEE, 0x75, 0xAF, 0x11, 0x5F, 0x81, 0xF6, 0xED,
- 0x73, 0x51, 0x6D, 0xF7, 0x13, 0x01, 0xD1, 0x07, 0x64, 0x41, 0xD9, 0x47, 0xD4, 0xE4, 0xF3, 0x5A,
- 0x45, 0x56, 0xC6, 0x72, 0xFB, 0x58, 0xA8, 0xD9, 0xDF, 0x7B, 0xEC, 0x4C, 0x6A, 0x62, 0x73, 0x37,
- 0x1A, 0x75, 0x69, 0x72, 0x46, 0x2D, 0x36, 0xEE, 0x9D, 0xED, 0xAD, 0xB4, 0x3D, 0x58, 0x67, 0x14,
- 0x53, 0x82, 0xFB, 0xD1, 0x5E, 0xC1, 0xF5, 0x07, 0xFF, 0xD9
-};
-
-static const uint8_t pcFTP_PNG_Data[] =
-{
- 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52,
- 0x00, 0x00, 0x02, 0x07, 0x00, 0x00, 0x02, 0xAB, 0x08, 0x03, 0x00, 0x00, 0x00, 0x52, 0xA1, 0xDE,
- 0x9C, 0x00, 0x00, 0x03, 0x00, 0x50, 0x4C, 0x54, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00,
- 0x3A, 0x3A, 0x36, 0x00, 0x00, 0x36, 0x00, 0x35, 0x33, 0x32, 0x32, 0x00, 0x00, 0x51, 0x00, 0x00,
- 0x65, 0x10, 0x2D, 0x71, 0x30, 0x00, 0x51, 0x39, 0x00, 0x66, 0x30, 0x2E, 0x51, 0x2E, 0x30, 0x72,
- 0x11, 0x78, 0x10, 0x27, 0x79, 0x2E, 0x30, 0x54, 0x51, 0x36, 0x52, 0x7C, 0x39, 0x66, 0x66, 0x55,
- 0x00, 0x00, 0x55, 0x00, 0x2D, 0x55, 0x2E, 0x00, 0x50, 0x2F, 0x2B, 0x66, 0x00, 0x00, 0x66, 0x00,
- 0x39, 0x6E, 0x33, 0x00, 0x72, 0x31, 0x2F, 0x55, 0x00, 0x51, 0x4C, 0x31, 0x74, 0x66, 0x00, 0x66,
- 0x77, 0x2E, 0x51, 0x70, 0x33, 0x75, 0x56, 0x40, 0x36, 0x5A, 0x75, 0x30, 0x78, 0x55, 0x00, 0x66,
- 0x46, 0x38, 0x65, 0x64, 0x25, 0x40, 0x40, 0x40, 0x47, 0x5D, 0x7B, 0x4D, 0x7C, 0x49, 0x55, 0x75,
- 0x71, 0x6A, 0x58, 0x50, 0x6C, 0x67, 0x55, 0x6F, 0x6F, 0x72, 0x00, 0x06, 0x8F, 0x01, 0x13, 0xB0,
- 0x00, 0x39, 0x8F, 0x14, 0x2E, 0xA4, 0x39, 0x39, 0x8F, 0x26, 0x39, 0xA8, 0x04, 0x1C, 0xD2, 0x00,
- 0x54, 0x90, 0x10, 0x54, 0xB6, 0x00, 0x65, 0xB4, 0x32, 0x4E, 0x8C, 0x33, 0x53, 0xAE, 0x37, 0x6A,
- 0x8D, 0x30, 0x71, 0xB2, 0x1F, 0x5F, 0xC0, 0x0C, 0x75, 0xD0, 0x0E, 0x70, 0xF3, 0x35, 0x4E, 0xD4,
- 0x30, 0x6D, 0xCB, 0x34, 0x7B, 0xE3, 0x50, 0x3F, 0x80, 0x49, 0x36, 0xA8, 0x66, 0x39, 0x8F, 0x66,
- 0x3A, 0x90, 0x41, 0x5C, 0x98, 0x45, 0x63, 0x9C, 0x53, 0x72, 0xA9, 0x6C, 0x77, 0x81, 0x62, 0x76,
- 0xB4, 0x4A, 0x75, 0xCB, 0x68, 0x7C, 0xDC, 0x0F, 0x96, 0x0E, 0x13, 0xAF, 0x09, 0x0E, 0xB2, 0x21,
- 0x34, 0x93, 0x34, 0x25, 0xB6, 0x1B, 0x36, 0xAD, 0x35, 0x3A, 0xAA, 0x46, 0x18, 0xD1, 0x05, 0x14,
- 0xCB, 0x2B, 0x1E, 0xEC, 0x08, 0x18, 0xE2, 0x33, 0x25, 0xD3, 0x0E, 0x30, 0xCA, 0x33, 0x28, 0xF4,
- 0x06, 0x34, 0xFC, 0x28, 0x2D, 0xC2, 0x44, 0x5A, 0x86, 0x29, 0x4F, 0xAC, 0x39, 0x60, 0xB1, 0x3B,
- 0x52, 0x88, 0x4F, 0x5E, 0x97, 0x66, 0x49, 0xB5, 0x46, 0x6D, 0x8D, 0x58, 0x72, 0x92, 0x6E, 0x6A,
- 0xAC, 0x4E, 0x6E, 0xB1, 0x68, 0x4F, 0xCC, 0x35, 0x50, 0xEB, 0x06, 0x4B, 0xF4, 0x34, 0x78, 0xD6,
- 0x37, 0x4C, 0xC9, 0x49, 0x54, 0xD2, 0x69, 0x52, 0xE6, 0x48, 0x65, 0xC7, 0x54, 0x70, 0xCA, 0x6F,
- 0x66, 0xEE, 0x57, 0x74, 0xF0, 0x67, 0x19, 0x87, 0xD3, 0x0C, 0x8F, 0xE5, 0x18, 0xB2, 0xFF, 0x38,
- 0x8E, 0xD8, 0x31, 0x8A, 0xF5, 0x3C, 0xAC, 0xEE, 0x48, 0x8C, 0x96, 0x4E, 0x8C, 0xA7, 0x66, 0x8F,
- 0x91, 0x67, 0x87, 0xB9, 0x77, 0xB1, 0x89, 0x6A, 0xB1, 0xB4, 0x54, 0x93, 0xCA, 0x50, 0x94, 0xE8,
- 0x56, 0xA7, 0xDA, 0x51, 0xA8, 0xED, 0x75, 0x96, 0xC6, 0x6C, 0x97, 0xE3, 0x76, 0xAD, 0xCC, 0x66,
- 0xB5, 0xFD, 0x54, 0xC9, 0x82, 0x5D, 0xC2, 0xFF, 0x76, 0xC4, 0xFF, 0x92, 0x00, 0x00, 0x8F, 0x39,
- 0x00, 0x8F, 0x39, 0x39, 0xB2, 0x00, 0x00, 0xA3, 0x3A, 0x0F, 0xB2, 0x2D, 0x26, 0x90, 0x3A, 0x66,
- 0x96, 0x54, 0x01, 0x98, 0x54, 0x2D, 0x8F, 0x66, 0x00, 0x95, 0x75, 0x2E, 0xAB, 0x55, 0x02, 0xAF,
- 0x4D, 0x2C, 0xB5, 0x65, 0x00, 0xB5, 0x71, 0x30, 0x97, 0x54, 0x51, 0x95, 0x58, 0x73, 0x82, 0x65,
- 0x55, 0x8A, 0x70, 0x70, 0xA7, 0x58, 0x4F, 0xB6, 0x73, 0x51, 0xB5, 0x68, 0x66, 0xE0, 0x2A, 0x24,
- 0xE5, 0x3D, 0x41, 0xDB, 0x58, 0x30, 0xD9, 0x54, 0x47, 0xCC, 0x6F, 0x6E, 0xEA, 0x55, 0x4A, 0xF5,
- 0x74, 0x45, 0xE8, 0x71, 0x72, 0x80, 0x52, 0x8F, 0x94, 0x6B, 0x8B, 0xA4, 0x77, 0x94, 0xD5, 0x7D,
- 0x83, 0x84, 0xA7, 0x14, 0x8C, 0xB6, 0x3D, 0xB5, 0x8E, 0x38, 0x97, 0x94, 0x51, 0x8A, 0x8E, 0x75,
- 0x90, 0xB8, 0x5B, 0x95, 0xB2, 0x71, 0xB3, 0x92, 0x4B, 0xB4, 0x90, 0x71, 0xB6, 0xB3, 0x70, 0x89,
- 0xC5, 0x43, 0x83, 0xCB, 0x76, 0x8E, 0xF1, 0x69, 0xB1, 0xD2, 0x5A, 0xAC, 0xC8, 0x78, 0xD5, 0x96,
- 0x13, 0xDA, 0x8F, 0x39, 0xD7, 0xAE, 0x11, 0xDD, 0xA9, 0x2D, 0xE9, 0x81, 0x0E, 0xF3, 0x92, 0x31,
- 0xE8, 0xB4, 0x06, 0xF2, 0xAA, 0x22, 0xD4, 0x94, 0x51, 0xDA, 0x90, 0x68, 0xCF, 0xB3, 0x4F, 0xD4,
- 0xB3, 0x70, 0xF6, 0x8E, 0x58, 0xE7, 0x82, 0x7E, 0xE7, 0xA3, 0x55, 0xFD, 0xB5, 0x66, 0xF8, 0xCD,
- 0x05, 0xF1, 0xD0, 0x2F, 0xFB, 0xE3, 0x3D, 0xE0, 0xC8, 0x68, 0x84, 0x84, 0x83, 0x90, 0x99, 0xA6,
- 0x8C, 0xB3, 0x8C, 0x98, 0xA7, 0xAF, 0xAB, 0x94, 0x8E, 0xA9, 0x98, 0xA8, 0xA6, 0xA7, 0x95, 0xAF,
- 0xB0, 0xB0, 0x83, 0x9C, 0xD2, 0x89, 0xAB, 0xD7, 0x97, 0xBA, 0xE3, 0xAF, 0xB9, 0xC6, 0xA4, 0xBC,
- 0xE3, 0x93, 0xD1, 0x8D, 0x90, 0xDA, 0xB5, 0x91, 0xEA, 0x8B, 0xB5, 0xDB, 0x8F, 0xB4, 0xD5, 0x90,
- 0xB5, 0xCE, 0xAB, 0xA5, 0xE6, 0x9D, 0xB5, 0xFD, 0xB4, 0x97, 0xD0, 0xC9, 0x8F, 0xDB, 0xFE, 0x92,
- 0xD5, 0xFA, 0x99, 0xE1, 0xFF, 0xB6, 0xCF, 0xC8, 0xA6, 0xC9, 0xEE, 0xAA, 0xED, 0xDB, 0xB5, 0xFE,
- 0xFE, 0xD3, 0x93, 0x8E, 0xDB, 0xA5, 0x94, 0xCC, 0xB5, 0xAF, 0xE8, 0x8D, 0x8B, 0xE1, 0xAC, 0x9A,
- 0xE7, 0xAC, 0xA9, 0xD2, 0xBA, 0xC5, 0xD8, 0xD7, 0x8F, 0xC8, 0xC5, 0xBB, 0xC4, 0xE3, 0x9E, 0xDA,
- 0xFE, 0xB6, 0xFE, 0xDA, 0x8F, 0xFB, 0xCE, 0xB4, 0xF0, 0xE4, 0x92, 0xFD, 0xFB, 0xB4, 0xD4, 0xD0,
- 0xC8, 0xCF, 0xD8, 0xE9, 0xD3, 0xEB, 0xD5, 0xDA, 0xFE, 0xFE, 0xE4, 0xDD, 0xD8, 0xE3, 0xDF, 0xE0,
- 0xEF, 0xED, 0xD9, 0xFE, 0xFE, 0xDB, 0xFE, 0xFE, 0xFE, 0x5A, 0x51, 0xE9, 0x0B, 0x00, 0x00, 0x7B,
- 0x8E, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0xED, 0xBD, 0x09, 0x9C, 0x94, 0xC5, 0x99, 0x3F, 0xFE,
- 0xBC, 0x7D, 0xCC, 0x74, 0x0F, 0xC3, 0x7D, 0x0C, 0xE0, 0x70, 0x05, 0x06, 0xC3, 0x31, 0x1C, 0x02,
- 0xAE, 0x47, 0xA2, 0x4B, 0x74, 0x25, 0xBA, 0xF1, 0x46, 0xA3, 0xB9, 0x58, 0x25, 0xD9, 0xC4, 0x84,
- 0x5C, 0x18, 0x84, 0x8D, 0x8A, 0x82, 0xA8, 0x28, 0x21, 0xD1, 0x48, 0x36, 0xBF, 0xAC, 0x31, 0x59,
- 0x4C, 0x5C, 0x5D, 0x45, 0x12, 0x62, 0x76, 0x15, 0x63, 0x42, 0x74, 0xFF, 0x80, 0x61, 0x1C, 0x39,
- 0x66, 0x10, 0xC3, 0x30, 0x82, 0x30, 0x30, 0x20, 0x8C, 0x0C, 0xCC, 0xD1, 0x3D, 0xD3, 0xC7, 0xFB,
- 0x7F, 0x9E, 0xAA, 0x7A, 0xCF, 0x7E, 0xBB, 0xA7, 0xBB, 0xA7, 0x7B, 0xBA, 0x9B, 0xA9, 0xCF, 0x77,
- 0xE6, 0xED, 0x7A, 0xAB, 0xEA, 0x7D, 0xAA, 0xDE, 0xAA, 0xE7, 0x7D, 0xEA, 0x7A, 0xEA, 0x29, 0x25,
- 0x00, 0x20, 0xD1, 0xEB, 0x51, 0xE9, 0x01, 0x5F, 0xB7, 0x89, 0x48, 0x14, 0x3A, 0xDE, 0x01, 0x0F,
- 0x40, 0xB0, 0xBB, 0x54, 0x24, 0x0A, 0x1F, 0xAE, 0x6E, 0x53, 0x90, 0x38, 0x17, 0x80, 0xF2, 0x00,
- 0x60, 0x60, 0xF7, 0x28, 0x84, 0x3D, 0x61, 0xBA, 0x40, 0x18, 0x3C, 0x93, 0xF6, 0x41, 0xB8, 0x72,
- 0x1F, 0xE0, 0xCF, 0xA4, 0x7D, 0xE8, 0x98, 0xB4, 0x6F, 0x52, 0x4D, 0x25, 0xEC, 0x9B, 0x44, 0x7F,
- 0xA9, 0xD0, 0xEC, 0x77, 0x96, 0xFF, 0xF5, 0x03, 0xFC, 0xB3, 0x85, 0x29, 0x2A, 0x22, 0xFE, 0xA3,
- 0x8A, 0xCA, 0x63, 0xC4, 0x89, 0xE3, 0x8A, 0xBA, 0x80, 0xFF, 0xD9, 0x43, 0x66, 0xEE, 0x9C, 0x19,
- 0x9F, 0x2A, 0x43, 0x71, 0x07, 0xFE, 0x31, 0x74, 0x11, 0x71, 0xFE, 0x86, 0xF9, 0x80, 0x7F, 0xF1,
- 0x82, 0x29, 0x6F, 0xCE, 0xD9, 0x63, 0x99, 0x4F, 0x10, 0xCE, 0x30, 0xA0, 0x99, 0xFF, 0x21, 0x00,
- 0xFF, 0xE2, 0xC6, 0x4B, 0x1A, 0x83, 0xF0, 0x9F, 0xF1, 0x01, 0xC0, 0x0A, 0x5B, 0xD0, 0x03, 0xAC,
- 0x20, 0x13, 0x95, 0xB7, 0xA8, 0xFB, 0x49, 0x35, 0x61, 0xA0, 0x4B, 0x85, 0xAF, 0x06, 0xA0, 0x12,
- 0xF0, 0x02, 0x35, 0x95, 0x35, 0xC1, 0x49, 0x35, 0x35, 0x78, 0x17, 0x46, 0x00, 0xF2, 0x40, 0x4D,
- 0x25, 0xFE, 0xA1, 0x07, 0x71, 0x07, 0xBA, 0x12, 0xF2, 0x05, 0x56, 0x3E, 0x03, 0xBA, 0x84, 0x0F,
- 0xDD, 0x1A, 0xE1, 0x58, 0x4E, 0x2A, 0xFE, 0xD8, 0xB3, 0x66, 0x2A, 0x3E, 0x0A, 0x11, 0x6E, 0x5B,
- 0x2C, 0x64, 0x82, 0x28, 0x44, 0xC1, 0x35, 0x7D, 0x27, 0x5E, 0x01, 0x66, 0xEE, 0x8E, 0xCE, 0xDC,
- 0x0D, 0xD3, 0x5D, 0x3B, 0xF1, 0x1F, 0x60, 0xE7, 0xCC, 0x9D, 0x3C, 0x96, 0x03, 0x43, 0x08, 0x0E,
- 0xD0, 0xD8, 0x40, 0x77, 0xDA, 0xE3, 0x01, 0xF0, 0xDA, 0x67, 0x6C, 0xB0, 0x61, 0xFE, 0xC6, 0x9B,
- 0x80, 0xFD, 0x6D, 0x04, 0xBC, 0xDE, 0x6C, 0xE4, 0x06, 0x73, 0x67, 0xE3, 0x53, 0xCA, 0x3E, 0xCF,
- 0xBC, 0x9E, 0x71, 0x87, 0xF2, 0x17, 0xD5, 0xAF, 0xB3, 0x01, 0xE3, 0x82, 0xCC, 0x70, 0x83, 0x12,
- 0xF0, 0x05, 0x51, 0x1E, 0xD8, 0xF8, 0xE0, 0x01, 0xF1, 0xEB, 0xC8, 0x08, 0x1E, 0xFC, 0xEE, 0x59,
- 0x05, 0x73, 0x60, 0x05, 0x63, 0x0D, 0x87, 0x39, 0x13, 0x54, 0xA2, 0x07, 0x55, 0x78, 0x18, 0xEF,
- 0x2A, 0x39, 0xD0, 0x41, 0x7F, 0x14, 0x55, 0xFC, 0x30, 0x38, 0x72, 0x02, 0x55, 0x3F, 0xBB, 0x32,
- 0x4E, 0x70, 0x92, 0x06, 0xC0, 0x4A, 0xCA, 0x96, 0x31, 0x2C, 0x45, 0xF6, 0x9F, 0xF0, 0x7B, 0x42,
- 0x16, 0xD0, 0x5C, 0x28, 0x0E, 0x66, 0x56, 0xEB, 0x12, 0x61, 0xFA, 0x6E, 0x7E, 0x11, 0xB5, 0x4F,
- 0xFC, 0x10, 0x2B, 0x19, 0x4C, 0x9C, 0x00, 0x46, 0xFD, 0x5B, 0x39, 0x01, 0x79, 0x60, 0x03, 0xA6,
- 0xC2, 0xB8, 0xCD, 0x75, 0xD3, 0x06, 0xFC, 0x23, 0xAE, 0x40, 0x4E, 0xC0, 0xAB, 0xF2, 0xF2, 0x4D,
- 0xE8, 0xC0, 0xAB, 0x43, 0xD6, 0x58, 0xD6, 0x35, 0x67, 0x57, 0xF2, 0x40, 0xE7, 0x01, 0x60, 0xF5,
- 0x2F, 0x58, 0x40, 0xE7, 0x84, 0x91, 0xD6, 0xD8, 0x15, 0x75, 0xB6, 0xFB, 0x37, 0x63, 0x62, 0xBC,
- 0x89, 0xF2, 0xA0, 0xF6, 0x76, 0x21, 0x0F, 0x08, 0xF7, 0xF0, 0x9F, 0xC7, 0xF1, 0x7F, 0xC5, 0x03,
- 0x5C, 0x76, 0xB2, 0xCC, 0xD8, 0xB3, 0x84, 0x2C, 0xC0, 0xB9, 0x80, 0x3E, 0xF1, 0x1A, 0xAA, 0x6F,
- 0x0F, 0x7D, 0xED, 0x74, 0x43, 0x3C, 0x81, 0x8D, 0x03, 0xBB, 0xC5, 0x3A, 0xDF, 0xA7, 0xB3, 0x01,
- 0x45, 0xA2, 0x26, 0x82, 0x39, 0x0D, 0xCE, 0xB0, 0x33, 0x03, 0x49, 0x01, 0xC6, 0x01, 0xC4, 0x0F,
- 0x8C, 0x0D, 0x38, 0x4B, 0x98, 0xD9, 0x81, 0xE4, 0x81, 0xED, 0x73, 0xE2, 0x6C, 0xC0, 0x9B, 0x03,
- 0xE1, 0xD2, 0xDA, 0x06, 0x23, 0x1E, 0x55, 0x10, 0xFD, 0xBA, 0xA2, 0xC8, 0x05, 0xBB, 0xAB, 0x49,
- 0x18, 0xB8, 0xAA, 0x5D, 0xD3, 0x81, 0x89, 0x83, 0x9D, 0x2E, 0x14, 0x03, 0xC8, 0x0B, 0xE8, 0x9A,
- 0x89, 0x5C, 0x60, 0x91, 0x08, 0xAC, 0xF6, 0xE9, 0x1F, 0xAB, 0xBD, 0x03, 0xEF, 0xF1, 0x5F, 0x13,
- 0x07, 0x56, 0x36, 0xD8, 0xC0, 0x52, 0xC1, 0xBF, 0x28, 0x71, 0x04, 0xFE, 0xBB, 0x90, 0x17, 0x28,
- 0x04, 0xE5, 0xC1, 0xCB, 0x37, 0xA1, 0x4C, 0x50, 0xE0, 0x26, 0x45, 0x45, 0xC1, 0x60, 0xFB, 0xD6,
- 0x39, 0x07, 0x0B, 0x09, 0x20, 0x18, 0xC1, 0x49, 0xA0, 0x31, 0x16, 0x40, 0x0E, 0x20, 0x26, 0xC0,
- 0x3B, 0x8D, 0x0D, 0x88, 0x2B, 0x0C, 0x81, 0x60, 0xE9, 0xF5, 0xD7, 0xC6, 0xDE, 0x3B, 0xF9, 0x20,
- 0x9C, 0xFB, 0x89, 0x0F, 0x91, 0x3F, 0x72, 0x02, 0xD0, 0x9F, 0x95, 0x0D, 0x88, 0x71, 0xF0, 0x1F,
- 0xAB, 0xD1, 0x83, 0x95, 0x4E, 0x22, 0xA0, 0x06, 0xBB, 0x04, 0x35, 0x9E, 0x4A, 0xBC, 0xA7, 0x3A,
- 0xAE, 0xC4, 0x56, 0x82, 0x33, 0x44, 0x4D, 0x25, 0x0A, 0x89, 0x1A, 0xE4, 0x05, 0x62, 0x10, 0xA0,
- 0xA6, 0x81, 0x78, 0x85, 0x9E, 0xE4, 0x7F, 0x18, 0x85, 0xB1, 0xC1, 0x25, 0x3B, 0xB6, 0x70, 0xD2,
- 0x58, 0xDB, 0x54, 0xF1, 0x54, 0xEB, 0x9F, 0xDE, 0xB1, 0xE9, 0xD3, 0x6F, 0x6C, 0x22, 0xBF, 0x7E,
- 0xE8, 0x47, 0x6C, 0xC1, 0x24, 0x05, 0x83, 0xC2, 0xA5, 0xA8, 0x71, 0x4B, 0x7F, 0xBC, 0x0C, 0xE9,
- 0x9F, 0x7E, 0xB4, 0x78, 0xD6, 0xCC, 0xE3, 0xBB, 0xB8, 0x66, 0xD2, 0xB7, 0x4A, 0x12, 0x80, 0xFE,
- 0xB0, 0xF6, 0x77, 0xEF, 0xC6, 0xD6, 0x60, 0x77, 0x14, 0x76, 0x4E, 0xDF, 0x39, 0x73, 0xF7, 0x4C,
- 0x64, 0x0A, 0xC6, 0x01, 0x16, 0x79, 0x40, 0xF5, 0x8E, 0x15, 0x4E, 0xD5, 0x4E, 0x6C, 0x00, 0xC5,
- 0xE8, 0x20, 0x16, 0x20, 0x3F, 0x73, 0xBC, 0x0D, 0xF3, 0xB1, 0xD0, 0xE6, 0xCF, 0x47, 0xC0, 0x86,
- 0x8D, 0xD8, 0x28, 0x6C, 0x80, 0x9B, 0xE6, 0x53, 0x93, 0x80, 0x7F, 0x37, 0x63, 0xE5, 0x2B, 0x1B,
- 0x01, 0x5E, 0xC6, 0x0C, 0xDD, 0x44, 0x7C, 0x6C, 0xCE, 0x18, 0xBB, 0xC1, 0xAC, 0x63, 0xB6, 0x19,
- 0x43, 0xEB, 0xE2, 0xC1, 0x96, 0x7D, 0xC0, 0xDA, 0xE7, 0x55, 0x8F, 0xF5, 0xAE, 0x37, 0x0F, 0x80,
- 0x0C, 0x91, 0xB8, 0x59, 0xF0, 0xFB, 0x05, 0x12, 0x45, 0x32, 0xF8, 0x00, 0xE5, 0xC5, 0xE3, 0x8F,
- 0x23, 0xC8, 0xDD, 0x97, 0x38, 0x60, 0xCA, 0xD9, 0x8F, 0x3D, 0x30, 0x3B, 0x10, 0x40, 0xBC, 0x36,
- 0xF1, 0x20, 0x5E, 0x8F, 0x50, 0xD0, 0x27, 0xD0, 0xD5, 0xF2, 0x21, 0x74, 0x1C, 0x0C, 0xB4, 0x04,
- 0x02, 0x2F, 0xE0, 0x04, 0x04, 0xBA, 0x02, 0x3B, 0x1A, 0xC2, 0x58, 0xC5, 0x67, 0xDF, 0xFE, 0x87,
- 0x1A, 0xCF, 0xE5, 0x81, 0x1D, 0x81, 0x2D, 0xC4, 0x17, 0xA1, 0x83, 0x3B, 0x02, 0x3B, 0xFE, 0x08,
- 0x93, 0x2E, 0x09, 0xEC, 0xD8, 0xF1, 0x02, 0xD4, 0x5C, 0x82, 0x77, 0xFF, 0xC1, 0xD8, 0x83, 0x18,
- 0x00, 0xFF, 0xC8, 0x7F, 0xC7, 0xDB, 0xFF, 0xBC, 0xE3, 0x55, 0xB7, 0x96, 0x83, 0xB3, 0x57, 0xEF,
- 0x78, 0x03, 0xFD, 0xB6, 0x5C, 0xBA, 0xE3, 0xBF, 0xB9, 0x07, 0xD6, 0x3F, 0x07, 0xE3, 0x10, 0x2D,
- 0x1A, 0xAB, 0x6D, 0xF6, 0x11, 0x89, 0x5B, 0x56, 0xB0, 0xC4, 0x08, 0x4C, 0x4E, 0xE8, 0x72, 0x80,
- 0x97, 0xAB, 0xF5, 0x4D, 0xA3, 0xBB, 0xA7, 0xBB, 0x88, 0x0D, 0xF0, 0xFD, 0xA6, 0xCF, 0x8A, 0xC2,
- 0x74, 0x0E, 0xEC, 0x25, 0x20, 0x13, 0x44, 0x51, 0x12, 0xEC, 0x9C, 0x89, 0x2C, 0x01, 0x3B, 0x45,
- 0x4F, 0x41, 0x80, 0x33, 0x01, 0x3A, 0xC4, 0x15, 0x85, 0x03, 0xFD, 0x91, 0x54, 0xB0, 0xC4, 0xDB,
- 0x80, 0x54, 0x91, 0x03, 0x36, 0x6C, 0x9C, 0x3F, 0x1F, 0x25, 0x42, 0x94, 0x38, 0x61, 0x23, 0x7A,
- 0x61, 0xDF, 0x40, 0xBD, 0x49, 0x05, 0x6C, 0x12, 0x54, 0xFC, 0x7B, 0x99, 0xB1, 0xA7, 0x39, 0x6B,
- 0x94, 0x4F, 0xAA, 0x72, 0xDE, 0xAF, 0xE1, 0x37, 0x7A, 0x88, 0x19, 0x58, 0xDD, 0x54, 0xEF, 0x4C,
- 0x06, 0xD0, 0xBD, 0xD6, 0x2C, 0xB0, 0x9B, 0x94, 0xC0, 0x79, 0xC2, 0xCC, 0x19, 0x06, 0x1F, 0x7C,
- 0x09, 0xFE, 0x53, 0x77, 0x63, 0x93, 0x50, 0xF1, 0xE1, 0x3B, 0x5E, 0xE8, 0x0F, 0xEF, 0x22, 0x1F,
- 0x1D, 0x81, 0x3A, 0x38, 0xE9, 0xF7, 0x37, 0x0C, 0xF9, 0x31, 0x85, 0xB5, 0xFB, 0xA7, 0x37, 0x0C,
- 0x43, 0x57, 0x60, 0x8C, 0xDF, 0x7F, 0x1B, 0xD4, 0x84, 0x5D, 0xED, 0xFE, 0x69, 0x0D, 0x83, 0x7F,
- 0xFC, 0xC9, 0x83, 0xDB, 0xBC, 0x01, 0xF0, 0x2C, 0x5C, 0xD3, 0xD6, 0xF7, 0xE1, 0x3E, 0x7F, 0xAC,
- 0x44, 0xBE, 0x68, 0xF7, 0xCF, 0x6C, 0x18, 0xF6, 0x8C, 0x67, 0x4D, 0xDB, 0xDC, 0x86, 0xEB, 0xBF,
- 0x37, 0x93, 0x7E, 0x66, 0x7C, 0x8F, 0x49, 0x02, 0x2E, 0x0E, 0x00, 0xDA, 0x2E, 0xBC, 0xF0, 0xA2,
- 0xFF, 0xB9, 0xF0, 0x6A, 0x23, 0x33, 0xAF, 0x5E, 0x78, 0xE1, 0x3F, 0x1C, 0x87, 0xD6, 0x57, 0x2F,
- 0xFC, 0x3C, 0xBF, 0x47, 0xC9, 0x40, 0xC2, 0x80, 0x84, 0x84, 0x49, 0x1E, 0xF0, 0x56, 0xC1, 0xF2,
- 0x3D, 0x09, 0x11, 0x8A, 0xC2, 0x80, 0x9C, 0x5A, 0xEB, 0xC0, 0x83, 0xF4, 0x77, 0x9A, 0xE9, 0x22,
- 0x69, 0xB0, 0x13, 0x2B, 0x1A, 0x5B, 0x06, 0xE4, 0x08, 0xEC, 0x21, 0xEC, 0x16, 0x98, 0x4E, 0xBD,
- 0x02, 0x94, 0x0C, 0xC8, 0x0A, 0xAC, 0x61, 0xB0, 0xF6, 0x0F, 0xF0, 0xAB, 0x67, 0x6D, 0x83, 0xD6,
- 0x4D, 0x34, 0x09, 0x04, 0x13, 0xA8, 0x2F, 0x80, 0xFF, 0x51, 0x98, 0x1F, 0xDD, 0x80, 0x2D, 0x02,
- 0x96, 0xEC, 0x4D, 0xD8, 0x52, 0xB8, 0xB0, 0x51, 0xA0, 0x7C, 0x6C, 0x44, 0x39, 0x80, 0x22, 0x41,
- 0x55, 0x90, 0x23, 0x18, 0x13, 0xDB, 0xF2, 0x8F, 0x7F, 0xBC, 0xFB, 0x4B, 0x8C, 0x2C, 0x1A, 0x04,
- 0x6B, 0xA3, 0x00, 0x42, 0x1E, 0xB0, 0x8F, 0x9F, 0xB1, 0x84, 0xE0, 0x8B, 0x2E, 0xC4, 0x01, 0x00,
- 0xFB, 0x94, 0x03, 0xE6, 0x89, 0xE3, 0x00, 0x20, 0x0B, 0xF8, 0xF1, 0x47, 0xF7, 0x61, 0x7C, 0x20,
- 0xF8, 0xEE, 0x5F, 0xEE, 0xB9, 0x87, 0x01, 0xE0, 0x0C, 0xA8, 0x75, 0xE3, 0x2E, 0x05, 0xCE, 0x69,
- 0x17, 0x8C, 0x6A, 0x7B, 0x70, 0xFF, 0x85, 0x00, 0xCF, 0x42, 0x09, 0xDE, 0xED, 0x9F, 0x02, 0xFB,
- 0x9F, 0x25, 0xE1, 0x81, 0x94, 0xB0, 0x7D, 0xF0, 0xC0, 0xFB, 0x53, 0xE0, 0x20, 0x7A, 0xBC, 0x5F,
- 0xF1, 0x3D, 0x24, 0x46, 0x1D, 0x87, 0x59, 0x9D, 0xB0, 0x1D, 0xE5, 0x81, 0x77, 0x4A, 0xE5, 0xA1,
- 0x67, 0xA1, 0xCF, 0x3F, 0x79, 0x83, 0xBB, 0x9E, 0x86, 0x79, 0xF8, 0xD3, 0xF6, 0x34, 0x5C, 0x09,
- 0xFB, 0x84, 0x34, 0xA8, 0x01, 0x2E, 0x06, 0x44, 0xA3, 0xF0, 0x69, 0x92, 0x0D, 0x7D, 0xF1, 0x9B,
- 0xBF, 0x7E, 0x78, 0xDB, 0xB5, 0xD8, 0x28, 0xF0, 0x0C, 0xF9, 0x5E, 0x7D, 0xE3, 0x8D, 0x37, 0x9E,
- 0xE7, 0xDD, 0x45, 0x53, 0x17, 0x41, 0x48, 0x50, 0xFD, 0x16, 0x84, 0x38, 0xA0, 0xBA, 0x37, 0xF5,
- 0x0B, 0x58, 0x71, 0x9B, 0xE2, 0x61, 0xF5, 0xEF, 0x44, 0x06, 0xA0, 0x5E, 0x02, 0x8A, 0x82, 0x59,
- 0x51, 0x4D, 0x1E, 0xCC, 0x44, 0x9E, 0xA0, 0xDE, 0xC1, 0xCC, 0x99, 0x3B, 0x5D, 0x28, 0x09, 0x50,
- 0x22, 0xA0, 0x48, 0x30, 0x1E, 0xC3, 0xDA, 0xC6, 0xAE, 0xA1, 0x68, 0x13, 0x18, 0x23, 0xE8, 0xE2,
- 0xC0, 0xD2, 0x2E, 0x60, 0x87, 0x00, 0xEB, 0x1D, 0x5B, 0x05, 0x6C, 0x1F, 0x36, 0x44, 0xE7, 0x6F,
- 0xB8, 0x89, 0x04, 0xC3, 0x4D, 0xD8, 0x2D, 0xC0, 0x76, 0x41, 0x85, 0x9B, 0xB1, 0x49, 0x78, 0x19,
- 0x45, 0x03, 0x7D, 0xF6, 0x8C, 0x89, 0x2D, 0xF2, 0x80, 0xBC, 0x88, 0x8D, 0x89, 0x75, 0x91, 0x0B,
- 0x38, 0x1F, 0xC7, 0x34, 0x0A, 0xC0, 0xFA, 0x04, 0xCD, 0xF4, 0xCF, 0xFE, 0xD0, 0x8F, 0x5D, 0xD2,
- 0x10, 0x08, 0xC8, 0x08, 0x16, 0x36, 0xE0, 0x7C, 0xA0, 0x40, 0x24, 0x62, 0x8E, 0x15, 0x59, 0x21,
- 0xF2, 0xC0, 0x38, 0xED, 0xBF, 0xE1, 0x8D, 0x26, 0xFC, 0x99, 0xB2, 0x04, 0xDA, 0x79, 0x30, 0xBA,
- 0x8E, 0xE1, 0xCF, 0x87, 0x81, 0xE3, 0x40, 0x2D, 0x7C, 0xA5, 0xA7, 0x12, 0x3D, 0x70, 0x14, 0x41,
- 0xD2, 0xF6, 0xCD, 0x86, 0x3E, 0x7F, 0x5D, 0xF1, 0xD1, 0x97, 0x48, 0x1E, 0x40, 0xCD, 0x24, 0x16,
- 0x31, 0x52, 0xC1, 0x1F, 0xC3, 0xAE, 0xAB, 0x9B, 0x3A, 0x0F, 0xF8, 0x04, 0xFD, 0x45, 0xA0, 0xCF,
- 0x0E, 0xAD, 0x51, 0xF0, 0xAD, 0x6E, 0xBA, 0xF0, 0x6E, 0xD7, 0x8B, 0x67, 0xFB, 0x7D, 0xFA, 0x87,
- 0xF0, 0x7B, 0x23, 0x1F, 0x45, 0x97, 0x5E, 0xF9, 0x0F, 0x0D, 0x43, 0x17, 0xF2, 0xF6, 0x41, 0xF8,
- 0x09, 0x09, 0x6A, 0xED, 0xB4, 0x70, 0x69, 0xCA, 0xDB, 0x02, 0xAD, 0xCF, 0x1D, 0xD3, 0x3F, 0xE0,
- 0x5D, 0x1E, 0xFC, 0xE2, 0x67, 0xE2, 0x37, 0x8F, 0x5D, 0xC4, 0xEA, 0x59, 0x5C, 0x1A, 0x44, 0x61,
- 0xF7, 0x4C, 0x1C, 0x49, 0x52, 0x47, 0x01, 0x90, 0x1F, 0x30, 0x92, 0xA5, 0x9B, 0x68, 0xEE, 0x1E,
- 0xF0, 0xB1, 0x82, 0x21, 0x0E, 0x2C, 0x12, 0x61, 0x03, 0x0A, 0x01, 0x6C, 0x0B, 0x36, 0x20, 0x0B,
- 0x20, 0x27, 0xB8, 0x90, 0x25, 0x6E, 0xDA, 0x80, 0xC2, 0x80, 0x46, 0x8E, 0x1B, 0xB1, 0x49, 0xA0,
- 0x9E, 0x01, 0x0A, 0x04, 0x78, 0x59, 0xF4, 0x03, 0xB4, 0xC7, 0x8C, 0xEE, 0x01, 0xEB, 0x19, 0x30,
- 0x2E, 0xD0, 0xDF, 0xCA, 0x0C, 0x26, 0x11, 0x48, 0x0A, 0x70, 0x49, 0x80, 0x77, 0x4C, 0x38, 0xF0,
- 0xBF, 0x54, 0x81, 0x3C, 0x60, 0x59, 0x59, 0x12, 0xED, 0x82, 0xDB, 0x8D, 0x8C, 0xF0, 0xE8, 0xE3,
- 0x8F, 0x3E, 0x7E, 0x1A, 0x7F, 0x00, 0x96, 0x03, 0xCF, 0xC4, 0x19, 0xBC, 0x5E, 0x50, 0xDE, 0xF6,
- 0x2D, 0x74, 0x4E, 0xD9, 0xEE, 0x6D, 0x7B, 0x98, 0xC5, 0x9D, 0x49, 0xAE, 0xFD, 0xE3, 0xB0, 0x79,
- 0xE8, 0xF3, 0x02, 0xEB, 0x2B, 0x56, 0xBE, 0xE9, 0x6D, 0xFB, 0x6F, 0x31, 0x84, 0xF0, 0x97, 0x45,
- 0x1B, 0x60, 0xD8, 0x6F, 0x6B, 0x2A, 0xB1, 0x6F, 0x38, 0x87, 0xFC, 0xD1, 0x73, 0x1F, 0x60, 0xA5,
- 0x03, 0xC9, 0x0A, 0xFC, 0xA9, 0xBC, 0x04, 0xBF, 0xFC, 0xEF, 0xA1, 0x9F, 0x9B, 0xDA, 0x05, 0xD1,
- 0x28, 0xCC, 0xF5, 0x0E, 0xDE, 0xB1, 0x16, 0x57, 0x3A, 0x5A, 0x96, 0xC0, 0x89, 0x27, 0x4D, 0xB9,
- 0xBB, 0xFA, 0x8D, 0xBF, 0x95, 0xD3, 0x2F, 0xB5, 0x0F, 0xC2, 0x8B, 0x49, 0x50, 0x73, 0xFF, 0x00,
- 0xCC, 0xD5, 0x4D, 0x3C, 0x10, 0xA7, 0x7F, 0x20, 0x7A, 0xBD, 0xBB, 0xA3, 0x51, 0xF6, 0xE7, 0x9A,
- 0xEE, 0xAA, 0xE6, 0xDD, 0x03, 0xEC, 0x31, 0xEE, 0xC4, 0x2E, 0x22, 0xF2, 0x02, 0x76, 0x11, 0x90,
- 0x05, 0x76, 0xEA, 0x33, 0x09, 0x02, 0xAC, 0xF6, 0xD9, 0xA8, 0x11, 0xDB, 0x84, 0x0E, 0xF6, 0xEB,
- 0x20, 0x0F, 0x18, 0x75, 0xD6, 0x45, 0x98, 0xBF, 0x61, 0x03, 0x8D, 0x0E, 0xB0, 0x7B, 0x80, 0xC3,
- 0x05, 0x1A, 0x36, 0xDE, 0x74, 0xB3, 0x8A, 0xBD, 0xC4, 0x97, 0x91, 0x05, 0xB0, 0x83, 0x70, 0x33,
- 0x6F, 0xB2, 0xEC, 0xFD, 0x1B, 0xAD, 0x7F, 0xC0, 0x5A, 0x05, 0xF1, 0x32, 0xD6, 0x17, 0x60, 0x4D,
- 0x00, 0x93, 0x06, 0xBC, 0x97, 0xC0, 0xFB, 0x09, 0x69, 0x89, 0x03, 0xE0, 0xED, 0x82, 0xE9, 0x5E,
- 0xB4, 0x0B, 0x91, 0xC8, 0x9D, 0x10, 0x74, 0x47, 0xDC, 0xDF, 0x19, 0x08, 0x8F, 0xE2, 0x0F, 0xCE,
- 0x1F, 0xB0, 0xCC, 0xF4, 0xC7, 0xEB, 0x0B, 0xF0, 0x3C, 0x8A, 0x83, 0x0B, 0xDE, 0xF1, 0x06, 0x26,
- 0x93, 0x58, 0x80, 0xAF, 0x63, 0x3F, 0x00, 0x5D, 0x1E, 0xD8, 0xFF, 0x34, 0x5C, 0x4C, 0xD3, 0x06,
- 0xE4, 0x71, 0x5D, 0x35, 0x9F, 0x1A, 0xD8, 0xF7, 0x39, 0xEF, 0x8B, 0x93, 0xBE, 0x47, 0xF2, 0xBF,
- 0xA6, 0xF2, 0x92, 0xB7, 0xBC, 0x30, 0x19, 0x0B, 0xD9, 0x2D, 0x06, 0x87, 0xEC, 0xA7, 0x06, 0xB6,
- 0x61, 0xAF, 0xE0, 0x09, 0xBC, 0xB1, 0x48, 0x20, 0x68, 0xBA, 0xF0, 0xC2, 0x0B, 0xE7, 0xB2, 0x56,
- 0xC1, 0xD4, 0x02, 0x5C, 0xBA, 0xA2, 0xE9, 0xCA, 0x47, 0xC0, 0xDA, 0x3B, 0x60, 0xC2, 0xC0, 0xD2,
- 0x3F, 0x30, 0x49, 0x03, 0xD6, 0x26, 0xC4, 0xE9, 0x1F, 0x70, 0x79, 0xC0, 0xB9, 0x81, 0x86, 0xF8,
- 0xBB, 0xC1, 0xC5, 0xC4, 0xC1, 0xCC, 0xE9, 0xC8, 0x02, 0x80, 0xFC, 0x80, 0x72, 0x00, 0x05, 0x45,
- 0x94, 0x7A, 0x07, 0x26, 0x79, 0xC0, 0x47, 0x05, 0xAC, 0xD6, 0x79, 0xFB, 0x80, 0x3F, 0xC8, 0x0E,
- 0xB1, 0xF2, 0x00, 0xFB, 0x06, 0x38, 0x52, 0xC0, 0x3F, 0x9E, 0xCE, 0x86, 0x8D, 0x37, 0xE1, 0x3C,
- 0x12, 0x75, 0x0E, 0x36, 0x62, 0x3F, 0x11, 0x54, 0x1C, 0x32, 0x28, 0x38, 0x68, 0x20, 0x37, 0xCB,
- 0x55, 0xFC, 0xFE, 0x01, 0xBB, 0x32, 0x19, 0x61, 0x79, 0x01, 0xF6, 0xDD, 0x73, 0x69, 0xC0, 0xC7,
- 0x0B, 0xFA, 0x58, 0x41, 0x88, 0x03, 0x6B, 0x81, 0x26, 0x06, 0x36, 0x0A, 0xAC, 0x8F, 0xA0, 0x43,
- 0xB4, 0x0B, 0x00, 0x65, 0xB0, 0x0E, 0xD9, 0xC0, 0x87, 0xD2, 0x20, 0x02, 0x91, 0x95, 0xC0, 0x26,
- 0xDC, 0x88, 0xD3, 0xA8, 0x77, 0x00, 0x30, 0xE5, 0xAF, 0xD0, 0x56, 0xF1, 0x11, 0xFC, 0x20, 0x70,
- 0x64, 0xE6, 0x1A, 0xE6, 0xFA, 0x7A, 0x3D, 0x4C, 0xFC, 0x1A, 0xBC, 0x7C, 0x4F, 0xE0, 0x8F, 0xE4,
- 0x71, 0xF5, 0x0E, 0x6A, 0x07, 0x88, 0xD8, 0x69, 0xB8, 0x16, 0x7B, 0x97, 0xC1, 0x7B, 0x5A, 0x1A,
- 0x3C, 0xE8, 0x5F, 0x7E, 0xB6, 0xE2, 0x4F, 0x21, 0x5F, 0xC9, 0xD7, 0xE0, 0x8D, 0x2D, 0xFC, 0x87,
- 0xCF, 0x36, 0xE9, 0xFD, 0x03, 0x94, 0x14, 0x0C, 0xAD, 0x30, 0xF8, 0xBB, 0xF8, 0xC3, 0x5B, 0x05,
- 0xA3, 0xCE, 0x8B, 0x41, 0x69, 0xB9, 0x83, 0xB9, 0x4C, 0xA3, 0x05, 0xDE, 0x15, 0x34, 0xBD, 0x02,
- 0xAB, 0x70, 0x5E, 0xF3, 0x8C, 0x11, 0xE2, 0xF5, 0x0F, 0x88, 0x03, 0x58, 0x5F, 0x11, 0xE7, 0x0A,
- 0x00, 0xFF, 0xA2, 0x5C, 0x1C, 0x60, 0x8F, 0x60, 0xE7, 0x6E, 0x94, 0x08, 0xD4, 0x35, 0x60, 0xEF,
- 0x80, 0xC2, 0x40, 0x9F, 0x72, 0x02, 0xD6, 0x49, 0xE4, 0x2D, 0x01, 0xBA, 0xB9, 0x38, 0xA0, 0xE6,
- 0xC1, 0xA1, 0x7F, 0x80, 0x7F, 0x1B, 0x61, 0x03, 0x8E, 0x16, 0xF1, 0x6F, 0xA3, 0x0B, 0x87, 0x8C,
- 0x24, 0x15, 0x50, 0x1C, 0xDC, 0x4C, 0x22, 0x61, 0xA3, 0x7A, 0xF3, 0xCB, 0xAA, 0x8A, 0x6C, 0x81,
- 0x12, 0x81, 0xE5, 0xCA, 0xD2, 0x3F, 0x60, 0x7D, 0x06, 0x21, 0x0F, 0xC4, 0x55, 0xB0, 0x8B, 0x01,
- 0xFE, 0xE1, 0x6B, 0xFD, 0x03, 0x60, 0xAD, 0x03, 0xBA, 0x0D, 0x79, 0xA0, 0x8F, 0xBB, 0xBA, 0x1E,
- 0x25, 0xB2, 0xBE, 0x81, 0x85, 0x11, 0x4C, 0xF3, 0x07, 0x21, 0x58, 0x4C, 0x6C, 0x30, 0xE2, 0xDF,
- 0x80, 0xDA, 0x85, 0xF3, 0x0F, 0x6E, 0x85, 0x3E, 0xAD, 0x4F, 0x4D, 0x7C, 0x99, 0xF7, 0x0E, 0x00,
- 0xFA, 0x34, 0x04, 0x4E, 0x79, 0x20, 0xDA, 0xC9, 0x5D, 0x7F, 0x1F, 0x16, 0xD8, 0x5D, 0xBE, 0x69,
- 0x31, 0x2F, 0xB0, 0x3E, 0x7F, 0x6D, 0x69, 0xBB, 0xE8, 0xE0, 0x13, 0xE0, 0xFF, 0xEB, 0x6F, 0xD7,
- 0x3D, 0xD2, 0xA7, 0x65, 0x45, 0xDB, 0x58, 0x60, 0xDC, 0xD9, 0xA7, 0xE1, 0xF4, 0x96, 0xA2, 0x25,
- 0x7D, 0xFE, 0x5A, 0xBE, 0xE9, 0xEB, 0x41, 0xFE, 0x83, 0x9E, 0x46, 0xFF, 0x00, 0xB8, 0x88, 0x40,
- 0xFC, 0xDF, 0x65, 0xA1, 0x2F, 0x62, 0x67, 0x61, 0x30, 0x00, 0xFE, 0xBC, 0xAD, 0x57, 0xFA, 0xA6,
- 0xD0, 0xA0, 0xBF, 0x0D, 0x61, 0x79, 0x14, 0xBC, 0xD1, 0xCA, 0xFE, 0xF4, 0x9E, 0x80, 0x00, 0x97,
- 0xAC, 0xBC, 0x6F, 0x45, 0xA1, 0xE4, 0xC5, 0xE2, 0xD8, 0xFB, 0x07, 0x58, 0xC7, 0xD8, 0x24, 0x4C,
- 0x8F, 0x42, 0xF5, 0x2C, 0x1C, 0x3B, 0x72, 0x71, 0x80, 0xED, 0x02, 0x75, 0x11, 0xB9, 0x50, 0xC0,
- 0x76, 0x81, 0x35, 0x09, 0xD6, 0x59, 0x15, 0x56, 0xE9, 0xD4, 0x28, 0x68, 0x4C, 0xC1, 0xDA, 0x89,
- 0x18, 0x79, 0x40, 0x83, 0x05, 0x14, 0x08, 0xE4, 0xDC, 0x70, 0x13, 0x76, 0x0D, 0x70, 0xB8, 0xC0,
- 0x66, 0x0F, 0x54, 0x1C, 0x2C, 0x50, 0xF5, 0xE3, 0xFC, 0x11, 0xCE, 0x1D, 0x28, 0x2F, 0x3B, 0x88,
- 0x2A, 0x62, 0x59, 0x31, 0xF1, 0xC1, 0xA5, 0x82, 0x43, 0xBB, 0xC6, 0x3E, 0x7C, 0x2E, 0x11, 0xD0,
- 0x25, 0xA6, 0x0F, 0xD0, 0xC1, 0x42, 0x12, 0x22, 0x76, 0xFA, 0x80, 0x0F, 0x1E, 0xCC, 0x43, 0x08,
- 0x31, 0xAF, 0xBC, 0x1C, 0x4A, 0xB1, 0x84, 0x91, 0x03, 0x10, 0xBF, 0x3C, 0x09, 0x0F, 0x47, 0x2C,
- 0x63, 0x16, 0x07, 0x50, 0xB7, 0x50, 0xFC, 0xE0, 0x4A, 0x03, 0x2E, 0x34, 0xE0, 0x0D, 0xCE, 0x37,
- 0xD3, 0x94, 0xF3, 0xA4, 0x1A, 0x9A, 0x52, 0xC4, 0x25, 0x27, 0x06, 0x10, 0xCB, 0x4C, 0xC2, 0xC5,
- 0x26, 0x14, 0x93, 0x59, 0x78, 0xE2, 0xD3, 0x88, 0x7C, 0xBD, 0x89, 0x0D, 0x18, 0xCE, 0xF6, 0x6B,
- 0x2D, 0x45, 0x7F, 0x56, 0x58, 0xFC, 0xB3, 0x11, 0x10, 0x82, 0x80, 0xF9, 0xF2, 0x26, 0x41, 0x08,
- 0x04, 0xE0, 0x17, 0x13, 0xC4, 0xAC, 0x2F, 0x2D, 0x36, 0x4D, 0xA7, 0xC5, 0x85, 0xE9, 0x08, 0xF2,
- 0xA7, 0x59, 0x65, 0x92, 0x0B, 0x7C, 0x4A, 0xD9, 0xB6, 0xBE, 0x60, 0x59, 0x57, 0xA0, 0x61, 0x03,
- 0x5B, 0x58, 0x60, 0xF3, 0x89, 0xF6, 0x15, 0x06, 0x1A, 0x28, 0xE2, 0x84, 0x32, 0x8E, 0x16, 0xD0,
- 0x0D, 0xB4, 0xB2, 0xC0, 0x3B, 0x08, 0x38, 0x9F, 0x8C, 0xFF, 0xC8, 0x0C, 0x2F, 0xF3, 0xC9, 0x44,
- 0x73, 0xD6, 0x74, 0x39, 0xC6, 0x1D, 0xA2, 0x71, 0x8B, 0xC9, 0x3A, 0x03, 0x1F, 0x26, 0x6A, 0x33,
- 0x48, 0xDA, 0x1A, 0x83, 0x98, 0x47, 0x88, 0x90, 0x40, 0x18, 0x69, 0x9D, 0x2D, 0xBC, 0xBD, 0xCE,
- 0x76, 0x8F, 0xF3, 0xCA, 0x31, 0x3E, 0x96, 0x79, 0x65, 0xFC, 0xCE, 0xE0, 0xA3, 0x67, 0x06, 0xCF,
- 0x0F, 0x3F, 0x83, 0x8E, 0xA8, 0xC8, 0x91, 0x3D, 0x1F, 0x1A, 0x3C, 0x61, 0xBE, 0xC6, 0x48, 0x6E,
- 0x3E, 0x9F, 0x58, 0x51, 0xA7, 0x4D, 0x18, 0x93, 0x0F, 0x4D, 0x29, 0xB2, 0x39, 0xC5, 0x30, 0x5F,
- 0x63, 0x60, 0x53, 0xD1, 0x6C, 0xB5, 0x89, 0x4D, 0x1F, 0xD0, 0xD2, 0x94, 0xF3, 0x2A, 0xA4, 0xBE,
- 0xCA, 0x78, 0x96, 0x2F, 0x37, 0x89, 0x01, 0x23, 0xFD, 0xBB, 0x90, 0x55, 0xF1, 0x87, 0xB5, 0x9C,
- 0x96, 0x9C, 0xB1, 0xEF, 0x86, 0x97, 0xA3, 0x28, 0x41, 0xED, 0x62, 0x13, 0xAD, 0x38, 0x95, 0x0C,
- 0x54, 0xFF, 0x38, 0x3D, 0x32, 0x7D, 0x37, 0x9B, 0x52, 0x64, 0x73, 0x07, 0x9C, 0x07, 0xB0, 0x5F,
- 0x80, 0x17, 0x6C, 0x2D, 0xB0, 0x8F, 0x60, 0x5E, 0x60, 0xA0, 0x61, 0x22, 0x9B, 0x50, 0x16, 0x93,
- 0xCA, 0x82, 0x05, 0xF8, 0xA4, 0xB2, 0x45, 0x1E, 0xE0, 0x9C, 0x11, 0x76, 0x11, 0xA3, 0xF8, 0x3F,
- 0x1F, 0xE7, 0x93, 0xB1, 0x89, 0x98, 0xCF, 0xDA, 0x05, 0xFC, 0xDB, 0x78, 0xD3, 0xCD, 0x2F, 0xDF,
- 0x4C, 0xF2, 0x00, 0xAF, 0x28, 0xFF, 0x69, 0x91, 0xC1, 0xC8, 0x1A, 0xCF, 0x3E, 0xEF, 0x13, 0xF0,
- 0x36, 0x4F, 0x0B, 0xB2, 0x96, 0xBF, 0xD6, 0x39, 0x64, 0x03, 0x46, 0x5E, 0xF3, 0x24, 0x1A, 0x8C,
- 0x11, 0x03, 0x6F, 0x17, 0xB4, 0x89, 0x62, 0x0D, 0xF6, 0x7B, 0x27, 0x1F, 0x04, 0x93, 0x07, 0x03,
- 0x14, 0x6C, 0x08, 0xCC, 0x78, 0x42, 0x6F, 0xA3, 0x79, 0xB7, 0xC5, 0xF6, 0x90, 0x10, 0x06, 0x08,
- 0xAC, 0x6B, 0xBC, 0xA1, 0x1A, 0xF7, 0x20, 0x33, 0x18, 0x5E, 0xA6, 0x55, 0x04, 0x8B, 0x4B, 0x5F,
- 0x5A, 0x30, 0x2F, 0x39, 0x59, 0xC0, 0x97, 0x9A, 0xC4, 0xE2, 0x82, 0x58, 0x5F, 0x00, 0x3E, 0xA5,
- 0x68, 0x80, 0x8B, 0x56, 0xE3, 0x46, 0xEB, 0x1F, 0x88, 0xD2, 0xE4, 0x2C, 0x1C, 0xF3, 0x59, 0xD1,
- 0xCC, 0x01, 0x9B, 0x2C, 0x67, 0x2B, 0x41, 0x6C, 0x7A, 0x99, 0x2F, 0x2F, 0xF0, 0x45, 0x47, 0x2E,
- 0x11, 0xEC, 0xD2, 0x80, 0x81, 0x4B, 0x01, 0x31, 0x70, 0xA4, 0xBE, 0xA2, 0x18, 0x49, 0xC6, 0xAC,
- 0x38, 0xD2, 0x0C, 0x02, 0x31, 0xC2, 0x46, 0x6C, 0x21, 0x36, 0xD2, 0x9C, 0x12, 0x5F, 0x70, 0x14,
- 0x8B, 0x4D, 0x5A, 0x1E, 0xC5, 0x9F, 0xE9, 0x05, 0xCC, 0xFD, 0x1B, 0xB3, 0x3C, 0x88, 0x61, 0x05,
- 0x9B, 0x30, 0xE0, 0xBD, 0x04, 0x53, 0xC3, 0x70, 0xB9, 0x2D, 0x43, 0x76, 0xBC, 0x19, 0x13, 0x83,
- 0xCB, 0x03, 0xAD, 0x5D, 0x58, 0xB9, 0x7C, 0x65, 0x9F, 0x33, 0x1E, 0xFA, 0x59, 0xBE, 0xD2, 0xDD,
- 0xE7, 0x6C, 0x9C, 0x35, 0x7A, 0x84, 0xE0, 0x01, 0xBE, 0xC6, 0xA4, 0xFD, 0xB2, 0xF5, 0x46, 0xB1,
- 0x84, 0xC4, 0x2F, 0xFC, 0x16, 0xD7, 0x1D, 0xCD, 0x0B, 0x4B, 0xB1, 0x95, 0x6F, 0xF1, 0xD1, 0x56,
- 0x1B, 0x99, 0x3C, 0xB0, 0xAF, 0x2F, 0xB1, 0x46, 0x01, 0xC1, 0xE5, 0xA7, 0x9D, 0x0E, 0x0F, 0x61,
- 0xA1, 0x3A, 0x2F, 0x38, 0xC5, 0xA1, 0x11, 0x21, 0x2E, 0x3B, 0xBB, 0xA2, 0xB3, 0xAA, 0xA9, 0x71,
- 0x40, 0x1F, 0x6A, 0x18, 0x98, 0x3C, 0xC0, 0x89, 0xE5, 0xDD, 0x4C, 0x12, 0x20, 0x23, 0x98, 0x5E,
- 0xDD, 0x3C, 0x93, 0xA8, 0xF1, 0x82, 0x23, 0x0B, 0x00, 0x67, 0x02, 0x6A, 0x18, 0x48, 0x1E, 0xD0,
- 0xBC, 0x12, 0xAD, 0x37, 0x0B, 0x16, 0xD8, 0x88, 0x13, 0x49, 0x24, 0x14, 0xB8, 0x30, 0xB0, 0x43,
- 0x6B, 0xD5, 0x04, 0x33, 0xC4, 0xB2, 0x0A, 0x82, 0xB5, 0x09, 0xF4, 0xC3, 0x26, 0x93, 0xF8, 0xA8,
- 0x51, 0x63, 0x80, 0xEE, 0x2D, 0x3C, 0x9B, 0xF8, 0x20, 0x4E, 0x1B, 0xE0, 0xCC, 0x0D, 0xD4, 0x0B,
- 0xD0, 0xB9, 0x41, 0xFB, 0x11, 0x8B, 0x8D, 0xC2, 0xCF, 0xC4, 0x0B, 0x58, 0xD5, 0x28, 0xFF, 0x89,
- 0x13, 0x3C, 0xA2, 0x7B, 0x60, 0x5D, 0x73, 0xB4, 0x80, 0x6B, 0x1E, 0x90, 0x83, 0xA9, 0x1D, 0x68,
- 0xAB, 0xCF, 0x42, 0x1C, 0x08, 0x5E, 0x88, 0x65, 0x05, 0xAD, 0x79, 0x35, 0xF1, 0x40, 0x6C, 0x23,
- 0x4B, 0x9D, 0x03, 0xBE, 0xEA, 0x88, 0x2C, 0xC0, 0x7A, 0x06, 0xA2, 0x7B, 0x60, 0x92, 0x07, 0x36,
- 0x26, 0xB0, 0x42, 0xF4, 0x10, 0xF8, 0x6A, 0x23, 0x38, 0x30, 0x03, 0xB2, 0x80, 0x60, 0x06, 0x21,
- 0x12, 0xD0, 0x8F, 0x5A, 0x05, 0x02, 0xCB, 0x15, 0x1B, 0x1A, 0x38, 0xC9, 0x03, 0xB3, 0x40, 0x70,
- 0xC8, 0xBA, 0x0E, 0xB1, 0xB4, 0x64, 0xED, 0x1A, 0x08, 0x2E, 0x60, 0xFD, 0x83, 0x74, 0xA0, 0xF3,
- 0x81, 0xEE, 0x23, 0x38, 0x9E, 0x0B, 0x40, 0xAD, 0xF5, 0xA3, 0xDB, 0x68, 0xEC, 0x30, 0xC4, 0xD4,
- 0x53, 0xD4, 0xBD, 0x80, 0x75, 0x19, 0xCC, 0x5E, 0x84, 0x26, 0x1C, 0x07, 0x58, 0x1D, 0x99, 0x84,
- 0x3D, 0xB5, 0x73, 0x13, 0xCE, 0x6F, 0x89, 0x05, 0xCA, 0xCA, 0xB4, 0xBB, 0x05, 0x6B, 0xE7, 0x03,
- 0x89, 0xDE, 0x89, 0xDA, 0xDB, 0xA5, 0x9E, 0xAA, 0x04, 0x41, 0xF2, 0x81, 0x04, 0x41, 0xF2, 0x81,
- 0x04, 0x21, 0x96, 0x0F, 0xAA, 0x86, 0xF2, 0x79, 0x64, 0x67, 0x24, 0x0E, 0x4D, 0x0B, 0x6F, 0xFB,
- 0xFD, 0xAB, 0xBA, 0x4D, 0x24, 0x06, 0x71, 0x32, 0x9A, 0x44, 0xFE, 0xB3, 0xF0, 0x8A, 0xF9, 0x0F,
- 0x83, 0x0F, 0xAA, 0x4A, 0x71, 0x0E, 0xBA, 0xFF, 0xAB, 0x43, 0x71, 0xE5, 0x39, 0x06, 0x2C, 0xAC,
- 0x84, 0xA9, 0xAC, 0x41, 0xF5, 0xD0, 0x26, 0x5B, 0x49, 0xB1, 0xDB, 0x4F, 0x7C, 0x33, 0x41, 0xF1,
- 0x8D, 0x63, 0x13, 0xDC, 0x73, 0x1D, 0xC3, 0x82, 0xF3, 0x57, 0x04, 0xEE, 0x73, 0x0C, 0xA1, 0x54,
- 0x9D, 0x9F, 0x71, 0x8C, 0xDA, 0x0D, 0x6E, 0x62, 0x6F, 0xD0, 0x2B, 0xEB, 0x5F, 0x83, 0x49, 0x1E,
- 0xF8, 0x1B, 0x02, 0x81, 0x33, 0x57, 0x9F, 0x74, 0xDC, 0xD4, 0x42, 0x61, 0xED, 0x5C, 0xA1, 0x79,
- 0xD6, 0x49, 0xFB, 0x20, 0x65, 0x4E, 0xDF, 0x67, 0xA0, 0xAA, 0xE5, 0xA1, 0x18, 0x7F, 0x03, 0x07,
- 0x03, 0x6F, 0x95, 0x36, 0x04, 0x84, 0x3A, 0xAA, 0x0D, 0x35, 0xED, 0x0B, 0x9C, 0x1F, 0x0A, 0xDE,
- 0xB8, 0x3C, 0x70, 0xBA, 0x4F, 0x3C, 0x92, 0x36, 0x60, 0x06, 0xDF, 0x7A, 0xB2, 0x17, 0xD7, 0x63,
- 0x77, 0x61, 0x6F, 0x17, 0xAA, 0x48, 0x1E, 0xE0, 0xD7, 0x25, 0x3E, 0x7E, 0x5B, 0x60, 0xA9, 0xFF,
- 0xB2, 0x70, 0xF5, 0xD0, 0x63, 0xB7, 0xB6, 0x96, 0x5B, 0xBE, 0xD3, 0x7B, 0x5F, 0x85, 0xC8, 0xD4,
- 0x0F, 0x50, 0x4E, 0xD0, 0x73, 0xF8, 0x59, 0x55, 0x0D, 0x3A, 0x01, 0x13, 0x4F, 0xC4, 0x3E, 0x3E,
- 0x74, 0x72, 0xFF, 0x13, 0xCF, 0x90, 0x60, 0x41, 0x17, 0x7D, 0xBE, 0xE8, 0x1E, 0x78, 0xF4, 0x86,
- 0xC0, 0xD8, 0x81, 0xAF, 0xF3, 0x07, 0x31, 0xD8, 0x1C, 0xBF, 0x78, 0x01, 0xF8, 0xFE, 0xC8, 0x33,
- 0x43, 0x61, 0xAF, 0x22, 0xD5, 0xE0, 0xF8, 0x13, 0xFA, 0xBD, 0x3D, 0x81, 0xC8, 0xC4, 0xC1, 0x18,
- 0x86, 0xDE, 0xFC, 0x0A, 0xF0, 0x76, 0xC9, 0x37, 0x87, 0x8C, 0xF2, 0x3F, 0x30, 0x8E, 0xA7, 0xC4,
- 0x1F, 0x3A, 0x45, 0xDE, 0x8F, 0x53, 0xC2, 0x4E, 0x4C, 0x23, 0x5E, 0xBC, 0x1A, 0x1F, 0xCB, 0x46,
- 0x5B, 0x95, 0xC7, 0x30, 0xF1, 0x41, 0xA0, 0x1C, 0xDB, 0x05, 0x2C, 0x27, 0x08, 0xDE, 0x56, 0x1F,
- 0x78, 0x73, 0x8D, 0xA5, 0x9C, 0x28, 0x0C, 0xAB, 0x6C, 0x59, 0xE0, 0x2D, 0x9C, 0x2B, 0x2A, 0x7E,
- 0xB1, 0xB4, 0xC1, 0xF2, 0x6D, 0x4F, 0xE9, 0x84, 0x77, 0xAF, 0xD0, 0x9E, 0x1B, 0xD9, 0x2F, 0xBC,
- 0x67, 0xCC, 0xD3, 0xC1, 0xA8, 0x69, 0x67, 0x84, 0x4E, 0xE5, 0x0B, 0x67, 0xCA, 0x16, 0x06, 0x02,
- 0x7F, 0xD9, 0x84, 0xAE, 0xC0, 0x96, 0xB5, 0xAF, 0x2F, 0x39, 0x14, 0x58, 0xEB, 0xF9, 0x7D, 0x69,
- 0x43, 0xE3, 0x5D, 0xF4, 0xE0, 0x69, 0x0A, 0x36, 0xC5, 0xF6, 0xDD, 0x3D, 0x16, 0x55, 0x24, 0x39,
- 0x51, 0x0A, 0xBB, 0x7A, 0xD5, 0xD3, 0xB0, 0x6B, 0x78, 0x7F, 0xFD, 0xDE, 0x1C, 0x97, 0x32, 0xF8,
- 0x99, 0xEB, 0x83, 0x98, 0xC1, 0x1F, 0xDF, 0xC4, 0xAF, 0x00, 0xD5, 0xD7, 0x1C, 0xBC, 0xA3, 0xE3,
- 0xDB, 0x5B, 0xD6, 0xDC, 0xB5, 0x65, 0x6D, 0x93, 0x96, 0xEA, 0x99, 0x21, 0xE4, 0x3D, 0x97, 0x12,
- 0xB6, 0x4C, 0xCC, 0xD0, 0xFB, 0x5D, 0x16, 0x16, 0x69, 0x01, 0x74, 0x7C, 0x3B, 0xB0, 0x65, 0x4D,
- 0x2C, 0x23, 0x9F, 0xC3, 0xB0, 0xB7, 0x0B, 0xB8, 0xDC, 0x0F, 0x7B, 0x4F, 0x8C, 0xF5, 0x5F, 0xD6,
- 0x69, 0x29, 0x27, 0x0A, 0x3B, 0x7D, 0xAC, 0xF3, 0x2E, 0x67, 0x22, 0x33, 0x8E, 0x1F, 0x7E, 0xE2,
- 0x6B, 0xDA, 0x73, 0x9E, 0x1F, 0xAC, 0x57, 0x1E, 0x79, 0xBD, 0x66, 0xA4, 0x43, 0x2B, 0xE1, 0xC7,
- 0xE7, 0xF1, 0x93, 0x9B, 0xFB, 0xDE, 0x69, 0x74, 0xB9, 0x3D, 0x53, 0xFC, 0x13, 0x4F, 0xDC, 0x49,
- 0xB5, 0x59, 0xC3, 0x1E, 0x8C, 0x50, 0xB0, 0x19, 0xDF, 0x0C, 0xAC, 0xF5, 0x5F, 0x6A, 0x0A, 0xBB,
- 0xE0, 0x55, 0xD8, 0x79, 0x7D, 0x9C, 0xB8, 0x98, 0xC1, 0x37, 0xD7, 0xBC, 0x85, 0x19, 0x9C, 0xB6,
- 0x6F, 0x0B, 0xBB, 0x9E, 0x0A, 0xDC, 0xB2, 0xAF, 0x0C, 0x7C, 0x0B, 0xDD, 0x7D, 0x16, 0xBA, 0x3D,
- 0x46, 0xAA, 0x40, 0xDE, 0x95, 0x5A, 0xC2, 0xE6, 0xC7, 0x91, 0xC5, 0xF9, 0x0B, 0xA0, 0x62, 0x84,
- 0x6F, 0x21, 0xCC, 0xE8, 0xBB, 0x3E, 0xF6, 0x05, 0xCE, 0x5D, 0x38, 0x8E, 0x1B, 0x19, 0x47, 0x58,
- 0xCA, 0x29, 0x31, 0x7C, 0x3F, 0x58, 0x3D, 0x9C, 0xA2, 0xF3, 0xE7, 0x8A, 0xDA, 0x1F, 0x99, 0x7E,
- 0xFC, 0xC4, 0x55, 0xCE, 0x51, 0xAB, 0x3E, 0xB3, 0x9C, 0xC9, 0x14, 0xF6, 0xD8, 0xD1, 0x13, 0x17,
- 0x70, 0xE9, 0xAE, 0xB3, 0xA0, 0x0D, 0x17, 0x9D, 0x3E, 0x7E, 0xCA, 0x08, 0xBB, 0xE8, 0xE4, 0x87,
- 0x6B, 0x17, 0xC6, 0x8D, 0x0B, 0x95, 0xFD, 0x2C, 0x9A, 0x59, 0xFE, 0xC7, 0xF9, 0x1A, 0x1F, 0xA1,
- 0xDA, 0x48, 0x95, 0xBC, 0x8D, 0x84, 0x6D, 0x88, 0x4B, 0xFB, 0x9C, 0x87, 0x13, 0x1F, 0x4C, 0x29,
- 0xFA, 0xB9, 0x63, 0xDC, 0xCA, 0xE2, 0x67, 0x60, 0x0F, 0x13, 0x13, 0x11, 0xDB, 0x6C, 0xF7, 0xCC,
- 0x5F, 0x53, 0xB5, 0x8B, 0xE7, 0xA6, 0xFD, 0x6A, 0xD4, 0xC8, 0xFB, 0xEF, 0x2F, 0x72, 0x24, 0x01,
- 0xF4, 0xA9, 0x71, 0x1A, 0x00, 0xD5, 0xD7, 0xF9, 0x8E, 0x0E, 0xA6, 0xAF, 0xAE, 0xD2, 0x31, 0xC1,
- 0xAA, 0xCB, 0x00, 0x6A, 0xCE, 0x4E, 0x33, 0x85, 0x2D, 0xBD, 0x61, 0xD4, 0x60, 0xE7, 0xB8, 0x84,
- 0x5D, 0x1F, 0x53, 0xDC, 0x3D, 0x93, 0xE6, 0xB2, 0xEB, 0x10, 0x98, 0xFF, 0x45, 0xA3, 0x13, 0x63,
- 0x4A, 0x15, 0xBD, 0xAB, 0xAE, 0xF3, 0xD5, 0xB3, 0x84, 0x6D, 0x30, 0xBF, 0xF8, 0xAE, 0xB6, 0x85,
- 0x71, 0xD2, 0x39, 0x27, 0xE1, 0xC4, 0x07, 0xBE, 0xDF, 0xAF, 0xB6, 0xF7, 0xA3, 0xA8, 0xFD, 0x2C,
- 0xF9, 0xE9, 0x86, 0x07, 0xFC, 0xF7, 0xD2, 0x57, 0x35, 0x67, 0xD5, 0x58, 0xEB, 0x78, 0x6E, 0xC6,
- 0x48, 0x6C, 0x16, 0xB4, 0xE7, 0x2A, 0xA3, 0x57, 0x43, 0xC5, 0xA1, 0x38, 0xA5, 0x38, 0x67, 0x45,
- 0x39, 0xA7, 0x81, 0x98, 0x52, 0xED, 0xF7, 0x8F, 0xA1, 0x41, 0x08, 0x7F, 0xD0, 0x3E, 0x60, 0x9D,
- 0x73, 0xC4, 0xEF, 0xBF, 0x7C, 0xC9, 0x79, 0xA6, 0xB0, 0x69, 0x1F, 0xBE, 0x10, 0x27, 0x2E, 0x65,
- 0x70, 0xDE, 0xFB, 0x14, 0x77, 0xF1, 0x46, 0x8A, 0xB1, 0x98, 0x14, 0x44, 0xEF, 0xDC, 0x7F, 0xAD,
- 0x08, 0x9D, 0x65, 0x4A, 0x15, 0xBD, 0xAF, 0xAF, 0xF6, 0x0F, 0x64, 0x09, 0xDB, 0xA0, 0xD3, 0x66,
- 0xD4, 0xB2, 0xB1, 0x28, 0x96, 0xB7, 0x90, 0xEB, 0x4C, 0x0E, 0xA8, 0xBA, 0xA6, 0x77, 0x31, 0x81,
- 0x75, 0xBF, 0x33, 0x5F, 0x5A, 0x76, 0xB6, 0x9B, 0x95, 0x28, 0xAC, 0xAB, 0xD0, 0xE4, 0x62, 0x74,
- 0xF3, 0xA1, 0xB4, 0x12, 0xB0, 0x3F, 0x9E, 0xFE, 0xF3, 0x05, 0x0F, 0x13, 0x1F, 0x24, 0x2A, 0x84,
- 0xC4, 0x05, 0xD4, 0x75, 0xF1, 0xA5, 0x55, 0xC0, 0xA9, 0x3C, 0xD4, 0xCD, 0x1A, 0xB4, 0x3E, 0x3E,
- 0xE7, 0x64, 0x5A, 0x44, 0x0A, 0x19, 0x72, 0x9D, 0x49, 0x82, 0x20, 0xF9, 0x40, 0x82, 0x20, 0xF9,
- 0x40, 0x82, 0xE0, 0x30, 0xFB, 0x9B, 0x18, 0x8E, 0xDA, 0xEF, 0x30, 0xFB, 0x9D, 0x4C, 0x78, 0x77,
- 0x31, 0x72, 0x89, 0x93, 0xB4, 0x1C, 0xEF, 0x64, 0x00, 0x29, 0xF3, 0x01, 0x4C, 0xCD, 0xA2, 0x77,
- 0x17, 0x48, 0xEF, 0x29, 0x89, 0x24, 0x90, 0x4A, 0xBB, 0x50, 0x2B, 0x4C, 0xF0, 0xFA, 0x62, 0xE0,
- 0xEC, 0x1B, 0xCF, 0x3F, 0x51, 0x6C, 0x2D, 0x8D, 0x38, 0x70, 0x7E, 0x28, 0x33, 0xE8, 0x22, 0xE9,
- 0x73, 0x1B, 0x36, 0x79, 0xD0, 0xD1, 0x0A, 0x25, 0xED, 0xA5, 0xB1, 0x5B, 0x34, 0xCC, 0xF0, 0x05,
- 0xC9, 0x56, 0xA2, 0x81, 0xCA, 0x20, 0x9B, 0x8A, 0xC2, 0xAB, 0x1D, 0x22, 0x36, 0xE1, 0x4C, 0xE3,
- 0x0B, 0xF3, 0x43, 0xD3, 0x0C, 0xFF, 0x38, 0xB1, 0x1D, 0xB0, 0x7F, 0xA2, 0x25, 0x69, 0xC7, 0xC7,
- 0xEA, 0x2A, 0xF6, 0x8F, 0x39, 0xA4, 0x28, 0xC2, 0xE0, 0x86, 0x15, 0x76, 0x2B, 0x46, 0x1A, 0x8E,
- 0x7D, 0xAC, 0x4C, 0x71, 0x0C, 0x48, 0x0A, 0xD6, 0x5D, 0xE3, 0x0C, 0x1D, 0xDF, 0x7F, 0xDA, 0x4D,
- 0xDB, 0x80, 0x0B, 0x12, 0x56, 0x3E, 0x68, 0x52, 0x94, 0xD3, 0xA7, 0x2B, 0x9A, 0x5A, 0x13, 0xCE,
- 0xA6, 0x51, 0xD9, 0x9B, 0x76, 0xA0, 0xD4, 0xFC, 0xB4, 0x3F, 0x33, 0x67, 0x84, 0xBE, 0x35, 0x6C,
- 0xCB, 0xAB, 0x06, 0x98, 0x64, 0x54, 0xF8, 0xBF, 0x7D, 0xD1, 0xF3, 0x6F, 0x4D, 0xB0, 0xEF, 0xB9,
- 0x07, 0x6C, 0xEC, 0xC1, 0xE0, 0xFA, 0x60, 0x6C, 0x02, 0x46, 0x88, 0x98, 0x76, 0x41, 0x62, 0x24,
- 0x6F, 0xD4, 0xDD, 0xE1, 0x0B, 0x1E, 0x0B, 0x4D, 0x08, 0xFA, 0x22, 0xBE, 0x88, 0x57, 0x3C, 0xD4,
- 0xD1, 0x79, 0xC9, 0xB3, 0x25, 0x43, 0xF6, 0xAA, 0xC5, 0xC8, 0x0A, 0xB6, 0x8A, 0xAF, 0x8B, 0x53,
- 0xDD, 0xAD, 0xB7, 0x3F, 0xEF, 0x64, 0x08, 0x13, 0x9F, 0x27, 0x63, 0x2F, 0xF8, 0x02, 0x9D, 0x64,
- 0x06, 0x08, 0x60, 0x64, 0x4C, 0x24, 0x2F, 0xC0, 0x19, 0xDA, 0x7B, 0x62, 0x43, 0xD3, 0xA9, 0x3B,
- 0x7F, 0x81, 0x41, 0x26, 0x42, 0x2C, 0x23, 0xCE, 0x89, 0xE4, 0x1B, 0x34, 0x3E, 0xE0, 0x5F, 0x5D,
- 0x49, 0x7B, 0x0B, 0x6C, 0xF8, 0x57, 0xBE, 0xA1, 0x34, 0x2E, 0xB0, 0xCA, 0x00, 0xCE, 0x44, 0xDB,
- 0xA1, 0x94, 0xFE, 0xFB, 0xBF, 0x1F, 0xF9, 0xBC, 0xF8, 0xC2, 0xAB, 0x87, 0x9F, 0xF5, 0x80, 0x27,
- 0x48, 0x66, 0x54, 0x7D, 0x30, 0x68, 0xF0, 0x3E, 0xA3, 0xC2, 0x2F, 0x9E, 0x37, 0x08, 0x0E, 0x02,
- 0x28, 0xEE, 0x1B, 0x7F, 0xE7, 0x20, 0x0F, 0x3E, 0x78, 0xEF, 0xBD, 0xAB, 0xE2, 0xCB, 0x83, 0x4D,
- 0xB7, 0xAC, 0x5E, 0x66, 0x4A, 0xBA, 0xA3, 0x38, 0x84, 0x0F, 0xFF, 0x44, 0xF9, 0x2A, 0x0A, 0x17,
- 0x50, 0xC3, 0xFC, 0xB1, 0x8A, 0xBF, 0xA3, 0x4E, 0x13, 0xAE, 0x23, 0x7D, 0x45, 0x75, 0xA9, 0x70,
- 0x60, 0xBB, 0xA9, 0xE2, 0xEB, 0x70, 0x07, 0xE9, 0xFE, 0x52, 0x9B, 0xED, 0x48, 0x80, 0x63, 0xA7,
- 0xBF, 0xA2, 0xC2, 0x97, 0x5D, 0x2B, 0x27, 0xDE, 0x06, 0xD5, 0xF6, 0xB0, 0x0F, 0x98, 0xF9, 0x83,
- 0x4E, 0xF8, 0xE1, 0xC3, 0xB8, 0xA5, 0xC8, 0x13, 0xFD, 0xC0, 0xB4, 0x19, 0xB7, 0xE3, 0xC3, 0x90,
- 0xC7, 0x35, 0xDA, 0x8B, 0xE9, 0x7A, 0x42, 0x86, 0xEF, 0xFF, 0xAC, 0x77, 0x0D, 0xF0, 0x7A, 0x70,
- 0x2A, 0xEA, 0xF4, 0xBF, 0x3E, 0x68, 0x4E, 0x69, 0x76, 0xE8, 0x65, 0x75, 0xC1, 0xFA, 0xDB, 0x99,
- 0x91, 0xD9, 0x7C, 0x87, 0xC6, 0x07, 0x13, 0x8F, 0xD1, 0x1B, 0xB4, 0xD3, 0xAE, 0xFB, 0xF8, 0xDB,
- 0x9C, 0x39, 0x58, 0x95, 0xF5, 0x45, 0x6B, 0x17, 0x00, 0x03, 0x23, 0x78, 0x7E, 0x83, 0x4B, 0xFB,
- 0xC2, 0x5D, 0x83, 0x4B, 0xA3, 0xC7, 0xC1, 0x17, 0x46, 0x2E, 0xC0, 0x8F, 0x48, 0xF1, 0xE8, 0x15,
- 0xFE, 0x20, 0x28, 0x1F, 0xBB, 0x68, 0x53, 0xD7, 0x6D, 0x5F, 0xA8, 0x1F, 0x6F, 0x96, 0x07, 0xAE,
- 0x0F, 0xCA, 0x11, 0xA1, 0x4D, 0x67, 0x5E, 0xF8, 0xA5, 0x9D, 0x11, 0xF6, 0xFE, 0x11, 0x2D, 0x24,
- 0x28, 0xAA, 0xDA, 0x0E, 0x3F, 0x80, 0x6B, 0x5F, 0x31, 0x92, 0xF6, 0x42, 0x13, 0x6E, 0xDD, 0x9E,
- 0xF7, 0x7A, 0x29, 0xB2, 0x41, 0x24, 0x8C, 0x5C, 0xC7, 0x02, 0x68, 0xCF, 0x98, 0x67, 0x68, 0xDF,
- 0xE8, 0xEF, 0xCE, 0xAF, 0xAC, 0x33, 0x5B, 0x0D, 0xD8, 0xAF, 0x86, 0x8B, 0x42, 0xEA, 0xD9, 0xD3,
- 0x76, 0x91, 0xF0, 0xF1, 0x57, 0x54, 0xD5, 0x03, 0xA1, 0xFB, 0xE1, 0xDD, 0xDA, 0x59, 0x31, 0x8C,
- 0x80, 0x86, 0x10, 0x68, 0xEB, 0xDB, 0xEA, 0x69, 0xA0, 0x60, 0xF7, 0xC9, 0x64, 0x23, 0xA7, 0x0E,
- 0xC6, 0xE0, 0xC7, 0x5D, 0x3B, 0xD5, 0xDB, 0xA2, 0x9A, 0x2C, 0x65, 0xC0, 0x1F, 0x22, 0x4A, 0xFB,
- 0x50, 0xB7, 0x37, 0xE2, 0x3D, 0xB1, 0xE9, 0x46, 0x13, 0x1F, 0xEC, 0x7F, 0x41, 0xC5, 0x54, 0x16,
- 0x3C, 0x0F, 0x2D, 0x7D, 0xED, 0x29, 0xE4, 0x1F, 0xF4, 0x76, 0xA1, 0xBC, 0xA1, 0x6D, 0x74, 0xF1,
- 0x59, 0x05, 0x36, 0x74, 0xB4, 0x80, 0x9A, 0x50, 0x94, 0x31, 0x79, 0xB0, 0xBF, 0xEC, 0xC4, 0xB8,
- 0x83, 0x50, 0x76, 0x62, 0xC4, 0xBB, 0x83, 0x6F, 0xD1, 0xBE, 0x70, 0x9F, 0xCF, 0x47, 0x5B, 0x25,
- 0x8F, 0x0E, 0xE6, 0x1D, 0xAE, 0x0A, 0xBD, 0xC2, 0xFF, 0xE8, 0x0D, 0xBD, 0x50, 0x74, 0xEF, 0x89,
- 0x8F, 0x5F, 0x0E, 0xDD, 0xF6, 0xAF, 0xFF, 0x9F, 0x59, 0x1E, 0x7C, 0x1E, 0xFA, 0x15, 0x41, 0xE7,
- 0xD9, 0x20, 0xBC, 0x36, 0x7D, 0x87, 0x2D, 0x95, 0x0D, 0x9D, 0x0A, 0x28, 0xB8, 0xB7, 0x51, 0x79,
- 0x5B, 0xED, 0x50, 0x1F, 0x44, 0x93, 0x2C, 0x82, 0x58, 0x87, 0x1B, 0x9A, 0x07, 0xF9, 0xCE, 0xFF,
- 0x53, 0x2B, 0xBA, 0x95, 0x83, 0x23, 0xFB, 0x0B, 0x46, 0x58, 0xBF, 0x60, 0xC1, 0x36, 0xF0, 0xED,
- 0x75, 0xC3, 0xFA, 0x4B, 0x60, 0x81, 0x51, 0xB3, 0x21, 0xAF, 0x37, 0xE4, 0x35, 0x7D, 0xBA, 0x1A,
- 0x16, 0x28, 0x4A, 0x54, 0x75, 0xA3, 0x15, 0xBD, 0x5A, 0x58, 0x1F, 0xC3, 0x08, 0xAC, 0xEF, 0xEC,
- 0x82, 0x49, 0xF6, 0xFD, 0x82, 0x1D, 0xA3, 0x59, 0xB9, 0x8C, 0xDF, 0x3B, 0xA3, 0x6F, 0xD3, 0x1B,
- 0x70, 0x83, 0xEE, 0xEF, 0xF1, 0x8C, 0x5E, 0x1B, 0x6D, 0xFA, 0x48, 0xFD, 0xCF, 0xB2, 0xDF, 0xA0,
- 0x56, 0x96, 0x86, 0xBA, 0xDB, 0x55, 0xB5, 0x71, 0x28, 0x9C, 0xFC, 0xB2, 0xF2, 0x6C, 0x45, 0xFE,
- 0x37, 0x0D, 0x1A, 0x1F, 0x74, 0x14, 0x97, 0x47, 0x5D, 0xEF, 0x8F, 0x39, 0xCA, 0x6E, 0xCE, 0x76,
- 0xD9, 0x3F, 0x80, 0x89, 0xAE, 0xFE, 0xF0, 0xC9, 0x28, 0x0C, 0x6C, 0xF3, 0x47, 0xF5, 0x16, 0x1F,
- 0xBF, 0x85, 0xF7, 0xFB, 0xC1, 0xC8, 0xD2, 0x43, 0x9F, 0x8C, 0xD2, 0x46, 0x4D, 0xEA, 0x31, 0xB0,
- 0xD8, 0x87, 0xC0, 0x5B, 0x7D, 0x91, 0x7A, 0xE2, 0xF4, 0x0B, 0x00, 0xFF, 0xDA, 0xF9, 0x77, 0xD6,
- 0x6B, 0x10, 0xF2, 0x20, 0x08, 0x6A, 0x87, 0xAF, 0x23, 0x0A, 0x6F, 0x2A, 0xFF, 0x70, 0xB8, 0xD2,
- 0x2A, 0x0F, 0xAA, 0xDB, 0x14, 0xF7, 0x65, 0x61, 0x57, 0x69, 0xF4, 0xA2, 0xB7, 0xC1, 0x2B, 0xD8,
- 0x80, 0x88, 0x15, 0x85, 0x9A, 0x37, 0x2C, 0x0F, 0x7A, 0x16, 0xB9, 0x83, 0x1E, 0xFC, 0x26, 0x8B,
- 0xC5, 0x43, 0x24, 0xC3, 0x0E, 0x8C, 0x1E, 0xEA, 0x86, 0xEA, 0xDB, 0xC1, 0x6C, 0xD5, 0xC6, 0x1B,
- 0xC2, 0x17, 0x74, 0xC7, 0x98, 0x0E, 0xEA, 0x40, 0xBE, 0x19, 0xFD, 0x30, 0x7C, 0xF9, 0x8D, 0xBD,
- 0x0B, 0x40, 0xDD, 0x6E, 0x0B, 0xF4, 0xC0, 0xD7, 0x8A, 0xC8, 0xB8, 0xC3, 0xE0, 0xAF, 0x29, 0x83,
- 0x8B, 0x8F, 0xA1, 0x69, 0x17, 0x0D, 0x87, 0xCE, 0x67, 0xDB, 0x0C, 0xFD, 0xAE, 0x50, 0x60, 0x4B,
- 0xD8, 0x20, 0xE9, 0xBE, 0xA7, 0x6E, 0x52, 0xBB, 0x6F, 0xC8, 0x47, 0xDE, 0xAB, 0xA2, 0x43, 0xDF,
- 0x9D, 0xA3, 0x7B, 0x7F, 0x5E, 0x0D, 0x7F, 0x08, 0x45, 0x9D, 0xED, 0xF5, 0x63, 0xBE, 0x3C, 0x5A,
- 0xD8, 0x01, 0xCC, 0x63, 0xE8, 0xF2, 0x80, 0x0C, 0x0B, 0x4E, 0x6C, 0xC2, 0x7A, 0xC1, 0x62, 0x24,
- 0x91, 0x1F, 0x1F, 0x4C, 0x1E, 0xB4, 0x34, 0x96, 0x1D, 0x1F, 0x0E, 0xED, 0x25, 0x7F, 0x0F, 0x9C,
- 0xD5, 0x5B, 0x7C, 0x34, 0x12, 0x10, 0x6D, 0x76, 0x8D, 0x2C, 0x1E, 0x4B, 0xB7, 0x58, 0x31, 0x5A,
- 0x85, 0x87, 0x8B, 0x7E, 0x01, 0xC1, 0x68, 0x23, 0x44, 0xE6, 0xC3, 0x8D, 0x10, 0xAC, 0x61, 0x15,
- 0xCE, 0xE5, 0xC1, 0xB3, 0xFE, 0x40, 0x69, 0xAB, 0xFF, 0x95, 0x3B, 0xE1, 0xE6, 0x9F, 0x68, 0x1F,
- 0xB6, 0x06, 0x37, 0x5C, 0x74, 0x3F, 0xFB, 0x8C, 0x1E, 0xBF, 0x48, 0xE5, 0x76, 0xDA, 0x18, 0x31,
- 0x6F, 0xC4, 0xA5, 0x2E, 0xA5, 0x0C, 0x80, 0x6F, 0xDF, 0xF9, 0x51, 0xE8, 0x10, 0x8F, 0xB9, 0x50,
- 0xED, 0x45, 0xA5, 0xBE, 0x3A, 0xA9, 0xBF, 0xD4, 0x1B, 0x54, 0x54, 0xEC, 0xB8, 0xFD, 0x7F, 0x0B,
- 0x9E, 0x9F, 0x09, 0x2D, 0xEE, 0xC3, 0x9F, 0xD4, 0x7D, 0x3B, 0xEA, 0xD6, 0xC3, 0xB3, 0xEE, 0xC8,
- 0x57, 0x76, 0xBD, 0xAF, 0xAE, 0xBF, 0x12, 0x8D, 0xFF, 0x59, 0x11, 0x86, 0x7B, 0x47, 0x1E, 0x83,
- 0x91, 0xC7, 0x3A, 0xCE, 0xC3, 0x9B, 0x51, 0xC6, 0xC8, 0xBA, 0x23, 0xAC, 0x78, 0xD8, 0xDE, 0x64,
- 0x1F, 0x76, 0x05, 0x4C, 0x8A, 0x38, 0xEE, 0x09, 0x23, 0xB6, 0x9F, 0x98, 0x52, 0x0C, 0xC3, 0x2B,
- 0xDE, 0x6D, 0x33, 0xF4, 0x22, 0xEA, 0x42, 0x27, 0x87, 0x86, 0xE0, 0xD9, 0x2F, 0x87, 0x14, 0x08,
- 0x7F, 0x90, 0xFF, 0x7D, 0x45, 0x8D, 0x0F, 0x9A, 0xCA, 0xA3, 0xC7, 0xA0, 0x6D, 0x74, 0xB3, 0x82,
- 0xBB, 0x9D, 0x55, 0x93, 0x3C, 0x60, 0xA3, 0x23, 0xEB, 0x6A, 0x1C, 0xEF, 0x1F, 0xF4, 0x8F, 0xF6,
- 0x8F, 0xB8, 0xFA, 0xED, 0x50, 0xCE, 0x7C, 0x42, 0x97, 0x07, 0xAD, 0xFD, 0x21, 0xBA, 0xF1, 0xAB,
- 0xD0, 0x34, 0x84, 0xBF, 0xF5, 0xD1, 0xF3, 0x44, 0x85, 0xBB, 0xD4, 0x67, 0x1F, 0x50, 0xDC, 0x0A,
- 0x4C, 0x51, 0x00, 0xAF, 0xFB, 0x4D, 0xF2, 0xA0, 0x3F, 0xC3, 0xCC, 0xE1, 0xCF, 0x8F, 0xEF, 0x6F,
- 0xEF, 0x1F, 0x5C, 0x1C, 0xF2, 0xB6, 0xD6, 0x4F, 0x46, 0xC7, 0xCD, 0x1B, 0xBE, 0x8C, 0xB5, 0xA2,
- 0x27, 0xED, 0x0B, 0x4E, 0xC1, 0xFF, 0x4E, 0x17, 0x04, 0x27, 0x05, 0x7D, 0xE3, 0xB4, 0x87, 0x46,
- 0x1F, 0x86, 0xEF, 0x54, 0xF4, 0x87, 0x33, 0xFD, 0x2B, 0x5F, 0x9E, 0x0D, 0xA6, 0x06, 0x39, 0xA4,
- 0xA8, 0xFB, 0xFB, 0xFD, 0xCE, 0xB7, 0x73, 0xF4, 0x66, 0xBC, 0xD1, 0x18, 0xA1, 0xA3, 0x6E, 0x6A,
- 0x13, 0xEA, 0x4F, 0xA9, 0xEF, 0xEE, 0x57, 0xE0, 0xCB, 0x31, 0x6C, 0x80, 0xF8, 0x0B, 0xDB, 0x1B,
- 0x3F, 0x8F, 0xAB, 0x54, 0xE9, 0x7C, 0x50, 0x8A, 0xAE, 0x30, 0x32, 0x02, 0x53, 0xD0, 0x89, 0x1A,
- 0x8C, 0x10, 0x69, 0xFF, 0x95, 0xF7, 0x93, 0xEF, 0x94, 0xC0, 0x01, 0xEC, 0xCB, 0x18, 0x26, 0xEC,
- 0x6E, 0xF3, 0xBC, 0x81, 0xA2, 0x69, 0xCA, 0x7F, 0x4F, 0x43, 0x56, 0x3C, 0xF6, 0xA1, 0x69, 0xEC,
- 0x9B, 0x9F, 0xD0, 0xF8, 0x60, 0x64, 0x03, 0xB6, 0xA5, 0x7D, 0x8E, 0xBF, 0x74, 0x0B, 0xA0, 0xD5,
- 0x99, 0xE1, 0x46, 0x78, 0x00, 0x19, 0xC1, 0xB6, 0xA6, 0xCB, 0xC7, 0x0B, 0xED, 0x2D, 0xD8, 0x39,
- 0x00, 0xD7, 0x69, 0x18, 0xA1, 0xCB, 0x83, 0xB3, 0xE7, 0xC1, 0x54, 0x9C, 0xF2, 0x2B, 0x39, 0x45,
- 0x1F, 0x12, 0xC0, 0x60, 0xAD, 0xC2, 0xFB, 0x2B, 0xBB, 0xBC, 0x28, 0x9B, 0xA3, 0x78, 0xA1, 0x94,
- 0x4C, 0xFD, 0x83, 0x33, 0x0A, 0x7E, 0xD0, 0xBE, 0xB6, 0x0D, 0xA3, 0x63, 0xD8, 0x00, 0x6E, 0x01,
- 0xE5, 0xD7, 0x98, 0x19, 0x00, 0xF7, 0xD2, 0x0F, 0xD7, 0xDD, 0x21, 0xF8, 0x80, 0x73, 0xCF, 0xB1,
- 0x66, 0xE8, 0xBB, 0xAE, 0x6D, 0x49, 0xED, 0xCD, 0x41, 0xAF, 0xF6, 0x58, 0xF1, 0x70, 0xF8, 0xE9,
- 0xAC, 0x99, 0xEF, 0x7D, 0xFE, 0x37, 0x53, 0x71, 0x0C, 0x1B, 0x6E, 0xD4, 0xF9, 0x00, 0x39, 0x72,
- 0xE2, 0x1E, 0x15, 0x8A, 0x5E, 0xC5, 0x3E, 0x02, 0xCF, 0x15, 0xE2, 0x92, 0xFF, 0xAA, 0xAB, 0x40,
- 0x23, 0x9A, 0xEF, 0x1E, 0x04, 0xF5, 0xCA, 0x0F, 0xAD, 0xA9, 0x72, 0x7C, 0x1E, 0x3A, 0xFB, 0x76,
- 0x98, 0x3F, 0x79, 0x0E, 0xD7, 0x29, 0x18, 0x82, 0x72, 0xAE, 0x25, 0xEC, 0xC7, 0xCE, 0xF1, 0xF5,
- 0x86, 0x77, 0x53, 0x11, 0x36, 0x3C, 0x2A, 0xDA, 0x1F, 0x28, 0x89, 0x0C, 0xD3, 0x7D, 0xA3, 0x8D,
- 0x0B, 0x3E, 0x44, 0xB6, 0xA8, 0xD8, 0x3D, 0xFD, 0x40, 0xC5, 0x88, 0xFC, 0x9F, 0x55, 0x30, 0xE6,
- 0x0F, 0x9A, 0x07, 0x60, 0xA7, 0x0A, 0x20, 0x84, 0xD6, 0x1B, 0xDA, 0x4D, 0x73, 0x24, 0x01, 0x7C,
- 0x69, 0xEB, 0x23, 0xAC, 0xEC, 0xFB, 0x0F, 0x8C, 0xBA, 0xFA, 0xAB, 0x3B, 0x94, 0xE0, 0x67, 0xF9,
- 0x3D, 0xF0, 0xFE, 0x01, 0xC1, 0x2F, 0xBE, 0xA0, 0x26, 0x4D, 0x1E, 0x9C, 0xE7, 0xC1, 0xC6, 0x34,
- 0x1A, 0x76, 0xF1, 0x66, 0xBA, 0x95, 0x49, 0x0B, 0x5E, 0xA3, 0xC5, 0x4B, 0xBE, 0x03, 0xFD, 0x83,
- 0x34, 0x11, 0x25, 0x98, 0xC9, 0xC0, 0xC8, 0xD6, 0x45, 0x23, 0x9F, 0x24, 0x83, 0xCE, 0x63, 0xE1,
- 0x89, 0x86, 0x87, 0x9E, 0xD7, 0x93, 0xF6, 0x82, 0x52, 0x0C, 0xC7, 0x36, 0x2B, 0x25, 0x3F, 0xBB,
- 0x0A, 0x8C, 0xF9, 0x03, 0x38, 0xBE, 0x5E, 0x81, 0x9D, 0x5F, 0x81, 0x2F, 0x61, 0xCF, 0x0C, 0x3C,
- 0x96, 0x62, 0x2F, 0xC6, 0x2E, 0x02, 0xF5, 0x14, 0x2F, 0xD4, 0x99, 0xA3, 0x7A, 0xD6, 0x7A, 0x64,
- 0x04, 0x32, 0x7E, 0x76, 0xFD, 0x79, 0x8E, 0x02, 0xBB, 0x96, 0x8D, 0x98, 0x06, 0x7B, 0x15, 0xB4,
- 0xFC, 0xE0, 0x37, 0xD8, 0x61, 0xEA, 0xAE, 0x3E, 0x2D, 0xFD, 0x9A, 0xE9, 0x2D, 0xFC, 0xF3, 0xC2,
- 0x26, 0xFD, 0xCB, 0x4F, 0x2C, 0xAC, 0x3A, 0xFF, 0xE8, 0xA0, 0xF6, 0x71, 0x16, 0x1A, 0xAE, 0x11,
- 0xDA, 0xB0, 0x65, 0x0C, 0x36, 0x89, 0x4E, 0xA9, 0xE4, 0x15, 0x0C, 0x3E, 0x18, 0xA0, 0x7A, 0x9B,
- 0x71, 0x8C, 0x1F, 0xDD, 0xF0, 0x25, 0x6B, 0x3F, 0x31, 0x46, 0xC3, 0x43, 0x8C, 0x17, 0x8E, 0x0F,
- 0x77, 0x35, 0x2A, 0x47, 0x2A, 0xA0, 0x4E, 0x9F, 0x4F, 0x3C, 0xD8, 0x1F, 0x3E, 0x06, 0x65, 0x60,
- 0x13, 0x4D, 0x3F, 0xA0, 0x51, 0x91, 0x52, 0xBD, 0x01, 0xF8, 0x8F, 0xEF, 0x03, 0x1B, 0xCC, 0x31,
- 0x79, 0x70, 0x56, 0xB0, 0x07, 0x0D, 0x19, 0x5F, 0x8F, 0xFE, 0xA0, 0xEF, 0x4A, 0x6A, 0x58, 0x62,
- 0xD8, 0x00, 0x5A, 0xFF, 0x2D, 0x7C, 0x7A, 0xC0, 0xE2, 0x91, 0x9F, 0xFF, 0x69, 0x44, 0x3D, 0xA3,
- 0x77, 0xFC, 0xD8, 0x78, 0xE1, 0xE4, 0xD0, 0x13, 0xBF, 0x2B, 0x42, 0x93, 0x2C, 0x9F, 0x06, 0x08,
- 0xAB, 0xDA, 0x63, 0xEA, 0x20, 0xE4, 0xC2, 0xED, 0x87, 0xEE, 0xA1, 0xAF, 0x78, 0x82, 0x51, 0xB9,
- 0xD1, 0xB0, 0x37, 0x34, 0x7B, 0x47, 0xF1, 0x29, 0x18, 0x3C, 0xCB, 0x34, 0xD9, 0x88, 0x8C, 0x70,
- 0x70, 0x1C, 0xCA, 0x8A, 0x5B, 0x37, 0x38, 0x6F, 0xA5, 0x9A, 0xC6, 0x08, 0xEC, 0xC5, 0xB9, 0x0A,
- 0xEB, 0x94, 0xD4, 0x94, 0x5A, 0x25, 0x10, 0x75, 0x8F, 0xAB, 0x3B, 0x38, 0xCE, 0x3A, 0x99, 0xE8,
- 0xBB, 0xF0, 0xEF, 0xAF, 0x78, 0xAE, 0xB3, 0x78, 0xD5, 0x9D, 0xBC, 0x07, 0xD6, 0x36, 0x75, 0x16,
- 0x43, 0x74, 0xCC, 0x57, 0xCB, 0x8E, 0xCF, 0x7F, 0xDF, 0x31, 0x9D, 0x3C, 0x82, 0xC6, 0x07, 0xC7,
- 0x60, 0xF0, 0xC7, 0x2D, 0xDE, 0x2B, 0xCF, 0x67, 0x37, 0x31, 0xD3, 0x2E, 0x16, 0xE8, 0xE3, 0x05,
- 0xF8, 0x7B, 0xCB, 0xD0, 0x4F, 0x7A, 0x2C, 0xF2, 0x60, 0xDF, 0xF9, 0x7E, 0x68, 0x19, 0x12, 0xC4,
- 0x19, 0xBF, 0x62, 0x45, 0x1F, 0x2F, 0xF8, 0xC6, 0xAE, 0x01, 0xE4, 0x01, 0x32, 0xDD, 0x4B, 0xC4,
- 0x45, 0xEC, 0xB5, 0xC0, 0x46, 0x8C, 0xAF, 0x54, 0xBD, 0x64, 0x9A, 0x6E, 0x36, 0xD0, 0x88, 0xAA,
- 0x93, 0x00, 0x27, 0xD1, 0x6E, 0x4D, 0x30, 0xFA, 0x7F, 0xDA, 0x8C, 0x06, 0x93, 0x07, 0x43, 0xEB,
- 0x67, 0x84, 0x9A, 0x54, 0xDF, 0x6D, 0xFD, 0x21, 0xA2, 0x1A, 0x87, 0x4A, 0x90, 0xBD, 0xB7, 0xE2,
- 0xF3, 0x37, 0xE1, 0xCC, 0xA2, 0x79, 0xB4, 0x1E, 0xC6, 0xCE, 0x63, 0x55, 0xD1, 0xC7, 0x83, 0xE1,
- 0x74, 0xF5, 0x18, 0x53, 0xDD, 0x55, 0x0F, 0xFF, 0xAB, 0x02, 0xC1, 0x9B, 0xD4, 0x38, 0x3B, 0xEA,
- 0x1E, 0x61, 0x12, 0xED, 0xD6, 0x8F, 0x06, 0x46, 0xDC, 0x21, 0x33, 0x23, 0x78, 0xFB, 0x44, 0x5F,
- 0xFA, 0x3E, 0xF2, 0x46, 0x5B, 0x9D, 0x89, 0xA9, 0x9A, 0xCE, 0x0B, 0x79, 0x3D, 0x83, 0xB1, 0x27,
- 0x62, 0x21, 0xD1, 0xF1, 0x28, 0xB8, 0x56, 0x7D, 0x7C, 0xBC, 0x2F, 0x84, 0xEF, 0x77, 0xA9, 0x65,
- 0xDF, 0xCA, 0xFB, 0x29, 0x04, 0x43, 0x1E, 0x7C, 0x0C, 0xA5, 0x83, 0x0F, 0xDF, 0x0C, 0x27, 0xD1,
- 0x0E, 0xF0, 0x26, 0xAB, 0x88, 0xB3, 0x81, 0xC9, 0x83, 0x10, 0x7E, 0xFE, 0x63, 0xDB, 0x9A, 0xFF,
- 0xD1, 0x83, 0x07, 0x40, 0x9A, 0xE4, 0xC1, 0x81, 0x03, 0xD7, 0xF6, 0x19, 0xA1, 0xE2, 0x3C, 0x02,
- 0x16, 0xDF, 0x29, 0xBD, 0x01, 0x60, 0x23, 0x78, 0x7C, 0x0A, 0x7B, 0x5F, 0x11, 0xF7, 0x31, 0x31,
- 0xDD, 0xDC, 0xE0, 0x0B, 0x2A, 0xEA, 0x5F, 0xD1, 0x39, 0xC6, 0x51, 0x1E, 0x4C, 0x45, 0x1B, 0x40,
- 0xED, 0x50, 0xC2, 0x35, 0xE4, 0xB5, 0x0E, 0x0B, 0x46, 0x8B, 0x84, 0x9A, 0xA0, 0xF3, 0xC1, 0x19,
- 0x9F, 0xEE, 0xB8, 0x1E, 0x09, 0x1A, 0xF3, 0x07, 0xFA, 0xE4, 0x17, 0x33, 0x7C, 0xAA, 0x43, 0x85,
- 0x6A, 0xB5, 0x08, 0x27, 0x35, 0x94, 0x81, 0xB0, 0x71, 0xBE, 0x29, 0xE4, 0x8D, 0x5B, 0x5E, 0x9E,
- 0x38, 0xC7, 0x8D, 0x1D, 0x58, 0x6B, 0xA2, 0x02, 0xB8, 0xED, 0x16, 0x7B, 0x8A, 0x07, 0x06, 0x02,
- 0x19, 0xE8, 0xD7, 0x3C, 0xEB, 0x26, 0x43, 0x78, 0xE4, 0x4F, 0xE8, 0xBE, 0xA2, 0xAE, 0xD3, 0x34,
- 0x00, 0x38, 0x7B, 0x9E, 0x2B, 0x04, 0x43, 0x14, 0xE4, 0x49, 0x33, 0x89, 0x0F, 0xDB, 0xD1, 0x68,
- 0x11, 0xC9, 0x31, 0x4F, 0x3B, 0xDA, 0x5F, 0xFB, 0x08, 0x19, 0xC2, 0x31, 0xA5, 0xBC, 0x81, 0xC6,
- 0x07, 0xCD, 0x9E, 0xBE, 0x2D, 0x7D, 0x3F, 0x9C, 0xB8, 0x07, 0x6A, 0x4D, 0xB3, 0x30, 0xCE, 0x60,
- 0x55, 0xE6, 0xE9, 0xEB, 0x9A, 0x58, 0xF5, 0xDE, 0xA8, 0xBE, 0x74, 0xFE, 0xA3, 0x26, 0x0F, 0xF0,
- 0x42, 0x1F, 0x98, 0x4F, 0x94, 0xC8, 0x60, 0xA3, 0x43, 0x88, 0xDD, 0xA7, 0x48, 0x07, 0x2E, 0x0E,
- 0x46, 0x50, 0x28, 0x68, 0xF2, 0x60, 0x63, 0xAB, 0x3F, 0x50, 0xFF, 0x57, 0xB8, 0xE9, 0x69, 0x9C,
- 0x1B, 0x76, 0x62, 0x84, 0xFF, 0x98, 0x31, 0x71, 0x8B, 0x7D, 0xAF, 0x09, 0x93, 0x07, 0x67, 0x37,
- 0x2C, 0x1F, 0xF9, 0x8F, 0x7F, 0xDD, 0xD5, 0x09, 0x51, 0x6C, 0xBF, 0xB5, 0x87, 0xE2, 0xAC, 0x9B,
- 0x4E, 0xDD, 0x3F, 0x6B, 0x17, 0xFE, 0xDC, 0x08, 0xBF, 0x03, 0xA8, 0x9D, 0x65, 0xF8, 0x17, 0xBF,
- 0xFC, 0x79, 0xB2, 0xC4, 0xB8, 0xDE, 0xA9, 0x7B, 0xE0, 0xC1, 0x11, 0x53, 0x13, 0xB4, 0x8C, 0xED,
- 0x3C, 0x55, 0x8A, 0x39, 0x8E, 0x68, 0x25, 0x14, 0x0D, 0x29, 0x6E, 0xB1, 0x58, 0x50, 0xB1, 0x1F,
- 0xA7, 0x12, 0xB4, 0xE8, 0xFD, 0x42, 0x2E, 0x3A, 0xFD, 0x2B, 0xBA, 0xD1, 0xA2, 0x08, 0xFF, 0xCF,
- 0x95, 0xD1, 0x25, 0x6B, 0x8A, 0xD0, 0x58, 0xF0, 0xB8, 0x5B, 0x3C, 0xDF, 0x5D, 0x5D, 0x42, 0x56,
- 0x83, 0xF3, 0x1A, 0xDA, 0x5B, 0x0E, 0x08, 0xB5, 0x40, 0x8B, 0x77, 0xFF, 0xED, 0xDF, 0xF9, 0xE9,
- 0xD1, 0xF5, 0x3F, 0x7D, 0x81, 0x4F, 0x9C, 0xC5, 0x01, 0x93, 0x07, 0xD8, 0xD4, 0xBB, 0xBE, 0xB8,
- 0xF6, 0x62, 0xEA, 0x2D, 0xE9, 0xF2, 0x20, 0x1C, 0xC4, 0xFE, 0x05, 0x5F, 0x5D, 0x00, 0xE8, 0x57,
- 0x72, 0x9C, 0x49, 0x15, 0x56, 0xC5, 0xD4, 0x63, 0xE8, 0xE7, 0xE9, 0x28, 0xC6, 0xDA, 0xD2, 0xE5,
- 0x01, 0x0D, 0x19, 0x3D, 0xC3, 0x1F, 0xB9, 0xB1, 0xD3, 0x99, 0x0D, 0x00, 0x76, 0x91, 0x15, 0x5E,
- 0x7B, 0xD2, 0x45, 0x21, 0x8F, 0x7A, 0x5F, 0xD0, 0xF7, 0xC4, 0x83, 0x23, 0x7D, 0xFB, 0x26, 0x86,
- 0xC6, 0x71, 0xEE, 0x43, 0xE0, 0xC0, 0x31, 0x26, 0x36, 0x01, 0x07, 0x6C, 0xBB, 0xBD, 0x9F, 0x2B,
- 0xF1, 0xDC, 0xF8, 0xFB, 0x22, 0x13, 0x1B, 0x40, 0x05, 0xEC, 0xAC, 0xBD, 0xF2, 0x0D, 0x67, 0x7D,
- 0x06, 0x9A, 0x07, 0x1D, 0x0C, 0xA5, 0x1D, 0x9E, 0x92, 0xE2, 0x76, 0x9C, 0x23, 0xD1, 0x9A, 0x00,
- 0xC5, 0x1B, 0x0A, 0x1F, 0x8E, 0xF2, 0x0E, 0xC3, 0xC4, 0xBA, 0x83, 0xFA, 0xF2, 0x53, 0xCB, 0x70,
- 0x64, 0x82, 0x0F, 0x6E, 0x86, 0x09, 0x56, 0x2A, 0x35, 0xFB, 0xA3, 0xBF, 0xA3, 0xD1, 0x62, 0x31,
- 0x3A, 0x5E, 0x71, 0x5C, 0x08, 0xCD, 0x2B, 0xE8, 0xED, 0x42, 0xC7, 0x44, 0x38, 0xD6, 0xD6, 0x19,
- 0x7D, 0xA2, 0x71, 0xC4, 0x13, 0x8D, 0x91, 0xC3, 0x89, 0x18, 0x81, 0xAA, 0xAC, 0x06, 0x3B, 0x82,
- 0x9F, 0x5E, 0xF1, 0x89, 0xE3, 0x34, 0xFA, 0xD6, 0xE5, 0x41, 0x25, 0x0D, 0xE9, 0x0D, 0xF8, 0x0D,
- 0x79, 0xD0, 0x9F, 0x19, 0xD4, 0xE6, 0xD6, 0x77, 0xF5, 0xE9, 0x25, 0xC4, 0x44, 0xBD, 0x6F, 0xE0,
- 0xC4, 0x08, 0xBF, 0x70, 0x4A, 0xDA, 0xC7, 0x12, 0xF9, 0xC4, 0x7F, 0xF0, 0x5F, 0xFD, 0x21, 0x5A,
- 0x68, 0x74, 0x46, 0x45, 0x9F, 0xE1, 0x7E, 0x08, 0x97, 0xDC, 0x68, 0x5F, 0x27, 0xF6, 0xBE, 0x11,
- 0x6F, 0xCB, 0x15, 0x7B, 0xF7, 0x62, 0x62, 0x00, 0xBF, 0xA9, 0x81, 0xA4, 0xC6, 0xAD, 0xE2, 0x56,
- 0xB1, 0x50, 0x51, 0x51, 0xA7, 0x17, 0x90, 0x1A, 0x46, 0xF9, 0x37, 0xCE, 0xDC, 0x63, 0xE0, 0xD0,
- 0xA7, 0x0C, 0xF2, 0x7E, 0xEE, 0x80, 0xA0, 0xCF, 0x1F, 0xF0, 0x7F, 0xEB, 0xC1, 0x03, 0xCE, 0xC0,
- 0xD2, 0xAF, 0xA0, 0x1A, 0x68, 0xB6, 0x56, 0xA1, 0x99, 0x05, 0x4C, 0x15, 0xCB, 0x5D, 0x16, 0x06,
- 0x31, 0xC5, 0x4E, 0xC4, 0x06, 0x10, 0xCB, 0x08, 0xB1, 0x49, 0x38, 0x3D, 0x66, 0x45, 0x31, 0xAF,
- 0xCB, 0x18, 0x75, 0x01, 0x43, 0xB2, 0x27, 0x07, 0x46, 0x46, 0x5F, 0xAF, 0x32, 0xAA, 0x7D, 0x1C,
- 0x6B, 0x06, 0xF3, 0xFF, 0x8B, 0x4F, 0x8C, 0x54, 0xF4, 0x91, 0xA6, 0xF2, 0x32, 0x0F, 0x3A, 0xC0,
- 0xD9, 0x3F, 0xF5, 0xD8, 0x5A, 0x1A, 0x71, 0x10, 0x8F, 0x58, 0x46, 0x90, 0x38, 0xE9, 0x73, 0x1C,
- 0x29, 0xEF, 0x6B, 0xCB, 0xA6, 0xF2, 0x56, 0x17, 0x39, 0x89, 0x93, 0x74, 0x6F, 0xAE, 0xBE, 0x0C,
- 0xC1, 0xB2, 0xAF, 0x2D, 0x39, 0xE4, 0xB0, 0xD4, 0x65, 0x85, 0x67, 0x0F, 0x8C, 0x0F, 0x9C, 0x15,
- 0xC2, 0x25, 0x7A, 0x07, 0x98, 0xE2, 0x3F, 0xE3, 0x03, 0x5C, 0xA2, 0x93, 0xE8, 0xDD, 0x60, 0x7C,
- 0x20, 0x05, 0x6E, 0xAF, 0x87, 0xDC, 0xD7, 0x26, 0x41, 0x90, 0x7C, 0x20, 0x41, 0x48, 0x7D, 0x5F,
- 0x9B, 0x44, 0x41, 0xC3, 0x61, 0xF0, 0xAD, 0xF7, 0x13, 0x93, 0x42, 0x76, 0x07, 0x15, 0x19, 0xD9,
- 0xAD, 0xDA, 0xA3, 0xE3, 0x9E, 0x0C, 0xE4, 0x38, 0x27, 0xF9, 0xA5, 0x1F, 0x6B, 0xC2, 0xB4, 0xCC,
- 0x92, 0x82, 0x3C, 0x40, 0x75, 0xBB, 0xAC, 0x21, 0x43, 0x5B, 0x3D, 0xB2, 0x99, 0x45, 0x1B, 0x32,
- 0x92, 0xE3, 0x9C, 0xE5, 0xD7, 0x92, 0x30, 0x05, 0xA5, 0xD2, 0x2E, 0xE0, 0x41, 0xDD, 0xD9, 0x42,
- 0xA6, 0x46, 0x2C, 0x59, 0xCC, 0xA2, 0x0D, 0x99, 0xC9, 0x71, 0xCE, 0xF2, 0x6B, 0x4E, 0x98, 0x82,
- 0x64, 0x3F, 0xB1, 0x97, 0x81, 0xF1, 0xC3, 0xD4, 0x18, 0x69, 0x26, 0xF9, 0x40, 0x82, 0x20, 0xF9,
- 0xA0, 0x67, 0x91, 0xAF, 0x87, 0x3C, 0x18, 0x7C, 0x10, 0x7B, 0x14, 0x85, 0x63, 0x9E, 0xD5, 0xD5,
- 0x8A, 0xE2, 0x3A, 0x4C, 0x57, 0x45, 0x99, 0x16, 0xA2, 0x5F, 0x1F, 0x2A, 0xA3, 0xAC, 0x53, 0x94,
- 0xBB, 0x59, 0x90, 0x62, 0x6C, 0xEC, 0x4A, 0x17, 0x85, 0x77, 0x26, 0x06, 0x1E, 0x02, 0xE2, 0x68,
- 0xAE, 0x39, 0xFF, 0x10, 0x37, 0xA7, 0xA9, 0xCB, 0x03, 0xE5, 0x43, 0x75, 0xEB, 0xE7, 0xC2, 0xCB,
- 0xD4, 0xD7, 0x16, 0xAB, 0x7B, 0x3C, 0x8F, 0x9D, 0x54, 0xD5, 0x4D, 0x63, 0x8F, 0x6F, 0xFF, 0x8F,
- 0x4E, 0x75, 0xD2, 0x71, 0x0A, 0x8A, 0xDE, 0xDC, 0x7D, 0x46, 0x28, 0x38, 0xA0, 0x79, 0xEE, 0xCD,
- 0x9F, 0x2C, 0x08, 0xC6, 0x8D, 0x9B, 0xD3, 0x18, 0x3E, 0xE0, 0x87, 0x58, 0xD0, 0x41, 0x15, 0xEC,
- 0xB8, 0x8D, 0xAA, 0xBE, 0x0E, 0x07, 0x72, 0xCC, 0x38, 0x2D, 0x48, 0xBD, 0xFD, 0x5F, 0xAB, 0x01,
- 0xAE, 0x7A, 0xF0, 0x69, 0x72, 0x7F, 0x95, 0x29, 0x15, 0x2B, 0xDF, 0x3D, 0x72, 0x18, 0x5A, 0x3D,
- 0x24, 0x1E, 0x02, 0x9F, 0x79, 0x42, 0xF1, 0x1D, 0xF0, 0xA0, 0x8B, 0x79, 0x3C, 0xE4, 0x90, 0x7A,
- 0x22, 0xB0, 0xB3, 0x32, 0x8C, 0x43, 0x38, 0xF4, 0x93, 0x3B, 0xF0, 0x5E, 0x3B, 0x5D, 0x83, 0x1F,
- 0x9B, 0x61, 0xCF, 0xE2, 0x66, 0x14, 0x58, 0x0D, 0xAD, 0x33, 0x9E, 0xA0, 0x24, 0x31, 0x61, 0xDF,
- 0x71, 0xE1, 0x5E, 0xFD, 0x10, 0x04, 0x86, 0xBF, 0xDB, 0x77, 0x84, 0xB2, 0x7C, 0xB5, 0x11, 0x12,
- 0x02, 0xFC, 0xC7, 0x27, 0xA6, 0x39, 0x6C, 0x8A, 0x4E, 0x05, 0x33, 0x06, 0x85, 0x59, 0xDE, 0x78,
- 0xB6, 0xE9, 0xF2, 0xBA, 0x76, 0x1E, 0x09, 0x2B, 0x51, 0x76, 0x70, 0x08, 0x3B, 0xC7, 0x24, 0x26,
- 0xBF, 0x3D, 0x0C, 0xCC, 0x29, 0xE6, 0xC3, 0xEE, 0x6B, 0xF0, 0x81, 0x38, 0x8A, 0x82, 0x1D, 0x62,
- 0x51, 0x45, 0x07, 0x55, 0xB8, 0xED, 0xC7, 0x6D, 0xE8, 0xD8, 0x35, 0x50, 0x6C, 0x74, 0x39, 0x5B,
- 0x8C, 0x3B, 0xA0, 0x94, 0x52, 0xB8, 0xF8, 0x5F, 0x8B, 0xB0, 0xB6, 0x19, 0xFC, 0xF7, 0xAD, 0x0F,
- 0x4C, 0x6A, 0x50, 0xA3, 0xC3, 0x0E, 0xC3, 0xDE, 0x16, 0xF5, 0x47, 0x53, 0x1B, 0x5A, 0xFE, 0xDF,
- 0xF1, 0xC0, 0x84, 0x0F, 0xD4, 0xF6, 0x9F, 0xC5, 0xD1, 0x24, 0x8D, 0x83, 0x6A, 0xCA, 0x42, 0xAB,
- 0x7E, 0xE8, 0xC6, 0x10, 0x76, 0x72, 0x87, 0x38, 0x4F, 0x43, 0x9C, 0xAE, 0x71, 0x34, 0xF6, 0xBC,
- 0x10, 0xC2, 0x3C, 0x55, 0xDD, 0x7A, 0x23, 0xD4, 0xB6, 0xA8, 0xDB, 0x5E, 0x6A, 0x19, 0xFF, 0x80,
- 0xBA, 0xE9, 0x5A, 0xA8, 0x6D, 0x47, 0x77, 0xE8, 0xF2, 0x3F, 0xC0, 0xAE, 0x51, 0x13, 0x83, 0x55,
- 0xDB, 0x56, 0x7D, 0x49, 0x0F, 0x61, 0x0F, 0xB4, 0xDD, 0xD4, 0xA8, 0x7E, 0xA7, 0x9B, 0x9F, 0xF3,
- 0x73, 0x1F, 0x7B, 0x58, 0xDE, 0x58, 0xC9, 0xED, 0xA0, 0xCB, 0xF9, 0xE2, 0x3C, 0x92, 0x30, 0x3F,
- 0x16, 0x04, 0xDF, 0xA1, 0xBF, 0x38, 0xC7, 0x24, 0xB7, 0x78, 0xEE, 0x63, 0xCA, 0x91, 0xDD, 0xD7,
- 0xC8, 0x96, 0x1F, 0x6D, 0x4B, 0x57, 0x5D, 0xB3, 0x97, 0x1D, 0x62, 0x31, 0xCC, 0x3F, 0x71, 0xFF,
- 0x9D, 0x40, 0x15, 0x37, 0xA7, 0xC5, 0xFE, 0x84, 0x3A, 0x06, 0x66, 0xEF, 0xB1, 0x7B, 0x2E, 0x5A,
- 0xB4, 0xCE, 0x75, 0x68, 0x94, 0xB8, 0x89, 0x34, 0x8E, 0xC0, 0x6B, 0xE7, 0x0F, 0xA6, 0x2E, 0x83,
- 0x8A, 0x6F, 0x0D, 0x0F, 0x0C, 0xC2, 0xE2, 0x1F, 0x4D, 0xFC, 0x71, 0xBF, 0xFD, 0xA9, 0x44, 0xC0,
- 0x43, 0x3A, 0xF6, 0xDF, 0x59, 0x75, 0x02, 0xB7, 0x9D, 0x17, 0xB1, 0x43, 0x37, 0xD8, 0xC9, 0x1D,
- 0x50, 0x35, 0x37, 0x02, 0xBE, 0xD3, 0xBE, 0x85, 0x1F, 0xF4, 0x59, 0xF8, 0x01, 0x1D, 0x9B, 0x81,
- 0xA1, 0x61, 0x7B, 0x16, 0x5B, 0x07, 0x44, 0xA0, 0x32, 0x8C, 0x89, 0x57, 0xBA, 0x22, 0x23, 0x96,
- 0xC1, 0xA5, 0xEF, 0x9D, 0x98, 0xBA, 0x04, 0xDD, 0x78, 0x5A, 0xC8, 0xF1, 0xEA, 0x1B, 0x61, 0x4A,
- 0xD9, 0x80, 0x69, 0x65, 0x03, 0xB4, 0x10, 0xF6, 0x80, 0xBB, 0x74, 0xEC, 0xA1, 0xAF, 0xA6, 0x92,
- 0x37, 0x3B, 0x02, 0xE5, 0xE0, 0x3B, 0x30, 0x98, 0xE5, 0x6D, 0x24, 0x65, 0x3B, 0xC8, 0x8A, 0xEF,
- 0x07, 0xEB, 0x87, 0x3C, 0xF2, 0xE8, 0xBC, 0x91, 0x74, 0x7A, 0x09, 0x1E, 0x0B, 0x82, 0xF9, 0xAF,
- 0xE1, 0xE7, 0x98, 0xC4, 0x16, 0x69, 0xCF, 0x81, 0xE5, 0xF4, 0x03, 0x87, 0xF3, 0x54, 0x9C, 0xFB,
- 0x07, 0x71, 0x0F, 0xAA, 0x40, 0x28, 0x1F, 0x46, 0x6F, 0xD6, 0x64, 0x7C, 0xBF, 0x0E, 0x14, 0xA7,
- 0x6A, 0x1B, 0xED, 0x5A, 0x58, 0xF4, 0xEA, 0x93, 0xCC, 0x2B, 0xB0, 0x6A, 0x01, 0x4C, 0xED, 0x54,
- 0x55, 0x35, 0xA5, 0x5A, 0x8F, 0x05, 0xCB, 0x82, 0xE9, 0x10, 0x0E, 0x06, 0xD3, 0x79, 0x1A, 0x04,
- 0xC7, 0xF3, 0x42, 0x5A, 0x07, 0x1E, 0x52, 0x5B, 0x9C, 0x5E, 0xCB, 0xBF, 0xF4, 0xA9, 0xC7, 0xEE,
- 0x74, 0xF0, 0x07, 0xDF, 0x89, 0xD3, 0xD3, 0xA9, 0xB3, 0x9B, 0x36, 0x30, 0x1F, 0xA7, 0x07, 0xF3,
- 0x13, 0x46, 0x58, 0xB6, 0xCF, 0xB0, 0xE2, 0x4B, 0x78, 0x1E, 0x49, 0x8E, 0xC0, 0x72, 0xEA, 0x14,
- 0x60, 0x2F, 0x30, 0x3A, 0x8A, 0x62, 0xCF, 0xA4, 0xC3, 0xFC, 0x84, 0x0C, 0xDC, 0x4C, 0xE4, 0xD4,
- 0x98, 0x29, 0x97, 0xBF, 0x24, 0x5A, 0xD3, 0x19, 0x27, 0xB0, 0x7F, 0xF0, 0xFA, 0x73, 0x23, 0x36,
- 0x23, 0x63, 0xD4, 0xF1, 0x53, 0xC7, 0x9F, 0x19, 0x35, 0xDA, 0x7D, 0xDC, 0xB6, 0xB1, 0x73, 0x06,
- 0xF5, 0x19, 0x96, 0xD2, 0x11, 0x0D, 0xC9, 0x00, 0x4F, 0xFB, 0x80, 0x3D, 0x13, 0x3F, 0xA0, 0x2C,
- 0x54, 0xD9, 0x0F, 0xDD, 0x30, 0x9D, 0xA7, 0x01, 0xDA, 0xB1, 0x19, 0xF6, 0x2C, 0x4E, 0x29, 0x83,
- 0xAD, 0x62, 0x47, 0xA4, 0xBB, 0x71, 0x0D, 0x6C, 0x9D, 0xAC, 0x71, 0xCA, 0xBF, 0x3C, 0x76, 0xAB,
- 0xBE, 0x93, 0x5B, 0x84, 0xD4, 0x35, 0x61, 0xDC, 0xB6, 0x15, 0xFE, 0x13, 0x2B, 0xBA, 0x7F, 0x5A,
- 0x38, 0xCB, 0x1B, 0x3B, 0x5B, 0x64, 0x05, 0x2B, 0x3E, 0x71, 0x1E, 0x09, 0x1D, 0x1C, 0x42, 0xC7,
- 0x82, 0x80, 0x76, 0x8E, 0x49, 0x8E, 0xFB, 0x07, 0xE0, 0x78, 0xEC, 0x89, 0xBD, 0xB9, 0xF2, 0xFD,
- 0x7E, 0xEE, 0xC3, 0x45, 0xFB, 0xFB, 0x57, 0xFB, 0xE1, 0xA2, 0x7B, 0x60, 0xD5, 0xD8, 0x8B, 0x1C,
- 0xB3, 0x7C, 0xD1, 0x17, 0x1B, 0x47, 0x33, 0x87, 0xFF, 0xD0, 0xD8, 0xE5, 0x50, 0x59, 0xED, 0xBD,
- 0xEC, 0x2B, 0xCB, 0x61, 0x76, 0x95, 0x8A, 0x4D, 0x06, 0xFE, 0x80, 0xFF, 0x00, 0x4A, 0xE6, 0xE2,
- 0x43, 0x86, 0x35, 0x0D, 0xFF, 0xEF, 0xC6, 0x80, 0x72, 0xC8, 0xB4, 0x9B, 0x3E, 0x21, 0x7E, 0x37,
- 0xF7, 0x01, 0x14, 0x5E, 0x7D, 0x28, 0x0B, 0xCB, 0xAF, 0x9E, 0xFB, 0x30, 0xF8, 0xFE, 0x5B, 0x0F,
- 0xC2, 0xF3, 0x34, 0xA0, 0xBF, 0x9E, 0x65, 0xCA, 0x2B, 0xC6, 0xB4, 0x3D, 0x5E, 0xFA, 0x55, 0xDC,
- 0xC8, 0xC6, 0xB3, 0x07, 0xBE, 0xFA, 0x01, 0xF7, 0x16, 0x1F, 0xD2, 0x43, 0x1E, 0xFE, 0xA2, 0x1E,
- 0x8B, 0x87, 0x94, 0x6E, 0x1C, 0x81, 0x71, 0xDD, 0xFF, 0xFE, 0x20, 0x2C, 0x2E, 0xB7, 0x67, 0x23,
- 0x55, 0xE0, 0x09, 0x23, 0x98, 0x37, 0x3C, 0x5B, 0x04, 0x2E, 0xFA, 0xF1, 0x78, 0x2A, 0xBE, 0x20,
- 0x3F, 0x8F, 0x84, 0x97, 0x28, 0xB5, 0xB1, 0xBE, 0x0D, 0x73, 0x1F, 0x30, 0x72, 0x9F, 0x3B, 0x50,
- 0x8E, 0xEC, 0xE6, 0xDE, 0x92, 0xD7, 0x57, 0xAE, 0xBD, 0x3D, 0x9B, 0xEB, 0x0B, 0x29, 0x6A, 0x4D,
- 0x3B, 0xA3, 0x8B, 0x2C, 0x6E, 0xFF, 0x7A, 0xB5, 0xC5, 0xAE, 0x5D, 0xB7, 0x90, 0x89, 0x1C, 0x67,
- 0xB5, 0x48, 0x6D, 0xB0, 0xE5, 0xD7, 0xBC, 0xFC, 0x1C, 0xB4, 0xE8, 0x2B, 0xE7, 0xCD, 0x51, 0x14,
- 0x59, 0xCB, 0x48, 0xF5, 0x2D, 0x99, 0x63, 0x83, 0x24, 0xA0, 0x8D, 0xCD, 0xF2, 0xE9, 0x70, 0x8F,
- 0xB8, 0xC7, 0x95, 0x18, 0x7C, 0x90, 0x37, 0xD9, 0xCD, 0x5A, 0x46, 0x16, 0x75, 0x9B, 0x42, 0x4A,
- 0xC8, 0xC7, 0xC3, 0x5D, 0xE2, 0xE6, 0x49, 0xAE, 0x2F, 0xF4, 0x32, 0xB0, 0x06, 0xA1, 0xD6, 0x64,
- 0x0F, 0x97, 0x43, 0xF2, 0x81, 0x04, 0x21, 0x85, 0xEE, 0x6B, 0x4D, 0xFE, 0xAB, 0xB7, 0x17, 0x40,
- 0x16, 0x2D, 0xC8, 0x59, 0x7E, 0x63, 0x12, 0x4E, 0x9E, 0x0F, 0x0A, 0x60, 0xB3, 0x4B, 0xA1, 0xED,
- 0xC7, 0xC9, 0x49, 0x7E, 0x49, 0x37, 0xD1, 0x9A, 0x70, 0x6A, 0x7A, 0xAA, 0x05, 0xF0, 0xA9, 0x15,
- 0xDA, 0x7E, 0x9C, 0x5C, 0xE4, 0xD7, 0x61, 0x83, 0x7E, 0xAA, 0xFA, 0x89, 0x12, 0xE7, 0x00, 0xE2,
- 0xE8, 0xD7, 0xCA, 0x7E, 0xA2, 0x04, 0x41, 0xF2, 0x81, 0x04, 0x41, 0xEE, 0x7B, 0xEF, 0xF5, 0x30,
- 0xF6, 0xBD, 0xF7, 0xE4, 0x7E, 0x0A, 0x89, 0x3C, 0x03, 0xEF, 0x30, 0x88, 0x7E, 0x62, 0xCF, 0xAD,
- 0x77, 0x48, 0xE4, 0x18, 0xB6, 0x41, 0x8A, 0x98, 0x59, 0x94, 0xE3, 0x85, 0x5E, 0x07, 0xCB, 0x4E,
- 0x57, 0xED, 0x44, 0xD5, 0xAC, 0xF5, 0x13, 0x37, 0x6B, 0x0A, 0x8B, 0x16, 0x8F, 0xED, 0x31, 0xFA,
- 0xAA, 0xA4, 0x2A, 0xAA, 0x5D, 0xAD, 0x7E, 0x12, 0x59, 0x42, 0x30, 0x68, 0x40, 0xF3, 0xCB, 0x1A,
- 0x1F, 0xF4, 0x7B, 0x8B, 0x69, 0x29, 0x93, 0xBE, 0x17, 0x56, 0x3E, 0x6E, 0x6B, 0x40, 0x0F, 0x08,
- 0xDC, 0x78, 0x44, 0xFD, 0xBE, 0x5E, 0xC9, 0x5C, 0xAD, 0x39, 0xED, 0x14, 0x24, 0x32, 0x88, 0xAC,
- 0xF1, 0x01, 0x6A, 0x85, 0x92, 0x9E, 0xE2, 0x96, 0xAB, 0x42, 0x9B, 0xE7, 0x36, 0xAA, 0xEA, 0xD7,
- 0x8F, 0x93, 0x47, 0xA4, 0xC5, 0xDC, 0x0E, 0xD5, 0x3C, 0xA0, 0xB6, 0x3F, 0xB7, 0x3F, 0x4D, 0xFA,
- 0x12, 0x19, 0x45, 0xD6, 0xF8, 0xC0, 0xBF, 0xF4, 0x57, 0xF4, 0x33, 0xE3, 0xF4, 0xA9, 0x5D, 0x07,
- 0x50, 0x23, 0xED, 0xAB, 0xC3, 0xD1, 0x23, 0x30, 0xBE, 0x7D, 0x84, 0xBF, 0x62, 0x77, 0xD1, 0xA0,
- 0x3E, 0xC7, 0x21, 0x30, 0xEA, 0xF8, 0xC5, 0xF7, 0x83, 0xFF, 0xFB, 0x50, 0x3F, 0x1A, 0xB7, 0x1B,
- 0x60, 0x4C, 0xF3, 0xB6, 0x03, 0x80, 0xED, 0xCC, 0xAF, 0x15, 0x77, 0x1B, 0x28, 0x0F, 0x19, 0x7B,
- 0x11, 0xBA, 0xBD, 0xCD, 0x40, 0x22, 0x0E, 0xB2, 0x37, 0x8F, 0x54, 0xC1, 0x76, 0x04, 0xBC, 0x35,
- 0xB0, 0xFF, 0x4A, 0x21, 0x03, 0x2A, 0x9A, 0xFC, 0xF5, 0xD3, 0x3B, 0x03, 0x75, 0xD3, 0x3B, 0x3F,
- 0x7E, 0xEC, 0x69, 0xD8, 0x35, 0x9C, 0xF4, 0x15, 0x5B, 0x9F, 0xFF, 0x44, 0xB0, 0x4A, 0x7D, 0xF5,
- 0x1A, 0xD4, 0x12, 0x35, 0x6D, 0x3B, 0x08, 0x43, 0xDB, 0x95, 0xC7, 0x98, 0xC2, 0x20, 0x06, 0x6E,
- 0x7B, 0xF8, 0x04, 0xDB, 0x7F, 0x40, 0x3B, 0x0E, 0x1C, 0xF5, 0x90, 0x25, 0xD2, 0x81, 0x6D, 0x27,
- 0x4B, 0xF6, 0x0A, 0xF6, 0xD2, 0x3F, 0x87, 0x6B, 0x8B, 0x94, 0x25, 0xD5, 0xD1, 0x0A, 0xA1, 0x28,
- 0x7D, 0xE9, 0x9F, 0xF5, 0x8F, 0x79, 0xD6, 0x1F, 0xE0, 0x5D, 0xB4, 0x84, 0x0F, 0x81, 0x09, 0x7F,
- 0xF4, 0xA0, 0x7A, 0xF1, 0xA5, 0xF5, 0xC8, 0x33, 0xF8, 0xB9, 0x5F, 0xD2, 0xC1, 0xB7, 0x1D, 0x40,
- 0xED, 0xF0, 0x7A, 0xAE, 0xD5, 0x8A, 0x81, 0x33, 0x06, 0x9C, 0x61, 0xFB, 0x0F, 0x68, 0xC7, 0x41,
- 0x6A, 0x39, 0x90, 0x88, 0x0F, 0xBF, 0x8D, 0x11, 0xB2, 0xC7, 0x07, 0xA5, 0xB7, 0x7F, 0x80, 0xFD,
- 0x83, 0x3D, 0x5E, 0xF7, 0x71, 0xB1, 0x11, 0xA2, 0xF4, 0x76, 0x7D, 0x47, 0xC4, 0xC5, 0xB7, 0x1D,
- 0xDA, 0x88, 0xDA, 0xE4, 0x81, 0x71, 0xEF, 0xE8, 0x6A, 0xC2, 0x6D, 0xA6, 0x6D, 0x07, 0x45, 0x53,
- 0x7F, 0x23, 0xB6, 0x1A, 0x99, 0x50, 0x63, 0x3E, 0x42, 0x55, 0xA2, 0x7B, 0x20, 0x26, 0xB0, 0x30,
- 0x42, 0x16, 0x05, 0x6D, 0x9F, 0x17, 0xD9, 0x8F, 0x7F, 0xFD, 0x04, 0x1C, 0x33, 0xFC, 0x12, 0xFF,
- 0xFB, 0xFC, 0x9A, 0x79, 0xE0, 0x9E, 0x01, 0x98, 0x7A, 0xCD, 0x0C, 0x2F, 0xB4, 0xF6, 0x13, 0x6C,
- 0xC0, 0xB6, 0x18, 0x98, 0xB6, 0x1D, 0x74, 0xC2, 0x0D, 0x0B, 0xEE, 0x86, 0x56, 0xEC, 0x45, 0xE0,
- 0xCD, 0xAE, 0x61, 0x9F, 0x60, 0x9E, 0x33, 0x3E, 0x2A, 0x8C, 0x2D, 0xC5, 0x85, 0x00, 0xCE, 0x02,
- 0x66, 0x46, 0xC8, 0xE2, 0x3C, 0xD2, 0xAC, 0xEF, 0xF2, 0xB9, 0xAA, 0x79, 0x9B, 0x70, 0x9B, 0xDB,
- 0x6C, 0xDC, 0x38, 0x36, 0xEB, 0x3B, 0x78, 0x5E, 0x17, 0x94, 0x3E, 0x36, 0x62, 0xF1, 0xDA, 0x4B,
- 0x3F, 0x5C, 0x02, 0xB0, 0x35, 0x8C, 0x3B, 0xE1, 0x06, 0x9E, 0x2D, 0xC2, 0x1D, 0x10, 0x1D, 0xD0,
- 0xC7, 0xB4, 0xED, 0x00, 0xB1, 0x70, 0x2C, 0xAC, 0xC0, 0x9F, 0xDA, 0x22, 0xDC, 0x08, 0xC1, 0xF3,
- 0xE8, 0xFB, 0x1D, 0xC6, 0x8E, 0xD1, 0xAB, 0x93, 0x48, 0x07, 0xB1, 0xEA, 0xAA, 0x6C, 0xFF, 0x42,
- 0x76, 0xF4, 0xE8, 0x03, 0x13, 0xAB, 0xAC, 0x5B, 0x57, 0x62, 0x3C, 0xBA, 0x44, 0xEB, 0xA7, 0xAA,
- 0x2C, 0xAA, 0xE6, 0xDB, 0xBF, 0x53, 0x95, 0x1A, 0x01, 0x89, 0x18, 0x58, 0x37, 0x32, 0xD4, 0xDE,
- 0x5E, 0xC3, 0x18, 0x20, 0x8B, 0xED, 0x82, 0x7F, 0x99, 0x6D, 0xAF, 0x58, 0x8C, 0x47, 0x6A, 0x40,
- 0x5B, 0x1B, 0x73, 0xB5, 0x83, 0xDF, 0x25, 0x32, 0x8C, 0x6C, 0x0E, 0xC4, 0xBE, 0x65, 0xDF, 0x2B,
- 0x16, 0xE3, 0xD1, 0x15, 0x4A, 0x77, 0x99, 0xC4, 0xC1, 0x22, 0x55, 0x0D, 0xA6, 0x28, 0x4F, 0x24,
- 0x92, 0x85, 0x5C, 0x67, 0xEA, 0x75, 0xD0, 0x96, 0x96, 0x2C, 0xC8, 0x36, 0x1F, 0xD8, 0x5B, 0x78,
- 0x67, 0x6C, 0xBF, 0x04, 0x56, 0xA6, 0xBE, 0x4F, 0x5E, 0x7B, 0x2A, 0x99, 0x34, 0xE2, 0xA7, 0x90,
- 0xCC, 0xD3, 0xC9, 0xBD, 0x45, 0x2A, 0xC8, 0x3C, 0xC5, 0x64, 0x11, 0xA7, 0xAB, 0x1D, 0x50, 0x03,
- 0x81, 0xAA, 0x09, 0x6A, 0x0B, 0x1E, 0xC4, 0xB7, 0x58, 0x6D, 0x99, 0x4E, 0x96, 0x0B, 0x08, 0x86,
- 0x2B, 0x3D, 0x10, 0x3D, 0x28, 0x3E, 0x30, 0xFD, 0xB4, 0x89, 0x4E, 0x5C, 0x9A, 0xED, 0x65, 0x47,
- 0x92, 0xA1, 0x19, 0xEF, 0xA9, 0x24, 0x72, 0x9D, 0x20, 0x05, 0xED, 0x99, 0xF6, 0xCF, 0x88, 0x67,
- 0xB7, 0xB1, 0x92, 0x70, 0x83, 0xC2, 0x1E, 0x79, 0xAA, 0x12, 0xBD, 0x2D, 0x74, 0x63, 0x12, 0xB1,
- 0x7A, 0xE8, 0x74, 0x12, 0xA2, 0xBB, 0xE5, 0xDB, 0x0D, 0x60, 0x8D, 0x9B, 0xC1, 0x19, 0x40, 0xF4,
- 0x0F, 0x02, 0x13, 0x0E, 0xA9, 0xED, 0x7B, 0x93, 0xE0, 0xA6, 0xA4, 0x41, 0xB6, 0x30, 0x82, 0xE3,
- 0x77, 0x25, 0x25, 0x6F, 0xAC, 0xCB, 0x4F, 0xC9, 0x22, 0x95, 0xA7, 0xBA, 0x8E, 0xBB, 0xB9, 0xE4,
- 0x24, 0x77, 0x6C, 0xC7, 0x65, 0xB1, 0xB5, 0xF0, 0xB3, 0x43, 0xEA, 0xD6, 0x6B, 0x70, 0xFE, 0x73,
- 0xDD, 0xF2, 0xAE, 0x7B, 0x50, 0x96, 0x5E, 0x8C, 0x4E, 0x27, 0x5F, 0x61, 0x3F, 0xF0, 0x8E, 0xFB,
- 0x6A, 0x6F, 0xE9, 0xF5, 0x80, 0xFF, 0x35, 0x58, 0xB7, 0xBB, 0xE8, 0x6E, 0xB6, 0xDE, 0x43, 0xAE,
- 0x41, 0x26, 0x23, 0x52, 0xAD, 0x5E, 0x5A, 0xF6, 0x49, 0x19, 0xAD, 0x33, 0x70, 0x84, 0x80, 0x13,
- 0xC6, 0x6C, 0xD1, 0x88, 0xD3, 0x7C, 0xC2, 0x77, 0xDC, 0xBC, 0xA2, 0x44, 0xD4, 0x5B, 0x70, 0xF9,
- 0x69, 0x5A, 0x33, 0xC5, 0x42, 0x4F, 0x66, 0x98, 0x84, 0x7C, 0x9B, 0x79, 0xF2, 0x81, 0x32, 0x8C,
- 0xC6, 0x2E, 0x9C, 0x0E, 0xCB, 0x8E, 0xF6, 0x14, 0xAD, 0x3B, 0xB1, 0x34, 0x04, 0x92, 0x4B, 0xA1,
- 0x9E, 0xA2, 0x70, 0x6A, 0x78, 0xED, 0xCB, 0x27, 0xAF, 0xE6, 0x69, 0x93, 0x99, 0xEF, 0xD2, 0xB2,
- 0x18, 0x0D, 0xB0, 0x71, 0x7E, 0x1B, 0x36, 0x1F, 0xE4, 0x56, 0x9D, 0xF8, 0x62, 0x18, 0xB3, 0xB4,
- 0x75, 0x84, 0x0A, 0xC9, 0x94, 0x17, 0x7A, 0xCB, 0x66, 0x6D, 0x79, 0xCC, 0xA0, 0xC3, 0x8B, 0x8D,
- 0x45, 0xD3, 0x72, 0xAF, 0x5B, 0xEC, 0x32, 0x52, 0xCD, 0x01, 0xE2, 0x9C, 0x7B, 0x28, 0xDA, 0x85,
- 0xA7, 0x60, 0x36, 0x8A, 0x0C, 0x21, 0xAD, 0xB6, 0xCD, 0x26, 0x17, 0xDD, 0xB4, 0x4C, 0x3F, 0x5D,
- 0xD2, 0xA8, 0x3E, 0xDD, 0xD8, 0xE2, 0x49, 0x51, 0x72, 0x1B, 0xED, 0xC2, 0xD9, 0xF2, 0x46, 0x41,
- 0x97, 0x68, 0xBA, 0x57, 0xB2, 0xE0, 0x6D, 0xB3, 0xC9, 0xB5, 0xAD, 0x52, 0x50, 0x9F, 0xDE, 0xD9,
- 0xCE, 0x62, 0x9D, 0xE6, 0xC1, 0x2D, 0xE4, 0x7B, 0x80, 0x25, 0xDF, 0xF9, 0x28, 0xF9, 0xD0, 0x45,
- 0xC4, 0x60, 0x41, 0xDA, 0x53, 0x22, 0x8B, 0xE6, 0x76, 0x21, 0x89, 0x14, 0x5A, 0xDC, 0x0F, 0x0B,
- 0x6A, 0x67, 0x87, 0xE1, 0x9D, 0x78, 0x5A, 0xFC, 0xB6, 0xE3, 0x19, 0xC4, 0xB0, 0x92, 0x7E, 0xB0,
- 0x5D, 0x40, 0xDB, 0x80, 0xCC, 0x9B, 0x5E, 0xFF, 0xB5, 0xCA, 0x4E, 0x2C, 0x17, 0x5E, 0x34, 0xA6,
- 0xBC, 0xE0, 0x9A, 0x3A, 0x51, 0x7D, 0x18, 0x93, 0x32, 0xD3, 0x61, 0xAF, 0x70, 0x90, 0xBF, 0x3A,
- 0xCB, 0x3D, 0xA6, 0xF4, 0x9A, 0xC8, 0x92, 0x39, 0xD5, 0x9E, 0x87, 0xAD, 0x59, 0x60, 0x4D, 0x43,
- 0xD5, 0x04, 0x8D, 0x0F, 0x54, 0x6C, 0x16, 0xD9, 0x2B, 0xB2, 0x1A, 0xAC, 0xA4, 0x12, 0xE6, 0x85,
- 0x7C, 0x76, 0x58, 0x31, 0xBE, 0x6A, 0xCA, 0xD0, 0x6A, 0xBE, 0x0D, 0xCB, 0x88, 0x38, 0x82, 0x68,
- 0x08, 0x9A, 0x3C, 0x05, 0xAA, 0x3C, 0x8D, 0x3A, 0xAB, 0x3E, 0xCE, 0x37, 0xA2, 0x2E, 0xD0, 0xD7,
- 0x54, 0xC7, 0xFA, 0x53, 0x50, 0x7C, 0x90, 0x82, 0x58, 0xB8, 0x89, 0x55, 0x2D, 0x7C, 0xD0, 0x75,
- 0x0A, 0xDA, 0x5B, 0x1A, 0x77, 0x46, 0x8E, 0x39, 0x83, 0x94, 0x34, 0x3E, 0xB5, 0x52, 0x7D, 0x74,
- 0xB6, 0xFA, 0x28, 0x7D, 0x29, 0x58, 0xBF, 0xEC, 0x89, 0x92, 0x46, 0x0C, 0x43, 0x7F, 0x9D, 0x16,
- 0xCB, 0x0B, 0x7B, 0x92, 0x27, 0x65, 0xA6, 0xC3, 0x5F, 0xC1, 0x78, 0x29, 0x4E, 0x81, 0xA7, 0x67,
- 0x8E, 0x9D, 0x03, 0x24, 0xEA, 0x1F, 0x20, 0x2E, 0x6E, 0x67, 0xA7, 0xF4, 0xDA, 0xCD, 0x4C, 0x75,
- 0xD3, 0x88, 0x54, 0x27, 0xF0, 0x9E, 0x82, 0x69, 0xE0, 0x6F, 0x4E, 0xC1, 0xA0, 0xCE, 0x62, 0x09,
- 0x4B, 0x46, 0x7E, 0xF2, 0x8D, 0x59, 0x4D, 0x60, 0x31, 0xC6, 0x52, 0xD0, 0x99, 0x2E, 0xF2, 0xD4,
- 0x75, 0x0A, 0xF6, 0x3B, 0x2B, 0x4A, 0x97, 0x1F, 0xFB, 0xE5, 0x32, 0xF8, 0xEE, 0xFC, 0x23, 0xCB,
- 0x54, 0xAC, 0x30, 0xC3, 0x88, 0x0A, 0x59, 0xDA, 0xE2, 0x56, 0x9E, 0x8C, 0xBC, 0xC4, 0xC9, 0x06,
- 0x7F, 0x85, 0x44, 0x89, 0xE4, 0x0A, 0x09, 0xFB, 0x07, 0xAD, 0x17, 0x03, 0x44, 0x06, 0x0F, 0xA6,
- 0x35, 0x20, 0xB1, 0xDE, 0x83, 0x2E, 0x93, 0x11, 0xA9, 0x34, 0xFB, 0x07, 0x04, 0xB2, 0x48, 0x25,
- 0x9C, 0xB4, 0xC2, 0x84, 0x30, 0xAD, 0x28, 0xE9, 0x26, 0xAA, 0x4C, 0xB1, 0x00, 0x5A, 0xC9, 0xF7,
- 0x0C, 0x4B, 0xBE, 0xCF, 0x6D, 0xE8, 0x5F, 0x4A, 0x17, 0x1E, 0x83, 0x05, 0x1D, 0xD3, 0x0D, 0x5B,
- 0xB1, 0x38, 0x74, 0x4E, 0xF3, 0x6A, 0xAE, 0xE0, 0x96, 0x6C, 0x0A, 0xE2, 0x8E, 0xD6, 0x42, 0xB5,
- 0x88, 0x0C, 0xAB, 0xEF, 0xF6, 0x2F, 0x5D, 0x03, 0xAD, 0x2B, 0x07, 0x61, 0x70, 0x64, 0xA5, 0x65,
- 0x64, 0xB7, 0x75, 0xF2, 0x70, 0x61, 0x69, 0xAB, 0xAE, 0xC9, 0x94, 0x97, 0x38, 0x53, 0xA4, 0x2C,
- 0x2C, 0xC2, 0xA2, 0xE9, 0xB9, 0xD7, 0x2C, 0x76, 0xC5, 0xA4, 0xDA, 0xA3, 0x48, 0xDC, 0x3F, 0x40,
- 0x09, 0x48, 0xE3, 0xA4, 0xA7, 0x60, 0xF1, 0x53, 0x00, 0x03, 0x51, 0x68, 0xA1, 0xEB, 0x35, 0x72,
- 0x9D, 0xC5, 0xF6, 0x12, 0x5B, 0xC9, 0x94, 0xFB, 0x07, 0xA2, 0x5D, 0x40, 0x19, 0xC8, 0x1B, 0x1A,
- 0xF2, 0x7C, 0x8A, 0x51, 0xC6, 0x1F, 0xFC, 0xD5, 0xA4, 0x36, 0xA3, 0xAE, 0x35, 0x47, 0x42, 0xC2,
- 0x53, 0x1B, 0xBD, 0x58, 0x65, 0xC9, 0xB3, 0xA7, 0x57, 0xEA, 0x17, 0x6C, 0x5B, 0x31, 0x88, 0x87,
- 0xD3, 0x53, 0x2C, 0x0E, 0x3E, 0xA5, 0x8D, 0x0B, 0x93, 0x4A, 0xC1, 0x68, 0x3A, 0x3A, 0x71, 0x8C,
- 0xC8, 0x1E, 0x50, 0x89, 0x12, 0x3C, 0xCC, 0xC8, 0x3C, 0x4A, 0x25, 0xA1, 0x8F, 0x1B, 0x4D, 0x91,
- 0xF1, 0x6E, 0x35, 0xF9, 0x61, 0xD1, 0x18, 0x79, 0xD1, 0xDE, 0x52, 0x93, 0xF4, 0x44, 0x87, 0xF5,
- 0x07, 0x58, 0xB2, 0xBC, 0x8D, 0x15, 0xB9, 0x2F, 0xA6, 0x6E, 0x0A, 0xC5, 0x33, 0x52, 0xCD, 0x01,
- 0x9C, 0xFB, 0x07, 0x59, 0x5C, 0x67, 0xEA, 0x49, 0x64, 0x68, 0x01, 0xAA, 0x2B, 0x32, 0x19, 0xB5,
- 0xB4, 0x95, 0x2B, 0xD8, 0xE5, 0x41, 0xB6, 0xD7, 0x99, 0x7A, 0x12, 0x67, 0xAF, 0xEB, 0x36, 0x09,
- 0x42, 0x57, 0x64, 0x7A, 0xD8, 0xD2, 0x56, 0x56, 0xE0, 0xDC, 0x3F, 0x38, 0x47, 0xE4, 0x81, 0x44,
- 0xF2, 0x38, 0x97, 0xE5, 0x81, 0x44, 0xD2, 0x48, 0x3C, 0x9F, 0x98, 0x17, 0x88, 0xDD, 0xC7, 0x64,
- 0xF1, 0x89, 0xD9, 0x0C, 0x65, 0xEC, 0x99, 0x8A, 0xD9, 0x3D, 0x95, 0xD0, 0x3B, 0x31, 0xE2, 0x3F,
- 0x94, 0x16, 0x39, 0x44, 0xDC, 0xFD, 0x59, 0x71, 0x08, 0xA6, 0xB4, 0x9F, 0x2B, 0xD5, 0x4C, 0x39,
- 0x8F, 0x17, 0x34, 0x3E, 0xE0, 0x7B, 0x8B, 0x8C, 0x0C, 0x74, 0x7B, 0x6B, 0x99, 0x9D, 0x20, 0xF3,
- 0x9B, 0x11, 0xEA, 0x06, 0x5D, 0xDA, 0x0C, 0x45, 0x4B, 0x86, 0x7C, 0x7B, 0x14, 0xF9, 0x88, 0x3D,
- 0x53, 0x38, 0x77, 0xAB, 0xB9, 0x6C, 0x9B, 0xE6, 0x34, 0xEF, 0x98, 0x51, 0x3E, 0xF9, 0xD2, 0x44,
- 0x31, 0x9D, 0x2A, 0x83, 0xD9, 0xC4, 0x49, 0x60, 0xED, 0x98, 0x88, 0xBB, 0xF5, 0x87, 0x88, 0x96,
- 0x08, 0x30, 0x6D, 0xC9, 0x32, 0x25, 0xEF, 0x0C, 0xF1, 0x92, 0x34, 0xD2, 0xC6, 0x3D, 0x1A, 0xF6,
- 0x44, 0xEF, 0xB6, 0x94, 0x01, 0x25, 0xE5, 0x1C, 0x97, 0xD1, 0xB1, 0xDC, 0xC7, 0x4B, 0x37, 0x4E,
- 0xA6, 0xEC, 0x8F, 0xEB, 0xF7, 0x09, 0xE5, 0x41, 0xC6, 0xD7, 0x99, 0xE2, 0x11, 0xB4, 0xAC, 0xC9,
- 0xA4, 0x06, 0xB1, 0x56, 0x24, 0xB6, 0x47, 0x91, 0x53, 0xEC, 0x99, 0x52, 0xA3, 0xE5, 0xC2, 0xD5,
- 0xB2, 0xE2, 0x11, 0xCB, 0x23, 0x5A, 0x84, 0x58, 0xFD, 0x15, 0xF4, 0x3D, 0x7B, 0xFE, 0xF1, 0x65,
- 0x6C, 0xB4, 0xB7, 0x76, 0xF3, 0x92, 0x4E, 0xB5, 0xFD, 0xB7, 0x77, 0x8B, 0x3C, 0x9B, 0x68, 0x89,
- 0x00, 0x2D, 0x4D, 0x0A, 0x31, 0x25, 0x1F, 0x17, 0xEE, 0x26, 0x9C, 0xD6, 0x18, 0xFB, 0x6B, 0x36,
- 0x23, 0x63, 0xF8, 0x72, 0xF2, 0x96, 0x02, 0x40, 0x82, 0xCE, 0x71, 0x11, 0xB6, 0x92, 0x8A, 0x9B,
- 0x6E, 0xB2, 0x99, 0xD2, 0x90, 0x58, 0x1E, 0x64, 0x7C, 0x9D, 0xC9, 0x46, 0x90, 0xD6, 0x77, 0x1A,
- 0x19, 0x51, 0xB1, 0x26, 0xA3, 0xED, 0x4E, 0xE2, 0x47, 0xA2, 0x34, 0xB3, 0x8D, 0x4B, 0xF8, 0x18,
- 0x5B, 0x8E, 0xE1, 0x7B, 0x9B, 0x8C, 0xE5, 0x18, 0xE6, 0x49, 0x9B, 0xA1, 0xE8, 0x01, 0xB1, 0x3D,
- 0x8A, 0x72, 0x24, 0xF6, 0x4C, 0x21, 0x84, 0xAB, 0xB4, 0xF9, 0x45, 0xBE, 0xB6, 0x43, 0xBA, 0xCE,
- 0xF8, 0x85, 0xE9, 0x11, 0xD8, 0x02, 0x96, 0xBE, 0xB4, 0xC4, 0x97, 0xBD, 0xDC, 0x83, 0xC4, 0xC3,
- 0x81, 0x05, 0xFF, 0xEB, 0x05, 0x7F, 0xFD, 0x9F, 0xC3, 0x3C, 0xCF, 0x06, 0xAD, 0x16, 0x11, 0x10,
- 0xD2, 0xB7, 0x64, 0xE1, 0xFE, 0x1B, 0xE6, 0x2C, 0xE5, 0xB9, 0xB6, 0x2C, 0x5A, 0x89, 0x45, 0x24,
- 0x7C, 0xC9, 0xFB, 0x50, 0x01, 0xEF, 0xC8, 0xDA, 0x66, 0xA8, 0xB9, 0xC2, 0xCB, 0x53, 0xE3, 0xCB,
- 0x54, 0x8C, 0x3C, 0xBE, 0xAF, 0xB1, 0x50, 0x85, 0x04, 0x49, 0x59, 0xCF, 0x88, 0xCB, 0x96, 0xA2,
- 0x68, 0x2A, 0x75, 0xBB, 0xEB, 0x5D, 0x6B, 0x49, 0x69, 0xAF, 0xCD, 0xE2, 0xF0, 0xD2, 0x62, 0xCB,
- 0x5E, 0x0D, 0x46, 0xA6, 0x44, 0xA0, 0x9E, 0x0D, 0x9E, 0x88, 0xE9, 0x9E, 0xBD, 0xAD, 0xB3, 0x3C,
- 0xC8, 0xD6, 0x3A, 0x93, 0x9D, 0x20, 0xAD, 0xED, 0x70, 0xA2, 0x7C, 0x4D, 0x46, 0x5F, 0x6B, 0x11,
- 0xA9, 0x20, 0xFD, 0x6D, 0x38, 0x13, 0x4F, 0xDE, 0xAF, 0xD1, 0x83, 0xF8, 0x48, 0xFB, 0xB0, 0x87,
- 0x79, 0x14, 0x72, 0xA0, 0xA7, 0xB1, 0x80, 0x43, 0xE1, 0x2C, 0x47, 0xAF, 0xB1, 0x09, 0x1D, 0x9A,
- 0xE2, 0x41, 0x17, 0x8B, 0x5A, 0x2E, 0xD6, 0x76, 0x70, 0x1D, 0x00, 0xDF, 0x42, 0x8B, 0x50, 0x7C,
- 0xC0, 0x58, 0x5A, 0xE2, 0x4B, 0x44, 0x18, 0x99, 0x2D, 0x0C, 0x89, 0x99, 0x1D, 0x24, 0x48, 0x8B,
- 0x07, 0x2C, 0xCF, 0x06, 0x2D, 0xBE, 0xDC, 0x81, 0xBF, 0x22, 0x4D, 0x0A, 0xE1, 0x4E, 0x91, 0x6B,
- 0xA4, 0x6A, 0x2C, 0x5A, 0xD1, 0x12, 0x16, 0xD2, 0x64, 0xD3, 0x5B, 0x8B, 0xD5, 0xE7, 0xCE, 0x7E,
- 0xA6, 0xF3, 0xA9, 0x87, 0x45, 0x08, 0x5F, 0xA6, 0x62, 0xE4, 0x79, 0xC1, 0x72, 0x7F, 0x16, 0xD1,
- 0x88, 0xCB, 0x5E, 0x93, 0xE8, 0xB1, 0x52, 0xB7, 0x96, 0x14, 0x55, 0x03, 0xE5, 0x85, 0xC7, 0x61,
- 0xA5, 0xD5, 0xC8, 0x97, 0xBD, 0x8C, 0x4C, 0x19, 0x04, 0x78, 0x36, 0x62, 0xB2, 0xC5, 0x5F, 0xC2,
- 0x71, 0x7D, 0x21, 0x5B, 0xEB, 0x4C, 0x76, 0x82, 0xDA, 0x7A, 0x91, 0x36, 0xF7, 0x66, 0xCC, 0xEB,
- 0x31, 0x47, 0x1B, 0x5E, 0xDB, 0xCB, 0xAA, 0xB9, 0x37, 0x96, 0x81, 0x75, 0xEA, 0x4F, 0x78, 0x8A,
- 0x29, 0x4A, 0xD3, 0x44, 0x1C, 0xA7, 0x63, 0x72, 0x61, 0x9D, 0xF1, 0x65, 0x2D, 0x2C, 0xA0, 0x75,
- 0xC8, 0x28, 0x5A, 0x04, 0x2D, 0x1F, 0xC4, 0x11, 0xDA, 0x95, 0x4D, 0x10, 0x5A, 0xF8, 0x80, 0xE7,
- 0xD9, 0x44, 0x4B, 0xE3, 0x03, 0x2D, 0x4D, 0x3D, 0x3D, 0xC1, 0x07, 0xE2, 0x61, 0xCB, 0xA2, 0x15,
- 0xF3, 0xB8, 0xA8, 0xE5, 0x4A, 0xF5, 0x47, 0xC7, 0x7E, 0xC4, 0x5E, 0x44, 0x84, 0x50, 0x5D, 0x21,
- 0x79, 0x1E, 0x83, 0xFB, 0x33, 0x5E, 0x30, 0xE2, 0xB2, 0x58, 0x2C, 0xAE, 0x9B, 0x05, 0x99, 0x4B,
- 0xCA, 0x9C, 0x2E, 0x8B, 0x83, 0x53, 0x9F, 0x7C, 0xD9, 0xCB, 0x29, 0xD0, 0x9C, 0x88, 0x29, 0x5B,
- 0xEC, 0x1D, 0x9C, 0xE7, 0x13, 0xB3, 0xB8, 0xCE, 0x14, 0x87, 0x20, 0x87, 0x6D, 0x77, 0x12, 0x2E,
- 0x47, 0x31, 0xD0, 0x52, 0x01, 0x58, 0xF6, 0x36, 0xD9, 0xA1, 0x6F, 0x8F, 0x22, 0xE0, 0x9E, 0x29,
- 0xAB, 0x0B, 0x5B, 0x59, 0xDE, 0x1F, 0x10, 0x3B, 0xA6, 0x8C, 0x08, 0x08, 0xBE, 0xEA, 0xA3, 0x5D,
- 0x5B, 0x68, 0x33, 0x9D, 0x89, 0x24, 0x6B, 0xA0, 0x59, 0x9E, 0x75, 0x5A, 0xC3, 0x44, 0x00, 0xFF,
- 0x65, 0xA9, 0x7C, 0x64, 0x4E, 0xDE, 0x46, 0xD9, 0xB8, 0x77, 0x37, 0xFC, 0xE5, 0x32, 0xAC, 0xF2,
- 0xFF, 0x1D, 0x6C, 0x0B, 0x41, 0xF2, 0xE2, 0x71, 0xD1, 0x6B, 0xC1, 0x3D, 0x5E, 0x46, 0x5C, 0x13,
- 0x3D, 0xD3, 0x7E, 0x2E, 0x5E, 0x52, 0x96, 0xD7, 0x16, 0x10, 0xCB, 0x5E, 0xF1, 0x32, 0x25, 0x12,
- 0xB1, 0x2F, 0x73, 0x25, 0xEC, 0x1F, 0x64, 0x7C, 0x9D, 0x29, 0x96, 0x20, 0x41, 0x2C, 0x03, 0x21,
- 0x8C, 0xDD, 0x49, 0x2C, 0x15, 0x72, 0xD0, 0xC6, 0xA5, 0x48, 0xE3, 0x6A, 0x5A, 0x8E, 0x61, 0x8F,
- 0xE8, 0xCB, 0x31, 0x6E, 0xE6, 0x29, 0xBA, 0x7A, 0xDA, 0xF6, 0x28, 0x9E, 0x23, 0xB1, 0x67, 0x4A,
- 0x73, 0x05, 0xC6, 0xDF, 0x5A, 0x2C, 0x96, 0x93, 0xD8, 0x8E, 0x29, 0x73, 0x04, 0x46, 0x46, 0xBB,
- 0x22, 0x4A, 0xDF, 0x18, 0x2B, 0xD8, 0xDB, 0xBF, 0x1E, 0x35, 0x8F, 0x02, 0xE3, 0xAF, 0xE8, 0x10,
- 0x79, 0xD6, 0x69, 0xF5, 0x15, 0x01, 0x7D, 0x8D, 0x2D, 0x59, 0x1B, 0xB8, 0xF3, 0x84, 0x9E, 0x6B,
- 0x83, 0xB2, 0x06, 0x0C, 0xF2, 0x2F, 0x9B, 0x7F, 0x07, 0x14, 0xFD, 0xF3, 0x0C, 0xAF, 0x11, 0xB2,
- 0x75, 0x72, 0xA9, 0x46, 0x9E, 0x2D, 0x54, 0x09, 0xFF, 0x3E, 0xBF, 0xB6, 0xC4, 0xD5, 0x96, 0xA2,
- 0x68, 0x3F, 0x97, 0x78, 0x90, 0x97, 0x94, 0x8F, 0xA7, 0x7B, 0x4A, 0x5F, 0xAE, 0xDA, 0x35, 0xAC,
- 0x4C, 0x3B, 0x60, 0x46, 0xCB, 0x94, 0x11, 0xC8, 0xB3, 0x11, 0x93, 0x2D, 0xF6, 0x9B, 0xB8, 0x7F,
- 0x90, 0xE9, 0x75, 0x26, 0x3B, 0x41, 0x2E, 0xBA, 0x68, 0x19, 0x88, 0x9A, 0x00, 0x14, 0x52, 0xB8,
- 0xD6, 0xC2, 0x25, 0x33, 0x5F, 0x2A, 0x42, 0x11, 0xC6, 0x96, 0x61, 0xD8, 0x72, 0x0C, 0x5F, 0x27,
- 0x32, 0x96, 0x63, 0xB8, 0xA7, 0x26, 0xD9, 0x68, 0x25, 0x07, 0x5B, 0x1C, 0x96, 0xA3, 0x6D, 0x2E,
- 0x92, 0x7D, 0x94, 0x10, 0x73, 0x91, 0x43, 0xAC, 0x09, 0x89, 0x36, 0x73, 0x9B, 0xCB, 0x68, 0x4D,
- 0x8C, 0x55, 0x1F, 0xDE, 0x4C, 0xBD, 0x46, 0xEB, 0x49, 0x2C, 0x98, 0x2D, 0x32, 0xE9, 0x79, 0x36,
- 0x68, 0x69, 0x01, 0x22, 0x4D, 0x0C, 0x99, 0x2D, 0x9C, 0x2C, 0xD7, 0xE2, 0x55, 0x04, 0x65, 0xAD,
- 0x95, 0xC0, 0x57, 0xA6, 0xDE, 0x00, 0x7A, 0x52, 0x97, 0x88, 0x85, 0xF0, 0x2C, 0x31, 0xF2, 0x22,
- 0x86, 0xB6, 0x72, 0x45, 0x04, 0x4D, 0x71, 0xF5, 0xA5, 0xA8, 0xF6, 0x61, 0xF6, 0x92, 0x12, 0xAF,
- 0xCD, 0xE2, 0xB0, 0xD2, 0xC2, 0xEC, 0xB0, 0x65, 0x2F, 0x23, 0x53, 0x66, 0x02, 0x7A, 0x22, 0xE6,
- 0x6C, 0xB1, 0xF2, 0xEB, 0xA2, 0x7F, 0xD0, 0xF3, 0xA0, 0x4E, 0x8E, 0x80, 0xA5, 0xD5, 0x4F, 0x01,
- 0xAC, 0x51, 0xB7, 0xB9, 0xE2, 0x44, 0x48, 0x01, 0xF1, 0x1F, 0x4A, 0x8B, 0x5C, 0x22, 0x24, 0x47,
- 0xD0, 0x54, 0x52, 0x04, 0xAD, 0xB4, 0x84, 0x0A, 0x54, 0x6A, 0x99, 0xEA, 0xAA, 0x7F, 0xD0, 0xC3,
- 0xC8, 0xCC, 0xEE, 0x24, 0x63, 0x8B, 0x54, 0x9C, 0xCD, 0x52, 0x69, 0xED, 0xA1, 0x8A, 0xFF, 0x50,
- 0x37, 0xB7, 0x64, 0xC5, 0x22, 0x09, 0x82, 0xF1, 0x4B, 0x4A, 0x2C, 0x7B, 0xA5, 0x98, 0xA9, 0xA0,
- 0x05, 0xC2, 0xDE, 0xB2, 0x5C, 0x67, 0xEA, 0x6D, 0xD0, 0x7B, 0x04, 0x0C, 0xEF, 0x88, 0xFD, 0x8D,
- 0x72, 0x3F, 0x53, 0xEF, 0x83, 0x93, 0x99, 0xF7, 0x9C, 0xDB, 0xCD, 0x23, 0x48, 0x3B, 0x79, 0x39,
- 0x87, 0xB4, 0x9B, 0x27, 0x41, 0xC8, 0xA9, 0xDD, 0x3C, 0xDC, 0x26, 0xF0, 0x5C, 0xDA, 0xFA, 0xAF,
- 0x12, 0x99, 0x44, 0x4F, 0xDA, 0xCD, 0x7B, 0xDA, 0x6E, 0x37, 0xEF, 0x87, 0x64, 0x37, 0x8F, 0xAF,
- 0x26, 0xF1, 0xF5, 0x25, 0xB6, 0xF3, 0x07, 0x9F, 0x92, 0xF6, 0xF2, 0xB2, 0x88, 0x77, 0x6A, 0x6B,
- 0x0D, 0x68, 0x9E, 0xD9, 0xEB, 0x27, 0x56, 0xBC, 0x4E, 0x57, 0xB2, 0x9B, 0x47, 0xC7, 0x80, 0x33,
- 0x0F, 0x7F, 0x3D, 0xEE, 0xF2, 0xA5, 0x9D, 0xBE, 0xEB, 0x7E, 0xF5, 0x43, 0xCD, 0x6E, 0xDE, 0x37,
- 0xC7, 0x3F, 0x70, 0x7F, 0xEB, 0xA7, 0x82, 0x13, 0x1E, 0xB8, 0x7F, 0xF3, 0xB5, 0x55, 0x4F, 0x2E,
- 0x12, 0x7B, 0x92, 0x83, 0xFB, 0xCA, 0xB7, 0xCF, 0xFD, 0x02, 0x1A, 0xD1, 0xDB, 0xFE, 0xF5, 0xEF,
- 0x61, 0x50, 0xEB, 0xA7, 0x52, 0x4F, 0x5F, 0xC2, 0x19, 0x89, 0xF7, 0x3B, 0xA7, 0x30, 0x11, 0x91,
- 0x24, 0x68, 0xA5, 0x0B, 0x53, 0x35, 0x16, 0x38, 0xF4, 0xA5, 0xAB, 0x4E, 0x9A, 0x17, 0xA1, 0x55,
- 0x20, 0x5A, 0x2C, 0x31, 0xAD, 0xD8, 0xB0, 0x25, 0x12, 0x2D, 0x2A, 0x5B, 0x76, 0x32, 0x2F, 0xE6,
- 0xA4, 0x95, 0x09, 0x89, 0x18, 0x04, 0x02, 0x16, 0x4C, 0xC8, 0xF6, 0x3C, 0x52, 0x8A, 0x76, 0xF3,
- 0xE2, 0x42, 0xDA, 0xCB, 0xCB, 0x30, 0x7C, 0x3E, 0x13, 0xB4, 0x86, 0x21, 0xE7, 0x76, 0xF3, 0xF8,
- 0x6A, 0x12, 0xDF, 0xEE, 0x33, 0x9E, 0x76, 0xFE, 0x80, 0x6E, 0x2F, 0xEF, 0x93, 0x2C, 0xBA, 0xB4,
- 0x97, 0x97, 0x69, 0x38, 0xD9, 0x5B, 0xCF, 0xE2, 0xFA, 0x82, 0x58, 0xE2, 0x51, 0x4D, 0x8B, 0x34,
- 0x4C, 0xBE, 0xD3, 0x82, 0x07, 0x5B, 0x05, 0x22, 0x7F, 0x58, 0xCC, 0x57, 0x93, 0xC4, 0x52, 0x12,
- 0xDB, 0xF9, 0xC3, 0xF5, 0x0F, 0xCC, 0xBB, 0x7F, 0xC4, 0x7E, 0x28, 0x89, 0x0C, 0x80, 0x2A, 0xDC,
- 0x40, 0x95, 0x68, 0x17, 0xF2, 0xD3, 0x6E, 0x9E, 0xB4, 0x97, 0x97, 0x3D, 0xE8, 0x2A, 0x07, 0x0C,
- 0x05, 0x64, 0x37, 0x4F, 0xDA, 0xCB, 0xEB, 0x01, 0x64, 0x73, 0x7D, 0xE1, 0x5B, 0x5D, 0x7A, 0xC4,
- 0x43, 0xE9, 0x2E, 0xD3, 0xCD, 0xA2, 0x1E, 0x3E, 0xAF, 0xBF, 0x17, 0x40, 0x58, 0xD4, 0x35, 0x99,
- 0x55, 0x95, 0xFB, 0x99, 0x7A, 0x23, 0x38, 0x03, 0x98, 0xAD, 0xEB, 0x4A, 0x3E, 0xE8, 0x95, 0x20,
- 0x16, 0xB0, 0x18, 0x59, 0x96, 0x7C, 0xD0, 0x3B, 0x11, 0xB0, 0xD9, 0xDA, 0x96, 0x7C, 0xD0, 0x4B,
- 0x61, 0x33, 0xB9, 0x2E, 0xF9, 0x40, 0x82, 0x20, 0xF9, 0x40, 0x82, 0x20, 0xF9, 0x40, 0x82, 0x20,
- 0xF5, 0x13, 0x7B, 0x1D, 0x72, 0x62, 0x6F, 0x5D, 0x22, 0xDF, 0xE0, 0xAC, 0x7F, 0xC0, 0xF9, 0xA0,
- 0xC6, 0x49, 0x85, 0x55, 0xE2, 0x9C, 0x04, 0x3F, 0xE7, 0xDF, 0x0E, 0xC6, 0x07, 0xB3, 0x93, 0xA7,
- 0x22, 0x71, 0x6E, 0x82, 0xF1, 0x81, 0x94, 0x06, 0xBD, 0x1E, 0x72, 0xBC, 0x20, 0x41, 0x90, 0x7C,
- 0x20, 0x41, 0x60, 0xED, 0x82, 0xAE, 0xBD, 0x9C, 0x3D, 0xCC, 0xC6, 0xB6, 0xA7, 0x07, 0x92, 0x91,
- 0x48, 0x1D, 0x54, 0x35, 0x62, 0xBC, 0x70, 0x7B, 0x37, 0xC8, 0x24, 0x05, 0xDE, 0x49, 0xCD, 0x7A,
- 0x32, 0x12, 0xA9, 0x83, 0x57, 0x8D, 0x98, 0x3F, 0x70, 0x1E, 0x4C, 0x24, 0x85, 0x54, 0x8E, 0xDA,
- 0xED, 0x46, 0x32, 0x16, 0xC8, 0xE3, 0x7D, 0x33, 0x8D, 0x0C, 0xCC, 0x23, 0x39, 0xE9, 0x36, 0x66,
- 0x7B, 0x04, 0x22, 0xF7, 0xE9, 0xA7, 0x0D, 0xE7, 0xAA, 0xC9, 0xD6, 0x7C, 0xA2, 0x65, 0x93, 0x3D,
- 0x54, 0x64, 0x4A, 0x10, 0x48, 0x74, 0x1F, 0x8E, 0x55, 0x93, 0xB5, 0x79, 0x65, 0x8B, 0x52, 0x6C,
- 0x9A, 0x34, 0x24, 0xB2, 0x02, 0xA7, 0xAA, 0x91, 0xE3, 0x46, 0x09, 0x42, 0x97, 0x7C, 0x50, 0x35,
- 0x54, 0xB7, 0x75, 0x97, 0x08, 0xE9, 0x9A, 0x22, 0xEF, 0x1E, 0x9C, 0x0D, 0x68, 0xD8, 0x7C, 0xA5,
- 0x95, 0x8D, 0x24, 0x60, 0xE6, 0x83, 0x2E, 0x6A, 0x1C, 0x39, 0x22, 0x3E, 0x53, 0x30, 0xAB, 0xDF,
- 0xC9, 0xA1, 0xD4, 0xEF, 0x2F, 0x79, 0xDC, 0x39, 0x28, 0x86, 0x7E, 0xC2, 0x34, 0x01, 0xB6, 0x5E,
- 0xE1, 0x64, 0xB5, 0xDB, 0xD9, 0x57, 0x22, 0x11, 0x52, 0x68, 0x17, 0xE6, 0x9C, 0xB4, 0x59, 0x04,
- 0x37, 0x83, 0xAC, 0x5C, 0x24, 0x49, 0xC7, 0xDF, 0x10, 0x78, 0x73, 0x75, 0x92, 0x7B, 0x16, 0x13,
- 0xA6, 0x09, 0x70, 0xE0, 0xFB, 0xC9, 0xFB, 0x4A, 0x24, 0x42, 0x0C, 0x1F, 0x54, 0x95, 0xFA, 0xFB,
- 0x9F, 0x80, 0xE0, 0x79, 0x7E, 0xFF, 0xAA, 0x67, 0x8C, 0x0F, 0x17, 0x9D, 0x03, 0x5F, 0x1F, 0x7A,
- 0xEC, 0xD6, 0xD6, 0xF2, 0xB9, 0x18, 0x01, 0x7D, 0xAB, 0xFA, 0x5A, 0x3F, 0x69, 0xB2, 0xFA, 0x6D,
- 0xA3, 0xE4, 0xF7, 0x33, 0xC4, 0xA6, 0x09, 0x50, 0x39, 0x90, 0x25, 0x54, 0xF2, 0x78, 0xD5, 0x90,
- 0x51, 0xFE, 0x07, 0xC6, 0xF9, 0x57, 0x89, 0x64, 0x0D, 0xFA, 0xC9, 0xA4, 0x09, 0x81, 0xD5, 0x1D,
- 0xC6, 0x29, 0xBE, 0x68, 0x3A, 0x63, 0xF9, 0x6A, 0xB2, 0xA2, 0x41, 0xBE, 0x21, 0xDA, 0x2C, 0xBB,
- 0x56, 0x58, 0x58, 0xE7, 0xD6, 0xCE, 0xF9, 0x59, 0xC1, 0x18, 0x5D, 0x33, 0xB6, 0xD1, 0x8B, 0x11,
- 0x5B, 0x35, 0x76, 0x3E, 0x08, 0xDE, 0xB0, 0x2C, 0xF0, 0xE3, 0x9B, 0x60, 0xD2, 0x5D, 0x81, 0xC0,
- 0x7D, 0x0B, 0x03, 0x81, 0xBF, 0x6C, 0x62, 0xBE, 0x55, 0x4B, 0x0E, 0x05, 0xD6, 0x46, 0xA0, 0xF8,
- 0xC5, 0xD2, 0x86, 0x57, 0x6F, 0xAB, 0x0F, 0xBC, 0xB9, 0x26, 0x56, 0x54, 0x57, 0x34, 0xDB, 0x7D,
- 0x62, 0x37, 0x4B, 0xE8, 0xD8, 0xF5, 0xB1, 0x27, 0xC8, 0xE8, 0x9C, 0xEE, 0xF8, 0xF6, 0x96, 0x35,
- 0x77, 0x6D, 0x59, 0x7B, 0x94, 0x27, 0x6B, 0xA6, 0x9F, 0x44, 0x9A, 0xBB, 0x86, 0x97, 0xD5, 0xB6,
- 0x04, 0x87, 0xCF, 0x53, 0xD5, 0xAD, 0x37, 0x42, 0xB0, 0x6A, 0xDB, 0xAA, 0x2F, 0x6D, 0x7B, 0x29,
- 0x84, 0xBE, 0x23, 0x9B, 0x9A, 0xB6, 0x8E, 0x79, 0x3A, 0xF0, 0xBF, 0x7D, 0x26, 0x35, 0xA8, 0x67,
- 0x3F, 0x17, 0x0E, 0x56, 0xA9, 0xAF, 0x5E, 0xD3, 0x7C, 0x53, 0xA3, 0xFA, 0x9D, 0xA6, 0xDA, 0xF6,
- 0xE0, 0xF0, 0x27, 0x17, 0xA9, 0xEC, 0x3C, 0x8F, 0x5E, 0x8C, 0xD8, 0xAA, 0xB1, 0x8F, 0x1B, 0x6B,
- 0x3A, 0xEF, 0x82, 0x69, 0xFB, 0x5E, 0x6D, 0xBD, 0x0B, 0xDD, 0x55, 0x73, 0x23, 0xE0, 0x3B, 0x4D,
- 0xBE, 0x95, 0xFE, 0x89, 0xFB, 0xEF, 0xE4, 0x5B, 0x4D, 0x6B, 0x4E, 0x8C, 0x05, 0x28, 0x0A, 0xCF,
- 0x69, 0xB1, 0x3D, 0x78, 0xE9, 0xD2, 0x90, 0xBD, 0x55, 0x0E, 0x20, 0xC3, 0x39, 0xB0, 0x41, 0xA0,
- 0x1C, 0x7C, 0x07, 0x06, 0x57, 0x31, 0x3A, 0x11, 0xDF, 0xC2, 0x0F, 0xFA, 0x2C, 0xFC, 0xC0, 0xB3,
- 0x97, 0x25, 0x4B, 0x8D, 0x85, 0xA0, 0x9F, 0x54, 0x9A, 0xD5, 0x37, 0xC2, 0xD4, 0x65, 0x00, 0xAD,
- 0x03, 0x22, 0x50, 0x19, 0x9E, 0x52, 0x36, 0x60, 0x5A, 0xD9, 0x00, 0xE4, 0xEB, 0xEA, 0xEB, 0x70,
- 0x23, 0xE5, 0x91, 0x57, 0xBE, 0xF4, 0xFD, 0x76, 0xA5, 0x71, 0x04, 0x40, 0x71, 0x13, 0x5A, 0x6B,
- 0xBE, 0xB4, 0xBE, 0xB9, 0x74, 0xEC, 0xA1, 0xAF, 0xB6, 0x4E, 0x5D, 0x02, 0xAD, 0x2F, 0xC8, 0x3D,
- 0xB3, 0xB1, 0x55, 0x93, 0xA0, 0x7F, 0x50, 0xF5, 0x99, 0xE5, 0x81, 0xB7, 0x38, 0x9F, 0xF8, 0x8E,
- 0x9E, 0xB8, 0xA0, 0xFF, 0x29, 0xEE, 0x8D, 0xCD, 0x7B, 0xE0, 0x4C, 0xEC, 0x59, 0xB5, 0x26, 0x2B,
- 0x17, 0x3A, 0xEC, 0x9B, 0x25, 0x34, 0x02, 0x6F, 0x29, 0x58, 0xCF, 0x8C, 0xCE, 0x10, 0xA7, 0x60,
- 0x4E, 0x3F, 0x89, 0x34, 0xDB, 0xBE, 0x4C, 0x57, 0xBB, 0x41, 0xF7, 0xB6, 0x3B, 0x60, 0xC2, 0xCF,
- 0x9F, 0x1F, 0x3D, 0xFF, 0x2F, 0xD7, 0x98, 0x0D, 0x8E, 0x33, 0xBB, 0xF1, 0xD2, 0x92, 0x82, 0x86,
- 0xAE, 0xF6, 0xB1, 0x54, 0x16, 0xFD, 0x1C, 0xF6, 0x4C, 0xBA, 0xBA, 0xF4, 0xE7, 0xE8, 0xF6, 0x2D,
- 0x84, 0x3D, 0x7C, 0x87, 0x72, 0xD5, 0x75, 0xBE, 0xA3, 0x83, 0x69, 0xCF, 0x71, 0x24, 0x4C, 0x11,
- 0xC8, 0xC7, 0xDE, 0x56, 0x6B, 0x56, 0x2E, 0x2C, 0x70, 0x6C, 0x14, 0x00, 0xE6, 0xFC, 0xEF, 0xC4,
- 0x13, 0x82, 0x8E, 0xC0, 0x14, 0x96, 0x6C, 0x99, 0x41, 0x1F, 0x92, 0x48, 0xB3, 0xF5, 0x79, 0xBE,
- 0x8D, 0x9E, 0x59, 0x67, 0xE7, 0x16, 0xFB, 0x99, 0x2F, 0x7E, 0xFE, 0x2F, 0xCC, 0xF0, 0xCE, 0x5E,
- 0x76, 0x87, 0xC5, 0xDA, 0x39, 0x3B, 0x2B, 0x18, 0x9D, 0xA5, 0xB7, 0x99, 0xAD, 0x90, 0xF7, 0x5A,
- 0x24, 0xD8, 0xC7, 0x12, 0x28, 0xF7, 0xF7, 0x3F, 0xF3, 0xFB, 0xD5, 0xFE, 0xC5, 0x1B, 0xE1, 0xC5,
- 0xD5, 0x7E, 0xFF, 0xE6, 0x15, 0xE5, 0xFE, 0x7B, 0xB9, 0x3C, 0xA8, 0xAC, 0xF6, 0xFB, 0xC7, 0xDC,
- 0x01, 0x30, 0x67, 0xD5, 0xD8, 0xAB, 0x31, 0x82, 0x7F, 0xA0, 0xC3, 0x50, 0x6E, 0xD6, 0x1F, 0x9C,
- 0x92, 0x73, 0xC6, 0x45, 0x3F, 0x1E, 0xF7, 0x53, 0x46, 0x87, 0xB5, 0x3A, 0x08, 0x1F, 0x4F, 0xD6,
- 0x4C, 0xBF, 0xEB, 0x34, 0xC5, 0xF8, 0xB0, 0xF4, 0xAB, 0x45, 0xCA, 0xED, 0x2E, 0xED, 0x04, 0x07,
- 0xE6, 0xEB, 0x6E, 0xFB, 0x3E, 0x14, 0x79, 0xCA, 0xFC, 0xF5, 0x2B, 0xB0, 0x73, 0x18, 0xAE, 0x2D,
- 0x52, 0x96, 0x6C, 0x73, 0xFF, 0xBB, 0xA2, 0x7C, 0x34, 0x91, 0x22, 0x2C, 0x42, 0xCF, 0x5E, 0xDE,
- 0x4F, 0x8C, 0x85, 0xB0, 0x83, 0xD1, 0x9D, 0xF5, 0x46, 0xB1, 0xE6, 0x63, 0xB1, 0x72, 0xE1, 0x64,
- 0x6C, 0xA1, 0x7B, 0xC9, 0x58, 0xC0, 0xD3, 0x5C, 0x77, 0xF6, 0x87, 0x0E, 0x61, 0xCE, 0xBE, 0x12,
- 0x1A, 0x9C, 0xED, 0x60, 0x64, 0x6E, 0x7D, 0x21, 0xE3, 0xA6, 0xC8, 0xBB, 0x42, 0xE0, 0x31, 0xA7,
- 0x0E, 0x9F, 0xB3, 0xAF, 0x44, 0x17, 0xC8, 0xE0, 0x3A, 0x53, 0xD2, 0x56, 0x2E, 0x32, 0x04, 0xFF,
- 0x91, 0xE4, 0x7D, 0x25, 0xBA, 0x80, 0x5C, 0x67, 0x92, 0x20, 0x64, 0x6B, 0xDD, 0xD9, 0x71, 0xF3,
- 0x94, 0x44, 0x3E, 0xA0, 0x27, 0xF7, 0xB5, 0x49, 0xC5, 0xB1, 0xBC, 0x45, 0xA2, 0x7D, 0x6D, 0x9A,
- 0xE1, 0xA4, 0x74, 0x30, 0x41, 0x9C, 0xEC, 0x92, 0x0C, 0xBA, 0x91, 0x8C, 0x05, 0xA9, 0xA4, 0x29,
- 0x91, 0x0C, 0x04, 0x1F, 0xA8, 0xDD, 0xA1, 0xE1, 0x00, 0x9B, 0x12, 0x9C, 0xC6, 0x83, 0x71, 0x92,
- 0x09, 0x44, 0x58, 0x37, 0x25, 0x1A, 0xAE, 0x9B, 0xE2, 0x93, 0x1D, 0x96, 0x1E, 0x06, 0xAF, 0xAA,
- 0x1E, 0xD1, 0x4F, 0xEC, 0xAA, 0xB3, 0xA0, 0xBA, 0xFD, 0xED, 0xB0, 0x77, 0xAA, 0xDB, 0x3D, 0x15,
- 0x82, 0x25, 0x5D, 0xC4, 0x95, 0xC8, 0x0A, 0x12, 0xF2, 0xC1, 0x3E, 0xFE, 0xD3, 0x6F, 0x08, 0xC5,
- 0x0A, 0x9F, 0x6A, 0xE1, 0x06, 0x8F, 0x93, 0x43, 0x6A, 0x1A, 0xCB, 0x01, 0xAC, 0xFE, 0x77, 0x68,
- 0xBB, 0xED, 0xDE, 0x44, 0x47, 0xEA, 0x4B, 0x64, 0x0D, 0x89, 0xE5, 0xC1, 0xE7, 0xF1, 0xDF, 0xD7,
- 0x51, 0x0C, 0xFD, 0x5A, 0x14, 0xE8, 0xE7, 0xFA, 0x89, 0x73, 0x24, 0xBB, 0x11, 0xDC, 0xB4, 0x40,
- 0x0B, 0x60, 0x98, 0x90, 0xD9, 0x2B, 0x23, 0x74, 0x25, 0x92, 0x83, 0x95, 0x0F, 0x74, 0x01, 0xAE,
- 0xED, 0x84, 0x1F, 0xEE, 0x9A, 0x5D, 0x4D, 0xBF, 0x74, 0x44, 0xFE, 0x34, 0x85, 0x5C, 0xB4, 0xC8,
- 0x0B, 0x2B, 0x63, 0xD7, 0xEF, 0x53, 0xA9, 0xB5, 0x98, 0x64, 0x38, 0xEA, 0xA6, 0x46, 0x59, 0x12,
- 0x02, 0x52, 0xBD, 0xAC, 0x07, 0x61, 0x93, 0x07, 0xA2, 0x62, 0x8C, 0x06, 0x5D, 0x61, 0x6C, 0xD0,
- 0x7C, 0x45, 0xF5, 0x2C, 0x88, 0xF0, 0x5E, 0xDE, 0x54, 0x3C, 0x52, 0x65, 0x00, 0x74, 0x4F, 0x91,
- 0x23, 0x26, 0x19, 0x44, 0x40, 0xA9, 0x50, 0xCD, 0x6C, 0x20, 0xD5, 0xCB, 0x7A, 0x12, 0x5D, 0x74,
- 0xCF, 0xDD, 0xF8, 0xF1, 0x43, 0x5B, 0xDB, 0x25, 0x81, 0xD9, 0x2E, 0x2F, 0xE8, 0xB5, 0x54, 0xDA,
- 0xFC, 0x72, 0x88, 0xAB, 0x7C, 0x91, 0xB2, 0x17, 0x2E, 0x2B, 0x6C, 0x77, 0x1D, 0x59, 0xB7, 0xBB,
- 0xE8, 0x6E, 0x76, 0xC8, 0x12, 0x3B, 0x5B, 0x49, 0x44, 0x4C, 0x7E, 0x9C, 0x88, 0x3C, 0xE6, 0x63,
- 0x8B, 0x47, 0xFA, 0xA9, 0x1B, 0x81, 0xD5, 0xD2, 0x66, 0x4F, 0xCF, 0x21, 0x21, 0x1F, 0x44, 0xEB,
- 0x9A, 0x5B, 0x90, 0x0B, 0x94, 0x39, 0xEF, 0x95, 0x78, 0xD4, 0x88, 0xA9, 0xF5, 0x76, 0x37, 0x1D,
- 0x65, 0x2A, 0x5F, 0x5C, 0xD9, 0x0B, 0xDA, 0xAE, 0x3C, 0x36, 0x6A, 0xD1, 0xF4, 0xCE, 0x55, 0xE3,
- 0x57, 0xAA, 0x9B, 0xAE, 0x45, 0x05, 0x31, 0x95, 0x8E, 0x4C, 0x40, 0xF8, 0x53, 0x60, 0x84, 0x28,
- 0x5B, 0x11, 0xDF, 0x0B, 0x4C, 0xFE, 0x10, 0xF8, 0x01, 0x4E, 0x12, 0x3D, 0x03, 0x3B, 0x1F, 0xE0,
- 0x51, 0x8B, 0xEC, 0x6B, 0x7E, 0x87, 0xE0, 0xAA, 0x28, 0xF5, 0xB6, 0xA1, 0x18, 0xC0, 0x9E, 0x7C,
- 0xD8, 0xE3, 0xB5, 0x8C, 0xFE, 0x23, 0x8D, 0x23, 0x94, 0xBE, 0xEF, 0xA3, 0xB2, 0xD7, 0xF1, 0xAF,
- 0x96, 0xD5, 0x0E, 0xAF, 0x67, 0x55, 0x16, 0x19, 0xB1, 0x04, 0x2E, 0x7D, 0xEF, 0x04, 0xAA, 0x85,
- 0xCC, 0x60, 0x71, 0x88, 0x09, 0xE2, 0x30, 0x82, 0x25, 0x19, 0x00, 0x55, 0x65, 0xE3, 0x8B, 0xBD,
- 0x7B, 0x61, 0x96, 0x1E, 0xA5, 0xFA, 0x3A, 0xE7, 0x47, 0x25, 0xB2, 0x01, 0x3B, 0x1F, 0xB0, 0x23,
- 0x3B, 0xF0, 0x77, 0x36, 0x03, 0x9C, 0x45, 0x95, 0x40, 0x5E, 0xFD, 0x18, 0xD1, 0x68, 0xBD, 0x23,
- 0x83, 0x07, 0x33, 0x95, 0xAF, 0xB1, 0x4C, 0xD9, 0x6B, 0xEA, 0x6F, 0xAE, 0x75, 0x22, 0xCD, 0x59,
- 0xC0, 0x99, 0x11, 0x6C, 0xC9, 0x18, 0x94, 0x0D, 0x5E, 0x43, 0xF5, 0x32, 0xC7, 0x47, 0x25, 0xB2,
- 0x81, 0x2E, 0xFA, 0x07, 0x9F, 0xB9, 0xE5, 0xC2, 0xCF, 0x28, 0x70, 0x19, 0x39, 0xA3, 0x8A, 0x5E,
- 0x47, 0x81, 0xF1, 0xB7, 0x16, 0xE3, 0x81, 0x4A, 0x00, 0xAD, 0x5C, 0xD9, 0xEB, 0x86, 0x05, 0xB8,
- 0x9B, 0xA9, 0xAE, 0x89, 0x1F, 0xB2, 0x44, 0xEA, 0x80, 0xEC, 0xF8, 0x04, 0x71, 0xF2, 0x4B, 0xE2,
- 0x04, 0x18, 0xF6, 0xAA, 0xD0, 0x89, 0xFA, 0x44, 0x01, 0x6C, 0x1C, 0x74, 0x8E, 0x20, 0xF5, 0xB2,
- 0x24, 0x1E, 0x95, 0xC8, 0x0C, 0x12, 0xF7, 0xC5, 0x9E, 0x7D, 0xA5, 0xEC, 0x30, 0xAC, 0xD5, 0xEE,
- 0x78, 0x1D, 0xD5, 0x16, 0x81, 0x72, 0xB8, 0x1C, 0xEA, 0x07, 0xDC, 0x0B, 0x95, 0x5B, 0xFF, 0xFD,
- 0x41, 0x58, 0x8C, 0xCA, 0x5E, 0x0B, 0xC7, 0xC2, 0xDA, 0xC7, 0x46, 0x2C, 0x46, 0xBF, 0xE2, 0x43,
- 0x14, 0xA1, 0x38, 0x46, 0x89, 0xBD, 0x4B, 0x70, 0xAD, 0xA6, 0xC0, 0x83, 0x9A, 0x68, 0x91, 0xA3,
- 0xC6, 0x1E, 0x85, 0x8D, 0x0F, 0x6C, 0x33, 0xC0, 0x4B, 0x2B, 0x4F, 0xDF, 0xF9, 0x83, 0x9F, 0x6A,
- 0x77, 0x7B, 0xE8, 0x52, 0x2A, 0xB4, 0x8E, 0xF8, 0x2F, 0x53, 0x00, 0xDE, 0x05, 0x5E, 0xFC, 0xA5,
- 0x63, 0x53, 0xC8, 0xAF, 0x15, 0x07, 0x96, 0x5D, 0xCD, 0x26, 0xC6, 0x4C, 0x34, 0xEF, 0x25, 0x5A,
- 0x65, 0x34, 0x93, 0xA4, 0xC9, 0x8F, 0xBA, 0x84, 0x1B, 0x99, 0x24, 0x32, 0x0C, 0x2B, 0x1F, 0xD8,
- 0x0D, 0x29, 0x6E, 0x51, 0x83, 0x6F, 0x7D, 0xAA, 0xF1, 0x43, 0x18, 0x03, 0x1F, 0x8E, 0xF9, 0x70,
- 0x4C, 0xC6, 0x16, 0xA3, 0x62, 0xEC, 0x35, 0x32, 0x25, 0xD3, 0x32, 0x08, 0x14, 0x77, 0x5C, 0x2B,
- 0x56, 0x12, 0xA5, 0x7A, 0x59, 0xCF, 0x22, 0x71, 0xBB, 0xB0, 0xBB, 0x1F, 0x0C, 0xC7, 0x76, 0x21,
- 0x0C, 0x1F, 0x28, 0xD8, 0x83, 0xB3, 0xCC, 0xF2, 0xC4, 0x05, 0x3F, 0x5B, 0x29, 0x25, 0x3D, 0x94,
- 0x29, 0x7B, 0xB9, 0x18, 0xF0, 0xE3, 0xEC, 0x72, 0x3F, 0xEE, 0x25, 0xD5, 0xCB, 0x7A, 0x16, 0x09,
- 0xF9, 0x60, 0x92, 0xF8, 0x75, 0xEB, 0xAE, 0x64, 0x91, 0x9A, 0x1E, 0x4A, 0xC9, 0x1C, 0x68, 0x7F,
- 0x47, 0xB9, 0x54, 0x2E, 0x39, 0xE7, 0x0E, 0x49, 0xCD, 0xD9, 0xB1, 0x95, 0x40, 0x01, 0x5C, 0x20,
- 0xD6, 0x9C, 0x93, 0xFB, 0xC4, 0x7D, 0xC2, 0xA6, 0xA0, 0xDE, 0x35, 0x5B, 0x94, 0xE0, 0x98, 0xC4,
- 0x9C, 0x4C, 0x80, 0x37, 0x42, 0x9D, 0x9E, 0x7D, 0x52, 0x25, 0xA1, 0x27, 0x90, 0x14, 0x1F, 0x98,
- 0xDB, 0xF3, 0xBD, 0x93, 0xA7, 0x00, 0xA8, 0xFE, 0x8E, 0xE2, 0x0E, 0xA8, 0x4D, 0xB0, 0x46, 0x9C,
- 0x92, 0xFE, 0x81, 0x80, 0x39, 0x19, 0x55, 0x61, 0x2A, 0x09, 0xC5, 0x20, 0x55, 0x12, 0x7A, 0x04,
- 0x49, 0x7D, 0x6B, 0xE6, 0x7A, 0x9C, 0xE4, 0xC2, 0x79, 0x84, 0xF7, 0x6A, 0x5B, 0xFF, 0x7E, 0xE8,
- 0x50, 0x69, 0x22, 0x33, 0xED, 0x8E, 0x87, 0x08, 0x27, 0x86, 0x95, 0x5D, 0x02, 0x25, 0x25, 0xDC,
- 0x47, 0x97, 0x3F, 0x12, 0xD9, 0x43, 0xCA, 0xF2, 0x20, 0xEC, 0x26, 0xDE, 0x19, 0x53, 0x3C, 0x94,
- 0x6E, 0x6A, 0x32, 0xAA, 0x8F, 0x6A, 0x1B, 0x46, 0x38, 0xA8, 0x24, 0x48, 0x64, 0x0B, 0x29, 0xF7,
- 0x0F, 0xEA, 0xA6, 0xE2, 0xC8, 0x21, 0x78, 0xD0, 0x35, 0x06, 0xDD, 0xFD, 0xB9, 0x57, 0xEB, 0x80,
- 0x99, 0x38, 0xC8, 0x5B, 0xF7, 0x1F, 0xD5, 0xDA, 0xCC, 0x4F, 0xEB, 0x80, 0xD6, 0x64, 0xC8, 0x9A,
- 0x91, 0x9C, 0x4A, 0x82, 0x44, 0xB6, 0x90, 0xB2, 0x3C, 0xC0, 0xDE, 0x01, 0x8E, 0x21, 0xFB, 0xF5,
- 0xF5, 0x7D, 0x34, 0x4C, 0x6F, 0x53, 0xFC, 0x1F, 0x37, 0x94, 0xB7, 0x3E, 0x69, 0xEA, 0x35, 0x4E,
- 0x4D, 0x86, 0xAA, 0x15, 0x49, 0xA9, 0x24, 0x48, 0x64, 0x0B, 0x29, 0xF7, 0x0F, 0xF6, 0x46, 0x69,
- 0x85, 0xE8, 0x6C, 0xE3, 0xDA, 0xDB, 0x4F, 0x3E, 0xAE, 0x29, 0x0B, 0x8C, 0x5F, 0xFD, 0x13, 0xF8,
- 0xCF, 0x9B, 0x01, 0x56, 0x3F, 0x04, 0x81, 0xE1, 0x0D, 0xC9, 0x50, 0x4C, 0x06, 0x76, 0x95, 0x84,
- 0x56, 0xBB, 0x0D, 0x9C, 0x47, 0xD2, 0xA5, 0x2C, 0x11, 0x83, 0xA4, 0xF8, 0xC0, 0x22, 0xAB, 0x5D,
- 0xF4, 0x85, 0x9E, 0x37, 0x62, 0xC9, 0x8B, 0x65, 0x0B, 0x74, 0xBF, 0xCF, 0xBE, 0x58, 0xFF, 0x4B,
- 0x34, 0x4C, 0x72, 0xF9, 0x1F, 0x60, 0xD7, 0xA8, 0xF2, 0x64, 0x28, 0x26, 0x05, 0xBB, 0x4A, 0x82,
- 0xDD, 0x06, 0xCE, 0x0B, 0xD2, 0x1E, 0x5E, 0xC6, 0x90, 0xA4, 0x3C, 0x30, 0x40, 0xBA, 0x02, 0x00,
- 0x47, 0x1B, 0xDB, 0xCF, 0xB4, 0xF7, 0xD5, 0x67, 0x18, 0x7D, 0x4B, 0x27, 0xDC, 0x8A, 0x2D, 0x0C,
- 0x1A, 0x4D, 0x4B, 0x5F, 0x6B, 0xA0, 0x6B, 0x95, 0x04, 0x66, 0x03, 0xC7, 0xA3, 0x5C, 0xD2, 0x81,
- 0x36, 0x70, 0x2A, 0xA7, 0x95, 0x55, 0xCA, 0x79, 0x85, 0xCC, 0x21, 0x49, 0x79, 0x60, 0x80, 0xCF,
- 0xFF, 0x9F, 0x37, 0xA2, 0x74, 0x62, 0x69, 0x29, 0xE8, 0x1F, 0xE4, 0xBF, 0x94, 0xDC, 0x89, 0x57,
- 0xFF, 0xD2, 0xA7, 0x1E, 0xFB, 0x5A, 0x32, 0x04, 0x9D, 0x90, 0x84, 0x4A, 0x02, 0xC4, 0xD8, 0xC0,
- 0x91, 0xC8, 0x10, 0x52, 0x1F, 0x2F, 0x4C, 0xA1, 0x55, 0xA1, 0xA3, 0x2E, 0xB2, 0x43, 0x23, 0xC6,
- 0x0B, 0x88, 0xD2, 0x36, 0xA0, 0x21, 0xC2, 0xBF, 0x0C, 0xF8, 0x6E, 0x86, 0x94, 0xC9, 0xF6, 0xB2,
- 0x64, 0x70, 0xEC, 0x18, 0x65, 0xED, 0x90, 0x0E, 0x66, 0x03, 0x27, 0x1D, 0x82, 0x12, 0x09, 0x91,
- 0xF2, 0x78, 0x81, 0x50, 0xD7, 0x71, 0x5E, 0x4B, 0xA9, 0x53, 0xC4, 0xD2, 0x87, 0xBF, 0xC8, 0x7E,
- 0x33, 0x63, 0x58, 0xDB, 0xAE, 0x92, 0x80, 0x40, 0x1B, 0x38, 0x30, 0x70, 0xB4, 0x6E, 0x0B, 0x49,
- 0x22, 0x53, 0x48, 0x59, 0x1E, 0x40, 0x67, 0x5D, 0x05, 0x14, 0x1F, 0x65, 0x9F, 0xBF, 0x90, 0x07,
- 0x7C, 0x85, 0x91, 0xAE, 0xDB, 0x9F, 0x5B, 0xCC, 0x9C, 0xE1, 0xD4, 0xCF, 0x5F, 0xE8, 0x5A, 0x25,
- 0x81, 0x25, 0x43, 0x5A, 0x0E, 0x40, 0x1A, 0x0F, 0xEC, 0x2F, 0x39, 0xD2, 0x12, 0x5D, 0x23, 0x75,
- 0x79, 0xE0, 0xA9, 0xC0, 0xEF, 0x74, 0x5C, 0x67, 0xDF, 0x88, 0x5B, 0x05, 0xBB, 0xCA, 0x50, 0xF5,
- 0x2D, 0xE9, 0x2A, 0x11, 0x25, 0xA1, 0x92, 0x20, 0x91, 0x45, 0xA4, 0x2E, 0x0F, 0xF6, 0x05, 0x7D,
- 0x10, 0xF8, 0x93, 0x52, 0x11, 0x75, 0x45, 0x23, 0x38, 0xA9, 0x64, 0x01, 0xFB, 0x58, 0x33, 0x02,
- 0x07, 0x95, 0x04, 0x89, 0x2C, 0x22, 0x65, 0x79, 0x30, 0x27, 0x1A, 0x08, 0xD5, 0xF8, 0x2F, 0xB7,
- 0x1E, 0xEA, 0x91, 0x79, 0x48, 0x95, 0x84, 0x9E, 0x45, 0xEA, 0xF2, 0xC0, 0xD5, 0x07, 0x3E, 0x6D,
- 0x09, 0xCD, 0xD6, 0x59, 0x4C, 0x52, 0x25, 0xA1, 0x07, 0x91, 0xC6, 0x78, 0x21, 0x62, 0x9E, 0xC6,
- 0xCB, 0xB2, 0x5C, 0x90, 0x2A, 0x09, 0x3D, 0x84, 0xD4, 0xE5, 0x01, 0x84, 0xF6, 0x81, 0x2B, 0x8A,
- 0x0F, 0x7A, 0xC2, 0x9E, 0x71, 0x07, 0x53, 0x55, 0x58, 0x4B, 0x11, 0xD6, 0x94, 0xA5, 0x95, 0x84,
- 0xAC, 0x21, 0x9D, 0xF9, 0x03, 0xF7, 0x17, 0x71, 0x54, 0xF0, 0x9B, 0x0D, 0x00, 0x7F, 0xDB, 0x98,
- 0x6D, 0xD3, 0x99, 0x31, 0x2A, 0x09, 0x17, 0xE2, 0xB5, 0x3D, 0x75, 0x3A, 0x12, 0x5D, 0xA0, 0xCB,
- 0x86, 0xF6, 0x9D, 0x77, 0x04, 0x0C, 0x2F, 0x95, 0xE6, 0x93, 0xDD, 0xF3, 0x6F, 0xBD, 0x95, 0xB6,
- 0x34, 0x31, 0xBC, 0x8D, 0x87, 0x3A, 0x5C, 0xDA, 0x15, 0xA5, 0x74, 0x60, 0x9F, 0x55, 0x50, 0xE0,
- 0xAD, 0xD3, 0x50, 0x62, 0xCC, 0x34, 0xE3, 0x72, 0x83, 0x72, 0x37, 0x3B, 0x80, 0xA9, 0x75, 0x46,
- 0x33, 0xBA, 0x99, 0xE1, 0xE4, 0xC0, 0x15, 0x72, 0x01, 0x2A, 0x55, 0x74, 0xDD, 0xE1, 0x9A, 0x3D,
- 0x9B, 0x41, 0xDC, 0x85, 0xF7, 0x61, 0xB7, 0x90, 0x84, 0xC8, 0x62, 0x25, 0x12, 0x41, 0x91, 0xC0,
- 0xF0, 0xCC, 0xBC, 0x43, 0x81, 0xC0, 0xC2, 0x6C, 0x18, 0xB5, 0x8F, 0x99, 0x56, 0x00, 0xCB, 0x11,
- 0x9E, 0x81, 0x09, 0x87, 0xD4, 0x76, 0x5D, 0x6F, 0x0D, 0xB7, 0x5C, 0xB6, 0xBC, 0x1C, 0x82, 0xCD,
- 0x25, 0x27, 0xBB, 0xA0, 0x2A, 0x11, 0x83, 0x54, 0x3B, 0xDE, 0xFB, 0xAE, 0xAB, 0x85, 0x70, 0x91,
- 0x2B, 0x14, 0x82, 0x1F, 0xDC, 0x73, 0xCF, 0xDF, 0x84, 0x6A, 0xC0, 0xC3, 0xF7, 0xE2, 0x5E, 0xC4,
- 0x3B, 0xCB, 0xD8, 0xD9, 0x3A, 0xFC, 0xA4, 0x9D, 0x14, 0xA9, 0xC6, 0x85, 0x4D, 0x1E, 0xA8, 0xEA,
- 0x9B, 0xDC, 0xA1, 0x2D, 0x31, 0x78, 0x3D, 0xE0, 0x7F, 0xCD, 0x14, 0xA1, 0xC6, 0xEB, 0x85, 0x79,
- 0x72, 0x21, 0x2A, 0x75, 0xA4, 0x5A, 0x64, 0xEA, 0xDC, 0xE3, 0xE0, 0xA1, 0xDE, 0x7A, 0x0B, 0xA1,
- 0x83, 0xD5, 0x47, 0x55, 0x33, 0xD3, 0x44, 0x10, 0x47, 0xFA, 0xB0, 0x93, 0x76, 0x52, 0xA4, 0x1A,
- 0x17, 0x76, 0x79, 0x10, 0x00, 0xF5, 0x42, 0x68, 0xD3, 0x55, 0x12, 0xFC, 0x4B, 0x47, 0x98, 0x7A,
- 0x8C, 0x68, 0x5F, 0xFF, 0xD2, 0xDF, 0x25, 0x45, 0x56, 0xC2, 0x8E, 0x24, 0xF8, 0xC0, 0xA2, 0x18,
- 0xA0, 0xFC, 0x74, 0x0C, 0xB8, 0x3E, 0xC6, 0x2E, 0x42, 0x1B, 0x31, 0x82, 0x78, 0xDC, 0xCD, 0x7A,
- 0x9B, 0xFC, 0x48, 0x9F, 0x53, 0xBE, 0x85, 0xEE, 0x3E, 0x0B, 0xBB, 0xA6, 0x9A, 0x1C, 0xEC, 0x9A,
- 0x0F, 0x2A, 0x5C, 0x4E, 0x6C, 0xA0, 0xAB, 0x24, 0x2C, 0x52, 0x7F, 0xAA, 0x68, 0x9C, 0x50, 0x84,
- 0xED, 0xC2, 0xD9, 0xCF, 0xC9, 0xAE, 0x41, 0x5A, 0x48, 0x82, 0x0F, 0x6C, 0x8A, 0x01, 0x88, 0x48,
- 0x04, 0xD4, 0x50, 0x73, 0x73, 0x73, 0x73, 0x31, 0x1B, 0x2F, 0x54, 0x16, 0x3F, 0xD3, 0x35, 0x95,
- 0xF4, 0x60, 0xD6, 0x7C, 0xD0, 0x54, 0x12, 0xB0, 0x3F, 0x60, 0x52, 0x49, 0xB8, 0xB8, 0xFD, 0xB8,
- 0xE8, 0x98, 0xD0, 0x8A, 0x84, 0xBB, 0x29, 0xA9, 0x53, 0x47, 0x25, 0xEC, 0x48, 0xC7, 0x06, 0x51,
- 0x05, 0x7E, 0x9B, 0x1D, 0x50, 0x0C, 0x4D, 0x83, 0x3B, 0xD8, 0xE3, 0xBE, 0x15, 0x8B, 0x17, 0x94,
- 0xC1, 0xAF, 0xAE, 0x28, 0xFA, 0xF9, 0x7D, 0x7B, 0x26, 0x39, 0x9C, 0xB8, 0xD4, 0x0D, 0x98, 0xE7,
- 0x0F, 0xB8, 0x4A, 0xC2, 0x9B, 0xA8, 0x91, 0xA0, 0x2B, 0xA9, 0xB4, 0xFE, 0xD3, 0x76, 0xB4, 0xC9,
- 0x31, 0xEC, 0xF8, 0x89, 0x72, 0xD8, 0x8A, 0x5D, 0x05, 0x80, 0x5D, 0x03, 0xE5, 0x36, 0xE9, 0xB4,
- 0x90, 0x06, 0x1F, 0x78, 0xF7, 0x8F, 0x3C, 0x16, 0xF6, 0x84, 0xA3, 0x51, 0x38, 0x05, 0xBC, 0xD6,
- 0x17, 0x02, 0x9E, 0xA7, 0x76, 0xC1, 0x9D, 0xBF, 0x9F, 0xFB, 0x70, 0xD1, 0xFE, 0xC3, 0xA9, 0x13,
- 0x4C, 0x80, 0x18, 0xCD, 0x07, 0x6C, 0x17, 0xB0, 0xAB, 0xA8, 0xA9, 0x24, 0x94, 0x5E, 0xAF, 0xA0,
- 0x31, 0x86, 0xBE, 0x07, 0xE8, 0xC0, 0xB6, 0xEA, 0x0E, 0x32, 0xBC, 0x70, 0xC8, 0x0B, 0x9B, 0x3F,
- 0x0B, 0x45, 0x0E, 0x86, 0xFD, 0x24, 0x12, 0xA1, 0x6B, 0x3E, 0xB0, 0x75, 0xD9, 0x0F, 0x46, 0xDD,
- 0x93, 0x50, 0xF1, 0xE0, 0xE4, 0x87, 0xDE, 0x69, 0x6E, 0xDD, 0x73, 0x21, 0xEB, 0x10, 0xCC, 0x21,
- 0x9D, 0x84, 0xB2, 0x93, 0x30, 0x38, 0x73, 0xE3, 0x36, 0xEB, 0x7C, 0x22, 0x1F, 0x21, 0x16, 0x63,
- 0x63, 0xA6, 0x59, 0x49, 0x58, 0x86, 0x2A, 0x8B, 0x20, 0x6C, 0x31, 0x78, 0xC5, 0xA4, 0xD6, 0xBC,
- 0x4C, 0x1B, 0x8B, 0xEE, 0x0D, 0xE8, 0x92, 0x0F, 0x6C, 0x5F, 0xE4, 0xE8, 0x03, 0xA4, 0x0C, 0x14,
- 0x09, 0x75, 0x56, 0x1C, 0xAE, 0x9D, 0x92, 0x7D, 0xC3, 0x76, 0x96, 0xD4, 0x99, 0x4A, 0xC2, 0x9B,
- 0xD0, 0xE1, 0x0F, 0x5C, 0x39, 0x2D, 0x0D, 0x5A, 0x12, 0x09, 0x90, 0xEA, 0xB8, 0xF1, 0xC0, 0x57,
- 0xA8, 0x36, 0xF6, 0x1F, 0xFC, 0xF8, 0x80, 0xAA, 0xEC, 0x4E, 0xF1, 0xD9, 0x34, 0x60, 0x16, 0x46,
- 0x53, 0xEA, 0xD0, 0xE4, 0x12, 0xFE, 0xE2, 0x76, 0xB7, 0xD9, 0x52, 0x25, 0x21, 0xC3, 0x48, 0xF5,
- 0x93, 0x9E, 0xC5, 0x64, 0x73, 0x96, 0x57, 0x97, 0x0C, 0x98, 0xE5, 0x81, 0x54, 0x49, 0xC8, 0x22,
- 0xD2, 0x15, 0xED, 0xA6, 0x86, 0x1B, 0x97, 0x9E, 0x77, 0xED, 0x84, 0x99, 0xDC, 0x66, 0xA2, 0x40,
- 0xA6, 0x74, 0x12, 0xEC, 0xFA, 0x07, 0xB3, 0x91, 0xF2, 0x5E, 0xD0, 0xF4, 0x0F, 0x92, 0x4B, 0x25,
- 0xDB, 0x2A, 0x33, 0xE7, 0x04, 0xD2, 0xFD, 0xBA, 0x2C, 0x0D, 0x77, 0x18, 0xA7, 0xF7, 0xB6, 0xEE,
- 0x09, 0x46, 0xCE, 0x64, 0xEA, 0x7C, 0x46, 0x1D, 0x56, 0xFD, 0x03, 0x9C, 0xC7, 0xDC, 0xAB, 0x28,
- 0x53, 0xA7, 0x2A, 0xD9, 0x52, 0x7D, 0xE9, 0xBD, 0x48, 0x97, 0x0F, 0x2C, 0xA3, 0x88, 0xDA, 0xA2,
- 0xD1, 0x63, 0xCA, 0x0F, 0xFC, 0xE1, 0x5F, 0xBF, 0xFC, 0xA3, 0xF4, 0x88, 0xC5, 0x87, 0x34, 0x89,
- 0xD0, 0x43, 0xC8, 0x88, 0x3C, 0xA8, 0x1A, 0x11, 0x2E, 0x81, 0xE9, 0xA5, 0x37, 0xF4, 0xD3, 0x4D,
- 0xEC, 0x65, 0x0A, 0x76, 0xFD, 0x03, 0xFC, 0x8F, 0x6F, 0x12, 0xA1, 0x6A, 0xA8, 0x9C, 0x4C, 0x4C,
- 0x17, 0xE9, 0xF4, 0x0F, 0x62, 0x6C, 0x15, 0x6C, 0xB8, 0xE0, 0x56, 0x25, 0x3A, 0xF4, 0xEF, 0x50,
- 0x64, 0x6C, 0x70, 0xCA, 0x10, 0xAC, 0xF3, 0x07, 0x0C, 0x75, 0x53, 0xE5, 0xFC, 0x40, 0xE6, 0x91,
- 0x56, 0x3F, 0xD1, 0x66, 0xAB, 0x60, 0xDF, 0xE4, 0xA2, 0x57, 0x6F, 0x1C, 0xFF, 0x27, 0xD7, 0x1F,
- 0x9E, 0x48, 0x87, 0x58, 0x42, 0xC4, 0xB0, 0x01, 0x99, 0x44, 0x48, 0x9D, 0x8C, 0x44, 0x57, 0x48,
- 0xB7, 0x5D, 0x30, 0x6D, 0x3A, 0x0C, 0xAE, 0x47, 0x4D, 0xB1, 0xD0, 0x27, 0xE6, 0x0D, 0xFE, 0x42,
- 0xE6, 0x8D, 0xD8, 0xD8, 0xF5, 0x0F, 0xC0, 0x6A, 0x12, 0x01, 0x5B, 0x82, 0xAA, 0x41, 0x27, 0x60,
- 0xE2, 0x09, 0x54, 0x7D, 0x28, 0x79, 0x1C, 0xD4, 0x19, 0x74, 0x7D, 0x06, 0xCF, 0x86, 0x7F, 0x7D,
- 0xE8, 0xE4, 0xFE, 0x27, 0x82, 0xE7, 0xF9, 0xFD, 0xAB, 0x52, 0x48, 0xAC, 0x37, 0x23, 0x03, 0xA3,
- 0xF1, 0x87, 0xFE, 0xFC, 0x76, 0xA8, 0xA9, 0xEE, 0xBD, 0xF7, 0x70, 0x7C, 0x96, 0x71, 0x75, 0x45,
- 0xBB, 0x3C, 0xB0, 0x99, 0x44, 0xA8, 0xEC, 0x17, 0xDE, 0x33, 0xE6, 0xE9, 0x60, 0x34, 0x7C, 0x5B,
- 0x7D, 0xE0, 0xCD, 0x35, 0xA7, 0x3B, 0xBE, 0x1D, 0x78, 0xEA, 0xD1, 0xD7, 0x97, 0x1C, 0x0A, 0xAC,
- 0x8D, 0x04, 0xBE, 0x70, 0xA6, 0x6C, 0xD2, 0x5D, 0x81, 0xC0, 0x7D, 0xA9, 0xA4, 0xD6, 0x8B, 0x91,
- 0x1E, 0x1F, 0xA0, 0x3E, 0x82, 0xA1, 0x92, 0xF0, 0xA5, 0xFF, 0xD8, 0xB0, 0xF0, 0x0B, 0x6E, 0x3C,
- 0xAF, 0xA3, 0xBD, 0x48, 0x39, 0xD3, 0x41, 0x07, 0xB8, 0x64, 0x0E, 0x76, 0xFD, 0x03, 0x9B, 0x49,
- 0x04, 0xDF, 0x0F, 0xD6, 0x2B, 0x8F, 0xBC, 0x5E, 0x33, 0xF2, 0xD8, 0x89, 0xB1, 0xFE, 0xCB, 0x3A,
- 0x23, 0xBE, 0x85, 0x78, 0x88, 0xD4, 0xF9, 0xFE, 0x89, 0x27, 0xEE, 0x1C, 0xE2, 0xBF, 0x0B, 0xAA,
- 0x5A, 0x33, 0xA6, 0x0E, 0x73, 0xEE, 0x23, 0xBD, 0x79, 0x24, 0xB4, 0xB1, 0xCB, 0x5A, 0x69, 0xA6,
- 0x18, 0x10, 0x3C, 0xF8, 0x31, 0x14, 0x45, 0xCE, 0x78, 0x3A, 0xCB, 0xFF, 0x8E, 0xCB, 0x90, 0x9E,
- 0x71, 0x99, 0x9C, 0xB7, 0xB1, 0xEA, 0x1F, 0xE8, 0x3D, 0x03, 0xDD, 0x51, 0xD4, 0xFE, 0xC8, 0x5B,
- 0xC7, 0x4F, 0x5C, 0x05, 0xFE, 0xF7, 0x71, 0xBD, 0x99, 0x5B, 0x64, 0xF6, 0x1D, 0x0D, 0x8E, 0x6F,
- 0x7D, 0x21, 0xA5, 0x54, 0x24, 0x32, 0xD1, 0x2E, 0xCC, 0x6A, 0xEF, 0x0C, 0xC3, 0xC4, 0xF2, 0xE1,
- 0xC3, 0x8A, 0xC2, 0x10, 0xE8, 0x0C, 0x1B, 0x27, 0xAA, 0x64, 0x18, 0x4E, 0xA7, 0x34, 0x4C, 0xFB,
- 0xD5, 0xA8, 0x91, 0xF7, 0xDF, 0x5F, 0x54, 0x59, 0xF4, 0x73, 0xE1, 0xB1, 0x67, 0xD2, 0xE1, 0xEB,
- 0x7C, 0x47, 0x07, 0xBF, 0x82, 0xCE, 0x39, 0xA5, 0x9A, 0xA7, 0x44, 0x97, 0x48, 0x77, 0x5E, 0xD9,
- 0xD2, 0x69, 0xFF, 0x16, 0x80, 0xF2, 0x69, 0xFA, 0x5A, 0xFF, 0xE7, 0x92, 0xAD, 0xBF, 0x49, 0x87,
- 0x5A, 0xD2, 0xB0, 0x9B, 0x44, 0xA8, 0x8C, 0x5E, 0x0D, 0x15, 0x87, 0x16, 0xFA, 0x50, 0xF5, 0x01,
- 0x7C, 0xFF, 0x1D, 0x28, 0x07, 0xDF, 0x81, 0x3E, 0xD5, 0x7E, 0xB8, 0xE8, 0x8E, 0x97, 0x30, 0xF0,
- 0x45, 0xF4, 0xBC, 0x57, 0x76, 0x10, 0x92, 0x42, 0x5A, 0x7C, 0xE0, 0x60, 0x27, 0x17, 0x99, 0x00,
- 0xCD, 0xE9, 0xCD, 0x56, 0x8E, 0xA5, 0x48, 0x2A, 0x25, 0xC4, 0x9E, 0xD2, 0xE0, 0x43, 0xEB, 0x6C,
- 0x17, 0x9D, 0x06, 0xAE, 0xFA, 0xC0, 0x6C, 0x32, 0x00, 0x1C, 0xA5, 0x0B, 0xA9, 0x40, 0x70, 0x4F,
- 0x89, 0x64, 0x90, 0x0E, 0x1F, 0xD8, 0x3B, 0xF1, 0xF4, 0xED, 0x01, 0x4E, 0xFF, 0xAB, 0xF0, 0xCE,
- 0x05, 0x23, 0x52, 0xA4, 0x95, 0x0A, 0xA4, 0x49, 0x84, 0xEC, 0x21, 0x03, 0xEB, 0x8D, 0xCF, 0x7E,
- 0x65, 0xBD, 0xF2, 0xD2, 0x2D, 0xCC, 0xF9, 0xF9, 0x97, 0xBF, 0xF7, 0xC5, 0xE7, 0x78, 0x78, 0xCA,
- 0x14, 0xBB, 0x84, 0x6E, 0x12, 0x01, 0xFF, 0xA5, 0xFE, 0x41, 0x86, 0x91, 0x2E, 0x1F, 0x98, 0x64,
- 0xC2, 0x94, 0x67, 0x7F, 0xD8, 0x00, 0xAF, 0x00, 0xD9, 0x4D, 0x6C, 0x80, 0x4D, 0xCF, 0x31, 0xDB,
- 0x18, 0x19, 0xB5, 0xBB, 0x2C, 0x20, 0xF5, 0x0F, 0xB2, 0x88, 0x4C, 0xE8, 0x1F, 0xCC, 0xDA, 0xCC,
- 0x7E, 0xC3, 0x6D, 0x87, 0xD1, 0x68, 0x0E, 0x27, 0x58, 0xE3, 0x0B, 0x5A, 0x91, 0x72, 0x02, 0x8E,
- 0x20, 0x93, 0x08, 0x26, 0x48, 0xCD, 0x82, 0x8C, 0x21, 0x23, 0xEB, 0x8D, 0x0C, 0xC1, 0xDD, 0xBE,
- 0xC9, 0x95, 0x23, 0x77, 0xF1, 0x1A, 0xCF, 0x0E, 0x1B, 0x48, 0x64, 0x0D, 0x19, 0xD1, 0x3F, 0x20,
- 0x44, 0x6A, 0x3F, 0xF1, 0x41, 0x38, 0x72, 0x58, 0xA9, 0x65, 0x75, 0x6E, 0x63, 0x03, 0xF9, 0xE1,
- 0xE6, 0x3B, 0x32, 0x26, 0x0F, 0x5A, 0x7F, 0xB9, 0x06, 0x3C, 0xA1, 0xE8, 0xE8, 0x62, 0x36, 0xC4,
- 0x97, 0xF2, 0xA0, 0xC0, 0x90, 0x11, 0xFD, 0x03, 0xC2, 0xE1, 0x6B, 0x77, 0x82, 0xDB, 0x3D, 0xE4,
- 0xD8, 0xDE, 0xF3, 0xE9, 0xCE, 0x2E, 0x0F, 0x24, 0x23, 0xE4, 0x39, 0x32, 0xA1, 0x7F, 0xC0, 0x71,
- 0xF6, 0x5A, 0x1C, 0xCC, 0x9D, 0x99, 0x30, 0x92, 0x6D, 0x68, 0x92, 0x6C, 0x50, 0x60, 0xC8, 0x80,
- 0xFE, 0x01, 0x87, 0x67, 0x72, 0xD1, 0xA9, 0xA3, 0x91, 0x48, 0x73, 0x09, 0x33, 0x7A, 0x2B, 0xFB,
- 0x07, 0x05, 0x86, 0x0C, 0x6D, 0x49, 0x0A, 0x87, 0x21, 0xAC, 0x8E, 0x2B, 0x75, 0x4F, 0x3E, 0x7B,
- 0x21, 0x53, 0x0D, 0x90, 0xF2, 0xA0, 0xC0, 0x90, 0x01, 0xFD, 0x03, 0x88, 0x74, 0x9C, 0x51, 0xBC,
- 0xE7, 0x4F, 0x88, 0x1C, 0x76, 0x43, 0xA8, 0x7E, 0x03, 0xFB, 0xF6, 0xA5, 0x3C, 0x28, 0x30, 0x64,
- 0x44, 0xFF, 0x00, 0xD5, 0x90, 0x90, 0x8E, 0xB7, 0xB3, 0x5A, 0x55, 0xF0, 0x88, 0x6F, 0xCE, 0x08,
- 0x16, 0x54, 0x64, 0x7C, 0x63, 0x83, 0x44, 0x66, 0x91, 0x81, 0x76, 0x61, 0xD6, 0x86, 0x49, 0x3A,
- 0x95, 0x96, 0xA2, 0x20, 0xDF, 0xF9, 0x96, 0xCE, 0x39, 0x9E, 0x12, 0xB9, 0x43, 0x46, 0xF4, 0x0F,
- 0x60, 0x1F, 0xBB, 0x4E, 0x84, 0x69, 0x17, 0x54, 0xBF, 0x2C, 0xBC, 0x64, 0x97, 0xA0, 0xA0, 0x90,
- 0x09, 0xFD, 0x83, 0xF0, 0x74, 0xE2, 0x0A, 0x25, 0x3A, 0xFA, 0x0F, 0x17, 0x7A, 0x8F, 0x65, 0xDB,
- 0xB2, 0xA6, 0x44, 0x56, 0x90, 0x09, 0xFD, 0x03, 0xD8, 0xB3, 0x1F, 0x2F, 0x93, 0xF6, 0x4D, 0x84,
- 0x1D, 0x59, 0xD5, 0x3F, 0x90, 0xC8, 0x1E, 0x32, 0xA1, 0x7F, 0x70, 0xEB, 0x8B, 0xF4, 0x53, 0x03,
- 0xEF, 0x79, 0x5E, 0xE8, 0xD3, 0x76, 0xEB, 0x7F, 0xA5, 0x47, 0x50, 0x22, 0xA7, 0xC8, 0x84, 0xFE,
- 0xC1, 0x6F, 0x7F, 0x20, 0x5C, 0x0D, 0xE5, 0x0D, 0xF0, 0x5B, 0xDD, 0x36, 0x02, 0xE9, 0x8B, 0x20,
- 0x34, 0x15, 0x32, 0x89, 0x7C, 0x46, 0x06, 0xF5, 0x0F, 0xEC, 0xA0, 0x73, 0xBA, 0xF1, 0xDA, 0x35,
- 0x2D, 0x89, 0xDC, 0x23, 0x73, 0xFA, 0x07, 0xB1, 0x20, 0x16, 0x90, 0x6C, 0x50, 0x18, 0xC8, 0x98,
- 0xFE, 0x81, 0x13, 0x02, 0x92, 0x0D, 0x0A, 0x05, 0xD9, 0x94, 0x07, 0x20, 0xD9, 0xA0, 0x60, 0x90,
- 0x31, 0xFD, 0x03, 0x89, 0x82, 0x46, 0xE6, 0xF4, 0x0F, 0x24, 0x0A, 0x19, 0x19, 0xD3, 0x3F, 0x90,
- 0x28, 0x68, 0x64, 0x4A, 0xFF, 0x20, 0xC2, 0x16, 0x1C, 0x3C, 0x3A, 0x39, 0x29, 0x2B, 0x0A, 0x0B,
- 0xE9, 0xF1, 0x01, 0x4A, 0x03, 0xDC, 0xCD, 0x08, 0x38, 0x8B, 0x40, 0x88, 0x84, 0x83, 0xA5, 0x1E,
- 0x26, 0x20, 0x42, 0x61, 0xC5, 0xC3, 0xAC, 0x2E, 0x67, 0x63, 0x1F, 0x8B, 0x44, 0x16, 0x21, 0xF8,
- 0xC0, 0xB6, 0x3A, 0x58, 0x99, 0x48, 0x5F, 0x00, 0x03, 0x03, 0x4C, 0xC7, 0x68, 0xAA, 0x40, 0xC8,
- 0xA7, 0x86, 0x50, 0x21, 0x81, 0x80, 0xE7, 0x32, 0xD0, 0x41, 0x18, 0x09, 0x9F, 0x97, 0xC8, 0x43,
- 0x68, 0xF2, 0xC0, 0xAE, 0x2F, 0x10, 0x5F, 0x83, 0xE8, 0x9D, 0x18, 0xA5, 0xB3, 0x18, 0x8D, 0x23,
- 0xD9, 0x28, 0x14, 0x1C, 0xF4, 0x76, 0xC1, 0xAE, 0x2F, 0x90, 0x40, 0x7F, 0xC0, 0x81, 0x0D, 0x12,
- 0xC6, 0x97, 0xC8, 0x7F, 0xA4, 0x33, 0x5E, 0xE8, 0x42, 0x1A, 0x48, 0x14, 0x20, 0x6C, 0x7C, 0x20,
- 0xD6, 0x08, 0x13, 0xC3, 0x51, 0x1E, 0x24, 0xFD, 0xB4, 0x44, 0x3E, 0xC2, 0xCA, 0x07, 0xC9, 0x55,
- 0x64, 0x7C, 0x79, 0x20, 0x19, 0xA1, 0x50, 0x61, 0xE1, 0x83, 0x24, 0xAB, 0x31, 0xAE, 0x3C, 0x48,
- 0x9A, 0x82, 0x44, 0xBE, 0xC1, 0xCC, 0x07, 0xC9, 0x56, 0x62, 0xA2, 0xFE, 0x81, 0x64, 0x84, 0xC2,
- 0x84, 0x99, 0x0F, 0x92, 0x5D, 0x1D, 0x4C, 0x20, 0x0F, 0xE4, 0x0A, 0x63, 0x81, 0xC2, 0xD2, 0x2E,
- 0x24, 0x59, 0x89, 0x09, 0xE4, 0x81, 0x64, 0x83, 0x02, 0x85, 0xB5, 0x9F, 0x98, 0x5C, 0x35, 0xC6,
- 0x97, 0x07, 0x92, 0x0D, 0x0A, 0x15, 0xB6, 0x71, 0x63, 0x52, 0x15, 0x19, 0x57, 0x1E, 0x48, 0x36,
- 0x28, 0x58, 0xA4, 0x33, 0x8F, 0x94, 0xA8, 0x7F, 0x20, 0x51, 0x98, 0x90, 0xF3, 0x89, 0x12, 0x04,
- 0x6D, 0x7D, 0xC1, 0xBE, 0x34, 0x94, 0x68, 0xA9, 0xC8, 0x49, 0x1E, 0xC8, 0xA5, 0xA5, 0xC2, 0x86,
- 0xE0, 0x03, 0xBB, 0xBE, 0x40, 0x42, 0xFD, 0x01, 0x07, 0x79, 0x20, 0xED, 0xDC, 0x16, 0x38, 0x84,
- 0xD9, 0xCB, 0x94, 0x9E, 0xB1, 0xDA, 0x36, 0x60, 0x48, 0x8E, 0x40, 0x8D, 0xEC, 0x47, 0xE4, 0x2B,
- 0x18, 0x1F, 0xF4, 0x90, 0xDE, 0xB1, 0x54, 0x6F, 0xCE, 0x5F, 0x30, 0x3E, 0xE8, 0xA1, 0xCF, 0x54,
- 0x4A, 0x83, 0xFC, 0x85, 0xB4, 0x5A, 0x2D, 0x41, 0x90, 0x7C, 0x20, 0x41, 0x60, 0xED, 0x42, 0x6D,
- 0xF7, 0x68, 0x24, 0x83, 0xD9, 0xD8, 0x28, 0xF4, 0x40, 0x32, 0x12, 0xA9, 0x83, 0xAA, 0x46, 0x8C,
- 0x17, 0x6E, 0xEF, 0x06, 0x99, 0xA4, 0xC0, 0xC7, 0x13, 0x59, 0x4F, 0x46, 0x22, 0x75, 0xF0, 0xAA,
- 0x11, 0xF3, 0x07, 0xFC, 0xFC, 0xAB, 0xEC, 0x41, 0x74, 0x11, 0xB3, 0x9D, 0x4C, 0x86, 0x51, 0x91,
- 0xF9, 0xFC, 0x66, 0x81, 0x64, 0x0C, 0x12, 0xA7, 0x61, 0xDF, 0xA2, 0xC0, 0x7F, 0xB4, 0xF9, 0x44,
- 0x39, 0x64, 0x88, 0x05, 0xB6, 0x63, 0x99, 0xCE, 0x6F, 0x16, 0x48, 0xC6, 0xA0, 0xAB, 0x34, 0x1C,
- 0xB7, 0x18, 0x64, 0x68, 0x5F, 0x9B, 0x44, 0x01, 0xC1, 0x89, 0x4B, 0xE4, 0x78, 0x41, 0x82, 0xE0,
- 0xC4, 0x07, 0x78, 0x8A, 0x7A, 0x8A, 0x54, 0xD2, 0x42, 0x0F, 0x25, 0xD3, 0xB3, 0x48, 0xED, 0xA5,
- 0xF2, 0xA7, 0x08, 0x2C, 0x7C, 0x50, 0xEA, 0xF7, 0xFB, 0xFB, 0xBF, 0x3A, 0x14, 0xCF, 0xC5, 0xCC,
- 0x2A, 0x7A, 0x28, 0x99, 0x1E, 0x45, 0x95, 0xD3, 0x4B, 0xC5, 0xAF, 0x66, 0x7B, 0xEC, 0x6C, 0x30,
- 0x84, 0x9D, 0x64, 0xC2, 0x34, 0x2C, 0xFD, 0x03, 0x76, 0x5A, 0x36, 0x9C, 0xE4, 0xE7, 0x65, 0x27,
- 0x8D, 0xDA, 0xA9, 0xA9, 0xC5, 0xEF, 0xA9, 0x64, 0x7A, 0x16, 0x4E, 0x2F, 0x35, 0x87, 0x4E, 0x95,
- 0x4D, 0x3A, 0x76, 0xCF, 0xC2, 0x6F, 0x55, 0x1E, 0x8B, 0x6D, 0x17, 0xAA, 0x88, 0x4B, 0x91, 0xBD,
- 0x4B, 0x1E, 0xAF, 0x1A, 0x3A, 0xD9, 0xEF, 0x5F, 0x05, 0xCF, 0xF8, 0xC9, 0x3D, 0x64, 0x94, 0xFF,
- 0x81, 0x71, 0x78, 0xC7, 0x42, 0xCC, 0xF1, 0x6B, 0xD3, 0x9B, 0x1F, 0xEA, 0xA1, 0x64, 0x7A, 0x16,
- 0xC6, 0x4B, 0xD1, 0xEB, 0x0C, 0x7C, 0x7D, 0xE8, 0xB1, 0x71, 0xF8, 0xE1, 0xAF, 0x8A, 0x79, 0x99,
- 0x98, 0xD8, 0xB7, 0xB6, 0x96, 0xFF, 0xE3, 0xB8, 0x55, 0x10, 0x2C, 0xFF, 0x26, 0x16, 0x80, 0xD3,
- 0xEB, 0xA7, 0x0B, 0x56, 0xAA, 0x2C, 0x33, 0xC7, 0x30, 0x8D, 0xB9, 0x20, 0x0E, 0xC5, 0xC7, 0xFD,
- 0x05, 0xD6, 0x1D, 0x06, 0x56, 0x7D, 0xE5, 0x72, 0x94, 0x56, 0xA7, 0xD0, 0x11, 0xBC, 0xAD, 0x3E,
- 0xF0, 0xE6, 0x9A, 0xD3, 0x81, 0x2F, 0x04, 0xB6, 0xAC, 0x6D, 0x5A, 0x18, 0x08, 0xFC, 0x65, 0x13,
- 0x74, 0x7C, 0x7B, 0xCB, 0x9A, 0xBB, 0xB6, 0xAC, 0x3D, 0xCA, 0x42, 0x4C, 0x02, 0x86, 0x6A, 0x27,
- 0xC5, 0x1A, 0xEA, 0xA1, 0x64, 0x7A, 0x16, 0xB6, 0x97, 0x7A, 0x7D, 0xC9, 0xA1, 0xC0, 0xDA, 0x08,
- 0x14, 0x1F, 0x0C, 0x6C, 0xF1, 0xDD, 0x61, 0x7F, 0x99, 0x98, 0xD8, 0x4D, 0x2F, 0x96, 0x36, 0xFC,
- 0xF5, 0xF9, 0x57, 0x61, 0xD7, 0x98, 0x3B, 0x3A, 0xBE, 0x1D, 0xD8, 0xB2, 0xE6, 0xC3, 0xD8, 0x27,
- 0xD2, 0x04, 0x2B, 0xD5, 0x2A, 0xCA, 0x8C, 0x1B, 0xD3, 0xD8, 0xA2, 0x79, 0x13, 0x13, 0x58, 0x18,
- 0x21, 0xB6, 0x5D, 0x20, 0x86, 0xD9, 0x7B, 0x62, 0x2C, 0x40, 0x51, 0xC4, 0x7F, 0x17, 0xB8, 0x3D,
- 0x50, 0x35, 0x37, 0x02, 0xBE, 0xD3, 0xBE, 0x85, 0x1F, 0xF4, 0x59, 0xF8, 0x81, 0x87, 0x87, 0x18,
- 0xC6, 0xB4, 0x79, 0xDD, 0xA4, 0x26, 0xB3, 0x7B, 0x28, 0x99, 0x9E, 0x85, 0xED, 0xA5, 0xCE, 0xF7,
- 0x4F, 0xDC, 0x7F, 0x27, 0xDD, 0x56, 0xFD, 0xD3, 0xFD, 0xC7, 0x6C, 0x2F, 0x13, 0x1B, 0x9B, 0x85,
- 0xCD, 0x38, 0x7E, 0xE2, 0xDD, 0xAB, 0xC1, 0xB7, 0x10, 0x66, 0xF4, 0x7D, 0x2C, 0xF6, 0x89, 0x34,
- 0xC1, 0x4A, 0x75, 0x24, 0x65, 0x06, 0xD8, 0xC1, 0x59, 0x1C, 0x9C, 0x05, 0xCC, 0x4D, 0x43, 0x9C,
- 0xF9, 0x03, 0x3D, 0x9F, 0x00, 0xD5, 0x37, 0x2F, 0xBF, 0xA7, 0xEA, 0x1A, 0x6B, 0x88, 0x81, 0xEE,
- 0xD5, 0x4C, 0x0F, 0x25, 0xD3, 0xB3, 0xE0, 0x59, 0x3F, 0x1A, 0x1C, 0xDF, 0xFA, 0x02, 0xFE, 0xDE,
- 0xBA, 0xF4, 0x9E, 0x2A, 0xDB, 0xCB, 0x38, 0xC4, 0xA6, 0x3A, 0xF2, 0xDD, 0xFD, 0xF3, 0xDF, 0x6C,
- 0x13, 0x95, 0x95, 0xE8, 0x89, 0x54, 0x50, 0xF5, 0x19, 0x2A, 0x55, 0x1F, 0x65, 0x86, 0x6C, 0xA1,
- 0x6B, 0x88, 0x55, 0x2C, 0x77, 0x9E, 0x3F, 0x98, 0x52, 0xF4, 0x73, 0xE3, 0x06, 0x39, 0x74, 0x8F,
- 0xCE, 0x9A, 0x96, 0x90, 0xEE, 0xA2, 0x87, 0x92, 0xE9, 0x59, 0xF0, 0xAC, 0x57, 0x5D, 0xE7, 0x3B,
- 0x3A, 0xF8, 0x15, 0x80, 0x67, 0x46, 0xDE, 0x07, 0x95, 0x09, 0x5E, 0x46, 0x7B, 0xD1, 0x08, 0xBE,
- 0xFA, 0x9C, 0x1F, 0x8D, 0x2E, 0x23, 0xF7, 0xAE, 0xB6, 0x7B, 0x33, 0xF6, 0xFA, 0xAC, 0x54, 0xAB,
- 0x29, 0x33, 0xEB, 0x59, 0x1A, 0xF1, 0xE0, 0xCC, 0x07, 0xBE, 0xDF, 0xAF, 0xC6, 0x9E, 0x05, 0x1F,
- 0xD5, 0xCC, 0x5A, 0x51, 0xEE, 0xBF, 0x57, 0x17, 0x1B, 0x3C, 0x24, 0x43, 0x83, 0x9C, 0x1E, 0x4A,
- 0xA6, 0x67, 0xC1, 0xB3, 0x3E, 0xB2, 0xDA, 0xEF, 0x1F, 0x73, 0x07, 0x04, 0x97, 0xBF, 0xEB, 0xEF,
- 0x7F, 0x26, 0xC1, 0xCB, 0x88, 0x17, 0x9D, 0xB3, 0x6A, 0xEC, 0x5C, 0x98, 0x33, 0xEC, 0x6A, 0xA0,
- 0x9E, 0xC3, 0xBC, 0xF7, 0xCF, 0xCB, 0xC4, 0xEB, 0x23, 0xA5, 0xFE, 0xA3, 0x59, 0xA9, 0x4E, 0xA1,
- 0xCC, 0xDC, 0xC3, 0xD2, 0x88, 0x17, 0x59, 0x41, 0x53, 0x47, 0x50, 0x7B, 0x7B, 0x5D, 0xB6, 0x67,
- 0xBD, 0x69, 0x8B, 0x43, 0x0F, 0x24, 0x93, 0x51, 0x64, 0x21, 0xBF, 0x09, 0x49, 0xBE, 0x7D, 0xF5,
- 0x81, 0xC1, 0x55, 0xD7, 0x74, 0xBB, 0x45, 0xE8, 0x2A, 0xDB, 0x96, 0xDD, 0x26, 0xB5, 0xB7, 0xE3,
- 0x91, 0xEC, 0x78, 0x95, 0xEB, 0x0B, 0xF9, 0x83, 0x77, 0xEF, 0xCE, 0x4C, 0xA7, 0xA0, 0x0B, 0x38,
- 0x6E, 0x31, 0xD0, 0xF8, 0x20, 0xCB, 0x63, 0x32, 0xAD, 0x9F, 0x57, 0x68, 0xAA, 0x28, 0x59, 0xC8,
- 0x6F, 0x7C, 0x92, 0x97, 0x61, 0x98, 0x7F, 0x4B, 0x63, 0x63, 0xD2, 0xA4, 0xE2, 0x22, 0x51, 0xB6,
- 0x9D, 0x95, 0x40, 0x04, 0x1F, 0x64, 0x7B, 0xFF, 0x81, 0xD0, 0x6B, 0x2F, 0xB4, 0x6D, 0x0E, 0x59,
- 0xC8, 0x6F, 0x4F, 0x14, 0x41, 0xC2, 0x34, 0x6C, 0x5B, 0x0C, 0xAC, 0xFA, 0x07, 0x42, 0x73, 0xE1,
- 0xF9, 0x20, 0xCC, 0x9C, 0x91, 0x88, 0x48, 0xBA, 0x30, 0xEB, 0xA1, 0x04, 0xF8, 0x59, 0x6F, 0x51,
- 0xD7, 0xDE, 0x8A, 0x7E, 0xD8, 0x4D, 0xE5, 0x86, 0x17, 0x25, 0x7A, 0x0A, 0xD6, 0x4D, 0x88, 0x8E,
- 0xFA, 0x07, 0xE1, 0x76, 0xD7, 0xA8, 0x9D, 0xAE, 0x89, 0xDE, 0xD6, 0xC3, 0xD9, 0xB4, 0x87, 0xAA,
- 0x2A, 0xC5, 0xED, 0xAE, 0xBD, 0x53, 0xDD, 0xD8, 0x58, 0x9C, 0x1D, 0x80, 0xB7, 0x12, 0x3D, 0x0A,
- 0x70, 0xD4, 0x3F, 0xB0, 0xF0, 0x41, 0x6D, 0xD1, 0x48, 0xD7, 0xA0, 0x03, 0xEF, 0x6F, 0x3E, 0x39,
- 0x70, 0x7D, 0x97, 0xB5, 0x99, 0x3E, 0xA2, 0xEE, 0x8E, 0x52, 0xE0, 0x07, 0xFB, 0xD4, 0xCD, 0x01,
- 0x71, 0x32, 0xAC, 0x44, 0x6E, 0x61, 0x99, 0x3F, 0xA8, 0x1A, 0x11, 0xF6, 0xC3, 0xF4, 0xD2, 0x1B,
- 0xFA, 0xFD, 0x34, 0x3D, 0x62, 0xC9, 0x01, 0x93, 0xA4, 0xF9, 0xAC, 0x0E, 0x71, 0x2B, 0xD9, 0x20,
- 0x1F, 0x60, 0xE1, 0x83, 0x0D, 0x7F, 0x1E, 0xE6, 0x8B, 0x0E, 0x05, 0x28, 0xEA, 0x9F, 0x16, 0xAD,
- 0xD4, 0x50, 0x07, 0x2A, 0x63, 0x01, 0x69, 0xC1, 0x3F, 0x1F, 0x60, 0xE6, 0x83, 0x7D, 0x93, 0x8B,
- 0x5E, 0x2D, 0x1E, 0xFF, 0xE7, 0xC0, 0xC6, 0x9F, 0x68, 0x3E, 0xDB, 0x15, 0x45, 0x41, 0xD1, 0x9D,
- 0x05, 0x04, 0xA0, 0x42, 0x08, 0x02, 0x29, 0x0F, 0xF2, 0x01, 0x26, 0x3E, 0x08, 0xAE, 0x87, 0x76,
- 0x08, 0x75, 0xFC, 0xD3, 0xD0, 0x2F, 0x14, 0x0B, 0x9F, 0xCD, 0x73, 0x1B, 0x55, 0xF5, 0xEB, 0xC7,
- 0x53, 0xA7, 0xDA, 0x15, 0xA8, 0xEE, 0xD9, 0xD8, 0xA1, 0x1D, 0xA4, 0x3C, 0xC8, 0x0B, 0x98, 0xF8,
- 0x60, 0xF5, 0x9F, 0xDF, 0x0E, 0x7D, 0x54, 0xAF, 0xBE, 0xE7, 0xF3, 0x80, 0x58, 0x90, 0xD8, 0x75,
- 0x60, 0x38, 0xC0, 0x57, 0x87, 0xB7, 0x7A, 0x1B, 0x52, 0x27, 0x9C, 0x08, 0xAA, 0x12, 0x25, 0x56,
- 0xE8, 0xDC, 0x0B, 0x78, 0x36, 0xBC, 0x94, 0x07, 0xF9, 0x00, 0xD3, 0x78, 0xE1, 0xFB, 0xD7, 0x0F,
- 0xFB, 0xB8, 0xF3, 0x08, 0x56, 0xCB, 0xD9, 0x22, 0xF5, 0x8C, 0x8F, 0xCE, 0xD3, 0x58, 0xB9, 0x20,
- 0x3D, 0xA2, 0x5D, 0x42, 0xA5, 0xA1, 0x0B, 0xF2, 0xC0, 0xAC, 0x6A, 0x90, 0xE3, 0x85, 0xBC, 0x80,
- 0x89, 0x0F, 0x5A, 0x7D, 0x1F, 0x43, 0x51, 0x79, 0x53, 0x51, 0x67, 0xF9, 0x5E, 0xF0, 0x84, 0x3D,
- 0xE3, 0x7C, 0x50, 0xC1, 0xE7, 0xBB, 0x4B, 0xE9, 0x68, 0x8D, 0x0C, 0xC2, 0x5A, 0xF1, 0x92, 0x0D,
- 0xF2, 0x01, 0xA6, 0x76, 0xE1, 0xAA, 0xF6, 0x4E, 0x0F, 0x14, 0x8F, 0x1C, 0x32, 0xBA, 0x04, 0x20,
- 0xD0, 0x19, 0x9E, 0x05, 0x70, 0xFC, 0x44, 0x7A, 0x44, 0xBB, 0x04, 0xB6, 0x08, 0x6C, 0xEC, 0x48,
- 0x3C, 0x20, 0xFB, 0x07, 0xF9, 0x00, 0xCB, 0x3C, 0xD2, 0xB7, 0xF0, 0xFF, 0x72, 0xC0, 0xDA, 0xD9,
- 0x3D, 0x7A, 0xEB, 0x6F, 0xD0, 0xBD, 0x7E, 0xC2, 0xA1, 0xE1, 0xF0, 0xCB, 0xCF, 0x95, 0x0E, 0x3C,
- 0x58, 0x9E, 0x32, 0xE1, 0xF8, 0xD8, 0x3B, 0x45, 0x38, 0xA2, 0x1D, 0x2B, 0xAE, 0x05, 0x4C, 0xAD,
- 0xB5, 0xAC, 0x7E, 0x38, 0xFD, 0xA7, 0x4F, 0x52, 0xA2, 0xBB, 0x30, 0x8F, 0x1B, 0x5F, 0xC2, 0x7F,
- 0x85, 0x0D, 0xEA, 0x47, 0x2A, 0xC7, 0xC8, 0x63, 0xDE, 0xA6, 0x11, 0x8A, 0xF2, 0x8B, 0xCC, 0xD7,
- 0x4F, 0x27, 0x1B, 0x2B, 0x44, 0x79, 0xDA, 0x52, 0x1E, 0xE4, 0x03, 0xCC, 0xF2, 0xE0, 0x96, 0xBF,
- 0x02, 0x7E, 0x9D, 0x54, 0x2F, 0x3B, 0x2E, 0x18, 0xC1, 0x7C, 0xE6, 0xB1, 0xC6, 0x3B, 0xD3, 0xFD,
- 0x03, 0x6C, 0x14, 0x00, 0x4E, 0x94, 0x75, 0xF8, 0x8B, 0xAF, 0x44, 0x87, 0x0A, 0xA5, 0x6D, 0xC0,
- 0xFE, 0x25, 0x72, 0x07, 0x13, 0x1F, 0x3C, 0xFB, 0xC3, 0x75, 0xB0, 0xE1, 0x96, 0x97, 0x6E, 0x41,
- 0xE7, 0xE7, 0x5F, 0xFE, 0xDE, 0x17, 0x9F, 0x4B, 0x8F, 0x60, 0xD7, 0xA0, 0x6D, 0xD9, 0x01, 0x28,
- 0x43, 0xA5, 0xD9, 0x0E, 0xFF, 0x64, 0x90, 0xE3, 0x85, 0xBC, 0x80, 0x89, 0x0F, 0xA6, 0x3C, 0xF2,
- 0x95, 0x72, 0x78, 0x05, 0x76, 0xA2, 0xB3, 0x01, 0x36, 0x3D, 0xA7, 0xB5, 0xE2, 0x19, 0xC7, 0x80,
- 0x39, 0x6D, 0xA1, 0x3D, 0x70, 0x61, 0x91, 0x68, 0x92, 0x24, 0x1B, 0xE4, 0x03, 0x4C, 0x7C, 0xE0,
- 0x9B, 0xC5, 0x04, 0x76, 0x0F, 0xA0, 0x0F, 0xAA, 0xDE, 0xE8, 0x37, 0xB9, 0x5A, 0x87, 0xEF, 0xAD,
- 0x70, 0xAE, 0x12, 0x07, 0xFD, 0xC4, 0x70, 0xDB, 0x61, 0xF0, 0x54, 0xF4, 0x98, 0xE2, 0x62, 0x36,
- 0xD6, 0xD8, 0x25, 0xE2, 0xC3, 0xB9, 0x16, 0x62, 0xAB, 0x3B, 0xB8, 0x77, 0xFA, 0x64, 0xF7, 0x99,
- 0x5D, 0x53, 0xB3, 0x69, 0x3B, 0x3B, 0xFC, 0x42, 0xD8, 0x15, 0x05, 0xCF, 0x6D, 0x52, 0x4B, 0x36,
- 0x5F, 0x10, 0xB3, 0x7F, 0x21, 0x52, 0xFB, 0x89, 0x03, 0x6A, 0xE4, 0xB0, 0x52, 0x9B, 0x45, 0x15,
- 0xF3, 0xAD, 0xEB, 0x43, 0x2E, 0x70, 0xB9, 0x3A, 0xD7, 0x6F, 0xED, 0x36, 0x29, 0x89, 0xCC, 0x20,
- 0x86, 0x0F, 0x5A, 0x7F, 0xB9, 0x46, 0x55, 0x42, 0xD1, 0xD1, 0xC5, 0xD9, 0x33, 0xE8, 0xF4, 0xDB,
- 0xF7, 0x15, 0x35, 0x1C, 0x0E, 0x87, 0x55, 0x78, 0xFF, 0xB7, 0xDD, 0x26, 0x26, 0x91, 0x11, 0xC4,
- 0xF0, 0xC1, 0xE1, 0x6B, 0x4B, 0x4A, 0xDC, 0xBE, 0xA2, 0x63, 0x35, 0x9D, 0xA9, 0x13, 0x4B, 0x0E,
- 0x9D, 0x0F, 0x82, 0xAA, 0xAA, 0x1E, 0x0F, 0x35, 0x55, 0x1D, 0xD1, 0xE4, 0x9F, 0x6B, 0x9D, 0x61,
- 0x9F, 0xC7, 0x88, 0xF5, 0x29, 0x2C, 0xE4, 0x51, 0xFE, 0x63, 0xF7, 0xB5, 0x9D, 0xBD, 0x16, 0x95,
- 0x02, 0xD4, 0x09, 0xFF, 0x8C, 0x4E, 0x0F, 0xAA, 0xA1, 0x3C, 0x94, 0x1A, 0xBD, 0x24, 0x70, 0xF7,
- 0xD4, 0xD3, 0xA0, 0x2C, 0xBC, 0xFD, 0xF6, 0x85, 0x53, 0xA7, 0x4C, 0x99, 0x62, 0x6C, 0xAA, 0x08,
- 0x94, 0x29, 0xBE, 0xE3, 0x96, 0x2B, 0xFA, 0x5D, 0x11, 0x82, 0x56, 0x8F, 0xE2, 0x32, 0xAF, 0x7B,
- 0xE7, 0x7B, 0xE5, 0xAF, 0x9B, 0xC6, 0xF2, 0x87, 0xD9, 0x56, 0xEE, 0x16, 0xF7, 0x9B, 0xB1, 0x1C,
- 0x6D, 0xFA, 0x3C, 0xC9, 0x69, 0xF8, 0xB0, 0x77, 0x6D, 0xED, 0x8B, 0xB3, 0xBA, 0x88, 0x41, 0x1E,
- 0x7A, 0x60, 0xDD, 0xB4, 0x66, 0x51, 0x00, 0x94, 0x42, 0xC6, 0xAA, 0x27, 0x86, 0x0F, 0x3C, 0x93,
- 0xC7, 0x76, 0x1E, 0x8D, 0x44, 0x9A, 0x3D, 0x45, 0x00, 0x53, 0x3B, 0xD5, 0x96, 0x15, 0x8F, 0xA4,
- 0x4C, 0xB3, 0x0B, 0x1C, 0x19, 0xF0, 0xB3, 0xA6, 0x3B, 0xEF, 0x7B, 0xE8, 0xA1, 0x15, 0xFF, 0x80,
- 0x37, 0xAD, 0xBA, 0xF7, 0x33, 0x8B, 0xD4, 0x4D, 0xD7, 0x5A, 0xAE, 0xB0, 0xB9, 0x04, 0x0D, 0x8A,
- 0xFC, 0xEC, 0x90, 0xBA, 0xF5, 0x9A, 0xC2, 0xF9, 0xEE, 0xD7, 0x2D, 0xE7, 0x45, 0x5A, 0xF3, 0x80,
- 0xDA, 0xFE, 0x1C, 0xF2, 0x2F, 0xDD, 0xCF, 0x43, 0xF9, 0xF7, 0x94, 0x69, 0xA8, 0x0C, 0x42, 0xC3,
- 0x27, 0xC9, 0x65, 0xBC, 0xF1, 0x87, 0xD5, 0x96, 0xE9, 0x9D, 0xEA, 0x61, 0xFF, 0xC7, 0x0D, 0xD0,
- 0xFA, 0xA4, 0x51, 0x63, 0x99, 0xAC, 0x1E, 0x1B, 0x1F, 0x84, 0x83, 0x23, 0xC3, 0x07, 0xC6, 0x0E,
- 0x77, 0x4F, 0x2E, 0xB9, 0x90, 0x6F, 0x86, 0x28, 0x6D, 0x7E, 0x31, 0x94, 0x71, 0x3D, 0x94, 0xCB,
- 0x07, 0x74, 0x54, 0x47, 0xA3, 0xA1, 0x23, 0x98, 0x38, 0xAE, 0x6D, 0x02, 0x7E, 0x2E, 0xAE, 0x86,
- 0xC0, 0x63, 0x5F, 0x83, 0x4B, 0x43, 0x2D, 0xA6, 0x6B, 0x08, 0xE6, 0xB5, 0xB8, 0xD8, 0xB2, 0x64,
- 0xA5, 0xC8, 0xE5, 0xCF, 0x88, 0xFF, 0xD7, 0xED, 0x2E, 0x1A, 0x84, 0x5F, 0xC8, 0xF2, 0xD5, 0x59,
- 0x10, 0x55, 0xDD, 0xC7, 0xE6, 0x83, 0x62, 0xE7, 0xFA, 0xC5, 0xF7, 0x83, 0xFF, 0xFB, 0xC6, 0x7D,
- 0xEB, 0xD2, 0x25, 0xE6, 0x68, 0x5C, 0xC3, 0xA7, 0x8C, 0xBD, 0x51, 0xEB, 0x8C, 0x27, 0x7C, 0xC7,
- 0xF1, 0xE3, 0xC6, 0x8B, 0xF6, 0x5E, 0x76, 0x19, 0xC8, 0x31, 0x7E, 0xF5, 0x4F, 0xE0, 0x3F, 0x6F,
- 0xB6, 0x78, 0x51, 0xF5, 0xC4, 0xC4, 0x4B, 0x07, 0x66, 0x3E, 0x88, 0x74, 0x9C, 0x51, 0x8A, 0xFA,
- 0x4E, 0x80, 0xC3, 0x6E, 0x08, 0xD5, 0x6F, 0x10, 0xE3, 0x46, 0x77, 0x53, 0xA6, 0x77, 0x1D, 0x47,
- 0xC1, 0xBF, 0xE3, 0xA3, 0xB6, 0xEA, 0xEA, 0xBF, 0xA0, 0xA6, 0x0B, 0x03, 0x7E, 0x2E, 0x5B, 0x6F,
- 0x24, 0x07, 0x4F, 0xCB, 0x7C, 0x05, 0xF0, 0x7F, 0x67, 0x96, 0xD2, 0xEF, 0x8F, 0x5E, 0x72, 0xD6,
- 0xB6, 0xA8, 0xDB, 0x5E, 0x0A, 0x2D, 0x9A, 0xDE, 0x79, 0x38, 0x58, 0xB5, 0x6D, 0xD5, 0x97, 0xB6,
- 0xBD, 0x94, 0x09, 0x43, 0x11, 0x99, 0xC5, 0xE6, 0xD7, 0xD7, 0x1A, 0x37, 0xAD, 0xCF, 0x97, 0xE9,
- 0xF7, 0xFF, 0xF9, 0x0D, 0xCB, 0x72, 0xDD, 0x4A, 0x3E, 0x62, 0xAE, 0x6D, 0xC7, 0x37, 0x0A, 0xD7,
- 0xB6, 0x07, 0xFB, 0x8F, 0x5F, 0x49, 0x12, 0x50, 0xBC, 0x57, 0xCB, 0xA4, 0x06, 0xF5, 0xEC, 0xE7,
- 0xA8, 0x82, 0x6B, 0x8B, 0x14, 0xA5, 0xAF, 0xDE, 0x87, 0xFA, 0xEC, 0x8B, 0xF5, 0xBF, 0x5C, 0x66,
- 0x4D, 0x30, 0x53, 0xD5, 0x63, 0x1A, 0xC1, 0x07, 0x0F, 0x52, 0xB9, 0x7A, 0xC2, 0xDE, 0xCE, 0x6A,
- 0x55, 0xF1, 0xE2, 0x29, 0x4C, 0x5A, 0x40, 0xA6, 0xD7, 0x99, 0xFC, 0x81, 0xE6, 0x51, 0x01, 0xFC,
- 0xCE, 0x47, 0xE2, 0xA7, 0x82, 0x7D, 0x11, 0x68, 0x1D, 0x10, 0x81, 0xCA, 0xB8, 0x75, 0xFA, 0xCC,
- 0xA2, 0xFB, 0x57, 0xDF, 0xC8, 0x6C, 0x65, 0x4C, 0x5D, 0xA6, 0x49, 0x86, 0x29, 0x65, 0x03, 0xA6,
- 0x95, 0x0D, 0xC8, 0x43, 0xDB, 0x8F, 0x3B, 0x7F, 0xFC, 0x63, 0x40, 0x2D, 0x2B, 0xC6, 0xB6, 0x81,
- 0x09, 0x55, 0x5E, 0xED, 0xBE, 0x75, 0x69, 0xBD, 0x25, 0x9E, 0xD0, 0xF0, 0x99, 0xBA, 0x84, 0xDE,
- 0x08, 0xAF, 0x91, 0x11, 0x4B, 0xE0, 0xD2, 0xF7, 0x4E, 0x88, 0xF7, 0x8A, 0x34, 0xE2, 0x32, 0x5F,
- 0x71, 0x13, 0x72, 0xCE, 0xD4, 0x2A, 0x2F, 0xB4, 0x7E, 0x4A, 0x7B, 0xCA, 0xB7, 0x74, 0xC2, 0xC3,
- 0x59, 0x9A, 0x72, 0x31, 0x91, 0x9D, 0xB5, 0x61, 0x92, 0x7E, 0xD7, 0x52, 0x14, 0x14, 0xB3, 0xCC,
- 0x91, 0xC1, 0x99, 0xDE, 0x84, 0x3B, 0xAC, 0x71, 0xC0, 0x80, 0x6F, 0x57, 0xED, 0x53, 0x3E, 0xF9,
- 0x37, 0xBC, 0xE9, 0x8B, 0xFF, 0x03, 0x0F, 0x95, 0xF3, 0x77, 0xE5, 0x69, 0x99, 0xAF, 0x80, 0xE3,
- 0xD8, 0x2A, 0xF8, 0xAE, 0xD2, 0x90, 0x49, 0x05, 0x88, 0x2C, 0x62, 0xD9, 0x32, 0xAC, 0x36, 0xAC,
- 0x3B, 0x74, 0x06, 0xC6, 0xBD, 0x53, 0xAE, 0xDF, 0xDB, 0xC4, 0x01, 0x6A, 0xF8, 0x24, 0x7C, 0x21,
- 0xAA, 0x7E, 0x27, 0xFF, 0x7F, 0x59, 0x7A, 0x27, 0x00, 0x76, 0xDC, 0x0C, 0x64, 0xAA, 0x7A, 0xAC,
- 0xDF, 0xD4, 0xBE, 0x7D, 0x84, 0x48, 0x64, 0xCA, 0x37, 0x67, 0x32, 0x05, 0x04, 0x80, 0xC0, 0xF8,
- 0x5B, 0xBD, 0x19, 0xEE, 0x1F, 0xFC, 0x02, 0xE5, 0x5C, 0xCB, 0x0D, 0xF5, 0x3F, 0xFB, 0x6F, 0x1C,
- 0x38, 0xB6, 0xD3, 0x46, 0xE8, 0x29, 0x65, 0xB0, 0x35, 0xEA, 0x5B, 0xFA, 0x34, 0x6C, 0xF5, 0xF6,
- 0x35, 0x5D, 0x79, 0x51, 0xB8, 0x1B, 0x57, 0x43, 0x64, 0xA5, 0xA7, 0xB5, 0x8F, 0xAE, 0x36, 0x5D,
- 0x97, 0xFF, 0xE6, 0x31, 0x56, 0xDF, 0x0D, 0xAD, 0xFD, 0x90, 0x0D, 0xB4, 0x7B, 0x5B, 0xEF, 0x00,
- 0x50, 0xC3, 0x07, 0x5F, 0xE7, 0x97, 0x46, 0x3F, 0xD1, 0xDD, 0xB8, 0x06, 0xB6, 0x4E, 0x66, 0xD6,
- 0x50, 0xC4, 0x9D, 0x23, 0xDD, 0xD2, 0x36, 0x64, 0x27, 0xF3, 0x80, 0x9E, 0x55, 0x0F, 0x16, 0x8D,
- 0xF6, 0xEF, 0xFC, 0x58, 0x12, 0x30, 0x8B, 0x99, 0xF0, 0x74, 0x1A, 0xD2, 0xAB, 0x2E, 0x78, 0xF7,
- 0x42, 0xEF, 0x31, 0x92, 0xD3, 0xB5, 0x45, 0xA0, 0x1C, 0xCE, 0xF8, 0x97, 0xE8, 0x7E, 0xF0, 0xC1,
- 0x41, 0x30, 0x60, 0x43, 0x78, 0x0C, 0xC0, 0xD9, 0x81, 0x64, 0xB1, 0xE9, 0xAB, 0x45, 0x30, 0x70,
- 0x34, 0x2C, 0x1C, 0xBB, 0xBC, 0xF8, 0x90, 0xE5, 0x0A, 0x9B, 0x3F, 0x0B, 0x45, 0x0F, 0xD7, 0x0F,
- 0x58, 0xAE, 0x1C, 0x1E, 0x6E, 0x8C, 0x2B, 0x4A, 0x1F, 0x1B, 0x81, 0xB1, 0x99, 0xD3, 0xF2, 0x65,
- 0xE4, 0x11, 0x02, 0x4F, 0xBC, 0x03, 0x5B, 0xC3, 0xA3, 0x00, 0x16, 0x8B, 0xDE, 0xC1, 0x3A, 0x9B,
- 0x38, 0x20, 0x0D, 0x1F, 0x80, 0xD9, 0xB7, 0xE9, 0xF7, 0xFE, 0xFA, 0x01, 0xF7, 0xD2, 0x1B, 0x73,
- 0xF8, 0xF0, 0x0E, 0x2A, 0x79, 0xEB, 0xE2, 0x00, 0xAC, 0x96, 0x62, 0x54, 0x14, 0xCB, 0x68, 0xF5,
- 0x68, 0xF6, 0x50, 0xD0, 0x39, 0xE5, 0x85, 0xC9, 0x64, 0x4B, 0x69, 0xD2, 0xBE, 0x4F, 0x78, 0xAE,
- 0x19, 0xF6, 0xCE, 0x8B, 0xB7, 0x65, 0x72, 0xF5, 0x91, 0x1D, 0xF9, 0xCA, 0x93, 0x41, 0xBC, 0xFB,
- 0x20, 0x0C, 0x3A, 0x73, 0x57, 0xBF, 0xF6, 0xF0, 0xC0, 0xEC, 0x6C, 0x92, 0xC9, 0x35, 0xB6, 0x7F,
- 0x27, 0x87, 0x06, 0x32, 0xBB, 0x82, 0xF5, 0xF4, 0x5D, 0x07, 0x7B, 0x28, 0xCF, 0xDE, 0xFA, 0x22,
- 0x60, 0x37, 0xB1, 0x06, 0xF6, 0xC3, 0x8F, 0xFA, 0xB4, 0xDD, 0xFA, 0x5F, 0x29, 0x51, 0x4F, 0x09,
- 0x17, 0x6C, 0xF8, 0xDA, 0xEF, 0x3E, 0x07, 0xCD, 0x7D, 0xFE, 0xF1, 0x1C, 0xB5, 0xF2, 0x7D, 0xF6,
- 0xBA, 0x6E, 0x93, 0xE8, 0x69, 0x98, 0xF5, 0x50, 0x7E, 0xFB, 0x03, 0x40, 0x0D, 0x94, 0x72, 0xC0,
- 0x4E, 0x59, 0x03, 0xFC, 0x76, 0x52, 0x9A, 0x14, 0x93, 0x41, 0x51, 0x36, 0xF7, 0x53, 0xE7, 0x1E,
- 0xF3, 0xE6, 0x75, 0x9B, 0x44, 0x4F, 0xC3, 0xA2, 0x87, 0xB2, 0x39, 0x5D, 0x2A, 0x12, 0x85, 0x0E,
- 0x79, 0xFE, 0x82, 0x04, 0x21, 0x37, 0x9A, 0x20, 0x52, 0x0F, 0x25, 0xDF, 0x90, 0x93, 0x9A, 0xD8,
- 0xFA, 0xBE, 0xE2, 0x41, 0x49, 0xD4, 0xB9, 0xFE, 0x93, 0x97, 0x76, 0x9B, 0x96, 0x44, 0x46, 0x90,
- 0x0B, 0x3E, 0xF8, 0x6D, 0x87, 0x02, 0x61, 0x54, 0x98, 0x44, 0x3D, 0x94, 0x83, 0x5F, 0xEA, 0x36,
- 0x35, 0x89, 0x4C, 0x20, 0x07, 0xFD, 0x03, 0xAE, 0x87, 0xE2, 0xE6, 0x7A, 0x28, 0x29, 0x2C, 0x15,
- 0x49, 0x3D, 0x94, 0x2C, 0x22, 0x21, 0x1F, 0xA0, 0xA2, 0x83, 0xC3, 0xF2, 0x67, 0x77, 0x61, 0xD1,
- 0x43, 0x79, 0x57, 0xF7, 0x8E, 0xA7, 0x87, 0xA2, 0xB9, 0x35, 0x14, 0x88, 0x1E, 0x0A, 0x66, 0x9B,
- 0x0A, 0x0F, 0xF5, 0x4D, 0x48, 0x1B, 0x85, 0x5E, 0xC4, 0x12, 0x2B, 0xEF, 0xF5, 0x50, 0xCC, 0x40,
- 0x45, 0x87, 0xB3, 0xE7, 0x67, 0xDC, 0x1C, 0xCA, 0x91, 0x11, 0xFF, 0x2F, 0x15, 0x3D, 0x94, 0x27,
- 0x17, 0xA9, 0x5B, 0xAE, 0x2A, 0x3C, 0x3D, 0x14, 0x28, 0x6A, 0x54, 0xA3, 0xE5, 0xDB, 0x51, 0xDF,
- 0x04, 0xE7, 0x96, 0xD9, 0x8B, 0x98, 0x91, 0x39, 0x3D, 0x94, 0x0C, 0x31, 0x42, 0x8C, 0x1E, 0x4A,
- 0x10, 0x61, 0x92, 0xD6, 0xEE, 0x41, 0x00, 0x19, 0x5E, 0x67, 0x8A, 0xC2, 0xA7, 0xB8, 0x1E, 0xCA,
- 0xB1, 0xA4, 0xF4, 0x50, 0x7E, 0xF6, 0x35, 0x98, 0x71, 0x9A, 0x2F, 0x2D, 0xD9, 0xF4, 0x50, 0x32,
- 0xAE, 0x29, 0x95, 0x01, 0xE8, 0x7A, 0x28, 0x1C, 0xEF, 0x92, 0xBE, 0x09, 0xB0, 0x17, 0xB1, 0x44,
- 0x4B, 0xA8, 0x87, 0xF2, 0x48, 0x2A, 0x7A, 0x28, 0x2F, 0x67, 0x47, 0x0F, 0xC5, 0x5D, 0x54, 0x54,
- 0x54, 0xE4, 0x81, 0x33, 0x1D, 0x11, 0xEE, 0xB7, 0x6B, 0x60, 0xC6, 0x6D, 0x3F, 0xBB, 0x02, 0xB0,
- 0xE3, 0xE4, 0x99, 0xEA, 0xC0, 0x5F, 0xE8, 0x86, 0xF4, 0x0F, 0x12, 0xEA, 0xA1, 0x40, 0x28, 0x0C,
- 0xFE, 0x45, 0x8C, 0x31, 0xED, 0x7A, 0x28, 0x2F, 0xE4, 0xB5, 0x1E, 0x4A, 0xE7, 0x08, 0xE5, 0xEE,
- 0xC0, 0xCA, 0x51, 0xCE, 0xA2, 0xDB, 0xAA, 0x87, 0xD2, 0x62, 0xD5, 0x43, 0x79, 0x21, 0x0F, 0xF4,
- 0x50, 0xD8, 0x7D, 0x58, 0xD8, 0x43, 0xC1, 0x05, 0x2D, 0x5A, 0xF5, 0xCA, 0xB0, 0x1E, 0x0A, 0xBE,
- 0x56, 0xB8, 0x3C, 0x74, 0xEA, 0x2D, 0xA6, 0x87, 0x42, 0x48, 0xA8, 0x87, 0xE2, 0x3F, 0x80, 0xA1,
- 0xC5, 0xCC, 0x40, 0x4F, 0x41, 0xE9, 0xA1, 0xF8, 0x4F, 0xA0, 0x06, 0xC2, 0xD7, 0x8B, 0x1A, 0xD1,
- 0xB2, 0xC3, 0xD7, 0x62, 0x2D, 0x07, 0x58, 0xF5, 0x50, 0x96, 0xA5, 0xA4, 0x87, 0x92, 0x95, 0x55,
- 0x56, 0x8B, 0x1E, 0xCA, 0x44, 0xCD, 0x50, 0x9A, 0xD0, 0x43, 0x99, 0x5A, 0xD5, 0x51, 0x46, 0xB9,
- 0xC9, 0x2C, 0x86, 0x9D, 0x1A, 0x00, 0x8B, 0xAA, 0xDE, 0x07, 0xA6, 0x87, 0xD2, 0x07, 0xFF, 0x13,
- 0xEA, 0xA1, 0x40, 0x69, 0x18, 0x4B, 0xA2, 0x47, 0x0C, 0xD2, 0x67, 0x00, 0x26, 0x3D, 0x14, 0x60,
- 0xFA, 0x89, 0x00, 0xA5, 0xCB, 0x1D, 0x58, 0xBC, 0x3B, 0x7A, 0x28, 0x96, 0x0D, 0x05, 0xD9, 0xD0,
- 0x43, 0x19, 0xA9, 0x46, 0x3A, 0x22, 0xEC, 0x0F, 0xF5, 0x50, 0xF8, 0xC2, 0x76, 0xE9, 0x1B, 0x63,
- 0x51, 0xC1, 0x21, 0xF3, 0x7A, 0x28, 0xAD, 0x37, 0x1C, 0x60, 0x7A, 0x28, 0x67, 0xA9, 0x0B, 0x6C,
- 0xD1, 0x43, 0xF9, 0x95, 0x7E, 0x35, 0x8A, 0x62, 0xDD, 0x15, 0x4C, 0xD9, 0x42, 0xDC, 0x15, 0x86,
- 0x1E, 0xCA, 0x76, 0xD4, 0x36, 0x5D, 0xD9, 0x6F, 0xE9, 0x1A, 0xBC, 0x3A, 0xCC, 0xD1, 0x98, 0xF5,
- 0x50, 0xE8, 0xFB, 0x4E, 0x45, 0x0F, 0xC5, 0x8C, 0x8C, 0xE9, 0xA1, 0x98, 0xF8, 0xA0, 0xFC, 0xB0,
- 0x07, 0x39, 0x37, 0x0C, 0xE1, 0x30, 0x5C, 0xE8, 0x3F, 0x86, 0x4B, 0x8E, 0xE4, 0x79, 0xF1, 0xA6,
- 0x91, 0x99, 0x1E, 0x39, 0xBA, 0x1F, 0xFC, 0x18, 0x60, 0xC4, 0x86, 0xD3, 0x4C, 0x0F, 0x85, 0xD2,
- 0xFF, 0x6A, 0x91, 0x72, 0xBB, 0x0B, 0x16, 0xAE, 0x53, 0xAE, 0x7F, 0x05, 0x16, 0x3E, 0x69, 0x5C,
- 0x61, 0x73, 0xDF, 0xDD, 0x45, 0x0F, 0xE1, 0x08, 0xEB, 0xA4, 0x49, 0xF9, 0x93, 0xF4, 0x50, 0x84,
- 0x1A, 0x4A, 0xDE, 0x22, 0xF0, 0xC4, 0xF7, 0xA1, 0x72, 0x85, 0xD2, 0xF7, 0xDE, 0xE1, 0x8B, 0x86,
- 0x2A, 0xFD, 0xFE, 0x3E, 0x9C, 0xBF, 0x88, 0x39, 0x06, 0xB7, 0x34, 0xC3, 0xEB, 0x9D, 0xBE, 0x6F,
- 0x7F, 0xFD, 0x72, 0xF6, 0xC6, 0x1C, 0x3E, 0xBC, 0x53, 0xF8, 0xF0, 0xD3, 0x09, 0xD8, 0x69, 0x60,
- 0x23, 0x69, 0xFC, 0xED, 0x53, 0xFD, 0xC3, 0x78, 0xB1, 0x52, 0x83, 0x45, 0x0F, 0x65, 0x22, 0x5A,
- 0x4E, 0xC4, 0x9E, 0x01, 0x84, 0x2F, 0xB8, 0x68, 0xDB, 0xC6, 0xF9, 0x52, 0x0F, 0x25, 0x5D, 0x14,
- 0xB6, 0x1E, 0xCA, 0x6F, 0x49, 0x0F, 0x85, 0xE3, 0x85, 0xD2, 0xD6, 0x9B, 0xB2, 0xB8, 0xF5, 0x90,
- 0xE9, 0xA1, 0x28, 0xCD, 0x25, 0x52, 0x0F, 0x25, 0x6F, 0x60, 0xE2, 0x83, 0x49, 0xBF, 0x21, 0x3D,
- 0x14, 0xA1, 0x86, 0x52, 0xFE, 0xDB, 0xAC, 0xD9, 0x43, 0x41, 0x48, 0x3D, 0x94, 0x7C, 0x83, 0x59,
- 0x0F, 0x65, 0xB6, 0xD4, 0x43, 0xE9, 0xB5, 0x90, 0x7A, 0x28, 0x12, 0x04, 0xA9, 0x87, 0x22, 0x41,
- 0xC8, 0x91, 0x1E, 0x8A, 0xCB, 0x2D, 0xF5, 0x50, 0xF2, 0x0A, 0x39, 0xD2, 0x43, 0x51, 0x69, 0x8E,
- 0x4D, 0xEA, 0xA1, 0xE4, 0x0F, 0x72, 0xA6, 0x87, 0x22, 0xED, 0xA1, 0x40, 0xC1, 0xE8, 0xA1, 0x64,
- 0x07, 0x49, 0xDB, 0x43, 0xE1, 0x26, 0x45, 0x0A, 0x4A, 0x0F, 0x45, 0xB7, 0x82, 0x42, 0x60, 0x1A,
- 0x29, 0xC2, 0xA4, 0x8B, 0xE1, 0xCB, 0x51, 0x50, 0x7A, 0x28, 0xD9, 0x41, 0xD2, 0xF6, 0x50, 0xB8,
- 0x49, 0x11, 0xA1, 0x93, 0x52, 0x18, 0xD0, 0xAC, 0xA0, 0x10, 0x98, 0x46, 0x0A, 0xD3, 0x40, 0x31,
- 0xFB, 0x72, 0xE4, 0xBB, 0x3D, 0x94, 0x9E, 0x41, 0x92, 0xF6, 0x50, 0x98, 0x49, 0x91, 0x76, 0xA1,
- 0x93, 0x42, 0xCF, 0xE5, 0xBF, 0x3D, 0x14, 0x61, 0x05, 0x85, 0xC0, 0x35, 0x52, 0x98, 0x06, 0x8A,
- 0xC9, 0x57, 0x20, 0xAF, 0xED, 0xA1, 0xF4, 0x10, 0x52, 0xB1, 0x87, 0xD2, 0xFA, 0x3C, 0x19, 0x7E,
- 0x17, 0xCA, 0x16, 0x05, 0x60, 0x0F, 0x05, 0x81, 0x56, 0x50, 0xE8, 0xC7, 0x62, 0x19, 0x45, 0xF7,
- 0xD5, 0x90, 0x77, 0xF6, 0x50, 0x72, 0x21, 0x0F, 0xFC, 0x81, 0x53, 0xA3, 0x02, 0xA7, 0x4E, 0x85,
- 0x46, 0xE2, 0x0B, 0x32,