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, 0x7B, 0x28, 0x1E, 0xE5, 0x12, 0x67, 0xC5, 0xE5, 0xC0, 0x84, 0x3F, 0x