diff --git a/components/WWD/Kconfig b/components/WWD/Kconfig deleted file mode 100644 index 6e721a3243c3a61e5a22b117e21a8aa6153f5ce8..0000000000000000000000000000000000000000 --- a/components/WWD/Kconfig +++ /dev/null @@ -1,87 +0,0 @@ -menu "WWD Wi-Fi framework" - - config OS_USING_WWD - bool - default n - - menuconfig BSP_USING_AP6181 - bool "ap6181" - select OS_USING_WLAN - select OS_USING_WWD - select OS_USING_SDIO - default n - - if BSP_USING_AP6181 - config BSP_AP6181_REG_ON_PIN - int "ap6181 reg on pin" - default 49 - - config BSP_AP6181_IRQ_PIN - int "ap6181 irq pin" - default 37 - - if BSP_AP6181_IRQ_PIN < 0 - config WWD_NOTIFY_TASK_STACK - int "wwd notify task stack" - default 256 - - config WWD_NOTIFY_TASK_PRIORITY - int "wwd notify task priority" - default 5 - - config WWD_NOTIFY_TASK_PERIOD - int "wwd notify task period" - default 5 - endif - - choice - prompt "ap6181 network protocol" - default BSP_USING_AP6181_LWIP - depends on BSP_USING_AP6181 - - config BSP_USING_AP6181_LWIP - bool "ap6181 in lwip" - select OS_WLAN_LWIP - endchoice - - config WWD_INIT_TASK_STACK - int "wwd init task stack" - default 2048 - - config WWD_INIT_TASK_PRIORITY - int "wwd init task priority" - default 9 - - choice - prompt "ap6181 mode" - default BSP_USING_AP6181_STA - depends on BSP_USING_AP6181 - - config BSP_USING_AP6181_STA - bool "ap6181 in sta mode" - - config BSP_USING_AP6181_AP - bool "ap6181 in ap mode" - if BSP_USING_AP6181_AP - - config BSP_USING_AP6181_AP_SSID - string "ssid for ap mode" - default "ap6181" - - config BSP_USING_AP6181_AP_CHANNEL - int "cahnnel for ap mode" - default 1 - - config BSP_USING_AP6181_AP_SECURITY - int "security for ap mode. [0]:open [1]:WPA2_AES_PSK" - default 0 - if BSP_USING_AP6181_AP_SECURITY != 0 - config BSP_USING_AP6181_AP_PASSWORD - string "password for ap mode" - default "123456789" - endif - endif - endchoice - - endif -endmenu diff --git a/components/WWD/SConscript b/components/WWD/SConscript deleted file mode 100644 index 9ea7674bcae8d9b1dbbdd908d656e65a30b02434..0000000000000000000000000000000000000000 --- a/components/WWD/SConscript +++ /dev/null @@ -1,30 +0,0 @@ -import os -import osconfig -from build_tools import * - -pwd = PresentDir() -list = os.listdir(pwd) - -src = Split(''' -wwd_dev.c -''') - -if IsDefined(['MANUFACTOR_STM32']): - src += ['wwd_bus_stm32.c'] - -if IsDefined(['SERIES_NXP_IMXRT10XX']): - src += ['wwd_bus_imxrt10xx.c'] - -if IsDefined(['BSP_USING_AP6181']): - src += ['ap6181.c'] - -path = [pwd] - -group = AddCodeGroup('wwd', src, depend = ['OS_USING_WWD'], CPPPATH = path) - -for d in list: - path = os.path.join(pwd, d) - if os.path.isfile(os.path.join(path, 'SConscript')): - group += SConscript(os.path.join(d, 'SConscript')) - -Return('group') diff --git a/components/WWD/WWD/Kconfig b/components/WWD/WWD/Kconfig deleted file mode 100644 index a380e7c47966e2527b22e53937ff2dac909920c9..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/Kconfig +++ /dev/null @@ -1,7 +0,0 @@ -menu "WIFI" - - config OS_USING_WWD - bool "Using WWD Wi-Fi framework" - default n - -endmenu diff --git a/components/WWD/WWD/RTOS/noos.c b/components/WWD/WWD/RTOS/noos.c deleted file mode 100644 index cf1c2853c2c0f1a3464c3ffcdf03313f904e0cb0..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/RTOS/noos.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Implementation of wiced_rtos.c for the case where no RTOS is used - * - * This is a special implementation of the Wiced RTOS - * abstraction layer, which is designed to make Wiced work even with - * no RTOS. - * It provides Wiced with alternates to the functions for threads, - * semaphores and time functions. - * - * Semaphores are simple integers, since accesses to an integer will be atomic. - * - */ - -#include "wwd_rtos.h" -#include "wwd_rtos_isr.h" -#include -//#include "stm32f4xx.h" -//#include "platform_cmsis.h" -//#include "platform_init.h" - -volatile uint32_t noos_total_time = 0; - -#define CYCLES_PER_SYSTICK ( ( SystemCoreClock / SYSTICK_FREQUENCY ) - 1 ) - -void NoOS_setup_timing( void ) -{ -// /* Setup the system handler priorities */ -// SCB->SHP[11] = (uint8_t) 0x40; /* SysTick system handler priority */ - - -// /* Setup the system tick */ -// SysTick->LOAD = (uint32_t) ( CYCLES_PER_SYSTICK ); -// SysTick->CTRL = (uint32_t) ( SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_CLKSOURCE_Msk ); /* clock source is processor clock - AHB */ -} - -void NoOS_stop_timing( void ) -{ -// /* Setup the system handler priorities */ -// SCB->SHP[11] = (uint8_t) 0x40; /* SysTick system handler priority */ - - -// /* Setup the system tick */ -// SysTick->CTRL &= (uint32_t) ~( SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk ); -} - -/* NoOS interrupt priority setup. Called by platform_init_mcu_infrastructure() */ -void platform_init_rtos_irq_priorities( void ) -{ -// /* Setup the system handler priorities */ -// NVIC_SetPriority( MemoryManagement_IRQn, 0 ); /* Mem Manage system handler priority */ -// NVIC_SetPriority( BusFault_IRQn , 0 ); /* Bus Fault system handler priority */ -// NVIC_SetPriority( UsageFault_IRQn , 0 ); /* Usage Fault system handler priority */ -// NVIC_SetPriority( SVCall_IRQn , 0 ); /* SVCall system handler priority */ -// NVIC_SetPriority( DebugMonitor_IRQn , 0 ); /* Debug Monitor system handler priority */ -// NVIC_SetPriority( PendSV_IRQn , 0 ); /* PendSV system handler priority */ -// NVIC_SetPriority( SysTick_IRQn , 15 ); /* SysTick system handler priority */ -} - -/* NoOS SysTick handler */ -//WWD_RTOS_DEFINE_ISR( NoOS_systick_irq ) -//{ -// noos_total_time++; -//} diff --git a/components/WWD/WWD/RTOS/noos.h b/components/WWD/WWD/RTOS/noos.h deleted file mode 100644 index d637f8af484551cfc4a0ed4b14176f8300e82c62..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/RTOS/noos.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Definitions of the Wiced RTOS abstraction layer for the special case - * of having no RTOS with Cortex-M3 / M4 - * - */ - -#ifndef INCLUDED_NOOS_H_ -#define INCLUDED_NOOS_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* Define System Tick interrupt handler needed by NoOS abstraction layer. This - * defines is used by the vector table. - */ -#define SYSTICK_irq NoOS_systick_irq - -#define SVC_irq UnhandledInterrupt -#define PENDSV_irq UnhandledInterrupt - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ifndef INCLUDED_NOOS_H_ */ diff --git a/components/WWD/WWD/RTOS/wwd_rtos.c b/components/WWD/WWD/RTOS/wwd_rtos.c deleted file mode 100644 index 02c896664ddccfc2094ca9af920bacb1dcaa6a89..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/RTOS/wwd_rtos.c +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Implementation of wiced_rtos.c for the case where no RTOS is used - * - * This is a special implementation of the Wiced RTOS - * abstraction layer, which is designed to make Wiced work even with - * no RTOS. - * It provides Wiced with alternates to the functions for threads, - * semaphores and time functions. - * - * Semaphores are simple integers, since accesses to an integer will be atomic. - * - */ - - -#include "wwd_rtos.h" -#include -#include "wwd_poll.h" -#include "RTOS/wwd_rtos_interface.h" -#include "platform_assert.h" - -#include "os_clock.h" -#include "os_task.h" -#include "oneos_config.h" -#include "os_errno.h" - -extern volatile uint32_t noos_total_time; - -/****************************************************** - * Function definitions - ******************************************************/ - -/** - * Would normally create a new thread - * This version just returns success without any action - * - * @param thread : unused - pointer to variable which will receive handle of created thread - * @param entry_function : unused - main thread function - * @param name : a string thread name used for a debugger - * - * @returns WWD_SUCCESS on success, WICED_ERROR otherwise - */ -wwd_result_t host_rtos_create_thread( host_thread_type_t* thread, void(*entry_function)( wwd_thread_arg_t ), const char* name, /*@null@*/ void* stack, uint32_t stack_size, uint32_t priority ) -{ - UNUSED_PARAMETER( entry_function ); - UNUSED_PARAMETER( name ); - UNUSED_PARAMETER( stack ); - UNUSED_PARAMETER( stack_size ); - UNUSED_PARAMETER( priority ); - - return host_rtos_create_thread_with_arg( thread, entry_function, name, stack, stack_size, priority, 0 ); -} - -wwd_result_t host_rtos_create_thread_with_arg( host_thread_type_t* thread, void(*entry_function)( wwd_thread_arg_t ), const char* name, /*@null@*/ void* stack, uint32_t stack_size, uint32_t priority, wwd_thread_arg_t arg ) -{ - UNUSED_PARAMETER( entry_function ); - UNUSED_PARAMETER( name ); - UNUSED_PARAMETER( stack ); - UNUSED_PARAMETER( stack_size ); - UNUSED_PARAMETER( priority ); - UNUSED_PARAMETER( arg ); - - if (os_task_init(thread, name, entry_function, (void*)arg, (void *)stack, stack_size, priority) != OS_EOK) - { - return WWD_DOES_NOT_EXIST; - } - - os_task_startup(thread); - - return WWD_SUCCESS; -} - -wwd_result_t host_rtos_create_configed_thread( /*@out@*/ host_thread_type_t* thread, void(*entry_function)( wwd_thread_arg_t ), const char* name, /*@null@*/ void* stack, uint32_t stack_size, uint32_t priority, host_rtos_thread_config_type_t *config ) -{ - UNUSED_PARAMETER( entry_function ); - UNUSED_PARAMETER( name ); - UNUSED_PARAMETER( stack ); - UNUSED_PARAMETER( stack_size ); - UNUSED_PARAMETER( priority ); - UNUSED_PARAMETER( config ); - - return host_rtos_create_thread_with_arg( thread, entry_function, name, stack, stack_size, priority, (wwd_thread_arg_t)config); -} - -/** - * Would normally exit a thread - * This version just returns success without any action - * - * @param thread : unused - handle of thread - * - * @returns WWD_SUCCESS on success, WICED_ERROR otherwise - */ -wwd_result_t host_rtos_finish_thread( host_thread_type_t* thread ) -{ - UNUSED_PARAMETER( thread); - - if (os_task_deinit(thread) != OS_EOK) - { - return WWD_DOES_NOT_EXIST; - } - - return WWD_SUCCESS; -} - -/** - * Would normally allow a thread to delete a terminated thread - * - * @param thread : unused - handle of the terminated thread to delete - * - * @returns WWD_SUCCESS on success, WICED_ERROR otherwise - */ -wwd_result_t host_rtos_delete_terminated_thread( host_thread_type_t* thread ) -{ - UNUSED_PARAMETER( thread ); - - return WWD_SUCCESS; -} - -/** - * Creates a semaphore - * Semaphore is just the variable passed in this case, no setup is necessary. - * Semaphore is just initialised to zero. - * - * @param semaphore : pointer to variable which will receive handle of created semaphore - * - * @returns WWD_SUCCESS on success, WICED_ERROR otherwise - */ -wwd_result_t host_rtos_init_semaphore( host_semaphore_type_t* semaphore ) -{ - os_sem_init(semaphore, OS_NULL, 0, 0x7fffffff); - - return WWD_SUCCESS; -} - -/** - * Would normally get a semaphore - * - * Since there is only one thread, this function calls the @ref wwd_thread_poll_all to cause Wiced to - * repeatedly poll and process the Transmit and receive queues, until the given semaphore is - * set by a function within the transmit/receive processing. Once the set semaphore has been seen, - * it is decremented back to zero and the function returns to simulate a resuming thread - * Timeout is ignored in this function. - * - * Must not be called from interrupt context. - * - * @param semaphore : Pointer to variable which will receive handle of created semaphore - * @param timeout_ms : unsupported - Maximum period to block for. Can be passed NEVER_TIMEOUT to request no timeout - * @param will_set_in_isr : True if the semaphore will be set in an ISR. Currently only used for NoOS/NoNS - * - * @return wwd_result_t : WWD_SUCCESS if semaphore was successfully acquired - * : WICED_TIMEOUT if semaphore was not acquired before timeout_ms period - */ - -wwd_result_t host_rtos_get_semaphore( host_semaphore_type_t* semaphore, uint32_t timeout_ms, wiced_bool_t will_set_in_isr ) -{ - UNUSED_PARAMETER( timeout_ms); - - if (os_sem_wait(semaphore, (timeout_ms == NEVER_TIMEOUT) ? OS_WAIT_FOREVER : (timeout_ms * OS_TICK_PER_SECOND / 1000 ))) - { - return WWD_TIMEOUT; - } - - return WWD_SUCCESS; -} - -/** - * Would normally set a semaphore - * - * This function simply sets the value of the semaphore to 1. - * - * Can be called from interrupt context - * - * @param semaphore : Pointer to variable which will receive handle of created semaphore - * @param called_from_ISR : ignored - Value of WICED_TRUE indicates calling from interrupt context - * Value of WICED_FALSE indicates calling from normal thread context - * - * @return wwd_result_t : WWD_SUCCESS if semaphore was successfully set - * : WICED_ERROR if an error occurred - * - */ - -wwd_result_t host_rtos_set_semaphore( host_semaphore_type_t* semaphore, wiced_bool_t called_from_ISR ) -{ - UNUSED_PARAMETER( called_from_ISR ); - - if (os_sem_post(semaphore) != OS_EOK) - return WWD_SEMAPHORE_ERROR; - else - return WWD_SUCCESS; -} - -/** - * Would normally delete a semaphore - * Does nothing. - * - * @param semaphore : Pointer to the semaphore handle - * - * @return wwd_result_t : WWD_SUCCESS if semaphore was successfully deleted - * : WICED_ERROR if an error occurred - * - */ - -wwd_result_t host_rtos_deinit_semaphore( host_semaphore_type_t* semaphore ) -{ - UNUSED_PARAMETER( semaphore ); - if (os_sem_deinit(semaphore) != OS_EOK) - return WWD_SEMAPHORE_ERROR; - else - return WWD_SUCCESS; -} - - -/** - * Gets time in miiliseconds since RTOS start - * - * @Note: since this is only 32 bits, it will roll over every 49 days, 17 hours. - * - * @returns Time in milliseconds since RTOS started. - */ -wwd_time_t host_rtos_get_time( void ) /*@modifies internalState@*/ -{ - return os_tick_get()* (1000 / OS_TICK_PER_SECOND ); - //return (wwd_time_t) noos_total_time; -} - -/** - * Delay for a number of milliseconds - * - * Simply implemented with a tight loop - * - * @return wwd_result_t : WWD_SUCCESS if delay was successful - * : WICED_ERROR if an error occurred - * - */ -wwd_result_t host_rtos_delay_milliseconds( uint32_t num_ms ) -{ - os_task_msleep(num_ms); - - return WWD_SUCCESS; -} - - diff --git a/components/WWD/WWD/RTOS/wwd_rtos.h b/components/WWD/WWD/RTOS/wwd_rtos.h deleted file mode 100644 index 746a1963861ecb77445bb0d20b4708e1b1bcb678..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/RTOS/wwd_rtos.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Definitions of the Wiced RTOS abstraction layer for the special case - * of having no RTOS - * - */ - -#ifndef INCLUDED_WWD_RTOS_H_ -#define INCLUDED_WWD_RTOS_H_ - -#include "platform_isr.h" -#include "noos.h" - -#include -#include -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define RTOS_HIGHER_PRIORTIY_THAN(x) (x) -#define RTOS_LOWER_PRIORTIY_THAN(x) (x) -#define RTOS_LOWEST_PRIORITY (255) -#define RTOS_HIGHEST_PRIORITY (0) -#define RTOS_DEFAULT_THREAD_PRIORITY (8) - -#define WWD_THREAD_STACK_SIZE (4096)//(544 + 1400) -#define RTOS_USE_STATIC_THREAD_STACK - -/* - * The number of system ticks per second - */ -#define SYSTICK_FREQUENCY (1000) - -/****************************************************** - * Structures - ******************************************************/ - -typedef os_sem_t host_semaphore_type_t; /** NoOS definition of a semaphore */ -typedef os_task_t host_thread_type_t; /** NoOS definition of a thread handle - Would be declared void but that is not allowed. */ -typedef volatile unsigned char host_queue_type_t; /** NoOS definition of a message queue */ - -typedef struct -{ - uint8_t info; /* not supported yet */ -} host_rtos_thread_config_type_t; - -/*@external@*/ void NoOS_setup_timing( void ); -/*@external@*/ void NoOS_stop_timing( void ); -/*@external@*/ void NoOS_systick_irq( void ); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ifndef INCLUDED_WWD_RTOS_H_ */ diff --git a/components/WWD/WWD/RTOS/wwd_rtos_isr.h b/components/WWD/WWD/RTOS/wwd_rtos_isr.h deleted file mode 100644 index 76712609b57c62e519de43310aac9744936d209f..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/RTOS/wwd_rtos_isr.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#pragma once - -#include "wwd_rtos.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -/****************************************************** - * Macros - ******************************************************/ - -/* Use this macro to define an RTOS-aware interrupt handler where RTOS - * primitives can be safely accessed - * - * @usage: - * WWD_RTOS_DEFINE_ISR( my_irq_handler ) - * { - * // Do something here - * } - */ -#if defined( __GNUC__ ) - -#define WWD_RTOS_DEFINE_ISR( function ) \ - void function( void ); \ - __attribute__(( interrupt, used, section(IRQ_SECTION) )) void function( void ) - -#elif defined ( __IAR_SYSTEMS_ICC__ ) - -#define WWD_RTOS_DEFINE_ISR( function ) \ - __root void function( void ); \ - __root void function( void ) -#else - -#define WWD_RTOS_DEFINE_ISR( function ) \ - void SysTick_Handler( void ) - -#endif - - -/* Macro for mapping a function defined using WWD_RTOS_DEFINE_ISR - * to an interrupt handler declared in - * /WICED/platform///platform_irq_handlers.h - * - * @usage: - * WWD_RTOS_MAP_ISR( my_irq, USART1_irq ) - */ -#if defined( __GNUC__ ) - -#define WWD_RTOS_MAP_ISR( function, isr ) \ - extern void isr( void ); \ - __attribute__(( alias( #function ))) void isr ( void ); - -#elif defined ( __IAR_SYSTEMS_ICC__ ) - -#define WWD_RTOS_MAP_ISR( function, isr ) \ - extern void isr( void ); \ - _Pragma( TO_STRING( weak isr=function ) ) -#else - -#define WWD_RTOS_MAP_ISR( function, isr ) - -#endif - -/****************************************************** - * Constants - ******************************************************/ - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Global Variables - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - - -#ifdef __cplusplus -} /* extern "C" */ -#endif diff --git a/components/WWD/WWD/SConscript b/components/WWD/WWD/SConscript deleted file mode 100644 index 2ee4fc9c86e197db47e4a7fc174eb7b24d920a22..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/SConscript +++ /dev/null @@ -1,60 +0,0 @@ -import os -import osconfig -from build_tools import * - -pwd = PresentDir() -LIBS = [] -LIBPATH = [] - -# add general drivers -src = Split(''' -internal/bus_protocols/wwd_bus_common.c -internal/chips/43362/wwd_chip_specific_functions.c -internal/wwd_internal.c -internal/wwd_sdpcm.c -internal/wwd_thread_internal.c -internal/wwd_thread.c -internal/wwd_management.c -internal/chips/43362/wwd_ap.c -internal/wwd_ap_common.c -internal/wwd_wifi.c -network/wwd_buffer.c -RTOS/noos.c -RTOS/wwd_rtos.c -utilities/tlv.c -platform/platform_resource.c -platform/wwd_resources.c -sdio_driver/43362A2_bin.c -''') - -if IsDefined(['MANUFACTOR_STM32']): - src += ['sdio_driver/wlan_bus_sdio_stm32.c'] - src += ['internal/bus_protocols/SDIO/wwd_bus_protocol_stm32.c'] - -if IsDefined(['SERIES_NXP_IMXRT10XX']): - src += ['sdio_driver/wlan_bus_sdio_imxrt10xx.c'] - src += ['internal/bus_protocols/SDIO/wwd_bus_protocol_imxrt10xx.c'] - -# path include path in project -path = [pwd] - -path += [pwd + '/include'] -path += [pwd + '/internal/bus_protocols/SDIO'] -path += [pwd + '/internal'] -path += [pwd + '/net'] -path += [pwd + '/internal/chips/43362'] -path += [pwd + '/include/RTOS'] -path += [pwd + '/canned_send'] -path += [pwd + '/network'] -path += [pwd + '/platform'] -path += [pwd + '/RTOS'] -path += [pwd + '/sdio_driver'] -path += [pwd + '/utilities'] -path += [pwd + '/include/debug'] -path += [pwd + '/include/network'] -path += [pwd + '/include/platform'] -path += [pwd + '/include/WICED'] - -group = AddCodeGroup('wwd', src, depend = ['OS_USING_WWD'], CPPPATH = path) - -Return('group') diff --git a/components/WWD/WWD/include/RTOS/wwd_rtos_interface.h b/components/WWD/WWD/include/RTOS/wwd_rtos_interface.h deleted file mode 100644 index 6bca477cbfff50dcbf0f588728120c71965d468e..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/RTOS/wwd_rtos_interface.h +++ /dev/null @@ -1,311 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Defines the WICED RTOS Interface. - * - * Provides prototypes for functions that allow WICED to use RTOS resources - * such as threads, semaphores & timing functions in an abstract way. - */ - -#ifndef INCLUDED_WWD_RTOS_INTERFACE_H_ -#define INCLUDED_WWD_RTOS_INTERFACE_H_ - -#include -#include "wwd_rtos.h" -#include "wwd_structures.h" - -#ifndef RTOS_HIGHER_PRIORTIY_THAN -#error wwd_rtos.h must define RTOS_HIGHER_PRIORTIY_THAN(x) -#endif -#ifndef RTOS_LOWER_PRIORTIY_THAN -#error wwd_rtos.h must define RTOS_LOWER_PRIORTIY_THAN(x) -#endif -#ifndef RTOS_LOWEST_PRIORITY -#error wwd_rtos.h must define RTOS_LOWEST_PRIORITY -#endif -#ifndef RTOS_HIGHEST_PRIORITY -#error wwd_rtos.h must define RTOS_HIGHEST_PRIORITY -#endif -#ifndef RTOS_DEFAULT_THREAD_PRIORITY -#error wwd_rtos.h must define RTOS_DEFAULT_THREAD_PRIORITY -#endif -#if !(defined(RTOS_USE_DYNAMIC_THREAD_STACK) || defined(RTOS_USE_STATIC_THREAD_STACK)) -#error wwd_rtos.h must define either RTOS_USE_DYNAMIC_THREAD_STACK or RTOS_USE_STATIC_THREAD_STACK -#endif - -#ifdef __x86_64__ -typedef uint64_t wwd_thread_arg_t; -#else -#ifdef __ONEOS_CONFIG_H__ -#define wwd_thread_arg_t void * -#else -typedef uint32_t wwd_thread_arg_t; -#endif -#endif - -#ifdef __cplusplus -extern "C" -{ -#endif - -/****************************************************** - * @cond Constants - ******************************************************/ - -#define NEVER_TIMEOUT ((uint32_t)0xffffffffUL) /* Used with host_rtos_get_semaphore */ - -/****************************************************** - * Structures & Typedefs - ******************************************************/ - -/** @endcond */ - - -/** @addtogroup rtosif RTOS Interface - * Allows WICED to use use RTOS resources - * such as threads, semaphores & timing functions in an abstract way. - * @{ - */ - -/****************************************************** - * Function declarations - ******************************************************/ - -/* Thread management functions */ - -/** - * Create a thread - * - * Implemented in the WICED RTOS interface which is specific to the - * RTOS in use. - * WICED uses this function to create a new thread and start it running. - * - * @param thread : pointer to a variable which will receive the new thread handle - * @param entry_function : function pointer which points to the main function for the new thread - * @param name : a string thread name used for a debugger - * @param stack_size : the size of the thread stack in bytes - * @param priority : the priority of the thread - * - * @return WWD_SUCCESS or Error code - */ -extern wwd_result_t host_rtos_create_thread( /*@out@*/ host_thread_type_t* thread, void(*entry_function)( wwd_thread_arg_t arg ), const char* name, /*@null@*/ void* stack, uint32_t stack_size, uint32_t priority ) /*@modifies *thread@*/; - - -/** - * Create a thread with specific thread argument - * - * Implemented in the WICED RTOS interface which is specific to the - * RTOS in use. - * - * @param thread : pointer to a variable which will receive the new thread handle - * @param entry_function : function pointer which points to the main function for the new thread - * @param name : a string thread name used for a debugger - * @param stack_size : the size of the thread stack in bytes - * @param priority : the priority of the thread - * @param arg : the argument to pass to the new thread - * - * @return WWD result code - */ -extern wwd_result_t host_rtos_create_thread_with_arg( /*@out@*/ host_thread_type_t* thread, void(*entry_function)( wwd_thread_arg_t arg ), const char* name, /*@null@*/ void* stack, uint32_t stack_size, uint32_t priority, wwd_thread_arg_t arg ); - - -/** - * Note: different RTOS have different parameters for creating threads. - * Use this function carefully if portability is important. - * Create a thread with RTOS specific thread argument (E.g. specify time-slicing behavior) - * - * Implemented in the WICED RTOS interface which is specific to the - * RTOS in use. - * - * @param thread : pointer to a variable which will receive the new thread handle - * @param entry_function : function pointer which points to the main function for the new thread - * @param name : a string thread name used for a debugger - * @param stack_size : the size of the thread stack in bytes - * @param priority : the priority of the thread - * @param arg : the argument to pass to the new thread - * @param config : os specific thread configuration - * @return WWD result code - */ -extern wwd_result_t host_rtos_create_configed_thread( /*@out@*/ host_thread_type_t* thread, void(*entry_function)( wwd_thread_arg_t arg ), const char* name, /*@null@*/ void* stack, uint32_t stack_size, uint32_t priority, host_rtos_thread_config_type_t *config ); - - -/** - * Exit a thread - * - * Implemented in the WICED RTOS interface which is specific to the - * RTOS in use. - * WICED uses this function to exit the current thread just before its main - * function would otherwise return. Some RTOSs allow threads to exit by simply returning - * from their main function. If this is the case, then the implementation of - * this function should be empty. - * - * @param thread : Pointer to the current thread handle - * - * @return WWD_SUCCESS or Error code - */ -extern wwd_result_t host_rtos_finish_thread( host_thread_type_t* thread ) /*@modifies *thread@*/; - - -/** - * Deletes a terminated thread - * - * Implemented in the WICED RTOS interface which is specific to the - * RTOS in use. - * Some RTOS implementations require that another thread deletes any terminated thread - * If RTOS does not require this, leave empty - * - * @param thread : handle of the terminated thread to delete - * - * @returns WWD_SUCCESS on success, Error code otherwise - */ -extern wwd_result_t host_rtos_delete_terminated_thread( host_thread_type_t* thread ); - - -/** - * Waits for a thread to complete - * - * Implemented in the WICED RTOS interface which is specific to the - * RTOS in use. - * - * @param thread : handle of the thread to wait for - * - * @returns WWD_SUCCESS on success, Error code otherwise - */ -extern wwd_result_t host_rtos_join_thread( host_thread_type_t* thread ); - -/* Semaphore management functions */ - -/** - * Create a Semaphore - * - * Implemented in the WICED RTOS interface which is specific to the - * RTOS in use. - * WICED uses this function to create a semaphore - * - * @param semaphore : Pointer to the semaphore handle to be initialized - * - * @return WWD_SUCCESS or Error code - */ -extern wwd_result_t host_rtos_init_semaphore( /*@special@*/ /*@out@*/ host_semaphore_type_t* semaphore ) /*@allocates *semaphore@*/ /*@defines **semaphore@*/; - -/** - * Get a semaphore - * - * Implemented in the WICED RTOS interface which is specific to the - * RTOS in use. - * WICED uses this function to get a semaphore. - * - If the semaphore value is greater than zero, the sempahore value is decremented and the function returns immediately. - * - If the semaphore value is zero, the current thread is put on a queue of threads waiting on the - * semaphore, and sleeps until another thread sets the semaphore and causes it to wake. Upon waking, the - * semaphore is decremented and the function returns. - * - * @note : This function must not be called from an interrupt context as it may block. - * - * @param semaphore : Pointer to the semaphore handle - * @param timeout_ms : Maximum number of milliseconds to wait while attempting to get - * the semaphore. Use the NEVER_TIMEOUT constant to wait forever. - * @param will_set_in_isr : True if the semaphore will be set in an ISR. Currently only used for NoOS/NoNS - * - * @return wwd_result_t : WWD_SUCCESS if semaphore was successfully acquired - * : WICED_TIMEOUT if semaphore was not acquired before timeout_ms period - */ -extern wwd_result_t host_rtos_get_semaphore( host_semaphore_type_t* semaphore, uint32_t timeout_ms, wiced_bool_t will_set_in_isr ) /*@modifies internalState@*/; - -/** - * Set a semaphore - * - * Implemented in the WICED RTOS interface which is specific to the - * RTOS in use. - * WICED uses this function to set a semaphore. - * The value of the semaphore is incremented, and if there are any threads waiting on the semaphore, - * then the first waiting thread is woken. - * - * Some RTOS implementations require different processing when setting a semaphore from within an ISR. - * A parameter is provided to allow this. - * - * @param semaphore : Pointer to the semaphore handle - * @param called_from_ISR : Value of WICED_TRUE indicates calling from interrupt context - * Value of WICED_FALSE indicates calling from normal thread context - * - * @return wwd_result_t : WWD_SUCCESS if semaphore was successfully set - * : Error code if an error occurred - * - */ -extern wwd_result_t host_rtos_set_semaphore( host_semaphore_type_t* semaphore, wiced_bool_t called_from_ISR ); - -/** - * Deletes a semaphore - * - * Implemented in the WICED RTOS interface which is specific to the - * RTOS in use. - * WICED uses this function to delete a semaphore. - * - * @param semaphore : Pointer to the semaphore handle - * - * @return wwd_result_t : WWD_SUCCESS if semaphore was successfully deleted - * : Error code if an error occurred - */ -extern wwd_result_t host_rtos_deinit_semaphore( /*@special@*/ host_semaphore_type_t* semaphore ) /*@releases *semaphore@*/; - - -/* Time management functions */ - -/** - * Gets time in milliseconds since RTOS start - * - * Implemented in the WICED RTOS interface which is specific to the - * RTOS in use. - * WICED uses this function to retrieve the current time. - * - * @note: Since this is only 32 bits, it will roll over every 49 days, 17 hours, 2 mins, 47.296 seconds - * - * @returns Time in milliseconds since the RTOS started. - */ -extern wwd_time_t host_rtos_get_time( void ) /*@modifies internalState@*/; - -/** - * Delay for a number of milliseconds - * - * Implemented in the WICED RTOS interface which is specific to the - * RTOS in use. - * WICED uses this function to delay processing - * Processing of this function depends on the minimum sleep - * time resolution of the RTOS. - * The current thread should sleep for the longest period possible which - * is less than the delay required, then makes up the difference - * with a tight loop - * - * @return wwd_result_t : WWD_SUCCESS if delay was successful - * : Error code if an error occurred - * - */ -extern wwd_result_t host_rtos_delay_milliseconds( uint32_t num_ms ); - - -/* Message queue management functions */ - -extern wwd_result_t host_rtos_init_queue( /*@special@*/ /*@out@*/ host_queue_type_t* queue, void* buffer, uint32_t buffer_size, uint32_t message_size ) /*@allocates *queue@*/ /*@defines **queue@*/; - -extern wwd_result_t host_rtos_push_to_queue( host_queue_type_t* queue, void* message, uint32_t timeout_ms ); - -extern wwd_result_t host_rtos_pop_from_queue( host_queue_type_t* queue, void* message, uint32_t timeout_ms ); - -extern wwd_result_t host_rtos_deinit_queue( /*@special@*/host_queue_type_t* queue ) /*@releases *queue@*/; - - -unsigned long host_rtos_get_tickrate( void ); - -/** @} */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif -#endif /* ifndef INCLUDED_WWD_RTOS_INTERFACE_H_ */ diff --git a/components/WWD/WWD/include/WICED/wiced_bluetooth_result.h b/components/WWD/WWD/include/WICED/wiced_bluetooth_result.h deleted file mode 100644 index e37fe4de68d51f8988c676744d0839169c19525f..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/WICED/wiced_bluetooth_result.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Defines result code for WICED bluetooth framework. DO NOT add - * Bluetooth constants(other than result codes) in this header file - */ - -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - - -/****************************************************** - * Macros - ******************************************************/ - -#ifndef RESULT_ENUM -#define RESULT_ENUM( prefix, name, value ) prefix ## name = (value) -#endif /* ifndef RESULT_ENUM */ - -/****************************************************** - * Constants - ******************************************************/ - -#define BT_RESULT_LIST( prefix ) \ - RESULT_ENUM( prefix, SUCCESS, 0 ), /**< Success */ \ - RESULT_ENUM( prefix, PENDING, 1 ), /**< Pending */ \ - RESULT_ENUM( prefix, TIMEOUT, 2 ), /**< Timeout */ \ - RESULT_ENUM( prefix, PARTIAL_RESULTS, 3 ), /**< Partial results */ \ - RESULT_ENUM( prefix, ERROR, 4 ), /**< Error */ \ - RESULT_ENUM( prefix, BADARG, 5 ), /**< Bad Arguments */ \ - RESULT_ENUM( prefix, BADOPTION, 6 ), /**< Mode not supported */ \ - RESULT_ENUM( prefix, UNSUPPORTED, 7 ), /**< Unsupported function */ \ - RESULT_ENUM( prefix, OUT_OF_HEAP_SPACE, 8 ), /**< Dynamic memory space exhausted */ \ - RESULT_ENUM( prefix, NOTUP, 9 ), /**< Interface is not currently up */ \ - RESULT_ENUM( prefix, LIST_EMPTY, 8010 ), /**< List is empty */ \ - RESULT_ENUM( prefix, ITEM_NOT_IN_LIST, 8011 ), /**< Item not found in the list */ \ - RESULT_ENUM( prefix, PACKET_DATA_OVERFLOW, 8012 ), /**< Data overflow beyond the packet end */ \ - RESULT_ENUM( prefix, PACKET_POOL_EXHAUSTED, 8013 ), /**< All packets in the pool is in use */ \ - RESULT_ENUM( prefix, PACKET_POOL_FATAL_ERROR, 8014 ), /**< Packet pool fatal error such as permanent packet leak */ \ - RESULT_ENUM( prefix, UNKNOWN_PACKET, 8015 ), /**< Unknown packet */ \ - RESULT_ENUM( prefix, PACKET_WRONG_OWNER, 8016 ), /**< Packet is owned by another entity */ \ - RESULT_ENUM( prefix, BUS_UNINITIALISED, 8017 ), /**< Bluetooth bus isn't initialised */ \ - RESULT_ENUM( prefix, MPAF_UNINITIALISED, 8018 ), /**< MPAF framework isn't initialised */ \ - RESULT_ENUM( prefix, RFCOMM_UNINITIALISED, 8019 ), /**< RFCOMM protocol isn't initialised */ \ - RESULT_ENUM( prefix, STACK_UNINITIALISED, 8020 ), /**< SmartBridge isn't initialised */ \ - RESULT_ENUM( prefix, SMARTBRIDGE_UNINITIALISED, 8021 ), /**< Bluetooth stack isn't initialised */ \ - RESULT_ENUM( prefix, ATT_CACHE_UNINITIALISED, 8022 ), /**< Attribute cache isn't initialised */ \ - RESULT_ENUM( prefix, MAX_CONNECTIONS_REACHED, 8023 ), /**< Maximum number of connections is reached */ \ - RESULT_ENUM( prefix, SOCKET_IN_USE, 8024 ), /**< Socket specified is in use */ \ - RESULT_ENUM( prefix, SOCKET_NOT_CONNECTED, 8025 ), /**< Socket is not connected or connection failed */ \ - RESULT_ENUM( prefix, ENCRYPTION_FAILED, 8026 ), /**< Encryption failed */ \ - RESULT_ENUM( prefix, SCAN_IN_PROGRESS, 8027 ), /**< Scan is in progress */ \ - RESULT_ENUM( prefix, CONNECT_IN_PROGRESS, 8028 ), /**< Connect is in progress */ \ - RESULT_ENUM( prefix, DISCONNECT_IN_PROGRESS, 8029 ), /**< Disconnect is in progress */ \ - RESULT_ENUM( prefix, DISCOVER_IN_PROGRESS, 8030 ), /**< Discovery is in progress */ \ - RESULT_ENUM( prefix, GATT_TIMEOUT, 8031 ), /**< GATT timeout occured*/ \ - RESULT_ENUM( prefix, ATTRIBUTE_VALUE_TOO_LONG, 8032 ), /**< Attribute value too long */ \ - RESULT_ENUM( prefix, BUSY, 8033 ), /**< Busy */ \ - RESULT_ENUM( prefix, NO_RESOURCES, 8034 ), /* No resources to issue command */ \ - RESULT_ENUM( prefix, ILLEGAL_VALUE, 8035 ), /* Illegal parameter value */ \ - RESULT_ENUM( prefix, WRONG_MODE, 8036 ), /* Device in wrong mode for request */ \ - RESULT_ENUM( prefix, UNKNOWN_ADDR, 8037 ), /* Unknown remote BD address */ \ - RESULT_ENUM( prefix, BAD_VALUE_RET, 8038 ), /* A bad value was received from HCI */ \ - RESULT_ENUM( prefix, NOT_AUTHORIZED, 8039 ), /* Authorization failed */ \ - RESULT_ENUM( prefix, DEV_RESET, 8040 ), /* Device has been reset */ \ - RESULT_ENUM( prefix, CMD_STORED, 8041 ), /* request is stored in control block */ \ - RESULT_ENUM( prefix, ILLEGAL_ACTION, 8042 ), /* state machine gets illegal command */ \ - RESULT_ENUM( prefix, DELAY_CHECK, 8043 ), /* delay the check on encryption */ \ - RESULT_ENUM( prefix, SCO_BAD_LENGTH, 8044 ), /* Bad SCO over HCI data length */ \ - RESULT_ENUM( prefix, SUCCESS_NO_SECURITY, 8045 ), /* security passed, no security set */ \ - RESULT_ENUM( prefix, FAILED_ON_SECURITY, 8046 ), /* security failed */ \ - RESULT_ENUM( prefix, REPEATED_ATTEMPTS, 8047 ), /* repeated attempts for LE security requests */ \ - RESULT_ENUM( prefix, MODE4_LEVEL4_NOT_SUPPORTED,8048 ), /* Secure Connections Only Mode can't be supported */ \ - RESULT_ENUM( prefix, USE_DEFAULT_SECURITY, 8049 ), /**< Use default security*/ \ - RESULT_ENUM( prefix, KEY_MISSING, 8050 ), /**< Key Missing */ \ - RESULT_ENUM( prefix, ENCRYPT_DISABLED, 8051 ), /* Encryption is disabled */ \ - RESULT_ENUM( prefix, UNKNOWN_EVENT, 8052 ), /**< Unknown event is received */ - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Global Variables - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - - -#ifdef __cplusplus -} /* extern "C" */ -#endif diff --git a/components/WWD/WWD/include/WICED/wiced_constants.h b/components/WWD/WWD/include/WICED/wiced_constants.h deleted file mode 100644 index 9bc74e63575f85ff82e443a38923207d8f60a07a..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/WICED/wiced_constants.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - - -/****************************************************** - * Macros - ******************************************************/ - -/****************************************************** - * Constants - ******************************************************/ - -#define TCPIP_RESULT_LIST( prefix ) \ - RESULT_ENUM( prefix, SUCCESS, 0 ), /**< Success */ \ - RESULT_ENUM( prefix, PENDING, 1 ), /**< Pending */ \ - RESULT_ENUM( prefix, TIMEOUT, 2 ), /**< Timeout */ \ - RESULT_ENUM( prefix, PARTIAL_RESULTS, 3 ), /**< Partial results */ \ - RESULT_ENUM( prefix, ERROR, 4 ), /**< Error */ \ - RESULT_ENUM( prefix, BADARG, 5 ), /**< Bad Arguments */ \ - RESULT_ENUM( prefix, BADOPTION, 6 ), /**< Mode not supported */ \ - RESULT_ENUM( prefix, UNSUPPORTED, 7 ), /**< Unsupported function */ \ - RESULT_ENUM( prefix, INVALID_PACKET, 7008 ), /**< Invalid packet */ \ - RESULT_ENUM( prefix, INVALID_SOCKET, 7009 ), /**< Invalid socket */ \ - RESULT_ENUM( prefix, WAIT_ABORTED, 7010 ), /**< Wait aborted */ \ - RESULT_ENUM( prefix, PORT_UNAVAILABLE, 7011 ), /**< Port unavailable */ \ - RESULT_ENUM( prefix, IN_PROGRESS, 7012 ), /**< Action in progress */ \ - RESULT_ENUM( prefix, IP_ADDRESS_IS_NOT_READY, 7013 ), /**< IP_ADDRESS_IS_NOT_READY */ \ - RESULT_ENUM( prefix, SOCKET_CLOSED, 7014 ), /**< Socket closed */ - -/****************************************************** - * Enumerations - ******************************************************/ - -/** Enumeration of WICED interfaces. \n - * @note The config interface is a virtual interface that shares the softAP interface - */ -typedef enum -{ - WICED_STA_INTERFACE = WWD_STA_INTERFACE, /**< STA or Client Interface */ - WICED_AP_INTERFACE = WWD_AP_INTERFACE, /**< softAP Interface */ - WICED_P2P_INTERFACE = WWD_P2P_INTERFACE, /**< P2P Interface */ - WICED_ETHERNET_INTERFACE = WWD_ETHERNET_INTERFACE, /**< Ethernet Interface */ - - - WICED_INTERFACE_MAX, /** DO NOT USE - MUST BE AFTER ALL NORMAL INTERFACES - used for counting interfaces */ - WICED_CONFIG_INTERFACE = WICED_AP_INTERFACE | (1 << 7), /**< config softAP Interface */ -} wiced_interface_t; - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Global Variables - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - - -#ifdef __cplusplus -} /* extern "C" */ -#endif diff --git a/components/WWD/WWD/include/WICED/wiced_deep_sleep.h b/components/WWD/WWD/include/WICED/wiced_deep_sleep.h deleted file mode 100644 index e8ed14762f5016ba481c15d14554bfdaf82b562a..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/WICED/wiced_deep_sleep.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#pragma once - -#include - -#include "platform_toolchain.h" - -#include "wwd_buffer.h" -#include "wwd_constants.h" - -#include "wiced_constants.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * Callback types - ******************************************************/ - -typedef enum -{ - WICED_DEEP_SLEEP_EVENT_ENTER, - WICED_DEEP_SLEEP_EVENT_CANCEL, - WICED_DEEP_SLEEP_EVENT_LEAVE, - WICED_DEEP_SLEEP_EVENT_WLAN_RESUME -} wiced_deep_sleep_event_type_t; - -typedef void( *wiced_deep_sleep_event_handler_t )( wiced_deep_sleep_event_type_t event ); - -/****************************************************** - * Platform definitions - ******************************************************/ - -#ifdef PLATFORM_DEEP_SLEEP -#define PLATFORM_DEEP_SLEEP_HEADER_INCLUDED -#include "platform_deep_sleep.h" -#endif /* PLATFORM_DEEP_SLEEP */ - -/****************************************************** - * Macros - ******************************************************/ - -#ifndef WICED_DEEP_SLEEP_SAVED_VAR -#define WICED_DEEP_SLEEP_SAVED_VAR( var ) var -#endif - -#ifndef WICED_DEEP_SLEEP_EVENT_HANDLER -#ifdef __IAR_SYSTEMS_ICC__ -#define IAR_ROOT_FUNC __root -#else -#define IAR_ROOT_FUNC -#endif /* __IAR_SYSTEMS_ICC__ */ -#define WICED_DEEP_SLEEP_EVENT_HANDLER( func_name ) \ - static IAR_ROOT_FUNC void MAY_BE_UNUSED func_name( wiced_deep_sleep_event_type_t event ) -#endif /* ndef WICED_DEEP_SLEEP_EVENT_HANDLER */ - -#ifndef WICED_DEEP_SLEEP_CALL_EVENT_HANDLERS -#define WICED_DEEP_SLEEP_CALL_EVENT_HANDLERS( cond, event ) -#endif - -#ifndef WICED_DEEP_SLEEP_IS_WARMBOOT -#define WICED_DEEP_SLEEP_IS_WARMBOOT( ) 0 -#endif - -#ifndef WICED_DEEP_SLEEP_IS_ENABLED -#define WICED_DEEP_SLEEP_IS_ENABLED( ) 0 -#endif - -#ifndef WICED_DEEP_SLEEP_IS_WARMBOOT_HANDLE -#define WICED_DEEP_SLEEP_IS_WARMBOOT_HANDLE( ) ( WICED_DEEP_SLEEP_IS_ENABLED( ) && WICED_DEEP_SLEEP_IS_WARMBOOT( ) ) -#endif - -#ifndef WICED_DEEP_SLEEP_SAVE_PACKETS_NUM -#define WICED_DEEP_SLEEP_SAVE_PACKETS_NUM 0 -#endif - -/****************************************************** - * Constants - ******************************************************/ - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Global Variables - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - -uint32_t wiced_deep_sleep_ticks_since_enter( void ); - -wiced_bool_t wiced_deep_sleep_save_packet( wiced_buffer_t buffer, wwd_interface_t interface ); - -void wiced_deep_sleep_set_networking_ready( void ); - -void wiced_deep_sleep_application_init_on_networking_ready_handler( void ); - -wiced_bool_t wiced_deep_sleep_is_networking_idle( wiced_interface_t interface ); - -#ifdef __cplusplus -} /* extern "C" */ -#endif diff --git a/components/WWD/WWD/include/WICED/wiced_defaults.h b/components/WWD/WWD/include/WICED/wiced_defaults.h deleted file mode 100644 index 7b2d16e5417524c3168f8ef5ae3bb95e44ac1b99..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/WICED/wiced_defaults.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#pragma once - -#ifdef __cplusplus -extern "C" -{ -#endif - -/************************************************************************ - * ** WARNING for PRINTING ** - * If printing is enabled, the stack of each thread that uses printing - * must be increased to at least 4 kBytes since the printf function uses - * a lot of memory (including dynamic memory) - */ - -/* Select which group of functions are allowed to print */ -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ -#define WPRINT_ENABLE_APP_INFO /* Application prints */ -//#define WPRINT_ENABLE_APP_DEBUG -//#define WPRINT_ENABLE_APP_ERROR -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ -#define WPRINT_ENABLE_LIB_INFO /* General library prints */ -//#define WPRINT_ENABLE_LIB_DEBUG -//#define WPRINT_ENABLE_LIB_ERROR -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ -#define WPRINT_ENABLE_WEBSERVER_INFO /* Webserver prints */ -//#define WPRINT_ENABLE_WEBSERVER_DEBUG -//#define WPRINT_ENABLE_WEBSERVER_ERROR - -#ifndef DISABLE_LOGGING -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ -#define WPRINT_ENABLE_NETWORK_INFO /* Network stack prints */ -//#define WPRINT_ENABLE_NETWORK_DEBUG -//#define WPRINT_ENABLE_NETWORK_ERROR -#endif -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ -#define WPRINT_ENABLE_RTOS_INFO /* RTOS prints */ -//#define WPRINT_ENABLE_RTOS_DEBUG -//#define WPRINT_ENABLE_RTOS_ERROR -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ -//#define WPRINT_ENABLE_SECURITY_INFO /* Security stack prints */ -//#define WPRINT_ENABLE_SECURITY_DEBUG -//#define WPRINT_ENABLE_SECURITY_ERROR -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ -#define WPRINT_ENABLE_WPS_INFO /* WPS stack prints */ -//#define WPRINT_ENABLE_WPS_DEBUG -//#define WPRINT_ENABLE_WPS_ERROR -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ -#define WPRINT_ENABLE_SUPPLICANT_INFO /* Supplicant stack prints */ -#define WPRINT_ENABLE_SUPPLICANT_DEBUG -#define WPRINT_ENABLE_SUPPLICANT_ERROR - -#ifndef DISABLE_LOGGING -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ -#define WPRINT_ENABLE_WICED_INFO /* Wiced internal prints */ -//#define WPRINT_ENABLE_WICED_DEBUG -//#define WPRINT_ENABLE_WICED_ERROR -#endif -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ -//#define WPRINT_ENABLE_WWD_INFO /* Wiced Wi-Fi Driver prints */ -//#define WPRINT_ENABLE_WWD_DEBUG -//#define WPRINT_ENABLE_WWD_ERROR -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ -#define WPRINT_ENABLE_PLATFORM_INFO /* Platform prints */ -//#define WPRINT_ENABLE_PLATFORM_DEBUG -//#define WPRINT_ENABLE_PLATFORM_ERROR - - -/************************************************************************ - * Default WICED networking timeouts in milliseconds */ -#define WICED_ALLOCATE_PACKET_TIMEOUT (2000) -#define WICED_TCP_DISCONNECT_TIMEOUT (3000) -#define WICED_TCP_BIND_TIMEOUT (3000) -#define WICED_TCP_SEND_TIMEOUT (3000) -#define WICED_TCP_ACCEPT_TIMEOUT (3000) -#define WICED_UDP_BIND_TIMEOUT (3000) -#define WICED_NTP_REPLY_TIMEOUT (5000) -#define WICED_TLS_RECEIVE_TIMEOUT (5000) -#define WICED_TLS_TRANSMIT_TIMEOUT (5000) -#define WICED_DHCP_IP_ADDRESS_RESOLUTION_TIMEOUT (15000) -#define WICED_AUTO_IP_ADDRESS_RESOLUTION_TIMEOUT (15000) - -/************************************************************************ - * Default WICED IOCTL/IOVAR timeouts in milliseconds */ -#define WICED_DEFAULT_IOCTL_PACKET_TIMEOUT ( WICED_NEVER_TIMEOUT ) - -/************************************************************************ - * WICED thread priority table - * - * +----------+-----------------+ - * | Priority | Thread | - * |----------|-----------------| - * | 0 | Wiced | Highest priority - * | 1 | Network | - * | 2 | | - * | 3 | Network worker | - * | 4 | | - * | 5 | Default Library | - * | | Default worker | - * | 6 | | - * | 7 | Application | - * | 8 | | - * | 9 | Idle | Lowest priority - * +----------+-----------------+ - */ -#define WICED_NETWORK_WORKER_PRIORITY (3) -#define WICED_DEFAULT_WORKER_PRIORITY (5) -#define WICED_DEFAULT_LIBRARY_PRIORITY (5) -#define WICED_APPLICATION_PRIORITY (7) - -/************************************************************************ - * WICED TCP Options */ -#define WICED_TCP_WINDOW_SIZE (7 * 1024) -#define WICED_DEFAULT_TCP_LISTEN_QUEUE_SIZE (5) -#define WICED_DEFAULT_TCP_TX_DEPTH_QUEUE (5) -#define WICED_DEFAULT_TCP_RX_DEPTH_QUEUE (5) -#define WICED_DEFAULT_TCP_TX_RETRIES (10) - -/************************************************************************ - * WICED UDP Options */ -#define WICED_DEFAULT_UDP_QUEUE_SIZE (5) - -/************************************************************************ - * WICED Join Options */ -#define WICED_JOIN_RETRY_ATTEMPTS (3) - -/************************************************************************ - * WICED TLS Options */ -#define WICED_TLS_MAX_RESUMABLE_SESSIONS (4) -#define WICED_TLS_DEFAULT_VERIFICATION (TLS_VERIFICATION_REQUIRED) - -/************************************************************************ - * Country code */ -#define WICED_DEFAULT_COUNTRY_CODE ( WICED_COUNTRY_UNITED_STATES ) - -/************************************************************************ - * Uncomment to enable Auto country support */ -//#define WICED_ENABLE_AUTO_COUNTRY - -/************************************************************************ - * Application thread stack size */ -#define WICED_DEFAULT_APPLICATION_STACK_SIZE (6144) - -/************************************************************************ - * Soft AP Options */ -#define WICED_DEFAULT_SOFT_AP_DTIM_PERIOD (1) - -/************************************************************************ - * WICED Wi-Fi Direct Options */ -#define P2P_MAX_ASSOCIATED_DEVICES (5) - -/************************************************************************ - * WICED Connectivity Options */ -#define WICED_USE_WIFI_STA_INTERFACE -#define WICED_USE_WIFI_AP_INTERFACE -//#define WICED_USE_WIFI_P2P_INTERFACE -//#define WICED_USE_ETHERNET_INTERFACE - -/************************************************************************ - * WICED WiFi Roaming related options (for STA interface) - * See wiced_wifi_set_roam_trigger() for details */ -#define WICED_WIFI_ROAMING_TRIGGER_MODE ( WICED_WIFI_OPTIMIZE_BANDWIDTH_ROAMING_TRIGGER ) -#define WICED_WIFI_ROAMING_TRIGGER_DELTA_IN_DBM ( 5 ) -#define WICED_WIFI_ROAMING_SCAN_PERIOD_IN_SECONDS ( 10 ) - -/************************************************************************ - * Uncomment to "hide" the soft AP */ -//#define WICED_DISABLE_SSID_BROADCAST - -/************************************************************************ - * Uncomment to prevent soft AP clients from communicating with each other */ -//#define WICED_WIFI_ISOLATE_AP_CLIENTS - -/************************************************************************ - * Uncomment to disable AMPDU transmission */ -//#define WICED_DISABLE_AMPDU_TX - -/************************************************************************ - * Uncomment to disable watchdog. For debugging only */ -//#define WICED_DISABLE_WATCHDOG - -/************************************************************************ - * Uncomment to disable standard IO, i.e. printf(), etc. */ -//#define WICED_DISABLE_STDIO - -/************************************************************************ - * Uncomment to disable MCU powersave API functions */ -//#define WICED_DISABLE_MCU_POWERSAVE - -/************************************************************************ - * Uncomment to enable MCU real time clock */ -//#define WICED_ENABLE_MCU_RTC - -/************************************************************************ - * Uncomment both to disable TLS completely*/ -//#define WICED_DISABLE_TLS - -#ifdef __cplusplus -} /*extern "C" */ -#endif diff --git a/components/WWD/WWD/include/WICED/wiced_resource.h b/components/WWD/WWD/include/WICED/wiced_resource.h deleted file mode 100644 index 1d25a669a33c3ff2c91e837fddd2ee842c345562..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/WICED/wiced_resource.h +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#ifndef __RESOURCE_H_ -#define __RESOURCE_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -/****************************************************** - * Macros - ******************************************************/ - -#ifndef MIN -#define MIN( x, y ) ((x) < (y) ? (x) : (y)) -#endif /* ifndef MIN */ - -/* Suppress unused parameter warning */ -#ifndef UNUSED_PARAMETER -#define UNUSED_PARAMETER( x ) ( (void)(x) ) -#endif - -#ifndef RESULT_ENUM -#define RESULT_ENUM( prefix, name, value ) prefix ## name = (value) -#endif /* ifndef RESULT_ENUM */ - -/* These Enum result values are for Resource errors - * Values: 4000 - 4999 - */ -#define RESOURCE_RESULT_LIST( prefix ) \ - RESULT_ENUM( prefix, SUCCESS, 0 ), /**< Success */ \ - RESULT_ENUM( prefix, UNSUPPORTED, 7 ), /**< Unsupported function */ \ - RESULT_ENUM( prefix, OFFSET_TOO_BIG, 4001 ), /**< Offset past end of resource */ \ - RESULT_ENUM( prefix, FILE_OPEN_FAIL, 4002 ), /**< Failed to open resource file */ \ - RESULT_ENUM( prefix, FILE_SEEK_FAIL, 4003 ), /**< Failed to seek to requested offset in resource file */ \ - RESULT_ENUM( prefix, FILE_READ_FAIL, 4004 ), /**< Failed to read resource file */ - -#define resource_get_size( resource ) ((resource)->size) - -/****************************************************** - * Constants - ******************************************************/ - -#define RESOURCE_ENUM_OFFSET ( 1300 ) - -/****************************************************** - * Enumerations - ******************************************************/ - -/** - * Result type for WICED Resource function - */ -typedef enum -{ - RESOURCE_RESULT_LIST( RESOURCE_ ) -} resource_result_t; - -/****************************************************** - * Type Definitions - ******************************************************/ - -typedef const void* resource_data_t; -typedef unsigned long resource_size_t; - -/****************************************************** - * Structures - ******************************************************/ - -/** - * Memory handle - */ -typedef struct -{ - /*@shared@*/ const char* data; -} memory_resource_handle_t; - -/** - * Filesystem handle - */ -typedef struct -{ - unsigned long offset; - /*@shared@*/ const char* filename; -} filesystem_resource_handle_t; - - -typedef enum -{ - RESOURCE_IN_MEMORY, - RESOURCE_IN_FILESYSTEM, - RESOURCE_IN_EXTERNAL_STORAGE -} resource_location_t; - -/** - * Resource handle structure - */ -typedef struct -{ - resource_location_t location; - - unsigned long size; - union - { - filesystem_resource_handle_t fs; - memory_resource_handle_t mem; - void* external_storage_context; - } val; -} resource_hnd_t; - -/****************************************************** - * Global Variables - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - -/** Read resource using the handle specified - * - * @param[in] resource : handle of the resource to read - * @param[in] offset : offset from the beginning of the resource block - * @param[in] maxsize : size of the buffer - * @param[out] size : size of the data successfully read - * @param[in] buffer : pointer to a buffer to contain the read data - * - * @return @ref resource_result_t - */ -extern resource_result_t resource_read( const resource_hnd_t* resource, uint32_t offset, uint32_t maxsize, uint32_t* size, void* buffer ); - -/** Retrieve a read only resource buffer using the handle specified - * - * @param[in] resource : handle of the resource to read - * @param[in] offset : offset from the beginning of the resource block - * @param[in] maxsize : size of the buffer - * @param[out] size : size of the data successfully read - * @param[out] buffer : pointer to a buffer pointer to point to the resource data - * - * @return @ref resource_result_t - */ -extern resource_result_t resource_get_readonly_buffer ( const resource_hnd_t* resource, uint32_t offset, uint32_t maxsize, uint32_t* size_out, const void** buffer ); - -/** Free a read only resource buffer using the handle specified - * - * @param[in] resource : handle of the resource to read - * @param[in] buffer : pointer to a buffer set using resource_get_readonly_buffer - * - * @return @ref resource_result_t - */ -extern resource_result_t resource_free_readonly_buffer( const resource_hnd_t* handle, const void* buffer ); - -#ifdef __cplusplus -} /*extern "C" */ -#endif - -#endif /* ifndef __RESOURCE_H_ */ diff --git a/components/WWD/WWD/include/WICED/wiced_result.h b/components/WWD/WWD/include/WICED/wiced_result.h deleted file mode 100644 index 208e1f307486eeb385390d45780cfc454327d7d6..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/WICED/wiced_result.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Header file that includes all API & helper functions - */ - -#pragma once - -#include "wwd_constants.h" -#include "wiced_resource.h" -#include "besl_structures.h" -#include "platform_constants.h" -#include "wiced_constants.h" -#include "wiced_bluetooth_result.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * @cond Macros - ******************************************************/ - -#ifndef RESULT_ENUM -#define RESULT_ENUM( prefix, name, value ) prefix ## name = (value) -#endif /* ifndef RESULT_ENUM */ - -/* - * Values: 0 - 999 - */ -#define WICED_RESULT_LIST( prefix ) \ - RESULT_ENUM( prefix, SUCCESS, 0 ), /**< Success */ \ - RESULT_ENUM( prefix, PENDING, 1 ), /**< Pending */ \ - RESULT_ENUM( prefix, TIMEOUT, 2 ), /**< Timeout */ \ - RESULT_ENUM( prefix, PARTIAL_RESULTS, 3 ), /**< Partial results */ \ - RESULT_ENUM( prefix, ERROR, 4 ), /**< Error */ \ - RESULT_ENUM( prefix, BADARG, 5 ), /**< Bad Arguments */ \ - RESULT_ENUM( prefix, BADOPTION, 6 ), /**< Mode not supported */ \ - RESULT_ENUM( prefix, UNSUPPORTED, 7 ), /**< Unsupported function */ \ - RESULT_ENUM( prefix, OUT_OF_HEAP_SPACE, 8 ), /**< Dynamic memory space exhausted */ \ - RESULT_ENUM( prefix, NOTUP, 9 ), /**< Interface is not currently Up */ \ - RESULT_ENUM( prefix, UNFINISHED, 10 ), /**< Operation not finished yet */ \ - RESULT_ENUM( prefix, CONNECTION_LOST, 11 ), /**< Connection to server lost */ \ - RESULT_ENUM( prefix, NOT_FOUND, 12 ), /**< Item not found */ \ - RESULT_ENUM( prefix, PACKET_BUFFER_CORRUPT, 13 ), /**< Packet buffer corrupted */ \ - RESULT_ENUM( prefix, ROUTING_ERROR, 14 ), /**< Routing error */ \ - RESULT_ENUM( prefix, BADVALUE, 15 ), /**< Bad value */ \ - RESULT_ENUM( prefix, WOULD_BLOCK, 16 ), /**< Function would block */ \ - RESULT_ENUM( prefix, ABORTED, 17 ), /**< Operation aborted */ \ - RESULT_ENUM( prefix, CONNECTION_RESET, 18 ), /**< Connection has been reset */ \ - RESULT_ENUM( prefix, CONNECTION_CLOSED, 19 ), /**< Connection is closed */ \ - RESULT_ENUM( prefix, NOT_CONNECTED, 20 ), /**< Connection is not connected */ \ - RESULT_ENUM( prefix, ADDRESS_IN_USE, 21 ), /**< Address is in use */ \ - RESULT_ENUM( prefix, NETWORK_INTERFACE_ERROR, 22 ), /**< Network interface error */ \ - RESULT_ENUM( prefix, ALREADY_CONNECTED, 23 ), /**< Socket is already connected */ \ - RESULT_ENUM( prefix, INVALID_INTERFACE, 24 ), /**< Interface specified in invalid */ \ - RESULT_ENUM( prefix, SOCKET_CREATE_FAIL, 25 ), /**< Socket creation failed */ \ - RESULT_ENUM( prefix, INVALID_SOCKET, 26 ), /**< Socket is invalid */ \ - RESULT_ENUM( prefix, CORRUPT_PACKET_BUFFER, 27 ), /**< Packet buffer is corrupted */ \ - RESULT_ENUM( prefix, UNKNOWN_NETWORK_STACK_ERROR, 28 ), /**< Unknown network stack error */ \ - RESULT_ENUM( prefix, NO_STORED_AP_IN_DCT, 29 ), /**< DCT contains no AP credentials */ \ - RESULT_ENUM( prefix, STA_JOIN_FAILED, 30 ), /**< Join failed */ \ - RESULT_ENUM( prefix, PACKET_BUFFER_OVERFLOW, 31 ), /**< Packet buffer overflow */ \ - RESULT_ENUM( prefix, ALREADY_INITIALIZED, 32 ), /**< Module has already been inited */ - - -#define FILESYSTEM_RESULT_LIST( prefix ) \ - RESULT_ENUM( prefix, SUCCESS, 0 ), /**< Success */ \ - RESULT_ENUM( prefix, PENDING, 1 ), /**< Pending */ \ - RESULT_ENUM( prefix, TIMEOUT, 2 ), /**< Timeout */ \ - RESULT_ENUM( prefix, PARTIAL_RESULTS, 3 ), /**< Partial results */ \ - RESULT_ENUM( prefix, ERROR, 4 ), /**< Error */ \ - RESULT_ENUM( prefix, BADARG, 5 ), /**< Bad Arguments */ \ - RESULT_ENUM( prefix, BADOPTION, 6 ), /**< Mode not supported */ \ - RESULT_ENUM( prefix, UNSUPPORTED, 7 ), /**< Unsupported function */ \ - RESULT_ENUM( prefix, DISK_ERROR, 10008 ), /**< Low level error accessing media */ \ - RESULT_ENUM( prefix, PATH_NOT_FOUND, 10009 ), /**< Path was not found in filesystem */ \ - RESULT_ENUM( prefix, MEDIA_NOT_READY, 10010 ), /**< Media is not present or ready for access */ \ - RESULT_ENUM( prefix, ACCESS_DENIED, 10011 ), /**< Access denied due to permissions */ \ - RESULT_ENUM( prefix, WRITE_PROTECTED, 10012 ), /**< Media is write protected */ \ - RESULT_ENUM( prefix, OUT_OF_SPACE, 10013 ), /**< No free space left on media */ \ - RESULT_ENUM( prefix, FILENAME_BUFFER_TOO_SMALL, 10014 ), /**< Filename buffer was too small when retrieving directory contents */ \ - RESULT_ENUM( prefix, END_OF_RESOURCE, 10015 ), /**< End of file/directory reached */ \ - RESULT_ENUM( prefix, FILESYSTEM_INVALID, 10016 ), /**< Filesystem has an unrecoverable error */ \ - RESULT_ENUM( prefix, BLOCK_SIZE_BAD, 10017 ), /**< Block size is invalid - not a multiple or sub-multiple of DEFAULT_SECTOR_SIZE */ - -/****************************************************** - * @endcond Enumerations - ******************************************************/ - -/** - * WICED Result Type - */ -typedef enum -{ - WICED_RESULT_LIST ( WICED_ ) /* 0 - 999 */ - WWD_RESULT_LIST ( WICED_WWD_ ) /* 1000 - 1999 */ - WLAN_RESULT_LIST ( WICED_WLAN_ ) /* 2000 - 2999 */ - WPS_BESL_RESULT_LIST ( WICED_BESL_ ) /* 3000 - 3999 */ - RESOURCE_RESULT_LIST ( WICED_RESOURCE_ ) /* 4000 - 4999 */ - TLS_RESULT_LIST ( WICED_TLS_ ) /* 5000 - 5999 */ - PLATFORM_RESULT_LIST ( WICED_PLATFORM_ ) /* 6000 - 6999 */ - TCPIP_RESULT_LIST ( WICED_TCPIP_ ) /* 7000 - 7999 */ - BT_RESULT_LIST ( WICED_BT_ ) /* 8000 - 8999 */ - P2P_RESULT_LIST ( WICED_P2P_ ) /* 9000 - 9999 */ - FILESYSTEM_RESULT_LIST( WICED_FILESYSTEM_ ) /* 10000 - 10999 */ -} wiced_result_t; - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - -#ifdef __cplusplus -} /*extern "C" */ -#endif diff --git a/components/WWD/WWD/include/bcmutils.h b/components/WWD/WWD/include/bcmutils.h deleted file mode 100644 index 2e6a41cce4315440c2612e08c7fa0700cb37540e..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/bcmutils.h +++ /dev/null @@ -1,784 +0,0 @@ -/* - * Misc useful os-independent macros and functions. - * - * $Copyright Open Broadcom Corporation$ - * - * $Id: bcmutils.h,v 13.236.2.16 2011-01-26 00:45:06 fengwang Exp $ - */ - -#ifndef _bcmutils_h_ -#define _bcmutils_h_ - -#include "typedefs.h" - -#if defined(UNDER_CE) -#include -#else -#define bcm_strcpy_s(dst, noOfElements, src) strcpy((dst), (src)) -#define bcm_strncpy_s(dst, noOfElements, src, count) strncpy((dst), (src), (count)) -#define bcm_strcat_s(dst, noOfElements, src) strcat((dst), (src)) -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* ctype replacement */ -#define _BCM_U 0x01 /* upper */ -#define _BCM_L 0x02 /* lower */ -#define _BCM_D 0x04 /* digit */ -#define _BCM_C 0x08 /* cntrl */ -#define _BCM_P 0x10 /* punct */ -#define _BCM_S 0x20 /* white space (space/lf/tab) */ -#define _BCM_X 0x40 /* hex digit */ -#define _BCM_SP 0x80 /* hard space (0x20) */ - -#if defined(BCMROMBUILD) -extern const unsigned char BCMROMDATA(bcm_ctype)[]; -#else -extern const unsigned char bcm_ctype[]; -#endif -#define bcm_ismask(x) (bcm_ctype[(int)(unsigned char)(x)]) - -#define bcm_isalnum(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L|_BCM_D)) != 0) -#define bcm_isalpha(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L)) != 0) -#define bcm_iscntrl(c) ((bcm_ismask(c)&(_BCM_C)) != 0) -#define bcm_isdigit(c) ((bcm_ismask(c)&(_BCM_D)) != 0) -#define bcm_isgraph(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D)) != 0) -#define bcm_islower(c) ((bcm_ismask(c)&(_BCM_L)) != 0) -#define bcm_isprint(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D|_BCM_SP)) != 0) -#define bcm_ispunct(c) ((bcm_ismask(c)&(_BCM_P)) != 0) -#define bcm_isspace(c) ((bcm_ismask(c)&(_BCM_S)) != 0) -#define bcm_isupper(c) ((bcm_ismask(c)&(_BCM_U)) != 0) -#define bcm_isxdigit(c) ((bcm_ismask(c)&(_BCM_D|_BCM_X)) != 0) -#define bcm_tolower(c) (bcm_isupper((c)) ? ((c) + 'a' - 'A') : (c)) -#define bcm_toupper(c) (bcm_islower((c)) ? ((c) + 'A' - 'a') : (c)) - -/* Buffer structure for collecting string-formatted data -* using bcm_bprintf() API. -* Use bcm_binit() to initialize before use -*/ - -struct bcmstrbuf { - char *buf; /* pointer to current position in origbuf */ - unsigned int size; /* current (residual) size in bytes */ - char *origbuf; /* unmodified pointer to orignal buffer */ - unsigned int origsize; /* unmodified orignal buffer size in bytes */ -}; - -/* ** driver-only section ** */ -#ifdef BCMDRIVER -#include - -#define GPIO_PIN_NOTDEFINED 0x20 /* Pin not defined */ - -/* - * Spin at most 'us' microseconds while 'exp' is true. - * Caller should explicitly test 'exp' when this completes - * and take appropriate error action if 'exp' is still true. - */ -#define SPINWAIT(exp, us) { \ - uint countdown = (us) + 9; \ - while ((exp) && (countdown >= 10)) {\ - OSL_DELAY(10); \ - countdown -= 10; \ - } \ -} - -/* osl multi-precedence packet queue */ -#ifndef PKTQ_LEN_DEFAULT -#define PKTQ_LEN_DEFAULT 128 /* Max 128 packets */ -#endif -#ifndef PKTQ_MAX_PREC -#define PKTQ_MAX_PREC 16 /* Maximum precedence levels */ -#endif - -typedef struct pktq_prec { - void *head; /* first packet to dequeue */ - void *tail; /* last packet to dequeue */ - uint16 len; /* number of queued packets */ - uint16 max; /* maximum number of queued packets */ -} pktq_prec_t; - - -/* multi-priority pkt queue */ -struct pktq { - uint16 num_prec; /* number of precedences in use */ - uint16 hi_prec; /* rapid dequeue hint (>= highest non-empty prec) */ - uint16 max; /* total max packets */ - uint16 len; /* total number of packets */ - /* q array must be last since # of elements can be either PKTQ_MAX_PREC or 1 */ - struct pktq_prec q[PKTQ_MAX_PREC]; -}; - -/* simple, non-priority pkt queue */ -struct spktq { - uint16 num_prec; /* number of precedences in use (always 1) */ - uint16 hi_prec; /* rapid dequeue hint (>= highest non-empty prec) */ - uint16 max; /* total max packets */ - uint16 len; /* total number of packets */ - /* q array must be last since # of elements can be either PKTQ_MAX_PREC or 1 */ - struct pktq_prec q[1]; -}; - -#define PKTQ_PREC_ITER(pq, prec) for (prec = (pq)->num_prec - 1; prec >= 0; prec--) - -/* fn(pkt, arg). return true if pkt belongs to if */ -typedef bool (*ifpkt_cb_t)(void*, int); - -#ifdef BCMPKTPOOL -#define POOL_ENAB(pool) ((pool) && (pool)->inited) -#if defined(BCM4329C0) -#define SHARED_POOL (pktpool_shared_ptr) -#else -#define SHARED_POOL (pktpool_shared) -#endif /* BCM4329C0 */ -#else /* BCMPKTPOOL */ -#define POOL_ENAB(bus) 0 -#define SHARED_POOL ((struct pktpool *)NULL) -#endif /* BCMPKTPOOL */ - -#ifndef PKTPOOL_LEN_MAX -#define PKTPOOL_LEN_MAX 40 -#endif -#define PKTPOOL_CB_MAX 3 - -struct pktpool; -typedef void (*pktpool_cb_t)(struct pktpool *pool, void *arg); -typedef struct { - pktpool_cb_t cb; - void *arg; -} pktpool_cbinfo_t; - -#ifdef BCMDBG_POOL -/* pkt pool debug states */ -#define POOL_IDLE 0 -#define POOL_RXFILL 1 -#define POOL_RXDH 2 -#define POOL_RXD11 3 -#define POOL_TXDH 4 -#define POOL_TXD11 5 -#define POOL_AMPDU 6 -#define POOL_TXENQ 7 - -typedef struct { - void *p; - uint32 cycles; - uint32 dur; -} pktpool_dbg_t; - -typedef struct { - uint8 txdh; /* tx to host */ - uint8 txd11; /* tx to d11 */ - uint8 enq; /* waiting in q */ - uint8 rxdh; /* rx from host */ - uint8 rxd11; /* rx from d11 */ - uint8 rxfill; /* dma_rxfill */ - uint8 idle; /* avail in pool */ -} pktpool_stats_t; -#endif /* BCMDBG_POOL */ - -typedef struct pktpool { - bool inited; - uint16 r; - uint16 w; - uint16 len; - uint16 maxlen; - uint16 plen; - bool istx; - bool empty; - uint8 cbtoggle; - uint8 cbcnt; - uint8 ecbcnt; - bool emptycb_disable; - pktpool_cbinfo_t cbs[PKTPOOL_CB_MAX]; - pktpool_cbinfo_t ecbs[PKTPOOL_CB_MAX]; - void *q[PKTPOOL_LEN_MAX + 1]; - -#ifdef BCMDBG_POOL - uint8 dbg_cbcnt; - pktpool_cbinfo_t dbg_cbs[PKTPOOL_CB_MAX]; - uint16 dbg_qlen; - pktpool_dbg_t dbg_q[PKTPOOL_LEN_MAX + 1]; -#endif -} pktpool_t; - -#if defined(BCM4329C0) -extern pktpool_t *pktpool_shared_ptr; -#else -extern pktpool_t *pktpool_shared; -#endif /* BCM4329C0 */ - -extern int pktpool_init(osl_t *osh, pktpool_t *pktp, int *pktplen, int plen, bool istx); -extern int pktpool_deinit(osl_t *osh, pktpool_t *pktp); -extern int pktpool_fill(osl_t *osh, pktpool_t *pktp, bool minimal); -extern void* pktpool_get(pktpool_t *pktp); -extern void pktpool_free(pktpool_t *pktp, void *p); -extern int pktpool_add(pktpool_t *pktp, void *p); -extern uint16 pktpool_avail(pktpool_t *pktp); -extern int pktpool_avail_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg); -extern int pktpool_empty_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg); -extern int pktpool_setmaxlen(pktpool_t *pktp, uint16 maxlen); -extern int pktpool_setmaxlen_strict(osl_t *osh, pktpool_t *pktp, uint16 maxlen); -extern void pktpool_emptycb_disable(pktpool_t *pktp, bool disable); - -#define POOLPTR(pp) ((pktpool_t *)(pp)) -#define pktpool_len(pp) (POOLPTR(pp)->len - 1) -#define pktpool_plen(pp) (POOLPTR(pp)->plen) -#define pktpool_maxlen(pp) (POOLPTR(pp)->maxlen) - -#ifdef BCMDBG_POOL -extern int pktpool_dbg_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg); -extern int pktpool_start_trigger(pktpool_t *pktp, void *p); -extern int pktpool_dbg_dump(pktpool_t *pktp); -extern int pktpool_dbg_notify(pktpool_t *pktp); -extern int pktpool_stats_dump(pktpool_t *pktp, pktpool_stats_t *stats); -#endif /* BCMDBG_POOL */ - -/* forward definition of ether_addr structure used by some function prototypes */ - -struct ether_addr; - -extern int ether_isbcast(const void *ea); -extern int ether_isnulladdr(const void *ea); - -/* operations on a specific precedence in packet queue */ - -#define pktq_psetmax(pq, prec, _max) ((pq)->q[prec].max = (_max)) -#define pktq_plen(pq, prec) ((pq)->q[prec].len) -#define pktq_pavail(pq, prec) ((pq)->q[prec].max - (pq)->q[prec].len) -#define pktq_pfull(pq, prec) ((pq)->q[prec].len >= (pq)->q[prec].max) -#define pktq_pempty(pq, prec) ((pq)->q[prec].len == 0) - -#define pktq_ppeek(pq, prec) ((pq)->q[prec].head) -#define pktq_ppeek_tail(pq, prec) ((pq)->q[prec].tail) - -extern void *pktq_penq(struct pktq *pq, int prec, void *p); -extern void *pktq_penq_head(struct pktq *pq, int prec, void *p); -extern void *pktq_pdeq(struct pktq *pq, int prec); -extern void *pktq_pdeq_tail(struct pktq *pq, int prec); -/* Empty the queue at particular precedence level */ -extern void pktq_pflush(osl_t *osh, struct pktq *pq, int prec, bool dir, - ifpkt_cb_t fn, int arg); -/* Remove a specified packet from its queue */ -extern bool pktq_pdel(struct pktq *pq, void *p, int prec); - -/* operations on a set of precedences in packet queue */ - -extern int pktq_mlen(struct pktq *pq, uint prec_bmp); -extern void *pktq_mdeq(struct pktq *pq, uint prec_bmp, int *prec_out); - -/* operations on packet queue as a whole */ - -#define pktq_len(pq) ((int)(pq)->len) -#define pktq_max(pq) ((int)(pq)->max) -#define pktq_avail(pq) ((int)((pq)->max - (pq)->len)) -#define pktq_full(pq) ((pq)->len >= (pq)->max) -#define pktq_empty(pq) ((pq)->len == 0) - -/* operations for single precedence queues */ -#define pktenq(pq, p) pktq_penq(((struct pktq *)pq), 0, (p)) -#define pktenq_head(pq, p) pktq_penq_head(((struct pktq *)pq), 0, (p)) -#define pktdeq(pq) pktq_pdeq(((struct pktq *)pq), 0) -#define pktdeq_tail(pq) pktq_pdeq_tail(((struct pktq *)pq), 0) -#define pktqinit(pq, len) pktq_init(((struct pktq *)pq), 1, len) - -extern void pktq_init(struct pktq *pq, int num_prec, int max_len); -/* prec_out may be NULL if caller is not interested in return value */ -extern void *pktq_deq(struct pktq *pq, int *prec_out); -extern void *pktq_deq_tail(struct pktq *pq, int *prec_out); -extern void *pktq_peek(struct pktq *pq, int *prec_out); -extern void *pktq_peek_tail(struct pktq *pq, int *prec_out); -extern void pktq_flush(osl_t *osh, struct pktq *pq, bool dir, ifpkt_cb_t fn, int arg); - -/* externs */ -/* packet */ -extern uint pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf); -extern uint pktfrombuf(osl_t *osh, void *p, uint offset, int len, uchar *buf); -extern uint pkttotlen(osl_t *osh, void *p); -extern void *pktlast(osl_t *osh, void *p); -extern uint pktsegcnt(osl_t *osh, void *p); - -/* Get priority from a packet and pass it back in scb (or equiv) */ -extern uint pktsetprio(void *pkt, bool update_vtag); -#define PKTPRIO_VDSCP 0x100 /* DSCP prio found after VLAN tag */ -#define PKTPRIO_VLAN 0x200 /* VLAN prio found */ -#define PKTPRIO_UPD 0x400 /* DSCP used to update VLAN prio */ -#define PKTPRIO_DSCP 0x800 /* DSCP prio found */ - -/* string */ -extern int BCMROMFN(bcm_atoi)(char *s); -extern ulong BCMROMFN(bcm_strtoul)(char *cp, char **endp, uint base); -extern char *BCMROMFN(bcmstrstr)(char *haystack, char *needle); -extern char *BCMROMFN(bcmstrcat)(char *dest, const char *src); -extern char *BCMROMFN(bcmstrncat)(char *dest, const char *src, uint size); -extern ulong wchar2ascii(char *abuf, ushort *wbuf, ushort wbuflen, ulong abuflen); -char* bcmstrtok(char **string, const char *delimiters, char *tokdelim); -int bcmstricmp(const char *s1, const char *s2); -int bcmstrnicmp(const char* s1, const char* s2, int cnt); - - -/* ethernet address */ -extern char *bcm_ether_ntoa(const struct ether_addr *ea, char *buf); -extern int BCMROMFN(bcm_ether_atoe)(char *p, struct ether_addr *ea); - -/* ip address */ -struct ipv4_addr; -extern char *bcm_ip_ntoa(struct ipv4_addr *ia, char *buf); - -/* delay */ -extern void bcm_mdelay(uint ms); -/* variable access */ -#if defined (DONGLEBUILD) && !defined(WLTEST) && !defined (BCMINTERNAL) && !defined(BCMDBG_DUMP) -#ifdef BCMDBG -#define NVRAM_RECLAIM_CHECK(name) \ - if (r2_reclaimed == TRUE) { \ - printf("%s: NVRAM already reclaimed, %s\n", __FUNCTION__, (name)); \ - *(char*) 0 = 0; /* TRAP */ \ - return NULL; \ - } -#else /* BCMDBG */ -#define NVRAM_RECLAIM_CHECK(name) \ - if (r2_reclaimed == TRUE) { \ - *(char*) 0 = 0; /* TRAP */ \ - return NULL; \ - } -#endif /* BCMDBG */ -#else /* DONGLEBUILD && !WLTEST && !BCMINTERNAL && !BCMDBG_DUMP */ -#define NVRAM_RECLAIM_CHECK(name) -#endif /* DONGLEBUILD && !WLTEST && !BCMINTERNAL && !BCMDBG_DUMP */ - -/* variable access */ -extern char *getvar(char *vars, const char *name); -extern int getintvar(char *vars, const char *name); -extern int getintvararray(char *vars, const char *name, int index); -extern int getintvararraysize(char *vars, const char *name); -extern uint getgpiopin(char *vars, char *pin_name, uint def_pin); -#ifdef BCMDBG -extern void prpkt(const char *msg, osl_t *osh, void *p0); -#endif /* BCMDBG */ -#ifdef BCMPERFSTATS -extern void bcm_perf_enable(void); -extern void bcmstats(char *fmt); -extern void bcmlog(char *fmt, uint a1, uint a2); -extern void bcmdumplog(char *buf, int size); -extern int bcmdumplogent(char *buf, uint idx); -#else -#define bcm_perf_enable() -#define bcmstats(fmt) -#define bcmlog(fmt, a1, a2) -#define bcmdumplog(buf, size) *buf = '\0' -#define bcmdumplogent(buf, idx) -1 -#endif /* BCMPERFSTATS */ - -#if defined(BCMTSTAMPEDLOGS) -#define TSF_TICKS_PER_MS 1024 -/* Store a TSF timestamp and a log line in the log buffer */ -extern void bcmtslog(uint32 tstamp, char *fmt, uint a1, uint a2); -/* Print out the log buffer with timestamps */ -extern void bcmprinttslogs(void); -/* Print out a microsecond timestamp as "sec.ms.us " */ -extern void bcmprinttstamp(uint32 us); -#else -#define bcmtslog(tstamp, fmt, a1, a2) -#define bcmprinttslogs() -#define bcmprinttstamp(us) -#endif /* BCMTSTAMPEDLOGS */ - -extern char *bcm_nvram_vars(uint *length); -extern int bcm_nvram_cache(void *sih); - -/* Support for sharing code across in-driver iovar implementations. - * The intent is that a driver use this structure to map iovar names - * to its (private) iovar identifiers, and the lookup function to - * find the entry. Macros are provided to map ids and get/set actions - * into a single number space for a switch statement. - */ - -/* iovar structure */ -typedef struct bcm_iovar { - const char *name; /* name for lookup and display */ - uint16 varid; /* id for switch */ - uint16 flags; /* driver-specific flag bits */ - uint16 type; /* base type of argument */ - uint16 minlen; /* min length for buffer vars */ -} bcm_iovar_t; - -/* varid definitions are per-driver, may use these get/set bits */ - -/* IOVar action bits for id mapping */ -#define IOV_GET 0 /* Get an iovar */ -#define IOV_SET 1 /* Set an iovar */ - -/* Varid to actionid mapping */ -#define IOV_GVAL(id) ((id)*2) -#define IOV_SVAL(id) (((id)*2)+IOV_SET) -#define IOV_ISSET(actionid) ((actionid & IOV_SET) == IOV_SET) -#define IOV_ID(actionid) (actionid >> 1) - -/* flags are per-driver based on driver attributes */ - -extern const bcm_iovar_t *bcm_iovar_lookup(const bcm_iovar_t *table, const char *name); -extern int bcm_iovar_lencheck(const bcm_iovar_t *table, void *arg, int len, bool set); -#if defined(WLTINYDUMP) || defined(BCMDBG) || defined(WLMSG_INFORM) || \ - defined(WLMSG_ASSOC) || defined(WLMSG_PRPKT) || defined(WLMSG_WSEC) -extern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len); -#endif /* WLTINYDUMP || BCMDBG || WLMSG_INFORM || WLMSG_ASSOC || WLMSG_PRPKT */ -#endif /* BCMDRIVER */ - -/* Base type definitions */ -#define IOVT_VOID 0 /* no value (implictly set only) */ -#define IOVT_BOOL 1 /* any value ok (zero/nonzero) */ -#define IOVT_INT8 2 /* integer values are range-checked */ -#define IOVT_UINT8 3 /* unsigned int 8 bits */ -#define IOVT_INT16 4 /* int 16 bits */ -#define IOVT_UINT16 5 /* unsigned int 16 bits */ -#define IOVT_INT32 6 /* int 32 bits */ -#define IOVT_UINT32 7 /* unsigned int 32 bits */ -#define IOVT_BUFFER 8 /* buffer is size-checked as per minlen */ -#define BCM_IOVT_VALID(type) (((unsigned int)(type)) <= IOVT_BUFFER) - -/* Initializer for IOV type strings */ -#define BCM_IOV_TYPE_INIT { \ - "void", \ - "bool", \ - "int8", \ - "uint8", \ - "int16", \ - "uint16", \ - "int32", \ - "uint32", \ - "buffer", \ - "" } - -#define BCM_IOVT_IS_INT(type) (\ - (type == IOVT_BOOL) || \ - (type == IOVT_INT8) || \ - (type == IOVT_UINT8) || \ - (type == IOVT_INT16) || \ - (type == IOVT_UINT16) || \ - (type == IOVT_INT32) || \ - (type == IOVT_UINT32)) - -/* ** driver/apps-shared section ** */ - -#define BCME_STRLEN 64 /* Max string length for BCM errors */ -#define VALID_BCMERROR(e) ((e <= 0) && (e >= BCME_LAST)) - - -/* - * error codes could be added but the defined ones shouldn't be changed/deleted - * these error codes are exposed to the user code - * when ever a new error code is added to this list - * please update errorstring table with the related error string and - * update osl files with os specific errorcode map -*/ - -#define BCME_OK 0 /* Success */ -#define BCME_ERROR -1 /* Error generic */ -#define BCME_BADARG -2 /* Bad Argument */ -#define BCME_BADOPTION -3 /* Bad option */ -#define BCME_NOTUP -4 /* Not up */ -#define BCME_NOTDOWN -5 /* Not down */ -#define BCME_NOTAP -6 /* Not AP */ -#define BCME_NOTSTA -7 /* Not STA */ -#define BCME_BADKEYIDX -8 /* BAD Key Index */ -#define BCME_RADIOOFF -9 /* Radio Off */ -#define BCME_NOTBANDLOCKED -10 /* Not band locked */ -#define BCME_NOCLK -11 /* No Clock */ -#define BCME_BADRATESET -12 /* BAD Rate valueset */ -#define BCME_BADBAND -13 /* BAD Band */ -#define BCME_BUFTOOSHORT -14 /* Buffer too short */ -#define BCME_BUFTOOLONG -15 /* Buffer too long */ -#define BCME_BUSY -16 /* Busy */ -#define BCME_NOTASSOCIATED -17 /* Not Associated */ -#define BCME_BADSSIDLEN -18 /* Bad SSID len */ -#define BCME_OUTOFRANGECHAN -19 /* Out of Range Channel */ -#define BCME_BADCHAN -20 /* Bad Channel */ -#define BCME_BADADDR -21 /* Bad Address */ -#define BCME_NORESOURCE -22 /* Not Enough Resources */ -#define BCME_UNSUPPORTED -23 /* Unsupported */ -#define BCME_BADLEN -24 /* Bad length */ -#define BCME_NOTREADY -25 /* Not Ready */ -#define BCME_EPERM -26 /* Not Permitted */ -#define BCME_NOMEM -27 /* No Memory */ -#define BCME_ASSOCIATED -28 /* Associated */ -#define BCME_RANGE -29 /* Not In Range */ -#define BCME_NOTFOUND -30 /* Not Found */ -#define BCME_WME_NOT_ENABLED -31 /* WME Not Enabled */ -#define BCME_TSPEC_NOTFOUND -32 /* TSPEC Not Found */ -#define BCME_ACM_NOTSUPPORTED -33 /* ACM Not Supported */ -#define BCME_NOT_WME_ASSOCIATION -34 /* Not WME Association */ -#define BCME_SDIO_ERROR -35 /* SDIO Bus Error */ -#define BCME_DONGLE_DOWN -36 /* Dongle Not Accessible */ -#define BCME_VERSION -37 /* Incorrect version */ -#define BCME_TXFAIL -38 /* TX failure */ -#define BCME_RXFAIL -39 /* RX failure */ -#define BCME_NODEVICE -40 /* Device not present */ -#define BCME_NMODE_DISABLED -41 /* NMODE disabled */ -#define BCME_NONRESIDENT -42 /* access to nonresident overlay */ -#define BCME_LAST BCME_NONRESIDENT - -/* These are collection of BCME Error strings */ -#define BCMERRSTRINGTABLE { \ - "OK", \ - "Undefined error", \ - "Bad Argument", \ - "Bad Option", \ - "Not up", \ - "Not down", \ - "Not AP", \ - "Not STA", \ - "Bad Key Index", \ - "Radio Off", \ - "Not band locked", \ - "No clock", \ - "Bad Rate valueset", \ - "Bad Band", \ - "Buffer too short", \ - "Buffer too long", \ - "Busy", \ - "Not Associated", \ - "Bad SSID len", \ - "Out of Range Channel", \ - "Bad Channel", \ - "Bad Address", \ - "Not Enough Resources", \ - "Unsupported", \ - "Bad length", \ - "Not Ready", \ - "Not Permitted", \ - "No Memory", \ - "Associated", \ - "Not In Range", \ - "Not Found", \ - "WME Not Enabled", \ - "TSPEC Not Found", \ - "ACM Not Supported", \ - "Not WME Association", \ - "SDIO Bus Error", \ - "Dongle Not Accessible", \ - "Incorrect version", \ - "TX Failure", \ - "RX Failure", \ - "Device Not Present", \ - "NMODE Disabled", \ - "Nonresident overlay access", \ -} - -#ifndef ABS -#define ABS(a) (((a) < 0)?-(a):(a)) -#endif /* ABS */ - -#ifndef MIN -#define MIN(a, b) (((a) < (b))?(a):(b)) -#endif /* MIN */ - -#ifndef MAX -#define MAX(a, b) (((a) > (b))?(a):(b)) -#endif /* MAX */ - -#define CEIL(x, y) (((x) + ((y)-1)) / (y)) -#define ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y)) -#define ISALIGNED(a, x) (((uintptr)(a) & ((x)-1)) == 0) -#define ALIGN_ADDR(addr, boundary) (void *)(((uintptr)(addr) + (boundary) - 1) \ - & ~((boundary) - 1)) -#define ISPOWEROF2(x) ((((x)-1)&(x)) == 0) -#define VALID_MASK(mask) !((mask) & ((mask) + 1)) -#ifndef OFFSETOF -#define OFFSETOF(type, member) ((uint)(uintptr)&((type *)0)->member) -#endif /* OFFSETOF */ -#ifndef ARRAYSIZE -#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0])) -#endif - -/* Reference a function; used to prevent a static function from being optimized out */ -extern void *_bcmutils_dummy_fn; -#define REFERENCE_FUNCTION(f) (_bcmutils_dummy_fn = (void *)(f)) - -/* bit map related macros */ -#ifndef setbit -#ifndef NBBY /* the BSD family defines NBBY */ -#define NBBY 8 /* 8 bits per byte */ -#endif /* #ifndef NBBY */ -#define setbit(a, i) (((uint8 *)a)[(i)/NBBY] |= 1<<((i)%NBBY)) -#define clrbit(a, i) (((uint8 *)a)[(i)/NBBY] &= ~(1<<((i)%NBBY))) -#define isset(a, i) (((const uint8 *)a)[(i)/NBBY] & (1<<((i)%NBBY))) -#define isclr(a, i) ((((const uint8 *)a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0) -#endif /* setbit */ - -#define NBITS(type) (sizeof(type) * 8) -#define NBITVAL(nbits) (1 << (nbits)) -#define MAXBITVAL(nbits) ((1 << (nbits)) - 1) -#define NBITMASK(nbits) MAXBITVAL(nbits) -#define MAXNBVAL(nbyte) MAXBITVAL((nbyte) * 8) - -/* basic mux operation - can be optimized on several architectures */ -#define MUX(pred, true, false) ((pred) ? (true) : (false)) - -/* modulo inc/dec - assumes x E [0, bound - 1] */ -#define MODDEC(x, bound) MUX((x) == 0, (bound) - 1, (x) - 1) -#define MODINC(x, bound) MUX((x) == (bound) - 1, 0, (x) + 1) - -/* modulo inc/dec, bound = 2^k */ -#define MODDEC_POW2(x, bound) (((x) - 1) & ((bound) - 1)) -#define MODINC_POW2(x, bound) (((x) + 1) & ((bound) - 1)) - -/* modulo add/sub - assumes x, y E [0, bound - 1] */ -#define MODADD(x, y, bound) \ - MUX((x) + (y) >= (bound), (x) + (y) - (bound), (x) + (y)) -#define MODSUB(x, y, bound) \ - MUX(((int)(x)) - ((int)(y)) < 0, (x) - (y) + (bound), (x) - (y)) - -/* module add/sub, bound = 2^k */ -#define MODADD_POW2(x, y, bound) (((x) + (y)) & ((bound) - 1)) -#define MODSUB_POW2(x, y, bound) (((x) - (y)) & ((bound) - 1)) - -/* crc defines */ -#define CRC8_INIT_VALUE 0xff /* Initial CRC8 checksum value */ -#define CRC8_GOOD_VALUE 0x9f /* Good final CRC8 checksum value */ -#define CRC16_INIT_VALUE 0xffff /* Initial CRC16 checksum value */ -#define CRC16_GOOD_VALUE 0xf0b8 /* Good final CRC16 checksum value */ -#define CRC32_INIT_VALUE 0xffffffff /* Initial CRC32 checksum value */ -#define CRC32_GOOD_VALUE 0xdebb20e3 /* Good final CRC32 checksum value */ - -/* bcm_format_flags() bit description structure */ -typedef struct bcm_bit_desc { - uint32 bit; - const char* name; -} bcm_bit_desc_t; - -/* tag_ID/length/value_buffer tuple */ -typedef struct bcm_tlv { - uint8 id; - uint8 len; - uint8 data[1]; -} bcm_tlv_t; - -/* Check that bcm_tlv_t fits into the given buflen */ -#define bcm_valid_tlv(elt, buflen) ((buflen) >= 2 && (int)(buflen) >= (int)(2 + (elt)->len)) - -/* buffer length for ethernet address from bcm_ether_ntoa() */ -#define ETHER_ADDR_STR_LEN 18 /* 18-bytes of Ethernet address buffer length */ - -/* crypto utility function */ -/* 128-bit xor: *dst = *src1 xor *src2. dst1, src1 and src2 may have any alignment */ -static INLINE void -xor_128bit_block(const uint8 *src1, const uint8 *src2, uint8 *dst) -{ - if ( -#ifdef __i386__ - 1 || -#endif - (((uintptr)src1 | (uintptr)src2 | (uintptr)dst) & 3) == 0) { - /* ARM CM3 rel time: 1229 (727 if alignment check could be omitted) */ - /* x86 supports unaligned. This version runs 6x-9x faster on x86. */ - ((uint32 *)dst)[0] = ((const uint32 *)src1)[0] ^ ((const uint32 *)src2)[0]; - ((uint32 *)dst)[1] = ((const uint32 *)src1)[1] ^ ((const uint32 *)src2)[1]; - ((uint32 *)dst)[2] = ((const uint32 *)src1)[2] ^ ((const uint32 *)src2)[2]; - ((uint32 *)dst)[3] = ((const uint32 *)src1)[3] ^ ((const uint32 *)src2)[3]; - } else { - /* ARM CM3 rel time: 4668 (4191 if alignment check could be omitted) */ - int k; - for (k = 0; k < 16; k++) - dst[k] = src1[k] ^ src2[k]; - } -} - -/* externs */ -/* crc */ -//extern uint8 BCMROMFN(hndcrc8)(uint8 *p, uint nbytes, uint8 crc); -//extern uint16 BCMROMFN(hndcrc16)(uint8 *p, uint nbytes, uint16 crc); -//extern uint32 BCMROMFN(hndcrc32)(uint8 *p, uint nbytes, uint32 crc); -/* format/print */ -#if defined(BCMDBG) || defined(DHD_DEBUG) || defined(BCMDBG_ERR) || defined(WLMSG_PRHDRS) || \ - defined(WLMSG_PRPKT) || defined(WLMSG_ASSOC) || defined(BCMDBG_DUMP) -extern int bcm_format_flags(const bcm_bit_desc_t *bd, uint32 flags, char* buf, int len); -#endif - -#if defined(BCMDBG) || defined(DHD_DEBUG) || defined(BCMDBG_ERR) || defined(WLMSG_PRHDRS) || \ - defined(WLMSG_PRPKT) || defined(WLMSG_ASSOC) || defined(BCMDBG_DUMP) || \ - defined(WLMEDIA_PEAKRATE) -extern int bcm_format_hex(char *str, const void *bytes, int len); -#endif - -#ifdef BCMDBG -extern void deadbeef(void *p, uint len); -#endif -extern const char *bcm_crypto_algo_name(uint algo); -extern char *bcm_chipname(uint chipid, char *buf, uint len); -extern char *bcm_brev_str(uint32 brev, char *buf); -extern void printbig(char *buf); -extern void prhex(const char *msg, uchar *buf, uint len); - -/* IE parsing */ -//extern bcm_tlv_t *BCMROMFN(bcm_next_tlv)(bcm_tlv_t *elt, int *buflen); -//extern bcm_tlv_t *BCMROMFN(bcm_parse_tlvs)(void *buf, int buflen, uint key); -//extern bcm_tlv_t *BCMROMFN(bcm_parse_ordered_tlvs)(void *buf, int buflen, uint key); - -/* bcmerror */ -extern const char *bcmerrorstr(int bcmerror); - -/* multi-bool data type: set of bools, mbool is true if any is set */ -typedef uint32 mbool; -#define mboolset(mb, bit) ((mb) |= (bit)) /* set one bool */ -#define mboolclr(mb, bit) ((mb) &= ~(bit)) /* clear one bool */ -#define mboolisset(mb, bit) (((mb) & (bit)) != 0) /* TRUE if one bool is set */ -#define mboolmaskset(mb, mask, val) ((mb) = (((mb) & ~(mask)) | (val))) - -/* power conversion */ -//extern uint16 BCMROMFN(bcm_qdbm_to_mw)(uint8 qdbm); -//extern uint8 BCMROMFN(bcm_mw_to_qdbm)(uint16 mw); - -/* generic datastruct to help dump routines */ -struct fielddesc { - const char *nameandfmt; - uint32 offset; - uint32 len; -}; - -extern void bcm_binit(struct bcmstrbuf *b, char *buf, uint size); -extern int bcm_bprintf(struct bcmstrbuf *b, const char *fmt, ...); -extern void bcm_inc_bytes(uchar *num, int num_bytes, uint8 amount); -extern int bcm_cmp_bytes(uchar *arg1, uchar *arg2, uint8 nbytes); -extern void bcm_print_bytes(char *name, const uchar *cdata, int len); - -typedef uint32 (*bcmutl_rdreg_rtn)(void *arg0, uint arg1, uint32 offset); -extern uint bcmdumpfields(bcmutl_rdreg_rtn func_ptr, void *arg0, uint arg1, struct fielddesc *str, - char *buf, uint32 bufsize); - -extern uint bcm_mkiovar(char *name, char *data, uint datalen, char *buf, uint len); -//extern uint BCMROMFN(bcm_bitcount)(uint8 *bitmap, uint bytelength); - -#ifdef BCMDBG_PKT /* pkt logging for debugging */ -#define PKTLIST_SIZE 2000 - -typedef struct pkt_dbginfo { - int line; - char *file; - void *pkt; -} pkt_dbginfo_t; - -typedef struct { - pkt_dbginfo_t list[PKTLIST_SIZE]; /* List of pointers to packets */ - uint count; /* Total count of the packets */ -} pktlist_info_t; - -extern void pktlist_add(pktlist_info_t *pktlist, void *p, int len, char *file); -extern void pktlist_remove(pktlist_info_t *pktlist, void *p); -extern char* pktlist_dump(osl_t *osh, pktlist_info_t *pktlist, char *buf); -#endif /* BCMDBG_PKT */ - -/* - * buffer length needed for wlc_format_ssid - * 32 SSID chars, max of 4 chars for each SSID char "\xFF", plus NULL. - */ -#define SSID_FMT_BUF_LEN ((4 * DOT11_MAX_SSID_LEN) + 1) - -unsigned int process_nvram_vars(char *varbuf, unsigned int len); - -#ifdef __cplusplus - } -#endif - -#endif /* _bcmutils_h_ */ diff --git a/components/WWD/WWD/include/debug/wwd_assert.h b/components/WWD/WWD/include/debug/wwd_assert.h deleted file mode 100644 index 1159af66059bef308c14ccbd744c221f16f27511..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/debug/wwd_assert.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Defines macro for assertions - * - */ -#pragma once - -#include "wwd_debug.h" -#include "platform_assert.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/****************************************************** - * @cond Macros - ******************************************************/ - -#ifdef DEBUG - #ifdef WPRINT_ENABLE_ERROR - #define WPRINT_ERROR(args) do { WPRINT_MACRO(args); WICED_ASSERTION_FAIL_ACTION(); } while(0) - #define wiced_assert( error_string, assertion ) do { if (!(assertion)) { WICED_ASSERTION_FAIL_ACTION(); } } while(0) - #define wiced_minor_assert( error_string, assertion ) do { if ( !(assertion) ) WPRINT_MACRO( error_string ); } while(0) - #else - #define WPRINT_ERROR(args) do { WICED_ASSERTION_FAIL_ACTION();} while(0) - #define wiced_assert( error_string, assertion ) do { if (!(assertion)) { WICED_ASSERTION_FAIL_ACTION();} } while(0) - #define wiced_minor_assert( error_string, assertion ) do { (void)(assertion); } while(0) - #endif -#else - #define wiced_assert( error_string, assertion ) do { (void)(assertion); } while(0) - #define wiced_minor_assert( error_string, assertion ) do { (void)(assertion); } while(0) -#endif - -#ifdef __GNUC__ -#define WICED_UNUSED_VAR __attribute__ ((unused)) -#else -#define WICED_UNUSED_VAR -#endif - -#define wiced_static_assert( descr, expr ) \ -{ \ - /* Make sure the expression is constant. */ \ - typedef enum { _STATIC_ASSERT_NOT_CONSTANT = (expr) } _static_assert_e WICED_UNUSED_VAR; \ - /* Make sure the expression is true. */ \ - typedef char STATIC_ASSERT_FAIL_##descr[(expr) ? 1 : -1] WICED_UNUSED_VAR; \ -} - -/** @endcond */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif diff --git a/components/WWD/WWD/include/debug/wwd_debug.h b/components/WWD/WWD/include/debug/wwd_debug.h deleted file mode 100644 index 6fafb8aee23ec420642ac600418c3c47b73e856f..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/debug/wwd_debug.h +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -#ifndef INCLUDED_WWD_DEBUG_H -#define INCLUDED_WWD_DEBUG_H - -#include "wiced_defaults.h" -#include - -#ifdef __cplusplus -extern "C" -{ -#endif -#define WICED_ASSERTION_FAIL_ACTION() printf("\r\nassert failed\r\n") -/****************************************************** - * Macros - ******************************************************/ - -#ifdef DEBUG -#include "platform_assert.h" - #define WICED_BREAK_IF_DEBUG( ) WICED_ASSERTION_FAIL_ACTION() -#else - #define WICED_BREAK_IF_DEBUG( ) -#endif - -#ifdef WPRINT_PLATFORM_PERMISSION -int platform_wprint_permission(void); -#define WPRINT_PLATFORM_PERMISSION_FUNC() platform_wprint_permission() -#else -#define WPRINT_PLATFORM_PERMISSION_FUNC() 1 -#endif - -/****************************************************** - * Print declarations - ******************************************************/ - -#define WPRINT_MACRO(args) do {if (WPRINT_PLATFORM_PERMISSION_FUNC()) printf args;} while(0==1) - -/* WICED printing macros for general SDK/Library functions*/ -#ifdef WPRINT_ENABLE_LIB_INFO - #define WPRINT_LIB_INFO(args) WPRINT_MACRO(args) -#else - #define WPRINT_LIB_INFO(args) -#endif -#ifdef WPRINT_ENABLE_LIB_DEBUG - #define WPRINT_LIB_DEBUG(args) WPRINT_MACRO(args) -#else - #define WPRINT_LIB_DEBUG(args) -#endif -#ifdef WPRINT_ENABLE_LIB_ERROR - #define WPRINT_LIB_ERROR(args) { WPRINT_MACRO(args); WICED_BREAK_IF_DEBUG(); } -#else - #define WPRINT_LIB_ERROR(args) { WICED_BREAK_IF_DEBUG(); } -#endif - -/* WICED printing macros for the Webserver*/ -#ifdef WPRINT_ENABLE_WEBSERVER_INFO - #define WPRINT_WEBSERVER_INFO(args) WPRINT_MACRO(args) -#else - #define WPRINT_WEBSERVER_INFO(args) -#endif -#ifdef WPRINT_ENABLE_WEBSERVER_DEBUG - #define WPRINT_WEBSERVER_DEBUG(args) WPRINT_MACRO(args) -#else - #define WPRINT_WEBSERVER_DEBUG(args) -#endif -#ifdef WPRINT_ENABLE_WEBSERVER_ERROR - #define WPRINT_WEBSERVER_ERROR(args) { WPRINT_MACRO(args); WICED_BREAK_IF_DEBUG(); } -#else - #define WPRINT_WEBSERVER_ERROR(args) { WICED_BREAK_IF_DEBUG(); } -#endif - -/* WICED printing macros for Applications*/ -#ifdef WPRINT_ENABLE_APP_INFO - #define WPRINT_APP_INFO(args) WPRINT_MACRO(args) -#else - #define WPRINT_APP_INFO(args) -#endif -#ifdef WPRINT_ENABLE_APP_DEBUG - #define WPRINT_APP_DEBUG(args) WPRINT_MACRO(args) -#else - #define WPRINT_APP_DEBUG(args) -#endif -#ifdef WPRINT_ENABLE_APP_ERROR - #define WPRINT_APP_ERROR(args) { WPRINT_MACRO(args); WICED_BREAK_IF_DEBUG(); } -#else - #define WPRINT_APP_ERROR(args) { WICED_BREAK_IF_DEBUG(); } -#endif - -/* WICED printing macros for Network Stacks */ -#ifdef WPRINT_ENABLE_NETWORK_INFO - #define WPRINT_NETWORK_INFO(args) WPRINT_MACRO(args) -#else - #define WPRINT_NETWORK_INFO(args) -#endif -#ifdef WPRINT_ENABLE_NETWORK_DEBUG - #define WPRINT_NETWORK_DEBUG(args) WPRINT_MACRO(args) -#else - #define WPRINT_NETWORK_DEBUG(args) -#endif -#ifdef WPRINT_ENABLE_NETWORK_ERROR - #define WPRINT_NETWORK_ERROR(args) { WPRINT_MACRO(args); WICED_BREAK_IF_DEBUG(); } -#else - #define WPRINT_NETWORK_ERROR(args) { WICED_BREAK_IF_DEBUG(); } -#endif - -/* WICED printing macros for the RTOS*/ -#ifdef WPRINT_ENABLE_RTOS_INFO - #define WPRINT_RTOS_INFO(args) WPRINT_MACRO(args) -#else - #define WPRINT_RTOS_INFO(args) -#endif -#ifdef WPRINT_ENABLE_RTOS_DEBUG - #define WPRINT_RTOS_DEBUG(args) WPRINT_MACRO(args) -#else - #define WPRINT_RTOS_DEBUG(args) -#endif -#ifdef WPRINT_ENABLE_RTOS_ERROR - #define WPRINT_RTOS_ERROR(args) { WPRINT_MACRO(args); WICED_BREAK_IF_DEBUG(); } -#else - #define WPRINT_RTOS_ERROR(args) { WICED_BREAK_IF_DEBUG(); } -#endif - -/* WICED printing macros for the Security stack*/ -#ifdef WPRINT_ENABLE_SECURITY_INFO - #define WPRINT_SECURITY_INFO(args) WPRINT_MACRO(args) -#else - #define WPRINT_SECURITY_INFO(args) -#endif -#ifdef WPRINT_ENABLE_SECURITY_DEBUG - #define WPRINT_SECURITY_DEBUG(args) WPRINT_MACRO(args) -#else - #define WPRINT_SECURITY_DEBUG(args) -#endif -#ifdef WPRINT_ENABLE_SECURITY_ERROR - #define WPRINT_SECURITY_ERROR(args) { WPRINT_MACRO(args); WICED_BREAK_IF_DEBUG(); } -#else - #define WPRINT_SECURITY_ERROR(args) { WICED_BREAK_IF_DEBUG(); } -#endif - -/* WICED printing macros for the WPS stack*/ -#ifdef WPRINT_ENABLE_WPS_INFO - #define WPS_INFO(args) WPRINT_MACRO(args) -#else - #define WPS_INFO(args) -#endif -#ifdef WPRINT_ENABLE_WPS_DEBUG - #define WPS_DEBUG(args) WPRINT_MACRO(args) -#else - #define WPS_DEBUG(args) -#endif -#ifdef WPRINT_ENABLE_WPS_ERROR - #define WPS_ERROR(args) { WPRINT_MACRO(args); WICED_BREAK_IF_DEBUG(); } -#else - #define WPS_ERROR(args) { WICED_BREAK_IF_DEBUG(); } -#endif - -/* WICED printing macros for the Supplicant stack*/ -#ifdef WPRINT_ENABLE_SUPPLICANT_INFO - #define SUPPLICANT_INFO(args) WPRINT_MACRO(args) - #else - #define SUPPLICANT_INFO(args) - #endif - #ifdef WPRINT_ENABLE_SUPPLICANT_DEBUG - #define SUPPLICANT_DEBUG(args) WPRINT_MACRO(args) - #else - #define SUPPLICANT_DEBUG(args) - #endif - #ifdef WPRINT_ENABLE_SUPPLICANT_ERROR - #define SUPPLICANT_ERROR(args) { WPRINT_MACRO(args); WICED_BREAK_IF_DEBUG(); } - #else - #define SUPPLICANT_ERROR(args) { WICED_BREAK_IF_DEBUG(); } - #endif - - -/* WICED printing macros for Platforms*/ -#ifdef WPRINT_ENABLE_PLATFORM_INFO - #define WPRINT_PLATFORM_INFO(args) WPRINT_MACRO(args) -#else - #define WPRINT_PLATFORM_INFO(args) -#endif -#ifdef WPRINT_ENABLE_PLATFORM_DEBUG - #define WPRINT_PLATFORM_DEBUG(args) WPRINT_MACRO(args) -#else - #define WPRINT_PLATFORM_DEBUG(args) -#endif -#ifdef WPRINT_ENABLE_PLATFORM_ERROR - #define WPRINT_PLATFORM_ERROR(args) { WPRINT_MACRO(args); WICED_BREAK_IF_DEBUG(); } -#else - #define WPRINT_PLATFORM_ERROR(args) { WICED_BREAK_IF_DEBUG(); } -#endif - -/* WICED printing macros for Wiced Internal functions*/ -#ifdef WPRINT_ENABLE_WICED_INFO - #define WPRINT_WICED_INFO(args) WPRINT_MACRO(args) -#else - #define WPRINT_WICED_INFO(args) -#endif -#ifdef WPRINT_ENABLE_WICED_DEBUG - #define WPRINT_WICED_DEBUG(args) WPRINT_MACRO(args) -#else - #define WPRINT_WICED_DEBUG(args) -#endif -#ifdef WPRINT_ENABLE_WICED_ERROR - #define WPRINT_WICED_ERROR(args) { WPRINT_MACRO(args); WICED_BREAK_IF_DEBUG(); } -#else - #define WPRINT_WICED_ERROR(args) { WICED_BREAK_IF_DEBUG(); } -#endif - - - -/* WICED printing macros for Wiced Wi-Fi Driver*/ -#ifdef WPRINT_ENABLE_WWD_INFO - #define WPRINT_WWD_INFO(args) WPRINT_MACRO(args) -#else - #define WPRINT_WWD_INFO(args) -#endif -#ifdef WPRINT_ENABLE_WWD_DEBUG - #define WPRINT_WWD_DEBUG(args) WPRINT_MACRO(args) -#else - #define WPRINT_WWD_DEBUG(args) -#endif -#ifdef WPRINT_ENABLE_WWD_ERROR - #define WPRINT_WWD_ERROR(args) { WPRINT_MACRO(args); WICED_BREAK_IF_DEBUG(); } -#else - #define WPRINT_WWD_ERROR(args) { WICED_BREAK_IF_DEBUG(); } -#endif - - -#ifdef __cplusplus -} /* extern "C" */ -#endif -#endif /* ifndef INCLUDED_WWD_DEBUG_H */ diff --git a/components/WWD/WWD/include/network/wwd_buffer_interface.h b/components/WWD/WWD/include/network/wwd_buffer_interface.h deleted file mode 100644 index 3aa6e3c4b9998661eb038fc2fc82c2199c803219..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/network/wwd_buffer_interface.h +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Defines the WICED Buffer Interface. - * - * Provides prototypes for functions that allow WICED to use packet - * buffers in an abstract way. - * - */ - -#ifndef INCLUDED_WWD_BUFFER_INTERFACE_H_ -#define INCLUDED_WWD_BUFFER_INTERFACE_H_ - -#include "wwd_buffer.h" -#include "wwd_constants.h" -#include "wwd_bus_protocol.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/****************************************************** - * @cond Constants - ******************************************************/ - -typedef enum -{ - WWD_NETWORK_TX, - WWD_NETWORK_RX -} wwd_buffer_dir_t; - - -typedef wiced_buffer_t wwd_buffer_queue_ptr_t; - -#pragma pack(1) - -typedef struct -{ - /*@owned@*/ wwd_buffer_queue_ptr_t queue_next; -#ifdef WWD_BUS_HAS_HEADER - wwd_bus_header_t bus_header; -#endif /* ifdef WWD_BUS_HAS_HEADER */ -} wwd_buffer_header_t; - -#pragma pack() - -/** @endcond */ - -/** @addtogroup buffif Buffer Interface - * Allows WICED to use packet buffers in an abstract way. - * @{ - */ - -/****************************************************** - * Function declarations - ******************************************************/ - -/** - * Initialize the packet buffer interface - * - * Implemented in the WICED buffer interface which is specific to the - * buffering scheme in use. - * Some implementations of the packet buffer interface may need additional - * information for initialization, especially the location of packet buffer - * pool(s). These can be passed via the 'native_arg' parameter. - * - * @param native_arg An implementation specific argument - * - * @return WWD_SUCCESS = Success, Error code = Failure - */ - -extern wwd_result_t wwd_buffer_init( /*@null@*/ void* native_arg ); - -/** - * Deinitialize the packet buffer interface - * - * Implemented in the WICED buffer interface which is specific to the - * buffering scheme in use. - * - * @return WWD_SUCCESS = Success, Error code = Failure - */ - -extern wwd_result_t wwd_buffer_deinit( void ); - -/** - * @brief Allocates a packet buffer - * - * Implemented in the WICED buffer interface which is specific to the - * buffering scheme in use. - * Attempts to allocate a packet buffer of the size requested. It can do this - * by allocating a pre-existing packet from a pool, using a static buffer, - * or by dynamically allocating memory. The method of allocation does not - * concern WICED, however it must match the way the network stack expects packet - * buffers to be allocated. - * - * @param buffer A pointer which receives the allocated packet buffer handle - * @param direction : Indicates transmit/receive direction that the packet buffer is - * used for. This may be needed if tx/rx pools are separate. - * @param size : The number of bytes to allocate. - * @param timeout_ms : Maximum period to block for. Can be passed NEVER_TIMEOUT to request no timeout - * - * @return WWD_SUCCESS = Success, Error code = Failure - * - */ - -extern wwd_result_t internal_host_buffer_get( /*@special@*/ /*@out@*/ wiced_buffer_t* buffer, wwd_buffer_dir_t direction, unsigned short size, unsigned long timeout_ms ) /*@allocates *buffer@*/ /*@defines **buffer@*/; - -/** - * @brief Allocates a packet buffer - * - * Implemented in the WICED buffer interface which is specific to the - * buffering scheme in use. - * Attempts to allocate a packet buffer of the size requested. It can do this - * by allocating a pre-existing packet from a pool, using a static buffer, - * or by dynamically allocating memory. The method of allocation does not - * concern WICED, however it must match the way the network stack expects packet - * buffers to be allocated. - * - * @param buffer A pointer which receives the allocated packet buffer handle - * @param direction : Indicates transmit/receive direction that the packet buffer is - * used for. This may be needed if tx/rx pools are separate. - * @param size : The number of bytes to allocate. - * @param wait : Whether to wait for a packet buffer to be available - * - * @return WWD_SUCCESS = Success, Error code = Failure - * - */ - -extern wwd_result_t host_buffer_get( /*@special@*/ /*@out@*/ wiced_buffer_t* buffer, wwd_buffer_dir_t direction, unsigned short size, wiced_bool_t wait ) /*@allocates *buffer@*/ /*@defines **buffer@*/; - -/** - * Releases a packet buffer - * - * Implemented in the Wiced buffer interface, which will be specific to the - * buffering scheme in use. - * This function is used by WICED to indicate that it no longer requires - * a packet buffer. The buffer can then be released back into a pool for - * reuse, or the dynamically allocated memory can be freed, according to - * how the packet was allocated. - * Returns void since WICED cannot do anything about failures - * - * @param buffer : the handle of the packet buffer to be released - * @param direction : indicates transmit/receive direction that the packet buffer has - * been used for. This might be needed if tx/rx pools are separate. - * - */ -extern void host_buffer_release( /*@only@*/ wiced_buffer_t buffer, wwd_buffer_dir_t direction ); - -/** - * Retrieves the current pointer of a packet buffer - * - * Implemented in the WICED buffer interface which is specific to the - * buffering scheme in use. - * Since packet buffers usually need to be created with space at the - * front for additional headers, this function allows WICED to get - * the current 'front' location pointer. - * - * @param buffer : The handle of the packet buffer whose pointer is to be retrieved - * - * @return The packet buffer's current pointer. - */ -extern /*@exposed@*/ uint8_t* host_buffer_get_current_piece_data_pointer( /*@temp@*/ wiced_buffer_t buffer ); - -/** - * Retrieves the size of a packet buffer - * - * Implemented in the WICED buffer interface which is specific to the - * buffering scheme in use. - * Since packet buffers usually need to be created with space at the - * front for additional headers, the memory block used to contain a packet buffer - * will often be larger than the current size of the packet buffer data. - * This function allows WICED to retrieve the current size of a packet buffer's data. - * - * @param buffer : The handle of the packet buffer whose size is to be retrieved - * - * @return The size of the packet buffer. - */ -extern uint16_t host_buffer_get_current_piece_size( /*@temp@*/ wiced_buffer_t buffer ); - -/** - * Sets the current size of a Wiced packet - * - * Implemented in the WICED buffer interface which is specific to the - * buffering scheme in use. - * This function sets the current length of a WICED packet buffer - * - * @param buffer : The packet to be modified - * @param size : The new size of the packet buffer - * - * @return WWD_SUCCESS = Success, Error code = Failure - */ -extern wwd_result_t host_buffer_set_size( /*@temp@*/ wiced_buffer_t buffer, unsigned short size ); - -/** - * Retrieves the next piece of a set of daisy chained packet buffers - * - * Implemented in the WICED buffer interface which is specific to the - * buffering scheme in use. - * Some buffering schemes allow buffers to be daisy chained into linked lists. - * This allows more flexibility with packet buffers and avoids memory copies. - * It does however require scatter-gather DMA for the hardware bus. - * This function retrieves the next buffer in a daisy chain of packet buffers. - * - * @param buffer : The handle of the packet buffer whose next buffer is to be retrieved - * - * @return The handle of the next buffer, or NULL if there is none. - */ -extern /*@exposed@*/ /*@dependent@*/ /*@null@*/ wiced_buffer_t host_buffer_get_next_piece( /*@dependent@*/ wiced_buffer_t buffer ); - -/** - * Moves the current pointer of a packet buffer - * - * Implemented in the WICED buffer interface which is specific to the - * buffering scheme in use. - * Since packet buffers usually need to be created with space at the - * front for additional headers, this function allows WICED to move - * the current 'front' location pointer so that it has space to add headers - * to transmit packets, and so that the network stack does not see the - * internal WICED headers on received packets. - * - * @param buffer : A pointer to the handle of the current packet buffer - * for which the current pointer will be moved. On return - * this may contain a pointer to a newly allocated packet - * buffer which has been daisy chained to the front of the - * given one. This would be the case if the given packet buffer - * didn't have enough space at the front. - * @param add_remove_amount : This is the number of bytes to move the current pointer - * of the packet buffer - a negative value increases the space - * for headers at the front of the packet, a positive value - * decreases the space. - * @return WWD_SUCCESS = Success, Error code = Failure - */ -extern wwd_result_t host_buffer_add_remove_at_front( wiced_buffer_t* buffer, int32_t add_remove_amount ); /* Adds or removes buffer parts as needed (and returns new handle) - new bytes must be contiguous with each other, but not necessarily with original bytes */ - - -/** - * Checks for buffers that have been leaked - * - * Implemented in the WICED buffer interface which is specific to the - * buffering scheme in use. - * This function must only be used when all buffers are expected to have been - * released. Function triggers an assertion if any buffers are in use. - * - * @return WWD_SUCCESS = Success, Error code = Failure - */ -extern wwd_result_t host_buffer_check_leaked( void ); - -/** - * Init fifo - * - * @param fifo : pointer to fifo structure - */ -extern void host_buffer_init_fifo( wiced_buffer_fifo_t* fifo ); - -/** - * Push buffer to tail of fifo - * - * @param fifo : pointer to fifo structure - * @param buffer : buffer to push - * @param interface : which interface buffer belong - */ -extern void host_buffer_push_to_fifo( wiced_buffer_fifo_t* fifo, wiced_buffer_t buffer, wwd_interface_t interface ); - -/** - * Pop packet from head of fifo. - * - * @param fifo - pointer to fifo structure - * @param interface - out parameter which filled with interface buffer belong - * - * @return NULL if fifo empty, otherwise return buffer and store interface in 'interface' out parameter. - */ -extern wiced_buffer_t host_buffer_pop_from_fifo( wiced_buffer_fifo_t* fifo, wwd_interface_t* interface ); - -/** - * Check whether pools are full or not (whether all packets are freed). - * - * @param direction - TX or RX pools to check - * - * @return WICED_TRUE if polls are full, otherwise WICED_FALSE. - */ -wiced_bool_t host_buffer_pool_is_full( wwd_buffer_dir_t direction ); - -wwd_result_t host_buffer_add_application_defined_pool( void* pool_in, wwd_buffer_dir_t direction ); - -int wwd_sdpcm_data_header_size(void); -void host_network_send_ethernet_data(char *buff, wwd_interface_t interface); - -/** @} */ - -#ifdef __cplusplus -} /*extern "C" */ -#endif -#endif /* ifndef INCLUDED_WWD_BUFFER_INTERFACE_H_ */ diff --git a/components/WWD/WWD/include/network/wwd_network_constants.h b/components/WWD/WWD/include/network/wwd_network_constants.h deleted file mode 100644 index 45cf67d0ac0bc237697bb2aa9b911abaa116c67c..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/network/wwd_network_constants.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Provides packet size constants which are useful for implementations of the - * network interface and buffer interface. - */ -#pragma once - - -#ifdef PLATFORM_L1_CACHE_SHIFT -#include "platform_cache_def.h" -#else -#ifndef PLATFORM_L1_CACHE_BYTES -#define PLATFORM_L1_CACHE_BYTES 0 -#endif -#ifndef PLATFORM_L1_CACHE_ROUND_UP -#define PLATFORM_L1_CACHE_ROUND_UP(a) (a) -#endif -#ifndef PLATFORM_L1_CACHE_ROUND_DOWN -#define PLATFORM_L1_CACHE_ROUND_DOWN(a) (a) -#endif -#ifndef PLATFORM_L1_CACHE_PTR_ROUND_UP -#define PLATFORM_L1_CACHE_PTR_ROUND_UP(a) (a) -#endif -#endif /* PLATFORM_L1_CACHE_SHIFT */ - -#ifndef MAX -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) -#endif /* MAX */ - -#ifdef __cplusplus -extern "C" -{ -#endif - -/****************************************************** - * @cond Constants - ******************************************************/ - -/** - * The maximum size of the wwd_buffer_header_t structure (i.e. largest bus implementation) - */ -#define MAX_BUS_HEADER_LENGTH (12) - -/** - * The maximum size of the SDPCM + BDC header, including offsets and reserved space - * 12 bytes - SDPCM header - * 2 bytes - Extra offset for SDPCM headers that come as 14 bytes - * 4 bytes - BDC header - */ -#define MAX_SDPCM_HEADER_LENGTH (18) - -/** - * The maximum space in bytes required for headers in front of the Ethernet header. - * This definition allows WICED to use a pre-built bus-generic network stack library regardless of choice of bus. - * Note: adjust accordingly if a new bus is added. - */ -#define WICED_LINK_OVERHEAD_BELOW_ETHERNET_FRAME_MAX ( MAX_BUS_HEADER_LENGTH + MAX_SDPCM_HEADER_LENGTH ) - -/** - * The space in bytes required after the end of an Ethernet packet - */ -#define WICED_LINK_TAIL_AFTER_ETHERNET_FRAME ( 0 ) - -/** - * The size of an Ethernet header - */ -#define WICED_ETHERNET_SIZE (14) - -/** - * The size in bytes of the Link layer header i.e. the Wiced specific headers and the Ethernet header - */ -#define WICED_PHYSICAL_HEADER (WICED_LINK_OVERHEAD_BELOW_ETHERNET_FRAME_MAX + WICED_ETHERNET_SIZE) - -/** - * The size in bytes of the data after Link layer packet - */ -#define WICED_PHYSICAL_TRAILER (WICED_LINK_TAIL_AFTER_ETHERNET_FRAME) - -/** - * The maximum size in bytes of the data part of an Ethernet frame - */ -#ifndef WICED_PAYLOAD_MTU -#define WICED_PAYLOAD_MTU (1500) -#endif - -/** - * The maximum size in bytes of a packet used within Wiced - */ -#define WICED_WIFI_BUFFER_SIZE (WICED_PAYLOAD_MTU + WICED_PHYSICAL_HEADER + WICED_PHYSICAL_TRAILER) - -#ifndef WICED_ETHERNET_BUFFER_SIZE -#define WICED_ETHERNET_BUFFER_SIZE 0 -#endif - -#define WICED_LINK_MTU MAX( WICED_WIFI_BUFFER_SIZE, WICED_ETHERNET_BUFFER_SIZE ) -#define WICED_LINK_MTU_ALIGNED PLATFORM_L1_CACHE_ROUND_UP(WICED_LINK_MTU) - -/** - * Ethernet Ethertypes - */ -#define WICED_ETHERTYPE_IPv4 0x0800 -#define WICED_ETHERTYPE_IPv6 0x86DD -#define WICED_ETHERTYPE_ARP 0x0806 -#define WICED_ETHERTYPE_RARP 0x8035 -#define WICED_ETHERTYPE_EAPOL 0x888E -#define WICED_ETHERTYPE_DOT1AS 0x88F7 -#define WICED_ETHERTYPE_8021Q 0x8100 - -/** @endcond */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif diff --git a/components/WWD/WWD/include/network/wwd_network_interface.h b/components/WWD/WWD/include/network/wwd_network_interface.h deleted file mode 100644 index 44f8e2cfca24e9774f1247adb81ffcd65d3a052b..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/network/wwd_network_interface.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Defines the WICED Network Interface. - * - * Provides prototypes for functions that allow WICED to communicate - * with a network stack in an abstract way. - */ - -#ifndef HEADER_WWD_NETWORK_INTERFACE_H_INCLUDED -#define HEADER_WWD_NETWORK_INTERFACE_H_INCLUDED - -#include "wwd_buffer.h" -#include "wwd_constants.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - - -/* @addtogroup netif Network Interface - * Allows WICED to communicate with a network stack in an abstract way. - * @{ - */ - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Function declarations - ******************************************************/ - -/* - * Called by WICED to pass received data to the network stack - * - * Implemented in 'network adapter driver' which is specific to the - * network stack in use. - * Packets received from the Wi-Fi network by WICED are forwarded to this function which - * must be implemented in the network interface. Ethernet headers - * are present at the start of these packet buffers. - * - * This function is called asynchronously in the context of the - * WICED thread whenever new data has arrived. - * Packet buffers are allocated within WICED, and ownership is transferred - * to the network stack. The network stack or application is thus - * responsible for releasing the packet buffers. - * Most packet buffering systems have a pointer to the 'current point' within - * the packet buffer. When this function is called, the pointer points - * to the start of the Ethernet header. There is other inconsequential data - * before the Ethernet header. - * - * It is preferable that the @ref host_network_process_ethernet_data function simply puts - * the received packet on a queue for processing by another thread. This avoids the - * WICED thread being unnecessarily tied up which would delay other packets - * being transmitted or received. - * - * @param buffer : Handle of the packet which has just been received. Responsibility for - * releasing this buffer is transferred from WICED at this point. - * @param interface : The interface (AP or STA) on which the packet was received. - * - */ -/*@external@*/ extern void host_network_process_ethernet_data( /*@only@*/ wiced_buffer_t buffer, wwd_interface_t interface ); /* Network stack assumes responsibility for freeing buffer */ - -/* Functions provided by WICED that may be called by Network Stack */ - -/* - * Called by the Network Stack to send an ethernet frame - * - * Implemented in 'network adapter driver' which is specific to the - * network stack in use. - * This function takes Ethernet data from the network stack and queues it for transmission over the wireless network. - * The function can be called from any thread context as it is thread safe, however - * it must not be called from interrupt context since it can block while waiting - * for a lock on the transmit queue. - * - * This function returns immediately after the packet has been queued for transmit, - * NOT after it has been transmitted. Packet buffers passed to the WICED core - * are released inside the WICED core once they have been transmitted. - * - * Some network stacks assume the driver send function blocks until the packet has been physically sent. This - * type of stack typically releases the packet buffer immediately after the driver send function returns. - * In this case, and assuming the buffering system can count references to packet buffers, the driver send function - * can take an additional reference to the packet buffer. This enables the network stack and the WICED core driver - * to independently release their own packet buffer references. - * - * @param buffer : Handle of the packet buffer to be sent. - * @param interface : the interface over which to send the packet (AP or STA) - * - */ -extern void wwd_network_send_ethernet_data( /*@only@*/ wiced_buffer_t buffer, wwd_interface_t interface ); /* Returns immediately - Wiced_buffer_tx_completed will be called once the transmission has finished */ - -/* @} */ - - -#ifdef __cplusplus -} /* extern "C" */ -#endif -#endif /* ifndef HEADER_WWD_NETWORK_INTERFACE_H_INCLUDED */ diff --git a/components/WWD/WWD/include/platform/wwd_bus_interface.h b/components/WWD/WWD/include/platform/wwd_bus_interface.h deleted file mode 100644 index 6e8edfe264726afa7bb6439928e5cbaac0368a22..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/platform/wwd_bus_interface.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#pragma once - -/** @file - * Defines the Bus part of the WICED Platform Interface. - * - * Provides prototypes for functions that allow WICED to start and stop - * the hardware communications bus for a platform. - */ - -#include "network/wwd_buffer_interface.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/** @addtogroup platif Platform Interface - * @{ - */ - -/** @name Bus Functions - * Functions that enable WICED to start and stop - * the hardware communications bus for a paritcular platform. - */ -/**@{*/ - -/****************************************************** - * Function declarations - ******************************************************/ - -/** - * Initializes the WICED Bus - * - * Implemented in the WICED Platform interface which is specific to the - * platform in use. - * This function should set the bus GPIO pins to the correct modes, set up - * the interrupts for the WICED bus, enable power and clocks to the bus, and - * set up the bus peripheral. - * - * @return WWD_SUCCESS or Error code - */ -extern wwd_result_t host_platform_bus_init( void ); - -/** - * De-Initializes the WICED Bus - * - * Implemented in the WICED Platform interface which is specific to the - * platform in use. - * This function does the reverse of @ref host_platform_bus_init - * - * @return WWD_SUCCESS or Error code - */ -extern wwd_result_t host_platform_bus_deinit( void ); - - -/** - * Informs WWD of an interrupt - * - * This function should be called from the SDIO/SPI interrupt function - * and usually indicates newly received data is available. - * It wakes the WWD Thread, forcing it to check the send/receive - * - */ -extern void wwd_thread_notify_irq( void ); - - -/** - * Enables the bus interrupt - * - * This function is called by WICED during init, once - * the system is ready to receive interrupts - */ -extern wwd_result_t host_platform_bus_enable_interrupt( void ); - -/** - * Disables the bus interrupt - * - * This function is called by WICED during de-init, to stop - * the system supplying any more interrupts in preparation - * for shutdown - */ -//extern wwd_result_t host_platform_bus_disable_interrupt( void ); - - -/** - * Informs the platform bus implementation that a buffer has been freed - * - * This function is called by WICED during buffer release to allow - * the platform to reuse the released buffer - especially where - * a DMA chain needs to be refilled. - */ -extern void host_platform_bus_buffer_freed( wwd_buffer_dir_t direction ); - -/** @} */ -/** @} */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif diff --git a/components/WWD/WWD/include/platform/wwd_platform_interface.h b/components/WWD/WWD/include/platform/wwd_platform_interface.h deleted file mode 100644 index 13523784597315b7a0bbdd359b4d57fd13fa1e7a..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/platform/wwd_platform_interface.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#pragma once - -/** @file - * Defines the Non-Bus part of the WICED Platform Interface. - * - * Provides prototypes for functions that allow WICED to use - * the hardware platform. - */ - -#include "wwd_structures.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/** @addtogroup platif Platform Interface - * Enables WICED to use the hardware platform. - * @{ - */ - -/** @name General Platform Functions - * Functions that enable WICED to use the hardware platform. - */ -/**@{*/ - -/****************************************************** - * Function declarations - ******************************************************/ - - -/** - * Switches the Reset signal to the Broadcom Wi-Fi - * - * WICED uses this function to switch the reset - * signal to the Broadcom Wi-Fi chip. It should - * toggle the appropriate GPIO pins. - * - * @param reset_asserted: WICED_TRUE = reset asserted - * WICED_FALSE = reset de-asserted - */ -/*@external@*/ extern void host_platform_reset_wifi( wiced_bool_t reset_asserted ); - -/** - * Switches the Power signal to the Broadcom Wi-Fi - * - * WICED uses this function to switch the - * power signal to the Broadcom Wi-Fi chip. It should - * toggle the appropriate GPIO pins. - * - * @param power_enabled : WICED_TRUE = power up - * WICED_FALSE = power down - */ -/*@external@*/ extern void host_platform_power_wifi( wiced_bool_t power_enabled ); - -/** - * Initialises platform for WICED - * - * Sets up parts of the hardware platform which are not - * directly part of the bus. These may include: Reset Pin - * and Regulator-On Pin. - * - * @return WWD_SUCCESS or Error code - */ -/*@external@*/ extern wwd_result_t host_platform_init( void ); - -/** - * De-Initialises platform for WICED - * - * Does the opposite to the @ref host_platform_init function, - * leaving the Broadcom Wi-Fi in a powered down, reset - * state. - * - * @return WWD_SUCCESS or Error code - */ -/*@external@*/ extern wwd_result_t host_platform_deinit( void ); - - -/** - * Disable power saving modes that would stop clocks - */ -/*@external@*/ extern void host_platform_clocks_needed( void ); - -/** - * Enable power saving modes that would stop clocks - */ -/*@external@*/ extern void host_platform_clocks_not_needed( void ); - -/** - * The host MCU can provide a MAC address to the Wi-Fi driver (rather than - * the driver using the MAC in NVRAM or OTP). To use this functionality, - * add a global define (MAC_ADDRESS_SET_BY_HOST) in the application makefile. - * Further information is available in the generated_mac_address.txt file - * that is created during the application build process. - * @param mac : A wiced_mac_t pointer to the Wi-Fi MAC address - */ -/*@external@*/ extern wwd_result_t host_platform_get_mac_address( wiced_mac_t* mac ); - -/** - * Returns Ethernet MAC address - * - * @param mac : A wiced_mac_t pointer to the Ethernet MAC address - */ -/*@external@*/ extern wwd_result_t host_platform_get_ethernet_mac_address( wiced_mac_t* mac ); - -/** - * Returns the current CPU cycle count. - * - * This function is used to accurately calculate sub-systick timing. - */ -/*@external@*/ extern uint32_t host_platform_get_cycle_count( void ); - -/** - * Returns TRUE if the CPU is currently running in interrupt context - * - */ -/*@external@*/ extern wiced_bool_t host_platform_is_in_interrupt_context( void ); - -extern wwd_result_t host_platform_init_wlan_powersave_clock( void ); - -extern wwd_result_t host_platform_deinit_wlan_powersave_clock( void ); - -/** @} */ -/** @} */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif diff --git a/components/WWD/WWD/include/platform/wwd_resource_interface.h b/components/WWD/WWD/include/platform/wwd_resource_interface.h deleted file mode 100644 index 450967dd15fe1b8cc0487e07016630d4554e523b..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/platform/wwd_resource_interface.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#pragma once - -#include "wwd_constants.h" -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * Enumerations - ******************************************************/ - -typedef enum -{ - WWD_RESOURCE_WLAN_FIRMWARE, - WWD_RESOURCE_WLAN_NVRAM, -} wwd_resource_t; - -/****************************************************** - * Global Variables - ******************************************************/ - -#if defined( WWD_DYNAMIC_NVRAM ) -extern uint32_t dynamic_nvram_size; -extern void* dynamic_nvram_image; -#endif - -/****************************************************** - * Function Declarations - ******************************************************/ - -extern wwd_result_t host_platform_resource_size( wwd_resource_t resource, uint32_t* size_out ); - -/* - * This function is used when WWD_DIRECT_RESOURCES is defined - */ -extern wwd_result_t host_platform_resource_read_direct( wwd_resource_t resource, const void** ptr_out ); - -/* - * This function is used when WWD_DIRECT_RESOURCES is not defined - */ -extern wwd_result_t host_platform_resource_read_indirect( wwd_resource_t resource, uint32_t offset, void* buffer, uint32_t buffer_size, uint32_t* size_out ); - -#ifdef __cplusplus -} /* extern "C" */ -#endif diff --git a/components/WWD/WWD/include/platform/wwd_sdio_interface.h b/components/WWD/WWD/include/platform/wwd_sdio_interface.h deleted file mode 100644 index 77be9ca3c35e81b845565cb0e79d2eea1f5a2d66..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/platform/wwd_sdio_interface.h +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#pragma once - -/** @file - * Defines the SDIO part of the WICED Platform Interface. - * - * Provides constants and prototypes for functions that - * enable Wiced to use an SDIO bus on a particular hardware platform. - */ - -#include -#include "wwd_constants.h" -#include "wwd_buffer.h" - - -#ifdef __cplusplus -extern "C" -{ -#endif - -/****************************************************** - * @cond Constants - ******************************************************/ - -/* - * SDIO specific constants - */ -typedef enum -{ - SDIO_CMD_0 = 0, - SDIO_CMD_3 = 3, - SDIO_CMD_5 = 5, - SDIO_CMD_7 = 7, - SDIO_CMD_52 = 52, - SDIO_CMD_53 = 53, - __MAX_VAL = 64 -} sdio_command_t; - -typedef enum -{ - SDIO_BLOCK_MODE = ( 0 << 2 ), /* These are STM32 implementation specific */ - SDIO_BYTE_MODE = ( 1 << 2 ) /* These are STM32 implementation specific */ -} sdio_transfer_mode_t; - -typedef enum -{ - SDIO_1B_BLOCK = 1, - SDIO_2B_BLOCK = 2, - SDIO_4B_BLOCK = 4, - SDIO_8B_BLOCK = 8, - SDIO_16B_BLOCK = 16, - SDIO_32B_BLOCK = 32, - SDIO_64B_BLOCK = 64, - SDIO_128B_BLOCK = 128, - SDIO_256B_BLOCK = 256, - SDIO_512B_BLOCK = 512, - SDIO_1024B_BLOCK = 1024, - SDIO_2048B_BLOCK = 2048 -} sdio_block_size_t; - - -typedef enum -{ - RESPONSE_NEEDED, - NO_RESPONSE -} sdio_response_needed_t; - - - -/****************************************************** - * Global declarations - ******************************************************/ - - -/****************************************************** - * Structures - ******************************************************/ - -/** @endcond */ - -/** @addtogroup platif Platform Interface - * @{ - */ - -/** @name SDIO Bus Functions - * Functions that enable WICED to use an SDIO bus - * on a particular hardware platform. - */ -/**@{*/ - - -/****************************************************** - * Function declarations - ******************************************************/ - - -/** - * Transfers SDIO data - * - * Implemented in the WICED Platform interface, which is specific to the - * platform in use. - * WICED uses this function as a generic way to transfer data - * across an SDIO bus. - * Please refer to the SDIO specification. - * - * @param direction : Direction of transfer - Write = to Wi-Fi device, - * Read = from Wi-Fi device - * @param command : The SDIO command number - * @param mode : Indicates whether transfer will be byte mode or block mode - * @param block_size : The block size to use (if using block mode transfer) - * @param argument : The argument of the particular SDIO command - * @param data : A pointer to the data buffer used to transmit or receive - * @param data_size : The length of the data buffer - * @param response_expected : Indicates if a response is expected - RESPONSE_NEEDED = Yes - * NO_RESPONSE = No - * @param response : A pointer to a variable which will receive the SDIO response. - * Can be null if the caller does not care about the response value. - * - * @return WWD_SUCCESS if successful, otherwise an error code - */ -extern wwd_result_t host_platform_sdio_transfer( wwd_bus_transfer_direction_t direction, sdio_command_t command, sdio_transfer_mode_t mode, sdio_block_size_t block_size, uint32_t argument, /*@null@*/ uint32_t* data, uint16_t data_size, sdio_response_needed_t response_expected, /*@out@*/ /*@null@*/ uint32_t* response ); - - -/** - * Performs SDIO enumeration - * - * This needs to be called if the WLAN chip is reset - * - */ -extern wwd_result_t host_platform_sdio_enumerate( void); - -/** - * Switch SDIO bus to high speed mode - * - * When SDIO starts, it must be in a low speed mode - * This function switches it to high speed mode (up to 50MHz) - * - */ -extern void host_platform_enable_high_speed_sdio( void ); - -/** - * SDIO interrupt handler - * - * This function is implemented by Wiced and must be called - * from the interrupt vector - * - */ -extern void sdio_irq( void ); - - -/** - * Unmasks the bus interrupt - * - * This function is called by WICED to unmask the bus interrupt - * on host platforms that must mask off the bus interrupt to - * allow processing of the existing interrupt. - */ -extern wwd_result_t host_platform_unmask_sdio_interrupt( void ); - - -#ifndef WICED_DISABLE_MCU_POWERSAVE - -/** - * SDIO Out-of-band interrupt handler - * - * This function should enable the detection of an external interrupt - * from the GPIO0 pin of the WLAN chip. - * - */ -extern wwd_result_t host_enable_oob_interrupt( void ); - -/** - * Get OOB interrupt pin (WLAN GPIO0 or GPIO1) - */ -extern uint8_t host_platform_get_oob_interrupt_pin( void ); - -#endif /* ifndef WICED_DISABLE_MCU_POWERSAVE */ -/** @} */ -/** @} */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif diff --git a/components/WWD/WWD/include/platform/wwd_spi_interface.h b/components/WWD/WWD/include/platform/wwd_spi_interface.h deleted file mode 100644 index 00a4d8aaafea1ac67388d3c5fed2ead7bd9202cb..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/platform/wwd_spi_interface.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#pragma once - -/** @file - * Defines the SPI part of the WICED Platform Interface. - * - * Provides constants and prototypes for functions that - * enable WICED to use a SPI bus on a particular hardware platform. - */ - -#include -#include "wiced_utilities.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/** @addtogroup platif Platform Interface - * @{ - */ - -/** @name SPI Bus Functions - * Functions that enable WICED to use a SPI bus - * on a particular hardware platform. - */ -/**@{*/ - -/****************************************************** - * Function declarations - ******************************************************/ - - -/** - * Transfers SPI data - * - * Implemented in the WICED platform interface, which is specific to the - * platform in use. - * WICED uses this function as a generic way to transfer data - * across a SPI bus. - * - * @param dir : Direction of transfer - Write = To Wi-Fi device, - * Read = from Wi-Fi device - * @param buffer : Pointer to data buffer where either data to send is - * stored, or where received data is to be stored - * @param buffer_length : Length of the data buffer provided - * - */ -extern wwd_result_t host_platform_spi_transfer( wwd_bus_transfer_direction_t dir, uint8_t* buffer, uint16_t buffer_length ); - - -/** - * SPI interrupt handler - * - * This function is implemented by Wiced and must be called - * from the SPI interrupt vector - * - */ -extern void exti_irq( void ); - -/** @} */ -/** @} */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif diff --git a/components/WWD/WWD/include/typedefs.h b/components/WWD/WWD/include/typedefs.h deleted file mode 100644 index afba12983fcd7673e167156a051ae5c4368dae14..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/typedefs.h +++ /dev/null @@ -1,432 +0,0 @@ -/* - * $Copyright Open Broadcom Corporation$ - * $Id: typedefs.h,v 1.103.2.1 2010-05-11 18:19:28 vvijay Exp $ - */ - -#ifndef _TYPEDEFS_H_ -#define _TYPEDEFS_H_ - -#ifdef SITE_TYPEDEFS - -/* - * Define SITE_TYPEDEFS in the compile to include a site-specific - * typedef file "site_typedefs.h". - * - * If SITE_TYPEDEFS is not defined, then the code section below makes - * inferences about the compile environment based on defined symbols and - * possibly compiler pragmas. - * - * Following these two sections is the Default Typedefs section. - * This section is only processed if USE_TYPEDEF_DEFAULTS is - * defined. This section has a default set of typedefs and a few - * preprocessor symbols (TRUE, FALSE, NULL, ...). - */ - -#include "site_typedefs.h" - -#else - -/* - * Infer the compile environment based on preprocessor symbols and pragmas. - * Override type definitions as needed, and include configuration-dependent - * header files to define types. - */ - -#ifdef __cplusplus - -#define TYPEDEF_BOOL -#ifndef FALSE -#define FALSE false -#endif -#ifndef TRUE -#define TRUE true -#endif - -#else /* ! __cplusplus */ - -#if defined(_WIN32) - -#define TYPEDEF_BOOL -typedef unsigned char bool; /* consistent w/BOOL */ - -#endif /* _WIN32 */ - -#endif /* ! __cplusplus */ - -#if defined(_WIN64) && !defined(EFI) -/* use the Windows ULONG_PTR type when compiling for 64 bit */ -#include -#define TYPEDEF_UINTPTR -typedef ULONG_PTR uintptr; -#elif defined(__x86_64__) -#define TYPEDEF_UINTPTR -typedef unsigned long long int uintptr; -#endif - -#if defined(_HNDRTE_) && !defined(_HNDRTE_SIM_) -#define _NEED_SIZE_T_ -#endif - -#if defined(_MINOSL_) -#define _NEED_SIZE_T_ -#endif - -#if defined(EFI) && !defined(_WIN64) -#define _NEED_SIZE_T_ -#endif - -#if defined(TARGETOS_nucleus) -/* for 'size_t' type */ -#include - -/* float_t types conflict with the same typedefs from the standard ANSI-C -** math.h header file. Don't re-typedef them here. -*/ -#define TYPEDEF_FLOAT_T -#endif /* TARGETOS_nucleus */ - -#if defined(_NEED_SIZE_T_) -typedef long unsigned int size_t; -#endif - - -#ifdef _MSC_VER /* Microsoft C */ -#define TYPEDEF_INT64 -#define TYPEDEF_UINT64 -typedef signed __int64 int64; -typedef unsigned __int64 uint64; -#endif - -#if defined(MACOSX) -#define TYPEDEF_BOOL -#endif - -#if defined(__NetBSD__) -#define TYPEDEF_ULONG -#endif - -#if defined(__sparc__) -#define TYPEDEF_ULONG -#endif - -#if defined(vxworks) -#define TYPEDEF_USHORT -typedef unsigned int socklen_t; -#endif - -#ifdef linux -/* - * If this is either a Linux hybrid build or the per-port code of a hybrid build - * then use the Linux header files to get some of the typedefs. Otherwise, define - * them entirely in this file. We can't always define the types because we get - * a duplicate typedef error; there is no way to "undefine" a typedef. - * We know when it's per-port code because each file defines LINUX_PORT at the top. - */ -#if !defined(LINUX_HYBRID) || defined(LINUX_PORT) -#define TYPEDEF_UINT -#ifndef TARGETENV_android -#define TYPEDEF_USHORT -#define TYPEDEF_ULONG -#endif /* TARGETENV_android */ -#ifdef __KERNEL__ -#include -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)) -#define TYPEDEF_BOOL -#endif /* >= 2.6.19 */ -/* special detection for 2.6.18-128.7.1.0.1.el5 */ -#if (LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 18)) -#include -#ifdef noinline_for_stack -#define TYPEDEF_BOOL -#endif -#endif /* == 2.6.18 */ -#endif /* __KERNEL__ */ -#endif /* !defined(LINUX_HYBRID) || defined(LINUX_PORT) */ -#endif /* linux */ - -#if defined(__ECOS) -#define TYPEDEF_UINT -#define TYPEDEF_USHORT -#define TYPEDEF_ULONG -#define TYPEDEF_BOOL -#endif - -#if !defined(linux) && !defined(vxworks) && !defined(_WIN32) && !defined(_CFE_) && \ -!defined(_HNDRTE_) && !defined(_MINOSL_) && !defined(__DJGPP__) && \ -!defined(__IOPOS__) && !defined(__ECOS) && !defined(__BOB__) && !defined(TARGETOS_nucleus) -#define TYPEDEF_UINT -#define TYPEDEF_USHORT -#endif - -#if defined(vxworks) -/* Do not support the int64 type in VxWorks */ -#define TYPEDEF_INT64 -#endif - -/* Do not support the (u)int64 types with strict ansi for GNU C */ -#if defined(__GNUC__) && defined(__STRICT_ANSI__) -#define TYPEDEF_INT64 -#define TYPEDEF_UINT64 -#endif - -/* ICL accepts unsigned 64 bit type only, and complains in ANSI mode - * for signed or unsigned - */ -#if defined(__ICL) - -#define TYPEDEF_INT64 - -#if defined(__STDC__) -#define TYPEDEF_UINT64 -#endif - -#endif /* __ICL */ - -#if !defined(_WIN32) && !defined(_CFE_) && !defined(_HNDRTE_) && !defined(_MINOSL_) && \ - !defined(__DJGPP__) && !defined(__IOPOS__) && !defined(__BOB__) && \ - !defined(TARGETOS_nucleus) - -/* pick up ushort & uint from standard types.h */ -#if defined(linux) && defined(__KERNEL__) - -/* See note above */ -#if !defined(LINUX_HYBRID) || defined(LINUX_PORT) -#ifdef USER_MODE -#include -#else -#include /* sys/types.h and linux/types.h are oil and water */ -#endif /* USER_MODE */ -#endif /* !defined(LINUX_HYBRID) || defined(LINUX_PORT) */ - -#else - -#if defined(__ECOS) -#include -#include -#include -#endif - -//#include - -#endif /* linux && __KERNEL__ */ - -#endif /* !_WIN32 && !PMON && !_CFE_ && !_HNDRTE_ && !_MINOSL_ && !__DJGPP__ */ - -#if defined(MACOSX) - -#ifdef __BIG_ENDIAN__ -#define IL_BIGENDIAN -#else -#ifdef IL_BIGENDIAN -#error "IL_BIGENDIAN was defined for a little-endian compile" -#endif -#endif /* __BIG_ENDIAN__ */ - -#if !defined(__cplusplus) - -#if defined (__i386__) -typedef unsigned char bool; -#else -typedef unsigned int bool; -#endif -#define TYPE_BOOL 1 -enum { - false = 0, - true = 1 -}; - -#if defined(KERNEL) -#include -#endif /* KERNEL */ - -#endif /* __cplusplus */ - -#endif /* MACOSX */ - -#if defined(vxworks) -#include -#endif - -/* use the default typedefs in the next section of this file */ -#define USE_TYPEDEF_DEFAULTS - -#endif /* SITE_TYPEDEFS */ - - -/* - * Default Typedefs - */ - -#ifdef USE_TYPEDEF_DEFAULTS -#undef USE_TYPEDEF_DEFAULTS - -#ifndef TYPEDEF_BOOL -typedef /* @abstract@ */ unsigned char bool; -#endif - -/* define uchar, ushort, uint, ulong */ - -#ifndef TYPEDEF_UCHAR -typedef unsigned char uchar; -#endif - -#ifndef TYPEDEF_USHORT -typedef unsigned short ushort; -#endif - -#ifndef TYPEDEF_UINT -typedef unsigned int uint; -#endif - -#ifndef TYPEDEF_ULONG -typedef unsigned long ulong; -#endif - -/* define [u]int8/16/32/64, uintptr */ - -#ifndef TYPEDEF_UINT8 -typedef unsigned char uint8; -#endif - -#ifndef TYPEDEF_UINT16 -typedef unsigned short uint16; -#endif - -#ifndef TYPEDEF_UINT32 -typedef unsigned int uint32; -#endif - -#ifndef TYPEDEF_UINT64 -typedef unsigned long long uint64; -#endif - -#ifndef TYPEDEF_UINTPTR -typedef unsigned int uintptr; -#endif - -#ifndef TYPEDEF_INT8 -typedef signed char int8; -#endif - -#ifndef TYPEDEF_INT16 -typedef signed short int16; -#endif - -#ifndef TYPEDEF_INT32 -typedef signed int int32; -#endif - -#ifndef TYPEDEF_INT64 -typedef signed long long int64; -#endif - -/* define float32/64, float_t */ - -#ifndef TYPEDEF_FLOAT32 -typedef float float32; -#endif - -#ifndef TYPEDEF_FLOAT64 -typedef double float64; -#endif - -/* - * abstracted floating point type allows for compile time selection of - * single or double precision arithmetic. Compiling with -DFLOAT32 - * selects single precision; the default is double precision. - */ - -#ifndef TYPEDEF_FLOAT_T - -#if defined(FLOAT32) -typedef float32 float_t; -#else /* default to double precision floating point */ -typedef float64 float_t; -#endif - -#endif /* TYPEDEF_FLOAT_T */ - -/* define macro values */ - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE 1 /* TRUE */ -#endif - -#ifndef NULL -#define NULL 0 -#endif - -#ifndef OFF -#define OFF 0 -#endif - -#ifndef ON -#define ON 1 /* ON = 1 */ -#endif - -#define AUTO (-1) /* Auto = -1 */ - -/* define PTRSZ, INLINE */ - -#ifndef PTRSZ -#define PTRSZ sizeof(char*) -#endif - - -/* Detect compiler type. */ -#ifdef _MSC_VER - #define BWL_COMPILER_MICROSOFT -#elif defined(__GNUC__) - #define BWL_COMPILER_GNU -#elif defined(__CC_ARM) && __CC_ARM - #define BWL_COMPILER_ARMCC -#else - #error "Unknown compiler!" -#endif /* _MSC_VER */ - - -#ifndef INLINE - #if defined(BWL_COMPILER_MICROSOFT) - #define INLINE __inline - #elif defined(BWL_COMPILER_GNU) - #define INLINE __inline__ - #elif defined(BWL_COMPILER_ARMCC) - #define INLINE __inline - #else - #define INLINE - #endif /* _MSC_VER */ -#endif /* INLINE */ - -#undef TYPEDEF_BOOL -#undef TYPEDEF_UCHAR -#undef TYPEDEF_USHORT -#undef TYPEDEF_UINT -#undef TYPEDEF_ULONG -#undef TYPEDEF_UINT8 -#undef TYPEDEF_UINT16 -#undef TYPEDEF_UINT32 -#undef TYPEDEF_UINT64 -#undef TYPEDEF_UINTPTR -#undef TYPEDEF_INT8 -#undef TYPEDEF_INT16 -#undef TYPEDEF_INT32 -#undef TYPEDEF_INT64 -#undef TYPEDEF_FLOAT32 -#undef TYPEDEF_FLOAT64 -#undef TYPEDEF_FLOAT_T - -#endif /* USE_TYPEDEF_DEFAULTS */ - -/* Suppress unused parameter warning */ -//#define UNUSED_PARAMETER(x) (void)(x) - -/* - * Including the bcmdefs.h here, to make sure everyone including typedefs.h - * gets this automatically -*/ -//#include -#endif /* _TYPEDEFS_H_ */ diff --git a/components/WWD/WWD/include/wwd_constants.h b/components/WWD/WWD/include/wwd_constants.h deleted file mode 100644 index 2b7fc3e7eddd78996c6920e4ca7f4db7d9ed6261..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/wwd_constants.h +++ /dev/null @@ -1,929 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Defines common constants used with WICED - * - */ - -#ifndef INCLUDED_WWD_CONSTANTS_H_ -#define INCLUDED_WWD_CONSTANTS_H_ - -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - - -#ifndef MIN -extern int MIN (/*@sef@*/ int x, /*@sef@*/ int y); /* LINT : This tells lint that the parameter must be side-effect free. i.e. evaluation does not change any values (since it is being evaulated more than once */ -#define MIN(x,y) ((x) < (y) ? (x) : (y)) -#endif /* ifndef MIN */ - -#ifndef MAX -extern int MAX (/*@sef@*/ int x, /*@sef@*/ int y); /* LINT : This tells lint that the parameter must be side-effect free. i.e. evaluation does not change any values (since it is being evaulated more than once */ -#define MAX(x,y) ((x) > (y) ? (x) : (y)) -#endif /* ifndef MAX */ - -#ifndef ROUND_UP -extern int ROUND_UP (/*@sef@*/ int x, /*@sef@*/ int y); /* LINT : This tells lint that the parameter must be side-effect free. i.e. evaluation does not change any values (since it is being evaulated more than once */ -#define ROUND_UP(x,y) ((x) % (y) ? (x) + (y)-((x)%(y)) : (x)) -#endif /* ifndef ROUND_UP */ - -#ifndef DIV_ROUND_UP -extern int DIV_ROUND_UP (int m, /*@sef@*/ int n); /* LINT : This tells lint that the parameter must be side-effect free. i.e. evaluation does not change any values (since it is being evaulated more than once */ -#define DIV_ROUND_UP(m, n) (((m) + (n) - 1) / (n)) -#endif /* ifndef DIV_ROUND_UP */ - -#ifndef PLATFORM -#define PLATFORM "Unknown" -#endif /* ifndef PLATFORM */ - -#ifndef FreeRTOS_VERSION -#define FreeRTOS_VERSION "Unknown" -#endif /* ifndef FreeRTOS_VERSION */ - -#ifndef LwIP_VERSION -#define LwIP_VERSION "Unknown" -#endif /* ifndef LwIP_VERSION */ - -#ifndef WICED_VERSION -#define WICED_VERSION "Unknown" -#endif /* ifndef WICED_VERSION */ - -#define WIFI_IE_OUI_LENGTH (3) - -/** @cond !ADDTHIS*/ -#define WEP_ENABLED 0x0001 -#define TKIP_ENABLED 0x0002 -#define AES_ENABLED 0x0004 -#define SHARED_ENABLED 0x00008000 -#define WPA_SECURITY 0x00200000 -#define WPA2_SECURITY 0x00400000 -#define ENTERPRISE_ENABLED 0x02000000 -#define WPS_ENABLED 0x10000000 -#define IBSS_ENABLED 0x20000000 -/** @endcond */ - -#define DSSS_PARAMETER_SET_LENGTH (1) - -#define HT_CAPABILITIES_IE_LENGTH (26) -#define HT_OPERATION_IE_LENGTH (22) - -#define RRM_CAPABILITIES_LEN (5) -#define WL_RRM_RPT_VER 0 -#define WL_RRM_RPT_MAX_PAYLOAD 64 -#define WL_RRM_RPT_MIN_PAYLOAD 7 -#define WL_RRM_RPT_FALG_ERR 0 -#define WL_RRM_RPT_FALG_OK 1 - -/* TLV defines */ -#define TLV_TAG_OFF 0 /* tag offset */ -#define TLV_LEN_OFF 1 /* length offset */ -#define TLV_HDR_LEN 2 /* header length */ -#define TLV_BODY_OFF 2 /* body offset */ - -#define DOT11_NEIGHBOR_REP_IE_FIXED_LEN 13 -#define DOT11_MNG_NEIGHBOR_REP_ID 52 /* 11k & 11v Neighbor report id */ - -/* Bitmap definitions for cap ie */ -#define DOT11_RRM_CAP_LINK 0 -#define DOT11_RRM_CAP_NEIGHBOR_REPORT 1 -#define DOT11_RRM_CAP_PARALLEL 2 -#define DOT11_RRM_CAP_REPEATED 3 -#define DOT11_RRM_CAP_BCN_PASSIVE 4 -#define DOT11_RRM_CAP_BCN_ACTIVE 5 -#define DOT11_RRM_CAP_BCN_TABLE 6 -#define DOT11_RRM_CAP_BCN_REP_COND 7 -#define DOT11_RRM_CAP_FM 8 -#define DOT11_RRM_CAP_CLM 9 -#define DOT11_RRM_CAP_NHM 10 -#define DOT11_RRM_CAP_SM 11 -#define DOT11_RRM_CAP_LCIM 12 -#define DOT11_RRM_CAP_LCIA 13 -#define DOT11_RRM_CAP_TSCM 14 -#define DOT11_RRM_CAP_TTSCM 15 -#define DOT11_RRM_CAP_AP_CHANREP 16 -#define DOT11_RRM_CAP_RMMIB 17 -/* bit18-bit26, not used for RRM_IOVAR */ -#define DOT11_RRM_CAP_MPTI 27 -#define DOT11_RRM_CAP_NBRTSFO 28 -#define DOT11_RRM_CAP_RCPI 29 -#define DOT11_RRM_CAP_RSNI 30 -#define DOT11_RRM_CAP_BSSAAD 31 -#define DOT11_RRM_CAP_BSSAAC 32 -#define DOT11_RRM_CAP_AI 33 -#define DOT11_RRM_CAP_LAST 34 - -/** Enumeration of WICED interfaces. \n - * @note The config interface is a virtual interface that shares the softAP interface - */ -typedef enum -{ - WWD_STA_INTERFACE = 0, /**< STA or Client Interface */ - WWD_AP_INTERFACE = 1, /**< softAP Interface */ - WWD_P2P_INTERFACE = 2, /**< P2P Interface */ - WWD_ETHERNET_INTERFACE = 3, /**< Ethernet Interface */ - - WWD_INTERFACE_MAX, /** DO NOT USE - MUST BE LAST INTERFACE VALUE - used for counting interfaces */ - WWD_INTERFACE_FORCE_32_BIT = 0x7fffffff /**< Exists only to force wwd_interface_t type to 32 bits */ -} wwd_interface_t; - -/** - * Enumeration of Wi-Fi security modes - */ -typedef enum -{ - WICED_SECURITY_OPEN = 0, /**< Open security */ - WICED_SECURITY_WEP_PSK = WEP_ENABLED, /**< WEP PSK Security with open authentication */ - WICED_SECURITY_WEP_SHARED = ( WEP_ENABLED | SHARED_ENABLED ), /**< WEP PSK Security with shared authentication */ - WICED_SECURITY_WPA_TKIP_PSK = ( WPA_SECURITY | TKIP_ENABLED ), /**< WPA PSK Security with TKIP */ - WICED_SECURITY_WPA_AES_PSK = ( WPA_SECURITY | AES_ENABLED ), /**< WPA PSK Security with AES */ - WICED_SECURITY_WPA_MIXED_PSK = ( WPA_SECURITY | AES_ENABLED | TKIP_ENABLED ), /**< WPA PSK Security with AES & TKIP */ - WICED_SECURITY_WPA2_AES_PSK = ( WPA2_SECURITY | AES_ENABLED ), /**< WPA2 PSK Security with AES */ - WICED_SECURITY_WPA2_TKIP_PSK = ( WPA2_SECURITY | TKIP_ENABLED ), /**< WPA2 PSK Security with TKIP */ - WICED_SECURITY_WPA2_MIXED_PSK = ( WPA2_SECURITY | AES_ENABLED | TKIP_ENABLED ), /**< WPA2 PSK Security with AES & TKIP */ - - WICED_SECURITY_WPA_TKIP_ENT = ( ENTERPRISE_ENABLED | WPA_SECURITY | TKIP_ENABLED ), /**< WPA Enterprise Security with TKIP */ - WICED_SECURITY_WPA_AES_ENT = ( ENTERPRISE_ENABLED | WPA_SECURITY | AES_ENABLED ), /**< WPA Enterprise Security with AES */ - WICED_SECURITY_WPA_MIXED_ENT = ( ENTERPRISE_ENABLED | WPA_SECURITY | AES_ENABLED | TKIP_ENABLED ), /**< WPA Enterprise Security with AES & TKIP */ - WICED_SECURITY_WPA2_TKIP_ENT = ( ENTERPRISE_ENABLED | WPA2_SECURITY | TKIP_ENABLED ), /**< WPA2 Enterprise Security with TKIP */ - WICED_SECURITY_WPA2_AES_ENT = ( ENTERPRISE_ENABLED | WPA2_SECURITY | AES_ENABLED ), /**< WPA2 Enterprise Security with AES */ - WICED_SECURITY_WPA2_MIXED_ENT = ( ENTERPRISE_ENABLED | WPA2_SECURITY | AES_ENABLED | TKIP_ENABLED ), /**< WPA2 Enterprise Security with AES & TKIP */ - - WICED_SECURITY_IBSS_OPEN = ( IBSS_ENABLED ), /**< Open security on IBSS ad-hoc network */ - WICED_SECURITY_WPS_OPEN = ( WPS_ENABLED ), /**< WPS with open security */ - WICED_SECURITY_WPS_SECURE = ( WPS_ENABLED | AES_ENABLED), /**< WPS with AES security */ - - WICED_SECURITY_UNKNOWN = -1, /**< May be returned by scan function if security is unknown. Do not pass this to the join function! */ - - WICED_SECURITY_FORCE_32_BIT = 0x7fffffff /**< Exists only to force wiced_security_t type to 32 bits */ -} wiced_security_t; - -/** - * Enumeration of methods of scanning - */ -typedef enum -{ - WICED_SCAN_TYPE_ACTIVE = 0x00, /**< Actively scan a network by sending 802.11 probe(s) */ - WICED_SCAN_TYPE_PASSIVE = 0x01, /**< Passively scan a network by listening for beacons from APs */ - WICED_SCAN_TYPE_PNO = 0x02, /**< Use preferred network offload to detect an AP */ - WICED_SCAN_TYPE_PROHIBITED_CHANNELS = 0x04 /**< Passively scan on channels not enabled by the country code */ -} wiced_scan_type_t; - -/** - * Enumeration of network types - */ -typedef enum -{ - WICED_BSS_TYPE_INFRASTRUCTURE = 0, /**< Denotes infrastructure network */ - WICED_BSS_TYPE_ADHOC = 1, /**< Denotes an 802.11 ad-hoc IBSS network */ - WICED_BSS_TYPE_ANY = 2, /**< Denotes either infrastructure or ad-hoc network */ - - WICED_BSS_TYPE_UNKNOWN = -1 /**< May be returned by scan function if BSS type is unknown. Do not pass this to the Join function */ -} wiced_bss_type_t; - -/** - * Enumeration of 802.11 radio bands - */ -typedef enum -{ - WICED_802_11_BAND_5GHZ = 0, /**< Denotes 5GHz radio band */ - WICED_802_11_BAND_2_4GHZ = 1 /**< Denotes 2.4GHz radio band */ -} wiced_802_11_band_t; - -/** - * Enumeration of antenna selection options - */ -typedef enum -{ - WICED_ANTENNA_1 = 0, /**< Denotes antenna 1 */ - WICED_ANTENNA_2 = 1, /**< Denotes antenna 2 */ - WICED_ANTENNA_AUTO = 3 /**< Denotes auto diversity, the best antenna is automatically selected */ -} wiced_antenna_t; - -/** - * Enumeration of applicable packet mask bits for custom Information Elements (IEs) - */ -typedef enum -{ - VENDOR_IE_BEACON = 0x1, /**< Denotes beacon packet */ - VENDOR_IE_PROBE_RESPONSE = 0x2, /**< Denotes probe response packet */ - VENDOR_IE_ASSOC_RESPONSE = 0x4, /**< Denotes association response packet */ - VENDOR_IE_AUTH_RESPONSE = 0x8, /**< Denotes authentication response packet */ - VENDOR_IE_PROBE_REQUEST = 0x10, /**< Denotes probe request packet */ - VENDOR_IE_ASSOC_REQUEST = 0x20, /**< Denotes association request packet */ - VENDOR_IE_CUSTOM = 0x100 /**< Denotes a custom IE identifier */ -} wiced_ie_packet_flag_t; - -/** - * Enumeration of custom IE management actions - */ -typedef enum -{ - WICED_ADD_CUSTOM_IE, /**< Add a custom IE */ - WICED_REMOVE_CUSTOM_IE /**< Remove a custom IE */ -} wiced_custom_ie_action_t; - -/** - * Enumeration of 802.11 QoS, i.e. WMM, traffic classes - */ -typedef enum -{ - WMM_AC_BE = 0, /**< Best Effort */ - WMM_AC_BK = 1, /**< Background */ - WMM_AC_VI = 2, /**< Video */ - WMM_AC_VO = 3, /**< Voice */ -} wiced_qos_access_category_t; - -/** - * Enumeration of IP header Type of Service (TOS) values, which map to 802.11 QoS traffic classes - */ -typedef enum -{ - TOS_VO7 = 7, /**< 0xE0, 111 0 0000 (7) AC_VO tos/dscp values */ - TOS_VO = 6, /**< 0xD0, 110 0 0000 (6) AC_VO */ - TOS_VI = 5, /**< 0xA0, 101 0 0000 (5) AC_VI */ - TOS_VI4 = 4, /**< 0x80, 100 0 0000 (4) AC_VI */ - TOS_BE = 0, /**< 0x00, 000 0 0000 (0) AC_BE */ - TOS_EE = 3, /**< 0x60, 011 0 0000 (3) AC_BE */ - TOS_BK = 1, /**< 0x20, 001 0 0000 (1) AC_BK */ - TOS_LE = 2, /**< 0x40, 010 0 0000 (2) AC_BK */ -} wiced_ip_header_tos_t; - -/** - * Enumeration of listen interval time unit types - */ -typedef enum -{ - WICED_LISTEN_INTERVAL_TIME_UNIT_BEACON, /**< Time units specified in beacon periods */ - WICED_LISTEN_INTERVAL_TIME_UNIT_DTIM /**< Time units specified in DTIM periods */ -} wiced_listen_interval_time_unit_t; - -/** - * Enumeration of packet filter modes - */ -typedef enum -{ - WICED_PACKET_FILTER_MODE_FORWARD = 1, /**< Packet filter engine forwards matching packets, discards non-matching packets */ - WICED_PACKET_FILTER_MODE_DISCARD = 0, /**< Packet filter engine discards matching packets, forwards non-matching packets */ -} wiced_packet_filter_mode_t; - -/** - * Enumeration of packet filter rules - */ -typedef enum -{ - WICED_PACKET_FILTER_RULE_POSITIVE_MATCHING = 0, /**< Specifies that a filter should match a given pattern */ - WICED_PACKET_FILTER_RULE_NEGATIVE_MATCHING = 1 /**< Specifies that a filter should NOT match a given pattern */ -} wiced_packet_filter_rule_t; - -typedef enum -{ - WICED_SCAN_INCOMPLETE, - WICED_SCAN_COMPLETED_SUCCESSFULLY, - WICED_SCAN_ABORTED, -} wiced_scan_status_t; - -/** List of HT modes supported */ -typedef enum -{ - WICED_HT_MODE_HT20 = 0, /**< HT20 mode is set on the band */ - WICED_HT_MODE_HT40 = 1, /**< HT40 mode is set on the band */ - WICED_HT_MODE_HT_MIX = 2 /**< HT20 mode is set for 2.4 band and HT40 is set for 5 GHz band */ -} wiced_ht_mode_t; - -typedef enum -{ - WICED_11N_SUPPORT_DISABLED = 0, - WICED_11N_SUPPORT_ENABLED = 1, -} wiced_11n_support_t; - - -/* 802.11 Information Element Identification Numbers (as per section 8.4.2.1 of 802.11-2012) */ -typedef enum -{ - DOT11_IE_ID_SSID = 0, - DOT11_IE_ID_SUPPORTED_RATES = 1, - DOT11_IE_ID_FH_PARAMETER_SET = 2, - DOT11_IE_ID_DSSS_PARAMETER_SET = 3, - DOT11_IE_ID_CF_PARAMETER_SET = 4, - DOT11_IE_ID_TIM = 5, - DOT11_IE_ID_IBSS_PARAMETER_SET = 6, - DOT11_IE_ID_COUNTRY = 7, - DOT11_IE_ID_HOPPING_PATTERN_PARAMETERS = 8, - DOT11_IE_ID_HOPPING_PATTERN_TABLE = 9, - DOT11_IE_ID_REQUEST = 10, - DOT11_IE_ID_BSS_LOAD = 11, - DOT11_IE_ID_EDCA_PARAMETER_SET = 12, - DOT11_IE_ID_TSPEC = 13, - DOT11_IE_ID_TCLAS = 14, - DOT11_IE_ID_SCHEDULE = 15, - DOT11_IE_ID_CHALLENGE_TEXT = 16, - /* 17-31 Reserved */ - DOT11_IE_ID_POWER_CONSTRAINT = 32, - DOT11_IE_ID_POWER_CAPABILITY = 33, - DOT11_IE_ID_TPC_REQUEST = 34, - DOT11_IE_ID_TPC_REPORT = 35, - DOT11_IE_ID_SUPPORTED_CHANNELS = 36, - DOT11_IE_ID_CHANNEL_SWITCH_ANNOUNCEMENT = 37, - DOT11_IE_ID_MEASUREMENT_REQUEST = 38, - DOT11_IE_ID_MEASUREMENT_REPORT = 39, - DOT11_IE_ID_QUIET = 40, - DOT11_IE_ID_IBSS_DFS = 41, - DOT11_IE_ID_ERP = 42, - DOT11_IE_ID_TS_DELAY = 43, - DOT11_IE_ID_TCLAS_PROCESSING = 44, - DOT11_IE_ID_HT_CAPABILITIES = 45, - DOT11_IE_ID_QOS_CAPABILITY = 46, - /* 47 Reserved */ - DOT11_IE_ID_RSN = 48, - /* 49 Reserved */ - DOT11_IE_ID_EXTENDED_SUPPORTED_RATES = 50, - DOT11_IE_ID_AP_CHANNEL_REPORT = 51, - DOT11_IE_ID_NEIGHBOR_REPORT = 52, - DOT11_IE_ID_RCPI = 53, - DOT11_IE_ID_MOBILITY_DOMAIN = 54, - DOT11_IE_ID_FAST_BSS_TRANSITION = 55, - DOT11_IE_ID_TIMEOUT_INTERVAL = 56, - DOT11_IE_ID_RIC_DATA = 57, - DOT11_IE_ID_DSE_REGISTERED_LOCATION = 58, - DOT11_IE_ID_SUPPORTED_OPERATING_CLASSES = 59, - DOT11_IE_ID_EXTENDED_CHANNEL_SWITCH_ANNOUNCEMENT = 60, - DOT11_IE_ID_HT_OPERATION = 61, - DOT11_IE_ID_SECONDARY_CHANNEL_OFFSET = 62, - DOT11_IE_ID_BSS_AVERAGE_ACCESS_DELAY = 63, - DOT11_IE_ID_ANTENNA = 64, - DOT11_IE_ID_RSNI = 65, - DOT11_IE_ID_MEASUREMENT_PILOT_TRANSMISSION = 66, - DOT11_IE_ID_BSS_AVAILABLE_ADMISSION_CAPACITY = 67, - DOT11_IE_ID_BSS_AC_ACCESS_DELAY = 68, - DOT11_IE_ID_TIME_ADVERTISEMENT = 69, - DOT11_IE_ID_RM_ENABLED_CAPABILITIES = 70, - DOT11_IE_ID_MULTIPLE_BSSID = 71, - DOT11_IE_ID_20_40_BSS_COEXISTENCE = 72, - DOT11_IE_ID_20_40_BSS_INTOLERANT_CHANNEL_REPORT = 73, - DOT11_IE_ID_OVERLAPPING_BSS_SCAN_PARAMETERS = 74, - DOT11_IE_ID_RIC_DESCRIPTOR = 75, - DOT11_IE_ID_MANAGEMENT_MIC = 76, - DOT11_IE_ID_EVENT_REQUEST = 78, - DOT11_IE_ID_EVENT_REPORT = 79, - DOT11_IE_ID_DIAGNOSTIC_REQUEST = 80, - DOT11_IE_ID_DIAGNOSTIC_REPORT = 81, - DOT11_IE_ID_LOCATION_PARAMETERS = 82, - DOT11_IE_ID_NONTRANSMITTED_BSSID_CAPABILITY = 83, - DOT11_IE_ID_SSID_LIST = 84, - DOT11_IE_ID_MULTIPLE_BSSID_INDEX = 85, - DOT11_IE_ID_FMS_DESCRIPTOR = 86, - DOT11_IE_ID_FMS_REQUEST = 87, - DOT11_IE_ID_FMS_RESPONSE = 88, - DOT11_IE_ID_QOS_TRAFFIC_CAPABILITY = 89, - DOT11_IE_ID_BSS_MAX_IDLE_PERIOD = 90, - DOT11_IE_ID_TFS_REQUEST = 91, - DOT11_IE_ID_TFS_RESPONSE = 92, - DOT11_IE_ID_WNM_SLEEP_MODE = 93, - DOT11_IE_ID_TIM_BROADCAST_REQUEST = 94, - DOT11_IE_ID_TIM_BROADCAST_RESPONSE = 95, - DOT11_IE_ID_COLLOCATED_INTERFERENCE_REPORT = 96, - DOT11_IE_ID_CHANNEL_USAGE = 97, - DOT11_IE_ID_TIME_ZONE = 98, - DOT11_IE_ID_DMS_REQUEST = 99, - DOT11_IE_ID_DMS_RESPONSE = 100, - DOT11_IE_ID_LINK_IDENTIFIER = 101, - DOT11_IE_ID_WAKEUP_SCHEDULE = 102, - /* 103 Reserved */ - DOT11_IE_ID_CHANNEL_SWITCH_TIMING = 104, - DOT11_IE_ID_PTI_CONTROL = 105, - DOT11_IE_ID_TPU_BUFFER_STATUS = 106, - DOT11_IE_ID_INTERWORKING = 107, - DOT11_IE_ID_ADVERTISMENT_PROTOCOL = 108, - DOT11_IE_ID_EXPEDITED_BANDWIDTH_REQUEST = 109, - DOT11_IE_ID_QOS_MAP_SET = 110, - DOT11_IE_ID_ROAMING_CONSORTIUM = 111, - DOT11_IE_ID_EMERGENCY_ALERT_IDENTIFIER = 112, - DOT11_IE_ID_MESH_CONFIGURATION = 113, - DOT11_IE_ID_MESH_ID = 114, - DOT11_IE_ID_MESH_LINK_METRIC_REPORT = 115, - DOT11_IE_ID_CONGESTION_NOTIFICATION = 116, - DOT11_IE_ID_MESH_PEERING_MANAGEMENT = 117, - DOT11_IE_ID_MESH_CHANNEL_SWITCH_PARAMETERS = 118, - DOT11_IE_ID_MESH_AWAKE_WINDOW = 119, - DOT11_IE_ID_BEACON_TIMING = 120, - DOT11_IE_ID_MCCAOP_SETUP_REQUEST = 121, - DOT11_IE_ID_MCCAOP_SETUP_REPLY = 122, - DOT11_IE_ID_MCCAOP_ADVERTISMENT = 123, - DOT11_IE_ID_MCCAOP_TEARDOWN = 124, - DOT11_IE_ID_GANN = 125, - DOT11_IE_ID_RANN = 126, - DOT11_IE_ID_EXTENDED_CAPABILITIES = 127, - /* 128-129 Reserved */ - DOT11_IE_ID_PREQ = 130, - DOT11_IE_ID_PREP = 131, - DOT11_IE_ID_PERR = 132, - /* 133-136 Reserved */ - DOT11_IE_ID_PXU = 137, - DOT11_IE_ID_PXUC = 138, - DOT11_IE_ID_AUTHENTICATED_MESH_PEERING_EXCHANGE = 139, - DOT11_IE_ID_MIC = 140, - DOT11_IE_ID_DESTINATION_URI = 141, - DOT11_IE_ID_U_APSD_COEXISTENCE = 142, - /* 143-173 Reserved */ - DOT11_IE_ID_MCCAOP_ADVERTISMENT_OVERVIEW = 174, - /* 175-220 Reserved */ - DOT11_IE_ID_VENDOR_SPECIFIC = 221, - /* 222-255 Reserved */ -} dot11_ie_id_t; - -/* Protected Management Frame Capability */ -typedef enum -{ - MFP_NONE = 0, - MFP_CAPABLE, - MFP_REQUIRED -} mfp_capability_t; - -#ifndef RESULT_ENUM -#define RESULT_ENUM( prefix, name, value ) prefix ## name = (value) -#endif /* ifndef RESULT_ENUM */ - - -/* These Enum result values are for WWD errors - * Values: 1000 - 1999 - */ - -#define WWD_RESULT_LIST( prefix ) \ - RESULT_ENUM( prefix, SUCCESS, 0 ), /**< Success */ \ - RESULT_ENUM( prefix, PENDING, 1 ), /**< Pending */ \ - RESULT_ENUM( prefix, TIMEOUT, 2 ), /**< Timeout */ \ - RESULT_ENUM( prefix, BADARG, 5 ), /**< Bad Arguments */ \ - RESULT_ENUM( prefix, UNFINISHED, 10 ), /**< Operation not finished yet (maybe aborted) */ \ - RESULT_ENUM( prefix, PARTIAL_RESULTS, 1003 ), /**< Partial results */ \ - RESULT_ENUM( prefix, INVALID_KEY, 1004 ), /**< Invalid key */ \ - RESULT_ENUM( prefix, DOES_NOT_EXIST, 1005 ), /**< Does not exist */ \ - RESULT_ENUM( prefix, NOT_AUTHENTICATED, 1006 ), /**< Not authenticated */ \ - RESULT_ENUM( prefix, NOT_KEYED, 1007 ), /**< Not keyed */ \ - RESULT_ENUM( prefix, IOCTL_FAIL, 1008 ), /**< IOCTL fail */ \ - RESULT_ENUM( prefix, BUFFER_UNAVAILABLE_TEMPORARY, 1009 ), /**< Buffer unavailable temporarily */ \ - RESULT_ENUM( prefix, BUFFER_UNAVAILABLE_PERMANENT, 1010 ), /**< Buffer unavailable permanently */ \ - RESULT_ENUM( prefix, CONNECTION_LOST, 1012 ), /**< Connection lost */ \ - RESULT_ENUM( prefix, OUT_OF_EVENT_HANDLER_SPACE, 1013 ), /**< Cannot add extra event handler */ \ - RESULT_ENUM( prefix, SEMAPHORE_ERROR, 1014 ), /**< Error manipulating a semaphore */ \ - RESULT_ENUM( prefix, FLOW_CONTROLLED, 1015 ), /**< Packet retrieval cancelled due to flow control */ \ - RESULT_ENUM( prefix, NO_CREDITS, 1016 ), /**< Packet retrieval cancelled due to lack of bus credits */ \ - RESULT_ENUM( prefix, NO_PACKET_TO_SEND, 1017 ), /**< Packet retrieval cancelled due to no pending packets */ \ - RESULT_ENUM( prefix, CORE_CLOCK_NOT_ENABLED, 1018 ), /**< Core disabled due to no clock */ \ - RESULT_ENUM( prefix, CORE_IN_RESET, 1019 ), /**< Core disabled - in reset */ \ - RESULT_ENUM( prefix, UNSUPPORTED, 1020 ), /**< Unsupported function */ \ - RESULT_ENUM( prefix, BUS_WRITE_REGISTER_ERROR, 1021 ), /**< Error writing to WLAN register */ \ - RESULT_ENUM( prefix, SDIO_BUS_UP_FAIL, 1022 ), /**< SDIO bus failed to come up */ \ - RESULT_ENUM( prefix, JOIN_IN_PROGRESS, 1023 ), /**< Join not finished yet */ \ - RESULT_ENUM( prefix, NETWORK_NOT_FOUND, 1024 ), /**< Specified network was not found */ \ - RESULT_ENUM( prefix, INVALID_JOIN_STATUS, 1025 ), /**< Join status error */ \ - RESULT_ENUM( prefix, UNKNOWN_INTERFACE, 1026 ), /**< Unknown interface specified */ \ - RESULT_ENUM( prefix, SDIO_RX_FAIL, 1027 ), /**< Error during SDIO receive */ \ - RESULT_ENUM( prefix, HWTAG_MISMATCH, 1028 ), /**< Hardware tag header corrupt */ \ - RESULT_ENUM( prefix, RX_BUFFER_ALLOC_FAIL, 1029 ), /**< Failed to allocate a buffer to receive into */ \ - RESULT_ENUM( prefix, BUS_READ_REGISTER_ERROR, 1030 ), /**< Error reading a bus hardware register */ \ - RESULT_ENUM( prefix, THREAD_CREATE_FAILED, 1031 ), /**< Failed to create a new thread */ \ - RESULT_ENUM( prefix, QUEUE_ERROR, 1032 ), /**< Error manipulating a queue */ \ - RESULT_ENUM( prefix, BUFFER_POINTER_MOVE_ERROR, 1033 ), /**< Error moving the current pointer of a packet buffer */ \ - RESULT_ENUM( prefix, BUFFER_SIZE_SET_ERROR, 1034 ), /**< Error setting size of packet buffer */ \ - RESULT_ENUM( prefix, THREAD_STACK_NULL, 1035 ), /**< Null stack pointer passed when non null was reqired */ \ - RESULT_ENUM( prefix, THREAD_DELETE_FAIL, 1036 ), /**< Error deleting a thread */ \ - RESULT_ENUM( prefix, SLEEP_ERROR, 1037 ), /**< Error sleeping a thread */ \ - RESULT_ENUM( prefix, BUFFER_ALLOC_FAIL, 1038 ), /**< Failed to allocate a packet buffer */ \ - RESULT_ENUM( prefix, NO_PACKET_TO_RECEIVE, 1039 ), /**< No Packets waiting to be received */ \ - RESULT_ENUM( prefix, INTERFACE_NOT_UP, 1040 ), /**< Requested interface is not active */ \ - RESULT_ENUM( prefix, DELAY_TOO_LONG, 1041 ), /**< Requested delay is too long */ \ - RESULT_ENUM( prefix, INVALID_DUTY_CYCLE, 1042 ), /**< Duty cycle is outside limit 0 to 100 */ \ - RESULT_ENUM( prefix, PMK_WRONG_LENGTH, 1043 ), /**< Returned pmk was the wrong length */ \ - RESULT_ENUM( prefix, UNKNOWN_SECURITY_TYPE, 1044 ), /**< AP security type was unknown */ \ - RESULT_ENUM( prefix, WEP_NOT_ALLOWED, 1045 ), /**< AP not allowed to use WEP - it is not secure - use Open instead */ \ - RESULT_ENUM( prefix, WPA_KEYLEN_BAD, 1046 ), /**< WPA / WPA2 key length must be between 8 & 64 bytes */ \ - RESULT_ENUM( prefix, FILTER_NOT_FOUND, 1047 ), /**< Specified filter id not found */ \ - RESULT_ENUM( prefix, SPI_ID_READ_FAIL, 1048 ), /**< Failed to read 0xfeedbead SPI id from chip */ \ - RESULT_ENUM( prefix, SPI_SIZE_MISMATCH, 1049 ), /**< Mismatch in sizes between SPI header and SDPCM header */ \ - RESULT_ENUM( prefix, ADDRESS_ALREADY_REGISTERED, 1050 ), /**< Attempt to register a multicast address twice */ \ - RESULT_ENUM( prefix, SDIO_RETRIES_EXCEEDED, 1051 ), /**< SDIO transfer failed too many times. */ \ - RESULT_ENUM( prefix, NULL_PTR_ARG, 1052 ), /**< Null Pointer argument passed to function. */ \ - RESULT_ENUM( prefix, THREAD_FINISH_FAIL, 1053 ), /**< Error deleting a thread */ \ - RESULT_ENUM( prefix, WAIT_ABORTED, 1054 ), /**< Semaphore/mutex wait has been aborted */ \ - RESULT_ENUM( prefix, SET_BLOCK_ACK_WINDOW_FAIL, 1055 ), /**< Failed to set block ack window */ \ - RESULT_ENUM( prefix, DELAY_TOO_SHORT, 1056 ), /**< Requested delay is too short */ \ - RESULT_ENUM( prefix, INVALID_INTERFACE, 1057 ), /**< Invalid interface provided */ \ - RESULT_ENUM( prefix, WEP_KEYLEN_BAD, 1058 ), /**< WEP / WEP_SHARED key length must be 5 or 13 bytes */ \ - RESULT_ENUM( prefix, HANDLER_ALREADY_REGISTERED, 1059 ), /**< EAPOL handler already registered */ \ - RESULT_ENUM( prefix, AP_ALREADY_UP, 1060 ), /**< Soft AP or P2P group owner already up */ \ - RESULT_ENUM( prefix, EAPOL_KEY_PACKET_M1_TIMEOUT, 1061 ), /**< Timeout occurred while waiting for EAPOL packet M1 from AP */ \ - RESULT_ENUM( prefix, EAPOL_KEY_PACKET_M3_TIMEOUT, 1062 ), /**< Timeout occurred while waiting for EAPOL packet M3 from AP, which may indicate incorrect WPA2/WPA passphrase */ \ - RESULT_ENUM( prefix, EAPOL_KEY_PACKET_G1_TIMEOUT, 1063 ), /**< Timeout occurred while waiting for EAPOL packet G1 from AP */ \ - RESULT_ENUM( prefix, EAPOL_KEY_FAILURE, 1064 ), /**< Unknown failure occurred during the EAPOL key handshake */ \ - RESULT_ENUM( prefix, MALLOC_FAILURE, 1065 ), /**< Memory allocation failure */ \ - RESULT_ENUM( prefix, ACCESS_POINT_NOT_FOUND, 1066 ), /**< Access point not found */ - - -/* These Enum result values are returned directly from the WLAN during an ioctl or iovar call. - * Values: 1100 - 1200 - */ -#define WLAN_ENUM_OFFSET (2000) - -#define WLAN_RESULT_LIST( prefix ) \ - RESULT_ENUM( prefix, ERROR, 2001 ), /**< Generic Error */ \ - RESULT_ENUM( prefix, BADARG, 2002 ), /**< Bad Argument */ \ - RESULT_ENUM( prefix, BADOPTION, 2003 ), /**< Bad option */ \ - RESULT_ENUM( prefix, NOTUP, 2004 ), /**< Not up */ \ - RESULT_ENUM( prefix, NOTDOWN, 2005 ), /**< Not down */ \ - RESULT_ENUM( prefix, NOTAP, 2006 ), /**< Not AP */ \ - RESULT_ENUM( prefix, NOTSTA, 2007 ), /**< Not STA */ \ - RESULT_ENUM( prefix, BADKEYIDX, 2008 ), /**< BAD Key Index */ \ - RESULT_ENUM( prefix, RADIOOFF, 2009 ), /**< Radio Off */ \ - RESULT_ENUM( prefix, NOTBANDLOCKED, 2010 ), /**< Not band locked */ \ - RESULT_ENUM( prefix, NOCLK, 2011 ), /**< No Clock */ \ - RESULT_ENUM( prefix, BADRATESET, 2012 ), /**< BAD Rate valueset */ \ - RESULT_ENUM( prefix, BADBAND, 2013 ), /**< BAD Band */ \ - RESULT_ENUM( prefix, BUFTOOSHORT, 2014 ), /**< Buffer too short */ \ - RESULT_ENUM( prefix, BUFTOOLONG, 2015 ), /**< Buffer too long */ \ - RESULT_ENUM( prefix, BUSY, 2016 ), /**< Busy */ \ - RESULT_ENUM( prefix, NOTASSOCIATED, 2017 ), /**< Not Associated */ \ - RESULT_ENUM( prefix, BADSSIDLEN, 2018 ), /**< Bad SSID len */ \ - RESULT_ENUM( prefix, OUTOFRANGECHAN, 2019 ), /**< Out of Range Channel */ \ - RESULT_ENUM( prefix, BADCHAN, 2020 ), /**< Bad Channel */ \ - RESULT_ENUM( prefix, BADADDR, 2021 ), /**< Bad Address */ \ - RESULT_ENUM( prefix, NORESOURCE, 2022 ), /**< Not Enough Resources */ \ - RESULT_ENUM( prefix, UNSUPPORTED, 2023 ), /**< Unsupported */ \ - RESULT_ENUM( prefix, BADLEN, 2024 ), /**< Bad length */ \ - RESULT_ENUM( prefix, NOTREADY, 2025 ), /**< Not Ready */ \ - RESULT_ENUM( prefix, EPERM, 2026 ), /**< Not Permitted */ \ - RESULT_ENUM( prefix, NOMEM, 2027 ), /**< No Memory */ \ - RESULT_ENUM( prefix, ASSOCIATED, 2028 ), /**< Associated */ \ - RESULT_ENUM( prefix, RANGE, 2029 ), /**< Not In Range */ \ - RESULT_ENUM( prefix, NOTFOUND, 2030 ), /**< Not Found */ \ - RESULT_ENUM( prefix, WME_NOT_ENABLED, 2031 ), /**< WME Not Enabled */ \ - RESULT_ENUM( prefix, TSPEC_NOTFOUND, 2032 ), /**< TSPEC Not Found */ \ - RESULT_ENUM( prefix, ACM_NOTSUPPORTED, 2033 ), /**< ACM Not Supported */ \ - RESULT_ENUM( prefix, NOT_WME_ASSOCIATION, 2034 ), /**< Not WME Association */ \ - RESULT_ENUM( prefix, SDIO_ERROR, 2035 ), /**< SDIO Bus Error */ \ - RESULT_ENUM( prefix, WLAN_DOWN, 2036 ), /**< WLAN Not Accessible */ \ - RESULT_ENUM( prefix, BAD_VERSION, 2037 ), /**< Incorrect version */ \ - RESULT_ENUM( prefix, TXFAIL, 2038 ), /**< TX failure */ \ - RESULT_ENUM( prefix, RXFAIL, 2039 ), /**< RX failure */ \ - RESULT_ENUM( prefix, NODEVICE, 2040 ), /**< Device not present */ \ - RESULT_ENUM( prefix, UNFINISHED, 2041 ), /**< To be finished */ \ - RESULT_ENUM( prefix, NONRESIDENT, 2042 ), /**< access to nonresident overlay */ \ - RESULT_ENUM( prefix, DISABLED, 2043 ), /**< Disabled in this build */ - -/** - * Common result type for WICED functions - */ -typedef enum -{ - WWD_RESULT_LIST( WWD_ ) - WLAN_RESULT_LIST( WWD_WLAN_ ) -} wwd_result_t; - -/** - * Boolean values - */ -typedef enum -{ - WICED_FALSE = 0, - WICED_TRUE = 1 -} wiced_bool_t; - -/** - * I/O State Values - */ -typedef enum -{ - WWD_ACTIVE_LOW = 0, - WWD_ACTIVE_HIGH = 1 -} wwd_io_state_t; - -/** - * Enumeration of Dot11 Reason Codes - */ -typedef enum -{ - WWD_DOT11_RC_RESERVED = 0, /**< Reserved */ - WWD_DOT11_RC_UNSPECIFIED = 1 /**< Unspecified */ -} wwd_dot11_reason_code_t; - - -/****************************************************** - * @cond Constants - ******************************************************/ - -/** - * Transfer direction for the WICED platform bus interface - */ -typedef enum -{ - /* If updating this enum, the bus_direction_mapping variable will also need to be updated */ - BUS_READ, - BUS_WRITE -} wwd_bus_transfer_direction_t; - -/** - * Macro for creating country codes according to endianness - * @cond !ADDTHIS - */ - -#ifdef IL_BIGENDIAN -#define MK_CNTRY( a, b, rev ) (((unsigned char)(b)) + (((unsigned char)(a))<<8) + (((unsigned short)(rev))<<16)) -#else /* ifdef IL_BIGENDIAN */ -#define MK_CNTRY( a, b, rev ) (((unsigned char)(a)) + (((unsigned char)(b))<<8) + (((unsigned short)(rev))<<16)) -#endif /* ifdef IL_BIGENDIAN */ - -/* Suppress unused parameter warning */ -#ifndef UNUSED_PARAMETER -#define UNUSED_PARAMETER(x) /*@-noeffect@*/ ( (void)(x) ) /*@+noeffect@*/ -#endif - -/* Suppress unused variable warning */ -#ifndef UNUSED_VARIABLE -#define UNUSED_VARIABLE(x) /*@-noeffect@*/ ( (void)(x) ) /*@+noeffect@*/ -#endif - - -/* Suppress unused variable warning occurring due to an assert which is disabled in release mode */ -#ifndef REFERENCE_DEBUG_ONLY_VARIABLE -#define REFERENCE_DEBUG_ONLY_VARIABLE(x) /*@-noeffect@*/ ( (void)(x) ) /*@+noeffect@*/ -#endif - -/* Allow functions to be deprecated */ -#ifdef __GNUC__ -#define DEPRECATE( name ) name __attribute__ ((deprecated)) -#else -#define DEPRECATE( name ) deprecated_ ## name -#endif - -/* - * @endcond - */ - -/** - * Enumerated list of country codes - */ -typedef enum -{ - WICED_COUNTRY_AFGHANISTAN = MK_CNTRY( 'A', 'F', 0 ), /* AF Afghanistan */ - WICED_COUNTRY_ALBANIA = MK_CNTRY( 'A', 'L', 0 ), /* AL Albania */ - WICED_COUNTRY_ALGERIA = MK_CNTRY( 'D', 'Z', 0 ), /* DZ Algeria */ - WICED_COUNTRY_AMERICAN_SAMOA = MK_CNTRY( 'A', 'S', 0 ), /* AS American_Samoa */ - WICED_COUNTRY_ANGOLA = MK_CNTRY( 'A', 'O', 0 ), /* AO Angola */ - WICED_COUNTRY_ANGUILLA = MK_CNTRY( 'A', 'I', 0 ), /* AI Anguilla */ - WICED_COUNTRY_ANTIGUA_AND_BARBUDA = MK_CNTRY( 'A', 'G', 0 ), /* AG Antigua_and_Barbuda */ - WICED_COUNTRY_ARGENTINA = MK_CNTRY( 'A', 'R', 0 ), /* AR Argentina */ - WICED_COUNTRY_ARMENIA = MK_CNTRY( 'A', 'M', 0 ), /* AM Armenia */ - WICED_COUNTRY_ARUBA = MK_CNTRY( 'A', 'W', 0 ), /* AW Aruba */ - WICED_COUNTRY_AUSTRALIA = MK_CNTRY( 'A', 'U', 0 ), /* AU Australia */ - WICED_COUNTRY_AUSTRIA = MK_CNTRY( 'A', 'T', 0 ), /* AT Austria */ - WICED_COUNTRY_AZERBAIJAN = MK_CNTRY( 'A', 'Z', 0 ), /* AZ Azerbaijan */ - WICED_COUNTRY_BAHAMAS = MK_CNTRY( 'B', 'S', 0 ), /* BS Bahamas */ - WICED_COUNTRY_BAHRAIN = MK_CNTRY( 'B', 'H', 0 ), /* BH Bahrain */ - WICED_COUNTRY_BAKER_ISLAND = MK_CNTRY( '0', 'B', 0 ), /* 0B Baker_Island */ - WICED_COUNTRY_BANGLADESH = MK_CNTRY( 'B', 'D', 0 ), /* BD Bangladesh */ - WICED_COUNTRY_BARBADOS = MK_CNTRY( 'B', 'B', 0 ), /* BB Barbados */ - WICED_COUNTRY_BELARUS = MK_CNTRY( 'B', 'Y', 0 ), /* BY Belarus */ - WICED_COUNTRY_BELGIUM = MK_CNTRY( 'B', 'E', 0 ), /* BE Belgium */ - WICED_COUNTRY_BELIZE = MK_CNTRY( 'B', 'Z', 0 ), /* BZ Belize */ - WICED_COUNTRY_BENIN = MK_CNTRY( 'B', 'J', 0 ), /* BJ Benin */ - WICED_COUNTRY_BERMUDA = MK_CNTRY( 'B', 'M', 0 ), /* BM Bermuda */ - WICED_COUNTRY_BHUTAN = MK_CNTRY( 'B', 'T', 0 ), /* BT Bhutan */ - WICED_COUNTRY_BOLIVIA = MK_CNTRY( 'B', 'O', 0 ), /* BO Bolivia */ - WICED_COUNTRY_BOSNIA_AND_HERZEGOVINA = MK_CNTRY( 'B', 'A', 0 ), /* BA Bosnia_and_Herzegovina */ - WICED_COUNTRY_BOTSWANA = MK_CNTRY( 'B', 'W', 0 ), /* BW Botswana */ - WICED_COUNTRY_BRAZIL = MK_CNTRY( 'B', 'R', 0 ), /* BR Brazil */ - WICED_COUNTRY_BRITISH_INDIAN_OCEAN_TERRITORY = MK_CNTRY( 'I', 'O', 0 ), /* IO British_Indian_Ocean_Territory */ - WICED_COUNTRY_BRUNEI_DARUSSALAM = MK_CNTRY( 'B', 'N', 0 ), /* BN Brunei_Darussalam */ - WICED_COUNTRY_BULGARIA = MK_CNTRY( 'B', 'G', 0 ), /* BG Bulgaria */ - WICED_COUNTRY_BURKINA_FASO = MK_CNTRY( 'B', 'F', 0 ), /* BF Burkina_Faso */ - WICED_COUNTRY_BURUNDI = MK_CNTRY( 'B', 'I', 0 ), /* BI Burundi */ - WICED_COUNTRY_CAMBODIA = MK_CNTRY( 'K', 'H', 0 ), /* KH Cambodia */ - WICED_COUNTRY_CAMEROON = MK_CNTRY( 'C', 'M', 0 ), /* CM Cameroon */ - WICED_COUNTRY_CANADA = MK_CNTRY( 'C', 'A', 0 ), /* CA Canada */ - WICED_COUNTRY_CAPE_VERDE = MK_CNTRY( 'C', 'V', 0 ), /* CV Cape_Verde */ - WICED_COUNTRY_CAYMAN_ISLANDS = MK_CNTRY( 'K', 'Y', 0 ), /* KY Cayman_Islands */ - WICED_COUNTRY_CENTRAL_AFRICAN_REPUBLIC = MK_CNTRY( 'C', 'F', 0 ), /* CF Central_African_Republic */ - WICED_COUNTRY_CHAD = MK_CNTRY( 'T', 'D', 0 ), /* TD Chad */ - WICED_COUNTRY_CHILE = MK_CNTRY( 'C', 'L', 0 ), /* CL Chile */ - WICED_COUNTRY_CHINA = MK_CNTRY( 'C', 'N', 0 ), /* CN China */ - WICED_COUNTRY_CHRISTMAS_ISLAND = MK_CNTRY( 'C', 'X', 0 ), /* CX Christmas_Island */ - WICED_COUNTRY_COLOMBIA = MK_CNTRY( 'C', 'O', 0 ), /* CO Colombia */ - WICED_COUNTRY_COMOROS = MK_CNTRY( 'K', 'M', 0 ), /* KM Comoros */ - WICED_COUNTRY_CONGO = MK_CNTRY( 'C', 'G', 0 ), /* CG Congo */ - WICED_COUNTRY_CONGO_THE_DEMOCRATIC_REPUBLIC_OF_THE = MK_CNTRY( 'C', 'D', 0 ), /* CD Congo,_The_Democratic_Republic_Of_The */ - WICED_COUNTRY_COSTA_RICA = MK_CNTRY( 'C', 'R', 0 ), /* CR Costa_Rica */ - WICED_COUNTRY_COTE_DIVOIRE = MK_CNTRY( 'C', 'I', 0 ), /* CI Cote_D'ivoire */ - WICED_COUNTRY_CROATIA = MK_CNTRY( 'H', 'R', 0 ), /* HR Croatia */ - WICED_COUNTRY_CUBA = MK_CNTRY( 'C', 'U', 0 ), /* CU Cuba */ - WICED_COUNTRY_CYPRUS = MK_CNTRY( 'C', 'Y', 0 ), /* CY Cyprus */ - WICED_COUNTRY_CZECH_REPUBLIC = MK_CNTRY( 'C', 'Z', 0 ), /* CZ Czech_Republic */ - WICED_COUNTRY_DENMARK = MK_CNTRY( 'D', 'K', 0 ), /* DK Denmark */ - WICED_COUNTRY_DJIBOUTI = MK_CNTRY( 'D', 'J', 0 ), /* DJ Djibouti */ - WICED_COUNTRY_DOMINICA = MK_CNTRY( 'D', 'M', 0 ), /* DM Dominica */ - WICED_COUNTRY_DOMINICAN_REPUBLIC = MK_CNTRY( 'D', 'O', 0 ), /* DO Dominican_Republic */ - WICED_COUNTRY_DOWN_UNDER = MK_CNTRY( 'A', 'U', 0 ), /* AU G'Day mate! */ - WICED_COUNTRY_ECUADOR = MK_CNTRY( 'E', 'C', 0 ), /* EC Ecuador */ - WICED_COUNTRY_EGYPT = MK_CNTRY( 'E', 'G', 0 ), /* EG Egypt */ - WICED_COUNTRY_EL_SALVADOR = MK_CNTRY( 'S', 'V', 0 ), /* SV El_Salvador */ - WICED_COUNTRY_EQUATORIAL_GUINEA = MK_CNTRY( 'G', 'Q', 0 ), /* GQ Equatorial_Guinea */ - WICED_COUNTRY_ERITREA = MK_CNTRY( 'E', 'R', 0 ), /* ER Eritrea */ - WICED_COUNTRY_ESTONIA = MK_CNTRY( 'E', 'E', 0 ), /* EE Estonia */ - WICED_COUNTRY_ETHIOPIA = MK_CNTRY( 'E', 'T', 0 ), /* ET Ethiopia */ - WICED_COUNTRY_FALKLAND_ISLANDS_MALVINAS = MK_CNTRY( 'F', 'K', 0 ), /* FK Falkland_Islands_(Malvinas) */ - WICED_COUNTRY_FAROE_ISLANDS = MK_CNTRY( 'F', 'O', 0 ), /* FO Faroe_Islands */ - WICED_COUNTRY_FIJI = MK_CNTRY( 'F', 'J', 0 ), /* FJ Fiji */ - WICED_COUNTRY_FINLAND = MK_CNTRY( 'F', 'I', 0 ), /* FI Finland */ - WICED_COUNTRY_FRANCE = MK_CNTRY( 'F', 'R', 0 ), /* FR France */ - WICED_COUNTRY_FRENCH_GUINA = MK_CNTRY( 'G', 'F', 0 ), /* GF French_Guina */ - WICED_COUNTRY_FRENCH_POLYNESIA = MK_CNTRY( 'P', 'F', 0 ), /* PF French_Polynesia */ - WICED_COUNTRY_FRENCH_SOUTHERN_TERRITORIES = MK_CNTRY( 'T', 'F', 0 ), /* TF French_Southern_Territories */ - WICED_COUNTRY_GABON = MK_CNTRY( 'G', 'A', 0 ), /* GA Gabon */ - WICED_COUNTRY_GAMBIA = MK_CNTRY( 'G', 'M', 0 ), /* GM Gambia */ - WICED_COUNTRY_GEORGIA = MK_CNTRY( 'G', 'E', 0 ), /* GE Georgia */ - WICED_COUNTRY_GERMANY = MK_CNTRY( 'D', 'E', 0 ), /* DE Germany */ - WICED_COUNTRY_GHANA = MK_CNTRY( 'G', 'H', 0 ), /* GH Ghana */ - WICED_COUNTRY_GIBRALTAR = MK_CNTRY( 'G', 'I', 0 ), /* GI Gibraltar */ - WICED_COUNTRY_GREECE = MK_CNTRY( 'G', 'R', 0 ), /* GR Greece */ - WICED_COUNTRY_GRENADA = MK_CNTRY( 'G', 'D', 0 ), /* GD Grenada */ - WICED_COUNTRY_GUADELOUPE = MK_CNTRY( 'G', 'P', 0 ), /* GP Guadeloupe */ - WICED_COUNTRY_GUAM = MK_CNTRY( 'G', 'U', 0 ), /* GU Guam */ - WICED_COUNTRY_GUATEMALA = MK_CNTRY( 'G', 'T', 0 ), /* GT Guatemala */ - WICED_COUNTRY_GUERNSEY = MK_CNTRY( 'G', 'G', 0 ), /* GG Guernsey */ - WICED_COUNTRY_GUINEA = MK_CNTRY( 'G', 'N', 0 ), /* GN Guinea */ - WICED_COUNTRY_GUINEA_BISSAU = MK_CNTRY( 'G', 'W', 0 ), /* GW Guinea-bissau */ - WICED_COUNTRY_GUYANA = MK_CNTRY( 'G', 'Y', 0 ), /* GY Guyana */ - WICED_COUNTRY_HAITI = MK_CNTRY( 'H', 'T', 0 ), /* HT Haiti */ - WICED_COUNTRY_HOLY_SEE_VATICAN_CITY_STATE = MK_CNTRY( 'V', 'A', 0 ), /* VA Holy_See_(Vatican_City_State) */ - WICED_COUNTRY_HONDURAS = MK_CNTRY( 'H', 'N', 0 ), /* HN Honduras */ - WICED_COUNTRY_HONG_KONG = MK_CNTRY( 'H', 'K', 0 ), /* HK Hong_Kong */ - WICED_COUNTRY_HUNGARY = MK_CNTRY( 'H', 'U', 0 ), /* HU Hungary */ - WICED_COUNTRY_ICELAND = MK_CNTRY( 'I', 'S', 0 ), /* IS Iceland */ - WICED_COUNTRY_INDIA = MK_CNTRY( 'I', 'N', 0 ), /* IN India */ - WICED_COUNTRY_INDONESIA = MK_CNTRY( 'I', 'D', 0 ), /* ID Indonesia */ - WICED_COUNTRY_IRAN_ISLAMIC_REPUBLIC_OF = MK_CNTRY( 'I', 'R', 0 ), /* IR Iran,_Islamic_Republic_Of */ - WICED_COUNTRY_IRAQ = MK_CNTRY( 'I', 'Q', 0 ), /* IQ Iraq */ - WICED_COUNTRY_IRELAND = MK_CNTRY( 'I', 'E', 0 ), /* IE Ireland */ - WICED_COUNTRY_ISRAEL = MK_CNTRY( 'I', 'L', 0 ), /* IL Israel */ - WICED_COUNTRY_ITALY = MK_CNTRY( 'I', 'T', 0 ), /* IT Italy */ - WICED_COUNTRY_JAMAICA = MK_CNTRY( 'J', 'M', 0 ), /* JM Jamaica */ - WICED_COUNTRY_JAPAN = MK_CNTRY( 'J', 'P', 0 ), /* JP Japan */ - WICED_COUNTRY_JERSEY = MK_CNTRY( 'J', 'E', 0 ), /* JE Jersey */ - WICED_COUNTRY_JORDAN = MK_CNTRY( 'J', 'O', 0 ), /* JO Jordan */ - WICED_COUNTRY_KAZAKHSTAN = MK_CNTRY( 'K', 'Z', 0 ), /* KZ Kazakhstan */ - WICED_COUNTRY_KENYA = MK_CNTRY( 'K', 'E', 0 ), /* KE Kenya */ - WICED_COUNTRY_KIRIBATI = MK_CNTRY( 'K', 'I', 0 ), /* KI Kiribati */ - WICED_COUNTRY_KOREA_REPUBLIC_OF = MK_CNTRY( 'K', 'R', 1 ), /* KR Korea,_Republic_Of */ - WICED_COUNTRY_KOSOVO = MK_CNTRY( '0', 'A', 0 ), /* 0A Kosovo */ - WICED_COUNTRY_KUWAIT = MK_CNTRY( 'K', 'W', 0 ), /* KW Kuwait */ - WICED_COUNTRY_KYRGYZSTAN = MK_CNTRY( 'K', 'G', 0 ), /* KG Kyrgyzstan */ - WICED_COUNTRY_LAO_PEOPLES_DEMOCRATIC_REPUBIC = MK_CNTRY( 'L', 'A', 0 ), /* LA Lao_People's_Democratic_Repubic */ - WICED_COUNTRY_LATVIA = MK_CNTRY( 'L', 'V', 0 ), /* LV Latvia */ - WICED_COUNTRY_LEBANON = MK_CNTRY( 'L', 'B', 0 ), /* LB Lebanon */ - WICED_COUNTRY_LESOTHO = MK_CNTRY( 'L', 'S', 0 ), /* LS Lesotho */ - WICED_COUNTRY_LIBERIA = MK_CNTRY( 'L', 'R', 0 ), /* LR Liberia */ - WICED_COUNTRY_LIBYAN_ARAB_JAMAHIRIYA = MK_CNTRY( 'L', 'Y', 0 ), /* LY Libyan_Arab_Jamahiriya */ - WICED_COUNTRY_LIECHTENSTEIN = MK_CNTRY( 'L', 'I', 0 ), /* LI Liechtenstein */ - WICED_COUNTRY_LITHUANIA = MK_CNTRY( 'L', 'T', 0 ), /* LT Lithuania */ - WICED_COUNTRY_LUXEMBOURG = MK_CNTRY( 'L', 'U', 0 ), /* LU Luxembourg */ - WICED_COUNTRY_MACAO = MK_CNTRY( 'M', 'O', 0 ), /* MO Macao */ - WICED_COUNTRY_MACEDONIA_FORMER_YUGOSLAV_REPUBLIC_OF = MK_CNTRY( 'M', 'K', 0 ), /* MK Macedonia,_Former_Yugoslav_Republic_Of */ - WICED_COUNTRY_MADAGASCAR = MK_CNTRY( 'M', 'G', 0 ), /* MG Madagascar */ - WICED_COUNTRY_MALAWI = MK_CNTRY( 'M', 'W', 0 ), /* MW Malawi */ - WICED_COUNTRY_MALAYSIA = MK_CNTRY( 'M', 'Y', 0 ), /* MY Malaysia */ - WICED_COUNTRY_MALDIVES = MK_CNTRY( 'M', 'V', 0 ), /* MV Maldives */ - WICED_COUNTRY_MALI = MK_CNTRY( 'M', 'L', 0 ), /* ML Mali */ - WICED_COUNTRY_MALTA = MK_CNTRY( 'M', 'T', 0 ), /* MT Malta */ - WICED_COUNTRY_MAN_ISLE_OF = MK_CNTRY( 'I', 'M', 0 ), /* IM Man,_Isle_Of */ - WICED_COUNTRY_MARTINIQUE = MK_CNTRY( 'M', 'Q', 0 ), /* MQ Martinique */ - WICED_COUNTRY_MAURITANIA = MK_CNTRY( 'M', 'R', 0 ), /* MR Mauritania */ - WICED_COUNTRY_MAURITIUS = MK_CNTRY( 'M', 'U', 0 ), /* MU Mauritius */ - WICED_COUNTRY_MAYOTTE = MK_CNTRY( 'Y', 'T', 0 ), /* YT Mayotte */ - WICED_COUNTRY_MEXICO = MK_CNTRY( 'M', 'X', 0 ), /* MX Mexico */ - WICED_COUNTRY_MICRONESIA_FEDERATED_STATES_OF = MK_CNTRY( 'F', 'M', 0 ), /* FM Micronesia,_Federated_States_Of */ - WICED_COUNTRY_MOLDOVA_REPUBLIC_OF = MK_CNTRY( 'M', 'D', 0 ), /* MD Moldova,_Republic_Of */ - WICED_COUNTRY_MONACO = MK_CNTRY( 'M', 'C', 0 ), /* MC Monaco */ - WICED_COUNTRY_MONGOLIA = MK_CNTRY( 'M', 'N', 0 ), /* MN Mongolia */ - WICED_COUNTRY_MONTENEGRO = MK_CNTRY( 'M', 'E', 0 ), /* ME Montenegro */ - WICED_COUNTRY_MONTSERRAT = MK_CNTRY( 'M', 'S', 0 ), /* MS Montserrat */ - WICED_COUNTRY_MOROCCO = MK_CNTRY( 'M', 'A', 0 ), /* MA Morocco */ - WICED_COUNTRY_MOZAMBIQUE = MK_CNTRY( 'M', 'Z', 0 ), /* MZ Mozambique */ - WICED_COUNTRY_MYANMAR = MK_CNTRY( 'M', 'M', 0 ), /* MM Myanmar */ - WICED_COUNTRY_NAMIBIA = MK_CNTRY( 'N', 'A', 0 ), /* NA Namibia */ - WICED_COUNTRY_NAURU = MK_CNTRY( 'N', 'R', 0 ), /* NR Nauru */ - WICED_COUNTRY_NEPAL = MK_CNTRY( 'N', 'P', 0 ), /* NP Nepal */ - WICED_COUNTRY_NETHERLANDS = MK_CNTRY( 'N', 'L', 0 ), /* NL Netherlands */ - WICED_COUNTRY_NETHERLANDS_ANTILLES = MK_CNTRY( 'A', 'N', 0 ), /* AN Netherlands_Antilles */ - WICED_COUNTRY_NEW_CALEDONIA = MK_CNTRY( 'N', 'C', 0 ), /* NC New_Caledonia */ - WICED_COUNTRY_NEW_ZEALAND = MK_CNTRY( 'N', 'Z', 0 ), /* NZ New_Zealand */ - WICED_COUNTRY_NICARAGUA = MK_CNTRY( 'N', 'I', 0 ), /* NI Nicaragua */ - WICED_COUNTRY_NIGER = MK_CNTRY( 'N', 'E', 0 ), /* NE Niger */ - WICED_COUNTRY_NIGERIA = MK_CNTRY( 'N', 'G', 0 ), /* NG Nigeria */ - WICED_COUNTRY_NORFOLK_ISLAND = MK_CNTRY( 'N', 'F', 0 ), /* NF Norfolk_Island */ - WICED_COUNTRY_NORTHERN_MARIANA_ISLANDS = MK_CNTRY( 'M', 'P', 0 ), /* MP Northern_Mariana_Islands */ - WICED_COUNTRY_NORWAY = MK_CNTRY( 'N', 'O', 0 ), /* NO Norway */ - WICED_COUNTRY_OMAN = MK_CNTRY( 'O', 'M', 0 ), /* OM Oman */ - WICED_COUNTRY_PAKISTAN = MK_CNTRY( 'P', 'K', 0 ), /* PK Pakistan */ - WICED_COUNTRY_PALAU = MK_CNTRY( 'P', 'W', 0 ), /* PW Palau */ - WICED_COUNTRY_PANAMA = MK_CNTRY( 'P', 'A', 0 ), /* PA Panama */ - WICED_COUNTRY_PAPUA_NEW_GUINEA = MK_CNTRY( 'P', 'G', 0 ), /* PG Papua_New_Guinea */ - WICED_COUNTRY_PARAGUAY = MK_CNTRY( 'P', 'Y', 0 ), /* PY Paraguay */ - WICED_COUNTRY_PERU = MK_CNTRY( 'P', 'E', 0 ), /* PE Peru */ - WICED_COUNTRY_PHILIPPINES = MK_CNTRY( 'P', 'H', 0 ), /* PH Philippines */ - WICED_COUNTRY_POLAND = MK_CNTRY( 'P', 'L', 0 ), /* PL Poland */ - WICED_COUNTRY_PORTUGAL = MK_CNTRY( 'P', 'T', 0 ), /* PT Portugal */ - WICED_COUNTRY_PUETO_RICO = MK_CNTRY( 'P', 'R', 0 ), /* PR Pueto_Rico */ - WICED_COUNTRY_QATAR = MK_CNTRY( 'Q', 'A', 0 ), /* QA Qatar */ - WICED_COUNTRY_REUNION = MK_CNTRY( 'R', 'E', 0 ), /* RE Reunion */ - WICED_COUNTRY_ROMANIA = MK_CNTRY( 'R', 'O', 0 ), /* RO Romania */ - WICED_COUNTRY_RUSSIAN_FEDERATION = MK_CNTRY( 'R', 'U', 0 ), /* RU Russian_Federation */ - WICED_COUNTRY_RWANDA = MK_CNTRY( 'R', 'W', 0 ), /* RW Rwanda */ - WICED_COUNTRY_SAINT_KITTS_AND_NEVIS = MK_CNTRY( 'K', 'N', 0 ), /* KN Saint_Kitts_and_Nevis */ - WICED_COUNTRY_SAINT_LUCIA = MK_CNTRY( 'L', 'C', 0 ), /* LC Saint_Lucia */ - WICED_COUNTRY_SAINT_PIERRE_AND_MIQUELON = MK_CNTRY( 'P', 'M', 0 ), /* PM Saint_Pierre_and_Miquelon */ - WICED_COUNTRY_SAINT_VINCENT_AND_THE_GRENADINES = MK_CNTRY( 'V', 'C', 0 ), /* VC Saint_Vincent_and_The_Grenadines */ - WICED_COUNTRY_SAMOA = MK_CNTRY( 'W', 'S', 0 ), /* WS Samoa */ - WICED_COUNTRY_SANIT_MARTIN_SINT_MARTEEN = MK_CNTRY( 'M', 'F', 0 ), /* MF Sanit_Martin_/_Sint_Marteen */ - WICED_COUNTRY_SAO_TOME_AND_PRINCIPE = MK_CNTRY( 'S', 'T', 0 ), /* ST Sao_Tome_and_Principe */ - WICED_COUNTRY_SAUDI_ARABIA = MK_CNTRY( 'S', 'A', 0 ), /* SA Saudi_Arabia */ - WICED_COUNTRY_SENEGAL = MK_CNTRY( 'S', 'N', 0 ), /* SN Senegal */ - WICED_COUNTRY_SERBIA = MK_CNTRY( 'R', 'S', 0 ), /* RS Serbia */ - WICED_COUNTRY_SEYCHELLES = MK_CNTRY( 'S', 'C', 0 ), /* SC Seychelles */ - WICED_COUNTRY_SIERRA_LEONE = MK_CNTRY( 'S', 'L', 0 ), /* SL Sierra_Leone */ - WICED_COUNTRY_SINGAPORE = MK_CNTRY( 'S', 'G', 0 ), /* SG Singapore */ - WICED_COUNTRY_SLOVAKIA = MK_CNTRY( 'S', 'K', 0 ), /* SK Slovakia */ - WICED_COUNTRY_SLOVENIA = MK_CNTRY( 'S', 'I', 0 ), /* SI Slovenia */ - WICED_COUNTRY_SOLOMON_ISLANDS = MK_CNTRY( 'S', 'B', 0 ), /* SB Solomon_Islands */ - WICED_COUNTRY_SOMALIA = MK_CNTRY( 'S', 'O', 0 ), /* SO Somalia */ - WICED_COUNTRY_SOUTH_AFRICA = MK_CNTRY( 'Z', 'A', 0 ), /* ZA South_Africa */ - WICED_COUNTRY_SPAIN = MK_CNTRY( 'E', 'S', 0 ), /* ES Spain */ - WICED_COUNTRY_SRI_LANKA = MK_CNTRY( 'L', 'K', 0 ), /* LK Sri_Lanka */ - WICED_COUNTRY_SURINAME = MK_CNTRY( 'S', 'R', 0 ), /* SR Suriname */ - WICED_COUNTRY_SWAZILAND = MK_CNTRY( 'S', 'Z', 0 ), /* SZ Swaziland */ - WICED_COUNTRY_SWEDEN = MK_CNTRY( 'S', 'E', 0 ), /* SE Sweden */ - WICED_COUNTRY_SWITZERLAND = MK_CNTRY( 'C', 'H', 0 ), /* CH Switzerland */ - WICED_COUNTRY_SYRIAN_ARAB_REPUBLIC = MK_CNTRY( 'S', 'Y', 0 ), /* SY Syrian_Arab_Republic */ - WICED_COUNTRY_TAIWAN_PROVINCE_OF_CHINA = MK_CNTRY( 'T', 'W', 0 ), /* TW Taiwan,_Province_Of_China */ - WICED_COUNTRY_TAJIKISTAN = MK_CNTRY( 'T', 'J', 0 ), /* TJ Tajikistan */ - WICED_COUNTRY_TANZANIA_UNITED_REPUBLIC_OF = MK_CNTRY( 'T', 'Z', 0 ), /* TZ Tanzania,_United_Republic_Of */ - WICED_COUNTRY_THAILAND = MK_CNTRY( 'T', 'H', 0 ), /* TH Thailand */ - WICED_COUNTRY_TOGO = MK_CNTRY( 'T', 'G', 0 ), /* TG Togo */ - WICED_COUNTRY_TONGA = MK_CNTRY( 'T', 'O', 0 ), /* TO Tonga */ - WICED_COUNTRY_TRINIDAD_AND_TOBAGO = MK_CNTRY( 'T', 'T', 0 ), /* TT Trinidad_and_Tobago */ - WICED_COUNTRY_TUNISIA = MK_CNTRY( 'T', 'N', 0 ), /* TN Tunisia */ - WICED_COUNTRY_TURKEY = MK_CNTRY( 'T', 'R', 0 ), /* TR Turkey */ - WICED_COUNTRY_TURKMENISTAN = MK_CNTRY( 'T', 'M', 0 ), /* TM Turkmenistan */ - WICED_COUNTRY_TURKS_AND_CAICOS_ISLANDS = MK_CNTRY( 'T', 'C', 0 ), /* TC Turks_and_Caicos_Islands */ - WICED_COUNTRY_TUVALU = MK_CNTRY( 'T', 'V', 0 ), /* TV Tuvalu */ - WICED_COUNTRY_UGANDA = MK_CNTRY( 'U', 'G', 0 ), /* UG Uganda */ - WICED_COUNTRY_UKRAINE = MK_CNTRY( 'U', 'A', 0 ), /* UA Ukraine */ - WICED_COUNTRY_UNITED_ARAB_EMIRATES = MK_CNTRY( 'A', 'E', 0 ), /* AE United_Arab_Emirates */ - WICED_COUNTRY_UNITED_KINGDOM = MK_CNTRY( 'G', 'B', 0 ), /* GB United_Kingdom */ - WICED_COUNTRY_UNITED_STATES = MK_CNTRY( 'U', 'S', 0 ), /* US United_States */ - WICED_COUNTRY_UNITED_STATES_REV4 = MK_CNTRY( 'U', 'S', 4 ), /* US United_States Revision 4 */ - WICED_COUNTRY_UNITED_STATES_REV931 = MK_CNTRY( 'Q', '1', 931 ), /* Q1 United_States Revision 931 */ - WICED_COUNTRY_UNITED_STATES_NO_DFS = MK_CNTRY( 'Q', '2', 0 ), /* Q2 United_States_(No_DFS) */ - WICED_COUNTRY_UNITED_STATES_MINOR_OUTLYING_ISLANDS = MK_CNTRY( 'U', 'M', 0 ), /* UM United_States_Minor_Outlying_Islands */ - WICED_COUNTRY_URUGUAY = MK_CNTRY( 'U', 'Y', 0 ), /* UY Uruguay */ - WICED_COUNTRY_UZBEKISTAN = MK_CNTRY( 'U', 'Z', 0 ), /* UZ Uzbekistan */ - WICED_COUNTRY_VANUATU = MK_CNTRY( 'V', 'U', 0 ), /* VU Vanuatu */ - WICED_COUNTRY_VENEZUELA = MK_CNTRY( 'V', 'E', 0 ), /* VE Venezuela */ - WICED_COUNTRY_VIET_NAM = MK_CNTRY( 'V', 'N', 0 ), /* VN Viet_Nam */ - WICED_COUNTRY_VIRGIN_ISLANDS_BRITISH = MK_CNTRY( 'V', 'G', 0 ), /* VG Virgin_Islands,_British */ - WICED_COUNTRY_VIRGIN_ISLANDS_US = MK_CNTRY( 'V', 'I', 0 ), /* VI Virgin_Islands,_U.S. */ - WICED_COUNTRY_WALLIS_AND_FUTUNA = MK_CNTRY( 'W', 'F', 0 ), /* WF Wallis_and_Futuna */ - WICED_COUNTRY_WEST_BANK = MK_CNTRY( '0', 'C', 0 ), /* 0C West_Bank */ - WICED_COUNTRY_WESTERN_SAHARA = MK_CNTRY( 'E', 'H', 0 ), /* EH Western_Sahara */ - WICED_COUNTRY_WORLD_WIDE_XV_REV983 = MK_CNTRY( 'X', 'V', 983 ), /* Worldwide Locale Revision 983 */ - WICED_COUNTRY_WORLD_WIDE_XX = MK_CNTRY( 'X', 'X', 0 ), /* Worldwide Locale (passive Ch12-14) */ - WICED_COUNTRY_WORLD_WIDE_XX_REV17 = MK_CNTRY( 'X', 'X', 17 ), /* Worldwide Locale (passive Ch12-14) Revision 17 */ - WICED_COUNTRY_YEMEN = MK_CNTRY( 'Y', 'E', 0 ), /* YE Yemen */ - WICED_COUNTRY_ZAMBIA = MK_CNTRY( 'Z', 'M', 0 ), /* ZM Zambia */ - WICED_COUNTRY_ZIMBABWE = MK_CNTRY( 'Z', 'W', 0 ), /* ZW Zimbabwe */ -} wiced_country_code_t; - -/* WICED Radio Resource Management Report Types */ -typedef enum -{ - WICED_RRM_CHLOAD_REPORT = 0, - WICED_RRM_NBR_LIST_REPORT, - WICED_RRM_BCN_REPORT, - WICED_LM_REPORT -} wwd_rrm_report_type_t; - -/** @endcond */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif -#endif /* ifndef INCLUDED_WWD_CONSTANTS_H_ */ diff --git a/components/WWD/WWD/include/wwd_eapol.h b/components/WWD/WWD/include/wwd_eapol.h deleted file mode 100644 index 2dd3d927e9d2eed54dec49a9b558d2d21ba75ede..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/wwd_eapol.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#pragma once - -#include "wwd_buffer.h" -#include "wwd_constants.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * Macros - ******************************************************/ - -/****************************************************** - * Constants - ******************************************************/ - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Type Definitions - ******************************************************/ - -typedef wiced_buffer_t wwd_eapol_packet_t; - -typedef void (*eapol_packet_handler_t) (wiced_buffer_t buffer, wwd_interface_t interface); - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Global Variables - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - -extern wwd_result_t wwd_eapol_register_receive_handler ( eapol_packet_handler_t eapol_packet_handler ); -extern void wwd_eapol_unregister_receive_handler( void ); -extern void wwd_eapol_receive_eapol_packet( /*@only@*/ wiced_buffer_t buffer, wwd_interface_t interface ); -extern uint8_t* wwd_eapol_get_eapol_data( wwd_eapol_packet_t packet ); -extern uint16_t wwd_get_eapol_packet_size( wwd_eapol_packet_t packet ); - -#ifdef __cplusplus -} /*extern "C" */ -#endif diff --git a/components/WWD/WWD/include/wwd_events.h b/components/WWD/WWD/include/wwd_events.h deleted file mode 100644 index 2db929ea64d0d40489952cdf5a780f5fd46003e7..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/wwd_events.h +++ /dev/null @@ -1,472 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Header for Event detection - * - * Provides constants and prototypes for functions that allow both - * Wiced and user applications to receive event callbacks. - */ - -#ifndef INCLUDED_WWD_EVENTS_H -#define INCLUDED_WWD_EVENTS_H - -#include "wwd_structures.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/****************************************************** - * @cond Typedefs - ******************************************************/ - -/** - * Enumerated list of event types - */ -typedef enum -{ - WLC_E_NONE = -1, - WLC_E_SET_SSID = 0 /** indicates status of set SSID */, - WLC_E_JOIN = 1, /** differentiates join IBSS from found (WLC_E_START) IBSS */ - WLC_E_START = 2, /** STA founded an IBSS or AP started a BSS */ - WLC_E_AUTH = 3, /** 802.11 AUTH request */ - WLC_E_AUTH_IND = 4, /** 802.11 AUTH indication */ - WLC_E_DEAUTH = 5, /** 802.11 DEAUTH request */ - WLC_E_DEAUTH_IND = 6, /** 802.11 DEAUTH indication */ - WLC_E_ASSOC = 7, /** 802.11 ASSOC request */ - WLC_E_ASSOC_IND = 8, /** 802.11 ASSOC indication */ - WLC_E_REASSOC = 9, /** 802.11 REASSOC request */ - WLC_E_REASSOC_IND = 10, /** 802.11 REASSOC indication */ - WLC_E_DISASSOC = 11, /** 802.11 DISASSOC request */ - WLC_E_DISASSOC_IND = 12, /** 802.11 DISASSOC indication */ - WLC_E_QUIET_START = 13, /** 802.11h Quiet period started */ - WLC_E_QUIET_END = 14, /** 802.11h Quiet period ended */ - WLC_E_BEACON_RX = 15, /** BEACONS received/lost indication */ - WLC_E_LINK = 16, /** generic link indication */ - WLC_E_MIC_ERROR = 17, /** TKIP MIC error occurred */ - WLC_E_NDIS_LINK = 18, /** NDIS style link indication */ - WLC_E_ROAM = 19, /** roam attempt occurred: indicate status & reason */ - WLC_E_TXFAIL = 20, /** change in dot11FailedCount (txfail) */ - WLC_E_PMKID_CACHE = 21, /** WPA2 pmkid cache indication */ - WLC_E_RETROGRADE_TSF = 22, /** current AP's TSF value went backward */ - WLC_E_PRUNE = 23, /** AP was pruned from join list for reason */ - WLC_E_AUTOAUTH = 24, /** report AutoAuth table entry match for join attempt */ - WLC_E_EAPOL_MSG = 25, /** Event encapsulating an EAPOL message */ - WLC_E_SCAN_COMPLETE = 26, /** Scan results are ready or scan was aborted */ - WLC_E_ADDTS_IND = 27, /** indicate to host addts fail/success */ - WLC_E_DELTS_IND = 28, /** indicate to host delts fail/success */ - WLC_E_BCNSENT_IND = 29, /** indicate to host of beacon transmit */ - WLC_E_BCNRX_MSG = 30, /** Send the received beacon up to the host */ - WLC_E_BCNLOST_MSG = 31, /** indicate to host loss of beacon */ - WLC_E_ROAM_PREP = 32, /** before attempting to roam */ - WLC_E_PFN_NET_FOUND = 33, /** PFN network found event */ - WLC_E_PFN_NET_LOST = 34, /** PFN network lost event */ - WLC_E_RESET_COMPLETE = 35, - WLC_E_JOIN_START = 36, - WLC_E_ROAM_START = 37, - WLC_E_ASSOC_START = 38, - WLC_E_IBSS_ASSOC = 39, - WLC_E_RADIO = 40, - WLC_E_PSM_WATCHDOG = 41, /** PSM microcode watchdog fired */ - WLC_E_CCX_ASSOC_START = 42, /** CCX association start */ - WLC_E_CCX_ASSOC_ABORT = 43, /** CCX association abort */ - WLC_E_PROBREQ_MSG = 44, /** probe request received */ - WLC_E_SCAN_CONFIRM_IND = 45, - WLC_E_PSK_SUP = 46, /** WPA Handshake */ - WLC_E_COUNTRY_CODE_CHANGED = 47, - WLC_E_EXCEEDED_MEDIUM_TIME = 48, /** WMMAC excedded medium time */ - WLC_E_ICV_ERROR = 49, /** WEP ICV error occurred */ - WLC_E_UNICAST_DECODE_ERROR = 50, /** Unsupported unicast encrypted frame */ - WLC_E_MULTICAST_DECODE_ERROR = 51, /** Unsupported multicast encrypted frame */ - WLC_E_TRACE = 52, - WLC_E_BTA_HCI_EVENT = 53, /** BT-AMP HCI event */ - WLC_E_IF = 54, /** I/F change (for wlan host notification) */ - WLC_E_P2P_DISC_LISTEN_COMPLETE = 55, /** P2P Discovery listen state expires */ - WLC_E_RSSI = 56, /** indicate RSSI change based on configured levels */ - WLC_E_PFN_BEST_BATCHING = 57, /** PFN best network batching event */ - WLC_E_EXTLOG_MSG = 58, - WLC_E_ACTION_FRAME = 59, /** Action frame reception */ - WLC_E_ACTION_FRAME_COMPLETE = 60, /** Action frame Tx complete */ - WLC_E_PRE_ASSOC_IND = 61, /** assoc request received */ - WLC_E_PRE_REASSOC_IND = 62, /** re-assoc request received */ - WLC_E_CHANNEL_ADOPTED = 63, /** channel adopted (xxx: obsoleted) */ - WLC_E_AP_STARTED = 64, /** AP started */ - WLC_E_DFS_AP_STOP = 65, /** AP stopped due to DFS */ - WLC_E_DFS_AP_RESUME = 66, /** AP resumed due to DFS */ - WLC_E_WAI_STA_EVENT = 67, /** WAI stations event */ - WLC_E_WAI_MSG = 68, /** event encapsulating an WAI message */ - WLC_E_ESCAN_RESULT = 69, /** escan result event */ - WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE = 70, /** action frame off channel complete */ /* NOTE - This used to be WLC_E_WAKE_EVENT */ - WLC_E_PROBRESP_MSG = 71, /** probe response received */ - WLC_E_P2P_PROBREQ_MSG = 72, /** P2P Probe request received */ - WLC_E_DCS_REQUEST = 73, - WLC_E_FIFO_CREDIT_MAP = 74, /** credits for D11 FIFOs. [AC0,AC1,AC2,AC3,BC_MC,ATIM] */ - WLC_E_ACTION_FRAME_RX = 75, /** Received action frame event WITH wl_event_rx_frame_data_t header */ - WLC_E_WAKE_EVENT = 76, /** Wake Event timer fired, used for wake WLAN test mode */ - WLC_E_RM_COMPLETE = 77, /** Radio measurement complete */ - WLC_E_HTSFSYNC = 78, /** Synchronize TSF with the host */ - WLC_E_OVERLAY_REQ = 79, /** request an overlay IOCTL/iovar from the host */ - WLC_E_CSA_COMPLETE_IND = 80, - WLC_E_EXCESS_PM_WAKE_EVENT = 81, /** excess PM Wake Event to inform host */ - WLC_E_PFN_SCAN_NONE = 82, /** no PFN networks around */ - WLC_E_PFN_SCAN_ALLGONE = 83, /** last found PFN network gets lost */ - WLC_E_GTK_PLUMBED = 84, - WLC_E_ASSOC_IND_NDIS = 85, /** 802.11 ASSOC indication for NDIS only */ - WLC_E_REASSOC_IND_NDIS = 86, /** 802.11 REASSOC indication for NDIS only */ - WLC_E_ASSOC_REQ_IE = 87, - WLC_E_ASSOC_RESP_IE = 88, - WLC_E_ASSOC_RECREATED = 89, /** association recreated on resume */ - WLC_E_ACTION_FRAME_RX_NDIS = 90, /** rx action frame event for NDIS only */ - WLC_E_AUTH_REQ = 91, /** authentication request received */ - WLC_E_TDLS_PEER_EVENT = 92, /** discovered peer, connected/disconnected peer */ - WLC_E_SPEEDY_RECREATE_FAIL = 93, /** fast assoc recreation failed */ - WLC_E_NATIVE = 94, /** port-specific event and payload (e.g. NDIS) */ - WLC_E_PKTDELAY_IND = 95, /** event for tx pkt delay suddently jump */ - WLC_E_AWDL_AW = 96, /** AWDL AW period starts */ - WLC_E_AWDL_ROLE = 97, /** AWDL Master/Slave/NE master role event */ - WLC_E_AWDL_EVENT = 98, /** Generic AWDL event */ - WLC_E_NIC_AF_TXS = 99, /** NIC AF txstatus */ - WLC_E_NIC_NIC_REPORT = 100, /** NIC period report */ - WLC_E_BEACON_FRAME_RX = 101, - WLC_E_SERVICE_FOUND = 102, /** desired service found */ - WLC_E_GAS_FRAGMENT_RX = 103, /** GAS fragment received */ - WLC_E_GAS_COMPLETE = 104, /** GAS sessions all complete */ - WLC_E_P2PO_ADD_DEVICE = 105, /** New device found by p2p offload */ - WLC_E_P2PO_DEL_DEVICE = 106, /** device has been removed by p2p offload */ - WLC_E_WNM_STA_SLEEP = 107, /** WNM event to notify STA enter sleep mode */ - WLC_E_TXFAIL_THRESH = 108, /** Indication of MAC tx failures (exhaustion of 802.11 retries) exceeding threshold(s) */ - WLC_E_PROXD = 109, /** Proximity Detection event */ - WLC_E_IBSS_COALESCE = 110, /** IBSS Coalescing */ - WLC_E_AWDL_RX_PRB_RESP = 111, /** AWDL RX Probe response */ - WLC_E_AWDL_RX_ACT_FRAME = 112, /** AWDL RX Action Frames */ - WLC_E_AWDL_WOWL_NULLPKT = 113, /** AWDL Wowl nulls */ - WLC_E_AWDL_PHYCAL_STATUS = 114, /** AWDL Phycal status */ - WLC_E_AWDL_OOB_AF_STATUS = 115, /** AWDL OOB AF status */ - WLC_E_AWDL_SCAN_STATUS = 116, /** Interleaved Scan status */ - WLC_E_AWDL_AW_START = 117, /** AWDL AW Start */ - WLC_E_AWDL_AW_END = 118, /** AWDL AW End */ - WLC_E_AWDL_AW_EXT = 119, /** AWDL AW Extensions */ - WLC_E_AWDL_PEER_CACHE_CONTROL = 120, - WLC_E_CSA_START_IND = 121, - WLC_E_CSA_DONE_IND = 122, - WLC_E_CSA_FAILURE_IND = 123, - WLC_E_CCA_CHAN_QUAL = 124, /** CCA based channel quality report */ - WLC_E_BSSID = 125, /** to report change in BSSID while roaming */ - WLC_E_TX_STAT_ERROR = 126, /** tx error indication */ - WLC_E_BCMC_CREDIT_SUPPORT = 127, /** credit check for BCMC supported */ - WLC_E_PSTA_PRIMARY_INTF_IND = 128, /** psta primary interface indication */ - WLC_E_BT_WIFI_HANDOVER_REQ = 130, /* Handover Request Initiated */ - WLC_E_SPW_TXINHIBIT = 131, /* Southpaw TxInhibit notification */ - WLC_E_FBT_AUTH_REQ_IND = 132, /* FBT Authentication Request Indication */ - WLC_E_RSSI_LQM = 133, /* Enhancement addition for WLC_E_RSSI */ - WLC_E_PFN_GSCAN_FULL_RESULT = 134, /* Full probe/beacon (IEs etc) results */ - WLC_E_PFN_SWC = 135, /* Significant change in rssi of bssids being tracked */ - WLC_E_AUTHORIZED = 136, /* a STA been authroized for traffic */ - WLC_E_PROBREQ_MSG_RX = 137, /* probe req with wl_event_rx_frame_data_t header */ - WLC_E_PFN_SCAN_COMPLETE = 138, /* PFN completed scan of network list */ - WLC_E_RMC_EVENT = 139, /* RMC Event */ - WLC_E_DPSTA_INTF_IND = 140, /* DPSTA interface indication */ - WLC_E_RRM = 141, /* RRM Event */ - - WLC_E_LAST = 142, /** highest val + 1 for range checking */ - WLC_E_FORCE_32_BIT = 0x7FFFFFFE /** Force enum to be stored in 32 bit variable */ -} wwd_event_num_t; - - -#define WLC_SUP_STATUS_OFFSET (256) -#define WLC_DOT11_SC_STATUS_OFFSET (512) -/** - * Enumerated list of event status codes - * @note : WLC_SUP values overlap other values, so it is necessary - * to check the event type - */ -typedef enum -{ - WLC_E_STATUS_SUCCESS = 0, /** operation was successful */ - WLC_E_STATUS_FAIL = 1, /** operation failed */ - WLC_E_STATUS_TIMEOUT = 2, /** operation timed out */ - WLC_E_STATUS_NO_NETWORKS = 3, /** failed due to no matching network found */ - WLC_E_STATUS_ABORT = 4, /** operation was aborted */ - WLC_E_STATUS_NO_ACK = 5, /** protocol failure: packet not ack'd */ - WLC_E_STATUS_UNSOLICITED = 6, /** AUTH or ASSOC packet was unsolicited */ - WLC_E_STATUS_ATTEMPT = 7, /** attempt to assoc to an auto auth configuration */ - WLC_E_STATUS_PARTIAL = 8, /** scan results are incomplete */ - WLC_E_STATUS_NEWSCAN = 9, /** scan aborted by another scan */ - WLC_E_STATUS_NEWASSOC = 10, /** scan aborted due to assoc in progress */ - WLC_E_STATUS_11HQUIET = 11, /** 802.11h quiet period started */ - WLC_E_STATUS_SUPPRESS = 12, /** user disabled scanning (WLC_SET_SCANSUPPRESS) */ - WLC_E_STATUS_NOCHANS = 13, /** no allowable channels to scan */ - WLC_E_STATUS_CCXFASTRM = 14, /** scan aborted due to CCX fast roam */ - WLC_E_STATUS_CS_ABORT = 15, /** abort channel select */ - - /* for WLC_SUP messages */ - WLC_SUP_DISCONNECTED = 0 + WLC_SUP_STATUS_OFFSET, - WLC_SUP_CONNECTING = 1 + WLC_SUP_STATUS_OFFSET, - WLC_SUP_IDREQUIRED = 2 + WLC_SUP_STATUS_OFFSET, - WLC_SUP_AUTHENTICATING = 3 + WLC_SUP_STATUS_OFFSET, - WLC_SUP_AUTHENTICATED = 4 + WLC_SUP_STATUS_OFFSET, - WLC_SUP_KEYXCHANGE = 5 + WLC_SUP_STATUS_OFFSET, - WLC_SUP_KEYED = 6 + WLC_SUP_STATUS_OFFSET, - WLC_SUP_TIMEOUT = 7 + WLC_SUP_STATUS_OFFSET, - WLC_SUP_LAST_BASIC_STATE = 8 + WLC_SUP_STATUS_OFFSET, - /* Extended supplicant authentication states */ - WLC_SUP_KEYXCHANGE_WAIT_M1 = WLC_SUP_AUTHENTICATED, /** Waiting to receive handshake msg M1 */ - WLC_SUP_KEYXCHANGE_PREP_M2 = WLC_SUP_KEYXCHANGE, /** Preparing to send handshake msg M2 */ - WLC_SUP_KEYXCHANGE_WAIT_M3 = WLC_SUP_LAST_BASIC_STATE, /** Waiting to receive handshake msg M3 */ - WLC_SUP_KEYXCHANGE_PREP_M4 = 9 + WLC_SUP_STATUS_OFFSET, /** Preparing to send handshake msg M4 */ - WLC_SUP_KEYXCHANGE_WAIT_G1 = 10 + WLC_SUP_STATUS_OFFSET, /** Waiting to receive handshake msg G1 */ - WLC_SUP_KEYXCHANGE_PREP_G2 = 11 + WLC_SUP_STATUS_OFFSET, /** Preparing to send handshake msg G2 */ - - WLC_DOT11_SC_SUCCESS = 0 + WLC_DOT11_SC_STATUS_OFFSET, /* Successful */ - WLC_DOT11_SC_FAILURE = 1 + WLC_DOT11_SC_STATUS_OFFSET, /* Unspecified failure */ - WLC_DOT11_SC_CAP_MISMATCH = 10 + WLC_DOT11_SC_STATUS_OFFSET, /* Cannot support all requested capabilities in the Capability Information field */ - WLC_DOT11_SC_REASSOC_FAIL = 11 + WLC_DOT11_SC_STATUS_OFFSET, /* Reassociation denied due to inability to confirm that association exists */ - WLC_DOT11_SC_ASSOC_FAIL = 12 + WLC_DOT11_SC_STATUS_OFFSET, /* Association denied due to reason outside the scope of this standard */ - WLC_DOT11_SC_AUTH_MISMATCH = 13 + WLC_DOT11_SC_STATUS_OFFSET, /* Responding station does not support the specified authentication algorithm */ - WLC_DOT11_SC_AUTH_SEQ = 14 + WLC_DOT11_SC_STATUS_OFFSET, /* Received an Authentication frame with authentication transaction sequence number out of expected sequence */ - WLC_DOT11_SC_AUTH_CHALLENGE_FAIL = 15 + WLC_DOT11_SC_STATUS_OFFSET, /* Authentication rejected because of challenge failure */ - WLC_DOT11_SC_AUTH_TIMEOUT = 16 + WLC_DOT11_SC_STATUS_OFFSET, /* Authentication rejected due to timeout waiting for next frame in sequence */ - WLC_DOT11_SC_ASSOC_BUSY_FAIL = 17 + WLC_DOT11_SC_STATUS_OFFSET, /* Association denied because AP is unable to handle additional associated stations */ - WLC_DOT11_SC_ASSOC_RATE_MISMATCH = 18 + WLC_DOT11_SC_STATUS_OFFSET, /* Association denied due to requesting station not supporting all of the data rates in the BSSBasicRateSet parameter */ - WLC_DOT11_SC_ASSOC_SHORT_REQUIRED = 19 + WLC_DOT11_SC_STATUS_OFFSET, /* Association denied due to requesting station not supporting the Short Preamble option */ - WLC_DOT11_SC_ASSOC_PBCC_REQUIRED = 20 + WLC_DOT11_SC_STATUS_OFFSET, /* Association denied due to requesting station not supporting the PBCC Modulation option */ - WLC_DOT11_SC_ASSOC_AGILITY_REQUIRED = 21 + WLC_DOT11_SC_STATUS_OFFSET, /* Association denied due to requesting station not supporting the Channel Agility option */ - WLC_DOT11_SC_ASSOC_SPECTRUM_REQUIRED = 22 + WLC_DOT11_SC_STATUS_OFFSET, /* Association denied because Spectrum Management capability is required. */ - WLC_DOT11_SC_ASSOC_BAD_POWER_CAP = 23 + WLC_DOT11_SC_STATUS_OFFSET, /* Association denied because the info in the Power Cap element is unacceptable. */ - WLC_DOT11_SC_ASSOC_BAD_SUP_CHANNELS = 24 + WLC_DOT11_SC_STATUS_OFFSET, /* Association denied because the info in the Supported Channel element is unacceptable */ - WLC_DOT11_SC_ASSOC_SHORTSLOT_REQUIRED = 25 + WLC_DOT11_SC_STATUS_OFFSET, /* Association denied due to requesting station not supporting the Short Slot Time option */ - WLC_DOT11_SC_ASSOC_ERPBCC_REQUIRED = 26 + WLC_DOT11_SC_STATUS_OFFSET, /* Association denied due to requesting station not supporting the ER-PBCC Modulation option */ - WLC_DOT11_SC_ASSOC_DSSOFDM_REQUIRED = 27 + WLC_DOT11_SC_STATUS_OFFSET, /* Association denied due to requesting station not supporting the DSS-OFDM option */ - WLC_DOT11_SC_DECLINED = 37 + WLC_DOT11_SC_STATUS_OFFSET, /* request declined */ - WLC_DOT11_SC_INVALID_PARAMS = 38 + WLC_DOT11_SC_STATUS_OFFSET, /* One or more params have invalid values */ - WLC_DOT11_SC_INVALID_AKMP = 43 + WLC_DOT11_SC_STATUS_OFFSET, /* Association denied due to invalid AKMP */ - WLC_DOT11_SC_INVALID_MDID = 54 + WLC_DOT11_SC_STATUS_OFFSET, /* Association denied due to invalid MDID */ - WLC_DOT11_SC_INVALID_FTIE = 55 + WLC_DOT11_SC_STATUS_OFFSET, /* Association denied due to invalid FTIE */ - - WLC_E_STATUS_FORCE_32_BIT = 0x7FFFFFFE /** Force enum to be stored in 32 bit variable */ -} wwd_event_status_t; - -#define WLC_E_PRUNE_REASON_OFFSET (256) -#define WLC_E_SUP_REASON_OFFSET (512) -#define WLC_E_DOT11_RC_REASON_OFFSET (768) - - -/** - * Enumerated list of event reason codes - * @note : Several values overlap other values, so it is necessary - * to check the event type - */ -typedef enum -{ - /* roam reason codes */ - WLC_E_REASON_INITIAL_ASSOC = 0, /** initial assoc */ - WLC_E_REASON_LOW_RSSI = 1, /** roamed due to low RSSI */ - WLC_E_REASON_DEAUTH = 2, /** roamed due to DEAUTH indication */ - WLC_E_REASON_DISASSOC = 3, /** roamed due to DISASSOC indication */ - WLC_E_REASON_BCNS_LOST = 4, /** roamed due to lost beacons */ - WLC_E_REASON_FAST_ROAM_FAILED = 5, /** roamed due to fast roam failure */ - WLC_E_REASON_DIRECTED_ROAM = 6, /** roamed due to request by AP */ - WLC_E_REASON_TSPEC_REJECTED = 7, /** roamed due to TSPEC rejection */ - WLC_E_REASON_BETTER_AP = 8, /** roamed due to finding better AP */ - - /* prune reason codes */ - WLC_E_PRUNE_ENCR_MISMATCH = 1 + WLC_E_PRUNE_REASON_OFFSET, /** encryption mismatch */ - WLC_E_PRUNE_BCAST_BSSID = 2 + WLC_E_PRUNE_REASON_OFFSET, /** AP uses a broadcast BSSID */ - WLC_E_PRUNE_MAC_DENY = 3 + WLC_E_PRUNE_REASON_OFFSET, /** STA's MAC addr is in AP's MAC deny list */ - WLC_E_PRUNE_MAC_NA = 4 + WLC_E_PRUNE_REASON_OFFSET, /** STA's MAC addr is not in AP's MAC allow list */ - WLC_E_PRUNE_REG_PASSV = 5 + WLC_E_PRUNE_REASON_OFFSET, /** AP not allowed due to regulatory restriction */ - WLC_E_PRUNE_SPCT_MGMT = 6 + WLC_E_PRUNE_REASON_OFFSET, /** AP does not support STA locale spectrum mgmt */ - WLC_E_PRUNE_RADAR = 7 + WLC_E_PRUNE_REASON_OFFSET, /** AP is on a radar channel of STA locale */ - WLC_E_RSN_MISMATCH = 8 + WLC_E_PRUNE_REASON_OFFSET, /** STA does not support AP's RSN */ - WLC_E_PRUNE_NO_COMMON_RATES = 9 + WLC_E_PRUNE_REASON_OFFSET, /** No rates in common with AP */ - WLC_E_PRUNE_BASIC_RATES = 10 + WLC_E_PRUNE_REASON_OFFSET, /** STA does not support all basic rates of BSS */ - WLC_E_PRUNE_CCXFAST_PREVAP = 11 + WLC_E_PRUNE_REASON_OFFSET, /** CCX FAST ROAM: prune previous AP */ - WLC_E_PRUNE_CIPHER_NA = 12 + WLC_E_PRUNE_REASON_OFFSET, /** BSS's cipher not supported */ - WLC_E_PRUNE_KNOWN_STA = 13 + WLC_E_PRUNE_REASON_OFFSET, /** AP is already known to us as a STA */ - WLC_E_PRUNE_CCXFAST_DROAM = 14 + WLC_E_PRUNE_REASON_OFFSET, /** CCX FAST ROAM: prune unqualified AP */ - WLC_E_PRUNE_WDS_PEER = 15 + WLC_E_PRUNE_REASON_OFFSET, /** AP is already known to us as a WDS peer */ - WLC_E_PRUNE_QBSS_LOAD = 16 + WLC_E_PRUNE_REASON_OFFSET, /** QBSS LOAD - AAC is too low */ - WLC_E_PRUNE_HOME_AP = 17 + WLC_E_PRUNE_REASON_OFFSET, /** prune home AP */ - WLC_E_PRUNE_AP_BLOCKED = 18 + WLC_E_PRUNE_REASON_OFFSET, /** prune blocked AP */ - WLC_E_PRUNE_NO_DIAG_SUPPORT = 19 + WLC_E_PRUNE_REASON_OFFSET, /** prune due to diagnostic mode not supported */ - - /* WPA failure reason codes carried in the WLC_E_PSK_SUP event */ - WLC_E_SUP_OTHER = 0 + WLC_E_SUP_REASON_OFFSET, /** Other reason */ - WLC_E_SUP_DECRYPT_KEY_DATA = 1 + WLC_E_SUP_REASON_OFFSET, /** Decryption of key data failed */ - WLC_E_SUP_BAD_UCAST_WEP128 = 2 + WLC_E_SUP_REASON_OFFSET, /** Illegal use of ucast WEP128 */ - WLC_E_SUP_BAD_UCAST_WEP40 = 3 + WLC_E_SUP_REASON_OFFSET, /** Illegal use of ucast WEP40 */ - WLC_E_SUP_UNSUP_KEY_LEN = 4 + WLC_E_SUP_REASON_OFFSET, /** Unsupported key length */ - WLC_E_SUP_PW_KEY_CIPHER = 5 + WLC_E_SUP_REASON_OFFSET, /** Unicast cipher mismatch in pairwise key */ - WLC_E_SUP_MSG3_TOO_MANY_IE = 6 + WLC_E_SUP_REASON_OFFSET, /** WPA IE contains > 1 RSN IE in key msg 3 */ - WLC_E_SUP_MSG3_IE_MISMATCH = 7 + WLC_E_SUP_REASON_OFFSET, /** WPA IE mismatch in key message 3 */ - WLC_E_SUP_NO_INSTALL_FLAG = 8 + WLC_E_SUP_REASON_OFFSET, /** INSTALL flag unset in 4-way msg */ - WLC_E_SUP_MSG3_NO_GTK = 9 + WLC_E_SUP_REASON_OFFSET, /** encapsulated GTK missing from msg 3 */ - WLC_E_SUP_GRP_KEY_CIPHER = 10 + WLC_E_SUP_REASON_OFFSET, /** Multicast cipher mismatch in group key */ - WLC_E_SUP_GRP_MSG1_NO_GTK = 11 + WLC_E_SUP_REASON_OFFSET, /** encapsulated GTK missing from group msg 1 */ - WLC_E_SUP_GTK_DECRYPT_FAIL = 12 + WLC_E_SUP_REASON_OFFSET, /** GTK decrypt failure */ - WLC_E_SUP_SEND_FAIL = 13 + WLC_E_SUP_REASON_OFFSET, /** message send failure */ - WLC_E_SUP_DEAUTH = 14 + WLC_E_SUP_REASON_OFFSET, /** received FC_DEAUTH */ - WLC_E_SUP_WPA_PSK_TMO = 15 + WLC_E_SUP_REASON_OFFSET, /** WPA PSK 4-way handshake timeout */ - - DOT11_RC_RESERVED = 0 + WLC_E_DOT11_RC_REASON_OFFSET, /* d11 RC reserved */ - DOT11_RC_UNSPECIFIED = 1 + WLC_E_DOT11_RC_REASON_OFFSET, /* Unspecified reason */ - DOT11_RC_AUTH_INVAL = 2 + WLC_E_DOT11_RC_REASON_OFFSET, /* Previous authentication no longer valid */ - DOT11_RC_DEAUTH_LEAVING = 3 + WLC_E_DOT11_RC_REASON_OFFSET, /* Deauthenticated because sending station is leaving (or has left) IBSS or ESS */ - DOT11_RC_INACTIVITY = 4 + WLC_E_DOT11_RC_REASON_OFFSET, /* Disassociated due to inactivity */ - DOT11_RC_BUSY = 5 + WLC_E_DOT11_RC_REASON_OFFSET, /* Disassociated because AP is unable to handle all currently associated stations */ - DOT11_RC_INVAL_CLASS_2 = 6 + WLC_E_DOT11_RC_REASON_OFFSET, /* Class 2 frame received from nonauthenticated station */ - DOT11_RC_INVAL_CLASS_3 = 7 + WLC_E_DOT11_RC_REASON_OFFSET, /* Class 3 frame received from nonassociated station */ - DOT11_RC_DISASSOC_LEAVING = 8 + WLC_E_DOT11_RC_REASON_OFFSET, /* Disassociated because sending station is leaving (or has left) BSS */ - DOT11_RC_NOT_AUTH = 9 + WLC_E_DOT11_RC_REASON_OFFSET, /* Station requesting (re)association is not * authenticated with responding station */ - DOT11_RC_BAD_PC = 10 + WLC_E_DOT11_RC_REASON_OFFSET, /* Unacceptable power capability element */ - DOT11_RC_BAD_CHANNELS = 11 + WLC_E_DOT11_RC_REASON_OFFSET, /* Unacceptable supported channels element */ - /* 12 is unused */ - /* XXX 13-23 are WPA/802.11i reason codes defined in proto/wpa.h */ - /* 32-39 are QSTA specific reasons added in 11e */ - DOT11_RC_UNSPECIFIED_QOS = 32 + WLC_E_DOT11_RC_REASON_OFFSET, /* unspecified QoS-related reason */ - DOT11_RC_INSUFFCIENT_BW = 33 + WLC_E_DOT11_RC_REASON_OFFSET, /* QAP lacks sufficient bandwidth */ - DOT11_RC_EXCESSIVE_FRAMES = 34 + WLC_E_DOT11_RC_REASON_OFFSET, /* excessive number of frames need ack */ - DOT11_RC_TX_OUTSIDE_TXOP = 35 + WLC_E_DOT11_RC_REASON_OFFSET, /* transmitting outside the limits of txop */ - DOT11_RC_LEAVING_QBSS = 36 + WLC_E_DOT11_RC_REASON_OFFSET, /* QSTA is leaving the QBSS (or restting) */ - DOT11_RC_BAD_MECHANISM = 37 + WLC_E_DOT11_RC_REASON_OFFSET, /* does not want to use the mechanism */ - DOT11_RC_SETUP_NEEDED = 38 + WLC_E_DOT11_RC_REASON_OFFSET, /* mechanism needs a setup */ - DOT11_RC_TIMEOUT = 39 + WLC_E_DOT11_RC_REASON_OFFSET, /* timeout */ - DOT11_RC_MAX = 23 + WLC_E_DOT11_RC_REASON_OFFSET, /* Reason codes > 23 are reserved */ - - WLC_E_REASON_FORCE_32_BIT = 0x7FFFFFFE /** Force enum to be stored in 32 bit variable */ -} wwd_event_reason_t; - -/** - * Event handler prototype definition - * - * @param[out] wwd_event_header_t : wwd event header - * @param[out] uint8_t* : event data - * @param[out] handler_user_data : semaphore data - */ -typedef void* (*wwd_event_handler_t)( const wwd_event_header_t* event_header, const uint8_t* event_data, /*@null@*/ void* handler_user_data ); - - - -/* - * @param[in] wwd_rrm_report_type : Radio resource management report type - * @param[out] callback : A callback when the RRM report is received - * @param[in] rrm_req : pointer to the radio resource management request data - * @param[out] report_ptr : A pointer to the pointer that indicates where to put the next RRM report - * @param[in] void * : user data ( semaphore) - * @param[in] interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE -*/ -wwd_result_t wwd_wifi_rrm_request( wwd_rrm_report_type_t report_type, - wwd_event_handler_t callback, - void* rrm_req, - wwd_rrm_report_t** report_ptr, - void* user_data, - wwd_interface_t interface - ); -/** @endcond */ - - -/** @addtogroup mgmt WICED Management - * @{ - */ - -/** - * Registers locally a handler to receive event callbacks. - * Does not notify Wi-Fi about event subscription change. - * Can be used to refresh local callbacks (e.g. after deep-sleep) - * if Wi-Fi is already notified about them. - * - * This function registers a callback handler to be notified when - * a particular event is received. - * - * Alternately the function clears callbacks for given event type. - * - * @note : Currently each event may only be registered to one handler - * and there is a limit to the number of simultaneously registered - * events - * - * @param event_nums The event types that are to trigger the handler - * See @ref wwd_event_num_t for available events. - * Must be defined in a global constant. - * @param handler_func A function pointer to the new handler callback, - * or NULL if callbacks are to be disabled for the given event type - * @param handler_user_data A pointer value which will be passed to the event handler function - * at the time an event is triggered (NULL is allowed) - * - * @return WWD_SUCCESS or Error code - */ -extern wwd_result_t wwd_management_set_event_handler_locally( /*@keep@*/ const wwd_event_num_t* event_nums, /*@null@*/ wwd_event_handler_t handler_func, /*@null@*/ /*@keep@*/ void* handler_user_data, wwd_interface_t interface ); - - -/** - * Registers a handler to receive event callbacks. - * Subscribe locally and notify Wi-Fi about subscription. - * - * This function registers a callback handler to be notified when - * a particular event is received. - * - * Alternately the function clears callbacks for given event type. - * - * @note : Currently each event may only be registered to one handler - * and there is a limit to the number of simultaneously registered - * events - * - * @param event_nums The event types that are to trigger the handler - * See @ref wwd_event_num_t for available events. - * Must be defined in a global constant. - * @param handler_func A function pointer to the new handler callback, - * or NULL if callbacks are to be disabled for the given event type - * @param handler_user_data A pointer value which will be passed to the event handler function - * at the time an event is triggered (NULL is allowed) - * - * @return WWD_SUCCESS or Error code - */ -extern wwd_result_t wwd_management_set_event_handler( /*@keep@*/ const wwd_event_num_t* event_nums, /*@null@*/ wwd_event_handler_t handler_func, /*@null@*/ /*@keep@*/ void* handler_user_data, wwd_interface_t interface ); - -/** @cond */ - -extern void* wiced_rrm_report_handler ( const wwd_event_header_t* event_header, const uint8_t* event_data, /*@returned@*/ void* handler_user_data ); - -/* -* @param[out] result_ptr : A pointer to the pointer that indicates where to put the next RRM report -* @param[out] callback : A callback when the RRM report is received -* @param[out] wwd_rrm_report_t : Pointer to RRM report data -* @param[in] interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE -*/ -wwd_result_t wiced_wifi_rrm_request( wwd_rrm_report_type_t report_type, - wwd_event_handler_t callback, - void* rrm_req, - wwd_rrm_report_t** report_ptr, - wwd_interface_t interface - ); -#pragma pack(1) -struct wiced_event_header_struct -{ - uint16_t reserved1; - uint16_t flags; - wwd_event_num_t event_type; - wwd_event_status_t status; - wwd_event_reason_t reason; - uint32_t auth_type; - uint32_t datalen; - wiced_mac_t addr; - uint8_t interface; /* Do not use wwd_interface_t here */ -}; -#pragma pack() - -/** @endcond */ - -/** @} */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif -#endif /* ifndef INCLUDED_WWD_EVENTS_H */ diff --git a/components/WWD/WWD/include/wwd_management.h b/components/WWD/WWD/include/wwd_management.h deleted file mode 100644 index fc2a9109759da3e62d72f37f41d27512c5923280..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/wwd_management.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Provides prototypes for initialization and other management functions for Wiced system - * - */ - -#ifndef INCLUDED_WWD_MANAGEMENT_H -#define INCLUDED_WWD_MANAGEMENT_H - -#include "wwd_constants.h" /* for wwd_result_t and country codes */ - -#ifdef __cplusplus -extern "C" -{ -#endif - -/** @addtogroup mgmt WICED Management - * User functions for initialization and other management functions for the WICED system - * @{ - */ - -/****************************************************** - * Function declarations - ******************************************************/ -/*@-exportlocal@*/ - -/** - * Initialise Wi-Fi platform - * - * - Initialises the required parts of the hardware platform - * i.e. pins for SDIO/SPI, interrupt, reset, power etc. - * - * - Initialises the Wiced thread which arbitrates access - * to the SDIO/SPI bus - * - * @return WWD_SUCCESS if initialization is successful, Error code otherwise - */ -wwd_result_t wwd_management_wifi_platform_init( wiced_country_code_t country, wiced_bool_t resume_after_deep_sleep); - -/* - * WARNING: After setting to WICED_TRUE, - * Call wwd_management_wifi_platform_init_halt( WICED_FALSE ) - * prior to next wwd_management_wifi_platform_init. - * Halt Wi-Fi platform init by causing abort of firmware download loop. - * - * @return WWD_SUCCESS if successfully set the flag to abort - */ -wwd_result_t wwd_management_wifi_platform_init_halt( wiced_bool_t halt ); - -/** - * Turn on the Wi-Fi device - * - * - Initialise Wi-Fi platform - * - * - Program various WiFi parameters and modes - * - * @return WWD_SUCCESS if initialization is successful, error code otherwise - */ -wwd_result_t wwd_management_wifi_on( wiced_country_code_t country); - -/** - * Turn off the Wi-Fi device - * - * - De-Initialises the required parts of the hardware platform - * i.e. pins for SDIO/SPI, interrupt, reset, power etc. - * - * - De-Initialises the Wiced thread which arbitrates access - * to the SDIO/SPI bus - * - * @return WWD_SUCCESS if deinitialization is successful, Error code otherwise - */ -wwd_result_t wwd_management_wifi_off( void ); - -/*@+exportlocal@*/ - -/** @} */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif -#endif /* ifndef INCLUDED_WWD_MANAGEMENT_H */ diff --git a/components/WWD/WWD/include/wwd_poll.h b/components/WWD/WWD/include/wwd_poll.h deleted file mode 100644 index 81f343edc851403ecc794d23bac9624eab69877c..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/wwd_poll.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Header for using WWD with no RTOS or network stack - * - * It is possible to use these WWD without any operating system. To do this, - * the user application is required to periodically use the functions in this - * file to allow WWD to send and receive data across the SPI/SDIO bus. - * - */ - -#ifndef INCLUDED_WWD_POLL_H -#define INCLUDED_WWD_POLL_H - -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -/****************************************************** - * Function declarations - ******************************************************/ - -/*@-exportlocal@*/ - -/** Sends the first queued packet - * - * Checks the queue to determine if there is any packets waiting - * to be sent. If there are, then it sends the first one. - * - * This function is normally used by the WWD Thread, but can be - * called periodically by systems which have no RTOS to ensure - * packets get sent. - * - * @return 1 : packet was sent - * 0 : no packet sent - */ -extern int8_t wwd_thread_send_one_packet( void ) /*@modifies internalState @*/; - - -/** Receives a packet if one is waiting - * - * Checks the wifi chip fifo to determine if there is any packets waiting - * to be received. If there are, then it receives the first one, and calls - * the callback @ref wwd_sdpcm_process_rx_packet (in wwd_sdpcm.c). - * - * This function is normally used by the WWD Thread, but can be - * called periodically by systems which have no RTOS to ensure - * packets get received properly. - * - * @return 1 : packet was received - * 0 : no packet waiting - */ -extern int8_t wwd_thread_receive_one_packet( void ) /*@modifies internalState @*/; - - -/** Sends and Receives all waiting packets - * - * Repeatedly calls wwd_thread_send_one_packet and wwd_thread_receive_one_packet - * to send and receive packets, until there are no more packets waiting to - * be transferred. - * - * This function is normally used by the WWD Thread, but can be - * called periodically by systems which have no RTOS to ensure - * packets get send and received properly. - * - * @return 1 : packet was sent or received - * 0 : no packet was sent or received - */ -extern int8_t wwd_thread_poll_all( void ) /*@modifies internalState@*/; - -/*@+exportlocal@*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif -#endif /* ifndef INCLUDED_WWD_POLL_H */ diff --git a/components/WWD/WWD/include/wwd_structures.h b/components/WWD/WWD/include/wwd_structures.h deleted file mode 100644 index ac9c2d77f92b7af668cecc6eaebf4bcce3679b01..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/wwd_structures.h +++ /dev/null @@ -1,376 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Defines common structures used with WWD - * - */ - -#ifndef INCLUDED_WWD_STRUCTURES_H -#define INCLUDED_WWD_STRUCTURES_H - -#include "wwd_constants.h" -#include "wwd_wlioctl.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * Macros - ******************************************************/ - -#define SSID_NAME_SIZE (32) -#define HOSTNAME_SIZE (32) - -/****************************************************** - * Constants - ******************************************************/ - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Type Definitions - ******************************************************/ - -/** @cond !ADDTHIS*/ - -typedef volatile void* host_semaphore_pointer_t; -typedef volatile void* host_mutex_pointer_t; -typedef volatile void* host_thread_pointer_t; - -typedef uint32_t wwd_time_t; /* Time value in milliseconds */ -typedef struct wl_bss_info_struct wiced_bss_info_t; - -typedef struct edcf_acparam wiced_edcf_ac_param_t; -typedef struct wl_action_frame wiced_action_frame_t; - -typedef struct wiced_event_header_struct wwd_event_header_t; -/** @endcond */ - -/****************************************************** - * Structures - ******************************************************/ - - -/* - The received packet formats are different when EXT_STA is enabled. In case - of EXT_STA the received packets are in 802.11 format, where as in other - case the received packets have Ethernet II format - - 1. 802.11 frames - ---------------------------------------------------------------------------- - | FC (2) | DID (2) |A1 (6) |A2 (6)|A3 (6) |SID (2) |SNAP (6) |type (2) |data (46 - 1500) | - ---------------------------------------------------------------------------- - - 2. Ethernet II frames - ------------------------------------------------- - | DA (6) | SA (6) | type (2) | data (46 - 1500) | - ------------------------------------------------- - */ - - -/** - * Structure describing a packet filter list item -*/ -typedef struct -{ - uint32_t id; /**< Unique identifier for a packet filter item */ - wiced_packet_filter_rule_t rule; /**< Filter matches are either POSITIVE or NEGATIVE matching */ - uint16_t offset; /**< Offset in bytes to start filtering (referenced to the start of the ethernet packet) */ - uint16_t mask_size; /**< Size of the mask in bytes */ - uint8_t* mask; /**< Pattern mask bytes to be ANDed with the pattern eg. "\xff00" (must be in network byte order) */ - uint8_t* pattern; /**< Pattern bytes used to filter eg. "\x0800" (must be in network byte order) */ - wiced_bool_t enabled_status; /**< When returned from wwd_wifi_get_packet_filters, indicates if the filter is enabled */ -} wiced_packet_filter_t; - -/** @cond */ -typedef struct wl_pkt_filter_stats wiced_packet_filter_stats_t; -/** @endcond */ - -/** - * Structure describing a packet filter list item -*/ -typedef struct -{ - uint8_t keep_alive_id; /**< Unique identifier for the keep alive packet */ - uint32_t period_msec; /**< Repeat interval in milliseconds */ - uint16_t packet_length; /**< Length of the keep alive packet */ - uint8_t* packet; /**< Pointer to the keep alive packet */ -} wiced_keep_alive_packet_t; - -/** - * Structure for storing a Service Set Identifier (i.e. Name of Access Point) - */ -typedef struct -{ - uint8_t length; /**< SSID length */ - uint8_t value[ SSID_NAME_SIZE ]; /**< SSID name (AP name) */ -} wiced_ssid_t; - -/** - * Structure for storing a MAC address (Wi-Fi Media Access Control address). - */ -typedef struct -{ - uint8_t octet[6]; /**< Unique 6-byte MAC address */ -} wiced_mac_t; - -/** - * Structure for storing a null terminated network hostname - */ -typedef struct -{ - char value[ HOSTNAME_SIZE + 1 ]; -} wiced_hostname_t; - -/** - * Structure for storing extended scan parameters - */ -typedef struct -{ - int32_t number_of_probes_per_channel; /**< Number of probes to send on each channel */ - int32_t scan_active_dwell_time_per_channel_ms; /**< Period of time to wait on each channel when active scanning */ - int32_t scan_passive_dwell_time_per_channel_ms; /**< Period of time to wait on each channel when passive scanning */ - int32_t scan_home_channel_dwell_time_between_channels_ms; /**< Period of time to wait on the home channel when scanning. Only relevant if associated. */ -} wiced_scan_extended_params_t; - -/** - * Structure for storing radio band list information - */ -typedef struct -{ - int32_t number_of_bands; /**< Number of bands supported, currently 1 or 2 */ - int32_t current_band; /**< Current band type : WLC_BAND_2G or WLC_BAND_5G */ - int32_t other_band; /**< If number of bands is 2 then the other band type */ -} wiced_band_list_t; - -/** - * Structure for storing AP information - */ -#pragma pack(1) -typedef struct wiced_ap_info -{ - wiced_ssid_t SSID; /**< Service Set Identification (i.e. Name of Access Point) */ - wiced_mac_t BSSID; /**< Basic Service Set Identification (i.e. MAC address of Access Point) */ - int16_t signal_strength; /**< Receive Signal Strength Indication in dBm. <-90=Very poor, >-30=Excellent */ - uint32_t max_data_rate; /**< Maximum data rate in kilobits/s */ - wiced_bss_type_t bss_type; /**< Network type */ - wiced_security_t security; /**< Security type */ - uint8_t channel; /**< Radio channel that the AP beacon was received on */ - wiced_802_11_band_t band; /**< Radio band */ - struct wiced_ap_info* next; /**< Pointer to the next scan result */ -} wiced_ap_info_t; -#pragma pack() - -/** - * Structure for storing scan results - */ -#pragma pack(1) -typedef struct wiced_scan_result -{ - wiced_ssid_t SSID; /**< Service Set Identification (i.e. Name of Access Point) */ - wiced_mac_t BSSID; /**< Basic Service Set Identification (i.e. MAC address of Access Point) */ - int16_t signal_strength; /**< Receive Signal Strength Indication in dBm. <-90=Very poor, >-30=Excellent */ - uint32_t max_data_rate; /**< Maximum data rate in kilobits/s */ - wiced_bss_type_t bss_type; /**< Network type */ - wiced_security_t security; /**< Security type */ - uint8_t channel; /**< Radio channel that the AP beacon was received on */ - wiced_802_11_band_t band; /**< Radio band */ - wiced_bool_t on_channel; /**< True if scan result was recorded on the channel advertised in the packet */ - struct wiced_scan_result* next; /**< Pointer to the next scan result */ -} wiced_scan_result_t; -#pragma pack() - -/** - * Structure for storing a WEP key - */ -typedef struct -{ - uint8_t index; /**< WEP key index [0/1/2/3] */ - uint8_t length; /**< WEP key length. Either 5 bytes (40-bits) or 13-bytes (104-bits) */ - uint8_t data[32]; /**< WEP key as values NOT chars */ -} wiced_wep_key_t; - - -/** Structure for storing 802.11 powersave listen interval values \n - * See @ref wiced_wifi_get_listen_interval for more information - */ -typedef struct -{ - uint8_t beacon; /**< Listen interval in beacon periods */ - uint8_t dtim; /**< Listen interval in DTIM periods */ - uint16_t assoc; /**< Listen interval as sent to APs */ -} wiced_listen_interval_t; - - -#pragma pack(1) - -/** - * Structure describing a list of associated softAP clients - */ -typedef struct -{ - uint32_t count; /**< Number of MAC addresses in the list */ - wiced_mac_t mac_list[1]; /**< Variable length array of MAC addresses */ -} wiced_maclist_t; - -typedef struct -{ - char abbrev[3]; - uint8_t rev; - uint8_t data[64]; -} wiced_country_info_t; - -#pragma pack() - -/* DSS Parameter Set */ -typedef struct -{ - uint8_t type; - uint8_t length; - uint8_t current_channel; -} dsss_parameter_set_ie_t; - -/* In dongle firmware this is defined as ht_add_ie_t in 802.11.h. It has similar structure but different field names due to history. - * Wireshark reports this element as the HT information element. */ -typedef struct -{ - uint8_t type; - uint8_t length; - uint8_t primary_channel; - uint8_t ht_operation_subset_1; - uint16_t ht_operation_subset_2; - uint16_t ht_operation_subset_3; - uint8_t rx_supported_mcs_set[16]; -} ht_operation_ie_t; - - -/* 11k Radio resource capabilities bit information */ -typedef struct radio_resource_management_capability_debug_msg -{ - uint32_t value; - const char* string; -} radio_resource_management_capability_debug_msg_t; - -/* 11k Radio resource capabilities */ -typedef struct -{ - uint8_t radio_resource_management[RRM_CAPABILITIES_LEN]; -} radio_resource_management_capability_ie_t; - -/* 11k Radio resource beacon request */ -typedef struct radio_resource_management_beacon_req -{ - uint8_t bcn_mode; - int duration; - int channel; - wiced_mac_t da; - uint16_t random_int; - wlc_ssid_t ssid; - uint16_t repetitions; -} radio_resource_management_beacon_req_t; - -/* 11k Radio resource management request */ -typedef struct radio_resource_management_req -{ - wiced_mac_t da; - uint8_t regulatory; - uint8_t channel; - uint16_t random_int; - uint16_t duration; - uint16_t repetitions; -} radio_resource_management_req_t; - -/* 11k Radio resource management frame request */ -typedef struct radio_resource_management_framereq -{ - wiced_mac_t da; - uint8_t regulatory; - uint8_t channel; - uint16_t random_int; - uint16_t duration; - wiced_mac_t ta; - uint16_t repetitions; -} radio_resource_management_framereq_t; - -/* 11k Radio resource management statistics request */ -typedef struct radio_resource_management_statreq -{ - wiced_mac_t da; - wiced_mac_t peer; - uint16_t random_int; - uint16_t duration; - uint8_t group_id; - uint16_t repetitions; -} radio_resource_management_statreq_t; - -/* 11k Radio resource statistics report */ -typedef struct -{ - uint16_t version; - wiced_mac_t sta_address; - uint32_t timestamp; - uint16_t flag; - uint16_t length_of_payload; - unsigned char data[WL_RRM_RPT_MAX_PAYLOAD]; -} radio_resource_management_statrpt_t; - -/* 11k Neighbor Report element */ -typedef struct rrm_nbr_element -{ - uint8_t id; - uint8_t length; - wiced_mac_t bssid; - uint32_t bssid_info; - uint8_t regulatory; - uint8_t channel; - uint8_t phytype; - uint8_t pad; -} radio_resource_management_nbr_element_t; - -typedef struct -{ - uint8_t mode; /* 1 == target must not tx between recieving CSA and actually switching */ - /* 0 == target may tx between recieving CSA and actually switching */ - uint8_t count; /* count number of beacons before switching */ - uint16_t chspec; /* target chanspec */ -} wiced_chan_switch_t; - -typedef struct radio_resource_management_neight_report -{ - struct radio_resource_management_neight_report *link; - radio_resource_management_nbr_element_t nbr_elm; -} radio_resource_management_neighbor_report_t; - - -typedef struct wwd_rrm_report -{ - wwd_rrm_report_type_t type; - uint32_t report_len; - uint8_t *report; -} wwd_rrm_report_t; - -/****************************************************** - * Global Variables - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ifndef INCLUDED_WWD_STRUCTURES_H */ diff --git a/components/WWD/WWD/include/wwd_wifi.h b/components/WWD/WWD/include/wwd_wifi.h deleted file mode 100644 index b96b36dd68b0e5ae80f510601ac2bf86bff2b9bb..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/wwd_wifi.h +++ /dev/null @@ -1,1314 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Prototypes of functions for controlling the Wi-Fi system - * - * This file provides prototypes for end-user functions which allow - * actions such as scanning for Wi-Fi networks, joining Wi-Fi - * networks, getting the MAC address, etc - * - */ - -#ifndef INCLUDED_WWD_WIFI_H -#define INCLUDED_WWD_WIFI_H - -#include -#include "wwd_constants.h" /* For wwd_result_t */ -#include "wwd_structures.h" -#include "chip_constants.h" -#include "wwd_rtos_interface.h" /* For semaphores */ -#include "network/wwd_network_interface.h" /* For interface definitions */ -#include "wwd_structures.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/** @cond !ADDTHIS*/ - -#ifndef WICED_MAXIMUM_LINK_CALLBACK_SUBSCRIPTIONS -#define WICED_MAXIMUM_LINK_CALLBACK_SUBSCRIPTIONS (5) -#endif - -/* Packet Filter Offsets for Ethernet Frames */ -#define FILTER_OFFSET_PACKET_START 0 -#define FILTER_OFFSET_ETH_HEADER_DESTINATION_ADDRESS 0 -#define FILTER_OFFSET_ETH_HEADER_SOURCE_ADDRESS 6 -#define FILTER_OFFSET_ETH_HEADER_ETHERTYPE 12 -#define FILTER_OFFSET_ETH_DATA 14 - -/* Packet Filter Offsets for ARP Packets */ -#define FILTER_OFFSET_ARP_HEADER_START 14 -#define FILTER_OFFSET_ARP_HEADER_HTYPE 14 -#define FILTER_OFFSET_ARP_HEADER_PTYPE 16 -#define FILTER_OFFSET_ARP_HEADER_HLEN 18 -#define FILTER_OFFSET_ARP_HEADER_PLEN 19 -#define FILTER_OFFSET_ARP_HEADER_OPER 20 -#define FILTER_OFFSET_ARP_HEADER_SHA 22 -#define FILTER_OFFSET_ARP_HEADER_SPA 28 -#define FILTER_OFFSET_ARP_HEADER_THA 30 -#define FILTER_OFFSET_ARP_HEADER_TPA 36 - -/* Packet Filter Offsets for IPv4 Packets */ -#define FILTER_OFFSET_IPV4_HEADER_START 14 -#define FILTER_OFFSET_IPV4_HEADER_VER_IHL 14 -#define FILTER_OFFSET_IPV4_HEADER_DSCP_ECN 15 -#define FILTER_OFFSET_IPV4_HEADER_TOTAL_LEN 16 -#define FILTER_OFFSET_IPV4_HEADER_ID 18 -#define FILTER_OFFSET_IPV4_HEADER_FLAGS_FRAGMENT_OFFSET 20 -#define FILTER_OFFSET_IPV4_HEADER_TTL 22 -#define FILTER_OFFSET_IPV4_HEADER_PROTOCOL 23 -#define FILTER_OFFSET_IPV4_HEADER_CHECKSUM 24 -#define FILTER_OFFSET_IPV4_HEADER_SOURCE_ADDR 26 -#define FILTER_OFFSET_IPV4_HEADER_DESTINATION_ADDR 30 -#define FILTER_OFFSET_IPV4_HEADER_OPTIONS 34 -#define FILTER_OFFSET_IPV4_DATA_START 38 - -/* Packet Filter Offsets for IPv4 Packets */ -#define FILTER_OFFSET_IPV6_HEADER_START 14 -#define FILTER_OFFSET_IPV6_HEADER_PAYLOAD_LENGTH 18 -#define FILTER_OFFSET_IPV6_HEADER_NEXT_HEADER 20 -#define FILTER_OFFSET_IPV6_HEADER_HOP_LIMIT 21 -#define FILTER_OFFSET_IPV6_HEADER_SOURCE_ADDRESS 22 -#define FILTER_OFFSET_IPV6_HEADER_DESTINATION_ADDRESS 38 -#define FILTER_OFFSET_IPV6_DATA_START 54 - -/* Packet Filter Offsets for ICMP Packets */ -#define FILTER_OFFSET_ICMP_HEADER_START 14 - -/** @endcond */ - -#define PM1_POWERSAVE_MODE ( 1 ) -#define PM2_POWERSAVE_MODE ( 2 ) -#define NO_POWERSAVE_MODE ( 0 ) - -/* Roaming trigger options */ -#define WICED_WIFI_DEFAULT_ROAMING TRIGGER ( 0 ) -#define WICED_WIFI_OPTIMIZE_BANDWIDTH_ROAMING_TRIGGER ( 1 ) -#define WICED_WIFI_OPTIMIZE_DISTANCE_ROAMING_TRIGGER ( 2 ) - -/* Phyrate counts */ -#define WICED_WIFI_PHYRATE_COUNT 16 -#define WICED_WIFI_PHYRATE_LOG_SIZE WL_PHYRATE_LOG_SIZE -#define WICED_WIFI_PHYRATE_LOG_OFF 0 -#define WICED_WIFI_PHYRATE_LOG_TX 1 -#define WICED_WIFI_PHYRATE_LOG_RX 2 - -/* Preferred Network Offload: time between scans - * Set based on desired reconnect responsiveness after the AP has been off - * for a long time. (Reconnect will occur via roam if only off for 10s or less.) - * Also, larger numbers will generally consume less energy. - */ -#define WICED_WIFI_PNO_SCAN_PERIOD 20 - -#define WWD_INTERFACE_INDEX( interface ) ( int )( interface & ( WWD_INTERFACE_MAX - 1 ) ) -#define WWD_INDEX_TO_INTERFACE( index ) ( wwd_interface_t )( index ) - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -typedef void (*wwd_wifi_raw_packet_processor_t)( wiced_buffer_t buffer, wwd_interface_t interface ); - -/****************************************************** - * Global Variables - ******************************************************/ - -extern wiced_bool_t wwd_wifi_p2p_go_is_up; - -/****************************************************** - * Function declarations - ******************************************************/ - -/*@-exportlocal@*/ /* Lint: These are API functions it is ok if they are not all used externally - they will be garbage collected by the linker if needed */ - -/** Scan result callback function pointer type - * - * @param result_ptr : A pointer to the pointer that indicates where to put the next scan result - * @param user_data : User provided data - * @param status : Status of scan process - */ -typedef void (*wiced_scan_result_callback_t)( wiced_scan_result_t** result_ptr, void* user_data, wiced_scan_status_t status ); - -/** Initiates a scan to search for 802.11 networks. - * - * The scan progressively accumulates results over time, and may take between 1 and 10 seconds to complete. - * The results of the scan will be individually provided to the callback function. - * Note: The callback function will be executed in the context of the WICED thread and so must not perform any - * actions that may cause a bus transaction. - * - * @param[in] scan_type : Specifies whether the scan should be Active, Passive or scan Prohibited channels - * @param[in] bss_type : Specifies whether the scan should search for Infrastructure networks (those using - * an Access Point), Ad-hoc networks, or both types. - * @param[in] optional_ssid : If this is non-Null, then the scan will only search for networks using the specified SSID. - * @param[in] optional_mac : If this is non-Null, then the scan will only search for networks where - * the BSSID (MAC address of the Access Point) matches the specified MAC address. - * @param[in] optional_channel_list : If this is non-Null, then the scan will only search for networks on the - * specified channels - array of channel numbers to search, terminated with a zero - * @param[in] optional_extended_params : If this is non-Null, then the scan will obey the specifications about - * dwell times and number of probes. - * @param callback[in] : the callback function which will receive and process the result data. - * @param result_ptr[in] : a pointer to a pointer to a result storage structure. - * @param user_data[in] : user specific data that will be passed directly to the callback function - * - * @note : When scanning specific channels, devices with a strong signal strength on nearby channels may be detected - * @note : Callback must not use blocking functions, nor use WICED functions, since it is called from the context of the - * WWD thread. - * @note : The callback, result_ptr and user_data variables will be referenced after the function returns. - * Those variables must remain valid until the scan is complete. - * - * @return WWD_SUCCESS or Error code - */ -extern wwd_result_t wwd_wifi_scan( wiced_scan_type_t scan_type, - wiced_bss_type_t bss_type, - /*@null@*/ const wiced_ssid_t* optional_ssid, - /*@null@*/ const wiced_mac_t* optional_mac, - /*@null@*/ /*@unique@*/ const uint16_t* optional_channel_list, - /*@null@*/ const wiced_scan_extended_params_t* optional_extended_params, - wiced_scan_result_callback_t callback, - wiced_scan_result_t** result_ptr, - /*@null@*/ void* user_data, - wwd_interface_t interface ); - -/** Abort a previously issued scan - * - * @return WICED_SUCCESS or WICED_ERROR - */ -extern wwd_result_t wwd_wifi_abort_scan( void ); - -/** Sets default scan parameters in FW - * - * @param[in] assoc_time : Specifies dwell time per channel in associated state - * @param[in] unassoc_time : Specifies dwell time per channel in unassociated state - * @param[in] passive_time : Specifies dwell time per channel for passive scanning - * @param[in] home_time : Specifies dwell time for the home channel between channel scans - * @param[in] nprobes : Specifies number of probes per channel - * - * @return WWD_SUCCESS or Error code - */ -extern wwd_result_t wwd_wifi_set_scan_params( uint32_t assoc_time, - uint32_t unassoc_time, - uint32_t passive_time, - uint32_t home_time, - uint32_t nprobes ); - -/** Sets default scan parameters in FW - * - * @param[out] assoc_time : Dwell time per channel in associated state - * @param[out] unassoc_time : Dwell time per channel in unassociated state - * @param[out] passive_time : Dwell time per channel for passive scanning - * @param[out] home_time : Dwell time for the home channel between channel scans - * @param[out] nprobes : Number of probes per channel - * - * @return WWD_SUCCESS or Error code - */ -extern wwd_result_t wwd_wifi_get_scan_params( uint32_t* assoc_time, - uint32_t* unassoc_time, - uint32_t* passive_time, - uint32_t* home_time, - uint32_t* nprobes ); - -/** Joins a Wi-Fi network - * - * Scans for, associates and authenticates with a Wi-Fi network. - * On successful return, the system is ready to send data packets. - * - * @param[in] ssid : A null terminated string containing the SSID name of the network to join - * @param[in] auth_type : Authentication type: - * - WICED_SECURITY_OPEN - Open Security - * - WICED_SECURITY_WEP_PSK - WEP Security with open authentication - * - WICED_SECURITY_WEP_SHARED - WEP Security with shared authentication - * - WICED_SECURITY_WPA_TKIP_PSK - WPA Security - * - WICED_SECURITY_WPA2_AES_PSK - WPA2 Security using AES cipher - * - WICED_SECURITY_WPA2_TKIP_PSK - WPA2 Security using TKIP cipher - * - WICED_SECURITY_WPA2_MIXED_PSK - WPA2 Security using AES and/or TKIP ciphers - * @param[in] security_key : A byte array containing either the cleartext security key for WPA/WPA2 - * secured networks, or a pointer to an array of wiced_wep_key_t structures - * for WEP secured networks - * @param[in] key_length : The length of the security_key in bytes. - * @param[in] semaphore : A user provided semaphore that is flagged when the join is complete - * - * @return WWD_SUCCESS : when the system is joined and ready to send data packets - * Error code : if an error occurred - */ -extern wwd_result_t wwd_wifi_join( const wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, host_semaphore_type_t* semaphore ); - - -/** Joins a specific Wi-Fi network - * - * Associates and authenticates with a specific Wi-Fi access point. - * On successful return, the system is ready to send data packets. - * - * @param[in] ap : A pointer to a wiced_scan_result_t structure containing AP details - * @param[in] security_key : A byte array containing either the cleartext security key for WPA/WPA2 - * secured networks, or a pointer to an array of wiced_wep_key_t structures - * for WEP secured networks - * @param[in] key_length : The length of the security_key in bytes. - * @param[in] semaphore : A user provided semaphore that is flagged when the join is complete - * - * @return WWD_SUCCESS : when the system is joined and ready to send data packets - * Error code : if an error occurred - */ -extern wwd_result_t wwd_wifi_join_specific( const wiced_scan_result_t* ap, const uint8_t* security_key, uint8_t key_length, host_semaphore_type_t* semaphore, wwd_interface_t interface ); - -/** Disassociates from a Wi-Fi network. - * - * @return WWD_SUCCESS : On successful disassociation from the AP - * Error code : If an error occurred - */ -extern wwd_result_t wwd_wifi_leave( wwd_interface_t interface ); - -/** Deauthenticates a STA which may or may not be associated to SoftAP or Group Owner - * - * @param[in] mac : Pointer to a variable containing the MAC address to which the deauthentication will be sent - * @param[in] reason : Deauthentication reason code - * @param[in] interface : SoftAP interface or P2P interface - - * @return WWD_SUCCESS : On successful deauthentication of the other STA - * WWD_ERROR : If an error occurred - */ -extern wwd_result_t wwd_wifi_deauth_sta( const wiced_mac_t* mac, wwd_dot11_reason_code_t reason, wwd_interface_t interface ); - -/** Deauthenticates all client STAs associated to SoftAP or Group Owner - * - * @param[in] reason : Deauthentication reason code - * @param[in] interface : SoftAP interface or P2P interface - - * @return WWD_SUCCESS : On successful deauthentication of the other STA - * WWD_ERROR : If an error occurred - */ -extern wwd_result_t wwd_wifi_deauth_all_associated_client_stas( wwd_dot11_reason_code_t reason, wwd_interface_t interface ); - -/** Retrieves the current Media Access Control (MAC) address - * (or Ethernet hardware address) of the 802.11 device - * - * @param mac Pointer to a variable that the current MAC address will be written to - * @return WWD_SUCCESS or Error code - */ -extern wwd_result_t wwd_wifi_get_mac_address( wiced_mac_t* mac, wwd_interface_t interface ); - -/** Retrieves the current Media Access Control (MAC) address - * (or Ethernet hardware address) of the 802.11 device - * and store it to local cache, so subsequent - * wwd_wifi_get_mac_address() be faster. - * - * @return WWD_SUCCESS or Error code - */ -extern wwd_result_t wwd_wifi_get_and_cache_mac_address( wwd_interface_t interface ); - -/** ---------------------------------------------------------------------- - * WARNING : This function is for internal use only! - * ---------------------------------------------------------------------- - * This function sets the current Media Access Control (MAC) address of the - * 802.11 device. To override the MAC address in the Wi-Fi OTP or NVRAM add - * a global define in the application makefile as shown below. With this define - * in place, the MAC address stored in the DCT is used instead of the MAC in the - * OTP or NVRAM. - * - * In /App/my_app/my_app.mk add the following global define - * GLOBAL_DEFINES := MAC_ADDRESS_SET_BY_HOST - * Further information about MAC addresses is available in the following - * automatically generated file AFTER building your first application - * /generated_mac_address.txt - * - * NOTE: - * Ensure Wi-Fi core and network is down before invoking this function. - * Refer wiced_wifi_down() API for details. - * - * @param[in] mac Wi-Fi MAC address - * @return WWD_SUCCESS or Error code - */ -extern wwd_result_t wwd_wifi_set_mac_address( wiced_mac_t mac ); - -/** Starts an infrastructure WiFi network - * - * @warning If a STA interface is active when this function is called, the softAP will\n - * start on the same channel as the STA. It will NOT use the channel provided! - * - * @param[in] ssid : A null terminated string containing the SSID name of the network to join - * @param[in] auth_type : Authentication type: \n - * - WICED_SECURITY_OPEN - Open Security \n - * - WICED_SECURITY_WPA_TKIP_PSK - WPA Security \n - * - WICED_SECURITY_WPA2_AES_PSK - WPA2 Security using AES cipher \n - * - WICED_SECURITY_WPA2_MIXED_PSK - WPA2 Security using AES and/or TKIP ciphers \n - * - WEP security is NOT IMPLEMENTED. It is NOT SECURE! \n - * @param[in] security_key : A byte array containing the cleartext security key for the network - * @param[in] key_length : The length of the security_key in bytes. - * @param[in] channel : 802.11 channel number - * - * @return WWD_SUCCESS : if successfully creates an AP - * Error code : if an error occurred - */ -extern wwd_result_t wwd_wifi_start_ap( wiced_ssid_t* ssid, wiced_security_t auth_type, /*@unique@*/ const uint8_t* security_key, uint8_t key_length, uint8_t channel ); - -/** Stops an existing infrastructure WiFi network - * - * @return WWD_SUCCESS : if the AP is successfully stopped - * Error code : if an error occurred - */ -extern wwd_result_t wwd_wifi_stop_ap( void ); - -/** Determines if a particular interface is ready to transceive ethernet packets - * - * @param Radio interface to check, options are WICED_STA_INTERFACE, WICED_AP_INTERFACE - * @return WWD_SUCCESS : if the interface is ready to transceive ethernet packets - * @return WICED_NOTFOUND : no AP with a matching SSID was found - * @return WICED_NOT_AUTHENTICATED: a matching AP was found but it won't let you authenticate. - * This can occur if this device is in the block list on the AP. - * @return WICED_NOT_KEYED: the device has authenticated and associated but has not completed the - * key exchange. This can occur if the passphrase is incorrect. - * @return Error code : if the interface is not ready to transceive ethernet packets - */ -extern wwd_result_t wwd_wifi_is_ready_to_transceive( wwd_interface_t interface ); - -/** Enables powersave mode without regard for throughput reduction - * - * This function enables (legacy) 802.11 PS-Poll mode and should be used - * to achieve the lowest power consumption possible when the Wi-Fi device - * is primarily passively listening to the network - * - * @return @ref wwd_result_t - */ -extern wwd_result_t wwd_wifi_enable_powersave( void ); - -/* Enables powersave mode while attempting to maximise throughput - * - * Network traffic is typically bursty. Reception of a packet often means that another - * packet will be received shortly afterwards (and vice versa for transmit). - * - * In high throughput powersave mode, rather then entering powersave mode immediately - * after receiving or sending a packet, the WLAN chip waits for a timeout period before - * returning to sleep. - * - * @return WWD_SUCCESS : if power save mode was successfully enabled - * Error code : if power save mode was not successfully enabled - * - * @param[in] return_to_sleep_delay : The variable to set return to sleep delay.* - * - * return to sleep delay must be set to a multiple of 10 and not equal to zero. - */ -extern wwd_result_t wwd_wifi_enable_powersave_with_throughput( uint16_t return_to_sleep_delay ); - - -/** Disables 802.11 power save mode - * - * @return WWD_SUCCESS : if power save mode was successfully disabled - * Error code : if power save mode was not successfully disabled - */ -extern wwd_result_t wwd_wifi_disable_powersave( void ); - -/** Gets the tx power in dBm units - * - * @param dbm : The variable to receive the tx power in dbm. - * - * @return WWD_SUCCESS : if successful - * Error code : if not successful - */ -extern wwd_result_t wwd_wifi_get_tx_power( uint8_t* dbm ); - -/** Sets the tx power in dBm units - * - * @param dbm : The desired tx power in dbm. If set to -1 (0xFF) the default value is restored. - * - * @return WWD_SUCCESS : if tx power was successfully set - * Error code : if tx power was not successfully set - */ -extern wwd_result_t wwd_wifi_set_tx_power( uint8_t dbm ); - -/** Sets the 802.11 powersave listen interval for a Wi-Fi client, and communicates - * the listen interval to the Access Point. The listen interval will be set to - * (listen_interval x time_unit) seconds. - * - * The default value for the listen interval is 0. With the default value set, - * the Wi-Fi device wakes to listen for AP beacons every DTIM period. - * - * If the DTIM listen interval is non-zero, the DTIM listen interval will over ride - * the beacon listen interval value. - * - * If it is necessary to set the listen interval sent to the AP to a value other - * than the value set by this function, use the additional association listen - * interval API : wwd_wifi_set_listen_interval_assoc() - * - * NOTE: This function applies to 802.11 powersave operation. Please read the - * WICED powersave application note for further information about the - * operation of the 802.11 listen interval. - * - * @param listen_interval : The desired beacon listen interval - * @param time_unit : The listen interval time unit; options are beacon period or DTIM period. - * - * @return WWD_SUCCESS : If the listen interval was successfully set. - * Error code : If the listen interval was not successfully set. - */ -extern wwd_result_t wwd_wifi_set_listen_interval( uint8_t listen_interval, wiced_listen_interval_time_unit_t time_unit ); - -/** Sets the 802.11 powersave beacon listen interval communicated to Wi-Fi Access Points - * - * This function is used by Wi-Fi clients to set the value of the beacon - * listen interval sent to the AP (in the association request frame) during - * the association process. - * - * To set the client listen interval as well, use the wwd_wifi_set_listen_interval() API - * - * This function applies to 802.11 powersave operation. Please read the - * WICED powersave application note for further information about the - * operation of the 802.11 listen interval. - * - * @param listen_interval : The beacon listen interval sent to the AP during association. - * The time unit is specified in multiples of beacon periods. - * - * @return WWD_SUCCESS : if listen interval was successfully set - * Error code : if listen interval was not successfully set - */ -extern wwd_result_t wwd_wifi_set_listen_interval_assoc( uint16_t listen_interval ); - -/** Gets the current value of all beacon listen interval variables - * - * @param listen_interval_beacon : The current value of the listen interval set as a multiple of the beacon period - * @param listen_interval_dtim : The current value of the listen interval set as a multiple of the DTIM period - * @param listen_interval_assoc : The current value of the listen interval sent to access points in an association request frame - * - * @return WWD_SUCCESS : If all listen interval values are read successfully - * Error code : If at least one of the listen interval values are NOT read successfully - */ -extern wwd_result_t wwd_wifi_get_listen_interval( wiced_listen_interval_t* li ); - -/** Registers interest in a multicast address - * Once a multicast address has been registered, all packets detected on the - * medium destined for that address are forwarded to the host. - * Otherwise they are ignored. - * - * @param mac: Ethernet MAC address - * - * @return WWD_SUCCESS : if the address was registered successfully - * Error code : if the address was not registered - */ -extern wwd_result_t wwd_wifi_register_multicast_address( const wiced_mac_t* mac ); - -/** Registers interest in a multicast address - * Similar to wwd_wifi_register_multicast_address but able to define interface - * - * @param mac : Ethernet MAC address - * @param interface: Wireless interface - * - * @return WWD_SUCCESS : if the address was registered successfully - * Error code : if the address was not registered - */ -extern wwd_result_t wwd_wifi_register_multicast_address_for_interface( const wiced_mac_t* mac, wwd_interface_t interface ); - -/** Unregisters interest in a multicast address - * Once a multicast address has been unregistered, all packets detected on the - * medium destined for that address are ignored. - * - * @param mac: Ethernet MAC address - * - * @return WWD_SUCCESS : if the address was unregistered successfully - * Error code : if the address was not unregistered - */ -extern wwd_result_t wwd_wifi_unregister_multicast_address( const wiced_mac_t* mac ); - -/** Unregisters interest in a multicast address - * Similar to wwd_wifi_unregister_multicast_address but able to define interface. - * - * @param mac : Ethernet MAC address - * @param interface: Wireless interface - * - * @return WWD_SUCCESS : if the address was unregistered successfully - * Error code : if the address was not unregistered - */ -extern wwd_result_t wwd_wifi_unregister_multicast_address_for_interface( const wiced_mac_t* mac, wwd_interface_t interface ); - -/** Retrieve the latest RSSI value - * - * @param rssi: The location where the RSSI value will be stored - * - * @return WWD_SUCCESS : if the RSSI was succesfully retrieved - * Error code : if the RSSI was not retrieved - */ -extern wwd_result_t wwd_wifi_get_rssi( int32_t* rssi ); - -/** Retrieve the latest RSSI value of the AP client - * - * @param rssi: The location where the RSSI value will be stored - * @param client_mac_addr: Mac address of the AP client - * Please note that you can get the full list of AP clients - * currently connected to Wiced AP by calling a function - * wwd_wifi_get_associated_client_list - * - * @return WWD_SUCCESS : if the RSSI was succesfully retrieved - * Error code : if the RSSI was not retrieved - */ -extern wwd_result_t wwd_wifi_get_ap_client_rssi( int32_t* rssi, const wiced_mac_t* client_mac_addr ); - -/** Select the Wi-Fi antenna - * antenna = 0 -> select antenna 0 - * antenna = 1 -> select antenna 1 - * antenna = 3 -> enable auto antenna selection ie. automatic diversity - * - * @param antenna: The antenna configuration to use - * - * @return WWD_SUCCESS : if the antenna selection was successfully set - * Error code : if the antenna selection was not set - */ -extern wwd_result_t wwd_wifi_select_antenna( wiced_antenna_t antenna ); - -/** Bring down the Wi-Fi core - * - * WARNING / NOTE: - * This brings down the Wi-Fi core and existing network connections will be lost. - * Re-establish the network by calling wiced_wifi_up() and wiced_network_up(). - * Refer those APIs for more details. - * - * @return WWD_SUCCESS : if success - * Error code : if fails - */ -extern wwd_result_t wwd_wifi_set_down( void ); - -/** Brings up the Wi-Fi core - * - * @return WWD_SUCCESS : if success - * Error code : if fails - */ -extern wwd_result_t wwd_wifi_set_up( void ); - -/** Manage the addition and removal of custom IEs - * - * @param interface : interface on which the operation to be performed - * @param action : the action to take (add or remove IE) - * @param oui : the oui of the custom IE - * @param subtype : the IE sub-type - * @param data : a pointer to the buffer that hold the custom IE - * @param length : the length of the buffer pointed to by 'data' - * @param which_packets: a mask of which packets this IE should be included in. See wiced_ie_packet_flag_t - * - * @return WWD_SUCCESS : if the custom IE action was successful - * Error code : if the custom IE action failed - */ -extern wwd_result_t wwd_wifi_manage_custom_ie( wwd_interface_t interface, wiced_custom_ie_action_t action, /*@unique@*/ const uint8_t* oui, uint8_t subtype, const void* data, uint16_t length, uint16_t which_packets ); - -/** Set roam trigger level - * - * @param trigger_level : Trigger level in dBm. The Wi-Fi device will search for a new AP to connect to once the \n - * signal from the AP (it is currently associated with) drops below the roam trigger level - * - * @return WWD_SUCCESS : if the roam trigger was successfully set - * Error code : if the roam trigger was not successfully set - */ -extern wwd_result_t wwd_wifi_set_roam_trigger( int32_t trigger_level ); - -/** Get roam trigger level - * - * @param trigger_level : Trigger level in dBm. Pointer to store current roam trigger level value - * @return WWD_SUCCESS : if the roam trigger was successfully get - * Error code : if the roam trigger was not successfully get - */ -extern wwd_result_t wwd_wifi_get_roam_trigger( int32_t* trigger_level ); - -/** Set roam trigger delta value - * - * @param trigger_delta : Trigger delta is in dBm. After a roaming is triggered - The successful roam will happen \n - * when a target AP with RSSI better than the current serving AP by at least trigger_delta (in dB) - * - * @return WWD_SUCCESS : if the roam trigger delta was successfully set - * Error code : if the roam trigger delta was not successfully set - */ -extern wwd_result_t wwd_wifi_set_roam_delta( int32_t trigger_delta ); - -/** Get roam trigger delta value - * - * @param trigger_delta : Trigger delta is in dBm. Pointer to store the current roam trigger delta value - * @return WWD_SUCCESS : if the roam trigger delta was successfully get - * Error code : if the roam trigger delta was not successfully get - */ -extern wwd_result_t wwd_wifi_get_roam_delta( int32_t* trigger_delta ); - -/** Set roam scan period - * - * @param roam_scan_period : Roam scan period is in secs. Updates the partial scan period - for partial scan - Only for STA - * @return WWD_SUCCESS : if the roam scan period was successfully set - * Error code : if the roam scan period was not successfully set - */ -extern wwd_result_t wwd_wifi_set_roam_scan_period( uint32_t roam_scan_period ); - -/** Get roam scan period - * - * @param roam_scan_period : Roam scan period is in secs. Pointer to store the current partial scan period - * @return WWD_SUCCESS : if the roam scan period was successfully get - * Error code : if the roam scan period was not successfully get - */ -extern wwd_result_t wwd_wifi_get_roam_scan_period( uint32_t* roam_scan_period ); - -/** Turn off roaming - * - * @param disable : Boolean value which if TRUE will turn roaming off and if FALSE will turn roaming on - * - * @return WICED_SUCCESS : if the roaming was successfully turned off - * WICED_ERROR : if the roaming was not successfully turned off - */ -extern wwd_result_t wwd_wifi_turn_off_roam( wiced_bool_t disable ); - -/** Send a pre-prepared action frame - * - * @param action_frame : A pointer to a pre-prepared action frame structure - * @param interface : The interface that is sending the action frame (WWD_STA_INTERFACE, WWD_AP_INTERFACE or WWD_P2P_INTERFACE) - * - * @return WWD_SUCCESS or Error code - */ -extern wwd_result_t wwd_wifi_send_action_frame( const wiced_action_frame_t* action_frame, wwd_interface_t interface ); - -/** Retrieve the latest STA EDCF AC parameters - * - * Retrieve the latest Station (STA) interface enahance distributed - * coordination function Access Category parameters - * - * @param acp: The location where the array of AC parameters will be stored - * - * @return WWD_SUCCESS : if the AC Parameters were successfully retrieved - * Error code : if the AC Parameters were not retrieved - */ -extern wwd_result_t wwd_wifi_get_acparams_sta( wiced_edcf_ac_param_t *acp ); - -/** Prioritize access category parameters as a function of min and max contention windows and backoff slots - * - * @param acp: Pointer to an array of AC parameters - * @param priority: Pointer to a matching array of priority values - * - * @return - */ -extern void wwd_wifi_prioritize_acparams( const wiced_edcf_ac_param_t *acp, int *priority ); - -/** For each traffic priority (0..7) look up the 802.11 Access Category that is mapped to this type - * of service and update the TOS map with the priority that the AP actually allows - * - * @return WICED_SUCCESS : if the - * WICED_ERROR : if the AC Parameters were not retrieved - */ -extern wwd_result_t wwd_wifi_update_tos_map( void ); - -/** Print access category parameters with their priority (1-4, where 4 is highest priority) - * - * @param acp: Pointer to an array of AC parameters - * @param priority: Pointer to a matching array of priority values - * - * @return - */ -extern void wwd_wifi_edcf_ac_params_print( const wiced_edcf_ac_param_t *acp, const int *priority ); - - -/** Get the current channel on the WLAN radio - * - * NOTE: on most WLAN devices this will get the channel for both AP *AND* STA - * (since there is only one radio - it cannot be on two channels simulaneously) - * - * @param interface : The interface to set - * @param channel : pointer which receives the current channel - * - * @return WWD_SUCCESS : if the channel was successfully retrieved - * Error code : if the channel was not successfully retrieved - */ -extern wwd_result_t wwd_wifi_get_channel( wwd_interface_t interface, uint32_t* channel ); - -/** Set the current channel on the WLAN radio - * - * NOTE: on most WLAN devices this will set the channel for both AP *AND* STA - * (since there is only one radio - it cannot be on two channels simulaneously) - * - * @param interface : The interface to set - * @param channel : The desired channel - * - * @return WWD_SUCCESS : if the channel was successfully set - * Error code : if the channel was not successfully set - */ -extern wwd_result_t wwd_wifi_set_channel( wwd_interface_t interface, uint32_t channel ); - -/** Get the counters for the provided interface - * - * @param interface : The interface from which the counters are requested - * counters : A pointer to the structure where the counter data will be written - * - * @return WWD_SUCCESS : if the counters were successfully read - * Error code : if the counters were not successfully read - */ -extern wwd_result_t wwd_wifi_get_counters( wwd_interface_t interface, wiced_counters_t* counters ); - -/** Get the maximum number of associations supported by all interfaces (STA and Soft AP) - * - * @param max_assoc : The maximum number of associations supported by the STA and Soft AP interfaces. For example - * if the STA interface is associated then the Soft AP can support (max_assoc - 1) - * associated clients. - * - * @return WICED_SUCCESS : if the maximum number of associated clients was successfully read - * WICED_ERROR : if the maximum number of associated clients was not successfully read - */ -extern wwd_result_t wwd_wifi_get_max_associations( uint32_t* max_assoc ); - - -/** Get the current data rate for the provided interface - * - * @param interface : The interface from which the rate is requested - * rate : A pointer to the uint32_t where the value will be returned in 500Kbits/s units, 0 for auto - * - * @return WWD_SUCCESS : if the rate was successfully read - * Error code : if the rate was not successfully read - */ -extern wwd_result_t wwd_wifi_get_rate( wwd_interface_t interface, uint32_t* rate); - -/** Set the legacy (CCK/OFDM) transmit data rate for the provided interface - * - * @param interface : The interface for which the rate is going to be set - * rate : uint32_t where the rate value is given in 500Kbits/s units, 0 for auto - * - * @return WWD_SUCCESS : if the rate was successfully set - * Error code : if the rate was not successfully set - */ -extern wwd_result_t wwd_wifi_set_legacy_rate( wwd_interface_t interface, int32_t rate); - -/** Set the MCS index transmit data rate for the provided interface - * - * @param interface : The interface for which the rate is going to be set - * mcs : int32_t where the mcs index is given, -1 for auto - * mcsonly : indicate that only the mcs index should be changed - * - * @return WWD_SUCCESS : if the rate was successfully set - * Error code : if the rate was not successfully set - */ -extern wwd_result_t wwd_wifi_set_mcs_rate( wwd_interface_t interface, int32_t mcs, wiced_bool_t mcsonly); - -/** Enable or disable 11n support (support only for pre-11n modes) - * - * NOTE: - * Ensure Wi-Fi core and network is down before invoking this function. - * Refer to wiced_wifi_down() for more details. - * - * @param interface : The interface for which 11n mode is being controlled. Currently only STA supported - * disable : Boolean value which if TRUE will turn 11n off and if FALSE will turn 11n on - * - * @return WICED_SUCCESS : if the 11n was successfully turned off - * WICED_ERROR : if the 11n was not successfully turned off - */ -extern wwd_result_t wwd_wifi_set_11n_support( wwd_interface_t interface, wiced_11n_support_t value ); - -/** Set the AMPDU parameters for both Soft AP and STA - * - * Sets various AMPDU parameters for Soft AP and STA to ensure that the number of buffers dedicated to AMPDUs does - * not exceed the resources of the chip. Both Soft AP and STA interfaces must be down. - * - * @return WICED_SUCCESS : if the AMPDU parameters were successfully set - * WICED_ERROR : if the AMPDU parameters were not successfully set - */ -extern wwd_result_t wwd_wifi_set_ampdu_parameters( void ); - -/** Set the AMPDU Block Ack window size for both Soft AP and STA - * - * Sets the AMPDU Block Ack window size for Soft AP and STA. Soft AP and STA interfaces may be up. - * - * @param interface : STA or Soft AP interface. - * - * @return WICED_SUCCESS : if the Block Ack window size was successfully set - * WICED_ERROR : if the Block Ack window size was not successfully set - */ -extern wwd_result_t wwd_wifi_set_block_ack_window_size( wwd_interface_t interface ); - -/** Get the average PHY noise detected on the antenna. This is valid only after TX. - * Defined only on STA interface - * - * @param noise : reports average noise - * - * @return WWD_SUCCESS : if success - * Error code : if Link quality was not enabled or not successful - */ -extern wwd_result_t wwd_wifi_get_noise( int32_t *noise ); - -/** Get the bands supported by the radio chip - * - * @param band_list : pointer to a structure that will hold the band list information - * - * @return WWD_SUCCESS : if success - * Error code : if not successful - */ -extern wwd_result_t wwd_wifi_get_supported_band_list( wiced_band_list_t* band_list ); - -/** Set the preferred band for association by the radio chip - * Defined only on STA interface - * - * @param band : preferred band (auto, 2.4 GHz or 5 GHz) - * - * @return WWD_SUCCESS : if success - * Error code : if setting the preferred band was not successful - */ -wwd_result_t wwd_wifi_set_preferred_association_band( int32_t band ); - -/** Get the preferred band for association by the radio chip - * - * @param band : pointer to a variable that will hold the band information (auto, 2.4 GHz or 5 GHz) - * - * @return WWD_SUCCESS : if success - * Error code : if not successful - */ -wwd_result_t wwd_wifi_get_preferred_association_band( int32_t* band ); - -/** Sets HT mode for the given interface - * - * NOTE: - * Ensure WiFi core and network is down before invoking this function. - * Refer wiced_wifi_down() API for more details. - * - * @param interface : the interface for which HT mode to be changed. - * ht_mode : enumeration value which indicates the HT mode - * - * @return WICED_SUCCESS : if success - * Error code : error code to indicate the type of error, if HT mode could not be successfully set - */ -extern wwd_result_t wwd_wifi_set_ht_mode( wwd_interface_t interface, wiced_ht_mode_t ht_mode ); - -/** Gets the current HT mode of the given interface - * - * @param interface : the interface for which current HT mode to be identified - * ht_mode : pointers to store the results (i.e., currently configured HT mode) - * - * @return WICED_SUCCESS : if success - * Error code : error code to indicate the type of error, if HT mode could not be successfully get - */ -extern wwd_result_t wwd_wifi_get_ht_mode( wwd_interface_t interface, wiced_ht_mode_t* ht_mode ); - -/** Gets the BSS index that the given interface is mapped to in Wiced - * - * @param interface : the interface for which to get the BSS index - * - * @return BSS index - */ -extern uint32_t wwd_get_bss_index( wwd_interface_t interface ); - -/** Gets the current EAPOL key timeout for the given interface - * - * @param interface : the interface for which we want the EAPOL key timeout - * eapol_key_timeout : pointer to store the EAPOL key timeout value - * - * @return WICED_SUCCESS : if success - * Error code : error code to indicate the type of error - */ -extern wwd_result_t wwd_wifi_get_supplicant_eapol_key_timeout( wwd_interface_t interface, int32_t* eapol_key_timeout ); - -/** Sets the current EAPOL key timeout for the given interface - * - * @param interface : the interface for which we want to set the EAPOL key timeout - * eapol_key_timeout : EAPOL key timeout value - * - * @return WICED_SUCCESS : if success - * Error code : error code to indicate the type of error - */ -extern wwd_result_t wwd_wifi_set_supplicant_eapol_key_timeout( wwd_interface_t interface, int32_t eapol_key_timeout ); - -/*@+exportlocal@*/ -/** @} */ - -/* AP & STA info API */ -extern wwd_result_t wwd_wifi_get_associated_client_list( void* client_list_buffer, uint16_t buffer_length ); -extern wwd_result_t wwd_wifi_get_ap_info( wiced_bss_info_t* ap_info, wiced_security_t* security ); -extern wwd_result_t wwd_wifi_get_bssid( wiced_mac_t* bssid ); - -/* Monitor Mode API */ -extern wwd_result_t wwd_wifi_enable_monitor_mode ( void ); -extern wwd_result_t wwd_wifi_disable_monitor_mode ( void ); -extern wiced_bool_t wwd_wifi_monitor_mode_is_enabled ( void ); -extern wwd_result_t wwd_wifi_set_raw_packet_processor( wwd_wifi_raw_packet_processor_t function ); - -/* Duty cycle control API */ -extern wwd_result_t wwd_wifi_set_ofdm_dutycycle( uint8_t duty_cycle_val ); -extern wwd_result_t wwd_wifi_set_cck_dutycycle ( uint8_t duty_cycle_val ); -extern wwd_result_t wwd_wifi_get_ofdm_dutycycle( uint8_t* duty_cycle_val ); -extern wwd_result_t wwd_wifi_get_cck_dutycycle ( uint8_t* duty_cycle_val ); - -/* PMK retrieval API */ -extern wwd_result_t wwd_wifi_get_pmk( const char* psk, uint8_t psk_length, char* pmk ); - -/* Packet filter API */ -extern wwd_result_t wwd_wifi_add_packet_filter ( const wiced_packet_filter_t* filter_settings ); -extern wwd_result_t wwd_wifi_set_packet_filter_mode ( wiced_packet_filter_mode_t mode ); -extern wwd_result_t wwd_wifi_remove_packet_filter ( uint8_t filter_id ); -extern wwd_result_t wwd_wifi_enable_packet_filter ( uint8_t filter_id ); -extern wwd_result_t wwd_wifi_disable_packet_filter ( uint8_t filter_id ); -extern wwd_result_t wwd_wifi_get_packet_filter_stats ( uint8_t filter_id, wiced_packet_filter_stats_t* stats ); -extern wwd_result_t wwd_wifi_clear_packet_filter_stats ( uint32_t filter_id ); -extern wwd_result_t wwd_wifi_get_packet_filters ( uint32_t max_count, uint32_t offset, wiced_packet_filter_t* list, uint32_t* count_out ); -extern wwd_result_t wwd_wifi_get_packet_filter_mask_and_pattern( uint32_t filter_id, uint32_t max_size, uint8_t* mask, uint8_t* pattern, uint32_t* size_out ); - -/* These functions are not exposed to the external WICED API */ -extern wwd_result_t wwd_wifi_toggle_packet_filter( uint8_t filter_id, wiced_bool_t enable ); - -/* Network Keep Alive API */ -extern wwd_result_t wwd_wifi_add_keep_alive ( const wiced_keep_alive_packet_t* keep_alive_packet_info ); -extern wwd_result_t wwd_wifi_get_keep_alive ( wiced_keep_alive_packet_t* keep_alive_packet_info ); -extern wwd_result_t wwd_wifi_disable_keep_alive( uint8_t id ); -/** @endcond */ - -/** Retrieves the WLAN firmware version - * - * @param[out] Pointer to a buffer that version information will be written to - * @param[in] Length of the buffer - * @return @ref wwd_result_t - */ -extern wwd_result_t wwd_wifi_get_wifi_version( char* version, uint8_t length ); - -extern wwd_result_t wwd_wifi_enable_minimum_power_consumption( void ); - -/* - * APIs to write a bit/word to OTP at the specified bit/word offset. (An OTP word is 16 bits) - * These APIs work only with the MFG WLAN FW and are not supported on the Production WLAN FW. - */ -extern wwd_result_t wwd_wifi_otp_write_bit( uint16_t bit_offset, uint16_t write_bit ); -extern wwd_result_t wwd_wifi_otp_write_word( uint16_t word_offset, uint16_t write_word ); - -extern wwd_result_t wwd_wifi_test_credentials( wiced_scan_result_t* ap, const uint8_t* security_key, uint8_t key_length ); - - -/* These functions are used for link down event handling while in power save mode */ -extern uint8_t wiced_wifi_get_powersave_mode( void ); -extern uint16_t wiced_wifi_get_return_to_sleep_delay( void ); - -extern wwd_result_t wwd_wifi_read_wlan_log( char* buffer, uint32_t buffer_size ); - -extern wwd_result_t wwd_wifi_set_passphrase( const uint8_t* security_key, uint8_t key_length, wwd_interface_t interface ); - -/* Set and get IOVAR parameters */ -extern wwd_result_t wwd_wifi_set_iovar_value( const char* iovar, uint32_t value, wwd_interface_t interface ); -extern wwd_result_t wwd_wifi_get_iovar_value( const char* iovar, uint32_t* value, wwd_interface_t interface ); -extern wwd_result_t wwd_wifi_set_ioctl_value( uint32_t ioctl, uint32_t value, wwd_interface_t interface ); -extern wwd_result_t wwd_wifi_get_ioctl_value( uint32_t ioctl, uint32_t* value, wwd_interface_t interface ); -extern wwd_result_t wwd_wifi_get_revision_info( wwd_interface_t interface, wlc_rev_info_t *buf, uint16_t buflen ); - -/* 802.11K (Radio Measurement) APIs */ -/*----------------------------------*/ -/* - * - * This function gets Radio Resource Management Capabilities and parses them and - * then passes them to user application to format the data. - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param radio_resource_management_capability_ie_t : The data structure get the different Radio Resource capabilities. - * - * - * @returns : status WWD_SUCCESS or failure - */ -extern wwd_result_t wwd_wifi_get_radio_resource_management_capabilities( wwd_interface_t interface, radio_resource_management_capability_ie_t* rrm_cap ); - -/* - * - * This function sets Radio Resource Management Capabilities in the WLAN firmware. - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param radio_resource_management_capability_ie_t : The data structure to set the different Radio Resource capabilities. - * - * - * @returns : status WWD_SUCCESS or failure - */ -extern wwd_result_t wwd_wifi_set_radio_resource_management_capabilities( wwd_interface_t interface, radio_resource_management_capability_ie_t* rrm_cap ); - - -/* - * - * This function send 11k neighbor report measurement request for the particular SSID in the WLAN firmware. - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param wiced_ssid_t : The data structure of the SSID. - * - * - * @returns : status WWD_SUCCESS or failure - */ -extern wwd_result_t wwd_wifi_radio_resource_management_neighbor_req( wwd_interface_t interface, wiced_ssid_t* ssid ); - -/* - * - * This function sets 11k link measurement request for the particular BSSID in the WLAN firmware. - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param wiced_mac_t : MAC Address of the destination - * - * - * @returns : status WWD_SUCCESS or failure - */ -extern wwd_result_t wwd_wifi_radio_resource_management_link_management_req( wwd_interface_t interface, wiced_mac_t* ea ); - -/* - * - * This function sets 11k beacon measurement request in the WLAN firmware. - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param radio_resource_management_beacon_req_t : pointer to data structure of rrm_bcn_req_t - * - * - * @returns : status WWD_SUCCESS or failure - */ -extern wwd_result_t wwd_wifi_radio_resource_management_beacon_req( wwd_interface_t interface, radio_resource_management_beacon_req_t* rrm_bcn_req ); - -/* - * - * This function sets 11k channel load measurement request in the WLAN firmware. - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param radio_resource_management_req_t : pointer to data structure of rrm_chload_req - * - * - * @returns : status WWD_SUCCESS or failure - */ -extern wwd_result_t wwd_wifi_radio_resource_management_channel_load_req( wwd_interface_t interface, radio_resource_management_req_t* rrm_chload_req ); - -/* - * - * This function sets 11k noise measurement request in the WLAN firmware. - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param radio_resource_management_req_t : pointer to data structure of rrm_noise_req - * - * - * @returns : status WWD_SUCCESS or failure - */ -extern wwd_result_t wwd_wifi_radio_resource_management_noise_req( wwd_interface_t interface, radio_resource_management_req_t* rrm_noise_req ); - -/* - * - * This function sets 11k frame measurement request in the WLAN firmware. - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param radio_resource_management_framereq_t : pointer to data structure of rrm_framereq - * - * - * @returns : status WWD_SUCCESS or failure - */ -extern wwd_result_t wwd_wifi_radio_resource_management_frame_req( wwd_interface_t interface, radio_resource_management_framereq_t* rrm_framereq ); - -/* - * - * This function sets 11k stat measurement request in the WLAN firmware. - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param radio_resource_management_statreq_t : pointer to data structure of rrm_statreq - * - * - * @returns : status WWD_SUCCESS or failure - */ -extern wwd_result_t wwd_wifi_radio_resource_management_stat_req( wwd_interface_t interface, radio_resource_management_statreq_t* rrm_statreq ); - -/* - * - * This function gets 11k neighbor report list works from the WLAN firmware. - * - * @param interface : WWD_AP_INTERFACE (works only in AP mode) - * @param uint8_t : buffer pointer to data structure - * @param uint16_t : buffer length - * - * @returns : status WWD_SUCCESS or failure - */ -extern wwd_result_t wwd_wifi_radio_resource_management_neighbor_list( wwd_interface_t interface, uint8_t* buffer, uint16_t buflen ); - -/* - * - * This function deletes node from 11k neighbor report list - * - * @param interface : WWD_AP_INTERFACE (works only in AP mode) - * @param wiced_mac_t : BSSID of the node to be deleted from neighbor report list - * - * - * @returns : status WWD_SUCCESS or failure - */ -extern wwd_result_t wwd_wifi_radio_resource_management_neighbor_del_neighbor( wwd_interface_t interface, wiced_mac_t* bssid); - -/* - * - * This function adds a node to Neighbor list - * - * @param interface : WWD_AP_INTERFACE (works only in AP mode) - * @param rrm_nbr_element_t : pointer to the neighbor element data structure. - * @param buflen : buffer length of the neighbor element data. - * - * - * @returns : status WWD_SUCCESS or failure - */ -extern wwd_result_t wwd_wifi_radio_resource_management_neighbor_add_neighbor( wwd_interface_t interface, radio_resource_management_nbr_element_t* nbr_elt, uint16_t buflen ); - - -/* 802.11R(Fast BSS Transition) APIs */ -/*--------------------------------------*/ -/* - * - * This function sets/resets the value of FBT(Fast BSS Transition) Over-the-DS(Distribution System) - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param set : If the value 1 then FBT over the DS is allowed - * : if the value is 0 then FBT over the DS is not allowed (over the air is the only option) - * @param value : value of the data. - * - * - * @returns : status WWD_SUCCESS or failure - */ -extern wwd_result_t wwd_wifi_fast_bss_transition_over_distribution_system( wwd_interface_t interface, wiced_bool_t set, int* value); - -/* - * - * This function returns the value of WLFBT (1 if Driver 4-way handshake & reassoc (WLFBT) is enabled 1 and 0 if disabled) - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param value : gets value of the FBT capabilities. - * - * - * @returns : status WWD_SUCCESS or failure - */ -extern wwd_result_t wwd_wifi_fast_bss_transition_capabilities( wwd_interface_t interface, wiced_bool_t* enable ); - -/** Set a custom WLAN country code - * - * @param[in] country_code: Country code information - * @return @ref wwd_result_t - */ -//extern wwd_result_t wwd_wifi_set_custom_country_code( const wiced_country_info_t* country_code ); - -/* - * This function will send a channel switch announcement and switch to the specificed channel at the specified time. - * @param[in] wiced_chan_switch_t: pointer to channel switch information - * @param interface : WWD_AP_INTERFACE (works only in AP mode) - * @return @ref wwd_result_t - */ -extern wwd_result_t wwd_wifi_send_csa( const wiced_chan_switch_t* csa, wwd_interface_t interface ); - -/** RRM report callback function pointer type - * - * @param result_ptr : A pointer to the pointer that indicates where to put the next RRM report - * - */ -typedef void (*wiced_rrm_report_callback_t)( wwd_rrm_report_t** result_ptr ); - - -/*****************************************************************************/ -/** @addtogroup utility Utility functions - * @ingroup wifi - * WICED Utility Wi-Fi functions - * - * @{ - */ -/*****************************************************************************/ - -/** Map channel to its band, comparing channel to max 2g channel - * - * @param channel : The channel to map to a band - * - * @return : WL_CHANSPEC_BAND_2G or WL_CHANSPEC_BAND_5G - */ -extern wl_chanspec_t wwd_channel_to_wl_band( uint32_t channel ); - -/** - ****************************************************************************** - * Prints partial details of a scan result on a single line - * - * @param[in] record A pointer to the wiced_scan_result_t record - * - */ -extern void print_scan_result( wiced_scan_result_t* record ); - -/** @} */ - -/** - ****************************************************************************** - * Resets WiFi driver statistic counters - */ - -wwd_result_t wwd_reset_statistics_counters( void ); - -/** - ****************************************************************************** - * Starts or stops the WiFi driver Phyrate logging facility. - * @param[in] a mode selector where 0 = stop, 1 = start TX, 2= start RX - */ - -wwd_result_t wwd_phyrate_log( unsigned int mode ); - -/** - ****************************************************************************** - * Returns the WiFi driver phyrate statistics sinc the last reset. - * @param[in] a pointer to the phyrate counts - * @param[in] size of the phyrate counts buffer - */ - -wwd_result_t wwd_get_phyrate_statistics_counters( wiced_phyrate_counters_t *counts_buffer, unsigned int size); - -/** - ****************************************************************************** - * Returns the WiFi driver phyrate log size since the last reset - * @param[out] size of the phyrate counts buffer - */ - -wwd_result_t wwd_get_phyrate_log_size( unsigned int *size); - -/** - ****************************************************************************** - * Returns the WiFi driver phyrate log since the last reset. - * @param[in] a pointer to the phyrate counts buffer to fill - */ -wwd_result_t wwd_get_phyrate_log( wiced_phyrate_log_t *data); - -/** - ****************************************************************************** - * Returns the WiFi driver statistics counters since the last reset. - * @param[in] a pointer to the counter staticstics buffer to fill - */ - -wwd_result_t wwd_get_counters( wiced_counters_t *data); - -/** - ****************************************************************************** - * Preferred Network Offload functions (pno) - */ - -/** - * Add another preferred network to be searched for in the background. - * Adds are cumulative and can be called one after another. - * @param[in] ssid of the network - * @param[in] security settings for the preferred network - */ - -wwd_result_t wwd_wifi_pno_add_network( wiced_ssid_t *ssid, wiced_security_t security ); - -/** - * clear added networks and disable pno scanning - */ - -wwd_result_t wwd_wifi_pno_clear( void ); - -/** - * enable pno scan process now; use previously added networks - */ - -wwd_result_t wwd_wifi_pno_start( void ); - -/** - * disable pno scan process now; do not clear previously added networks - */ - -wwd_result_t wwd_wifi_pno_stop( void ); - -/** -* Print out an event's information for debugging help -*/ -void wwd_log_event( const wwd_event_header_t* event_header, const uint8_t* event_data ); - -/*@+exportlocal@*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - - -#endif /* ifndef INCLUDED_WWD_WIFI_H */ - - diff --git a/components/WWD/WWD/include/wwd_wlioctl.h b/components/WWD/WWD/include/wwd_wlioctl.h deleted file mode 100644 index 2660647e1fefdb45737717721bf946380eeb57e9..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/include/wwd_wlioctl.h +++ /dev/null @@ -1,3349 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -/* - * Custom OID/ioctl definitions for - * Broadcom 802.11abg Networking Device Driver - */ -#ifndef _wlioctl_h_ -#define _wlioctl_h_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define CH_MAX_2G_CHANNEL (14) /* Max channel in 2G band */ -#define MAX_WFDS_SVC_NAME_LEN (200) /* maximum service_name length */ - -#define ACTION_FRAME_SIZE 1040 -typedef uint16_t wl_chanspec_t; -typedef uint16_t chanspec_t; -#define ETHER_ADDR_LEN 6 -typedef struct ether_addr -{ - uint8_t octet[ETHER_ADDR_LEN]; -} wl_ether_addr_t; -struct wl_ether_header -{ - uint8_t ether_dhost[ETHER_ADDR_LEN]; - uint8_t ether_shost[ETHER_ADDR_LEN]; - uint16_t ether_type; -}; -typedef struct wl_action_frame -{ - wl_ether_addr_t da; - uint16_t len; - uint32_t packetId; - uint8_t data[ACTION_FRAME_SIZE]; -} wl_action_frame_t; -/* ether types */ -#define ETHER_TYPE_LEN 2 -#define ETHER_TYPE_MIN 0x0600 /* Anything less than MIN is a length */ -#define ETHER_TYPE_IP 0x0800 /* IP */ -#define ETHER_TYPE_ARP 0x0806 /* ARP */ -#define ETHER_TYPE_8021Q 0x8100 /* 802.1Q */ -#define ETHER_TYPE_802_1X 0x888e /* 802.1x */ -#ifdef BCMWAPI_WPI -#define ETHER_TYPE_WAI 0x88b4 /* WAPI WAI */ -#endif /* BCMWAPI_WPI */ -#define ETHER_TYPE_802_1X_PREAUTH 0x88c7 /* 802.1x preauthentication */ -#define WL_WIFI_ACTION_FRAME_SIZE sizeof(struct wl_action_frame) -#define BWL_DEFAULT_PACKING - -#define RWL_ACTION_WIFI_CATEGORY 127 -#define RWL_WIFI_OUI_BYTE1 0x90 -#define RWL_WIFI_OUI_BYTE2 0x4C -#define RWL_WIFI_OUI_BYTE3 0x0F -#define RWL_WIFI_ACTION_FRAME_SIZE sizeof(struct dot11_action_wifi_vendor_specific) -#ifndef RWL_WIFI_DEFAULT -#define RWL_WIFI_DEFAULT 0x00 -#define RWL_WIFI_FIND_MY_PEER 0x09 -#define RWL_WIFI_FOUND_PEER 0x0A -#define RWL_ACTION_WIFI_FRAG_TYPE 0x55 -#endif /* RWL_WIFI_DEFAULT */ - -typedef struct ssid_info -{ - uint8_t ssid_len; - uint8_t ssid[32]; -} ssid_info_t; -typedef struct cnt_rx -{ - uint32_t cnt_rxundec; - uint32_t cnt_rxframe; -} cnt_rx_t; -#define RWL_REF_MAC_ADDRESS_OFFSET 17 -#define RWL_DUT_MAC_ADDRESS_OFFSET 23 -#define RWL_WIFI_CLIENT_CHANNEL_OFFSET 50 -#define RWL_WIFI_SERVER_CHANNEL_OFFSET 51 -#define WL_BSS_INFO_VERSION 109 -#define MCSSET_LEN 16 - -typedef struct wl_bss_info_struct { - uint32_t version; /* version field */ - uint32_t length; /* byte length of data in this record, */ - /* starting at version and including IEs */ - wl_ether_addr_t BSSID; - uint16_t beacon_period; /* units are Kusec */ - uint16_t capability; /* Capability information */ - uint8_t SSID_len; - uint8_t SSID[32]; - struct { - uint32_t count; /* # rates in this set */ - uint8_t rates[16]; /* rates in 500kbps units w/hi bit set if basic */ - } rateset; /* supported rates */ - wl_chanspec_t chanspec; /* chanspec for bss */ - uint16_t atim_window; /* units are Kusec */ - uint8_t dtim_period; /* DTIM period */ - int16_t RSSI; /* receive signal strength (in dBm) */ - int8_t phy_noise; /* noise (in dBm) */ - - uint8_t n_cap; /* BSS is 802.11N Capable */ - uint32_t nbss_cap; /* 802.11N BSS Capabilities (based on HT_CAP_*) */ - uint8_t ctl_ch; /* 802.11N BSS control channel number */ - uint32_t reserved32[1]; /* Reserved for expansion of BSS properties */ - uint8_t flags; /* flags */ - uint8_t reserved[3]; /* Reserved for expansion of BSS properties */ - uint8_t basic_mcs[MCSSET_LEN]; /* 802.11N BSS required MCS set */ - - uint16_t ie_offset; /* offset at which IEs start, from beginning */ - uint32_t ie_length; /* byte length of Information Elements */ - int16_t SNR; /* average SNR of during frame reception */ - /* Add new fields here */ - /* variable length Information Elements */ -} wl_bss_info_t; - -typedef struct wlc_ssid -{ - uint32_t SSID_len; - uint8_t SSID[32]; -} wlc_ssid_t; -#define WL_BSSTYPE_INFRA 1 -#define WL_BSSTYPE_INDEP 0 -#define WL_BSSTYPE_ANY 2 -#define WL_SCANFLAGS_PASSIVE 0x01 -#define WL_SCANFLAGS_PROHIBITED 0x04 -typedef struct wl_scan_params -{ - wlc_ssid_t ssid; - wl_ether_addr_t bssid; - int8_t bss_type; - int8_t scan_type; - int32_t nprobes; - int32_t active_time; - int32_t passive_time; - int32_t home_time; - int32_t channel_num; - uint16_t channel_list[1]; -} wl_scan_params_t; -#define WL_SCAN_PARAMS_FIXED_SIZE (68) -#define WL_SCAN_PARAMS_COUNT_MASK (0x0000ffff) -#define WL_SCAN_PARAMS_NSSID_SHIFT (16) -#define WL_SCAN_ACTION_START (1) -#define WL_SCAN_ACTION_CONTINUE (2) -#define WL_SCAN_ACTION_ABORT (3) -#define ISCAN_REQ_VERSION (1) -typedef struct wl_iscan_params -{ - uint32_t version; - uint16_t action; - uint16_t scan_duration; - wl_scan_params_t params; -} wl_iscan_params_t; -#define WL_ISCAN_PARAMS_FIXED_SIZE (offsetof(wl_iscan_params_t, params) + sizeof(wlc_ssid_t)) -typedef struct wl_scan_results -{ - uint32_t buflen; - uint32_t version; - uint32_t count; - wl_bss_info_t bss_info[1]; -} wl_scan_results_t; -#define WL_SCAN_RESULTS_FIXED_SIZE (12) -#define WL_SCAN_RESULTS_SUCCESS (0) -#define WL_SCAN_RESULTS_PARTIAL (1) -#define WL_SCAN_RESULTS_PENDING (2) -#define WL_SCAN_RESULTS_ABORTED (3) -#define WL_SCAN_RESULTS_NO_MEM (4) -#define ESCAN_REQ_VERSION 1 -typedef struct wl_escan_params -{ - uint32_t version; - uint16_t action; - uint16_t sync_id; - wl_scan_params_t params; -} wl_escan_params_t; -#define WL_ESCAN_PARAMS_FIXED_SIZE (offsetof(wl_escan_params_t, params) + sizeof(wlc_ssid_t)) -typedef struct wl_escan_result -{ - uint32_t buflen; - uint32_t version; - uint16_t sync_id; - uint16_t bss_count; - wl_bss_info_t bss_info[1]; -} wl_escan_result_t; -#define WL_ESCAN_RESULTS_FIXED_SIZE (sizeof(wl_escan_result_t) - sizeof(wl_bss_info_t)) -typedef struct wl_iscan_results -{ - uint32_t status; - wl_scan_results_t results; -} wl_iscan_results_t; -#define WL_ISCAN_RESULTS_FIXED_SIZE \ - (WL_SCAN_RESULTS_FIXED_SIZE + offsetof(wl_iscan_results_t, results)) -#define WL_MAXRATES_IN_SET 16 /* max # of rates in a rateset */ -typedef struct wl_rateset -{ - uint32_t count; /* # rates in this set */ - uint8_t rates[WL_MAXRATES_IN_SET]; /* rates in 500kbps units w/hi bit set if basic */ -} wl_rateset_t; - -typedef struct wl_rateset_args { - uint32_t count; /* # rates in this set */ - uint8_t rates[WL_MAXRATES_IN_SET]; /* rates in 500kbps units w/hi bit set if basic */ - uint8_t mcs[WL_MAXRATES_IN_SET]; /* supported mcs index bit map */ -} wl_rateset_args_t; - -typedef struct wl_uint32_list -{ - uint32_t count; - uint32_t element[1]; -} wl_uint32_list_t; - -typedef struct wl_join_scan_params { - uint8_t scan_type; /* 0 use default, active or passive scan */ - int32_t nprobes; /* -1 use default, number of probes per channel */ - int32_t active_time; /* -1 use default, dwell time per channel for - * active scanning - */ - int32_t passive_time; /* -1 use default, dwell time per channel - * for passive scanning - */ - int32_t home_time; /* -1 use default, dwell time for the home channel - * between channel scans - */ -} wl_join_scan_params_t; - -#if !defined(ESTA_POSTMOGRIFY_REMOVAL) -#define NRATE_MCS_INUSE (0x00000080) -#define NRATE_RATE_MASK (0x0000007f) -#define NRATE_STF_MASK (0x0000ff00) -#define NRATE_STF_SHIFT (8) -#define NRATE_OVERRIDE (0x80000000) -#define NRATE_OVERRIDE_MCS_ONLY (0x40000000) -#define NRATE_SGI_MASK (0x00800000) -#define NRATE_SGI_SHIFT (23) -#define NRATE_LDPC_CODING (0x00400000) -#define NRATE_LDPC_SHIFT (22) -#define NRATE_BCMC_OVERRIDE (0x00200000) -#define NRATE_BCMC_SHIFT (21) -#define NRATE_STF_SISO (0) -#define NRATE_STF_CDD (1) -#define NRATE_STF_STBC (2) -#define NRATE_STF_SDM (3) -#define ANTENNA_NUM_1 (1) -#define ANTENNA_NUM_2 (2) -#define ANTENNA_NUM_3 (3) -#define ANTENNA_NUM_4 (4) -#define ANT_SELCFG_AUTO (0x80) -#define ANT_SELCFG_MASK (0x33) -#define ANT_SELCFG_MAX (4) -#define ANT_SELCFG_TX_UNICAST (0) -#define ANT_SELCFG_RX_UNICAST (1) -#define ANT_SELCFG_TX_DEF (2) -#define ANT_SELCFG_RX_DEF (3) -typedef struct -{ - uint8_t ant_config[ANT_SELCFG_MAX]; - uint8_t num_antcfg; -} wlc_antselcfg_t; -#define HIGHEST_SINGLE_STREAM_MCS (7) -#define WLC_CNTRY_BUF_SZ (4) -typedef struct wl_country -{ - int8_t country_abbrev[WLC_CNTRY_BUF_SZ]; - int32_t rev; - int8_t ccode[WLC_CNTRY_BUF_SZ]; -} wl_country_t; -typedef struct wl_channels_in_country -{ - uint32_t buflen; - uint32_t band; - int8_t country_abbrev[WLC_CNTRY_BUF_SZ]; - uint32_t count; - uint32_t channel[1]; -} wl_channels_in_country_t; -typedef struct wl_country_list -{ - uint32_t buflen; - uint32_t band_set; - uint32_t band; - uint32_t count; - int8_t country_abbrev[1]; -} wl_country_list_t; -#define WL_NUM_RPI_BINS 8 -#define WL_RM_TYPE_BASIC 1 -#define WL_RM_TYPE_CCA 2 -#define WL_RM_TYPE_RPI 3 -#define WL_RM_FLAG_PARALLEL (1<<0) -#define WL_RM_FLAG_LATE (1<<1) -#define WL_RM_FLAG_INCAPABLE (1<<2) -#define WL_RM_FLAG_REFUSED (1<<3) -typedef struct wl_rm_req_elt -{ - int8_t type; - int8_t flags; - wl_chanspec_t chanspec; - uint32_t token; - uint32_t tsf_h; - uint32_t tsf_l; - uint32_t dur; -} wl_rm_req_elt_t; -typedef struct wl_rm_req -{ - uint32_t token; - uint32_t count; - void* cb; - void* cb_arg; - wl_rm_req_elt_t req[1]; -} wl_rm_req_t; -#define WL_RM_REQ_FIXED_LEN offsetof(wl_rm_req_t, req) -typedef struct wl_rm_rep_elt -{ - int8_t type; - int8_t flags; - wl_chanspec_t chanspec; - uint32_t token; - uint32_t tsf_h; - uint32_t tsf_l; - uint32_t dur; - uint32_t len; - uint8_t data[1]; -} wl_rm_rep_elt_t; -#define WL_RM_REP_ELT_FIXED_LEN 24 -#define WL_RPI_REP_BIN_NUM 8 -typedef struct wl_rm_rpi_rep -{ - uint8_t rpi[WL_RPI_REP_BIN_NUM]; - int8_t rpi_max[WL_RPI_REP_BIN_NUM]; -} wl_rm_rpi_rep_t; -typedef struct wl_rm_rep -{ - uint32_t token; - uint32_t len; - wl_rm_rep_elt_t rep[1]; -} wl_rm_rep_t; -#define WL_RM_REP_FIXED_LEN 8 -#endif -#define CRYPTO_ALGO_OFF 0 -#define CRYPTO_ALGO_WEP1 1 -#define CRYPTO_ALGO_TKIP 2 -#define CRYPTO_ALGO_WEP128 3 -#define CRYPTO_ALGO_AES_CCM 4 -#define CRYPTO_ALGO_AES_OCB_MSDU 5 -#define CRYPTO_ALGO_AES_OCB_MPDU 6 -#define CRYPTO_ALGO_NALG 7 -#define WSEC_GEN_MIC_ERROR 0x0001 -#define WSEC_GEN_REPLAY 0x0002 -#define WSEC_GEN_ICV_ERROR 0x0004 -#define WL_SOFT_KEY (1 << 0) -#define WL_PRIMARY_KEY (1 << 1) -#define WL_KF_RES_4 (1 << 4) -#define WL_KF_RES_5 (1 << 5) -#define WL_IBSS_PEER_GROUP_KEY (1 << 6) -#define DOT11_MAX_KEY_SIZE 32 -typedef struct wl_wsec_key -{ - uint32_t index; - uint32_t len; - uint8_t data[DOT11_MAX_KEY_SIZE]; - uint32_t pad_1[18]; - uint32_t algo; - uint32_t flags; - uint32_t pad_2[2]; - int32_t pad_3; - int32_t iv_initialized; - int32_t pad_4; - struct - { - uint32_t hi; - uint16_t lo; - } rxiv; - uint32_t pad_5[2]; - wl_ether_addr_t ea; -} wl_wsec_key_t; -#define WSEC_MIN_PSK_LEN 8 -#define WSEC_MAX_PSK_LEN 64 -#define WSEC_PASSPHRASE (1<<0) -typedef struct -{ - uint16_t key_len; - uint16_t flags; - uint8_t key[WSEC_MAX_PSK_LEN]; -} wsec_pmk_t; - -#define OPEN_AUTH 0x0000 -#define SHARED_AUTH 0x0001 -//#define WEP_ENABLED 0x0001 // moved to wwd_constants.h -//#define TKIP_ENABLED 0x0002 -//#define AES_ENABLED 0x0004 - -typedef enum -{ - AUTH_ALGO_80211_OPEN = 1, - AUTH_ALGO_80211_SHARED_KEY = 2, - AUTH_ALGO_WPA = 3, - AUTH_ALGO_WPA_PSK = 4, - AUTH_ALGO_WPA_NONE = 5, - AUTH_ALGO_RSNA = 6, - AUTH_ALGO_RSNA_PSK = 7, -} AUTH_ALGORITHM; - -#define WSEC_SWFLAG 0x0008 -#ifdef BCMCCX -#define CKIP_KP_ENABLED 0x0010 -#define CKIP_MIC_ENABLED 0x0020 -#endif -#define SES_OW_ENABLED 0x0040 -#ifdef WLFIPS -#define FIPS_ENABLED 0x0080 -#endif -#ifdef BCMWAPI_WPI -#define SMS4_ENABLED 0x0100 -#endif -#define WPA_AUTH_DISABLED 0x0000 -#define WPA_AUTH_NONE 0x0001 -#define WPA_AUTH_UNSPECIFIED 0x0002 -#define WPA_AUTH_PSK 0x0004 -#if defined(BCMCCX) || defined(BCMEXTCCX) -#define WPA_AUTH_CCKM 0x0008 -#define WPA2_AUTH_CCKM 0x0010 -#endif -#define WPA2_AUTH_UNSPECIFIED 0x0040 -#define WPA2_AUTH_PSK 0x0080 -#define BRCM_AUTH_PSK 0x0100 -#define BRCM_AUTH_DPT 0x0200 -#ifdef BCMWAPI_WPI -#define WPA_AUTH_WAPI 0x0400 -#endif -#define WPA_AUTH_PFN_ANY 0xffffffff -#define MAXPMKID 16 -#define WPA2_PMKID_LEN 16 -typedef struct _pmkid -{ - wl_ether_addr_t BSSID; - uint8_t PMKID[WPA2_PMKID_LEN]; -} pmkid_t; -typedef struct _pmkid_list -{ - uint32_t npmkid; - pmkid_t pmkid[1]; -} pmkid_list_t; -typedef struct _pmkid_cand -{ - wl_ether_addr_t BSSID; - uint8_t preauth; -} pmkid_cand_t; -typedef struct _pmkid_cand_list -{ - uint32_t npmkid_cand; - pmkid_cand_t pmkid_cand[1]; -} pmkid_cand_list_t; -#if !defined(ESTA_POSTMOGRIFY_REMOVAL) -typedef struct wl_led_info -{ - uint32_t index; - uint32_t behavior; - uint8_t activehi; -} wl_led_info_t; -struct wl_dot11_assoc_req -{ - uint16_t capability; - uint16_t listen; -}; -struct wl_dot11_assoc_resp -{ - uint16_t capability; - uint16_t status; - uint16_t aid; -}; -typedef struct wl_assoc_info -{ - uint32_t req_len; - uint32_t resp_len; - uint32_t flags; - struct wl_dot11_assoc_req req; - wl_ether_addr_t reassoc_bssid; - struct wl_dot11_assoc_resp resp; -} wl_assoc_info_t; -#define WLC_ASSOC_REQ_IS_REASSOC 0x01 -typedef struct -{ - uint32_t byteoff; - uint32_t nbytes; - uint16_t buf[1]; -} srom_rw_t; -typedef struct -{ - uint32_t source; - uint32_t byteoff; - uint32_t nbytes; -} cis_rw_t; -#define WLC_CIS_DEFAULT 0 -#define WLC_CIS_SROM 1 -#define WLC_CIS_OTP 2 -typedef struct -{ - uint32_t byteoff; - uint32_t val; - uint32_t size; - uint32_t band; -} rw_reg_t; -#define WL_ATTEN_APP_INPUT_PCL_OFF 0 -#define WL_ATTEN_PCL_ON 1 -#define WL_ATTEN_PCL_OFF 2 -typedef struct -{ - uint16_t auto_ctrl; - uint16_t bb; - uint16_t radio; - uint16_t txctl1; -} atten_t; -struct wme_tx_params_s -{ - uint8_t short_retry; - uint8_t short_fallback; - uint8_t long_retry; - uint8_t long_fallback; - uint16_t max_rate; -}; -typedef struct wme_tx_params_s wme_tx_params_t; -#define WL_WME_TX_PARAMS_IO_BYTES (sizeof(wme_tx_params_t) * AC_COUNT) -#define WL_PWRIDX_PCL_OFF -2 -#define WL_PWRIDX_PCL_ON -1 -#define WL_PWRIDX_LOWER_LIMIT -2 -#define WL_PWRIDX_UPPER_LIMIT 63 -#endif -typedef struct -{ - uint32_t val; - wl_ether_addr_t ea; -} scb_val_t; -#if !defined(ESTA_POSTMOGRIFY_REMOVAL) -#define BCM_MAC_STATUS_INDICATION (0x40010200L) -typedef struct -{ - uint16_t ver; - uint16_t len; - uint16_t cap; - uint32_t flags; - uint32_t idle; - wl_ether_addr_t ea; - wl_rateset_t rateset; - uint32_t in; - uint32_t listen_interval_inms; - uint32_t tx_pkts; - uint32_t tx_failures; - uint32_t rx_ucast_pkts; - uint32_t rx_mcast_pkts; - uint32_t tx_rate; - uint32_t rx_rate; -} sta_info_t; -#define WL_OLD_STAINFO_SIZE offsetof(sta_info_t, tx_pkts) -#define WL_STA_VER 2 -#define WL_STA_BRCM 0x1 -#define WL_STA_WME 0x2 -#define WL_STA_ABCAP 0x4 -#define WL_STA_AUTHE 0x8 -#define WL_STA_ASSOC 0x10 -#define WL_STA_AUTHO 0x20 -#define WL_STA_WDS 0x40 -#define WL_STA_WDS_LINKUP 0x80 -#define WL_STA_PS 0x100 -#define WL_STA_APSD_BE 0x200 -#define WL_STA_APSD_BK 0x400 -#define WL_STA_APSD_VI 0x800 -#define WL_STA_APSD_VO 0x1000 -#define WL_STA_N_CAP 0x2000 -#define WL_STA_SCBSTATS 0x4000 -#define WL_WDS_LINKUP WL_STA_WDS_LINKUP -#endif -typedef struct channel_info -{ - int32_t hw_channel; - int32_t target_channel; - int32_t scan_channel; -} channel_info_t; -struct mac_list -{ - uint32_t count; - wl_ether_addr_t ea[1]; -}; -typedef struct get_pktcnt -{ - uint32_t rx_good_pkt; - uint32_t rx_bad_pkt; - uint32_t tx_good_pkt; - uint32_t tx_bad_pkt; - uint32_t rx_ocast_good_pkt; -} get_pktcnt_t; -typedef struct wl_ioctl -{ - uint32_t cmd; - void* buf; - uint32_t len; - uint8_t set; - uint32_t used; - uint32_t needed; -} wl_ioctl_t; -#if !defined(ESTA_POSTMOGRIFY_REMOVAL) -typedef struct wlc_rev_info -{ - uint32_t vendorid; - uint32_t deviceid; - uint32_t radiorev; - uint32_t chiprev; - uint32_t corerev; - uint32_t boardid; - uint32_t boardvendor; - uint32_t boardrev; - uint32_t driverrev; - uint32_t ucoderev; - uint32_t bus; - uint32_t chipnum; - uint32_t phytype; - uint32_t phyrev; - uint32_t anarev; -} wlc_rev_info_t; -#define WL_REV_INFO_LEGACY_LENGTH 48 -#define WL_BRAND_MAX 10 -typedef struct wl_instance_info -{ - uint32_t instance; - int8_t brand[WL_BRAND_MAX]; -} wl_instance_info_t; -typedef struct wl_txfifo_sz -{ - uint8_t fifo; - uint8_t size; -} wl_txfifo_sz_t; -#define WLC_IOV_NAME_LEN 30 -typedef struct wlc_iov_trx_s -{ - uint8_t module; - uint8_t type; - int8_t name[WLC_IOV_NAME_LEN]; -} wlc_iov_trx_t; -#endif - -#define IOVAR_STR_ACTFRAME "actframe" -#define IOVAR_STR_BSS "bss" -#define IOVAR_STR_BSS_RATESET "bss_rateset" -#define IOVAR_STR_CSA "csa" -#define IOVAR_STR_AMPDU_TID "ampdu_tid" -#define IOVAR_STR_APSTA "apsta" -#define IOVAR_STR_ALLMULTI "allmulti" -#define IOVAR_STR_COUNTRY "country" -#define IOVAR_STR_EVENT_MSGS "event_msgs" -#define IOVAR_STR_ESCAN "escan" -#define IOVAR_STR_SUP_WPA "sup_wpa" -#define IOVAR_STR_CUR_ETHERADDR "cur_etheraddr" -#define IOVAR_STR_QTXPOWER "qtxpower" -#define IOVAR_STR_MCAST_LIST "mcast_list" -#define IOVAR_STR_PM2_SLEEP_RET "pm2_sleep_ret" -#define IOVAR_STR_PM_LIMIT "pm_limit" -#define IOVAR_STR_LISTEN_INTERVAL_BEACON "bcn_li_bcn" -#define IOVAR_STR_LISTEN_INTERVAL_DTIM "bcn_li_dtim" -#define IOVAR_STR_LISTEN_INTERVAL_ASSOC "assoc_listen" -#define IOVAR_PSPOLL_PERIOD "pspoll_prd" -#define IOVAR_STR_VENDOR_IE "vndr_ie" -#define IOVAR_STR_TX_GLOM "bus:txglom" -#define IOVAR_STR_ACTION_FRAME "wifiaction" -#define IOVAR_STR_AC_PARAMS_STA "wme_ac_sta" -#define IOVAR_STR_COUNTERS "counters" -#define IOVAR_STR_PKT_FILTER_ADD "pkt_filter_add" -#define IOVAR_STR_PKT_FILTER_DELETE "pkt_filter_delete" -#define IOVAR_STR_PKT_FILTER_ENABLE "pkt_filter_enable" -#define IOVAR_STR_PKT_FILTER_MODE "pkt_filter_mode" -#define IOVAR_STR_PKT_FILTER_LIST "pkt_filter_list" -#define IOVAR_STR_PKT_FILTER_STATS "pkt_filter_stats" -#define IOVAR_STR_PKT_FILTER_CLEAR_STATS "pkt_filter_clear_stats" -#define IOVAR_STR_DUTY_CYCLE_CCK "dutycycle_cck" -#define IOVAR_STR_DUTY_CYCLE_OFDM "dutycycle_ofdm" -#define IOVAR_STR_MKEEP_ALIVE "mkeep_alive" -#define IOVAR_STR_VERSION "ver" -#define IOVAR_STR_SUP_WPA2_EAPVER "sup_wpa2_eapver" -#define IOVAR_STR_ROAM_OFF "roam_off" -#define IOVAR_STR_CLOSEDNET "closednet" -#define IOVAR_STR_P2P_DISC "p2p_disc" -#define IOVAR_STR_P2P_DEV "p2p_dev" -#define IOVAR_STR_P2P_IF "p2p_if" -#define IOVAR_STR_P2P_IFADD "p2p_ifadd" -#define IOVAR_STR_P2P_IFDEL "p2p_ifdel" -#define IOVAR_STR_P2P_IFUPD "p2p_ifupd" -#define IOVAR_STR_P2P_SCAN "p2p_scan" -#define IOVAR_STR_P2P_STATE "p2p_state" -#define IOVAR_STR_P2P_SSID "p2p_ssid" -#define IOVAR_STR_NRATE "nrate" -#define IOVAR_STR_BGRATE "bg_rate" -#define IOVAR_STR_ARATE "a_rate" -#define IOVAR_STR_NMODE "nmode" -#define IOVAR_STR_MAX_ASSOC "maxassoc" -#define IOVAR_STR_2G_MULTICAST_RATE "2g_mrate" -#define IOVAR_STR_2G_RATE "2g_rate" -#define IOVAR_STR_MPC "mpc" -#define IOVAR_STR_IBSS_JOIN "IBSS_join_only" -#define IOVAR_STR_AMPDU_BA_WINDOW_SIZE "ampdu_ba_wsize" -#define IOVAR_STR_AMPDU_MPDU "ampdu_mpdu" -#define IOVAR_STR_AMPDU_RX_FACTOR "ampdu_rx_factor" -#define IOVAR_STR_MIMO_BW_CAP "mimo_bw_cap" -#define IOVAR_STR_RMC_ACKREQ "rmc_ackreq" -#define IOVAR_STR_RMC_STATUS "rmc_status" -#define IOVAR_STR_RMC_ROLE "rmc_role" -#define IOVAR_STR_HT40_INTOLERANCE "intol40" -#define IOVAR_STR_RAND "rand" -#define IOVAR_STR_SSID "ssid" -#define IOVAR_STR_WSEC "wsec" -#define IOVAR_STR_WPA_AUTH "wpa_auth" -#define IOVAR_STR_INTERFACE_REMOVE "interface_remove" -#define IOVAR_STR_SUP_WPA_TMO "sup_wpa_tmo" -#define IOVAR_STR_JOIN "join" -#define IOVAR_STR_TLV "tlv" -#define IOVAR_STR_NPHY_ANTSEL "nphy_antsel" -#define IOVAR_STR_AVB_TIMESTAMP_ADDR "avb_timestamp_addr" -#define IOVAR_STR_BSS_MAX_ASSOC "bss_maxassoc" -#define IOVAR_STR_RM_REQ "rm_req" -#define IOVAR_STR_RM_REP "rm_rep" -#define IOVAR_STR_PSPRETEND_RETRY_LIMIT "pspretend_retry_limit" -#define IOVAR_STR_PSPRETEND_THRESHOLD "pspretend_threshold" -#define IOVAR_STR_SWDIV_TIMEOUT "swdiv_timeout" -#define IOVAR_STR_RESET_CNTS "reset_cnts" -#define IOVAR_STR_PHYRATE_LOG "phyrate_log" -#define IOVAR_STR_PHYRATE_LOG_SIZE "phyrate_log_size" -#define IOVAR_STR_PHYRATE_LOG_DUMP "phyrate_dump" -#define IOVAR_STR_SCAN_ASSOC_TIME "scan_assoc_time" -#define IOVAR_STR_SCAN_UNASSOC_TIME "scan_unassoc_time" -#define IOVAR_STR_SCAN_PASSIVE_TIME "scan_passive_time" -#define IOVAR_STR_SCAN_HOME_TIME "scan_home_time" -#define IOVAR_STR_SCAN_NPROBES "scan_nprobes" -#define IOVAR_STR_AUTOCOUNTRY "autocountry" - -#define IOVAR_STR_PNO_ON "pfn" -#define IOVAR_STR_PNO_ADD "pfn_add" -#define IOVAR_STR_PNO_SET "pfn_set" -#define IOVAR_STR_PNO_CLEAR "pfnclear" -#define IOVAR_STR_SCAN_CACHE_CLEAR "scancache_clear" -#define MCS_SETLEN 16 - -#define IOVAR_STR_RRM "rrm" -#define IOVAR_STR_RRM_NOISE_REQ "rrm_noise_req" -#define IOVAR_STR_RRM_NBR_REQ "rrm_nbr_req" -#define IOVAR_STR_RRM_LM_REQ "rrm_lm_req" -#define IOVAR_STR_RRM_STAT_REQ "rrm_stat_req" -#define IOVAR_STR_RRM_FRAME_REQ "rrm_frame_req" -#define IOVAR_STR_RRM_CHLOAD_REQ "rrm_chload_req" -#define IOVAR_STR_RRM_BCN_REQ "rrm_bcn_req" -#define IOVAR_STR_RRM_NBR_LIST "rrm_nbr_list" -#define IOVAR_STR_RRM_NBR_ADD "rrm_nbr_add_nbr" -#define IOVAR_STR_RRM_NBR_DEL "rrm_nbr_del_nbr" - -#define IOVAR_STR_FBT_OVER_DS "fbtoverds" -#define IOVAR_STR_FBT_CAPIBILITIES "fbt_cap" - -#define IOVAR_STR_MFP "mfp" - -#define IOVAR_STR_OTPRAW "otpraw" - -#define WLC_IOCTL_MAGIC ( 0x14e46c77 ) -#define WLC_IOCTL_VERSION ( 1 ) -#define WLC_IOCTL_SMLEN ( 256 ) -#define WLC_IOCTL_MEDLEN ( 1536 ) -#define WLC_IOCTL_MAXLEN ( 8192 ) - -#define WLC_GET_MAGIC ( (uint32_t) 0 ) -#define WLC_GET_VERSION ( (uint32_t) 1 ) -#define WLC_UP ( (uint32_t) 2 ) -#define WLC_DOWN ( (uint32_t) 3 ) -#define WLC_GET_LOOP ( (uint32_t) 4 ) -#define WLC_SET_LOOP ( (uint32_t) 5 ) -#define WLC_DUMP ( (uint32_t) 6 ) -#define WLC_GET_MSGLEVEL ( (uint32_t) 7 ) -#define WLC_SET_MSGLEVEL ( (uint32_t) 8 ) -#define WLC_GET_PROMISC ( (uint32_t) 9 ) -#define WLC_SET_PROMISC ( (uint32_t) 10 ) -#define WLC_GET_RATE ( (uint32_t) 12 ) -#define WLC_GET_INSTANCE ( (uint32_t) 14 ) -#define WLC_GET_INFRA ( (uint32_t) 19 ) -#define WLC_SET_INFRA ( (uint32_t) 20 ) -#define WLC_GET_AUTH ( (uint32_t) 21 ) -#define WLC_SET_AUTH ( (uint32_t) 22 ) -#define WLC_GET_BSSID ( (uint32_t) 23 ) -#define WLC_SET_BSSID ( (uint32_t) 24 ) -#define WLC_GET_SSID ( (uint32_t) 25 ) -#define WLC_SET_SSID ( (uint32_t) 26 ) -#define WLC_RESTART ( (uint32_t) 27 ) -#define WLC_GET_CHANNEL ( (uint32_t) 29 ) -#define WLC_SET_CHANNEL ( (uint32_t) 30 ) -#define WLC_GET_SRL ( (uint32_t) 31 ) -#define WLC_SET_SRL ( (uint32_t) 32 ) -#define WLC_GET_LRL ( (uint32_t) 33 ) -#define WLC_SET_LRL ( (uint32_t) 34 ) -#define WLC_GET_PLCPHDR ( (uint32_t) 35 ) -#define WLC_SET_PLCPHDR ( (uint32_t) 36 ) -#define WLC_GET_RADIO ( (uint32_t) 37 ) -#define WLC_SET_RADIO ( (uint32_t) 38 ) -#define WLC_GET_PHYTYPE ( (uint32_t) 39 ) -#define WLC_DUMP_RATE ( (uint32_t) 40 ) -#define WLC_SET_RATE_PARAMS ( (uint32_t) 41 ) -#define WLC_GET_KEY ( (uint32_t) 44 ) -#define WLC_SET_KEY ( (uint32_t) 45 ) -#define WLC_GET_REGULATORY ( (uint32_t) 46 ) -#define WLC_SET_REGULATORY ( (uint32_t) 47 ) -#define WLC_GET_PASSIVE_SCAN ( (uint32_t) 48 ) -#define WLC_SET_PASSIVE_SCAN ( (uint32_t) 49 ) -#define WLC_SCAN ( (uint32_t) 50 ) -#define WLC_SCAN_RESULTS ( (uint32_t) 51 ) -#define WLC_DISASSOC ( (uint32_t) 52 ) -#define WLC_REASSOC ( (uint32_t) 53 ) -#define WLC_GET_ROAM_TRIGGER ( (uint32_t) 54 ) -#define WLC_SET_ROAM_TRIGGER ( (uint32_t) 55 ) -#define WLC_GET_ROAM_DELTA ( (uint32_t) 56 ) -#define WLC_SET_ROAM_DELTA ( (uint32_t) 57 ) -#define WLC_GET_ROAM_SCAN_PERIOD ( (uint32_t) 58 ) -#define WLC_SET_ROAM_SCAN_PERIOD ( (uint32_t) 59 ) -#define WLC_EVM ( (uint32_t) 60 ) -#define WLC_GET_TXANT ( (uint32_t) 61 ) -#define WLC_SET_TXANT ( (uint32_t) 62 ) -#define WLC_GET_ANTDIV ( (uint32_t) 63 ) -#define WLC_SET_ANTDIV ( (uint32_t) 64 ) -#define WLC_GET_CLOSED ( (uint32_t) 67 ) -#define WLC_SET_CLOSED ( (uint32_t) 68 ) -#define WLC_GET_MACLIST ( (uint32_t) 69 ) -#define WLC_SET_MACLIST ( (uint32_t) 70 ) -#define WLC_GET_RATESET ( (uint32_t) 71 ) -#define WLC_SET_RATESET ( (uint32_t) 72 ) -#define WLC_LONGTRAIN ( (uint32_t) 74 ) -#define WLC_GET_BCNPRD ( (uint32_t) 75 ) -#define WLC_SET_BCNPRD ( (uint32_t) 76 ) -#define WLC_GET_DTIMPRD ( (uint32_t) 77 ) -#define WLC_SET_DTIMPRD ( (uint32_t) 78 ) -#define WLC_GET_SROM ( (uint32_t) 79 ) -#define WLC_SET_SROM ( (uint32_t) 80 ) -#define WLC_GET_WEP_RESTRICT ( (uint32_t) 81 ) -#define WLC_SET_WEP_RESTRICT ( (uint32_t) 82 ) -#define WLC_GET_COUNTRY ( (uint32_t) 83 ) -#define WLC_SET_COUNTRY ( (uint32_t) 84 ) -#define WLC_GET_PM ( (uint32_t) 85 ) -#define WLC_SET_PM ( (uint32_t) 86 ) -#define WLC_GET_WAKE ( (uint32_t) 87 ) -#define WLC_SET_WAKE ( (uint32_t) 88 ) -#define WLC_GET_FORCELINK ( (uint32_t) 90 ) -#define WLC_SET_FORCELINK ( (uint32_t) 91 ) -#define WLC_FREQ_ACCURACY ( (uint32_t) 92 ) -#define WLC_CARRIER_SUPPRESS ( (uint32_t) 93 ) -#define WLC_GET_PHYREG ( (uint32_t) 94 ) -#define WLC_SET_PHYREG ( (uint32_t) 95 ) -#define WLC_GET_RADIOREG ( (uint32_t) 96 ) -#define WLC_SET_RADIOREG ( (uint32_t) 97 ) -#define WLC_GET_REVINFO ( (uint32_t) 98 ) -#define WLC_GET_UCANTDIV ( (uint32_t) 99 ) -#define WLC_SET_UCANTDIV ( (uint32_t) 100 ) -#define WLC_R_REG ( (uint32_t) 101 ) -#define WLC_W_REG ( (uint32_t) 102 ) -#define WLC_GET_MACMODE ( (uint32_t) 105 ) -#define WLC_SET_MACMODE ( (uint32_t) 106 ) -#define WLC_GET_MONITOR ( (uint32_t) 107 ) -#define WLC_SET_MONITOR ( (uint32_t) 108 ) -#define WLC_GET_GMODE ( (uint32_t) 109 ) -#define WLC_SET_GMODE ( (uint32_t) 110 ) -#define WLC_GET_LEGACY_ERP ( (uint32_t) 111 ) -#define WLC_SET_LEGACY_ERP ( (uint32_t) 112 ) -#define WLC_GET_RX_ANT ( (uint32_t) 113 ) -#define WLC_GET_CURR_RATESET ( (uint32_t) 114 ) -#define WLC_GET_SCANSUPPRESS ( (uint32_t) 115 ) -#define WLC_SET_SCANSUPPRESS ( (uint32_t) 116 ) -#define WLC_GET_AP ( (uint32_t) 117 ) -#define WLC_SET_AP ( (uint32_t) 118 ) -#define WLC_GET_EAP_RESTRICT ( (uint32_t) 119 ) -#define WLC_SET_EAP_RESTRICT ( (uint32_t) 120 ) -#define WLC_SCB_AUTHORIZE ( (uint32_t) 121 ) -#define WLC_SCB_DEAUTHORIZE ( (uint32_t) 122 ) -#define WLC_GET_WDSLIST ( (uint32_t) 123 ) -#define WLC_SET_WDSLIST ( (uint32_t) 124 ) -#define WLC_GET_ATIM ( (uint32_t) 125 ) -#define WLC_SET_ATIM ( (uint32_t) 126 ) -#define WLC_GET_RSSI ( (uint32_t) 127 ) -#define WLC_GET_PHYANTDIV ( (uint32_t) 128 ) -#define WLC_SET_PHYANTDIV ( (uint32_t) 129 ) -#define WLC_AP_RX_ONLY ( (uint32_t) 130 ) -#define WLC_GET_TX_PATH_PWR ( (uint32_t) 131 ) -#define WLC_SET_TX_PATH_PWR ( (uint32_t) 132 ) -#define WLC_GET_WSEC ( (uint32_t) 133 ) -#define WLC_SET_WSEC ( (uint32_t) 134 ) -#define WLC_GET_PHY_NOISE ( (uint32_t) 135 ) -#define WLC_GET_BSS_INFO ( (uint32_t) 136 ) -#define WLC_GET_PKTCNTS ( (uint32_t) 137 ) -#define WLC_GET_LAZYWDS ( (uint32_t) 138 ) -#define WLC_SET_LAZYWDS ( (uint32_t) 139 ) -#define WLC_GET_BANDLIST ( (uint32_t) 140 ) -#define WLC_GET_BAND ( (uint32_t) 141 ) -#define WLC_SET_BAND ( (uint32_t) 142 ) -#define WLC_SCB_DEAUTHENTICATE ( (uint32_t) 143 ) -#define WLC_GET_SHORTSLOT ( (uint32_t) 144 ) -#define WLC_GET_SHORTSLOT_OVERRIDE ( (uint32_t) 145 ) -#define WLC_SET_SHORTSLOT_OVERRIDE ( (uint32_t) 146 ) -#define WLC_GET_SHORTSLOT_RESTRICT ( (uint32_t) 147 ) -#define WLC_SET_SHORTSLOT_RESTRICT ( (uint32_t) 148 ) -#define WLC_GET_GMODE_PROTECTION ( (uint32_t) 149 ) -#define WLC_GET_GMODE_PROTECTION_OVERRIDE ( (uint32_t) 150 ) -#define WLC_SET_GMODE_PROTECTION_OVERRIDE ( (uint32_t) 151 ) -#define WLC_UPGRADE ( (uint32_t) 152 ) -#define WLC_GET_IGNORE_BCNS ( (uint32_t) 155 ) -#define WLC_SET_IGNORE_BCNS ( (uint32_t) 156 ) -#define WLC_GET_SCB_TIMEOUT ( (uint32_t) 157 ) -#define WLC_SET_SCB_TIMEOUT ( (uint32_t) 158 ) -#define WLC_GET_ASSOCLIST ( (uint32_t) 159 ) -#define WLC_GET_CLK ( (uint32_t) 160 ) -#define WLC_SET_CLK ( (uint32_t) 161 ) -#define WLC_GET_UP ( (uint32_t) 162 ) -#define WLC_OUT ( (uint32_t) 163 ) -#define WLC_GET_WPA_AUTH ( (uint32_t) 164 ) -#define WLC_SET_WPA_AUTH ( (uint32_t) 165 ) -#define WLC_GET_UCFLAGS ( (uint32_t) 166 ) -#define WLC_SET_UCFLAGS ( (uint32_t) 167 ) -#define WLC_GET_PWRIDX ( (uint32_t) 168 ) -#define WLC_SET_PWRIDX ( (uint32_t) 169 ) -#define WLC_GET_TSSI ( (uint32_t) 170 ) -#define WLC_GET_SUP_RATESET_OVERRIDE ( (uint32_t) 171 ) -#define WLC_SET_SUP_RATESET_OVERRIDE ( (uint32_t) 172 ) -#define WLC_GET_PROTECTION_CONTROL ( (uint32_t) 178 ) -#define WLC_SET_PROTECTION_CONTROL ( (uint32_t) 179 ) -#define WLC_GET_PHYLIST ( (uint32_t) 180 ) -#define WLC_ENCRYPT_STRENGTH ( (uint32_t) 181 ) -#define WLC_DECRYPT_STATUS ( (uint32_t) 182 ) -#define WLC_GET_KEY_SEQ ( (uint32_t) 183 ) -#define WLC_GET_SCAN_CHANNEL_TIME ( (uint32_t) 184 ) -#define WLC_SET_SCAN_CHANNEL_TIME ( (uint32_t) 185 ) -#define WLC_GET_SCAN_UNASSOC_TIME ( (uint32_t) 186 ) -#define WLC_SET_SCAN_UNASSOC_TIME ( (uint32_t) 187 ) -#define WLC_GET_SCAN_HOME_TIME ( (uint32_t) 188 ) -#define WLC_SET_SCAN_HOME_TIME ( (uint32_t) 189 ) -#define WLC_GET_SCAN_NPROBES ( (uint32_t) 190 ) -#define WLC_SET_SCAN_NPROBES ( (uint32_t) 191 ) -#define WLC_GET_PRB_RESP_TIMEOUT ( (uint32_t) 192 ) -#define WLC_SET_PRB_RESP_TIMEOUT ( (uint32_t) 193 ) -#define WLC_GET_ATTEN ( (uint32_t) 194 ) -#define WLC_SET_ATTEN ( (uint32_t) 195 ) -#define WLC_GET_SHMEM ( (uint32_t) 196 ) -#define WLC_SET_SHMEM ( (uint32_t) 197 ) -#define WLC_SET_WSEC_TEST ( (uint32_t) 200 ) -#define WLC_SCB_DEAUTHENTICATE_FOR_REASON ( (uint32_t) 201 ) -#define WLC_TKIP_COUNTERMEASURES ( (uint32_t) 202 ) -#define WLC_GET_PIOMODE ( (uint32_t) 203 ) -#define WLC_SET_PIOMODE ( (uint32_t) 204 ) -#define WLC_SET_ASSOC_PREFER ( (uint32_t) 205 ) -#define WLC_GET_ASSOC_PREFER ( (uint32_t) 206 ) -#define WLC_SET_ROAM_PREFER ( (uint32_t) 207 ) -#define WLC_GET_ROAM_PREFER ( (uint32_t) 208 ) -#define WLC_SET_LED ( (uint32_t) 209 ) -#define WLC_GET_LED ( (uint32_t) 210 ) -#define WLC_GET_INTERFERENCE_MODE ( (uint32_t) 211 ) -#define WLC_SET_INTERFERENCE_MODE ( (uint32_t) 212 ) -#define WLC_GET_CHANNEL_QA ( (uint32_t) 213 ) -#define WLC_START_CHANNEL_QA ( (uint32_t) 214 ) -#define WLC_GET_CHANNEL_SEL ( (uint32_t) 215 ) -#define WLC_START_CHANNEL_SEL ( (uint32_t) 216 ) -#define WLC_GET_VALID_CHANNELS ( (uint32_t) 217 ) -#define WLC_GET_FAKEFRAG ( (uint32_t) 218 ) -#define WLC_SET_FAKEFRAG ( (uint32_t) 219 ) -#define WLC_GET_PWROUT_PERCENTAGE ( (uint32_t) 220 ) -#define WLC_SET_PWROUT_PERCENTAGE ( (uint32_t) 221 ) -#define WLC_SET_BAD_FRAME_PREEMPT ( (uint32_t) 222 ) -#define WLC_GET_BAD_FRAME_PREEMPT ( (uint32_t) 223 ) -#define WLC_SET_LEAP_LIST ( (uint32_t) 224 ) -#define WLC_GET_LEAP_LIST ( (uint32_t) 225 ) -#define WLC_GET_CWMIN ( (uint32_t) 226 ) -#define WLC_SET_CWMIN ( (uint32_t) 227 ) -#define WLC_GET_CWMAX ( (uint32_t) 228 ) -#define WLC_SET_CWMAX ( (uint32_t) 229 ) -#define WLC_GET_WET ( (uint32_t) 230 ) -#define WLC_SET_WET ( (uint32_t) 231 ) -#define WLC_GET_PUB ( (uint32_t) 232 ) -#define WLC_GET_KEY_PRIMARY ( (uint32_t) 235 ) -#define WLC_SET_KEY_PRIMARY ( (uint32_t) 236 ) -#define WLC_GET_ACI_ARGS ( (uint32_t) 238 ) -#define WLC_SET_ACI_ARGS ( (uint32_t) 239 ) -#define WLC_UNSET_CALLBACK ( (uint32_t) 240 ) -#define WLC_SET_CALLBACK ( (uint32_t) 241 ) -#define WLC_GET_RADAR ( (uint32_t) 242 ) -#define WLC_SET_RADAR ( (uint32_t) 243 ) -#define WLC_SET_SPECT_MANAGMENT ( (uint32_t) 244 ) -#define WLC_GET_SPECT_MANAGMENT ( (uint32_t) 245 ) -#define WLC_WDS_GET_REMOTE_HWADDR ( (uint32_t) 246 ) -#define WLC_WDS_GET_WPA_SUP ( (uint32_t) 247 ) -#define WLC_SET_CS_SCAN_TIMER ( (uint32_t) 248 ) -#define WLC_GET_CS_SCAN_TIMER ( (uint32_t) 249 ) -#define WLC_MEASURE_REQUEST ( (uint32_t) 250 ) -#define WLC_INIT ( (uint32_t) 251 ) -#define WLC_SEND_QUIET ( (uint32_t) 252 ) -#define WLC_KEEPALIVE ( (uint32_t) 253 ) -#define WLC_SEND_PWR_CONSTRAINT ( (uint32_t) 254 ) -#define WLC_UPGRADE_STATUS ( (uint32_t) 255 ) -#define WLC_CURRENT_PWR ( (uint32_t) 256 ) -#define WLC_GET_SCAN_PASSIVE_TIME ( (uint32_t) 257 ) -#define WLC_SET_SCAN_PASSIVE_TIME ( (uint32_t) 258 ) -#define WLC_LEGACY_LINK_BEHAVIOR ( (uint32_t) 259 ) -#define WLC_GET_CHANNELS_IN_COUNTRY ( (uint32_t) 260 ) -#define WLC_GET_COUNTRY_LIST ( (uint32_t) 261 ) -#define WLC_GET_VAR ( (uint32_t) 262 ) -#define WLC_SET_VAR ( (uint32_t) 263 ) -#define WLC_NVRAM_GET ( (uint32_t) 264 ) -#define WLC_NVRAM_SET ( (uint32_t) 265 ) -#define WLC_NVRAM_DUMP ( (uint32_t) 266 ) -#define WLC_REBOOT ( (uint32_t) 267 ) -#define WLC_SET_WSEC_PMK ( (uint32_t) 268 ) -#define WLC_GET_AUTH_MODE ( (uint32_t) 269 ) -#define WLC_SET_AUTH_MODE ( (uint32_t) 270 ) -#define WLC_GET_WAKEENTRY ( (uint32_t) 271 ) -#define WLC_SET_WAKEENTRY ( (uint32_t) 272 ) -#define WLC_NDCONFIG_ITEM ( (uint32_t) 273 ) -#define WLC_NVOTPW ( (uint32_t) 274 ) -#define WLC_OTPW ( (uint32_t) 275 ) -#define WLC_IOV_BLOCK_GET ( (uint32_t) 276 ) -#define WLC_IOV_MODULES_GET ( (uint32_t) 277 ) -#define WLC_SOFT_RESET ( (uint32_t) 278 ) -#define WLC_GET_ALLOW_MODE ( (uint32_t) 279 ) -#define WLC_SET_ALLOW_MODE ( (uint32_t) 280 ) -#define WLC_GET_DESIRED_BSSID ( (uint32_t) 281 ) -#define WLC_SET_DESIRED_BSSID ( (uint32_t) 282 ) -#define WLC_DISASSOC_MYAP ( (uint32_t) 283 ) -#define WLC_GET_NBANDS ( (uint32_t) 284 ) -#define WLC_GET_BANDSTATES ( (uint32_t) 285 ) -#define WLC_GET_WLC_BSS_INFO ( (uint32_t) 286 ) -#define WLC_GET_ASSOC_INFO ( (uint32_t) 287 ) -#define WLC_GET_OID_PHY ( (uint32_t) 288 ) -#define WLC_SET_OID_PHY ( (uint32_t) 289 ) -#define WLC_SET_ASSOC_TIME ( (uint32_t) 290 ) -#define WLC_GET_DESIRED_SSID ( (uint32_t) 291 ) -#define WLC_GET_CHANSPEC ( (uint32_t) 292 ) -#define WLC_GET_ASSOC_STATE ( (uint32_t) 293 ) -#define WLC_SET_PHY_STATE ( (uint32_t) 294 ) -#define WLC_GET_SCAN_PENDING ( (uint32_t) 295 ) -#define WLC_GET_SCANREQ_PENDING ( (uint32_t) 296 ) -#define WLC_GET_PREV_ROAM_REASON ( (uint32_t) 297 ) -#define WLC_SET_PREV_ROAM_REASON ( (uint32_t) 298 ) -#define WLC_GET_BANDSTATES_PI ( (uint32_t) 299 ) -#define WLC_GET_PHY_STATE ( (uint32_t) 300 ) -#define WLC_GET_BSS_WPA_RSN ( (uint32_t) 301 ) -#define WLC_GET_BSS_WPA2_RSN ( (uint32_t) 302 ) -#define WLC_GET_BSS_BCN_TS ( (uint32_t) 303 ) -#define WLC_GET_INT_DISASSOC ( (uint32_t) 304 ) -#define WLC_SET_NUM_PEERS ( (uint32_t) 305 ) -#define WLC_GET_NUM_BSS ( (uint32_t) 306 ) -#define WLC_GET_WSEC_PMK ( (uint32_t) 318 ) -#define WLC_GET_RANDOM_BYTES ( (uint32_t) 319 ) -#define WLC_LAST ( (uint32_t) 320 ) - -#ifndef EPICTRL_COOKIE -#define EPICTRL_COOKIE 0xABADCEDE -#endif -#define CMN_IOCTL_OFF 0x180 -#define WL_OID_BASE 0xFFE41420 -#define OID_WL_GETINSTANCE (WL_OID_BASE + WLC_GET_INSTANCE) -#define OID_WL_GET_FORCELINK (WL_OID_BASE + WLC_GET_FORCELINK) -#define OID_WL_SET_FORCELINK (WL_OID_BASE + WLC_SET_FORCELINK) -#define OID_WL_ENCRYPT_STRENGTH (WL_OID_BASE + WLC_ENCRYPT_STRENGTH) -#define OID_WL_DECRYPT_STATUS (WL_OID_BASE + WLC_DECRYPT_STATUS) -#define OID_LEGACY_LINK_BEHAVIOR (WL_OID_BASE + WLC_LEGACY_LINK_BEHAVIOR) -#define OID_WL_NDCONFIG_ITEM (WL_OID_BASE + WLC_NDCONFIG_ITEM) -#define OID_STA_CHANSPEC (WL_OID_BASE + WLC_GET_CHANSPEC) -#define OID_STA_NBANDS (WL_OID_BASE + WLC_GET_NBANDS) -#define OID_STA_GET_PHY (WL_OID_BASE + WLC_GET_OID_PHY) -#define OID_STA_SET_PHY (WL_OID_BASE + WLC_SET_OID_PHY) -#define OID_STA_ASSOC_TIME (WL_OID_BASE + WLC_SET_ASSOC_TIME) -#define OID_STA_DESIRED_SSID (WL_OID_BASE + WLC_GET_DESIRED_SSID) -#define OID_STA_SET_PHY_STATE (WL_OID_BASE + WLC_SET_PHY_STATE) -#define OID_STA_SCAN_PENDING (WL_OID_BASE + WLC_GET_SCAN_PENDING) -#define OID_STA_SCANREQ_PENDING (WL_OID_BASE + WLC_GET_SCANREQ_PENDING) -#define OID_STA_GET_ROAM_REASON (WL_OID_BASE + WLC_GET_PREV_ROAM_REASON) -#define OID_STA_SET_ROAM_REASON (WL_OID_BASE + WLC_SET_PREV_ROAM_REASON) -#define OID_STA_GET_PHY_STATE (WL_OID_BASE + WLC_GET_PHY_STATE) -#define OID_STA_INT_DISASSOC (WL_OID_BASE + WLC_GET_INT_DISASSOC) -#define OID_STA_SET_NUM_PEERS (WL_OID_BASE + WLC_SET_NUM_PEERS) -#define OID_STA_GET_NUM_BSS (WL_OID_BASE + WLC_GET_NUM_BSS) -#define WL_DECRYPT_STATUS_SUCCESS 1 -#define WL_DECRYPT_STATUS_FAILURE 2 -#define WL_DECRYPT_STATUS_UNKNOWN 3 -#define WLC_UPGRADE_SUCCESS 0 -#define WLC_UPGRADE_PENDING 1 -#ifdef CONFIG_USBRNDIS_RETAIL -typedef struct -{ - int8_t* name; - void* param; -}ndconfig_item_t; -#endif -#ifdef EXT_STA -typedef struct _wl_assoc_result -{ - ulong associated; - ulong NDIS_auth; - ulong NDIS_infra; -}wl_assoc_result_t; -#endif -#define WL_RADIO_SW_DISABLE (1<<0) -#define WL_RADIO_HW_DISABLE (1<<1) -#define WL_RADIO_MPC_DISABLE (1<<2) -#define WL_RADIO_COUNTRY_DISABLE (1<<3) -#define WL_TXPWR_OVERRIDE (1U<<31) -#define WL_PHY_PAVARS_LEN (6) -#define WL_DIAG_INTERRUPT (1) -#define WL_DIAG_LOOPBACK (2) -#define WL_DIAG_MEMORY (3) -#define WL_DIAG_LED (4) -#define WL_DIAG_REG (5) -#define WL_DIAG_SROM (6) -#define WL_DIAG_DMA (7) -#define WL_DIAGERR_SUCCESS (0) -#define WL_DIAGERR_FAIL_TO_RUN (1) -#define WL_DIAGERR_NOT_SUPPORTED (2) -#define WL_DIAGERR_INTERRUPT_FAIL (3) -#define WL_DIAGERR_LOOPBACK_FAIL (4) -#define WL_DIAGERR_SROM_FAIL (5) -#define WL_DIAGERR_SROM_BADCRC (6) -#define WL_DIAGERR_REG_FAIL (7) -#define WL_DIAGERR_MEMORY_FAIL (8) -#define WL_DIAGERR_NOMEM (9) -#define WL_DIAGERR_DMA_FAIL (10) -#define WL_DIAGERR_MEMORY_TIMEOUT (11) -#define WL_DIAGERR_MEMORY_BADPATTERN (12) -#define WLC_BAND_AUTO (0) -#define WLC_BAND_5G (1) -#define WLC_BAND_2G (2) -#define WLC_BAND_ALL (3) -#define WL_CHAN_FREQ_RANGE_2G (0) -#define WL_CHAN_FREQ_RANGE_5GL (1) -#define WL_CHAN_FREQ_RANGE_5GM (2) -#define WL_CHAN_FREQ_RANGE_5GH (3) -#define WLC_PHY_TYPE_A (0) -#define WLC_PHY_TYPE_B (1) -#define WLC_PHY_TYPE_G (2) -#define WLC_PHY_TYPE_N (4) -#define WLC_PHY_TYPE_LP (5) -#define WLC_PHY_TYPE_SSN (6) -#define WLC_PHY_TYPE_NULL (0xf) -#define WLC_MACMODE_DISABLED (0) -#define WLC_MACMODE_DENY (1) -#define WLC_MACMODE_ALLOW (2) -#define GMODE_LEGACY_B (0) -#define GMODE_AUTO (1) -#define GMODE_ONLY (2) -#define GMODE_B_DEFERRED (3) -#define GMODE_PERFORMANCE (4) -#define GMODE_LRS (5) -#define GMODE_MAX (6) -#define WLC_PLCP_AUTO (-1) -#define WLC_PLCP_SHORT (0) -#define WLC_PLCP_LONG (1) -#define WLC_PROTECTION_AUTO (-1) -#define WLC_PROTECTION_OFF (0) -#define WLC_PROTECTION_ON (1) -#define WLC_PROTECTION_MMHDR_ONLY (2) -#define WLC_PROTECTION_CTS_ONLY (3) -#define WLC_PROTECTION_CTL_OFF (0) -#define WLC_PROTECTION_CTL_LOCAL (1) -#define WLC_PROTECTION_CTL_OVERLAP (2) -#define WLC_N_PROTECTION_OFF (0) -#define WLC_N_PROTECTION_OPTIONAL (1) -#define WLC_N_PROTECTION_20IN40 (2) -#define WLC_N_PROTECTION_MIXEDMODE (3) -#define WLC_N_PREAMBLE_MIXEDMODE (0) -#define WLC_N_PREAMBLE_GF (1) -#define WLC_N_BW_20ALL (0) -#define WLC_N_BW_40ALL (1) -#define WLC_N_BW_20IN2G_40IN5G (2) -#define WLC_N_TXRX_CHAIN0 (0) -#define WLC_N_TXRX_CHAIN1 (1) -#define WLC_N_SGI_20 (0x01) -#define WLC_N_SGI_40 (0x02) -#define PM_OFF (0) -#define PM_MAX (1) -#define PM_FAST (2) -#define INTERFERE_NONE (0) -#define NON_WLAN (1) -#define WLAN_MANUAL (2) -#define WLAN_AUTO (3) -#define AUTO_ACTIVE (1 << 7) -typedef struct wl_aci_args -{ - int32_t enter_aci_thresh; - int32_t exit_aci_thresh; - int32_t usec_spin; - int32_t glitch_delay; - uint16_t nphy_adcpwr_enter_thresh; - uint16_t nphy_adcpwr_exit_thresh; - uint16_t nphy_repeat_ctr; - uint16_t nphy_num_samples; - uint16_t nphy_undetect_window_sz; - uint16_t nphy_b_energy_lo_aci; - uint16_t nphy_b_energy_md_aci; - uint16_t nphy_b_energy_hi_aci; -} wl_aci_args_t; -#define WL_ACI_ARGS_LEGACY_LENGTH 16 -#if !defined(ESTA_POSTMOGRIFY_REMOVAL) -typedef struct -{ - int32_t npulses; - int32_t ncontig; - int32_t min_pw; - int32_t max_pw; - uint16_t thresh0; - uint16_t thresh1; - uint16_t blank; - uint16_t fmdemodcfg; - int32_t npulses_lp; - int32_t min_pw_lp; - int32_t max_pw_lp; - int32_t min_fm_lp; - int32_t max_deltat_lp; - int32_t min_deltat; - int32_t max_deltat; - uint16_t autocorr; - uint16_t st_level_time; - uint16_t t2_min; - uint32_t version; -} wl_radar_args_t; -#define WL_RADAR_ARGS_VERSION 1 -#define WL_RADAR_DETECTOR_OFF 0 -#define WL_RADAR_DETECTOR_ON 1 -#define WL_RADAR_SIMULATED 2 -#define WL_RSSI_ANT_VERSION 1 -#define WL_RSSI_ANT_MAX 4 -typedef struct -{ - uint32_t version; - uint32_t count; - int8_t rssi_ant[WL_RSSI_ANT_MAX]; -} wl_rssi_ant_t; -#define WL_DFS_CACSTATE_IDLE 0 -#define WL_DFS_CACSTATE_PREISM_CAC 1 -#define WL_DFS_CACSTATE_ISM 2 -#define WL_DFS_CACSTATE_CSA 3 -#define WL_DFS_CACSTATE_POSTISM_CAC 4 -#define WL_DFS_CACSTATE_PREISM_OOC 5 -#define WL_DFS_CACSTATE_POSTISM_OOC 6 -#define WL_DFS_CACSTATES 7 -typedef struct -{ - uint32_t state; - uint32_t duration; - wl_chanspec_t chanspec_cleared; - uint16_t pad; -} wl_dfs_status_t; -#define NUM_PWRCTRL_RATES 12 -typedef struct -{ - uint8_t txpwr_band_max[NUM_PWRCTRL_RATES]; - uint8_t txpwr_limit[NUM_PWRCTRL_RATES]; - uint8_t txpwr_local_max; - uint8_t txpwr_local_constraint; - uint8_t txpwr_chan_reg_max; - uint8_t txpwr_target[2][NUM_PWRCTRL_RATES]; - uint8_t txpwr_est_Pout[2]; - uint8_t txpwr_opo[NUM_PWRCTRL_RATES]; - uint8_t txpwr_bphy_cck_max[NUM_PWRCTRL_RATES]; - uint8_t txpwr_bphy_ofdm_max; - uint8_t txpwr_aphy_max[NUM_PWRCTRL_RATES]; - int8_t txpwr_antgain[2]; - uint8_t txpwr_est_Pout_gofdm; -} tx_power_legacy_t; -#define WL_TX_POWER_RATES 45 -#define WL_TX_POWER_CCK_FIRST 0 -#define WL_TX_POWER_CCK_NUM 4 -#define WL_TX_POWER_OFDM_FIRST 4 -#define WL_TX_POWER_OFDM_NUM 8 -#define WL_TX_POWER_MCS_SISO_NUM 8 -#define WL_TX_POWER_MCS20_FIRST 12 -#define WL_TX_POWER_MCS20_NUM 16 -#define WL_TX_POWER_MCS40_FIRST 28 -#define WL_TX_POWER_MCS40_NUM 17 -#define WL_TX_POWER_MCS20SISO_NUM 8 -#define WL_TX_POWER_MCS40_LAST 44 -#define WL_TX_POWER_F_ENABLED 1 -#define WL_TX_POWER_F_HW 2 -#define WL_TX_POWER_F_MIMO 4 -#define WL_TX_POWER_F_SISO 8 -#define WL_TX_POWER_F_40M_CAP 16 -typedef struct -{ - uint32_t flags; - wl_chanspec_t chanspec; - wl_chanspec_t local_chanspec; - uint8_t local_max; - uint8_t local_constraint; - int8_t antgain[2]; - uint8_t rf_cores; - uint8_t est_Pout[4]; - uint8_t est_Pout_cck; - uint8_t user_limit[WL_TX_POWER_RATES]; - uint8_t reg_limit[WL_TX_POWER_RATES]; - uint8_t board_limit[WL_TX_POWER_RATES]; - uint8_t target[WL_TX_POWER_RATES]; -} tx_power_t; -typedef struct tx_inst_power -{ - uint8_t txpwr_est_Pout[2]; - uint8_t txpwr_est_Pout_gofdm; -} tx_inst_power_t; -#define WLC_MEASURE_TPC 1 -#define WLC_MEASURE_CHANNEL_BASIC 2 -#define WLC_MEASURE_CHANNEL_CCA 3 -#define WLC_MEASURE_CHANNEL_RPI 4 -#define SPECT_MNGMT_OFF 0 -#define SPECT_MNGMT_LOOSE_11H 1 -#define SPECT_MNGMT_STRICT_11H 2 -#define SPECT_MNGMT_STRICT_11D 3 -#define SPECT_MNGMT_LOOSE_11H_D 4 -#define WL_CHAN_VALID_HW (1 << 0) -#define WL_CHAN_VALID_SW (1 << 1) -#define WL_CHAN_BAND_5G (1 << 2) -#define WL_CHAN_RADAR (1 << 3) -#define WL_CHAN_INACTIVE (1 << 4) -#define WL_CHAN_PASSIVE (1 << 5) -#define WL_CHAN_RESTRICTED (1 << 6) -#define WL_BTC_DISABLE 0 -#define WL_BTC_ENABLE (1 << 0) -#define WL_BTC_PREMPT (1 << 1) -#define WL_BTC_PARTIAL (1 << 2) -#define WL_BTC_DEFAULT (1 << 3) -#define WL_BTC_HYBRID (WL_BTC_ENABLE | WL_BTC_PARTIAL) -#define WL_INF_BTC_DISABLE 0 -#define WL_INF_BTC_ENABLE 1 -#define WL_INF_BTC_AUTO 3 -#define WL_BTC_DEFWIRE 0 -#define WL_BTC_2WIRE 2 -#define WL_BTC_3WIRE 3 -#define WL_BTC_4WIRE 4 -#define WL_BTC_FLAG_PREMPT (1 << 0) -#define WL_BTC_FLAG_BT_DEF (1 << 1) -#define WL_BTC_FLAG_ACTIVE_PROT (1 << 2) -#define WL_BTC_FLAG_SIM_RSP (1 << 3) -#define WL_BTC_FLAG_PS_PROTECT (1 << 4) -#define WL_BTC_FLAG_SIM_TX_LP (1 << 5) -#define WL_BTC_FLAG_ECI (1 << 6) -#endif -#define WL_ERROR_VAL 0x00000001 -#define WL_TRACE_VAL 0x00000002 -#define WL_PRHDRS_VAL 0x00000004 -#define WL_PRPKT_VAL 0x00000008 -#define WL_INFORM_VAL 0x00000010 -#define WL_TMP_VAL 0x00000020 -#define WL_OID_VAL 0x00000040 -#define WL_RATE_VAL 0x00000080 -#define WL_ASSOC_VAL 0x00000100 -#define WL_PRUSR_VAL 0x00000200 -#define WL_PS_VAL 0x00000400 -#define WL_TXPWR_VAL 0x00000800 -#define WL_PORT_VAL 0x00001000 -#define WL_DUAL_VAL 0x00002000 -#define WL_WSEC_VAL 0x00004000 -#define WL_WSEC_DUMP_VAL 0x00008000 -#define WL_LOG_VAL 0x00010000 -#define WL_NRSSI_VAL 0x00020000 -#define WL_LOFT_VAL 0x00040000 -#define WL_REGULATORY_VAL 0x00080000 -#define WL_PHYCAL_VAL 0x00100000 -#define WL_RADAR_VAL 0x00200000 -#define WL_MPC_VAL 0x00400000 -#define WL_APSTA_VAL 0x00800000 -#define WL_DFS_VAL 0x01000000 -#define WL_BA_VAL 0x02000000 -#if defined(WLNINTENDO) -#define WL_NITRO_VAL 0x04000000 -#endif -#define WL_MBSS_VAL 0x04000000 -#define WL_CAC_VAL 0x08000000 -#define WL_AMSDU_VAL 0x10000000 -#define WL_AMPDU_VAL 0x20000000 -#define WL_FFPLD_VAL 0x40000000 -#if defined(WLNINTENDO) -#define WL_NIN_VAL 0x80000000 -#endif -#define WL_DPT_VAL 0x00000001 -#define WL_SCAN_VAL 0x00000002 -#define WL_WOWL_VAL 0x00000004 -#define WL_COEX_VAL 0x00000008 -#define WL_RTDC_VAL 0x00000010 -#define WL_BTA_VAL 0x00000040 -#define WL_LED_NUMGPIO 16 -#define WL_LED_OFF 0 -#define WL_LED_ON 1 -#define WL_LED_ACTIVITY 2 -#define WL_LED_RADIO 3 -#define WL_LED_ARADIO 4 -#define WL_LED_BRADIO 5 -#define WL_LED_BGMODE 6 -#define WL_LED_WI1 7 -#define WL_LED_WI2 8 -#define WL_LED_WI3 9 -#define WL_LED_ASSOC 10 -#define WL_LED_INACTIVE 11 -#define WL_LED_ASSOCACT 12 -#define WL_LED_NUMBEHAVIOR 13 -#define WL_LED_BEH_MASK 0x7f -#define WL_LED_AL_MASK 0x80 -#define WL_NUMCHANNELS 64 -#define WL_NUMCHANSPECS 100 -#define WL_WDS_WPA_ROLE_AUTH 0 -#define WL_WDS_WPA_ROLE_SUP 1 -#define WL_WDS_WPA_ROLE_AUTO 255 -#define WL_EVENTING_MASK_LEN ((WLC_E_LAST + 7) / 8) - -#define VNDR_IE_CMD_LEN 4 -#define VNDR_IE_BEACON_FLAG 0x1 -#define VNDR_IE_PRBRSP_FLAG 0x2 -#define VNDR_IE_ASSOCRSP_FLAG 0x4 -#define VNDR_IE_AUTHRSP_FLAG 0x8 -#define VNDR_IE_PRBREQ_FLAG 0x10 -#define VNDR_IE_ASSOCREQ_FLAG 0x20 -#define VNDR_IE_CUSTOM_FLAG 0x100 -#define VNDR_IE_INFO_HDR_LEN (sizeof(uint32_t)) -struct wl_vndr_ie -{ - uint8_t id; - uint8_t len; - uint8_t oui[3]; - uint8_t data[1]; -}; -typedef struct wl_vndr_ie wl_vndr_ie_t; -typedef struct -{ - uint32_t pktflag; - wl_vndr_ie_t vndr_ie_data; -} vndr_ie_info_t; -typedef struct -{ - int32_t iecount; - vndr_ie_info_t vndr_ie_list[1]; -} vndr_ie_buf_t; -typedef struct -{ - int8_t cmd[VNDR_IE_CMD_LEN]; - vndr_ie_buf_t vndr_ie_buffer; -} vndr_ie_setbuf_t; -#define WL_JOIN_PREF_RSSI 1 -#define WL_JOIN_PREF_WPA 2 -#define WL_JOIN_PREF_BAND 3 -#define WLJP_BAND_ASSOC_PREF 255 -#define WL_WPA_ACP_MCS_ANY "\x00\x00\x00\x00" -struct tsinfo_arg -{ - uint8_t octets[3]; -}; -#define NFIFO 6 -#define WL_CNT_T_VERSION 6 -#define WL_CNT_EXT_T_VERSION 1 -#define WL_PHYRATE_LOG_SIZE 1200 - -typedef struct -{ - uint16_t version; /* see definition of WL_CNT_T_VERSION */ - uint16_t length; /* length of entire structure */ - - /* transmit stat counters */ - uint32_t txframe; /* tx data frames */ - uint32_t txbyte; /* tx data bytes */ - uint32_t txretrans; /* tx mac retransmits */ - uint32_t txerror; /* tx data errors (derived: sum of others) */ - uint32_t txctl; /* tx management frames */ - uint32_t txprshort; /* tx short preamble frames */ - uint32_t txserr; /* tx status errors */ - uint32_t txnobuf; /* tx out of buffers errors */ - uint32_t txnoassoc; /* tx discard because we're not associated */ - uint32_t txrunt; /* tx runt frames */ - uint32_t txchit; /* tx header cache hit (fastpath) */ - uint32_t txcmiss; /* tx header cache miss (slowpath) */ - - /* transmit chip error counters */ - uint32_t txuflo; /* tx fifo underflows */ - uint32_t txphyerr; /* tx phy errors (indicated in tx status) */ - uint32_t txphycrs; /* PR8861/8963 counter */ - - /* receive stat counters */ - uint32_t rxframe; /* rx data frames */ - uint32_t rxbyte; /* rx data bytes */ - uint32_t rxerror; /* rx data errors (derived: sum of others) */ - uint32_t rxctl; /* rx management frames */ - uint32_t rxnobuf; /* rx out of buffers errors */ - uint32_t rxnondata; /* rx non data frames in the data channel errors */ - uint32_t rxbadds; /* rx bad DS errors */ - uint32_t rxbadcm; /* rx bad control or management frames */ - uint32_t rxfragerr; /* rx fragmentation errors */ - uint32_t rxrunt; /* rx runt frames */ - uint32_t rxgiant; /* rx giant frames */ - uint32_t rxnoscb; /* rx no scb error */ - uint32_t rxbadproto; /* rx invalid frames */ - uint32_t rxbadsrcmac; /* rx frames with Invalid Src Mac */ - uint32_t rxbadda; /* rx frames tossed for invalid da */ - uint32_t rxfilter; /* rx frames filtered out */ - - /* receive chip error counters */ - uint32_t rxoflo; /* rx fifo overflow errors */ - uint32_t rxuflo[NFIFO]; /* rx dma descriptor underflow errors */ - - uint32_t d11cnt_txrts_off; /* d11cnt txrts value when reset d11cnt */ - uint32_t d11cnt_rxcrc_off; /* d11cnt rxcrc value when reset d11cnt */ - uint32_t d11cnt_txnocts_off; /* d11cnt txnocts value when reset d11cnt */ - - /* misc counters */ - uint32_t dmade; /* tx/rx dma descriptor errors */ - uint32_t dmada; /* tx/rx dma data errors */ - uint32_t dmape; /* tx/rx dma descriptor protocol errors */ - uint32_t reset; /* reset count */ - uint32_t tbtt; /* cnts the TBTT int's */ - uint32_t txdmawar; /* # occurrences of PR15420 workaround */ - uint32_t pkt_callback_reg_fail; /* callbacks register failure */ - - /* MAC counters: 32-bit version of d11.h's macstat_t */ - uint32_t txallfrm; /* total number of frames sent, incl. Data, ACK, RTS, CTS, - * Control Management (includes retransmissions) - */ - uint32_t txrtsfrm; /* number of RTS sent out by the MAC */ - uint32_t txctsfrm; /* number of CTS sent out by the MAC */ - uint32_t txackfrm; /* number of ACK frames sent out */ - uint32_t txdnlfrm; /* Not used */ - uint32_t txbcnfrm; /* beacons transmitted */ - uint32_t txfunfl[8]; /* per-fifo tx underflows */ - uint32_t txtplunfl; /* Template underflows (mac was too slow to transmit ACK/CTS - * or BCN) - */ - uint32_t txphyerror; /* Transmit phy error, type of error is reported in tx-status for - * driver enqueued frames - */ - uint32_t rxfrmtoolong; /* Received frame longer than legal limit (2346 bytes) */ - uint32_t rxfrmtooshrt; /* Received frame did not contain enough bytes for its frame type */ - uint32_t rxinvmachdr; /* Either the protocol version != 0 or frame type not - * data/control/management - */ - uint32_t rxbadfcs; /* number of frames for which the CRC check failed in the MAC */ - uint32_t rxbadplcp; /* parity check of the PLCP header failed */ - uint32_t rxcrsglitch; /* PHY was able to correlate the preamble but not the header */ - uint32_t rxstrt; /* Number of received frames with a good PLCP - * (i.e. passing parity check) - */ - uint32_t rxdfrmucastmbss; /* Number of received DATA frames with good FCS and matching RA */ - uint32_t rxmfrmucastmbss; /* number of received mgmt frames with good FCS and matching RA */ - uint32_t rxcfrmucast; /* number of received CNTRL frames with good FCS and matching RA */ - uint32_t rxrtsucast; /* number of unicast RTS addressed to the MAC (good FCS) */ - uint32_t rxctsucast; /* number of unicast CTS addressed to the MAC (good FCS) */ - uint32_t rxackucast; /* number of ucast ACKS received (good FCS) */ - uint32_t rxdfrmocast; /* number of received DATA frames (good FCS and not matching RA) */ - uint32_t rxmfrmocast; /* number of received MGMT frames (good FCS and not matching RA) */ - uint32_t rxcfrmocast; /* number of received CNTRL frame (good FCS and not matching RA) */ - uint32_t rxrtsocast; /* number of received RTS not addressed to the MAC */ - uint32_t rxctsocast; /* number of received CTS not addressed to the MAC */ - uint32_t rxdfrmmcast; /* number of RX Data multicast frames received by the MAC */ - uint32_t rxmfrmmcast; /* number of RX Management multicast frames received by the MAC */ - uint32_t rxcfrmmcast; /* number of RX Control multicast frames received by the MAC - * (unlikely to see these) - */ - uint32_t rxbeaconmbss; /* beacons received from member of BSS */ - uint32_t rxdfrmucastobss; /* number of unicast frames addressed to the MAC from - * other BSS (WDS FRAME) - */ - uint32_t rxbeaconobss; /* beacons received from other BSS */ - uint32_t rxrsptmout; /* Number of response timeouts for transmitted frames - * expecting a response - */ - uint32_t bcntxcancl; /* transmit beacons canceled due to receipt of beacon (IBSS) */ - uint32_t rxf0ovfl; /* Number of receive fifo 0 overflows */ - uint32_t rxf1ovfl; /* Number of receive fifo 1 overflows (obsolete) */ - uint32_t rxf2ovfl; /* Number of receive fifo 2 overflows (obsolete) */ - uint32_t txsfovfl; /* Number of transmit status fifo overflows (obsolete) */ - uint32_t pmqovfl; /* Number of PMQ overflows */ - uint32_t rxcgprqfrm; /* Number of received Probe requests that made it into - * the PRQ fifo - */ - uint32_t rxcgprsqovfl; /* Rx Probe Request Que overflow in the AP */ - uint32_t txcgprsfail; /* Tx Probe Response Fail. AP sent probe response but did - * not get ACK - */ - uint32_t txcgprssuc; /* Tx Probe Response Success (ACK was received) */ - uint32_t prs_timeout; /* Number of probe requests that were dropped from the PRQ - * fifo because a probe response could not be sent out within - * the time limit defined in M_PRS_MAXTIME - */ - uint32_t rxnack; /* XXX Number of NACKS received (Afterburner) */ - uint32_t frmscons; /* XXX Number of frames completed without transmission because of an - * Afterburner re-queue - */ - uint32_t txnack; /* XXX Number of NACKs transmitted (Afterburner) */ - uint32_t txglitch_nack; /* obsolete */ - uint32_t txburst; /* obsolete */ - - /* 802.11 MIB counters, pp. 614 of 802.11 reaff doc. */ - uint32_t txfrag; /* dot11TransmittedFragmentCount */ - uint32_t txmulti; /* dot11MulticastTransmittedFrameCount */ - uint32_t txfail; /* dot11FailedCount */ - uint32_t txretry; /* dot11RetryCount */ - uint32_t txretrie; /* dot11MultipleRetryCount */ - uint32_t rxdup; /* dot11FrameduplicateCount */ - uint32_t txrts; /* dot11RTSSuccessCount */ - uint32_t txnocts; /* dot11RTSFailureCount */ - uint32_t txnoack; /* dot11ACKFailureCount */ - uint32_t rxfrag; /* dot11ReceivedFragmentCount */ - uint32_t rxmulti; /* dot11MulticastReceivedFrameCount */ - uint32_t rxcrc; /* dot11FCSErrorCount */ - uint32_t txfrmsnt; /* dot11TransmittedFrameCount (bogus MIB?) */ - uint32_t rxundec; /* dot11WEPUndecryptableCount */ - - /* WPA2 counters (see rxundec for DecryptFailureCount) */ - uint32_t tkipmicfaill; /* TKIPLocalMICFailures */ - uint32_t tkipcntrmsr; /* TKIPCounterMeasuresInvoked */ - uint32_t tkipreplay; /* TKIPReplays */ - uint32_t ccmpfmterr; /* CCMPFormatErrors */ - uint32_t ccmpreplay; /* CCMPReplays */ - uint32_t ccmpundec; /* CCMPDecryptErrors */ - uint32_t fourwayfail; /* FourWayHandshakeFailures */ - uint32_t wepundec; /* dot11WEPUndecryptableCount */ - uint32_t wepicverr; /* dot11WEPICVErrorCount */ - uint32_t decsuccess; /* DecryptSuccessCount */ - uint32_t tkipicverr; /* TKIPICVErrorCount */ - uint32_t wepexcluded; /* dot11WEPExcludedCount */ - - uint32_t rxundec_mcst; /* dot11WEPUndecryptableCount */ - - /* WPA2 counters (see rxundec for DecryptFailureCount) */ - uint32_t tkipmicfaill_mcst; /* TKIPLocalMICFailures */ - uint32_t tkipcntrmsr_mcst; /* TKIPCounterMeasuresInvoked */ - uint32_t tkipreplay_mcst; /* TKIPReplays */ - uint32_t ccmpfmterr_mcst; /* CCMPFormatErrors */ - uint32_t ccmpreplay_mcst; /* CCMPReplays */ - uint32_t ccmpundec_mcst; /* CCMPDecryptErrors */ - uint32_t fourwayfail_mcst; /* FourWayHandshakeFailures */ - uint32_t wepundec_mcst; /* dot11WEPUndecryptableCount */ - uint32_t wepicverr_mcst; /* dot11WEPICVErrorCount */ - uint32_t decsuccess_mcst; /* DecryptSuccessCount */ - uint32_t tkipicverr_mcst; /* TKIPICVErrorCount */ - uint32_t wepexcluded_mcst; /* dot11WEPExcludedCount */ - - uint32_t txchanrej; /* Tx frames suppressed due to channel rejection */ - uint32_t txexptime; /* Tx frames suppressed due to timer expiration */ - uint32_t psmwds; /* Count PSM watchdogs */ - uint32_t phywatchdog; /* Count Phy watchdogs (triggered by ucode) */ - - /* MBSS counters, AP only */ - uint32_t prq_entries_handled; /* PRQ entries read in */ - uint32_t prq_undirected_entries; /* which were bcast bss & ssid */ - uint32_t prq_bad_entries; /* which could not be translated to info */ - uint32_t atim_suppress_count; /* TX suppressions on ATIM fifo */ - uint32_t bcn_template_not_ready; /* Template marked in use on send bcn ... */ - uint32_t bcn_template_not_ready_done; /* ...but "DMA done" interrupt rcvd */ - uint32_t late_tbtt_dpc; /* TBTT DPC did not happen in time */ - - /* per-rate receive stat counters */ - uint32_t rx1mbps; /* packets rx at 1Mbps */ - uint32_t rx2mbps; /* packets rx at 2Mbps */ - uint32_t rx5mbps5; /* packets rx at 5.5Mbps */ - uint32_t rx6mbps; /* packets rx at 6Mbps */ - uint32_t rx9mbps; /* packets rx at 9Mbps */ - uint32_t rx11mbps; /* packets rx at 11Mbps */ - uint32_t rx12mbps; /* packets rx at 12Mbps */ - uint32_t rx18mbps; /* packets rx at 18Mbps */ - uint32_t rx24mbps; /* packets rx at 24Mbps */ - uint32_t rx36mbps; /* packets rx at 36Mbps */ - uint32_t rx48mbps; /* packets rx at 48Mbps */ - uint32_t rx54mbps; /* packets rx at 54Mbps */ - uint32_t rx108mbps; /* packets rx at 108mbps */ - uint32_t rx162mbps; /* packets rx at 162mbps */ - uint32_t rx216mbps; /* packets rx at 216 mbps */ - uint32_t rx270mbps; /* packets rx at 270 mbps */ - uint32_t rx324mbps; /* packets rx at 324 mbps */ - uint32_t rx378mbps; /* packets rx at 378 mbps */ - uint32_t rx432mbps; /* packets rx at 432 mbps */ - uint32_t rx486mbps; /* packets rx at 486 mbps */ - uint32_t rx540mbps; /* packets rx at 540 mbps */ - - /* pkteng rx frame stats */ - uint32_t pktengrxducast; /* unicast frames rxed by the pkteng code */ - uint32_t pktengrxdmcast; /* multicast frames rxed by the pkteng code */ - - uint32_t rfdisable; /* count of radio disables */ - uint32_t bphy_rxcrsglitch; /* PHY count of bphy glitches */ - - uint32_t txmpdu_sgi; /* count for sgi transmit */ - uint32_t rxmpdu_sgi; /* count for sgi received */ - uint32_t txmpdu_stbc; /* count for stbc transmit */ - uint32_t rxmpdu_stbc; /* count for stbc received */ -} wl_cnt_ver_six_t; - -typedef struct { - uint16_t version; /* see definition of WL_CNT_T_VERSION */ - uint16_t length; /* length of entire structure */ - - /* transmit stat counters */ - uint32_t txframe; /* tx data frames */ - uint32_t txbyte; /* tx data bytes */ - uint32_t txretrans; /* tx mac retransmits */ - uint32_t txerror; /* tx data errors (derived: sum of others) */ - uint32_t txctl; /* tx management frames */ - uint32_t txprshort; /* tx short preamble frames */ - uint32_t txserr; /* tx status errors */ - uint32_t txnobuf; /* tx out of buffers errors */ - uint32_t txnoassoc; /* tx discard because we're not associated */ - uint32_t txrunt; /* tx runt frames */ - uint32_t txchit; /* tx header cache hit (fastpath) */ - uint32_t txcmiss; /* tx header cache miss (slowpath) */ - - /* transmit chip error counters */ - uint32_t txuflo; /* tx fifo underflows */ - uint32_t txphyerr; /* tx phy errors (indicated in tx status) */ - uint32_t txphycrs; /* PR8861/8963 counter */ - - /* receive stat counters */ - uint32_t rxframe; /* rx data frames */ - uint32_t rxbyte; /* rx data bytes */ - uint32_t rxerror; /* rx data errors (derived: sum of others) */ - uint32_t rxctl; /* rx management frames */ - uint32_t rxnobuf; /* rx out of buffers errors */ - uint32_t rxnondata; /* rx non data frames in the data channel errors */ - uint32_t rxbadds; /* rx bad DS errors */ - uint32_t rxbadcm; /* rx bad control or management frames */ - uint32_t rxfragerr; /* rx fragmentation errors */ - uint32_t rxrunt; /* rx runt frames */ - uint32_t rxgiant; /* rx giant frames */ - uint32_t rxnoscb; /* rx no scb error */ - uint32_t rxbadproto; /* rx invalid frames */ - uint32_t rxbadsrcmac; /* rx frames with Invalid Src Mac */ - uint32_t rxbadda; /* rx frames tossed for invalid da */ - uint32_t rxfilter; /* rx frames filtered out */ - - /* receive chip error counters */ - uint32_t rxoflo; /* rx fifo overflow errors */ - uint32_t rxuflo[NFIFO]; /* rx dma descriptor underflow errors */ - - uint32_t d11cnt_txrts_off; /* d11cnt txrts value when reset d11cnt */ - uint32_t d11cnt_rxcrc_off; /* d11cnt rxcrc value when reset d11cnt */ - uint32_t d11cnt_txnocts_off; /* d11cnt txnocts value when reset d11cnt */ - - /* misc counters */ - uint32_t dmade; /* tx/rx dma descriptor errors */ - uint32_t dmada; /* tx/rx dma data errors */ - uint32_t dmape; /* tx/rx dma descriptor protocol errors */ - uint32_t reset; /* reset count */ - uint32_t tbtt; /* cnts the TBTT int's */ - uint32_t txdmawar; /* # occurrences of PR15420 workaround */ - uint32_t pkt_callback_reg_fail; /* callbacks register failure */ - - /* MAC counters: 32-bit version of d11.h's macstat_t */ - uint32_t txallfrm; /* total number of frames sent, incl. Data, ACK, RTS, CTS, - * Control Management (includes retransmissions) - */ - uint32_t txrtsfrm; /* number of RTS sent out by the MAC */ - uint32_t txctsfrm; /* number of CTS sent out by the MAC */ - uint32_t txackfrm; /* number of ACK frames sent out */ - uint32_t txdnlfrm; /* Not used */ - uint32_t txbcnfrm; /* beacons transmitted */ - uint32_t txfunfl[8]; /* per-fifo tx underflows */ - uint32_t txtplunfl; /* Template underflows (mac was too slow to transmit ACK/CTS - * or BCN) - */ - uint32_t txphyerror; /* Transmit phy error, type of error is reported in tx-status for - * driver enqueued frames - */ - uint32_t rxfrmtoolong; /* Received frame longer than legal limit (2346 bytes) */ - uint32_t rxfrmtooshrt; /* Received frame did not contain enough bytes for its frame type */ - uint32_t rxinvmachdr; /* Either the protocol version != 0 or frame type not - * data/control/management - */ - uint32_t rxbadfcs; /* number of frames for which the CRC check failed in the MAC */ - uint32_t rxbadplcp; /* parity check of the PLCP header failed */ - uint32_t rxcrsglitch; /* PHY was able to correlate the preamble but not the header */ - uint32_t rxstrt; /* Number of received frames with a good PLCP - * (i.e. passing parity check) - */ - uint32_t rxdfrmucastmbss; /* Number of received DATA frames with good FCS and matching RA */ - uint32_t rxmfrmucastmbss; /* number of received mgmt frames with good FCS and matching RA */ - uint32_t rxcfrmucast; /* number of received CNTRL frames with good FCS and matching RA */ - uint32_t rxrtsucast; /* number of unicast RTS addressed to the MAC (good FCS) */ - uint32_t rxctsucast; /* number of unicast CTS addressed to the MAC (good FCS) */ - uint32_t rxackucast; /* number of ucast ACKS received (good FCS) */ - uint32_t rxdfrmocast; /* number of received DATA frames (good FCS and not matching RA) */ - uint32_t rxmfrmocast; /* number of received MGMT frames (good FCS and not matching RA) */ - uint32_t rxcfrmocast; /* number of received CNTRL frame (good FCS and not matching RA) */ - uint32_t rxrtsocast; /* number of received RTS not addressed to the MAC */ - uint32_t rxctsocast; /* number of received CTS not addressed to the MAC */ - uint32_t rxdfrmmcast; /* number of RX Data multicast frames received by the MAC */ - uint32_t rxmfrmmcast; /* number of RX Management multicast frames received by the MAC */ - uint32_t rxcfrmmcast; /* number of RX Control multicast frames received by the MAC - * (unlikely to see these) - */ - uint32_t rxbeaconmbss; /* beacons received from member of BSS */ - uint32_t rxdfrmucastobss; /* number of unicast frames addressed to the MAC from - * other BSS (WDS FRAME) - */ - uint32_t rxbeaconobss; /* beacons received from other BSS */ - uint32_t rxrsptmout; /* Number of response timeouts for transmitted frames - * expecting a response - */ - uint32_t bcntxcancl; /* transmit beacons canceled due to receipt of beacon (IBSS) */ - uint32_t rxf0ovfl; /* Number of receive fifo 0 overflows */ - uint32_t rxf1ovfl; /* Number of receive fifo 1 overflows (obsolete) */ - uint32_t rxf2ovfl; /* Number of receive fifo 2 overflows (obsolete) */ - uint32_t txsfovfl; /* Number of transmit status fifo overflows (obsolete) */ - uint32_t pmqovfl; /* Number of PMQ overflows */ - uint32_t rxcgprqfrm; /* Number of received Probe requests that made it into - * the PRQ fifo - */ - uint32_t rxcgprsqovfl; /* Rx Probe Request Que overflow in the AP */ - uint32_t txcgprsfail; /* Tx Probe Response Fail. AP sent probe response but did - * not get ACK - */ - uint32_t txcgprssuc; /* Tx Probe Response Success (ACK was received) */ - uint32_t prs_timeout; /* Number of probe requests that were dropped from the PRQ - * fifo because a probe response could not be sent out within - * the time limit defined in M_PRS_MAXTIME - */ - uint32_t rxnack; /* obsolete */ - uint32_t frmscons; /* obsolete */ - uint32_t txnack; /* obsolete */ - uint32_t txglitch_nack; /* obsolete */ - uint32_t txburst; /* obsolete */ - - /* 802.11 MIB counters, pp. 614 of 802.11 reaff doc. */ - uint32_t txfrag; /* dot11TransmittedFragmentCount */ - uint32_t txmulti; /* dot11MulticastTransmittedFrameCount */ - uint32_t txfail; /* dot11FailedCount */ - uint32_t txretry; /* dot11RetryCount */ - uint32_t txretrie; /* dot11MultipleRetryCount */ - uint32_t rxdup; /* dot11FrameduplicateCount */ - uint32_t txrts; /* dot11RTSSuccessCount */ - uint32_t txnocts; /* dot11RTSFailureCount */ - uint32_t txnoack; /* dot11ACKFailureCount */ - uint32_t rxfrag; /* dot11ReceivedFragmentCount */ - uint32_t rxmulti; /* dot11MulticastReceivedFrameCount */ - uint32_t rxcrc; /* dot11FCSErrorCount */ - uint32_t txfrmsnt; /* dot11TransmittedFrameCount (bogus MIB?) */ - uint32_t rxundec; /* dot11WEPUndecryptableCount */ - - /* WPA2 counters (see rxundec for DecryptFailureCount) */ - uint32_t tkipmicfaill; /* TKIPLocalMICFailures */ - uint32_t tkipcntrmsr; /* TKIPCounterMeasuresInvoked */ - uint32_t tkipreplay; /* TKIPReplays */ - uint32_t ccmpfmterr; /* CCMPFormatErrors */ - uint32_t ccmpreplay; /* CCMPReplays */ - uint32_t ccmpundec; /* CCMPDecryptErrors */ - uint32_t fourwayfail; /* FourWayHandshakeFailures */ - uint32_t wepundec; /* dot11WEPUndecryptableCount */ - uint32_t wepicverr; /* dot11WEPICVErrorCount */ - uint32_t decsuccess; /* DecryptSuccessCount */ - uint32_t tkipicverr; /* TKIPICVErrorCount */ - uint32_t wepexcluded; /* dot11WEPExcludedCount */ - - uint32_t txchanrej; /* Tx frames suppressed due to channel rejection */ - uint32_t psmwds; /* Count PSM watchdogs */ - uint32_t phywatchdog; /* Count Phy watchdogs (triggered by ucode) */ - - /* MBSS counters, AP only */ - uint32_t prq_entries_handled; /* PRQ entries read in */ - uint32_t prq_undirected_entries; /* which were bcast bss & ssid */ - uint32_t prq_bad_entries; /* which could not be translated to info */ - uint32_t atim_suppress_count; /* TX suppressions on ATIM fifo */ - uint32_t bcn_template_not_ready; /* Template marked in use on send bcn ... */ - uint32_t bcn_template_not_ready_done; /* ...but "DMA done" interrupt rcvd */ - uint32_t late_tbtt_dpc; /* TBTT DPC did not happen in time */ - - /* per-rate receive stat counters */ - uint32_t rx1mbps; /* packets rx at 1Mbps */ - uint32_t rx2mbps; /* packets rx at 2Mbps */ - uint32_t rx5mbps5; /* packets rx at 5.5Mbps */ - uint32_t rx6mbps; /* packets rx at 6Mbps */ - uint32_t rx9mbps; /* packets rx at 9Mbps */ - uint32_t rx11mbps; /* packets rx at 11Mbps */ - uint32_t rx12mbps; /* packets rx at 12Mbps */ - uint32_t rx18mbps; /* packets rx at 18Mbps */ - uint32_t rx24mbps; /* packets rx at 24Mbps */ - uint32_t rx36mbps; /* packets rx at 36Mbps */ - uint32_t rx48mbps; /* packets rx at 48Mbps */ - uint32_t rx54mbps; /* packets rx at 54Mbps */ - uint32_t rx108mbps; /* packets rx at 108mbps */ - uint32_t rx162mbps; /* packets rx at 162mbps */ - uint32_t rx216mbps; /* packets rx at 216 mbps */ - uint32_t rx270mbps; /* packets rx at 270 mbps */ - uint32_t rx324mbps; /* packets rx at 324 mbps */ - uint32_t rx378mbps; /* packets rx at 378 mbps */ - uint32_t rx432mbps; /* packets rx at 432 mbps */ - uint32_t rx486mbps; /* packets rx at 486 mbps */ - uint32_t rx540mbps; /* packets rx at 540 mbps */ - - /* pkteng rx frame stats */ - uint32_t pktengrxducast; /* unicast frames rxed by the pkteng code */ - uint32_t pktengrxdmcast; /* multicast frames rxed by the pkteng code */ - - uint32_t rfdisable; /* count of radio disables */ - uint32_t bphy_rxcrsglitch; /* PHY count of bphy glitches */ - - uint32_t txexptime; /* Tx frames suppressed due to timer expiration */ - - uint32_t txmpdu_sgi; /* count for sgi transmit */ - uint32_t rxmpdu_sgi; /* count for sgi received */ - uint32_t txmpdu_stbc; /* count for stbc transmit */ - uint32_t rxmpdu_stbc; /* count for stbc received */ - - uint32_t rxundec_mcst; /* dot11WEPUndecryptableCount */ - - /* WPA2 counters (see rxundec for DecryptFailureCount) */ - uint32_t tkipmicfaill_mcst; /* TKIPLocalMICFailures */ - uint32_t tkipcntrmsr_mcst; /* TKIPCounterMeasuresInvoked */ - uint32_t tkipreplay_mcst; /* TKIPReplays */ - uint32_t ccmpfmterr_mcst; /* CCMPFormatErrors */ - uint32_t ccmpreplay_mcst; /* CCMPReplays */ - uint32_t ccmpundec_mcst; /* CCMPDecryptErrors */ - uint32_t fourwayfail_mcst; /* FourWayHandshakeFailures */ - uint32_t wepundec_mcst; /* dot11WEPUndecryptableCount */ - uint32_t wepicverr_mcst; /* dot11WEPICVErrorCount */ - uint32_t decsuccess_mcst; /* DecryptSuccessCount */ - uint32_t tkipicverr_mcst; /* TKIPICVErrorCount */ - uint32_t wepexcluded_mcst; /* dot11WEPExcludedCount */ - - uint32_t dma_hang; /* count for stbc received */ - } wl_cnt_ver_seven_t; - - -typedef struct { - uint16_t version; /* see definition of WL_CNT_T_VERSION */ - uint16_t length; /* length of entire structure */ - - /* transmit stat counters */ - uint32_t txframe; /* tx data frames */ - uint32_t txbyte; /* tx data bytes */ - uint32_t txretrans; /* tx mac retransmits */ - uint32_t txerror; /* tx data errors (derived: sum of others) */ - uint32_t txctl; /* tx management frames */ - uint32_t txprshort; /* tx short preamble frames */ - uint32_t txserr; /* tx status errors */ - uint32_t txnobuf; /* tx out of buffers errors */ - uint32_t txnoassoc; /* tx discard because we're not associated */ - uint32_t txrunt; /* tx runt frames */ - uint32_t txchit; /* tx header cache hit (fastpath) */ - uint32_t txcmiss; /* tx header cache miss (slowpath) */ - - /* transmit chip error counters */ - uint32_t txuflo; /* tx fifo underflows */ - uint32_t txphyerr; /* tx phy errors (indicated in tx status) */ - uint32_t txphycrs; /* PR8861/8963 counter */ - - /* receive stat counters */ - uint32_t rxframe; /* rx data frames */ - uint32_t rxbyte; /* rx data bytes */ - uint32_t rxerror; /* rx data errors (derived: sum of others) */ - uint32_t rxctl; /* rx management frames */ - uint32_t rxnobuf; /* rx out of buffers errors */ - uint32_t rxnondata; /* rx non data frames in the data channel errors */ - uint32_t rxbadds; /* rx bad DS errors */ - uint32_t rxbadcm; /* rx bad control or management frames */ - uint32_t rxfragerr; /* rx fragmentation errors */ - uint32_t rxrunt; /* rx runt frames */ - uint32_t rxgiant; /* rx giant frames */ - uint32_t rxnoscb; /* rx no scb error */ - uint32_t rxbadproto; /* rx invalid frames */ - uint32_t rxbadsrcmac; /* rx frames with Invalid Src Mac */ - uint32_t rxbadda; /* rx frames tossed for invalid da */ - uint32_t rxfilter; /* rx frames filtered out */ - - /* receive chip error counters */ - uint32_t rxoflo; /* rx fifo overflow errors */ - uint32_t rxuflo[NFIFO]; /* rx dma descriptor underflow errors */ - - uint32_t d11cnt_txrts_off; /* d11cnt txrts value when reset d11cnt */ - uint32_t d11cnt_rxcrc_off; /* d11cnt rxcrc value when reset d11cnt */ - uint32_t d11cnt_txnocts_off; /* d11cnt txnocts value when reset d11cnt */ - - /* misc counters */ - uint32_t dmade; /* tx/rx dma descriptor errors */ - uint32_t dmada; /* tx/rx dma data errors */ - uint32_t dmape; /* tx/rx dma descriptor protocol errors */ - uint32_t reset; /* reset count */ - uint32_t tbtt; /* cnts the TBTT int's */ - uint32_t txdmawar; /* # occurrences of PR15420 workaround */ - uint32_t pkt_callback_reg_fail; /* callbacks register failure */ - - /* MAC counters: 32-bit version of d11.h's macstat_t */ - uint32_t txallfrm; /* total number of frames sent, incl. Data, ACK, RTS, CTS, - * Control Management (includes retransmissions) - */ - uint32_t txrtsfrm; /* number of RTS sent out by the MAC */ - uint32_t txctsfrm; /* number of CTS sent out by the MAC */ - uint32_t txackfrm; /* number of ACK frames sent out */ - uint32_t txdnlfrm; /* Not used */ - uint32_t txbcnfrm; /* beacons transmitted */ - uint32_t txfunfl[6]; /* per-fifo tx underflows */ - uint32_t rxtoolate; /* receive too late */ - uint32_t txfbw; /* transmit at fallback bw (dynamic bw) */ - uint32_t txtplunfl; /* Template underflows (mac was too slow to transmit ACK/CTS - * or BCN) - */ - uint32_t txphyerror; /* Transmit phy error, type of error is reported in tx-status for - * driver enqueued frames - */ - uint32_t rxfrmtoolong; /* Received frame longer than legal limit (2346 bytes) */ - uint32_t rxfrmtooshrt; /* Received frame did not contain enough bytes for its frame type */ - uint32_t rxinvmachdr; /* Either the protocol version != 0 or frame type not - * data/control/management - */ - uint32_t rxbadfcs; /* number of frames for which the CRC check failed in the MAC */ - uint32_t rxbadplcp; /* parity check of the PLCP header failed */ - uint32_t rxcrsglitch; /* PHY was able to correlate the preamble but not the header */ - uint32_t rxstrt; /* Number of received frames with a good PLCP - * (i.e. passing parity check) - */ - uint32_t rxdfrmucastmbss; /* Number of received DATA frames with good FCS and matching RA */ - uint32_t rxmfrmucastmbss; /* number of received mgmt frames with good FCS and matching RA */ - uint32_t rxcfrmucast; /* number of received CNTRL frames with good FCS and matching RA */ - uint32_t rxrtsucast; /* number of unicast RTS addressed to the MAC (good FCS) */ - uint32_t rxctsucast; /* number of unicast CTS addressed to the MAC (good FCS) */ - uint32_t rxackucast; /* number of ucast ACKS received (good FCS) */ - uint32_t rxdfrmocast; /* number of received DATA frames (good FCS and not matching RA) */ - uint32_t rxmfrmocast; /* number of received MGMT frames (good FCS and not matching RA) */ - uint32_t rxcfrmocast; /* number of received CNTRL frame (good FCS and not matching RA) */ - uint32_t rxrtsocast; /* number of received RTS not addressed to the MAC */ - uint32_t rxctsocast; /* number of received CTS not addressed to the MAC */ - uint32_t rxdfrmmcast; /* number of RX Data multicast frames received by the MAC */ - uint32_t rxmfrmmcast; /* number of RX Management multicast frames received by the MAC */ - uint32_t rxcfrmmcast; /* number of RX Control multicast frames received by the MAC - * (unlikely to see these) - */ - uint32_t rxbeaconmbss; /* beacons received from member of BSS */ - uint32_t rxdfrmucastobss; /* number of unicast frames addressed to the MAC from - * other BSS (WDS FRAME) - */ - uint32_t rxbeaconobss; /* beacons received from other BSS */ - uint32_t rxrsptmout; /* Number of response timeouts for transmitted frames - * expecting a response - */ - uint32_t bcntxcancl; /* transmit beacons canceled due to receipt of beacon (IBSS) */ - uint32_t rxf0ovfl; /* Number of receive fifo 0 overflows */ - uint32_t rxf1ovfl; /* Number of receive fifo 1 overflows (obsolete) */ - uint32_t rxf2ovfl; /* Number of receive fifo 2 overflows (obsolete) */ - uint32_t txsfovfl; /* Number of transmit status fifo overflows (obsolete) */ - uint32_t pmqovfl; /* Number of PMQ overflows */ - uint32_t rxcgprqfrm; /* Number of received Probe requests that made it into - * the PRQ fifo - */ - uint32_t rxcgprsqovfl; /* Rx Probe Request Que overflow in the AP */ - uint32_t txcgprsfail; /* Tx Probe Response Fail. AP sent probe response but did - * not get ACK - */ - uint32_t txcgprssuc; /* Tx Probe Response Success (ACK was received) */ - uint32_t prs_timeout; /* Number of probe requests that were dropped from the PRQ - * fifo because a probe response could not be sent out within - * the time limit defined in M_PRS_MAXTIME - */ - uint32_t rxnack; /* obsolete */ - uint32_t frmscons; /* obsolete */ - uint32_t txnack; /* obsolete */ - uint32_t rxback; /* blockack rxcnt */ - uint32_t txback; /* blockack txcnt */ - - /* 802.11 MIB counters, pp. 614 of 802.11 reaff doc. */ - uint32_t txfrag; /* dot11TransmittedFragmentCount */ - uint32_t txmulti; /* dot11MulticastTransmittedFrameCount */ - uint32_t txfail; /* dot11FailedCount */ - uint32_t txretry; /* dot11RetryCount */ - uint32_t txretrie; /* dot11MultipleRetryCount */ - uint32_t rxdup; /* dot11FrameduplicateCount */ - uint32_t txrts; /* dot11RTSSuccessCount */ - uint32_t txnocts; /* dot11RTSFailureCount */ - uint32_t txnoack; /* dot11ACKFailureCount */ - uint32_t rxfrag; /* dot11ReceivedFragmentCount */ - uint32_t rxmulti; /* dot11MulticastReceivedFrameCount */ - uint32_t rxcrc; /* dot11FCSErrorCount */ - uint32_t txfrmsnt; /* dot11TransmittedFrameCount (bogus MIB?) */ - uint32_t rxundec; /* dot11WEPUndecryptableCount */ - - /* WPA2 counters (see rxundec for DecryptFailureCount) */ - uint32_t tkipmicfaill; /* TKIPLocalMICFailures */ - uint32_t tkipcntrmsr; /* TKIPCounterMeasuresInvoked */ - uint32_t tkipreplay; /* TKIPReplays */ - uint32_t ccmpfmterr; /* CCMPFormatErrors */ - uint32_t ccmpreplay; /* CCMPReplays */ - uint32_t ccmpundec; /* CCMPDecryptErrors */ - uint32_t fourwayfail; /* FourWayHandshakeFailures */ - uint32_t wepundec; /* dot11WEPUndecryptableCount */ - uint32_t wepicverr; /* dot11WEPICVErrorCount */ - uint32_t decsuccess; /* DecryptSuccessCount */ - uint32_t tkipicverr; /* TKIPICVErrorCount */ - uint32_t wepexcluded; /* dot11WEPExcludedCount */ - - uint32_t txchanrej; /* Tx frames suppressed due to channel rejection */ - uint32_t psmwds; /* Count PSM watchdogs */ - uint32_t phywatchdog; /* Count Phy watchdogs (triggered by ucode) */ - - /* MBSS counters, AP only */ - uint32_t prq_entries_handled; /* PRQ entries read in */ - uint32_t prq_undirected_entries; /* which were bcast bss & ssid */ - uint32_t prq_bad_entries; /* which could not be translated to info */ - uint32_t atim_suppress_count; /* TX suppressions on ATIM fifo */ - uint32_t bcn_template_not_ready; /* Template marked in use on send bcn ... */ - uint32_t bcn_template_not_ready_done; /* ...but "DMA done" interrupt rcvd */ - uint32_t late_tbtt_dpc; /* TBTT DPC did not happen in time */ - - /* per-rate receive stat counters */ - uint32_t rx1mbps; /* packets rx at 1Mbps */ - uint32_t rx2mbps; /* packets rx at 2Mbps */ - uint32_t rx5mbps5; /* packets rx at 5.5Mbps */ - uint32_t rx6mbps; /* packets rx at 6Mbps */ - uint32_t rx9mbps; /* packets rx at 9Mbps */ - uint32_t rx11mbps; /* packets rx at 11Mbps */ - uint32_t rx12mbps; /* packets rx at 12Mbps */ - uint32_t rx18mbps; /* packets rx at 18Mbps */ - uint32_t rx24mbps; /* packets rx at 24Mbps */ - uint32_t rx36mbps; /* packets rx at 36Mbps */ - uint32_t rx48mbps; /* packets rx at 48Mbps */ - uint32_t rx54mbps; /* packets rx at 54Mbps */ - uint32_t rx108mbps; /* packets rx at 108mbps */ - uint32_t rx162mbps; /* packets rx at 162mbps */ - uint32_t rx216mbps; /* packets rx at 216 mbps */ - uint32_t rx270mbps; /* packets rx at 270 mbps */ - uint32_t rx324mbps; /* packets rx at 324 mbps */ - uint32_t rx378mbps; /* packets rx at 378 mbps */ - uint32_t rx432mbps; /* packets rx at 432 mbps */ - uint32_t rx486mbps; /* packets rx at 486 mbps */ - uint32_t rx540mbps; /* packets rx at 540 mbps */ - - /* pkteng rx frame stats */ - uint32_t pktengrxducast; /* unicast frames rxed by the pkteng code */ - uint32_t pktengrxdmcast; /* multicast frames rxed by the pkteng code */ - - uint32_t rfdisable; /* count of radio disables */ - uint32_t bphy_rxcrsglitch; /* PHY count of bphy glitches */ - uint32_t bphy_badplcp; - - uint32_t txexptime; /* Tx frames suppressed due to timer expiration */ - - uint32_t txmpdu_sgi; /* count for sgi transmit */ - uint32_t rxmpdu_sgi; /* count for sgi received */ - uint32_t txmpdu_stbc; /* count for stbc transmit */ - uint32_t rxmpdu_stbc; /* count for stbc received */ - - uint32_t rxundec_mcst; /* dot11WEPUndecryptableCount */ - - /* WPA2 counters (see rxundec for DecryptFailureCount) */ - uint32_t tkipmicfaill_mcst; /* TKIPLocalMICFailures */ - uint32_t tkipcntrmsr_mcst; /* TKIPCounterMeasuresInvoked */ - uint32_t tkipreplay_mcst; /* TKIPReplays */ - uint32_t ccmpfmterr_mcst; /* CCMPFormatErrors */ - uint32_t ccmpreplay_mcst; /* CCMPReplays */ - uint32_t ccmpundec_mcst; /* CCMPDecryptErrors */ - uint32_t fourwayfail_mcst; /* FourWayHandshakeFailures */ - uint32_t wepundec_mcst; /* dot11WEPUndecryptableCount */ - uint32_t wepicverr_mcst; /* dot11WEPICVErrorCount */ - uint32_t decsuccess_mcst; /* DecryptSuccessCount */ - uint32_t tkipicverr_mcst; /* TKIPICVErrorCount */ - uint32_t wepexcluded_mcst; /* dot11WEPExcludedCount */ - - uint32_t dma_hang; /* count for dma hang */ - uint32_t reinit; /* count for reinit */ - - uint32_t pstatxucast; /* count of ucast frames xmitted on all psta assoc */ - uint32_t pstatxnoassoc; /* count of txnoassoc frames xmitted on all psta assoc */ - uint32_t pstarxucast; /* count of ucast frames received on all psta assoc */ - uint32_t pstarxbcmc; /* count of bcmc frames received on all psta */ - uint32_t pstatxbcmc; /* count of bcmc frames transmitted on all psta */ - - uint32_t cso_passthrough; /* hw cso required but passthrough */ - uint32_t cso_normal; /* hw cso hdr for normal process */ - uint32_t chained; /* number of frames chained */ - uint32_t chainedsz1; /* number of chain size 1 frames */ - uint32_t unchained; /* number of frames not chained */ - uint32_t maxchainsz; /* max chain size so far */ - uint32_t currchainsz; /* current chain size */ - - uint32_t rxdrop20s; /* drop secondary cnt */ - -} wl_cnt_ver_eight_t; - -/* per-rate receive stat counters subset of full counters */ -typedef struct { - uint32_t rx1mbps; /* packets rx at 1Mbps */ - uint32_t rx2mbps; /* packets rx at 2Mbps */ - uint32_t rx5mbps5; /* packets rx at 5.5Mbps */ - uint32_t rx6mbps; /* packets rx at 6Mbps */ - uint32_t rx9mbps; /* packets rx at 9Mbps */ - uint32_t rx11mbps; /* packets rx at 11Mbps */ - uint32_t rx12mbps; /* packets rx at 12Mbps */ - uint32_t rx18mbps; /* packets rx at 18Mbps */ - uint32_t rx24mbps; /* packets rx at 24Mbps */ - uint32_t rx36mbps; /* packets rx at 36Mbps */ - uint32_t rx48mbps; /* packets rx at 48Mbps */ - uint32_t rx54mbps; /* packets rx at 54Mbps */ - uint32_t rx108mbps; /* packets rx at 108mbps */ - uint32_t rx162mbps; /* packets rx at 162mbps */ - uint32_t rx216mbps; /* packets rx at 216 mbps */ - uint32_t rx270mbps; /* packets rx at 270 mbps */ -} wiced_phyrate_counters_t; - -typedef struct { - uint32_t count; - uint8_t log[WL_PHYRATE_LOG_SIZE]; -}wiced_phyrate_log_t; - -typedef struct { - uint16_t version; /* see definition of WL_CNT_T_VERSION */ - uint16_t length; /* length of entire structure */ - - /* transmit stat counters */ - uint32_t txframe; /* tx data frames */ - uint32_t txbyte; /* tx data bytes */ - uint32_t txretrans;/* tx mac retransmits */ - uint32_t txerror; /* tx data errors (derived: sum of others) */ - uint32_t txctl; /* tx management frames */ - uint32_t txprshort;/* tx short preamble frames */ - uint32_t txserr; /* tx status errors */ - uint32_t txnobuf; /* tx out of buffers errors */ - uint32_t txnoassoc;/* tx discard because we're not associated */ - uint32_t txrunt; /* tx runt frames */ - uint32_t txchit; /* tx header cache hit (fastpath) */ - uint32_t txcmiss; /* tx header cache miss (slowpath) */ - - /* transmit chip error counters */ - uint32_t txuflo; /* tx fifo underflows */ - uint32_t txphyerr; /* tx phy errors (indicated in tx status) */ - uint32_t txphycrs; /* PR8861/8963 counter */ - - /* receive stat counters */ - uint32_t rxframe; /* rx data frames */ - uint32_t rxbyte; /* rx data bytes */ - uint32_t rxerror; /* rx data errors (derived: sum of others) */ - uint32_t rxctl; /* rx management frames */ - uint32_t rxnobuf; /* rx out of buffers errors */ - uint32_t rxnondata;/* rx non data frames in the data channel errors */ - uint32_t rxbadds; /* rx bad DS errors */ - uint32_t rxbadcm; /* rx bad control or management frames */ - uint32_t rxfragerr;/* rx fragmentation errors */ - uint32_t rxrunt; /* rx runt frames */ - uint32_t rxgiant; /* rx giant frames */ - uint32_t rxnoscb; /* rx no scb error */ - uint32_t rxbadproto; /* rx invalid frames */ - uint32_t rxbadsrcmac;/* rx frames with Invalid Src Mac */ - uint32_t rxbadda; /* rx frames tossed for invalid da */ - uint32_t rxfilter; /* rx frames filtered out */ - - /* receive chip error counters */ - uint32_t rxoflo; /* rx fifo overflow errors */ - uint32_t rxuflo[NFIFO]; /* rx dma descriptor underflow errors */ - - uint32_t d11cnt_txrts_off; /* d11cnt txrts value when reset d11cnt */ - uint32_t d11cnt_rxcrc_off; /* d11cnt rxcrc value when reset d11cnt */ - uint32_t d11cnt_txnocts_off; /* d11cnt txnocts value when reset d11cnt */ - - /* misc counters */ - uint32_t dmade; /* tx/rx dma descriptor errors */ - uint32_t dmada; /* tx/rx dma data errors */ - uint32_t dmape; /* tx/rx dma descriptor protocol errors */ - uint32_t reset; /* reset count */ - uint32_t tbtt; /* cnts the TBTT int's */ - uint32_t txdmawar; /* # occurrences of PR15420 workaround */ - uint32_t pkt_callback_reg_fail; /* callbacks register failure */ - - /* MAC counters: 32-bit version of d11.h's macstat_t */ - uint32_t txallfrm; /* total number of frames sent, incl. Data, ACK, RTS, CTS, - * Control Management (includes retransmissions) - */ - uint32_t txrtsfrm; /* number of RTS sent out by the MAC */ - uint32_t txctsfrm; /* number of CTS sent out by the MAC */ - uint32_t txackfrm; /* number of ACK frames sent out */ - uint32_t txdnlfrm; /* Not used */ - uint32_t txbcnfrm; /* beacons transmitted */ - uint32_t txfunfl[6]; /* per-fifo tx underflows */ - uint32_t rxtoolate; /* receive too late */ - uint32_t txfbw; /* transmit at fallback bw (dynamic bw) */ - uint32_t txtplunfl; /* Template underflows (mac was too slow to transmit ACK/CTS - * or BCN) - */ - uint32_t txphyerror; /* Transmit phy error, type of error is reported in tx-status for - * driver enqueued frames - */ - uint32_t rxfrmtoolong;/* Received frame longer than legal limit (2346 bytes) */ - uint32_t rxfrmtooshrt;/* Received frame did not contain enough bytes for its frame type */ - uint32_t rxinvmachdr; /* Either the protocol version != 0 or frame type not - * data/control/management - */ - uint32_t rxbadfcs; /* number of frames for which the CRC check failed in the MAC */ - uint32_t rxbadplcp; /* parity check of the PLCP header failed */ - uint32_t rxcrsglitch;/* PHY was able to correlate the preamble but not the header */ - uint32_t rxstrt; /* Number of received frames with a good PLCP - * (i.e. passing parity check) - */ - uint32_t rxdfrmucastmbss; /* Number of received DATA frames with good FCS and matching RA */ - uint32_t rxmfrmucastmbss; /* number of received mgmt frames with good FCS and matching RA */ - uint32_t rxcfrmucast; /* number of received CNTRL frames with good FCS and matching RA */ - uint32_t rxrtsucast; /* number of unicast RTS addressed to the MAC (good FCS) */ - uint32_t rxctsucast; /* number of unicast CTS addressed to the MAC (good FCS) */ - uint32_t rxackucast; /* number of ucast ACKS received (good FCS) */ - uint32_t rxdfrmocast; /* number of received DATA frames (good FCS and not matching RA) */ - uint32_t rxmfrmocast; /* number of received MGMT frames (good FCS and not matching RA) */ - uint32_t rxcfrmocast; /* number of received CNTRL frame (good FCS and not matching RA) */ - uint32_t rxrtsocast; /* number of received RTS not addressed to the MAC */ - uint32_t rxctsocast; /* number of received CTS not addressed to the MAC */ - uint32_t rxdfrmmcast; /* number of RX Data multicast frames received by the MAC */ - uint32_t rxmfrmmcast; /* number of RX Management multicast frames received by the MAC */ - uint32_t rxcfrmmcast; /* number of RX Control multicast frames received by the MAC - * (unlikely to see these) - */ - uint32_t rxbeaconmbss; /* beacons received from member of BSS */ - uint32_t rxdfrmucastobss; /* number of unicast frames addressed to the MAC from - * other BSS (WDS FRAME) - */ - uint32_t rxbeaconobss; /* beacons received from other BSS */ - uint32_t rxrsptmout; /* Number of response timeouts for transmitted frames - * expecting a response - */ - uint32_t bcntxcancl; /* transmit beacons canceled due to receipt of beacon (IBSS) */ - uint32_t rxf0ovfl; /* Number of receive fifo 0 overflows */ - uint32_t rxf1ovfl; /* Number of receive fifo 1 overflows (obsolete) */ - uint32_t rxf2ovfl; /* Number of receive fifo 2 overflows (obsolete) */ - uint32_t txsfovfl; /* Number of transmit status fifo overflows (obsolete) */ - uint32_t pmqovfl; /* Number of PMQ overflows */ - uint32_t rxcgprqfrm; /* Number of received Probe requests that made it into - * the PRQ fifo - */ - uint32_t rxcgprsqovfl; /* Rx Probe Request Que overflow in the AP */ - uint32_t txcgprsfail; /* Tx Probe Response Fail. AP sent probe response but did - * not get ACK - */ - uint32_t txcgprssuc; /* Tx Probe Response Success (ACK was received) */ - uint32_t prs_timeout; /* Number of probe requests that were dropped from the PRQ - * fifo because a probe response could not be sent out within - * the time limit defined in M_PRS_MAXTIME - */ - uint32_t rxnack; /* obsolete */ - uint32_t frmscons; /* obsolete */ - uint32_t txnack; /* obsolete */ - uint32_t rxback; /* blockack rxcnt */ - uint32_t txback; /* blockack txcnt */ - - /* 802.11 MIB counters, pp. 614 of 802.11 reaff doc. */ - uint32_t txfrag; /* dot11TransmittedFragmentCount */ - uint32_t txmulti; /* dot11MulticastTransmittedFrameCount */ - uint32_t txfail; /* dot11FailedCount */ - uint32_t txretry; /* dot11RetryCount */ - uint32_t txretrie; /* dot11MultipleRetryCount */ - uint32_t rxdup; /* dot11FrameduplicateCount */ - uint32_t txrts; /* dot11RTSSuccessCount */ - uint32_t txnocts; /* dot11RTSFailureCount */ - uint32_t txnoack; /* dot11ACKFailureCount */ - uint32_t rxfrag; /* dot11ReceivedFragmentCount */ - uint32_t rxmulti; /* dot11MulticastReceivedFrameCount */ - uint32_t rxcrc; /* dot11FCSErrorCount */ - uint32_t txfrmsnt; /* dot11TransmittedFrameCount (bogus MIB?) */ - uint32_t rxundec; /* dot11WEPUndecryptableCount */ - - /* WPA2 counters (see rxundec for DecryptFailureCount) */ - uint32_t tkipmicfaill; /* TKIPLocalMICFailures */ - uint32_t tkipcntrmsr; /* TKIPCounterMeasuresInvoked */ - uint32_t tkipreplay; /* TKIPReplays */ - uint32_t ccmpfmterr; /* CCMPFormatErrors */ - uint32_t ccmpreplay; /* CCMPReplays */ - uint32_t ccmpundec; /* CCMPDecryptErrors */ - uint32_t fourwayfail; /* FourWayHandshakeFailures */ - uint32_t wepundec; /* dot11WEPUndecryptableCount */ - uint32_t wepicverr; /* dot11WEPICVErrorCount */ - uint32_t decsuccess; /* DecryptSuccessCount */ - uint32_t tkipicverr; /* TKIPICVErrorCount */ - uint32_t wepexcluded; /* dot11WEPExcludedCount */ - - uint32_t txchanrej; /* Tx frames suppressed due to channel rejection */ - uint32_t psmwds; /* Count PSM watchdogs */ - uint32_t phywatchdog; /* Count Phy watchdogs (triggered by ucode) */ - - /* MBSS counters, AP only */ - uint32_t prq_entries_handled; /* PRQ entries read in */ - uint32_t prq_undirected_entries; /* which were bcast bss & ssid */ - uint32_t prq_bad_entries; /* which could not be translated to info */ - uint32_t atim_suppress_count; /* TX suppressions on ATIM fifo */ - uint32_t bcn_template_not_ready; /* Template marked in use on send bcn ... */ - uint32_t bcn_template_not_ready_done; /* ...but "DMA done" interrupt rcvd */ - uint32_t late_tbtt_dpc; /* TBTT DPC did not happen in time */ - - /* per-rate receive stat counters */ - uint32_t rx1mbps; /* packets rx at 1Mbps */ - uint32_t rx2mbps; /* packets rx at 2Mbps */ - uint32_t rx5mbps5; /* packets rx at 5.5Mbps */ - uint32_t rx6mbps; /* packets rx at 6Mbps */ - uint32_t rx9mbps; /* packets rx at 9Mbps */ - uint32_t rx11mbps; /* packets rx at 11Mbps */ - uint32_t rx12mbps; /* packets rx at 12Mbps */ - uint32_t rx18mbps; /* packets rx at 18Mbps */ - uint32_t rx24mbps; /* packets rx at 24Mbps */ - uint32_t rx36mbps; /* packets rx at 36Mbps */ - uint32_t rx48mbps; /* packets rx at 48Mbps */ - uint32_t rx54mbps; /* packets rx at 54Mbps */ - uint32_t rx108mbps;/* packets rx at 108mbps */ - uint32_t rx162mbps;/* packets rx at 162mbps */ - uint32_t rx216mbps;/* packets rx at 216 mbps */ - uint32_t rx270mbps;/* packets rx at 270 mbps */ - uint32_t rx324mbps;/* packets rx at 324 mbps */ - uint32_t rx378mbps;/* packets rx at 378 mbps */ - uint32_t rx432mbps;/* packets rx at 432 mbps */ - uint32_t rx486mbps;/* packets rx at 486 mbps */ - uint32_t rx540mbps;/* packets rx at 540 mbps */ - - /* pkteng rx frame stats */ - uint32_t pktengrxducast; /* unicast frames rxed by the pkteng code */ - uint32_t pktengrxdmcast; /* multicast frames rxed by the pkteng code */ - - uint32_t rfdisable; /* count of radio disables */ - uint32_t bphy_rxcrsglitch; /* PHY count of bphy glitches */ - uint32_t bphy_badplcp; - - uint32_t txexptime; /* Tx frames suppressed due to timer expiration */ - - uint32_t txmpdu_sgi; /* count for sgi transmit */ - uint32_t rxmpdu_sgi; /* count for sgi received */ - uint32_t txmpdu_stbc; /* count for stbc transmit */ - uint32_t rxmpdu_stbc; /* count for stbc received */ - - uint32_t rxundec_mcst; /* dot11WEPUndecryptableCount */ - - /* WPA2 counters (see rxundec for DecryptFailureCount) */ - uint32_t tkipmicfaill_mcst;/* TKIPLocalMICFailures */ - uint32_t tkipcntrmsr_mcst; /* TKIPCounterMeasuresInvoked */ - uint32_t tkipreplay_mcst; /* TKIPReplays */ - uint32_t ccmpfmterr_mcst; /* CCMPFormatErrors */ - uint32_t ccmpreplay_mcst; /* CCMPReplays */ - uint32_t ccmpundec_mcst; /* CCMPDecryptErrors */ - uint32_t fourwayfail_mcst; /* FourWayHandshakeFailures */ - uint32_t wepundec_mcst; /* dot11WEPUndecryptableCount */ - uint32_t wepicverr_mcst; /* dot11WEPICVErrorCount */ - uint32_t decsuccess_mcst; /* DecryptSuccessCount */ - uint32_t tkipicverr_mcst; /* TKIPICVErrorCount */ - uint32_t wepexcluded_mcst; /* dot11WEPExcludedCount */ - - uint32_t dma_hang; /* count for dma hang */ - uint32_t reinit; /* count for reinit */ - - uint32_t pstatxucast; /* count of ucast frames xmitted on all psta assoc */ - uint32_t pstatxnoassoc; /* count of txnoassoc frames xmitted on all psta assoc */ - uint32_t pstarxucast; /* count of ucast frames received on all psta assoc */ - uint32_t pstarxbcmc; /* count of bcmc frames received on all psta */ - uint32_t pstatxbcmc; /* count of bcmc frames transmitted on all psta */ - - uint32_t cso_passthrough; /* hw cso required but passthrough */ - uint32_t cso_normal; /* hw cso hdr for normal process */ - uint32_t chained; /* number of frames chained */ - uint32_t chainedsz1; /* number of chain size 1 frames */ - uint32_t unchained; /* number of frames not chained */ - uint32_t maxchainsz; /* max chain size so far */ - uint32_t currchainsz; /* current chain size */ - uint32_t rxdrop20s; /* drop secondary cnt */ - uint32_t pciereset; /* Secondary Bus Reset issued by driver */ - uint32_t cfgrestore; /* configspace restore by driver */ - uint32_t reinitreason[8]; /* reinitreason counters; 0: Unknown reason */ - uint32_t rxrtry; /* num of received packets with retry bit on */ -} wl_cnt_ver_ten_t; - -typedef struct -{ - uint16_t version; - uint16_t length; - uint32_t rxampdu_sgi; - uint32_t rxampdu_stbc; - uint32_t rxmpdu_sgi; - uint32_t rxmpdu_stbc; - uint32_t rxmcs0_40M; - uint32_t rxmcs1_40M; - uint32_t rxmcs2_40M; - uint32_t rxmcs3_40M; - uint32_t rxmcs4_40M; - uint32_t rxmcs5_40M; - uint32_t rxmcs6_40M; - uint32_t rxmcs7_40M; - uint32_t rxmcs32_40M; - uint32_t txfrmsnt_20Mlo; - uint32_t txfrmsnt_20Mup; - uint32_t txfrmsnt_40M; - uint32_t rx_20ul; -} wl_cnt_ext_t; -#define WL_RXDIV_STATS_T_VERSION 1 -typedef struct -{ - uint16_t version; - uint16_t length; - uint32_t rxant[4]; -} wl_rxdiv_stats_t; -#define WL_DELTA_STATS_T_VERSION 1 -typedef struct -{ - uint16_t version; - uint16_t length; - uint32_t txframe; - uint32_t txbyte; - uint32_t txretrans; - uint32_t txfail; - uint32_t rxframe; - uint32_t rxbyte; - uint32_t rx1mbps; - uint32_t rx2mbps; - uint32_t rx5mbps5; - uint32_t rx6mbps; - uint32_t rx9mbps; - uint32_t rx11mbps; - uint32_t rx12mbps; - uint32_t rx18mbps; - uint32_t rx24mbps; - uint32_t rx36mbps; - uint32_t rx48mbps; - uint32_t rx54mbps; - uint32_t rx108mbps; - uint32_t rx162mbps; - uint32_t rx216mbps; - uint32_t rx270mbps; - uint32_t rx324mbps; - uint32_t rx378mbps; - uint32_t rx432mbps; - uint32_t rx486mbps; - uint32_t rx540mbps; -} wl_delta_stats_t; -#define WL_WME_CNT_VERSION 1 -typedef struct -{ - uint32_t packets; - uint32_t bytes; -} wl_traffic_stats_t; -#define AC_COUNT 4 -typedef struct -{ - uint16_t version; - uint16_t length; - wl_traffic_stats_t tx[AC_COUNT]; - wl_traffic_stats_t tx_failed[AC_COUNT]; - wl_traffic_stats_t rx[AC_COUNT]; - wl_traffic_stats_t rx_failed[AC_COUNT]; - wl_traffic_stats_t forward[AC_COUNT]; - wl_traffic_stats_t tx_expired[AC_COUNT]; -} wl_wme_cnt_t; - -typedef struct wl_mkeep_alive_pkt { - uint16_t version; /* Version for mkeep_alive */ - uint16_t length; /* length of fixed parameters */ - uint32_t period_msec; /* repeat interval msecs */ - uint16_t len_bytes; /* packet length */ - uint8_t keep_alive_id; /* 0 - 3 for N = 4 */ - uint8_t data[1]; /* Packet data */ -} wl_mkeep_alive_pkt_t; - -#define WL_MKEEP_ALIVE_VERSION 1 -#define WL_MKEEP_ALIVE_FIXED_LEN offsetof(wl_mkeep_alive_pkt_t, data) -#define WL_MKEEP_ALIVE_PRECISION 500 - -#if !defined(ESTA_POSTMOGRIFY_REMOVAL) -#ifdef WLBA -#define WLC_BA_CNT_VERSION 1 -typedef struct wlc_ba_cnt -{ - uint16_t version; - uint16_t length; - uint32_t txpdu; - uint32_t txsdu; - uint32_t txfc; - uint32_t txfci; - uint32_t txretrans; - uint32_t txbatimer; - uint32_t txdrop; - uint32_t txaddbareq; - uint32_t txaddbaresp; - uint32_t txdelba; - uint32_t txba; - uint32_t txbar; - uint32_t txpad[4]; - uint32_t rxpdu; - uint32_t rxqed; - uint32_t rxdup; - uint32_t rxnobuf; - uint32_t rxaddbareq; - uint32_t rxaddbaresp; - uint32_t rxdelba; - uint32_t rxba; - uint32_t rxbar; - uint32_t rxinvba; - uint32_t rxbaholes; - uint32_t rxunexp; - uint32_t rxpad[4]; -}wlc_ba_cnt_t; -#endif -struct ampdu_tid_control -{ - uint8_t tid; - uint8_t enable; -}; -struct wl_msglevel2 -{ - uint32_t low; - uint32_t high; -}; -struct ampdu_ea_tid -{ - wl_ether_addr_t ea; - uint8_t tid; -}; -struct ampdu_retry_tid -{ - uint8_t tid; - uint8_t retry; -}; -struct ampdu_ba_sizes -{ - uint8_t ba_tx_wsize; - uint8_t ba_rx_wsize; -}; -#define DPT_DISCOVERY_MANUAL 0x01 -#define DPT_DISCOVERY_AUTO 0x02 -#define DPT_DISCOVERY_SCAN 0x04 -#define DPT_PATHSEL_AUTO 0 -#define DPT_PATHSEL_DIRECT 1 -#define DPT_PATHSEL_APPATH 2 -#define DPT_DENY_LIST_ADD 1 -#define DPT_DENY_LIST_REMOVE 2 -#define DPT_MANUAL_EP_CREATE 1 -#define DPT_MANUAL_EP_MODIFY 2 -#define DPT_MANUAL_EP_DELETE 3 -typedef struct dpt_iovar -{ - wl_ether_addr_t ea; - uint8_t mode; - uint32_t pad; -} dpt_iovar_t; -#define DPT_STATUS_ACTIVE 0x01 -#define DPT_STATUS_AES 0x02 -#define DPT_STATUS_FAILED 0x04 -#define DPT_FNAME_LEN 48 -typedef struct dpt_status -{ - uint8_t status; - uint8_t fnlen; - uint8_t name[DPT_FNAME_LEN]; - uint32_t rssi; - sta_info_t sta; -} dpt_status_t; -typedef struct dpt_list -{ - uint32_t num; - dpt_status_t status[1]; -} dpt_list_t; -typedef struct dpt_fname -{ - uint8_t len; - uint8_t name[DPT_FNAME_LEN]; -} dpt_fname_t; -#define BDD_FNAME_LEN 32 -typedef struct bdd_fname -{ - uint8_t len; - uint8_t name[BDD_FNAME_LEN]; -} bdd_fname_t; -struct ts_list -{ - int32_t count; - struct tsinfo_arg tsinfo[1]; -}; -typedef struct tspec_arg -{ - uint16_t version; - uint16_t length; - uint32_t flag; - struct tsinfo_arg tsinfo; - uint16_t nom_msdu_size; - uint16_t max_msdu_size; - uint32_t min_srv_interval; - uint32_t max_srv_interval; - uint32_t inactivity_interval; - uint32_t suspension_interval; - uint32_t srv_start_time; - uint32_t min_data_rate; - uint32_t mean_data_rate; - uint32_t peak_data_rate; - uint32_t max_burst_size; - uint32_t delay_bound; - uint32_t min_phy_rate; - uint16_t surplus_bw; - uint16_t medium_time; - uint8_t dialog_token; -} tspec_arg_t; -typedef struct tspec_per_sta_arg -{ - wl_ether_addr_t ea; - struct tspec_arg ts; -} tspec_per_sta_arg_t; -typedef struct wme_max_bandwidth -{ - uint32_t ac[AC_COUNT]; -} wme_max_bandwidth_t; -#define WL_WME_MBW_PARAMS_IO_BYTES (sizeof(wme_max_bandwidth_t)) -#define TSPEC_ARG_VERSION 2 -#define TSPEC_ARG_LENGTH 55 -#define TSPEC_DEFAULT_DIALOG_TOKEN 42 -#define TSPEC_DEFAULT_SBW_FACTOR 0x3000 -#define TSPEC_PENDING 0 -#define TSPEC_ACCEPTED 1 -#define TSPEC_REJECTED 2 -#define TSPEC_UNKNOWN 3 -#define TSPEC_STATUS_MASK 7 -#ifdef BCMCCX -#define WL_WLAN_ASSOC_REASON_NORMAL_NETWORK 0 -#define WL_WLAN_ASSOC_REASON_ROAM_FROM_CELLULAR_NETWORK 1 -#define WL_WLAN_ASSOC_REASON_ROAM_FROM_LAN 2 -#define WL_WLAN_ASSOC_REASON_MAX 2 -#endif -#ifdef WLAFTERBURNER -#define WL_SWFL_ABBFL 0x0001 -#define WL_SWFL_ABENCORE 0x0002 -#endif -#define WL_SWFL_NOHWRADIO 0x0004 -#define WL_LIFETIME_MAX 0xFFFF -typedef struct wl_lifetime -{ - uint32_t ac; - uint32_t lifetime; -} wl_lifetime_t; -typedef struct wl_chan_switch -{ - uint8_t mode; - uint8_t count; - wl_chanspec_t chspec; - uint8_t reg; -} wl_chan_switch_t; -#endif -#define WLC_ROAM_TRIGGER_DEFAULT 0 -#define WLC_ROAM_TRIGGER_BANDWIDTH 1 -#define WLC_ROAM_TRIGGER_DISTANCE 2 -#define WLC_ROAM_TRIGGER_MAX_VALUE 2 -enum -{ - PFN_LIST_ORDER, PFN_RSSI -}; -#define SORT_CRITERIA_BIT 0 -#define AUTO_NET_SWITCH_BIT 1 -#define ENABLE_BKGRD_SCAN_BIT 2 -#define IMMEDIATE_SCAN_BIT 3 -#define AUTO_CONNECT_BIT 4 -#define IMMEDIATE_EVENT_BIT 8 -#define SUPPRESS_SSID_BIT 9 -#define ENABLE_NET_OFFLOAD_BIT 10 -#define SORT_CRITERIA_MASK 0x01 -#define AUTO_NET_SWITCH_MASK 0x02 -#define ENABLE_BKGRD_SCAN_MASK 0x04 -#define IMMEDIATE_SCAN_MASK 0x08 -#define AUTO_CONNECT_MASK 0x10 -#define PFN_VERSION 2 - -/* PFN network info structure */ -typedef struct wl_pfn_subnet_info -{ - struct ether_addr BSSID; - uint8_t channel; /* channel number only */ - uint8_t SSID_len; - uint8_t SSID[32]; -} wl_pfn_subnet_info_t; - -typedef struct wl_pfn_net_info -{ - wl_pfn_subnet_info_t pfnsubnet; - int16_t RSSI; /* receive signal strength (in dBm) */ - uint16_t timestamp; /* age in seconds */ -} wl_pfn_net_info_t; - -/* used to report exactly one scan result */ -/* plus reports detailed scan info in bss_info */ -typedef struct wl_pfn_scanresult -{ - uint32_t version; - uint32_t status; - uint32_t count; - wl_pfn_net_info_t netinfo; - wl_bss_info_t bss_info; -} wl_pfn_scanresult_t; - -/* PFN data structure */ -typedef struct wl_pfn_param -{ - int32_t version; /* PNO parameters version */ - int32_t scan_freq; /* Scan frequency */ - int32_t lost_network_timeout; /* Timeout in sec. to declare - * discovered network as lost - */ - int16_t flags; /* Bit field to control features - * of PFN such as sort criteria auto - * enable switch and background scan - */ - int16_t rssi_margin; /* Margin to avoid jitter for choosing a - * PFN based on RSSI sort criteria - */ - uint8_t bestn; /* number of best networks in each scan */ - uint8_t mscan; /* number of scans recorded */ - uint8_t repeat; /* Minimum number of scan intervals - *before scan frequency changes in adaptive scan - */ - uint8_t exp; /* Exponent of 2 for maximum scan interval */ - - int32_t slow_freq; /* slow scan period */ -} wl_pfn_param_t; - -typedef struct wl_pfn_bssid -{ - struct ether_addr macaddr; - /* Bit4: suppress_lost, Bit3: suppress_found */ - uint16_t flags; -} wl_pfn_bssid_t; - -typedef struct wl_pfn_cfg -{ - uint32_t reporttype; - int32_t channel_num; - uint16_t channel_list[WL_NUMCHANNELS]; - uint32_t flags; -} wl_pfn_cfg_t; - -/* for use with wl_pfn.flags */ -#define WL_PFN_HIDDEN_MASK 0x4 -#define WL_PFN_SUPPRESSLOST_MASK 0x10 - -typedef struct wl_pfn -{ - wlc_ssid_t ssid; /* ssid name and its length */ - int32_t flags; /* bit2: hidden */ - int32_t infra; /* BSS Vs IBSS */ - int32_t auth; /* Open Vs Closed */ - int32_t wpa_auth; /* WPA type */ - int32_t wsec; /* wsec value */ -} wl_pfn_t; - -#define TOE_TX_CSUM_OL 0x00000001 -#define TOE_RX_CSUM_OL 0x00000002 -#define TOE_ERRTEST_TX_CSUM 0x00000001 -#define TOE_ERRTEST_RX_CSUM 0x00000002 -#define TOE_ERRTEST_RX_CSUM2 0x00000004 -struct toe_ol_stats_t -{ - uint32_t tx_summed; - uint32_t tx_iph_fill; - uint32_t tx_tcp_fill; - uint32_t tx_udp_fill; - uint32_t tx_icmp_fill; - uint32_t rx_iph_good; - uint32_t rx_iph_bad; - uint32_t rx_tcp_good; - uint32_t rx_tcp_bad; - uint32_t rx_udp_good; - uint32_t rx_udp_bad; - uint32_t rx_icmp_good; - uint32_t rx_icmp_bad; - uint32_t tx_tcp_errinj; - uint32_t tx_udp_errinj; - uint32_t tx_icmp_errinj; - uint32_t rx_tcp_errinj; - uint32_t rx_udp_errinj; - uint32_t rx_icmp_errinj; -}; -#define ARP_OL_AGENT 0x00000001 -#define ARP_OL_SNOOP 0x00000002 -#define ARP_OL_HOST_AUTO_REPLY 0x00000004 -#define ARP_OL_PEER_AUTO_REPLY 0x00000008 -#define ARP_ERRTEST_REPLY_PEER 0x1 -#define ARP_ERRTEST_REPLY_HOST 0x2 -#define ARP_MULTIHOMING_MAX 8 -struct arp_ol_stats_t -{ - uint32_t host_ip_entries; - uint32_t host_ip_overflow; - uint32_t arp_table_entries; - uint32_t arp_table_overflow; - uint32_t host_request; - uint32_t host_reply; - uint32_t host_service; - uint32_t peer_request; - uint32_t peer_request_drop; - uint32_t peer_reply; - uint32_t peer_reply_drop; - uint32_t peer_service; -}; -typedef struct wl_keep_alive_pkt -{ - uint32_t period_msec; - uint16_t len_bytes; - uint8_t data[1]; -} wl_keep_alive_pkt_t; -#define WL_KEEP_ALIVE_FIXED_LEN offsetof(wl_keep_alive_pkt_t, data) -typedef enum wl_pkt_filter_type -{ - WL_PKT_FILTER_TYPE_PATTERN_MATCH -} wl_pkt_filter_type_t; -#define WL_PKT_FILTER_TYPE wl_pkt_filter_type_t -typedef struct wl_pkt_filter_pattern -{ - uint32_t offset; - uint32_t size_bytes; - uint8_t mask_and_pattern[1]; -} wl_pkt_filter_pattern_t; -typedef struct wl_pkt_filter -{ - uint32_t id; - uint32_t type; - uint32_t negate_match; - union - { - wl_pkt_filter_pattern_t pattern; - } u; -} wl_pkt_filter_t; -#define WL_PKT_FILTER_FIXED_LEN offsetof(wl_pkt_filter_t, u) -#define WL_PKT_FILTER_PATTERN_FIXED_LEN offsetof(wl_pkt_filter_pattern_t, mask_and_pattern) -typedef struct wl_pkt_filter_enable -{ - uint32_t id; - uint32_t enable; -} wl_pkt_filter_enable_t; -typedef struct wl_pkt_filter_list -{ - uint32_t num; - wl_pkt_filter_t filter[1]; -} wl_pkt_filter_list_t; -#define WL_PKT_FILTER_LIST_FIXED_LEN offsetof(wl_pkt_filter_list_t, filter) -typedef struct wl_pkt_filter_stats -{ - uint32_t num_pkts_matched; - uint32_t num_pkts_forwarded; - uint32_t num_pkts_discarded; -} wl_pkt_filter_stats_t; -typedef struct wl_seq_cmd_ioctl -{ - uint32_t cmd; - uint32_t len; -} wl_seq_cmd_ioctl_t; -#define WL_SEQ_CMD_ALIGN_BYTES 4 -#define WL_SEQ_CMDS_GET_IOCTL_FILTER(cmd) \ - (((cmd) == WLC_GET_MAGIC) || \ - ((cmd) == WLC_GET_VERSION) || \ - ((cmd) == WLC_GET_AP) || \ - ((cmd) == WLC_GET_INSTANCE)) -#define WL_PKTENG_PER_TX_START 0x01 -#define WL_PKTENG_PER_TX_STOP 0x02 -#define WL_PKTENG_PER_RX_START 0x04 -#define WL_PKTENG_PER_RX_WITH_ACK_START 0x05 -#define WL_PKTENG_PER_TX_WITH_ACK_START 0x06 -#define WL_PKTENG_PER_RX_STOP 0x08 -#define WL_PKTENG_PER_MASK 0xff -#define WL_PKTENG_SYNCHRONOUS 0x100 -typedef struct wl_pkteng -{ - uint32_t flags; - uint32_t delay; - uint32_t nframes; - uint32_t length; - uint8_t seqno; - wl_ether_addr_t dest; - wl_ether_addr_t src; -} wl_pkteng_t; -#define NUM_80211b_RATES 4 -#define NUM_80211ag_RATES 8 -#define NUM_80211n_RATES 32 -#define NUM_80211_RATES (NUM_80211b_RATES+NUM_80211ag_RATES+NUM_80211n_RATES) -typedef struct wl_pkteng_stats -{ - uint32_t lostfrmcnt; - int32_t rssi; - int32_t snr; - uint16_t rxpktcnt[NUM_80211_RATES + 1]; -} wl_pkteng_stats_t; -#if !defined(BCMDONGLEHOST) || defined(BCMINTERNAL) || defined(WLTEST) -typedef struct wl_sslpnphy_papd_debug_data -{ - uint8_t psat_pwr; - uint8_t psat_indx; - uint8_t final_idx; - uint8_t start_idx; - int32_t min_phase; - int32_t voltage; - int8_t temperature; -} wl_sslpnphy_papd_debug_data_t; -typedef struct wl_sslpnphy_debug_data -{ - int16_t papdcompRe[64]; - int16_t papdcompIm[64]; -} wl_sslpnphy_debug_data_t; -typedef struct wl_sslpnphy_spbdump_data -{ - uint16_t tbl_length; - int16_t spbreal[256]; - int16_t spbimg[256]; -} wl_sslpnphy_spbdump_data_t; -typedef struct wl_sslpnphy_percal_debug_data -{ - uint32_t cur_idx; - uint32_t tx_drift; - uint8_t prev_cal_idx; - uint32_t percal_ctr; - int32_t nxt_cal_idx; - uint32_t force_1idxcal; - uint32_t onedxacl_req; - int32_t last_cal_volt; - int8_t last_cal_temp; - uint32_t vbat_ripple; - uint32_t exit_route; - int32_t volt_winner; -} wl_sslpnphy_percal_debug_data_t; -#endif -#define WL_WOWL_MAGIC (1 << 0) -#define WL_WOWL_NET (1 << 1) -#define WL_WOWL_DIS (1 << 2) -#define WL_WOWL_RETR (1 << 3) -#define WL_WOWL_BCN (1 << 4) -#define WL_WOWL_TST (1 << 5) -#define WL_WOWL_BCAST (1 << 15) -#define MAGIC_PKT_MINLEN 102 -typedef struct -{ - uint32_t masksize; - uint32_t offset; - uint32_t patternoffset; - uint32_t patternsize; -} wl_wowl_pattern_t; -typedef struct -{ - uint32_t count; - wl_wowl_pattern_t pattern[1]; -} wl_wowl_pattern_list_t; -typedef struct -{ - uint8_t pci_wakeind; - uint16_t ucode_wakeind; -} wl_wowl_wakeind_t; -typedef struct wl_txrate_class -{ - uint8_t init_rate; - uint8_t min_rate; - uint8_t max_rate; -} wl_txrate_class_t; -#if defined(DSLCPE_DELAY) -#define WL_DELAYMODE_DEFER 0 -#define WL_DELAYMODE_FORCE 1 -#define WL_DELAYMODE_AUTO 2 -#endif -#define WLC_OBSS_SCAN_PASSIVE_DWELL_DEFAULT 100 -#define WLC_OBSS_SCAN_PASSIVE_DWELL_MIN 5 -#define WLC_OBSS_SCAN_PASSIVE_DWELL_MAX 1000 -#define WLC_OBSS_SCAN_ACTIVE_DWELL_DEFAULT 20 -#define WLC_OBSS_SCAN_ACTIVE_DWELL_MIN 10 -#define WLC_OBSS_SCAN_ACTIVE_DWELL_MAX 1000 -#define WLC_OBSS_SCAN_WIDTHSCAN_INTERVAL_DEFAULT 300 -#define WLC_OBSS_SCAN_WIDTHSCAN_INTERVAL_MIN 10 -#define WLC_OBSS_SCAN_WIDTHSCAN_INTERVAL_MAX 900 -#define WLC_OBSS_SCAN_CHANWIDTH_TRANSITION_DLY_DEFAULT 5 -#define WLC_OBSS_SCAN_CHANWIDTH_TRANSITION_DLY_MIN 5 -#define WLC_OBSS_SCAN_CHANWIDTH_TRANSITION_DLY_MAX 100 -#define WLC_OBSS_SCAN_PASSIVE_TOTAL_PER_CHANNEL_DEFAULT 200 -#define WLC_OBSS_SCAN_PASSIVE_TOTAL_PER_CHANNEL_MIN 200 -#define WLC_OBSS_SCAN_PASSIVE_TOTAL_PER_CHANNEL_MAX 10000 -#define WLC_OBSS_SCAN_ACTIVE_TOTAL_PER_CHANNEL_DEFAULT 20 -#define WLC_OBSS_SCAN_ACTIVE_TOTAL_PER_CHANNEL_MIN 20 -#define WLC_OBSS_SCAN_ACTIVE_TOTAL_PER_CHANNEL_MAX 10000 -#define WLC_OBSS_SCAN_ACTIVITY_THRESHOLD_DEFAULT 25 -#define WLC_OBSS_SCAN_ACTIVITY_THRESHOLD_MIN 0 -#define WLC_OBSS_SCAN_ACTIVITY_THRESHOLD_MAX 100 -typedef struct wl_obss_scan_arg -{ - int16_t passive_dwell; - int16_t active_dwell; - int16_t bss_widthscan_interval; - int16_t passive_total; - int16_t active_total; - int16_t chanwidth_transition_delay; - int16_t activity_threshold; -} wl_obss_scan_arg_t; -#define WL_OBSS_SCAN_PARAM_LEN sizeof(wl_obss_scan_arg_t) -#define WL_MIN_NUM_OBSS_SCAN_ARG 7 -#define WL_COEX_INFO_MASK 0x07 -#define WL_COEX_INFO_REQ 0x01 -#define WL_COEX_40MHZ_INTOLERANT 0x02 -#define WL_COEX_WIDTH20 0x04 -typedef struct wl_action_obss_coex_req -{ - uint8_t info; - uint8_t num; - uint8_t ch_list[1]; -} wl_action_obss_coex_req_t; -#define MAX_RSSI_LEVELS 8 -typedef struct wl_rssi_event -{ - uint32_t rate_limit_msec; - uint8_t num_rssi_levels; - int8_t rssi_levels[MAX_RSSI_LEVELS]; -} wl_rssi_event_t; -#define WLFEATURE_DISABLE_11N 0x00000001 -#define WLFEATURE_DISABLE_11N_STBC_TX 0x00000002 -#define WLFEATURE_DISABLE_11N_STBC_RX 0x00000004 -#define WLFEATURE_DISABLE_11N_SGI_TX 0x00000008 -#define WLFEATURE_DISABLE_11N_SGI_RX 0x00000010 -#define WLFEATURE_DISABLE_11N_AMPDU_TX 0x00000020 -#define WLFEATURE_DISABLE_11N_AMPDU_RX 0x00000040 -#define WLFEATURE_DISABLE_11N_GF 0x00000080 - - - -#pragma pack(1) - -typedef struct sta_prbreq_wps_ie_hdr -{ - wl_ether_addr_t staAddr; - uint16_t ieLen; -} sta_prbreq_wps_ie_hdr_t; - -typedef struct sta_prbreq_wps_ie_data -{ - sta_prbreq_wps_ie_hdr_t hdr; - uint8_t ieData[1]; -} sta_prbreq_wps_ie_data_t; - -typedef struct sta_prbreq_wps_ie_list -{ - uint32_t totLen; - uint8_t ieDataList[1]; -} sta_prbreq_wps_ie_list_t; - - -/* EDCF related items from 802.11.h */ - -/* ACI from 802.11.h */ -#define EDCF_AIFSN_MIN 1 /* AIFSN minimum value */ -#define EDCF_AIFSN_MAX 15 /* AIFSN maximum value */ -#define EDCF_AIFSN_MASK 0x0f /* AIFSN mask */ -#define EDCF_ACM_MASK 0x10 /* ACM mask */ -#define EDCF_ACI_MASK 0x60 /* ACI mask */ -#define EDCF_ACI_SHIFT 5 /* ACI shift */ -#define EDCF_AIFSN_SHIFT 12 /* 4 MSB(0xFFF) in ifs_ctl for AC idx */ - -/* ECW from 802.11.h */ -#define EDCF_ECW_MIN 0 /* cwmin/cwmax exponent minimum value */ -#define EDCF_ECW_MAX 15 /* cwmin/cwmax exponent maximum value */ -#define EDCF_ECW2CW(exp) ((1 << (exp)) - 1) -#define EDCF_ECWMIN_MASK 0x0f /* cwmin exponent form mask */ -#define EDCF_ECWMAX_MASK 0xf0 /* cwmax exponent form mask */ -#define EDCF_ECWMAX_SHIFT 4 /* cwmax exponent form shift */ - -/* TXOP from 802.11.h */ -#define EDCF_TXOP_MIN 0 /* TXOP minimum value */ -#define EDCF_TXOP_MAX 65535 /* TXOP maximum value */ -#define EDCF_TXOP2USEC(txop) ((txop) << 5) - -#ifndef EDCF_ACPARAM -#define EDCF_ACPARAM -struct edcf_acparam { - uint8_t ACI; - uint8_t ECW; - uint16_t TXOP; /* stored in network order (ls octet first) */ -} ; -typedef struct edcf_acparam edcf_acparam_t; -#endif /* EDCF_ACPARAM */ - -/* Stop packing structures */ -#pragma pack() - -/* discovery state */ -typedef struct wl_p2p_disc_st { - uint8_t state; /* see p2p_discovery_state_t */ - uint16_t chanspec; /* valid in listen state */ - uint16_t dwell_time_ms; /* valid in listen state, in ms */ -} wl_p2p_disc_st_t; - -/* scan request */ -typedef struct wl_p2p_scan { - uint8_t type; /* 'S' for WLC_SCAN, 'E' for "escan" */ - uint8_t reserved[3]; - /* scan or escan parms... */ -} wl_p2p_scan_t; - -/* escan request */ -typedef struct -{ - uint8_t type; /* 'S' for WLC_SCAN, 'E' for "escan" */ - uint8_t reserved[3]; - - /* escan params */ - wl_escan_params_t escan; -} wl_p2p_escan_t; - -/* i/f request */ -typedef struct wl_p2p_if { - struct ether_addr mac_address; - uint8_t interface_type; - uint16_t chan_spec; -} wl_p2p_if_t; - -/* i/f query */ -typedef struct wl_p2p_ifq { - uint32_t bsscfgidx; - char ifname[16]; -} wl_p2p_ifq_t; - -/* OppPS & CTWindow */ -typedef struct wl_p2p_ops { - uint8_t ops; /* 0: disable 1: enable */ - uint8_t ctw; /* >= 10 */ -} wl_p2p_ops_t; - -/* absence and presence request */ -typedef struct wl_p2p_sched_desc { - uint32_t start; - uint32_t interval; - uint32_t duration; - uint32_t count; /* see count */ -} wl_p2p_sched_desc_t; - -typedef struct wl_p2p_sched { - uint8_t type; /* see schedule type */ - uint8_t action; /* see schedule action */ - uint8_t option; /* see schedule option */ - wl_p2p_sched_desc_t desc[1]; -} wl_p2p_sched_t; - -typedef struct wl_p2p_wfds_hash { - uint32_t advt_id; - uint16_t nw_cfg_method; - uint8_t wfds_hash[6]; - uint8_t name_len; - uint8_t service_name[MAX_WFDS_SVC_NAME_LEN]; -} wl_p2p_wfds_hash_t; - -/* Definitions for Reliable Multicast */ -/* NOTE: RMC structures should not be packed */ - -#define WL_RMC_CNT_VERSION (1) -#define WL_RMC_TR_VERSION (1) -#define WL_RMC_MAX_CLIENT (32) -#define WL_RMC_FLAG_INBLACKLIST (1) -#define WL_RMC_FLAG_ACTIVEACKER (2) -#define WL_RMC_FLAG_RELMCAST (4) -#define WL_RMC_FLAG_MASTER_TX (8) -#define WL_RMC_MAX_TABLE_ENTRY (8) - -#define WL_RMC_VER (1) -#define WL_RMC_INDEX_ACK_ALL (255) -#define WL_RMC_NUM_OF_MC_STREAMS (4) -#define WL_RMC_MAX_TRS_PER_GROUP (1) -#define WL_RMC_MAX_TRS_IN_ACKALL (1) -#define WL_RMC_ACK_MCAST0 (0x02) -#define WL_RMC_ACK_MCAST_ALL (0x01) -#define WL_RMC_ACTF_TIME_MIN (300) /* time in ms */ -#define WL_RMC_ACTF_TIME_MAX (20000) /* time in ms */ -#define WL_RMC_MAX_NUM_TRS (32) /* maximun transmitters allowed */ -#define WL_RMC_ARTMO_MIN (350) /* time in ms */ -#define WL_RMC_ARTMO_MAX (40000) /* time in ms */ - -enum rmc_opcodes { - RELMCAST_ENTRY_OP_DISABLE = 0, /* Disable multi-cast group */ - RELMCAST_ENTRY_OP_DELETE = 1, /* Delete multi-cast group */ - RELMCAST_ENTRY_OP_ENABLE = 2, /* Enable multi-cast group */ - RELMCAST_ENTRY_OP_ACK_ALL = 3 /* Enable ACK ALL bit in AMT */ -}; - -/* RMC operational modes */ -enum rmc_modes { - WL_RMC_MODE_RECEIVER = 0, /* Receiver mode by default */ - WL_RMC_MODE_TRANSMITTER = 1, /* Transmitter mode using wl ackreq */ - WL_RMC_MODE_INITIATOR = 2 /* Initiator mode using wl ackreq */ -}; - -/* Each RMC mcast client info */ -typedef struct wl_relmcast_client { - uint8_t flag; /* status of client such as AR, R, or blacklisted */ - int16_t rssi; /* rssi value of RMC client */ - struct ether_addr addr; /* mac address of RMC client */ -} wl_relmcast_client_t; - -/* RMC Counters */ -typedef struct wl_rmc_cnts { - uint16_t version; /* see definition of WL_CNT_T_VERSION */ - uint16_t length; /* length of entire structure */ - uint16_t dupcnt; /* counter for duplicate rmc MPDU */ - uint16_t ackreq_err; /* counter for wl ackreq error */ - uint16_t af_tx_err; /* error count for action frame transmit */ - uint16_t null_tx_err; /* error count for rmc null frame transmit */ - uint16_t af_unicast_tx_err; /* error count for rmc unicast frame transmit */ - uint16_t mc_no_amt_slot; /* No mcast AMT entry available */ - /* Unused. Keep for rom compatibility */ - uint16_t mc_no_glb_slot; /* No mcast entry available in global table */ - uint16_t mc_not_mirrored; /* mcast group is not mirrored */ - uint16_t mc_existing_tr; /* mcast group is already taken by transmitter */ - uint16_t mc_exist_in_amt; /* mcast group is already programmed in amt */ - /* Unused. Keep for rom compatibility */ - uint16_t mc_not_exist_in_gbl; /* mcast group is not in global table */ - uint16_t mc_not_exist_in_amt; /* mcast group is not in AMT table */ - uint16_t mc_utilized; /* mcast addressed is already taken */ - uint16_t mc_taken_other_tr; /* multi-cast addressed is already taken */ - uint32_t rmc_rx_frames_mac; /* no of mc frames received from mac */ - uint32_t rmc_tx_frames_mac; /* no of mc frames transmitted to mac */ - uint32_t mc_null_ar_cnt; /* no. of times NULL AR is received */ - uint32_t mc_ar_role_selected; /* no. of times took AR role */ - uint32_t mc_ar_role_deleted; /* no. of times AR role cancelled */ - uint32_t mc_noacktimer_expired; /* no. of times noack timer expired */ - uint16_t mc_no_wl_clk; /* no wl clk detected when trying to access amt */ - uint16_t mc_tr_cnt_exceeded; /* No of transmitters in the network exceeded */ -} wl_rmc_cnts_t; - -/* RMC Status */ -typedef struct wl_relmcast_st { - uint8_t ver; /* version of RMC */ - uint8_t num; /* number of clients detected by transmitter */ - wl_relmcast_client_t clients[WL_RMC_MAX_CLIENT]; - uint16_t err; /* error status (used in infra) */ - uint16_t actf_time; /* action frame time period */ -} wl_relmcast_status_t; - -/* Entry for each STA/node */ -typedef struct wl_rmc_entry { - /* operation on multi-cast entry such add, - * delete, ack-all - */ - int8_t flag; - struct ether_addr addr; /* multi-cast group mac address */ -} wl_rmc_entry_t; - -/* RMC table */ -typedef struct wl_rmc_entry_table { - uint8_t index; /* index to a particular mac entry in table */ - uint8_t opcode; /* opcodes or operation on entry */ - wl_rmc_entry_t entry[WL_RMC_MAX_TABLE_ENTRY]; -} wl_rmc_entry_table_t; - -typedef struct wl_rmc_trans_elem { - struct ether_addr tr_mac; /* transmitter mac */ - struct ether_addr ar_mac; /* ar mac */ - uint16_t artmo; /* AR timeout */ - uint8_t amt_idx; /* amt table entry */ - uint16_t flag; /* entry will be acked, not acked, programmed, full etc */ -} wl_rmc_trans_elem_t; - -/* RMC transmitters */ -typedef struct wl_rmc_trans_in_network { - uint8_t ver; /* version of RMC */ - uint8_t num_tr; /* number of transmitters in the network */ - wl_rmc_trans_elem_t trs[WL_RMC_MAX_NUM_TRS]; -} wl_rmc_trans_in_network_t; - -/* To update vendor specific ie for RMC */ -typedef struct wl_rmc_vsie { - uint8_t oui[3]; - uint16_t payload; /* IE Data Payload */ -} wl_rmc_vsie_t; - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/components/WWD/WWD/internal/bus_protocols/SDIO/wwd_bus_protocol.c b/components/WWD/WWD/internal/bus_protocols/SDIO/wwd_bus_protocol.c deleted file mode 100644 index c9af371d5d72610251103e759b59d7549a38f72c..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/bus_protocols/SDIO/wwd_bus_protocol.c +++ /dev/null @@ -1,836 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Broadcom WLAN SDIO Protocol interface - * - * Implements the WWD Bus Protocol Interface for SDIO - * Provides functions for initialising, de-intitialising 802.11 device, - * sending/receiving raw packets etc - */ - - -#include /* For memcpy */ -#include "wwd_assert.h" -#include "network/wwd_buffer_interface.h" -#include "wwd_rtos_interface.h" -#include "platform/wwd_platform_interface.h" -#include "chip_constants.h" -#include "wwd_internal.h" -#include "wwd_sdpcm.h" -#include "../internal/bus_protocols/wwd_bus_protocol_interface.h" - -//#include "wwd_bus_protocol.h" -//#include "wwd_internal.h" -/****************************************************** - * Constants - ******************************************************/ - -#define F0_WORKING_TIMEOUT_MS (500) -#define F1_AVAIL_TIMEOUT_MS (500) -#define F2_AVAIL_TIMEOUT_MS (500) -#define F2_READY_TIMEOUT_MS (1000) -#define ALP_AVAIL_TIMEOUT_MS (100) -#define HT_AVAIL_TIMEOUT_MS (500) -#define ABORT_TIMEOUT_MS (100) -/* Taken from FALCON_5_90_195_26 dhd/sys/dhd_sdio.c. */ -#define SDIO_F2_WATERMARK (8) - -#define INITIAL_READ 4 - -#define BUS_PROTOCOL_LEVEL_MAX_RETRIES 5 - -#define VERIFY_RESULT( x ) { wwd_result_t verify_result; verify_result = (x); if ( verify_result != WWD_SUCCESS ) { wiced_assert("command failed",0==1); return verify_result; } } - -#ifndef WWD_BUS_SDIO_RESET_DELAY -#define WWD_BUS_SDIO_RESET_DELAY (1) -#endif - -#ifndef WWD_BUS_SDIO_AFTER_RESET_DELAY -#define WWD_BUS_SDIO_AFTER_RESET_DELAY (1) -#endif - -/****************************************************** - * Structures - ******************************************************/ - -#pragma pack(1) -typedef struct -{ - unsigned char stuff_bits; - unsigned int ocr :24; -} sdio_cmd5_argument_t; - -typedef struct -{ - unsigned int _unique2 : 9; /* 0-8 */ - unsigned int register_address :17; /* 9-25 */ - unsigned int _unique : 2; /* 26-27 */ - unsigned int function_number : 3; /* 28-30 */ - unsigned int rw_flag : 1; /* 31 */ -} sdio_cmd5x_argument_t; - -typedef struct -{ - uint8_t write_data; /* 0 - 7 */ - unsigned int _stuff2 : 1; /* 8 */ - unsigned int register_address :17; /* 9-25 */ - unsigned int _stuff : 1; /* 26 */ - unsigned int raw_flag : 1; /* 27 */ - unsigned int function_number : 3; /* 28-30 */ - unsigned int rw_flag : 1; /* 31 */ -} wwd_bus_sdio_cmd52_argument_t; - -typedef struct -{ - unsigned int count : 9; /* 0-8 */ - unsigned int register_address :17; /* 9-25 */ - unsigned int op_code : 1; /* 26 */ - unsigned int block_mode : 1; /* 27 */ - unsigned int function_number : 3; /* 28-30 */ - unsigned int rw_flag : 1; /* 31 */ -} wwd_bus_sdio_cmd53_argument_t; - -typedef union -{ - uint32_t value; - sdio_cmd5_argument_t cmd5; - sdio_cmd5x_argument_t cmd5x; - wwd_bus_sdio_cmd52_argument_t cmd52; - wwd_bus_sdio_cmd53_argument_t cmd53; -} sdio_cmd_argument_t; - -typedef struct -{ - unsigned int ocr :24; /* 0-23 */ - unsigned int stuff_bits : 3; /* 24-26 */ - unsigned int memory_present : 1; /* 27 */ - unsigned int function_count : 3; /* 28-30 */ - unsigned int c : 1; /* 31 */ -} sdio_response4_t; - -typedef struct -{ - uint8_t data; /* 0-7 */ - uint8_t response_flags; /* 8-15 */ - uint16_t stuff; /* 16-31 */ -} sdio_response5_t; - -typedef struct -{ - uint16_t card_status; /* 0-15 */ - uint16_t rca; /* 16-31 */ -} sdio_response6_t; - -typedef union -{ - uint32_t value; - sdio_response4_t r4; - sdio_response5_t r5; - sdio_response6_t r6; -} sdio_response_t; - -#pragma pack() - -/****************************************************** - * Variables - ******************************************************/ - -static wiced_bool_t wwd_bus_flow_controlled = WICED_FALSE; - -/****************************************************** - * Static Function Declarations - ******************************************************/ - -static wwd_result_t wwd_bus_sdio_transfer ( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, uint16_t data_size, /*@in@*/ /*@out@*/ uint8_t* data, sdio_response_needed_t response_expected ); -static wwd_result_t wwd_bus_sdio_cmd52 ( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, uint8_t value, sdio_response_needed_t response_expected, /*@out@*/ uint8_t* response ); -static wwd_result_t wwd_bus_sdio_cmd53 ( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, sdio_transfer_mode_t mode, uint32_t address, uint16_t data_size, /*@in@*/ /*@out@*/ uint8_t* data, sdio_response_needed_t response_expected, /*@null@*/ /*@out@*/ uint32_t* response ); -static wwd_result_t wwd_bus_sdio_abort_read ( wiced_bool_t retry ); -static wwd_result_t wwd_bus_sdio_download_firmware ( void ); - -#ifndef WICED_DISABLE_MCU_POWERSAVE -static wwd_result_t wwd_bus_sdio_set_oob_interrupt ( uint8_t gpio_pin_number ); -#endif - -/****************************************************** - * SDIO Logging - * Enable this section for logging of SDIO transfers - * by changing "if 0" to "if 1" - ******************************************************/ -#if 0 - -#define SDIO_LOG_SIZE (110) -#define SDIO_LOG_HEADER_SIZE (0) /*(0x30) */ - -typedef struct sdio_log_entry_struct -{ - wwd_bus_transfer_direction_t direction; - wwd_bus_function_t function; - uint32_t address; - unsigned long time; - unsigned long length; -#if ( SDIO_LOG_HEADER_SIZE != 0 ) - unsigned char header[SDIO_LOG_HEADER_SIZE]; -#endif /* if ( SDIO_LOG_HEADER_SIZE != 0 ) */ -} sdio_log_entry_t; - -static int next_sdio_log_pos = 0; -static sdio_log_entry_t sdio_log_data[SDIO_LOG_SIZE]; - -static void add_log_entry( wwd_bus_transfer_direction_t dir, wwd_bus_function_t function, uint32_t address, unsigned long length, uint8_t* data ) -{ - sdio_log_data[next_sdio_log_pos].direction = dir; - sdio_log_data[next_sdio_log_pos].function = function; - sdio_log_data[next_sdio_log_pos].address = address; - sdio_log_data[next_sdio_log_pos].time = host_rtos_get_time(); - sdio_log_data[next_sdio_log_pos].length = length; -#if ( SDIO_LOG_HEADER_SIZE != 0 ) - memcpy( sdio_log_data[next_sdio_log_pos].header, data, (length>=SDIO_LOG_HEADER_SIZE)?SDIO_LOG_HEADER_SIZE:length ); -#else - UNUSED_PARAMETER(data); -#endif /* if ( SDIO_LOG_HEADER_SIZE != 0 ) */ - next_sdio_log_pos++; - if (next_sdio_log_pos >= SDIO_LOG_SIZE) - { - next_sdio_log_pos = 0; - } -} -#else /* #if 0 */ -#define add_log_entry( dir, function, address, length, data) -#endif /* #if 0 */ - - -/****************************************************** - * Global Function definitions - ******************************************************/ - -/* Device data transfer functions */ -wwd_result_t wwd_bus_send_buffer( wiced_buffer_t buffer ) -{ - wwd_result_t retval; - retval = wwd_bus_transfer_bytes( BUS_WRITE, WLAN_FUNCTION, 0, (uint16_t) ( host_buffer_get_current_piece_size( buffer ) - sizeof(wiced_buffer_t) ), (wwd_transfer_bytes_packet_t*)( host_buffer_get_current_piece_data_pointer( buffer ) + sizeof(wiced_buffer_t) ) ); - host_buffer_release( buffer, WWD_NETWORK_TX ); - return retval; -} - -wwd_result_t wwd_bus_init(void) -{ - uint8_t byte_data; - wwd_result_t result; - uint32_t loop_count; - - wwd_bus_flow_controlled = WICED_FALSE; - - wwd_bus_init_backplane_window( ); - - //host_platform_reset_wifi( WICED_TRUE ); - //host_platform_power_wifi( WICED_TRUE ); - //(void) host_rtos_delay_milliseconds( (uint32_t) WWD_BUS_SDIO_RESET_DELAY ); /* Ignore return - nothing can be done if it fails */ - //host_platform_reset_wifi( WICED_FALSE ); - //(void) host_rtos_delay_milliseconds( (uint32_t) WWD_BUS_SDIO_AFTER_RESET_DELAY ); /* Ignore return - nothing can be done if it fails */ - - VERIFY_RESULT(host_platform_sdio_enumerate( )); - - /* Setup the backplane*/ - loop_count = 0; - do - { - /* Enable function 1 (backplane) */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_IOEN, (uint8_t) 1, SDIO_FUNC_ENABLE_1 ) ); - if (loop_count != 0) - { - (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); /* Ignore return - nothing can be done if it fails */ - } - VERIFY_RESULT( wwd_bus_read_register_value ( BUS_FUNCTION, SDIOD_CCCR_IOEN, (uint8_t) 1, &byte_data ) ); - loop_count++; - if ( loop_count >= (uint32_t) F0_WORKING_TIMEOUT_MS ) - { - return WWD_TIMEOUT; - } - } while (byte_data != (uint8_t) SDIO_FUNC_ENABLE_1); - -#ifndef SDIO_1_BIT - /* Read the bus width and set to 4 bits */ - VERIFY_RESULT( wwd_bus_read_register_value (BUS_FUNCTION, SDIOD_CCCR_BICTRL, (uint8_t) 1, &byte_data) ); - VERIFY_RESULT( wwd_bus_write_register_value(BUS_FUNCTION, SDIOD_CCCR_BICTRL, (uint8_t) 1, (byte_data & (~BUS_SD_DATA_WIDTH_MASK)) | BUS_SD_DATA_WIDTH_4BIT ) ); - /* NOTE: We don't need to change our local bus settings since we're not sending any data (only using CMD52) until after we change the bus speed further down */ -#endif - /* Set the block size */ - - /* Wait till the backplane is ready */ - loop_count = 0; - while ( ( ( result = wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_BLKSIZE_0, (uint8_t) 1, (uint32_t) SDIO_64B_BLOCK ) ) == WWD_SUCCESS ) && - ( ( result = wwd_bus_read_register_value ( BUS_FUNCTION, SDIOD_CCCR_BLKSIZE_0, (uint8_t) 1, &byte_data ) ) == WWD_SUCCESS ) && - ( byte_data != (uint8_t) SDIO_64B_BLOCK ) && - ( loop_count < (uint32_t) F0_WORKING_TIMEOUT_MS ) ) - { - (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); /* Ignore return - nothing can be done if it fails */ - loop_count++; - if ( loop_count >= (uint32_t) F0_WORKING_TIMEOUT_MS ) - { - /* If the system fails here, check the high frequency crystal is working */ - WPRINT_WWD_ERROR(("Timeout while setting block size\n")); - return WWD_TIMEOUT; - } - } - - VERIFY_RESULT( result ); - - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_BLKSIZE_0, (uint8_t) 1, (uint32_t) SDIO_64B_BLOCK ) ); - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_F1BLKSIZE_0, (uint8_t) 1, (uint32_t) SDIO_64B_BLOCK ) ); - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_F2BLKSIZE_0, (uint8_t) 1, (uint32_t) SDIO_64B_BLOCK ) ); - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_F2BLKSIZE_1, (uint8_t) 1, (uint32_t) 0 ) ); /* Function 2 = 64 */ - - /* Enable/Disable Client interrupts */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_INTEN, (uint8_t) 1, INTR_CTL_MASTER_EN | INTR_CTL_FUNC1_EN | INTR_CTL_FUNC2_EN ) ); - - -#if 0 - /* This code is required if we want more than 25 MHz clock */ - VERIFY_RESULT( wwd_bus_sdio_read_register_value( BUS_FUNCTION, SDIOD_CCCR_SPEED_CONTROL, 1, &byte_data ) ); - if ( ( byte_data & 0x1 ) != 0 ) - { - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_SPEED_CONTROL, 1, byte_data | SDIO_SPEED_EHS ) ); - } - else - { - return WWD_BUS_READ_REGISTER_ERROR; - } -#endif /* HIGH_SPEED_SDIO_CLOCK */ - - /* Çл»SDIOʱÖÓΪ¸ßËÙģʽ£¬4bitģʽ */ - host_platform_enable_high_speed_sdio( ); - - /* Wait till the backplane is ready */ - loop_count = 0; - while ( ( ( result = wwd_bus_read_register_value( BUS_FUNCTION, SDIOD_CCCR_IORDY, (uint8_t) 1, &byte_data ) ) == WWD_SUCCESS ) && - ( ( byte_data & SDIO_FUNC_READY_1 ) == 0 ) && - ( loop_count < (uint32_t) F1_AVAIL_TIMEOUT_MS ) ) - { - (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); /* Ignore return - nothing can be done if it fails */ - loop_count++; - } - if ( loop_count >= (uint32_t) F1_AVAIL_TIMEOUT_MS ) - { - WPRINT_WWD_ERROR(("Timeout while waiting for backplane to be ready\n")); - return WWD_TIMEOUT; - } - VERIFY_RESULT( result ); - - /* Set the ALP */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, (uint32_t)( SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_ALP_AVAIL_REQ | SBSDIO_FORCE_ALP ) ) ); - - loop_count = 0; - while ( ( ( result = wwd_bus_read_register_value( BACKPLANE_FUNCTION, SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, &byte_data ) ) == WWD_SUCCESS ) && - ( ( byte_data & SBSDIO_ALP_AVAIL ) == 0 ) && - ( loop_count < (uint32_t) ALP_AVAIL_TIMEOUT_MS ) ) - { - (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); /* Ignore return - nothing can be done if it fails */ - loop_count++; - } - if ( loop_count >= (uint32_t) ALP_AVAIL_TIMEOUT_MS ) - { - WPRINT_WWD_ERROR(("Timeout while waiting for alp clock\n")); - return WWD_TIMEOUT; - } - VERIFY_RESULT( result ); - - /* Clear request for ALP */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, 0 ) ); - - /* Disable the extra SDIO pull-ups */ -#ifndef WWD_BUS_SDIO_USE_WLAN_SDIO_PULLUPS - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_PULL_UP, (uint8_t) 1, 0 ) ); -#endif - - /* Enable F1 and F2 */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_IOEN, (uint8_t) 1, SDIO_FUNC_ENABLE_1 | SDIO_FUNC_ENABLE_2 ) ); - -#ifndef WICED_DISABLE_MCU_POWERSAVE - /* Enable out-of-band interrupt */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_SEP_INT_CTL, (uint8_t) 1, SEP_INTR_CTL_MASK | SEP_INTR_CTL_EN | SEP_INTR_CTL_POL ) ); - - /* Set OOB interrupt to the correct WLAN GPIO pin */ - VERIFY_RESULT( wwd_bus_sdio_set_oob_interrupt( host_platform_get_oob_interrupt_pin( ) ) ); - - VERIFY_RESULT( host_enable_oob_interrupt( ) ); -#endif /* ifndef WICED_DISABLE_MCU_POWERSAVE */ - - /* Enable F2 interrupt only */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_INTEN, (uint8_t) 1, INTR_CTL_MASTER_EN | INTR_CTL_FUNC2_EN ) ); - - VERIFY_RESULT( wwd_bus_read_register_value( BUS_FUNCTION, SDIOD_CCCR_IORDY, (uint8_t) 1, &byte_data ) ); - - VERIFY_RESULT( wwd_bus_sdio_download_firmware( ) ); - - /* Wait for F2 to be ready */ - loop_count = 0; - while ( ( ( result = wwd_bus_read_register_value( BUS_FUNCTION, SDIOD_CCCR_IORDY, (uint8_t) 1, &byte_data ) ) == WWD_SUCCESS ) && - ( ( byte_data & SDIO_FUNC_READY_2 ) == 0 ) && - ( loop_count < (uint32_t) F2_READY_TIMEOUT_MS ) ) - { - (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); /* Ignore return - nothing can be done if it fails */ - loop_count++; - } - if ( loop_count >= (uint32_t) F2_READY_TIMEOUT_MS ) - { - /* If your system fails here, it could be due to incorrect NVRAM variables. - * Check which 'wifi_nvram_image.h' file your platform is using, and - * check that it matches the WLAN device on your platform, including the - * crystal frequency. - */ - WPRINT_WWD_ERROR(("Timeout while waiting for function 2 to be ready\n")); - /*@-unreachable@*/ /* Reachable after hitting assert */ - return WWD_TIMEOUT; - /*@+unreachable@*/ - } - - wwd_chip_specific_init(); - wwd_ensure_wlan_bus_is_up(); - - return result; -} - -wwd_result_t wwd_bus_deinit( void ) -{ - //wwd_allow_wlan_bus_to_sleep(); - - /* put device in reset. */ -// host_platform_reset_wifi( WICED_TRUE ); - - wwd_bus_set_resource_download_halt( WICED_FALSE ); - return WWD_SUCCESS; -} - -wwd_result_t wwd_bus_ack_interrupt(uint32_t intstatus) -{ - return wwd_bus_write_backplane_value( (uint32_t) SDIO_INT_STATUS, (uint8_t) 4, intstatus); -} - -uint32_t wwd_bus_packet_available_to_read(void) -{ - uint32_t int_status = 0; - - /* Ensure the wlan backplane bus is up */ - VERIFY_RESULT( wwd_ensure_wlan_bus_is_up() ); - - /* Read the IntStatus */ - if ( wwd_bus_read_backplane_value( (uint32_t) SDIO_INT_STATUS, (uint8_t) 4, (uint8_t*)&int_status ) != WWD_SUCCESS ) - { - } - - /* Clear any interrupts */ - if ( wwd_bus_write_backplane_value( (uint32_t) SDIO_INT_STATUS, (uint8_t) 4, int_status ) != WWD_SUCCESS ) - { - } - -#if defined(WICED_PLATFORM_MASKS_BUS_IRQ) - host_platform_unmask_sdio_interrupt(); -#endif - - return ((int_status) & (FRAME_AVAILABLE_MASK)); -} - -/* - * From internal documentation: hwnbu-twiki/SdioMessageEncapsulation - * When data is available on the device, the device will issue an interrupt: - * - the device should signal the interrupt as a hint that one or more data frames may be available on the device for reading - * - the host may issue reads of the 4 byte length tag at any time -- that is, whether an interupt has been issued or not - * - if a frame is available, the tag read should return a nonzero length (>= 4) and the host can then read the remainder of the frame by issuing one or more CMD53 reads - * - if a frame is not available, the 4byte tag read should return zero - */ -wwd_result_t wwd_bus_read_frame( /*@out@*/ wiced_buffer_t* buffer ) -{ - uint16_t hwtag[8]; - uint16_t extra_space_required; - wwd_result_t result; - - *buffer = NULL; - - /* Ensure the wlan backplane bus is up */ - VERIFY_RESULT( wwd_ensure_wlan_bus_is_up() ); - - /* Read the frame header and verify validity */ - memset( hwtag, 0, sizeof(hwtag) ); - - result = wwd_bus_sdio_transfer(BUS_READ, WLAN_FUNCTION, 0, (uint16_t) INITIAL_READ, (uint8_t*)hwtag, RESPONSE_NEEDED); - if ( result != WWD_SUCCESS ) - { - (void) wwd_bus_sdio_abort_read( WICED_FALSE ); /* ignore return - not much can be done if this fails */ - return WWD_SDIO_RX_FAIL; - } - - if ( ( ( hwtag[0] | hwtag[1] ) == 0 ) || - ( ( hwtag[0] ^ hwtag[1] ) != (uint16_t) 0xFFFF ) ) - { - return WWD_HWTAG_MISMATCH; - } - - if ( ( hwtag[0] == (uint16_t) 12 ) && - ( wwd_wlan_status.state == WLAN_UP) ) - { - result = wwd_bus_sdio_transfer(BUS_READ, WLAN_FUNCTION, 0, (uint16_t) 8, (uint8_t*) &hwtag[2], RESPONSE_NEEDED); - if ( result != WWD_SUCCESS ) - { - (void) wwd_bus_sdio_abort_read( WICED_FALSE ); /* ignore return - not much can be done if this fails */ - return WWD_SDIO_RX_FAIL; - } - wwd_sdpcm_update_credit((uint8_t*)hwtag); - return WWD_SUCCESS; - } - - /* Calculate the space we need to store entire packet */ - if ( ( hwtag[0] > (uint16_t) INITIAL_READ ) ) - { - extra_space_required = (uint16_t) ( hwtag[0] - (uint16_t) INITIAL_READ ); - } - else - { - extra_space_required = 0; - } - - /* Allocate a suitable buffer */ - result = host_buffer_get( buffer, WWD_NETWORK_RX, (unsigned short) ( (uint16_t) INITIAL_READ + extra_space_required + (uint16_t) sizeof(wwd_buffer_header_t) ), WICED_FALSE ); - if ( result != WWD_SUCCESS ) - { - /* Read out the first 12 bytes to get the bus credit information, 4 bytes are already read in hwtag */ - wiced_assert( "Get buffer error", ( ( result == WWD_BUFFER_UNAVAILABLE_TEMPORARY ) || ( result == WWD_BUFFER_UNAVAILABLE_PERMANENT ) ) ); - result = wwd_bus_sdio_transfer(BUS_READ, WLAN_FUNCTION, 0, (uint16_t) 8, (uint8_t*) &hwtag[2], RESPONSE_NEEDED); - if ( result != WWD_SUCCESS ) - { - (void) wwd_bus_sdio_abort_read( WICED_FALSE ); /* ignore return - not much can be done if this fails */ - return WWD_SDIO_RX_FAIL; - } - result = wwd_bus_sdio_abort_read( WICED_FALSE ); - wiced_assert( "Read-abort failed", result==WWD_SUCCESS ); - REFERENCE_DEBUG_ONLY_VARIABLE( result ); - - wwd_sdpcm_update_credit( (uint8_t *)hwtag ); - return WWD_RX_BUFFER_ALLOC_FAIL; - } - - /* Copy the data already read */ - memcpy( host_buffer_get_current_piece_data_pointer( *buffer ) + sizeof(wwd_buffer_header_t), hwtag, (size_t) INITIAL_READ ); - - /* Read the rest of the data */ - if ( extra_space_required > 0 ) - { - result = wwd_bus_sdio_transfer(BUS_READ, WLAN_FUNCTION, 0, extra_space_required, host_buffer_get_current_piece_data_pointer( *buffer ) + sizeof(wwd_buffer_header_t) + INITIAL_READ, RESPONSE_NEEDED); - if ( result != WWD_SUCCESS ) - { - (void) wwd_bus_sdio_abort_read( WICED_FALSE ); /* ignore return - not much can be done if this fails */ - host_buffer_release(*buffer, WWD_NETWORK_RX); - return WWD_SDIO_RX_FAIL; - } - } - - return WWD_SUCCESS; -} - - -/****************************************************** - * Function definitions for Protocol Common - ******************************************************/ - -/* Device register access functions */ -wwd_result_t wwd_bus_write_backplane_value( uint32_t address, uint8_t register_length, uint32_t value ) -{ - VERIFY_RESULT( wwd_bus_set_backplane_window( address ) ); - - VERIFY_RESULT( wwd_bus_sdio_transfer( BUS_WRITE, BACKPLANE_FUNCTION, address & 0x07FFF, register_length, (uint8_t*) &value, RESPONSE_NEEDED )); - - return wwd_bus_set_backplane_window( CHIPCOMMON_BASE_ADDRESS ); -} - -wwd_result_t wwd_bus_read_backplane_value( uint32_t address, uint8_t register_length, /*@out@*/ uint8_t* value ) -{ - *value = 0; - VERIFY_RESULT( wwd_bus_set_backplane_window( address ) ); - - VERIFY_RESULT( wwd_bus_sdio_transfer( BUS_READ, BACKPLANE_FUNCTION, address & 0x07FFF, register_length, value, RESPONSE_NEEDED )); - - return wwd_bus_set_backplane_window( CHIPCOMMON_BASE_ADDRESS ); -} - -wwd_result_t wwd_bus_write_register_value( wwd_bus_function_t function, uint32_t address, uint8_t value_length, uint32_t value ) -{ - return wwd_bus_sdio_transfer( BUS_WRITE, function, address, value_length, (uint8_t*) &value, RESPONSE_NEEDED ); -} - -wwd_result_t wwd_bus_transfer_bytes( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, uint16_t size, /*@in@*/ /*@out@*/ wwd_transfer_bytes_packet_t* data ) -{ - return wwd_bus_sdio_transfer( direction, function, address, size, (uint8_t*)data, RESPONSE_NEEDED ); -} - -/****************************************************** - * Static Function definitions - ******************************************************/ - -static wwd_result_t wwd_bus_sdio_transfer( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, uint16_t data_size, /*@in@*/ /*@out@*/ uint8_t* data, sdio_response_needed_t response_expected ) -{ - wwd_result_t result; - uint8_t retry_count = 0; - do - { - if ( data_size == (uint16_t) 1 ) - { - result = wwd_bus_sdio_cmd52( direction, function, address, *data, response_expected, data ); - } - else - { - result = wwd_bus_sdio_cmd53( direction, function, ( data_size > (uint16_t) 64 ) ? SDIO_BLOCK_MODE : SDIO_BYTE_MODE, address, data_size, data, response_expected, NULL ); - } - - if ( result != WWD_SUCCESS ) - { - return result; - } - - ++retry_count; - } while ( ( result != WWD_SUCCESS ) && ( retry_count < (uint8_t) BUS_PROTOCOL_LEVEL_MAX_RETRIES ) ); - - - return result; -} - -static wwd_result_t wwd_bus_sdio_cmd52( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, uint8_t value, sdio_response_needed_t response_expected, uint8_t* response ) -{ - uint32_t sdio_response; - wwd_result_t result; - sdio_cmd_argument_t arg; - arg.value = 0; - arg.cmd52.function_number = (unsigned int) ( function & BUS_FUNCTION_MASK ); - arg.cmd52.register_address = (unsigned int) ( address & 0x00001ffff ); - arg.cmd52.rw_flag = (unsigned int) ( ( direction == BUS_WRITE ) ? 1 : 0 ); - arg.cmd52.write_data = value; - result = host_platform_sdio_transfer( direction, SDIO_CMD_52, SDIO_BYTE_MODE, SDIO_1B_BLOCK, arg.value, 0, 0, response_expected, &sdio_response ); - if ( response != NULL ) - { - *response = (uint8_t) ( sdio_response & 0x00000000ff ); - } - return result; -} - -static wwd_result_t wwd_bus_sdio_cmd53( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, sdio_transfer_mode_t mode, uint32_t address, uint16_t data_size, /*@in@*/ /*@out@*/ uint8_t* data, sdio_response_needed_t response_expected, /*@null@*/ uint32_t* response ) -{ - sdio_cmd_argument_t arg; - wwd_result_t result; - - if ( direction == BUS_WRITE ) - { - add_log_entry(direction, function, address, data_size, data); - } - - arg.value = 0; - arg.cmd53.function_number = (unsigned int) ( function & BUS_FUNCTION_MASK ); - arg.cmd53.register_address = (unsigned int) ( address & 0x00001ffff ); - arg.cmd53.op_code = (unsigned int) 1; - arg.cmd53.rw_flag = (unsigned int) ( ( direction == BUS_WRITE ) ? 1 : 0 ); - if ( mode == SDIO_BYTE_MODE ) - { - wiced_assert( "wwd_bus_sdio_cmd53: data_size > 512 for byte mode", ( data_size <= (uint16_t) 512 ) ); - arg.cmd53.count = (unsigned int) ( data_size & 0x1FF ); - } - else - { - arg.cmd53.count = (unsigned int) ( ( data_size / (uint16_t)SDIO_64B_BLOCK ) & 0x0000001ff ); - if ( (uint32_t) ( arg.cmd53.count * (uint16_t)SDIO_64B_BLOCK ) < data_size ) - { - ++arg.cmd53.count; - } - arg.cmd53.block_mode = (unsigned int) 1; - } - - result = host_platform_sdio_transfer( direction, SDIO_CMD_53, mode, SDIO_64B_BLOCK, arg.value, (uint32_t*) data, data_size, response_expected, response ); - - if ( direction == BUS_READ ) - { - add_log_entry(direction, function, address, data_size, data); - } - - return result; -} - -static wwd_result_t wwd_bus_sdio_download_firmware( void ) -{ - uint8_t csr_val = 0; - wwd_result_t result; - uint32_t loop_count; - - VERIFY_RESULT( wwd_disable_device_core( WLAN_ARM_CORE, WLAN_CORE_FLAG_NONE ) ); - VERIFY_RESULT( wwd_disable_device_core( SOCRAM_CORE, WLAN_CORE_FLAG_NONE ) ); - VERIFY_RESULT( wwd_reset_device_core( SOCRAM_CORE, WLAN_CORE_FLAG_NONE ) ); - - VERIFY_RESULT( wwd_chip_specific_socsram_init( )); -#if 0 - /* 43362 specific: Remap JTAG pins to UART output */ - uint32_t data = 0; - VERIFY_RESULT( wwd_bus_write_backplane_value(0x18000650, 1, 1) ); - VERIFY_RESULT( wwd_bus_read_backplane_value(0x18000654, 4, (uint8_t*)&data) ); - data |= (1 << 24); - VERIFY_RESULT( wwd_bus_write_backplane_value(0x18000654, 4, data) ); -#endif - - -#ifdef MFG_TEST_ALTERNATE_WLAN_DOWNLOAD - VERIFY_RESULT( external_write_wifi_firmware_and_nvram_image( ) ); -#else - VERIFY_RESULT( wwd_bus_write_wifi_firmware_image( ) ); - VERIFY_RESULT( wwd_bus_write_wifi_nvram_image( ) ); -#endif /* ifdef MFG_TEST_ALTERNATE_WLAN_DOWNLOAD */ - - /* Take the ARM core out of reset */ - VERIFY_RESULT( wwd_reset_device_core( WLAN_ARM_CORE, WLAN_CORE_FLAG_NONE ) ); - - result = wwd_device_core_is_up( WLAN_ARM_CORE ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR(("Could not bring ARM core up\n")); - /*@-unreachable@*/ /* Reachable after hitting assert */ - return result; - /*@+unreachable@*/ - } - - /* Wait until the High Throughput clock is available */ - loop_count = 0; - while ( ( ( result = wwd_bus_read_register_value( BACKPLANE_FUNCTION, SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, &csr_val ) ) == WWD_SUCCESS ) && - ( ( csr_val & SBSDIO_HT_AVAIL ) == 0 ) && - ( loop_count < (uint32_t) HT_AVAIL_TIMEOUT_MS ) ) - { - (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); /* Ignore return - nothing can be done if it fails */ - loop_count++; - } - if ( loop_count >= (uint32_t) HT_AVAIL_TIMEOUT_MS ) - { - /* If your system times out here, it means that the WLAN firmware is not booting. - * Check that your WLAN chip matches the 'wifi_image.c' being built - in GNU toolchain, $(CHIP) - * makefile variable must be correct. - */ - WPRINT_WWD_ERROR(("Timeout while waiting for high throughput clock\n")); - /*@-unreachable@*/ /* Reachable after hitting assert */ - return WWD_TIMEOUT; - /*@+unreachable@*/ - } - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR(("Error while waiting for high throughput clock\n")); - /*@-unreachable@*/ /* Reachable after hitting assert */ - return result; - /*@+unreachable@*/ - } - - /* Set up the interrupt mask and enable interrupts */ - VERIFY_RESULT( wwd_bus_write_backplane_value( SDIO_INT_HOST_MASK, (uint8_t) 4, I_HMB_SW_MASK ) ); - - /* Enable F2 interrupts. This wasn't required for 4319 but is for the 43362 */ - VERIFY_RESULT( wwd_bus_write_backplane_value( SDIO_FUNCTION_INT_MASK, (uint8_t) 1, (uint32_t) 2) ); - - /* Lower F2 Watermark to avoid DMA Hang in F2 when SD Clock is stopped. */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_FUNCTION2_WATERMARK, (uint8_t) 1, (uint32_t) SDIO_F2_WATERMARK ) ); - - return WWD_SUCCESS; -} - -/** Aborts a SDIO read of a packet from the 802.11 device - * - * This function is necessary because the only way to obtain the size of the next - * available received packet is to read the first four bytes of the packet. - * If the system reads these four bytes, and then fails to allocate the required - * memory, then this function allows the system to abort the packet read cleanly, - * and to optionally tell the 802.11 device to keep it allowing reception once - * memory is available. - * - * In order to do this abort, the following actions are performed: - * - Sets abort bit for Function 2 (WLAN Data) to request stopping transfer - * - Sets Read Frame Termination bit to flush and reset fifos - * - If packet is to be kept and resent by 802.11 device, a NAK is sent - * - Wait whilst the Fifo is emptied of the packet ( reading during this period would cause all zeros to be read ) - * - * @param retry : WICED_TRUE if 802.11 device is to keep and resend packet - * WICED_FALSE if 802.11 device is to drop packet - * - * @return WWD_SUCCESS if successful, otherwise error code - */ -static wwd_result_t wwd_bus_sdio_abort_read( wiced_bool_t retry ) -{ - /* Abort transfer on WLAN_FUNCTION */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_IOABORT, (uint8_t) 1, (uint32_t) WLAN_FUNCTION ) ); - - /* Send frame terminate */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_FRAME_CONTROL, (uint8_t) 1, SFC_RF_TERM ) ); - - /* If we want to retry message, send NAK */ - if ( retry == WICED_TRUE ) - { - VERIFY_RESULT( wwd_bus_write_backplane_value( (uint32_t) SDIO_TO_SB_MAIL_BOX, (uint8_t) 1, SMB_NAK ) ); - } - - return WWD_SUCCESS; -} - -wwd_result_t wwd_bus_read_register_value( wwd_bus_function_t function, uint32_t address, uint8_t value_length, /*@out@*/ uint8_t* value ) -{ - memset( value, 0, (size_t) value_length ); - return wwd_bus_sdio_transfer( BUS_READ, function, address, value_length, value, RESPONSE_NEEDED ); -} - -wwd_result_t wwd_bus_poke_wlan( void ) -{ - /*TODO: change 1<<3 to a register hash define */ - return wwd_bus_write_backplane_value( SDIO_TO_SB_MAILBOX, (uint8_t) 4, (uint32_t)( 1 << 3 ) ); -} - -wwd_result_t wwd_bus_set_flow_control( uint8_t value ) -{ - if ( value != 0 ) - { - wwd_bus_flow_controlled = WICED_TRUE; - } - else - { - wwd_bus_flow_controlled = WICED_FALSE; - } - return WWD_SUCCESS; -} - -wiced_bool_t wwd_bus_is_flow_controlled( void ) -{ - return wwd_bus_flow_controlled; -} - -wwd_result_t wwd_bus_specific_wakeup( void ) -{ - return WWD_SUCCESS; -} - -wwd_result_t wwd_bus_specific_sleep( void ) -{ - return WWD_SUCCESS; -} - -#ifndef WICED_DISABLE_MCU_POWERSAVE -static wwd_result_t wwd_bus_sdio_set_oob_interrupt( uint8_t gpio_pin_number ) -{ - if ( gpio_pin_number == 1 ) - { - /* Redirect to OOB interrupt to GPIO1 */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_GPIO_SELECT, (uint8_t)1, (uint32_t) 0xF ) ); - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_GPIO_OUTPUT, (uint8_t)1, (uint32_t) 0x0 ) ); - - /* Enable GPIOx (bit x) */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_GPIO_ENABLE, (uint8_t)1, (uint32_t)0x2 ) ); - - /* Set GPIOx (bit x) on Chipcommon GPIO Control register */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, CHIPCOMMON_GPIO_CONTROL, (uint8_t)4, (uint32_t)0x2 ) ); - } - - return WWD_SUCCESS; -} -#endif diff --git a/components/WWD/WWD/internal/bus_protocols/SDIO/wwd_bus_protocol.h b/components/WWD/WWD/internal/bus_protocols/SDIO/wwd_bus_protocol.h deleted file mode 100644 index ed87d8168b7406e29bae30f14ae171dfd883d592..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/bus_protocols/SDIO/wwd_bus_protocol.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#ifndef INCLUDED_SDIO_WWD_BUS_PROTOCOL_H -#define INCLUDED_SDIO_WWD_BUS_PROTOCOL_H - -#include "wwd_buffer.h" -//#include "internal/wwd_thread_internal.h" -#include "platform/wwd_sdio_interface.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * Constants - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -#undef WWD_BUS_HAS_HEADER - -#define WWD_BUS_HEADER_SIZE ( 0 ) - -#define WWD_BUS_USE_STATUS_REPORT_SCHEME ( 1 ) - -#define WWD_BUS_MAX_BACKPLANE_TRANSFER_SIZE ( WICED_PAYLOAD_MTU ) -#define WWD_BUS_BACKPLANE_READ_PADD_SIZE ( 0 ) - -/****************************************************** - * Function declarations - ******************************************************/ - - -/****************************************************** - * Global variables - ******************************************************/ - -#ifdef __cplusplus -} /*extern "C" */ -#endif - -#endif /* ifndef INCLUDED_SDIO_WWD_BUS_PROTOCOL_H */ diff --git a/components/WWD/WWD/internal/bus_protocols/SDIO/wwd_bus_protocol_imxrt10xx.c b/components/WWD/WWD/internal/bus_protocols/SDIO/wwd_bus_protocol_imxrt10xx.c deleted file mode 100644 index 3eed5e9331f9507bcc23a7c7ad11b84b708a8699..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/bus_protocols/SDIO/wwd_bus_protocol_imxrt10xx.c +++ /dev/null @@ -1,865 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Broadcom WLAN SDIO Protocol interface - * - * Implements the WWD Bus Protocol Interface for SDIO - * Provides functions for initialising, de-intitialising 802.11 device, - * sending/receiving raw packets etc - */ - -#include -#include /* For memcpy */ -#include "wwd_assert.h" -#include "network/wwd_buffer_interface.h" -#include "wwd_rtos_interface.h" -#include "platform/wwd_platform_interface.h" -#include "chip_constants.h" -#include "wwd_internal.h" -#include "wwd_sdpcm.h" -#include "../internal/bus_protocols/wwd_bus_protocol_interface.h" - -//#include "wwd_bus_protocol.h" -//#include "wwd_internal.h" -/****************************************************** - * Constants - ******************************************************/ - -#define F0_WORKING_TIMEOUT_MS (500) -#define F1_AVAIL_TIMEOUT_MS (500) -#define F2_AVAIL_TIMEOUT_MS (500) -#define F2_READY_TIMEOUT_MS (1000) -#define ALP_AVAIL_TIMEOUT_MS (100) -#define HT_AVAIL_TIMEOUT_MS (500) -#define ABORT_TIMEOUT_MS (100) -/* Taken from FALCON_5_90_195_26 dhd/sys/dhd_sdio.c. */ -#define SDIO_F2_WATERMARK (8) - -#define INITIAL_READ 4 - -#define BUS_PROTOCOL_LEVEL_MAX_RETRIES 5 - -#define VERIFY_RESULT( x ) { wwd_result_t verify_result; verify_result = (x); if ( verify_result != WWD_SUCCESS ) { wiced_assert("command failed",0==1); return verify_result; } } - -#ifndef WWD_BUS_SDIO_RESET_DELAY -#define WWD_BUS_SDIO_RESET_DELAY (1) -#endif - -#ifndef WWD_BUS_SDIO_AFTER_RESET_DELAY -#define WWD_BUS_SDIO_AFTER_RESET_DELAY (1) -#endif - -/****************************************************** - * Structures - ******************************************************/ - -#pragma pack(1) -typedef struct -{ - unsigned char stuff_bits; - unsigned int ocr :24; -} sdio_cmd5_argument_t; - -typedef struct -{ - unsigned int _unique2 : 9; /* 0-8 */ - unsigned int register_address :17; /* 9-25 */ - unsigned int _unique : 2; /* 26-27 */ - unsigned int function_number : 3; /* 28-30 */ - unsigned int rw_flag : 1; /* 31 */ -} sdio_cmd5x_argument_t; - -typedef struct -{ - uint8_t write_data; /* 0 - 7 */ - unsigned int _stuff2 : 1; /* 8 */ - unsigned int register_address :17; /* 9-25 */ - unsigned int _stuff : 1; /* 26 */ - unsigned int raw_flag : 1; /* 27 */ - unsigned int function_number : 3; /* 28-30 */ - unsigned int rw_flag : 1; /* 31 */ -} wwd_bus_sdio_cmd52_argument_t; - -typedef struct -{ - unsigned int count : 9; /* 0-8 */ - unsigned int register_address :17; /* 9-25 */ - unsigned int op_code : 1; /* 26 */ - unsigned int block_mode : 1; /* 27 */ - unsigned int function_number : 3; /* 28-30 */ - unsigned int rw_flag : 1; /* 31 */ -} wwd_bus_sdio_cmd53_argument_t; - -typedef union -{ - uint32_t value; - sdio_cmd5_argument_t cmd5; - sdio_cmd5x_argument_t cmd5x; - wwd_bus_sdio_cmd52_argument_t cmd52; - wwd_bus_sdio_cmd53_argument_t cmd53; -} sdio_cmd_argument_t; - -typedef struct -{ - unsigned int ocr :24; /* 0-23 */ - unsigned int stuff_bits : 3; /* 24-26 */ - unsigned int memory_present : 1; /* 27 */ - unsigned int function_count : 3; /* 28-30 */ - unsigned int c : 1; /* 31 */ -} sdio_response4_t; - -typedef struct -{ - uint8_t data; /* 0-7 */ - uint8_t response_flags; /* 8-15 */ - uint16_t stuff; /* 16-31 */ -} sdio_response5_t; - -typedef struct -{ - uint16_t card_status; /* 0-15 */ - uint16_t rca; /* 16-31 */ -} sdio_response6_t; - -typedef union -{ - uint32_t value; - sdio_response4_t r4; - sdio_response5_t r5; - sdio_response6_t r6; -} sdio_response_t; - -#pragma pack() - -/****************************************************** - * Variables - ******************************************************/ - -static wiced_bool_t wwd_bus_flow_controlled = WICED_FALSE; - -/****************************************************** - * Static Function Declarations - ******************************************************/ - -static wwd_result_t wwd_bus_sdio_transfer ( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, uint16_t data_size, /*@in@*/ /*@out@*/ uint8_t* data, sdio_response_needed_t response_expected ); -static wwd_result_t wwd_bus_sdio_cmd52 ( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, uint8_t value, sdio_response_needed_t response_expected, /*@out@*/ uint8_t* response ); -static wwd_result_t wwd_bus_sdio_cmd53 ( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, sdio_transfer_mode_t mode, uint32_t address, uint16_t data_size, /*@in@*/ /*@out@*/ uint8_t* data, sdio_response_needed_t response_expected, /*@null@*/ /*@out@*/ uint32_t* response ); -static wwd_result_t wwd_bus_sdio_abort_read ( wiced_bool_t retry ); -static wwd_result_t wwd_bus_sdio_download_firmware ( void ); - -#ifndef WICED_DISABLE_MCU_POWERSAVE -static wwd_result_t wwd_bus_sdio_set_oob_interrupt ( uint8_t gpio_pin_number ); -#endif - -/****************************************************** - * SDIO Logging - * Enable this section for logging of SDIO transfers - * by changing "if 0" to "if 1" - ******************************************************/ -#if 0 - -#define SDIO_LOG_SIZE (110) -#define SDIO_LOG_HEADER_SIZE (0) /*(0x30) */ - -typedef struct sdio_log_entry_struct -{ - wwd_bus_transfer_direction_t direction; - wwd_bus_function_t function; - uint32_t address; - unsigned long time; - unsigned long length; -#if ( SDIO_LOG_HEADER_SIZE != 0 ) - unsigned char header[SDIO_LOG_HEADER_SIZE]; -#endif /* if ( SDIO_LOG_HEADER_SIZE != 0 ) */ -} sdio_log_entry_t; - -static int next_sdio_log_pos = 0; -static sdio_log_entry_t sdio_log_data[SDIO_LOG_SIZE]; - -static void add_log_entry( wwd_bus_transfer_direction_t dir, wwd_bus_function_t function, uint32_t address, unsigned long length, uint8_t* data ) -{ - sdio_log_data[next_sdio_log_pos].direction = dir; - sdio_log_data[next_sdio_log_pos].function = function; - sdio_log_data[next_sdio_log_pos].address = address; - sdio_log_data[next_sdio_log_pos].time = host_rtos_get_time(); - sdio_log_data[next_sdio_log_pos].length = length; -#if ( SDIO_LOG_HEADER_SIZE != 0 ) - memcpy( sdio_log_data[next_sdio_log_pos].header, data, (length>=SDIO_LOG_HEADER_SIZE)?SDIO_LOG_HEADER_SIZE:length ); -#else - UNUSED_PARAMETER(data); -#endif /* if ( SDIO_LOG_HEADER_SIZE != 0 ) */ - next_sdio_log_pos++; - if (next_sdio_log_pos >= SDIO_LOG_SIZE) - { - next_sdio_log_pos = 0; - } -} -#else /* #if 0 */ -#define add_log_entry( dir, function, address, length, data) -#endif /* #if 0 */ - - -/****************************************************** - * Global Function definitions - ******************************************************/ - -/* Device data transfer functions */ -wwd_result_t wwd_bus_send_buffer( wiced_buffer_t buffer ) -{ - wwd_result_t retval; - retval = wwd_bus_transfer_bytes( BUS_WRITE, WLAN_FUNCTION, 0, (uint16_t) ( host_buffer_get_current_piece_size( buffer ) - sizeof(wiced_buffer_t) ), (wwd_transfer_bytes_packet_t*)( host_buffer_get_current_piece_data_pointer( buffer ) + sizeof(wiced_buffer_t) ) ); - host_buffer_release( buffer, WWD_NETWORK_TX ); - return retval; -} - -#include "wwd_dev.h" -extern struct os_wwd_device *wwd_dev; - -wwd_result_t wwd_bus_init(void) -{ - uint8_t byte_data; - wwd_result_t result; - uint32_t loop_count; - - wwd_bus_flow_controlled = WICED_FALSE; - - wwd_bus_init_backplane_window( ); - - //host_platform_reset_wifi( WICED_TRUE ); - //host_platform_power_wifi( WICED_TRUE ); - //(void) host_rtos_delay_milliseconds( (uint32_t) WWD_BUS_SDIO_RESET_DELAY ); /* Ignore return - nothing can be done if it fails */ - //host_platform_reset_wifi( WICED_FALSE ); - //(void) host_rtos_delay_milliseconds( (uint32_t) WWD_BUS_SDIO_AFTER_RESET_DELAY ); /* Ignore return - nothing can be done if it fails */ - - //VERIFY_RESULT(host_platform_sdio_enumerate( )); - - /* Setup the backplane*/ - loop_count = 0; - do - { - /* Enable function 1 (backplane) */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_IOEN, (uint8_t) 1, SDIO_FUNC_ENABLE_1 ) ); - if (loop_count != 0) - { - (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); /* Ignore return - nothing can be done if it fails */ - } - VERIFY_RESULT( wwd_bus_read_register_value ( BUS_FUNCTION, SDIOD_CCCR_IOEN, (uint8_t) 1, &byte_data ) ); - loop_count++; - if ( loop_count >= (uint32_t) F0_WORKING_TIMEOUT_MS ) - { - return WWD_TIMEOUT; - } - } while (byte_data != (uint8_t) SDIO_FUNC_ENABLE_1); - -#ifndef SDIO_1_BIT - /* Read the bus width and set to 4 bits */ - VERIFY_RESULT( wwd_bus_read_register_value (BUS_FUNCTION, SDIOD_CCCR_BICTRL, (uint8_t) 1, &byte_data) ); - VERIFY_RESULT( wwd_bus_write_register_value(BUS_FUNCTION, SDIOD_CCCR_BICTRL, (uint8_t) 1, (byte_data & (~BUS_SD_DATA_WIDTH_MASK)) | BUS_SD_DATA_WIDTH_4BIT ) ); - /* NOTE: We don't need to change our local bus settings since we're not sending any data (only using CMD52) until after we change the bus speed further down */ - -#endif - /* Set the block size */ - - /* Wait till the backplane is ready */ - loop_count = 0; - while ( ( ( result = wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_BLKSIZE_0, (uint8_t) 1, (uint32_t) SDIO_64B_BLOCK ) ) == WWD_SUCCESS ) && - ( ( result = wwd_bus_read_register_value ( BUS_FUNCTION, SDIOD_CCCR_BLKSIZE_0, (uint8_t) 1, &byte_data ) ) == WWD_SUCCESS ) && - ( byte_data != (uint8_t) SDIO_64B_BLOCK ) && - ( loop_count < (uint32_t) F0_WORKING_TIMEOUT_MS ) ) - { - (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); /* Ignore return - nothing can be done if it fails */ - loop_count++; - if ( loop_count >= (uint32_t) F0_WORKING_TIMEOUT_MS ) - { - /* If the system fails here, check the high frequency crystal is working */ - WPRINT_WWD_ERROR(("Timeout while setting block size\n")); - return WWD_TIMEOUT; - } - } - - VERIFY_RESULT( result ); - - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_BLKSIZE_0, (uint8_t) 1, (uint32_t) SDIO_64B_BLOCK ) ); - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_F1BLKSIZE_0, (uint8_t) 1, (uint32_t) SDIO_64B_BLOCK ) ); - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_F2BLKSIZE_0, (uint8_t) 1, (uint32_t) SDIO_64B_BLOCK ) ); - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_F2BLKSIZE_1, (uint8_t) 1, (uint32_t) 0 ) ); /* Function 2 = 64 */ - - /* Enable/Disable Client interrupts */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_INTEN, (uint8_t) 1, INTR_CTL_MASTER_EN | INTR_CTL_FUNC1_EN | INTR_CTL_FUNC2_EN ) ); - - -#if 0 - /* This code is required if we want more than 25 MHz clock */ - VERIFY_RESULT( wwd_bus_sdio_read_register_value( BUS_FUNCTION, SDIOD_CCCR_SPEED_CONTROL, 1, &byte_data ) ); - if ( ( byte_data & 0x1 ) != 0 ) - { - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_SPEED_CONTROL, 1, byte_data | SDIO_SPEED_EHS ) ); - } - else - { - return WWD_BUS_READ_REGISTER_ERROR; - } -#endif /* HIGH_SPEED_SDIO_CLOCK */ - - /* ?D??SDIO¨º¡À?¨®?a???¨´?¡ê¨º?¡ê?4bit?¡ê¨º? */ - host_platform_enable_high_speed_sdio( ); - - /* Wait till the backplane is ready */ - loop_count = 0; - while ( ( ( result = wwd_bus_read_register_value( BUS_FUNCTION, SDIOD_CCCR_IORDY, (uint8_t) 1, &byte_data ) ) == WWD_SUCCESS ) && - ( ( byte_data & SDIO_FUNC_READY_1 ) == 0 ) && - ( loop_count < (uint32_t) F1_AVAIL_TIMEOUT_MS ) ) - { - (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); /* Ignore return - nothing can be done if it fails */ - loop_count++; - } - if ( loop_count >= (uint32_t) F1_AVAIL_TIMEOUT_MS ) - { - WPRINT_WWD_ERROR(("Timeout while waiting for backplane to be ready\n")); - return WWD_TIMEOUT; - } - VERIFY_RESULT( result ); - - /* Set the ALP */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, (uint32_t)( SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_ALP_AVAIL_REQ | SBSDIO_FORCE_ALP ) ) ); - - loop_count = 0; - while ( ( ( result = wwd_bus_read_register_value( BACKPLANE_FUNCTION, SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, &byte_data ) ) == WWD_SUCCESS ) && - ( ( byte_data & SBSDIO_ALP_AVAIL ) == 0 ) && - ( loop_count < (uint32_t) ALP_AVAIL_TIMEOUT_MS ) ) - { - (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); /* Ignore return - nothing can be done if it fails */ - loop_count++; - } - if ( loop_count >= (uint32_t) ALP_AVAIL_TIMEOUT_MS ) - { - WPRINT_WWD_ERROR(("Timeout while waiting for alp clock\n")); - return WWD_TIMEOUT; - } - VERIFY_RESULT( result ); - - /* Clear request for ALP */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, 0 ) ); - - /* Disable the extra SDIO pull-ups */ -#ifndef WWD_BUS_SDIO_USE_WLAN_SDIO_PULLUPS - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_PULL_UP, (uint8_t) 1, 0 ) ); -#endif - - /* Enable F1 and F2 */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_IOEN, (uint8_t) 1, SDIO_FUNC_ENABLE_1 | SDIO_FUNC_ENABLE_2 ) ); - -#ifndef WICED_DISABLE_MCU_POWERSAVE - /* Enable out-of-band interrupt */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_SEP_INT_CTL, (uint8_t) 1, SEP_INTR_CTL_MASK | SEP_INTR_CTL_EN | SEP_INTR_CTL_POL ) ); - - /* Set OOB interrupt to the correct WLAN GPIO pin */ - VERIFY_RESULT( wwd_bus_sdio_set_oob_interrupt( host_platform_get_oob_interrupt_pin( ) ) ); - - VERIFY_RESULT( host_enable_oob_interrupt( ) ); -#endif /* ifndef WICED_DISABLE_MCU_POWERSAVE */ - - /* Enable F2 interrupt only */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_INTEN, (uint8_t) 1, INTR_CTL_MASTER_EN | INTR_CTL_FUNC2_EN ) ); - - VERIFY_RESULT( wwd_bus_read_register_value( BUS_FUNCTION, SDIOD_CCCR_IORDY, (uint8_t) 1, &byte_data ) ); - - VERIFY_RESULT( wwd_bus_sdio_download_firmware( ) ); - - /* Wait for F2 to be ready */ - loop_count = 0; - while ( ( ( result = wwd_bus_read_register_value( BUS_FUNCTION, SDIOD_CCCR_IORDY, (uint8_t) 1, &byte_data ) ) == WWD_SUCCESS ) && - ( ( byte_data & SDIO_FUNC_READY_2 ) == 0 ) && - ( loop_count < (uint32_t) F2_READY_TIMEOUT_MS ) ) - { - (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); /* Ignore return - nothing can be done if it fails */ - loop_count++; - } - if ( loop_count >= (uint32_t) F2_READY_TIMEOUT_MS ) - { - /* If your system fails here, it could be due to incorrect NVRAM variables. - * Check which 'wifi_nvram_image.h' file your platform is using, and - * check that it matches the WLAN device on your platform, including the - * crystal frequency. - */ - WPRINT_WWD_ERROR(("Timeout while waiting for function 2 to be ready\n")); - /*@-unreachable@*/ /* Reachable after hitting assert */ - return WWD_TIMEOUT; - /*@+unreachable@*/ - } - - wwd_chip_specific_init(); - wwd_ensure_wlan_bus_is_up(); - - return result; -} - -wwd_result_t wwd_bus_deinit( void ) -{ - //wwd_allow_wlan_bus_to_sleep(); - - /* put device in reset. */ -// host_platform_reset_wifi( WICED_TRUE ); - - wwd_bus_set_resource_download_halt( WICED_FALSE ); - return WWD_SUCCESS; -} - -wwd_result_t wwd_bus_ack_interrupt(uint32_t intstatus) -{ - return wwd_bus_write_backplane_value( (uint32_t) SDIO_INT_STATUS, (uint8_t) 4, intstatus); -} - -uint32_t wwd_bus_packet_available_to_read(void) -{ - uint32_t int_status = 0; - - /* Ensure the wlan backplane bus is up */ - VERIFY_RESULT( wwd_ensure_wlan_bus_is_up() ); - - /* Read the IntStatus */ - if ( wwd_bus_read_backplane_value( (uint32_t) SDIO_INT_STATUS, (uint8_t) 4, (uint8_t*)&int_status ) != WWD_SUCCESS ) - { - } - - /* Clear any interrupts */ - if ( wwd_bus_write_backplane_value( (uint32_t) SDIO_INT_STATUS, (uint8_t) 4, int_status ) != WWD_SUCCESS ) - { - } - -#if defined(WICED_PLATFORM_MASKS_BUS_IRQ) - host_platform_unmask_sdio_interrupt(); -#endif - - return ((int_status) & (FRAME_AVAILABLE_MASK)); -} - -/* - * From internal documentation: hwnbu-twiki/SdioMessageEncapsulation - * When data is available on the device, the device will issue an interrupt: - * - the device should signal the interrupt as a hint that one or more data frames may be available on the device for reading - * - the host may issue reads of the 4 byte length tag at any time -- that is, whether an interupt has been issued or not - * - if a frame is available, the tag read should return a nonzero length (>= 4) and the host can then read the remainder of the frame by issuing one or more CMD53 reads - * - if a frame is not available, the 4byte tag read should return zero - */ -wwd_result_t wwd_bus_read_frame( /*@out@*/ wiced_buffer_t* buffer ) -{ - uint16_t hwtag[8]; - uint16_t extra_space_required; - wwd_result_t result; - - *buffer = NULL; - - /* Ensure the wlan backplane bus is up */ - VERIFY_RESULT( wwd_ensure_wlan_bus_is_up() ); - - /* Read the frame header and verify validity */ - memset( hwtag, 0, sizeof(hwtag) ); - - result = wwd_bus_sdio_transfer(BUS_READ, WLAN_FUNCTION, 0, (uint16_t) INITIAL_READ, (uint8_t*)hwtag, RESPONSE_NEEDED); - if ( result != WWD_SUCCESS ) - { - (void) wwd_bus_sdio_abort_read( WICED_FALSE ); /* ignore return - not much can be done if this fails */ - return WWD_SDIO_RX_FAIL; - } - - if ( ( ( hwtag[0] | hwtag[1] ) == 0 ) || - ( ( hwtag[0] ^ hwtag[1] ) != (uint16_t) 0xFFFF ) ) - { - return WWD_HWTAG_MISMATCH; - } - - if ( ( hwtag[0] == (uint16_t) 12 ) && - ( wwd_wlan_status.state == WLAN_UP) ) - { - result = wwd_bus_sdio_transfer(BUS_READ, WLAN_FUNCTION, 0, (uint16_t) 8, (uint8_t*) &hwtag[2], RESPONSE_NEEDED); - if ( result != WWD_SUCCESS ) - { - (void) wwd_bus_sdio_abort_read( WICED_FALSE ); /* ignore return - not much can be done if this fails */ - return WWD_SDIO_RX_FAIL; - } - wwd_sdpcm_update_credit((uint8_t*)hwtag); - return WWD_SUCCESS; - } - - /* Calculate the space we need to store entire packet */ - if ( ( hwtag[0] > (uint16_t) INITIAL_READ ) ) - { - extra_space_required = (uint16_t) ( hwtag[0] - (uint16_t) INITIAL_READ ); - } - else - { - extra_space_required = 0; - } - - /* Allocate a suitable buffer */ - result = host_buffer_get( buffer, WWD_NETWORK_RX, (unsigned short) ( (uint16_t) INITIAL_READ + extra_space_required + (uint16_t) sizeof(wwd_buffer_header_t) ), WICED_FALSE ); - if ( result != WWD_SUCCESS ) - { - /* Read out the first 12 bytes to get the bus credit information, 4 bytes are already read in hwtag */ - wiced_assert( "Get buffer error", ( ( result == WWD_BUFFER_UNAVAILABLE_TEMPORARY ) || ( result == WWD_BUFFER_UNAVAILABLE_PERMANENT ) ) ); - result = wwd_bus_sdio_transfer(BUS_READ, WLAN_FUNCTION, 0, (uint16_t) 8, (uint8_t*) &hwtag[2], RESPONSE_NEEDED); - if ( result != WWD_SUCCESS ) - { - (void) wwd_bus_sdio_abort_read( WICED_FALSE ); /* ignore return - not much can be done if this fails */ - return WWD_SDIO_RX_FAIL; - } - result = wwd_bus_sdio_abort_read( WICED_FALSE ); - wiced_assert( "Read-abort failed", result==WWD_SUCCESS ); - REFERENCE_DEBUG_ONLY_VARIABLE( result ); - - wwd_sdpcm_update_credit( (uint8_t *)hwtag ); - return WWD_RX_BUFFER_ALLOC_FAIL; - } - - /* Copy the data already read */ - memcpy( host_buffer_get_current_piece_data_pointer( *buffer ) + sizeof(wwd_buffer_header_t), hwtag, (size_t) INITIAL_READ ); - - /* Read the rest of the data */ - if ( extra_space_required > 0 ) - { - result = wwd_bus_sdio_transfer(BUS_READ, WLAN_FUNCTION, 0, extra_space_required, host_buffer_get_current_piece_data_pointer( *buffer ) + sizeof(wwd_buffer_header_t) + INITIAL_READ, RESPONSE_NEEDED); - if ( result != WWD_SUCCESS ) - { - (void) wwd_bus_sdio_abort_read( WICED_FALSE ); /* ignore return - not much can be done if this fails */ - host_buffer_release(*buffer, WWD_NETWORK_RX); - return WWD_SDIO_RX_FAIL; - } - } - - return WWD_SUCCESS; -} - - -/****************************************************** - * Function definitions for Protocol Common - ******************************************************/ - -/* Device register access functions */ -wwd_result_t wwd_bus_write_backplane_value( uint32_t address, uint8_t register_length, uint32_t value ) -{ - VERIFY_RESULT( wwd_bus_set_backplane_window( address ) ); - - VERIFY_RESULT( wwd_bus_sdio_transfer( BUS_WRITE, BACKPLANE_FUNCTION, address & 0x07FFF, register_length, (uint8_t*) &value, RESPONSE_NEEDED )); - - return wwd_bus_set_backplane_window( CHIPCOMMON_BASE_ADDRESS ); -} - -wwd_result_t wwd_bus_read_backplane_value( uint32_t address, uint8_t register_length, /*@out@*/ uint8_t* value ) -{ - *value = 0; - VERIFY_RESULT( wwd_bus_set_backplane_window( address ) ); - - VERIFY_RESULT( wwd_bus_sdio_transfer( BUS_READ, BACKPLANE_FUNCTION, address & 0x07FFF, register_length, value, RESPONSE_NEEDED )); - - return wwd_bus_set_backplane_window( CHIPCOMMON_BASE_ADDRESS ); -} - -wwd_result_t wwd_bus_write_register_value( wwd_bus_function_t function, uint32_t address, uint8_t value_length, uint32_t value ) -{ - return wwd_bus_sdio_transfer( BUS_WRITE, function, address, value_length, (uint8_t*) &value, RESPONSE_NEEDED ); -} - -wwd_result_t wwd_bus_transfer_bytes( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, uint16_t size, /*@in@*/ /*@out@*/ wwd_transfer_bytes_packet_t* data ) -{ - return wwd_bus_sdio_transfer( direction, function, address, size, (uint8_t*)data, RESPONSE_NEEDED ); -} - -#include - -wwd_result_t wwd_bus_sdio_transfer( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, uint16_t data_size, /*@in@*/ /*@out@*/ uint8_t* data, sdio_response_needed_t response_expected ) -{ - wwd_result_t result; - uint8_t retry_count = 0; - do - { - if ( data_size == (uint16_t) 1 ) - { - result = wwd_bus_sdio_cmd52( direction, function, address, *data, response_expected, data ); - } - else - { - uint16_t data_index = 0; - uint16_t left_size = data_size; - - while (left_size > 0) - { - int size = min(left_size, 512); - - void *_data = data + data_index; - - if (direction == BUS_READ) - { - _data = os_malloc(size + 512); - if (_data == OS_NULL) - return WWD_IOCTL_FAIL; - } - - result = wwd_bus_sdio_cmd53( direction, function, ( size > (uint16_t) 512 ) ? SDIO_BLOCK_MODE : SDIO_BYTE_MODE, address, size, _data, response_expected, NULL ); - - if (direction == BUS_READ) - { - memcpy(data + data_index, _data, size); - os_free(_data); - } - - left_size -= size; - data_index += size; - } - } - - if ( result != WWD_SUCCESS ) - { - return result; - } - - ++retry_count; - } while ( ( result != WWD_SUCCESS ) && ( retry_count < (uint8_t) BUS_PROTOCOL_LEVEL_MAX_RETRIES ) ); - - - return result; -} - -static wwd_result_t wwd_bus_sdio_cmd52( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, uint8_t value, sdio_response_needed_t response_expected, uint8_t* response ) -{ - uint32_t sdio_response; - wwd_result_t result; - sdio_cmd_argument_t arg; - arg.value = 0; - arg.cmd52.function_number = (unsigned int) ( function & BUS_FUNCTION_MASK ); - arg.cmd52.register_address = (unsigned int) ( address & 0x00001ffff ); - arg.cmd52.rw_flag = (unsigned int) ( ( direction == BUS_WRITE ) ? 1 : 0 ); - arg.cmd52.write_data = value; - result = host_platform_sdio_transfer( direction, SDIO_CMD_52, SDIO_BYTE_MODE, SDIO_1B_BLOCK, arg.value, 0, 0, response_expected, &sdio_response ); - if ( response != NULL ) - { - *response = (uint8_t) ( sdio_response & 0x00000000ff ); - } - return result; -} - -static wwd_result_t wwd_bus_sdio_cmd53( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, sdio_transfer_mode_t mode, uint32_t address, uint16_t data_size, /*@in@*/ /*@out@*/ uint8_t* data, sdio_response_needed_t response_expected, /*@null@*/ uint32_t* response ) -{ - sdio_cmd_argument_t arg; - wwd_result_t result; - - if ( direction == BUS_WRITE ) - { - add_log_entry(direction, function, address, data_size, data); - } - - arg.value = 0; - arg.cmd53.function_number = (unsigned int) ( function & BUS_FUNCTION_MASK ); - arg.cmd53.register_address = (unsigned int) ( address & 0x00001ffff ); - arg.cmd53.op_code = (unsigned int) 1; - arg.cmd53.rw_flag = (unsigned int) ( ( direction == BUS_WRITE ) ? 1 : 0 ); - if ( mode == SDIO_BYTE_MODE ) - { - wiced_assert( "wwd_bus_sdio_cmd53: data_size > 512 for byte mode", ( data_size <= (uint16_t) 512 ) ); - arg.cmd53.count = (unsigned int) ( data_size & 0x1FF ); - } - else - { - arg.cmd53.count = (unsigned int) ( ( data_size / (uint16_t)SDIO_512B_BLOCK ) & 0x0000001ff ); - if ( (uint32_t) ( arg.cmd53.count * (uint16_t)SDIO_512B_BLOCK ) < data_size ) - { - ++arg.cmd53.count; - } - arg.cmd53.block_mode = (unsigned int) 1; - } - - result = host_platform_sdio_transfer( direction, SDIO_CMD_53, mode, SDIO_512B_BLOCK, arg.value, (uint32_t*) data, data_size, response_expected, response ); - - if ( direction == BUS_READ ) - { - add_log_entry(direction, function, address, data_size, data); - } - - return result; -} - -static wwd_result_t wwd_bus_sdio_download_firmware( void ) -{ - uint8_t csr_val = 0; - wwd_result_t result; - uint32_t loop_count; - - VERIFY_RESULT( wwd_disable_device_core( WLAN_ARM_CORE, WLAN_CORE_FLAG_NONE ) ); - VERIFY_RESULT( wwd_disable_device_core( SOCRAM_CORE, WLAN_CORE_FLAG_NONE ) ); - VERIFY_RESULT( wwd_reset_device_core( SOCRAM_CORE, WLAN_CORE_FLAG_NONE ) ); - - VERIFY_RESULT( wwd_chip_specific_socsram_init( )); -#if 0 - /* 43362 specific: Remap JTAG pins to UART output */ - uint32_t data = 0; - VERIFY_RESULT( wwd_bus_write_backplane_value(0x18000650, 1, 1) ); - VERIFY_RESULT( wwd_bus_read_backplane_value(0x18000654, 4, (uint8_t*)&data) ); - data |= (1 << 24); - VERIFY_RESULT( wwd_bus_write_backplane_value(0x18000654, 4, data) ); -#endif - - -#ifdef MFG_TEST_ALTERNATE_WLAN_DOWNLOAD - VERIFY_RESULT( external_write_wifi_firmware_and_nvram_image( ) ); -#else - VERIFY_RESULT( wwd_bus_write_wifi_firmware_image( ) ); - VERIFY_RESULT( wwd_bus_write_wifi_nvram_image( ) ); -#endif /* ifdef MFG_TEST_ALTERNATE_WLAN_DOWNLOAD */ - - /* Take the ARM core out of reset */ - VERIFY_RESULT( wwd_reset_device_core( WLAN_ARM_CORE, WLAN_CORE_FLAG_NONE ) ); - - result = wwd_device_core_is_up( WLAN_ARM_CORE ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR(("Could not bring ARM core up\n")); - /*@-unreachable@*/ /* Reachable after hitting assert */ - return result; - /*@+unreachable@*/ - } - - /* Wait until the High Throughput clock is available */ - loop_count = 0; - while ( ( ( result = wwd_bus_read_register_value( BACKPLANE_FUNCTION, SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, &csr_val ) ) == WWD_SUCCESS ) && - ( ( csr_val & SBSDIO_HT_AVAIL ) == 0 ) && - ( loop_count < (uint32_t) HT_AVAIL_TIMEOUT_MS ) ) - { - (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); /* Ignore return - nothing can be done if it fails */ - loop_count++; - } - if ( loop_count >= (uint32_t) HT_AVAIL_TIMEOUT_MS ) - { - /* If your system times out here, it means that the WLAN firmware is not booting. - * Check that your WLAN chip matches the 'wifi_image.c' being built - in GNU toolchain, $(CHIP) - * makefile variable must be correct. - */ - WPRINT_WWD_ERROR(("Timeout while waiting for high throughput clock\n")); - /*@-unreachable@*/ /* Reachable after hitting assert */ - return WWD_TIMEOUT; - /*@+unreachable@*/ - } - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR(("Error while waiting for high throughput clock\n")); - /*@-unreachable@*/ /* Reachable after hitting assert */ - return result; - /*@+unreachable@*/ - } - - /* Set up the interrupt mask and enable interrupts */ - VERIFY_RESULT( wwd_bus_write_backplane_value( SDIO_INT_HOST_MASK, (uint8_t) 4, I_HMB_SW_MASK ) ); - - /* Enable F2 interrupts. This wasn't required for 4319 but is for the 43362 */ - VERIFY_RESULT( wwd_bus_write_backplane_value( SDIO_FUNCTION_INT_MASK, (uint8_t) 1, (uint32_t) 2) ); - - /* Lower F2 Watermark to avoid DMA Hang in F2 when SD Clock is stopped. */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_FUNCTION2_WATERMARK, (uint8_t) 1, (uint32_t) SDIO_F2_WATERMARK ) ); - - return WWD_SUCCESS; -} - -/** Aborts a SDIO read of a packet from the 802.11 device - * - * This function is necessary because the only way to obtain the size of the next - * available received packet is to read the first four bytes of the packet. - * If the system reads these four bytes, and then fails to allocate the required - * memory, then this function allows the system to abort the packet read cleanly, - * and to optionally tell the 802.11 device to keep it allowing reception once - * memory is available. - * - * In order to do this abort, the following actions are performed: - * - Sets abort bit for Function 2 (WLAN Data) to request stopping transfer - * - Sets Read Frame Termination bit to flush and reset fifos - * - If packet is to be kept and resent by 802.11 device, a NAK is sent - * - Wait whilst the Fifo is emptied of the packet ( reading during this period would cause all zeros to be read ) - * - * @param retry : WICED_TRUE if 802.11 device is to keep and resend packet - * WICED_FALSE if 802.11 device is to drop packet - * - * @return WWD_SUCCESS if successful, otherwise error code - */ -static wwd_result_t wwd_bus_sdio_abort_read( wiced_bool_t retry ) -{ - /* Abort transfer on WLAN_FUNCTION */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_IOABORT, (uint8_t) 1, (uint32_t) WLAN_FUNCTION ) ); - - /* Send frame terminate */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_FRAME_CONTROL, (uint8_t) 1, SFC_RF_TERM ) ); - - /* If we want to retry message, send NAK */ - if ( retry == WICED_TRUE ) - { - VERIFY_RESULT( wwd_bus_write_backplane_value( (uint32_t) SDIO_TO_SB_MAIL_BOX, (uint8_t) 1, SMB_NAK ) ); - } - - return WWD_SUCCESS; -} - -wwd_result_t wwd_bus_read_register_value( wwd_bus_function_t function, uint32_t address, uint8_t value_length, /*@out@*/ uint8_t* value ) -{ - memset( value, 0, (size_t) value_length ); - return wwd_bus_sdio_transfer( BUS_READ, function, address, value_length, value, RESPONSE_NEEDED ); -} - -wwd_result_t wwd_bus_poke_wlan( void ) -{ - /*TODO: change 1<<3 to a register hash define */ - return wwd_bus_write_backplane_value( SDIO_TO_SB_MAILBOX, (uint8_t) 4, (uint32_t)( 1 << 3 ) ); -} - -wwd_result_t wwd_bus_set_flow_control( uint8_t value ) -{ - if ( value != 0 ) - { - wwd_bus_flow_controlled = WICED_TRUE; - } - else - { - wwd_bus_flow_controlled = WICED_FALSE; - } - return WWD_SUCCESS; -} - -wiced_bool_t wwd_bus_is_flow_controlled( void ) -{ - return wwd_bus_flow_controlled; -} - -wwd_result_t wwd_bus_specific_wakeup( void ) -{ - return WWD_SUCCESS; -} - -wwd_result_t wwd_bus_specific_sleep( void ) -{ - return WWD_SUCCESS; -} - -#ifndef WICED_DISABLE_MCU_POWERSAVE -static wwd_result_t wwd_bus_sdio_set_oob_interrupt( uint8_t gpio_pin_number ) -{ - if ( gpio_pin_number == 1 ) - { - /* Redirect to OOB interrupt to GPIO1 */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_GPIO_SELECT, (uint8_t)1, (uint32_t) 0xF ) ); - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_GPIO_OUTPUT, (uint8_t)1, (uint32_t) 0x0 ) ); - - /* Enable GPIOx (bit x) */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_GPIO_ENABLE, (uint8_t)1, (uint32_t)0x2 ) ); - - /* Set GPIOx (bit x) on Chipcommon GPIO Control register */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, CHIPCOMMON_GPIO_CONTROL, (uint8_t)4, (uint32_t)0x2 ) ); - } - - return WWD_SUCCESS; -} -#endif - diff --git a/components/WWD/WWD/internal/bus_protocols/SDIO/wwd_bus_protocol_stm32.c b/components/WWD/WWD/internal/bus_protocols/SDIO/wwd_bus_protocol_stm32.c deleted file mode 100644 index a63208550400523037f10dbfdb60b6b25e689a9e..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/bus_protocols/SDIO/wwd_bus_protocol_stm32.c +++ /dev/null @@ -1,867 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Broadcom WLAN SDIO Protocol interface - * - * Implements the WWD Bus Protocol Interface for SDIO - * Provides functions for initialising, de-intitialising 802.11 device, - * sending/receiving raw packets etc - */ - -#include -#include /* For memcpy */ -#include "wwd_assert.h" -#include "network/wwd_buffer_interface.h" -#include "wwd_rtos_interface.h" -#include "platform/wwd_platform_interface.h" -#include "chip_constants.h" -#include "wwd_internal.h" -#include "wwd_sdpcm.h" -#include "../internal/bus_protocols/wwd_bus_protocol_interface.h" - -//#include "wwd_bus_protocol.h" -//#include "wwd_internal.h" -/****************************************************** - * Constants - ******************************************************/ - -#define F0_WORKING_TIMEOUT_MS (500) -#define F1_AVAIL_TIMEOUT_MS (500) -#define F2_AVAIL_TIMEOUT_MS (500) -#define F2_READY_TIMEOUT_MS (1000) -#define ALP_AVAIL_TIMEOUT_MS (100) -#define HT_AVAIL_TIMEOUT_MS (500) -#define ABORT_TIMEOUT_MS (100) -/* Taken from FALCON_5_90_195_26 dhd/sys/dhd_sdio.c. */ -#define SDIO_F2_WATERMARK (8) - -#define INITIAL_READ 4 - -#define BUS_PROTOCOL_LEVEL_MAX_RETRIES 5 - -#define VERIFY_RESULT( x ) { wwd_result_t verify_result; verify_result = (x); if ( verify_result != WWD_SUCCESS ) { wiced_assert("command failed",0==1); return verify_result; } } - -#ifndef WWD_BUS_SDIO_RESET_DELAY -#define WWD_BUS_SDIO_RESET_DELAY (1) -#endif - -#ifndef WWD_BUS_SDIO_AFTER_RESET_DELAY -#define WWD_BUS_SDIO_AFTER_RESET_DELAY (1) -#endif - -/****************************************************** - * Structures - ******************************************************/ - -#pragma pack(1) -typedef struct -{ - unsigned char stuff_bits; - unsigned int ocr :24; -} sdio_cmd5_argument_t; - -typedef struct -{ - unsigned int _unique2 : 9; /* 0-8 */ - unsigned int register_address :17; /* 9-25 */ - unsigned int _unique : 2; /* 26-27 */ - unsigned int function_number : 3; /* 28-30 */ - unsigned int rw_flag : 1; /* 31 */ -} sdio_cmd5x_argument_t; - -typedef struct -{ - uint8_t write_data; /* 0 - 7 */ - unsigned int _stuff2 : 1; /* 8 */ - unsigned int register_address :17; /* 9-25 */ - unsigned int _stuff : 1; /* 26 */ - unsigned int raw_flag : 1; /* 27 */ - unsigned int function_number : 3; /* 28-30 */ - unsigned int rw_flag : 1; /* 31 */ -} wwd_bus_sdio_cmd52_argument_t; - -typedef struct -{ - unsigned int count : 9; /* 0-8 */ - unsigned int register_address :17; /* 9-25 */ - unsigned int op_code : 1; /* 26 */ - unsigned int block_mode : 1; /* 27 */ - unsigned int function_number : 3; /* 28-30 */ - unsigned int rw_flag : 1; /* 31 */ -} wwd_bus_sdio_cmd53_argument_t; - -typedef union -{ - uint32_t value; - sdio_cmd5_argument_t cmd5; - sdio_cmd5x_argument_t cmd5x; - wwd_bus_sdio_cmd52_argument_t cmd52; - wwd_bus_sdio_cmd53_argument_t cmd53; -} sdio_cmd_argument_t; - -typedef struct -{ - unsigned int ocr :24; /* 0-23 */ - unsigned int stuff_bits : 3; /* 24-26 */ - unsigned int memory_present : 1; /* 27 */ - unsigned int function_count : 3; /* 28-30 */ - unsigned int c : 1; /* 31 */ -} sdio_response4_t; - -typedef struct -{ - uint8_t data; /* 0-7 */ - uint8_t response_flags; /* 8-15 */ - uint16_t stuff; /* 16-31 */ -} sdio_response5_t; - -typedef struct -{ - uint16_t card_status; /* 0-15 */ - uint16_t rca; /* 16-31 */ -} sdio_response6_t; - -typedef union -{ - uint32_t value; - sdio_response4_t r4; - sdio_response5_t r5; - sdio_response6_t r6; -} sdio_response_t; - -#pragma pack() - -/****************************************************** - * Variables - ******************************************************/ - -static wiced_bool_t wwd_bus_flow_controlled = WICED_FALSE; - -/****************************************************** - * Static Function Declarations - ******************************************************/ - -static wwd_result_t wwd_bus_sdio_transfer ( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, uint16_t data_size, /*@in@*/ /*@out@*/ uint8_t* data, sdio_response_needed_t response_expected ); -static wwd_result_t wwd_bus_sdio_cmd52 ( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, uint8_t value, sdio_response_needed_t response_expected, /*@out@*/ uint8_t* response ); -static wwd_result_t wwd_bus_sdio_cmd53 ( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, sdio_transfer_mode_t mode, uint32_t address, uint16_t data_size, /*@in@*/ /*@out@*/ uint8_t* data, sdio_response_needed_t response_expected, /*@null@*/ /*@out@*/ uint32_t* response ); -static wwd_result_t wwd_bus_sdio_abort_read ( wiced_bool_t retry ); -static wwd_result_t wwd_bus_sdio_download_firmware ( void ); - -#ifndef WICED_DISABLE_MCU_POWERSAVE -static wwd_result_t wwd_bus_sdio_set_oob_interrupt ( uint8_t gpio_pin_number ); -#endif - -/****************************************************** - * SDIO Logging - * Enable this section for logging of SDIO transfers - * by changing "if 0" to "if 1" - ******************************************************/ -#if 0 - -#define SDIO_LOG_SIZE (110) -#define SDIO_LOG_HEADER_SIZE (0) /*(0x30) */ - -typedef struct sdio_log_entry_struct -{ - wwd_bus_transfer_direction_t direction; - wwd_bus_function_t function; - uint32_t address; - unsigned long time; - unsigned long length; -#if ( SDIO_LOG_HEADER_SIZE != 0 ) - unsigned char header[SDIO_LOG_HEADER_SIZE]; -#endif /* if ( SDIO_LOG_HEADER_SIZE != 0 ) */ -} sdio_log_entry_t; - -static int next_sdio_log_pos = 0; -static sdio_log_entry_t sdio_log_data[SDIO_LOG_SIZE]; - -static void add_log_entry( wwd_bus_transfer_direction_t dir, wwd_bus_function_t function, uint32_t address, unsigned long length, uint8_t* data ) -{ - sdio_log_data[next_sdio_log_pos].direction = dir; - sdio_log_data[next_sdio_log_pos].function = function; - sdio_log_data[next_sdio_log_pos].address = address; - sdio_log_data[next_sdio_log_pos].time = host_rtos_get_time(); - sdio_log_data[next_sdio_log_pos].length = length; -#if ( SDIO_LOG_HEADER_SIZE != 0 ) - memcpy( sdio_log_data[next_sdio_log_pos].header, data, (length>=SDIO_LOG_HEADER_SIZE)?SDIO_LOG_HEADER_SIZE:length ); -#else - UNUSED_PARAMETER(data); -#endif /* if ( SDIO_LOG_HEADER_SIZE != 0 ) */ - next_sdio_log_pos++; - if (next_sdio_log_pos >= SDIO_LOG_SIZE) - { - next_sdio_log_pos = 0; - } -} -#else /* #if 0 */ -#define add_log_entry( dir, function, address, length, data) -#endif /* #if 0 */ - - -/****************************************************** - * Global Function definitions - ******************************************************/ - -/* Device data transfer functions */ -wwd_result_t wwd_bus_send_buffer( wiced_buffer_t buffer ) -{ - wwd_result_t retval; - retval = wwd_bus_transfer_bytes( BUS_WRITE, WLAN_FUNCTION, 0, (uint16_t) ( host_buffer_get_current_piece_size( buffer ) - sizeof(wiced_buffer_t) ), (wwd_transfer_bytes_packet_t*)( host_buffer_get_current_piece_data_pointer( buffer ) + sizeof(wiced_buffer_t) ) ); - host_buffer_release( buffer, WWD_NETWORK_TX ); - return retval; -} - -#include "wwd_dev.h" -extern struct os_wwd_device *wwd_dev; - -wwd_result_t wwd_bus_init(void) -{ - uint8_t byte_data; - wwd_result_t result; - uint32_t loop_count; - - wwd_bus_flow_controlled = WICED_FALSE; - - wwd_bus_init_backplane_window( ); - - //host_platform_reset_wifi( WICED_TRUE ); - //host_platform_power_wifi( WICED_TRUE ); - //(void) host_rtos_delay_milliseconds( (uint32_t) WWD_BUS_SDIO_RESET_DELAY ); /* Ignore return - nothing can be done if it fails */ - //host_platform_reset_wifi( WICED_FALSE ); - //(void) host_rtos_delay_milliseconds( (uint32_t) WWD_BUS_SDIO_AFTER_RESET_DELAY ); /* Ignore return - nothing can be done if it fails */ - - //VERIFY_RESULT(host_platform_sdio_enumerate( )); - - /* Setup the backplane*/ - loop_count = 0; - do - { - /* Enable function 1 (backplane) */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_IOEN, (uint8_t) 1, SDIO_FUNC_ENABLE_1 ) ); - if (loop_count != 0) - { - (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); /* Ignore return - nothing can be done if it fails */ - } - VERIFY_RESULT( wwd_bus_read_register_value ( BUS_FUNCTION, SDIOD_CCCR_IOEN, (uint8_t) 1, &byte_data ) ); - loop_count++; - if ( loop_count >= (uint32_t) F0_WORKING_TIMEOUT_MS ) - { - return WWD_TIMEOUT; - } - } while (byte_data != (uint8_t) SDIO_FUNC_ENABLE_1); - -#ifndef SDIO_1_BIT - /* Read the bus width and set to 4 bits */ - VERIFY_RESULT( wwd_bus_read_register_value (BUS_FUNCTION, SDIOD_CCCR_BICTRL, (uint8_t) 1, &byte_data) ); - VERIFY_RESULT( wwd_bus_write_register_value(BUS_FUNCTION, SDIOD_CCCR_BICTRL, (uint8_t) 1, (byte_data & (~BUS_SD_DATA_WIDTH_MASK)) | BUS_SD_DATA_WIDTH_4BIT ) ); - /* NOTE: We don't need to change our local bus settings since we're not sending any data (only using CMD52) until after we change the bus speed further down */ - - mmcsd_set_bus_width(((struct os_mmcsd_card *)(wwd_dev->card))->host, 2); - -#endif - /* Set the block size */ - - /* Wait till the backplane is ready */ - loop_count = 0; - while ( ( ( result = wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_BLKSIZE_0, (uint8_t) 1, (uint32_t) SDIO_64B_BLOCK ) ) == WWD_SUCCESS ) && - ( ( result = wwd_bus_read_register_value ( BUS_FUNCTION, SDIOD_CCCR_BLKSIZE_0, (uint8_t) 1, &byte_data ) ) == WWD_SUCCESS ) && - ( byte_data != (uint8_t) SDIO_64B_BLOCK ) && - ( loop_count < (uint32_t) F0_WORKING_TIMEOUT_MS ) ) - { - (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); /* Ignore return - nothing can be done if it fails */ - loop_count++; - if ( loop_count >= (uint32_t) F0_WORKING_TIMEOUT_MS ) - { - /* If the system fails here, check the high frequency crystal is working */ - WPRINT_WWD_ERROR(("Timeout while setting block size\n")); - return WWD_TIMEOUT; - } - } - - VERIFY_RESULT( result ); - - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_BLKSIZE_0, (uint8_t) 1, (uint32_t) SDIO_64B_BLOCK ) ); - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_F1BLKSIZE_0, (uint8_t) 1, (uint32_t) SDIO_64B_BLOCK ) ); - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_F2BLKSIZE_0, (uint8_t) 1, (uint32_t) SDIO_64B_BLOCK ) ); - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_F2BLKSIZE_1, (uint8_t) 1, (uint32_t) 0 ) ); /* Function 2 = 64 */ - - /* Enable/Disable Client interrupts */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_INTEN, (uint8_t) 1, INTR_CTL_MASTER_EN | INTR_CTL_FUNC1_EN | INTR_CTL_FUNC2_EN ) ); - - -#if 0 - /* This code is required if we want more than 25 MHz clock */ - VERIFY_RESULT( wwd_bus_sdio_read_register_value( BUS_FUNCTION, SDIOD_CCCR_SPEED_CONTROL, 1, &byte_data ) ); - if ( ( byte_data & 0x1 ) != 0 ) - { - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_SPEED_CONTROL, 1, byte_data | SDIO_SPEED_EHS ) ); - } - else - { - return WWD_BUS_READ_REGISTER_ERROR; - } -#endif /* HIGH_SPEED_SDIO_CLOCK */ - - /* ?D??SDIO¨º¡À?¨®?a???¨´?¡ê¨º?¡ê?4bit?¡ê¨º? */ - host_platform_enable_high_speed_sdio( ); - - /* Wait till the backplane is ready */ - loop_count = 0; - while ( ( ( result = wwd_bus_read_register_value( BUS_FUNCTION, SDIOD_CCCR_IORDY, (uint8_t) 1, &byte_data ) ) == WWD_SUCCESS ) && - ( ( byte_data & SDIO_FUNC_READY_1 ) == 0 ) && - ( loop_count < (uint32_t) F1_AVAIL_TIMEOUT_MS ) ) - { - (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); /* Ignore return - nothing can be done if it fails */ - loop_count++; - } - if ( loop_count >= (uint32_t) F1_AVAIL_TIMEOUT_MS ) - { - WPRINT_WWD_ERROR(("Timeout while waiting for backplane to be ready\n")); - return WWD_TIMEOUT; - } - VERIFY_RESULT( result ); - - /* Set the ALP */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, (uint32_t)( SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_ALP_AVAIL_REQ | SBSDIO_FORCE_ALP ) ) ); - - loop_count = 0; - while ( ( ( result = wwd_bus_read_register_value( BACKPLANE_FUNCTION, SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, &byte_data ) ) == WWD_SUCCESS ) && - ( ( byte_data & SBSDIO_ALP_AVAIL ) == 0 ) && - ( loop_count < (uint32_t) ALP_AVAIL_TIMEOUT_MS ) ) - { - (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); /* Ignore return - nothing can be done if it fails */ - loop_count++; - } - if ( loop_count >= (uint32_t) ALP_AVAIL_TIMEOUT_MS ) - { - WPRINT_WWD_ERROR(("Timeout while waiting for alp clock\n")); - return WWD_TIMEOUT; - } - VERIFY_RESULT( result ); - - /* Clear request for ALP */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, 0 ) ); - - /* Disable the extra SDIO pull-ups */ -#ifndef WWD_BUS_SDIO_USE_WLAN_SDIO_PULLUPS - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_PULL_UP, (uint8_t) 1, 0 ) ); -#endif - - /* Enable F1 and F2 */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_IOEN, (uint8_t) 1, SDIO_FUNC_ENABLE_1 | SDIO_FUNC_ENABLE_2 ) ); - -#ifndef WICED_DISABLE_MCU_POWERSAVE - /* Enable out-of-band interrupt */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_SEP_INT_CTL, (uint8_t) 1, SEP_INTR_CTL_MASK | SEP_INTR_CTL_EN | SEP_INTR_CTL_POL ) ); - - /* Set OOB interrupt to the correct WLAN GPIO pin */ - VERIFY_RESULT( wwd_bus_sdio_set_oob_interrupt( host_platform_get_oob_interrupt_pin( ) ) ); - - VERIFY_RESULT( host_enable_oob_interrupt( ) ); -#endif /* ifndef WICED_DISABLE_MCU_POWERSAVE */ - - /* Enable F2 interrupt only */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_INTEN, (uint8_t) 1, INTR_CTL_MASTER_EN | INTR_CTL_FUNC2_EN ) ); - - VERIFY_RESULT( wwd_bus_read_register_value( BUS_FUNCTION, SDIOD_CCCR_IORDY, (uint8_t) 1, &byte_data ) ); - - VERIFY_RESULT( wwd_bus_sdio_download_firmware( ) ); - - /* Wait for F2 to be ready */ - loop_count = 0; - while ( ( ( result = wwd_bus_read_register_value( BUS_FUNCTION, SDIOD_CCCR_IORDY, (uint8_t) 1, &byte_data ) ) == WWD_SUCCESS ) && - ( ( byte_data & SDIO_FUNC_READY_2 ) == 0 ) && - ( loop_count < (uint32_t) F2_READY_TIMEOUT_MS ) ) - { - (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); /* Ignore return - nothing can be done if it fails */ - loop_count++; - } - if ( loop_count >= (uint32_t) F2_READY_TIMEOUT_MS ) - { - /* If your system fails here, it could be due to incorrect NVRAM variables. - * Check which 'wifi_nvram_image.h' file your platform is using, and - * check that it matches the WLAN device on your platform, including the - * crystal frequency. - */ - WPRINT_WWD_ERROR(("Timeout while waiting for function 2 to be ready\n")); - /*@-unreachable@*/ /* Reachable after hitting assert */ - return WWD_TIMEOUT; - /*@+unreachable@*/ - } - - wwd_chip_specific_init(); - wwd_ensure_wlan_bus_is_up(); - - return result; -} - -wwd_result_t wwd_bus_deinit( void ) -{ - //wwd_allow_wlan_bus_to_sleep(); - - /* put device in reset. */ -// host_platform_reset_wifi( WICED_TRUE ); - - wwd_bus_set_resource_download_halt( WICED_FALSE ); - return WWD_SUCCESS; -} - -wwd_result_t wwd_bus_ack_interrupt(uint32_t intstatus) -{ - return wwd_bus_write_backplane_value( (uint32_t) SDIO_INT_STATUS, (uint8_t) 4, intstatus); -} - -uint32_t wwd_bus_packet_available_to_read(void) -{ - uint32_t int_status = 0; - - /* Ensure the wlan backplane bus is up */ - VERIFY_RESULT( wwd_ensure_wlan_bus_is_up() ); - - /* Read the IntStatus */ - if ( wwd_bus_read_backplane_value( (uint32_t) SDIO_INT_STATUS, (uint8_t) 4, (uint8_t*)&int_status ) != WWD_SUCCESS ) - { - } - - /* Clear any interrupts */ - if ( wwd_bus_write_backplane_value( (uint32_t) SDIO_INT_STATUS, (uint8_t) 4, int_status ) != WWD_SUCCESS ) - { - } - -#if defined(WICED_PLATFORM_MASKS_BUS_IRQ) - host_platform_unmask_sdio_interrupt(); -#endif - - return ((int_status) & (FRAME_AVAILABLE_MASK)); -} - -/* - * From internal documentation: hwnbu-twiki/SdioMessageEncapsulation - * When data is available on the device, the device will issue an interrupt: - * - the device should signal the interrupt as a hint that one or more data frames may be available on the device for reading - * - the host may issue reads of the 4 byte length tag at any time -- that is, whether an interupt has been issued or not - * - if a frame is available, the tag read should return a nonzero length (>= 4) and the host can then read the remainder of the frame by issuing one or more CMD53 reads - * - if a frame is not available, the 4byte tag read should return zero - */ -wwd_result_t wwd_bus_read_frame( /*@out@*/ wiced_buffer_t* buffer ) -{ - uint16_t hwtag[8]; - uint16_t extra_space_required; - wwd_result_t result; - - *buffer = NULL; - - /* Ensure the wlan backplane bus is up */ - VERIFY_RESULT( wwd_ensure_wlan_bus_is_up() ); - - /* Read the frame header and verify validity */ - memset( hwtag, 0, sizeof(hwtag) ); - - result = wwd_bus_sdio_transfer(BUS_READ, WLAN_FUNCTION, 0, (uint16_t) INITIAL_READ, (uint8_t*)hwtag, RESPONSE_NEEDED); - if ( result != WWD_SUCCESS ) - { - (void) wwd_bus_sdio_abort_read( WICED_FALSE ); /* ignore return - not much can be done if this fails */ - return WWD_SDIO_RX_FAIL; - } - - if ( ( ( hwtag[0] | hwtag[1] ) == 0 ) || - ( ( hwtag[0] ^ hwtag[1] ) != (uint16_t) 0xFFFF ) ) - { - return WWD_HWTAG_MISMATCH; - } - - if ( ( hwtag[0] == (uint16_t) 12 ) && - ( wwd_wlan_status.state == WLAN_UP) ) - { - result = wwd_bus_sdio_transfer(BUS_READ, WLAN_FUNCTION, 0, (uint16_t) 8, (uint8_t*) &hwtag[2], RESPONSE_NEEDED); - if ( result != WWD_SUCCESS ) - { - (void) wwd_bus_sdio_abort_read( WICED_FALSE ); /* ignore return - not much can be done if this fails */ - return WWD_SDIO_RX_FAIL; - } - wwd_sdpcm_update_credit((uint8_t*)hwtag); - return WWD_SUCCESS; - } - - /* Calculate the space we need to store entire packet */ - if ( ( hwtag[0] > (uint16_t) INITIAL_READ ) ) - { - extra_space_required = (uint16_t) ( hwtag[0] - (uint16_t) INITIAL_READ ); - } - else - { - extra_space_required = 0; - } - - /* Allocate a suitable buffer */ - result = host_buffer_get( buffer, WWD_NETWORK_RX, (unsigned short) ( (uint16_t) INITIAL_READ + extra_space_required + (uint16_t) sizeof(wwd_buffer_header_t) ), WICED_FALSE ); - if ( result != WWD_SUCCESS ) - { - /* Read out the first 12 bytes to get the bus credit information, 4 bytes are already read in hwtag */ - wiced_assert( "Get buffer error", ( ( result == WWD_BUFFER_UNAVAILABLE_TEMPORARY ) || ( result == WWD_BUFFER_UNAVAILABLE_PERMANENT ) ) ); - result = wwd_bus_sdio_transfer(BUS_READ, WLAN_FUNCTION, 0, (uint16_t) 8, (uint8_t*) &hwtag[2], RESPONSE_NEEDED); - if ( result != WWD_SUCCESS ) - { - (void) wwd_bus_sdio_abort_read( WICED_FALSE ); /* ignore return - not much can be done if this fails */ - return WWD_SDIO_RX_FAIL; - } - result = wwd_bus_sdio_abort_read( WICED_FALSE ); - wiced_assert( "Read-abort failed", result==WWD_SUCCESS ); - REFERENCE_DEBUG_ONLY_VARIABLE( result ); - - wwd_sdpcm_update_credit( (uint8_t *)hwtag ); - return WWD_RX_BUFFER_ALLOC_FAIL; - } - - /* Copy the data already read */ - memcpy( host_buffer_get_current_piece_data_pointer( *buffer ) + sizeof(wwd_buffer_header_t), hwtag, (size_t) INITIAL_READ ); - - /* Read the rest of the data */ - if ( extra_space_required > 0 ) - { - result = wwd_bus_sdio_transfer(BUS_READ, WLAN_FUNCTION, 0, extra_space_required, host_buffer_get_current_piece_data_pointer( *buffer ) + sizeof(wwd_buffer_header_t) + INITIAL_READ, RESPONSE_NEEDED); - if ( result != WWD_SUCCESS ) - { - (void) wwd_bus_sdio_abort_read( WICED_FALSE ); /* ignore return - not much can be done if this fails */ - host_buffer_release(*buffer, WWD_NETWORK_RX); - return WWD_SDIO_RX_FAIL; - } - } - - return WWD_SUCCESS; -} - - -/****************************************************** - * Function definitions for Protocol Common - ******************************************************/ - -/* Device register access functions */ -wwd_result_t wwd_bus_write_backplane_value( uint32_t address, uint8_t register_length, uint32_t value ) -{ - VERIFY_RESULT( wwd_bus_set_backplane_window( address ) ); - - VERIFY_RESULT( wwd_bus_sdio_transfer( BUS_WRITE, BACKPLANE_FUNCTION, address & 0x07FFF, register_length, (uint8_t*) &value, RESPONSE_NEEDED )); - - return wwd_bus_set_backplane_window( CHIPCOMMON_BASE_ADDRESS ); -} - -wwd_result_t wwd_bus_read_backplane_value( uint32_t address, uint8_t register_length, /*@out@*/ uint8_t* value ) -{ - *value = 0; - VERIFY_RESULT( wwd_bus_set_backplane_window( address ) ); - - VERIFY_RESULT( wwd_bus_sdio_transfer( BUS_READ, BACKPLANE_FUNCTION, address & 0x07FFF, register_length, value, RESPONSE_NEEDED )); - - return wwd_bus_set_backplane_window( CHIPCOMMON_BASE_ADDRESS ); -} - -wwd_result_t wwd_bus_write_register_value( wwd_bus_function_t function, uint32_t address, uint8_t value_length, uint32_t value ) -{ - return wwd_bus_sdio_transfer( BUS_WRITE, function, address, value_length, (uint8_t*) &value, RESPONSE_NEEDED ); -} - -wwd_result_t wwd_bus_transfer_bytes( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, uint16_t size, /*@in@*/ /*@out@*/ wwd_transfer_bytes_packet_t* data ) -{ - return wwd_bus_sdio_transfer( direction, function, address, size, (uint8_t*)data, RESPONSE_NEEDED ); -} - -#include - -wwd_result_t wwd_bus_sdio_transfer( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, uint16_t data_size, /*@in@*/ /*@out@*/ uint8_t* data, sdio_response_needed_t response_expected ) -{ - wwd_result_t result; - uint8_t retry_count = 0; - do - { - if ( data_size == (uint16_t) 1 ) - { - result = wwd_bus_sdio_cmd52( direction, function, address, *data, response_expected, data ); - } - else - { - uint16_t data_index = 0; - uint16_t left_size = data_size; - - while (left_size > 0) - { - int size = min(left_size, 512); - - void *_data = data + data_index; - - if (direction == BUS_READ) - { - _data = os_malloc(size + 512); - if (_data == OS_NULL) - return WWD_IOCTL_FAIL; - } - - result = wwd_bus_sdio_cmd53( direction, function, ( size > (uint16_t) 512 ) ? SDIO_BLOCK_MODE : SDIO_BYTE_MODE, address, size, _data, response_expected, NULL ); - - if (direction == BUS_READ) - { - memcpy(data + data_index, _data, size); - os_free(_data); - } - - left_size -= size; - data_index += size; - } - } - - if ( result != WWD_SUCCESS ) - { - return result; - } - - ++retry_count; - } while ( ( result != WWD_SUCCESS ) && ( retry_count < (uint8_t) BUS_PROTOCOL_LEVEL_MAX_RETRIES ) ); - - - return result; -} - -static wwd_result_t wwd_bus_sdio_cmd52( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, uint8_t value, sdio_response_needed_t response_expected, uint8_t* response ) -{ - uint32_t sdio_response; - wwd_result_t result; - sdio_cmd_argument_t arg; - arg.value = 0; - arg.cmd52.function_number = (unsigned int) ( function & BUS_FUNCTION_MASK ); - arg.cmd52.register_address = (unsigned int) ( address & 0x00001ffff ); - arg.cmd52.rw_flag = (unsigned int) ( ( direction == BUS_WRITE ) ? 1 : 0 ); - arg.cmd52.write_data = value; - result = host_platform_sdio_transfer( direction, SDIO_CMD_52, SDIO_BYTE_MODE, SDIO_1B_BLOCK, arg.value, 0, 0, response_expected, &sdio_response ); - if ( response != NULL ) - { - *response = (uint8_t) ( sdio_response & 0x00000000ff ); - } - return result; -} - -static wwd_result_t wwd_bus_sdio_cmd53( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, sdio_transfer_mode_t mode, uint32_t address, uint16_t data_size, /*@in@*/ /*@out@*/ uint8_t* data, sdio_response_needed_t response_expected, /*@null@*/ uint32_t* response ) -{ - sdio_cmd_argument_t arg; - wwd_result_t result; - - if ( direction == BUS_WRITE ) - { - add_log_entry(direction, function, address, data_size, data); - } - - arg.value = 0; - arg.cmd53.function_number = (unsigned int) ( function & BUS_FUNCTION_MASK ); - arg.cmd53.register_address = (unsigned int) ( address & 0x00001ffff ); - arg.cmd53.op_code = (unsigned int) 1; - arg.cmd53.rw_flag = (unsigned int) ( ( direction == BUS_WRITE ) ? 1 : 0 ); - if ( mode == SDIO_BYTE_MODE ) - { - wiced_assert( "wwd_bus_sdio_cmd53: data_size > 512 for byte mode", ( data_size <= (uint16_t) 512 ) ); - arg.cmd53.count = (unsigned int) ( data_size & 0x1FF ); - } - else - { - arg.cmd53.count = (unsigned int) ( ( data_size / (uint16_t)SDIO_512B_BLOCK ) & 0x0000001ff ); - if ( (uint32_t) ( arg.cmd53.count * (uint16_t)SDIO_512B_BLOCK ) < data_size ) - { - ++arg.cmd53.count; - } - arg.cmd53.block_mode = (unsigned int) 1; - } - - result = host_platform_sdio_transfer( direction, SDIO_CMD_53, mode, SDIO_512B_BLOCK, arg.value, (uint32_t*) data, data_size, response_expected, response ); - - if ( direction == BUS_READ ) - { - add_log_entry(direction, function, address, data_size, data); - } - - return result; -} - -static wwd_result_t wwd_bus_sdio_download_firmware( void ) -{ - uint8_t csr_val = 0; - wwd_result_t result; - uint32_t loop_count; - - VERIFY_RESULT( wwd_disable_device_core( WLAN_ARM_CORE, WLAN_CORE_FLAG_NONE ) ); - VERIFY_RESULT( wwd_disable_device_core( SOCRAM_CORE, WLAN_CORE_FLAG_NONE ) ); - VERIFY_RESULT( wwd_reset_device_core( SOCRAM_CORE, WLAN_CORE_FLAG_NONE ) ); - - VERIFY_RESULT( wwd_chip_specific_socsram_init( )); -#if 0 - /* 43362 specific: Remap JTAG pins to UART output */ - uint32_t data = 0; - VERIFY_RESULT( wwd_bus_write_backplane_value(0x18000650, 1, 1) ); - VERIFY_RESULT( wwd_bus_read_backplane_value(0x18000654, 4, (uint8_t*)&data) ); - data |= (1 << 24); - VERIFY_RESULT( wwd_bus_write_backplane_value(0x18000654, 4, data) ); -#endif - - -#ifdef MFG_TEST_ALTERNATE_WLAN_DOWNLOAD - VERIFY_RESULT( external_write_wifi_firmware_and_nvram_image( ) ); -#else - VERIFY_RESULT( wwd_bus_write_wifi_firmware_image( ) ); - VERIFY_RESULT( wwd_bus_write_wifi_nvram_image( ) ); -#endif /* ifdef MFG_TEST_ALTERNATE_WLAN_DOWNLOAD */ - - /* Take the ARM core out of reset */ - VERIFY_RESULT( wwd_reset_device_core( WLAN_ARM_CORE, WLAN_CORE_FLAG_NONE ) ); - - result = wwd_device_core_is_up( WLAN_ARM_CORE ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR(("Could not bring ARM core up\n")); - /*@-unreachable@*/ /* Reachable after hitting assert */ - return result; - /*@+unreachable@*/ - } - - /* Wait until the High Throughput clock is available */ - loop_count = 0; - while ( ( ( result = wwd_bus_read_register_value( BACKPLANE_FUNCTION, SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, &csr_val ) ) == WWD_SUCCESS ) && - ( ( csr_val & SBSDIO_HT_AVAIL ) == 0 ) && - ( loop_count < (uint32_t) HT_AVAIL_TIMEOUT_MS ) ) - { - (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); /* Ignore return - nothing can be done if it fails */ - loop_count++; - } - if ( loop_count >= (uint32_t) HT_AVAIL_TIMEOUT_MS ) - { - /* If your system times out here, it means that the WLAN firmware is not booting. - * Check that your WLAN chip matches the 'wifi_image.c' being built - in GNU toolchain, $(CHIP) - * makefile variable must be correct. - */ - WPRINT_WWD_ERROR(("Timeout while waiting for high throughput clock\n")); - /*@-unreachable@*/ /* Reachable after hitting assert */ - return WWD_TIMEOUT; - /*@+unreachable@*/ - } - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR(("Error while waiting for high throughput clock\n")); - /*@-unreachable@*/ /* Reachable after hitting assert */ - return result; - /*@+unreachable@*/ - } - - /* Set up the interrupt mask and enable interrupts */ - VERIFY_RESULT( wwd_bus_write_backplane_value( SDIO_INT_HOST_MASK, (uint8_t) 4, I_HMB_SW_MASK ) ); - - /* Enable F2 interrupts. This wasn't required for 4319 but is for the 43362 */ - VERIFY_RESULT( wwd_bus_write_backplane_value( SDIO_FUNCTION_INT_MASK, (uint8_t) 1, (uint32_t) 2) ); - - /* Lower F2 Watermark to avoid DMA Hang in F2 when SD Clock is stopped. */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_FUNCTION2_WATERMARK, (uint8_t) 1, (uint32_t) SDIO_F2_WATERMARK ) ); - - return WWD_SUCCESS; -} - -/** Aborts a SDIO read of a packet from the 802.11 device - * - * This function is necessary because the only way to obtain the size of the next - * available received packet is to read the first four bytes of the packet. - * If the system reads these four bytes, and then fails to allocate the required - * memory, then this function allows the system to abort the packet read cleanly, - * and to optionally tell the 802.11 device to keep it allowing reception once - * memory is available. - * - * In order to do this abort, the following actions are performed: - * - Sets abort bit for Function 2 (WLAN Data) to request stopping transfer - * - Sets Read Frame Termination bit to flush and reset fifos - * - If packet is to be kept and resent by 802.11 device, a NAK is sent - * - Wait whilst the Fifo is emptied of the packet ( reading during this period would cause all zeros to be read ) - * - * @param retry : WICED_TRUE if 802.11 device is to keep and resend packet - * WICED_FALSE if 802.11 device is to drop packet - * - * @return WWD_SUCCESS if successful, otherwise error code - */ -static wwd_result_t wwd_bus_sdio_abort_read( wiced_bool_t retry ) -{ - /* Abort transfer on WLAN_FUNCTION */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, SDIOD_CCCR_IOABORT, (uint8_t) 1, (uint32_t) WLAN_FUNCTION ) ); - - /* Send frame terminate */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_FRAME_CONTROL, (uint8_t) 1, SFC_RF_TERM ) ); - - /* If we want to retry message, send NAK */ - if ( retry == WICED_TRUE ) - { - VERIFY_RESULT( wwd_bus_write_backplane_value( (uint32_t) SDIO_TO_SB_MAIL_BOX, (uint8_t) 1, SMB_NAK ) ); - } - - return WWD_SUCCESS; -} - -wwd_result_t wwd_bus_read_register_value( wwd_bus_function_t function, uint32_t address, uint8_t value_length, /*@out@*/ uint8_t* value ) -{ - memset( value, 0, (size_t) value_length ); - return wwd_bus_sdio_transfer( BUS_READ, function, address, value_length, value, RESPONSE_NEEDED ); -} - -wwd_result_t wwd_bus_poke_wlan( void ) -{ - /*TODO: change 1<<3 to a register hash define */ - return wwd_bus_write_backplane_value( SDIO_TO_SB_MAILBOX, (uint8_t) 4, (uint32_t)( 1 << 3 ) ); -} - -wwd_result_t wwd_bus_set_flow_control( uint8_t value ) -{ - if ( value != 0 ) - { - wwd_bus_flow_controlled = WICED_TRUE; - } - else - { - wwd_bus_flow_controlled = WICED_FALSE; - } - return WWD_SUCCESS; -} - -wiced_bool_t wwd_bus_is_flow_controlled( void ) -{ - return wwd_bus_flow_controlled; -} - -wwd_result_t wwd_bus_specific_wakeup( void ) -{ - return WWD_SUCCESS; -} - -wwd_result_t wwd_bus_specific_sleep( void ) -{ - return WWD_SUCCESS; -} - -#ifndef WICED_DISABLE_MCU_POWERSAVE -static wwd_result_t wwd_bus_sdio_set_oob_interrupt( uint8_t gpio_pin_number ) -{ - if ( gpio_pin_number == 1 ) - { - /* Redirect to OOB interrupt to GPIO1 */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_GPIO_SELECT, (uint8_t)1, (uint32_t) 0xF ) ); - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_GPIO_OUTPUT, (uint8_t)1, (uint32_t) 0x0 ) ); - - /* Enable GPIOx (bit x) */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_GPIO_ENABLE, (uint8_t)1, (uint32_t)0x2 ) ); - - /* Set GPIOx (bit x) on Chipcommon GPIO Control register */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, CHIPCOMMON_GPIO_CONTROL, (uint8_t)4, (uint32_t)0x2 ) ); - } - - return WWD_SUCCESS; -} -#endif - diff --git a/components/WWD/WWD/internal/bus_protocols/SPI/wwd_bus_protocol.c b/components/WWD/WWD/internal/bus_protocols/SPI/wwd_bus_protocol.c deleted file mode 100644 index 40290689e6cc87462fa6f7094f2d8e2ea1c1f3fc..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/bus_protocols/SPI/wwd_bus_protocol.c +++ /dev/null @@ -1,748 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -#include /* For memcpy */ -#include "wwd_assert.h" -#include "platform/wwd_platform_interface.h" -#include "platform/wwd_spi_interface.h" -#include "network/wwd_network_constants.h" -#include "network/wwd_buffer_interface.h" -#include "RTOS/wwd_rtos_interface.h" -#include "internal/bus_protocols/wwd_bus_protocol_interface.h" -#include "internal/wwd_internal.h" -#include "internal/wwd_bcmendian.h" -#include "internal/wwd_sdpcm.h" -#include "wwd_bus_protocol.h" -#include "chip_constants.h" - -/****************************************************** - * Constants - ******************************************************/ - -#define F2_READY_TIMEOUT_MS (1000) -#define F2_READY_TIMEOUT_LOOPS (1000) -#define F1_READY_TIMEOUT_LOOPS (1000) -#define FEADBEAD_TIMEOUT_MS (5000) -#define ALP_AVAIL_TIMEOUT_MS (100) - -#ifndef HT_AVAIL_TIMEOUT_MS -#define HT_AVAIL_TIMEOUT_MS (1000) -#endif - -/* Taken from FALCON_5_90_195_26 dhd/sys/dhd_sdio.c. For 43362, MUST be >= 8 and word-aligned otherwise dongle fw crashes */ -#define SPI_F2_WATERMARK (32) - -#define GSPI_PACKET_AVAILABLE (1 << 8) -#define GSPI_UNDERFLOW (1 << 1) - -#define VERIFY_RESULT( x ) { wwd_result_t verify_result; verify_result = ( x ); if ( verify_result != WWD_SUCCESS ) return verify_result; } - -#define SWAP32_16BIT_PARTS(val) ((uint32_t)(( ((uint32_t)(val)) >> 16) + ((((uint32_t)(val)) & 0xffff)<<16))) - -#ifdef GSPI_USING_DSTATUS -#define WWD_BUS_GSPI_PACKET_OVERHEAD ( sizeof( wwd_buffer_header_t ) + sizeof( uint32 ) ) -#else -#define WWD_BUS_GSPI_PACKET_OVERHEAD ( sizeof( wwd_buffer_header_t ) ) -#endif - -#define MAX_GSPI_TRANSFER_LEN 2048 - -#define H32TO16LE(x) ( ( uint32_t ) ( ( ( ( uint32_t ) ( x ) & ( uint32_t ) 0x000000ffU ) << 8 ) | \ - ( ( ( uint32_t ) ( x ) & ( uint32_t ) 0x0000ff00U ) >> 8 ) | \ - ( ( ( uint32_t ) ( x ) & ( uint32_t ) 0x00ff0000U ) << 8 ) | \ - ( ( ( uint32_t ) ( x ) & ( uint32_t ) 0xff000000U ) >> 8 ) ) ) - -typedef enum -{ - GSPI_INCREMENT_ADDRESS = 1, - GSPI_FIXED_ADDRESS = 0 -} gspi_transfer_access_t; - -/****************************************************** - * Structures - ******************************************************/ - -#pragma pack(1) - -typedef struct -{ - wwd_bus_gspi_header_t header; - uint8_t response_delay[4]; -} gspi_backplane_f1_read_header_t; - -#pragma pack() - -typedef struct -{ - gspi_backplane_f1_read_header_t gspi_header; - uint32_t data[1]; -} gspi_backplane_f1_read_packet_t; - -/****************************************************** - * Static variables - ******************************************************/ - -static wiced_bool_t wwd_bus_gspi_32bit = WICED_FALSE; -static const uint8_t wwd_bus_gspi_command_mapping[] = -{ - 0, - 1 -}; - -static wiced_bool_t wwd_bus_flow_controlled = WICED_FALSE; - - -/****************************************************** - * Static Function Declarations - ******************************************************/ - -static wwd_result_t wwd_download_firmware ( void ); -static wwd_result_t wwd_bus_transfer_buffer ( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, wiced_buffer_t buffer ); - -/****************************************************** - * SPI Logging - * Enable this section for logging of SPI transfers - * by changing "if 0" to "if 1" - ******************************************************/ -#if 0 - -#define GSPI_LOG_SIZE (110) -#define SDIO_LOG_HEADER_SIZE (0) /*(0x30) */ - -typedef enum -{ - UNUSED, - LOG_TX, - LOG_RX -}gspi_log_direction_t; - -typedef struct gSPI_log_entry_struct -{ - gspi_log_direction_t direction; - wwd_bus_function_t function; - uint32_t address; - unsigned long time; - unsigned long length; -#if ( SDIO_LOG_HEADER_SIZE != 0 ) - unsigned char header[GSPI_LOG_HEADER_SIZE]; -#endif /* if ( SDIO_LOG_HEADER_SIZE != 0 ) */ -}gspi_log_entry_t; - -static int next_gspi_log_pos = 0; -static gspi_log_entry_t gspi_log_data[GSPI_LOG_SIZE]; - -static void add_log_entry( gspi_log_direction_t dir, wwd_bus_function_t function, uint32_t address, unsigned long length, char* gspi_data ) -{ - UNUSED_PARAMETER(gspi_data); - gspi_log_data[next_gspi_log_pos].direction = dir; - gspi_log_data[next_gspi_log_pos].function = function; - gspi_log_data[next_gspi_log_pos].address = address; - gspi_log_data[next_gspi_log_pos].time = host_rtos_get_time(); - gspi_log_data[next_gspi_log_pos].length = length; -#if ( SDIO_LOG_HEADER_SIZE != 0 ) - memcpy( gspi_log_data[next_gspi_log_pos].header, gspi_data, (length>=GSPI_LOG_HEADER_SIZE)?GSPI_LOG_HEADER_SIZE:length ); -#endif /* if ( SDIO_LOG_HEADER_SIZE != 0 ) */ - next_gspi_log_pos++; - if (next_gspi_log_pos >= GSPI_LOG_SIZE) - { - next_gspi_log_pos = 0; - } -} -#else -#define add_log_entry( dir, function, address, length, gspi_data ) -#endif - -/****************************************************** - * Global Function definitions - ******************************************************/ - -wwd_result_t wwd_bus_send_buffer( wiced_buffer_t buffer ) -{ - wwd_result_t result = wwd_bus_transfer_buffer( BUS_WRITE, WLAN_FUNCTION, 0, buffer ); - host_buffer_release( buffer, WWD_NETWORK_TX ); - return result; -} - -/* - * Perform a transfer on the gSPI bus - * Prerequisites: length < MAX_GSPI_TRANSFER_LEN - */ -static wwd_result_t wwd_bus_transfer_buffer( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, wiced_buffer_t buffer ) -{ - uint32_t* temp; - wwd_result_t result; - uint16_t newsize; - wwd_buffer_header_t* header = (wwd_buffer_header_t*) host_buffer_get_current_piece_data_pointer( buffer ); - wwd_transfer_bytes_packet_t* gspipacket = (wwd_transfer_bytes_packet_t*) &header->bus_header; - - uint16_t size = (uint16_t) ( host_buffer_get_current_piece_size( buffer ) - sizeof( wwd_buffer_header_t ) ); - -#ifdef SUPPORT_BUFFER_CHAINING -#error BUFFER CHAINING NOT IMPLEMENTED IN GSPI YET -#endif /* ifdef SUPPORT_BUFFER_CHAINING */ - /* Form the gSPI header */ - gspipacket->bus_header.gspi_header = (wwd_bus_gspi_header_t) ( (uint32_t) ( ( wwd_bus_gspi_command_mapping[(int)direction] & 0x1 ) << 31 ) | - (uint32_t) ( ( GSPI_INCREMENT_ADDRESS & 0x1 ) << 30 ) | - (uint32_t) ( ( function & 0x3 ) << 28 ) | - (uint32_t) ( ( address & 0x1FFFF ) << 11 ) | - (uint32_t) ( ( size & 0x7FF ) << 0 ) ); - - /* Reshuffle the bits if we're not in 32 bit mode */ - if ( wwd_bus_gspi_32bit == WICED_FALSE ) - { - /* Note: This typecast should always be valid if the buffer containing the GSpi packet has been correctly declared as 32-bit aligned */ - temp = (uint32_t*) &gspipacket->bus_header.gspi_header; - *temp = H32TO16LE(*temp); - } - - /* Round size up to 32-bit alignment */ - newsize = (uint16_t) ROUND_UP(size, 4); - - /* Send the data */ - if ( direction == BUS_WRITE ) - { - /* Wait for FIFO to be ready to accept data */ - if ( function == WLAN_FUNCTION ) - { - uint32_t wwd_bus_gspi_status; - uint32_t loop_count = 0; - while ( ( ( result = wwd_bus_read_register_value( BUS_FUNCTION, SPI_STATUS_REGISTER, (uint8_t) 4, (uint8_t*) &wwd_bus_gspi_status ) ) == WWD_SUCCESS ) && - ( ( wwd_bus_gspi_status & ( 1 << 5 ) ) == 0 ) && - ( loop_count < (uint32_t) F2_READY_TIMEOUT_LOOPS ) ) - { - loop_count++; - } - if ( result != WWD_SUCCESS ) - { - return result; - } - if ( loop_count >= (uint32_t) F2_READY_TIMEOUT_LOOPS ) - { - WPRINT_WWD_ERROR(("Timeout waiting for data FIFO to be ready\n")); - return WWD_TIMEOUT; - } - } - - add_log_entry( LOG_TX, function, address, size, (char*)&gspipacket->data ); - } - result = host_platform_spi_transfer( direction, (uint8_t*) gspipacket, (uint16_t) ( newsize + sizeof(wwd_bus_gspi_header_t) ) ); - if ( direction == BUS_READ ) - { - add_log_entry( LOG_RX, function, address, size, (char*)&gspipacket->data ); - } - - return result; -} - -wwd_result_t wwd_bus_poke_wlan( void ) -{ - return WWD_SUCCESS; -} - -wwd_result_t wwd_bus_set_flow_control( uint8_t value ) -{ - if ( value != 0 ) - { - wwd_bus_flow_controlled = WICED_TRUE; - } - else - { - wwd_bus_flow_controlled = WICED_FALSE; - } - return WWD_SUCCESS; -} - -wiced_bool_t wwd_bus_is_flow_controlled( void ) -{ - return wwd_bus_flow_controlled; -} - -wwd_result_t wwd_bus_ack_interrupt(uint32_t intstatus) -{ - return wwd_bus_write_register_value( BUS_FUNCTION, SPI_INTERRUPT_REGISTER, (uint8_t) 2, intstatus ); -} - -uint32_t wwd_bus_packet_available_to_read(void) -{ - uint16_t interrupt_register; - - VERIFY_RESULT( wwd_ensure_wlan_bus_is_up()); - - /* Read the interrupt register */ - if (wwd_bus_read_register_value( BUS_FUNCTION, SPI_INTERRUPT_REGISTER, (uint8_t) 2, (uint8_t*) &interrupt_register ) != WWD_SUCCESS) - { - goto return_with_error; - } - - if ( ( interrupt_register & 0x0086 ) != 0 ) /* This should be 0x87, but occasional "data not available" errors are flagged seemingly for no reason */ - { - /* Error condition detected */ - WPRINT_WWD_DEBUG(("Bus error condition detected\n")); - } - - /* Clear interrupt register */ - if ( interrupt_register != 0 ) - { - if (wwd_bus_write_register_value( BUS_FUNCTION, SPI_INTERRUPT_REGISTER, (uint8_t) 2, interrupt_register ) != WWD_SUCCESS) - { - goto return_with_error; - } - } - - return (uint32_t)((interrupt_register) & (F2_PACKET_AVAILABLE)); - -return_with_error: - wiced_assert("Error accessing backplane", 0 != 0); - return 0; -} - -/*@only@*/ /*@null@*/ wwd_result_t wwd_bus_read_frame( wiced_buffer_t* buffer ) -{ - uint32_t wwd_bus_gspi_status; - wwd_result_t result; - uint32_t wiced_gspi_bytes_pending; - - /* Ensure the wlan backplane bus is up */ - VERIFY_RESULT( wwd_ensure_wlan_bus_is_up() ); - - do - { - result = wwd_bus_read_register_value( BUS_FUNCTION, SPI_STATUS_REGISTER, (uint8_t) 4, (uint8_t*) &wwd_bus_gspi_status ); - if ( result != WWD_SUCCESS ) - { - return result; - } - } while ( wwd_bus_gspi_status == 0xFFFFFFFF ); - - if ( ( wwd_bus_gspi_status & GSPI_PACKET_AVAILABLE ) != 0) - { - if ( ((( wwd_bus_gspi_status >> 9 ) & 0x7FF )== 0 ) || - ((( wwd_bus_gspi_status >> 9 ) & 0x7FF ) > ( WICED_LINK_MTU - WWD_BUS_GSPI_PACKET_OVERHEAD )) || - ( wwd_bus_gspi_status & GSPI_UNDERFLOW )) - { - wwd_bus_write_register_value( BACKPLANE_FUNCTION, SPI_FRAME_CONTROL, 1, ( 1 << 0 )); - return WWD_NO_PACKET_TO_RECEIVE; - } - } - - wiced_gspi_bytes_pending = 0; - - if ( ( wwd_bus_gspi_status & GSPI_PACKET_AVAILABLE ) != 0 ) - { - wiced_gspi_bytes_pending = ( ( wwd_bus_gspi_status >> 9 ) & 0x7FF ); - } - - if ( wiced_gspi_bytes_pending == 0 ) - { - return WWD_NO_PACKET_TO_RECEIVE; - } - - /* Allocate a suitable buffer */ - result = host_buffer_get( buffer, WWD_NETWORK_RX, (unsigned short)( wiced_gspi_bytes_pending + WWD_BUS_GSPI_PACKET_OVERHEAD), WICED_FALSE ); - - if ( result != WWD_SUCCESS ) - { - /* Read out the first 12 bytes to get the bus credit information */ - uint8_t temp_buffer[12 + sizeof(wwd_bus_header_t)]; - wwd_bus_transfer_bytes( BUS_READ, WLAN_FUNCTION, 0, 12, (wwd_transfer_bytes_packet_t*) temp_buffer ); - - /* Abort the transfer to force the packet to be dropped */ - if ( wiced_gspi_bytes_pending > 12 ) - { - wwd_bus_write_register_value( BACKPLANE_FUNCTION, SPI_FRAME_CONTROL, 1, ( 1 << 0 ) ); - } - - /* Process bus data credit information */ - wwd_sdpcm_update_credit( (uint8_t*) ( temp_buffer + sizeof(wwd_bus_header_t) ) ); - return result; - } - - result = wwd_bus_transfer_buffer( BUS_READ, WLAN_FUNCTION, 0, *buffer ); - if ( result != WWD_SUCCESS) - { - host_buffer_release( *buffer, WWD_NETWORK_RX ); - return result; - } - - return WWD_SUCCESS; -} - -wwd_result_t wwd_bus_init( void ) -{ - uint32_t data = 0; - uint32_t wwd_bus_gspi_status; - uint16_t data16 = 0; - uint32_t loop_count; - wwd_result_t result; - uint8_t init_data[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - uint32_t interrupt_polarity = 0; - - wwd_bus_gspi_32bit = WICED_FALSE; - -#ifndef WWD_SPI_IRQ_FALLING_EDGE - interrupt_polarity = INTERRUPT_POLARITY_HIGH; -#endif /* WWD_SPI_IRQ_FALLING_EDGE */ - - wwd_bus_init_backplane_window( ); - - host_platform_power_wifi( WICED_TRUE ); - host_platform_reset_wifi( WICED_TRUE ); - host_rtos_delay_milliseconds( (uint32_t) 1 ); - host_platform_reset_wifi( WICED_FALSE ); - - /* Due to an chip issue, the first transfer will be corrupted. - * This means a repeated safe read of a known value register is required until - * the correct value is returned - signalling the bus is running. - * This known value register must be accessed using fixed (non-incrementing) address - * mode, hence a custom packet header must be constructed - * Due to the chip issue, the data received could be left shifted by one bit. - */ - loop_count = 0; - do - { - wwd_bus_gspi_header_t* gspi_header = (wwd_bus_gspi_header_t*) init_data; - - *gspi_header = (wwd_bus_gspi_header_t) SWAP32_16BIT_PARTS( BCMSWAP32( (uint32_t)( ( wwd_bus_gspi_command_mapping[(int)BUS_READ] & 0x1 ) << 31) | - (uint32_t)( ( GSPI_FIXED_ADDRESS & 0x1 ) << 30) | - (uint32_t)( ( BUS_FUNCTION & 0x3 ) << 28) | - (uint32_t)( ( SPI_READ_TEST_REGISTER & 0x1FFFFu ) << 11) | - (uint32_t)( ( 4u /*size*/ & 0x7FFu ) << 0 ) ) ); - VERIFY_RESULT( host_platform_spi_transfer(BUS_READ, init_data, (uint16_t) 12 ) ); - loop_count++; - } while ( ( NULL == memchr( &init_data[4], SPI_READ_TEST_REG_LSB, (size_t) 8 ) ) && - ( NULL == memchr( &init_data[4], SPI_READ_TEST_REG_LSB_SFT1, (size_t) 8 ) ) && - ( NULL == memchr( &init_data[4], SPI_READ_TEST_REG_LSB_SFT2, (size_t) 8 ) ) && - ( NULL == memchr( &init_data[4], SPI_READ_TEST_REG_LSB_SFT3, (size_t) 8 ) ) && - ( loop_count < (uint32_t) FEADBEAD_TIMEOUT_MS ) && - ( host_rtos_delay_milliseconds( (uint32_t) 1 ), ( 1 == 1 ) ) ); - - /* Keep/reset defaults for registers 0x0-0x4 except for, 0x0: Change word length to 32bit, set endianness, enable wakeup. 0x2: enable interrupt with status. */ -#if defined(IL_BIGENDIAN) - VERIFY_RESULT( wwd_bus_write_register_value(BUS_FUNCTION, SPI_BUS_CONTROL, (uint8_t) 4, (uint32_t) ( WORD_LENGTH_32 | (0 & ENDIAN_BIG) | ( interrupt_polarity & INTERRUPT_POLARITY_HIGH ) | WAKE_UP | (0x4 << (8*SPI_RESPONSE_DELAY)) | ((0 & STATUS_ENABLE) << (8*SPI_STATUS_ENABLE)) | ( INTR_WITH_STATUS << (8*SPI_STATUS_ENABLE)) ) ) ); -#else - VERIFY_RESULT( wwd_bus_write_register_value(BUS_FUNCTION, SPI_BUS_CONTROL, (uint8_t) 4, (uint32_t) ( WORD_LENGTH_32 | ENDIAN_BIG | ( interrupt_polarity & INTERRUPT_POLARITY_HIGH ) | WAKE_UP | (0x4 << (8*SPI_RESPONSE_DELAY)) | ((0 & STATUS_ENABLE) << (8*SPI_STATUS_ENABLE)) | ( INTR_WITH_STATUS << (8*SPI_STATUS_ENABLE)) ) ) ); -#endif - wwd_bus_gspi_32bit = WICED_TRUE; - VERIFY_RESULT( wwd_bus_read_register_value(BUS_FUNCTION, SPI_BUS_CONTROL, (uint8_t) 4, (uint8_t*)&data ) ); - - /* Check feedbead can be read - i.e. the device is alive */ - data = 0; - VERIFY_RESULT( wwd_bus_read_register_value( BUS_FUNCTION, SPI_READ_TEST_REGISTER, (uint8_t) 4, (uint8_t*) &data ) ); - - if ( data != SPI_READ_TEST_REGISTER_VALUE ) - { - WPRINT_WWD_ERROR(("Read %x, instead of 0xFEEDBEAD from the WLAN chip\n", (unsigned int)data )); - return WWD_SPI_ID_READ_FAIL; - } - - /* Make sure error interrupt bits are clear */ - VERIFY_RESULT( wwd_bus_write_register_value(BUS_FUNCTION, SPI_INTERRUPT_REGISTER, (uint8_t) 1, (uint32_t) ( DATA_UNAVAILABLE | COMMAND_ERROR | DATA_ERROR | F1_OVERFLOW ) ) ); - - /* Enable a selection of interrupts */ - VERIFY_RESULT( wwd_bus_write_register_value(BUS_FUNCTION, SPI_INTERRUPT_ENABLE_REGISTER, (uint8_t) 2, (uint32_t) ( F2_F3_FIFO_RD_UNDERFLOW | F2_F3_FIFO_WR_OVERFLOW | COMMAND_ERROR | DATA_ERROR | F2_PACKET_AVAILABLE | F1_OVERFLOW ) ) ); - - /* Request ALP */ - VERIFY_RESULT( wwd_bus_write_register_value(BACKPLANE_FUNCTION, SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, SBSDIO_ALP_AVAIL_REQ ) ); - - /* Wait until ALP is available */ - loop_count = 0; - while ( ( ( result = wwd_bus_read_register_value( BACKPLANE_FUNCTION, SDIO_CHIP_CLOCK_CSR, (uint8_t) 2, (uint8_t*) &data16 ) ) == WWD_SUCCESS ) && - ( ( data16 & SBSDIO_ALP_AVAIL ) == 0 ) && - ( loop_count < (uint32_t) ALP_AVAIL_TIMEOUT_MS ) ) - { - host_rtos_delay_milliseconds( (uint32_t) 1 ); - loop_count++; - } - if ( loop_count >= (uint32_t) ALP_AVAIL_TIMEOUT_MS ) - { - return WWD_TIMEOUT; - } - if ( result != WWD_SUCCESS ) - { - return result; - } - - /* Clear request for ALP */ - VERIFY_RESULT( wwd_bus_write_register_value(BACKPLANE_FUNCTION, SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, (uint32_t) 0) ); - - /* Download the firmware */ - result = wwd_download_firmware( ); - if ( result == WWD_UNFINISHED ) - { - host_platform_reset_wifi( WICED_TRUE ); - host_platform_power_wifi( WICED_FALSE ); - } - - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR(("Could not download firmware\n")); - return result; - } - - /* Wait for F2 to be ready */ - loop_count = 0; - while ( ( ( result = wwd_bus_read_register_value( BUS_FUNCTION, SPI_STATUS_REGISTER, (uint8_t) 4, (uint8_t*) &wwd_bus_gspi_status ) ) == WWD_SUCCESS ) && - ( ( wwd_bus_gspi_status & ( 1 << 5 ) ) == 0 ) && - ( loop_count < (uint32_t) F2_READY_TIMEOUT_MS ) ) - { - host_rtos_delay_milliseconds( (uint32_t) 1 ); - loop_count++; - } - if ( loop_count >= (uint32_t) F2_READY_TIMEOUT_MS ) - { - /* If your system fails here, it could be due to incorrect NVRAM variables. - * Check which 'wifi_nvram_image.h' file your platform is using, and - * check that it matches the WLAN device on your platform, including the - * crystal frequency. - */ - WPRINT_WWD_ERROR(("Timeout while waiting for function 2 to be ready\n")); - return WWD_TIMEOUT; - } - - wwd_chip_specific_init(); - wwd_ensure_wlan_bus_is_up(); - - return result; -} - -wwd_result_t wwd_bus_deinit( void ) -{ - wwd_allow_wlan_bus_to_sleep(); - - /* put device in reset. */ - host_platform_reset_wifi( WICED_TRUE ); - wwd_bus_set_resource_download_halt( WICED_FALSE ); - - return WWD_SUCCESS; -} - -/****************************************************** - * Function definitions for Protocol Common - ******************************************************/ - -/* - * Write a value to a register NOT on the backplane - * Prerequisites: value_length <= 4 - */ -wwd_result_t wwd_bus_write_register_value( wwd_bus_function_t function, uint32_t address, uint8_t value_length, uint32_t value ) -{ - char gspi_internal_buffer[sizeof(wwd_bus_header_t) + sizeof(uint32_t) + sizeof(uint32_t)]; - wwd_transfer_bytes_packet_t* internal_gspi_packet = (wwd_transfer_bytes_packet_t*) gspi_internal_buffer; - - /* Flip the bytes if we're not in 32 bit mode */ - if ( wwd_bus_gspi_32bit == WICED_FALSE ) - { - value = H32TO16LE(value); - } - /* Write the value and value_length into the packet */ - internal_gspi_packet->data[0] = value; - - /* Send it off */ - return wwd_bus_transfer_bytes( BUS_WRITE, function, address, value_length, internal_gspi_packet ); -} - -/* - * Write a value to a register on the backplane - * Prerequisites: value_length <= 4 - */ -wwd_result_t wwd_bus_write_backplane_value( uint32_t address, uint8_t register_length, uint32_t value ) -{ - VERIFY_RESULT( wwd_bus_set_backplane_window(address) ); - return wwd_bus_write_register_value( BACKPLANE_FUNCTION, address & BACKPLANE_ADDRESS_MASK, register_length, value ); -} - -/* - * Read the value of a register on the backplane - * Prerequisites: value_length <= 4 - */ -wwd_result_t wwd_bus_read_backplane_value( uint32_t address, uint8_t register_length, /*@out@*/ uint8_t* value ) -{ - *value = 0; - VERIFY_RESULT( wwd_bus_set_backplane_window(address) ); - return wwd_bus_read_register_value( BACKPLANE_FUNCTION, address & BACKPLANE_ADDRESS_MASK, register_length, value ); -} - -wwd_result_t wwd_bus_transfer_bytes( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, uint16_t size, /*@in@*/ /*@out@*/ wwd_transfer_bytes_packet_t* data ) -{ - uint32_t* temp; - wwd_result_t result; - uint16_t newsize; - - data->bus_header.gspi_header = (wwd_bus_gspi_header_t) ( (uint32_t) ( ( wwd_bus_gspi_command_mapping[(int)direction] & 0x1 ) << 31 ) | - (uint32_t) ( ( GSPI_INCREMENT_ADDRESS & 0x1 ) << 30 ) | - (uint32_t) ( ( function & 0x3 ) << 28 ) | - (uint32_t) ( ( address & 0x1FFFF ) << 11 ) | - (uint32_t) ( ( size & 0x7FF ) << 0 ) ); - - /* Reshuffle the bits if we're not in 32 bit mode */ - if ( wwd_bus_gspi_32bit == WICED_FALSE ) - { - /* Note: This typecast should always be valid if the buffer containing the GSpi packet has been correctly declared as 32-bit aligned */ - temp = (uint32_t*) data; - *temp = H32TO16LE(*temp); - } - - /* Round size up to 32-bit alignment */ - newsize = (uint16_t) ROUND_UP(size, 4); - - /* Ensure we are clear to write */ - if ( ( direction == BUS_WRITE ) && ( function == WLAN_FUNCTION ) ) - { - uint32_t wwd_bus_gspi_status; - uint32_t loop_count = 0; - - /* Verify the SDPCM size and stated size match */ - uint16_t* frametag_ptr = (uint16_t*) &data->data; - if ( size != *frametag_ptr ) - { - WPRINT_WWD_DEBUG(("Error - gSPI size does not match SDPCM size!\n")); - return WWD_SPI_SIZE_MISMATCH; - } - - /* Wait for WLAN FIFO to be ready to accept data */ - while ( ( ( result = wwd_bus_read_register_value( BUS_FUNCTION, SPI_STATUS_REGISTER, (uint8_t) 4, (uint8_t*) &wwd_bus_gspi_status ) ) == WWD_SUCCESS ) && - ( ( wwd_bus_gspi_status & ( 1 << 5 ) ) == 0 ) && - ( loop_count < (uint32_t) F2_READY_TIMEOUT_LOOPS ) ) - { - ++loop_count; - } - - if ( result != WWD_SUCCESS ) - { - return result; - } - - if ( loop_count >= (uint32_t) F2_READY_TIMEOUT_LOOPS ) - { - WPRINT_WWD_DEBUG(("Timeout waiting for data FIFO to be ready\n")); - return WWD_TIMEOUT; - } - - add_log_entry( LOG_TX, function, address, (unsigned long)size, (char*)&data->data ); - } - - /* Send the data */ - result = host_platform_spi_transfer( direction, (uint8_t*) data, (uint16_t) ( newsize + sizeof(wwd_bus_gspi_header_t) ) ); - - if ( direction == BUS_READ ) - { - add_log_entry( LOG_RX, function, address, (unsigned long)((function == BACKPLANE_FUNCTION)?size-4:size), (function == BACKPLANE_FUNCTION)?((char*)&data->data)+4:(char*)&data->data ); - } - - return result; -} - -/****************************************************** - * Static Function definitions - ******************************************************/ - -static wwd_result_t wwd_download_firmware( void ) -{ - uint8_t csr_val; - wwd_result_t result; - uint32_t loop_count = 0; - - VERIFY_RESULT( wwd_disable_device_core( WLAN_ARM_CORE, WLAN_CORE_FLAG_NONE ) ); - VERIFY_RESULT( wwd_disable_device_core( SOCRAM_CORE, WLAN_CORE_FLAG_NONE ) ); - VERIFY_RESULT( wwd_reset_device_core( SOCRAM_CORE, WLAN_CORE_FLAG_NONE ) ); - - VERIFY_RESULT( wwd_chip_specific_socsram_init( )); - -#ifdef MFG_TEST_ALTERNATE_WLAN_DOWNLOAD - VERIFY_RESULT( external_write_wifi_firmware_and_nvram_image( ) ); -#else - VERIFY_RESULT( wwd_bus_write_wifi_firmware_image( ) ); - VERIFY_RESULT( wwd_bus_write_wifi_nvram_image( ) ); -#endif /* ifdef MFG_TEST_ALTERNATE_WLAN_DOWNLOAD */ - - /* Take the ARM core out of reset */ - VERIFY_RESULT( wwd_reset_device_core( WLAN_ARM_CORE, WLAN_CORE_FLAG_NONE ) ); - result = wwd_device_core_is_up( WLAN_ARM_CORE ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("Could not bring ARM core up\n")); - return result; - } - - /* Wait until the HT clock is available */ - while ( ( ( result = wwd_bus_read_register_value( BACKPLANE_FUNCTION, SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, &csr_val ) ) == WWD_SUCCESS ) && - ( ( csr_val & SBSDIO_HT_AVAIL ) == 0 ) && - ( loop_count < (uint32_t) HT_AVAIL_TIMEOUT_MS ) ) - { - host_rtos_delay_milliseconds( (uint32_t) 1 ); - loop_count++; - } - if ( loop_count >= (uint32_t) HT_AVAIL_TIMEOUT_MS ) - { - return WWD_TIMEOUT; - } - if ( result != WWD_SUCCESS ) - { - return result; - } - - /* Set up the interrupt mask and enable interrupts */ - VERIFY_RESULT( wwd_bus_write_backplane_value(SDIO_INT_HOST_MASK, (uint8_t) 4, I_HMB_SW_MASK) ); - - /* Lower F2 Watermark to avoid DMA Hang in F2 when SD Clock is stopped. */ - return wwd_bus_write_backplane_value( SDIO_FUNCTION2_WATERMARK, (uint8_t) 1, (uint32_t) SPI_F2_WATERMARK ); -} - -/* - * Read the value of a register NOT on the backplane - * Prerequisites: value_length <= 4 - */ -wwd_result_t wwd_bus_read_register_value( wwd_bus_function_t function, uint32_t address, uint8_t value_length, /*@out@*/ uint8_t* value ) -{ - uint32_t* data_ptr; - wwd_result_t result; - uint8_t padding = 0; - - char gspi_internal_buffer[sizeof(wwd_bus_header_t) + sizeof(uint32_t) + sizeof(uint32_t)]; - - /* Clear the receiving part of memory and set the value_length */ - if ( function == BACKPLANE_FUNCTION ) - { - gspi_backplane_f1_read_packet_t* pkt = (gspi_backplane_f1_read_packet_t*) gspi_internal_buffer; - data_ptr = pkt->data; - padding = 4; /* Add response delay */ - } - else - { - wwd_transfer_bytes_packet_t* pkt = (wwd_transfer_bytes_packet_t*) gspi_internal_buffer; - data_ptr = pkt->data; - } - *data_ptr = 0; - result = wwd_bus_transfer_bytes( BUS_READ, function, address, (uint16_t)(value_length + padding), (wwd_transfer_bytes_packet_t*) gspi_internal_buffer ); - - memcpy( value, data_ptr, value_length ); - - return result; -} - -wwd_result_t wwd_bus_specific_wakeup( void ) -{ - uint32_t spi_bus_reg_value; - - /* Wake up WLAN SPI interface module */ - VERIFY_RESULT( wwd_bus_read_register_value( BUS_FUNCTION, SPI_BUS_CONTROL, sizeof(uint32_t), (uint8_t*)&spi_bus_reg_value ) ); - spi_bus_reg_value |= (uint32_t)( WAKE_UP ); - return wwd_bus_write_register_value( BUS_FUNCTION, SPI_BUS_CONTROL, sizeof(uint32_t), spi_bus_reg_value ); -} - -wwd_result_t wwd_bus_specific_sleep( void ) -{ - uint32_t spi_bus_reg_value; - - /* Put SPI interface block to sleep */ - VERIFY_RESULT( wwd_bus_read_register_value( BUS_FUNCTION, SPI_BUS_CONTROL, sizeof(uint32_t), (uint8_t*)&spi_bus_reg_value ) ); - spi_bus_reg_value &= ~(uint32_t) ( WAKE_UP ); - return wwd_bus_write_register_value( BUS_FUNCTION, SPI_BUS_CONTROL, sizeof(uint32_t), spi_bus_reg_value ); -} diff --git a/components/WWD/WWD/internal/bus_protocols/SPI/wwd_bus_protocol.h b/components/WWD/WWD/internal/bus_protocols/SPI/wwd_bus_protocol.h deleted file mode 100644 index 1ddb013f65002656a8ff0b2e985a60df1fd69307..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/bus_protocols/SPI/wwd_bus_protocol.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -#ifndef INCLUDED_SPI_WWD_BUS_PROTOCOL_H -#define INCLUDED_SPI_WWD_BUS_PROTOCOL_H - -#include -#include "internal/wwd_thread_internal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * Constants - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -typedef uint32_t wwd_bus_gspi_header_t; - - -#pragma pack(1) - -typedef struct -{ - wwd_bus_gspi_header_t gspi_header; -} wwd_bus_header_t; - -#pragma pack() - -#define WWD_BUS_HAS_HEADER - -#define WWD_BUS_HEADER_SIZE ( sizeof(wwd_bus_header_t) ) - -#define WWD_BUS_USE_STATUS_REPORT_SCHEME ( 1 == 1 ) - -#define WWD_BUS_MAX_BACKPLANE_TRANSFER_SIZE ( 64 ) /* Max packet size on F1 */ -#define WWD_BUS_BACKPLANE_READ_PADD_SIZE ( 4 ) - -/****************************************************** - * Function declarations - ******************************************************/ - -/****************************************************** - * Global variables - ******************************************************/ - -#ifdef __cplusplus -} /*extern "C" */ -#endif - -#endif /* ifndef INCLUDED_SPI_WWD_BUS_PROTOCOL_H */ diff --git a/components/WWD/WWD/internal/bus_protocols/SoC/4390/wwd_bus_protocol.c b/components/WWD/WWD/internal/bus_protocols/SoC/4390/wwd_bus_protocol.c deleted file mode 100644 index cabd19e7e47245d4730d87d63ab12839d159d46d..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/bus_protocols/SoC/4390/wwd_bus_protocol.c +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Broadcom WLAN SDIO Protocol interface - * - * Implements the WWD Bus Protocol Interface for SDIO - * Provides functions for initialising, de-intitialising 802.11 device, - * sending/receiving raw packets etc - */ - -#include /* For memcpy */ -#include "wwd_assert.h" -#include "network/wwd_network_constants.h" -#include "network/wwd_buffer_interface.h" -#include "internal/wwd_sdpcm.h" -#include "internal/wwd_internal.h" -#include "RTOS/wwd_rtos_interface.h" -#include "platform/wwd_platform_interface.h" -#include "internal/bus_protocols/wwd_bus_protocol_interface.h" -#include "wwd_bus_internal.h" -#include "platform_mcu_peripheral.h" -#include "chip_constants.h" -#include "wiced_resource.h" /* TODO: remove include dependency */ -#include "resources.h" /* TODO: remove include dependency */ -#include "wifi_nvram_image.h" /* TODO: remove include dependency */ - -/****************************************************** - * Macros - ******************************************************/ - -#define ROUNDUP( x, y ) ((((x) + ((y) - 1)) / (y)) * (y)) -#define htol32( i ) ( i ) - -/****************************************************** - * Constants - ******************************************************/ - -#define WLAN_MEMORY_SIZE ( 512 * 1024 ) -#define WLAN_ADDR ( 0x680000 ) -#define RAM_SZ ( 0x80000 ) - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Static Function Declarations - ******************************************************/ - -static wwd_result_t boot_wlan( void ); - -/****************************************************** - * Variable Definitions - ******************************************************/ - -static uint32_t fake_backplane_window_addr = 0; -static wiced_bool_t wwd_bus_flow_controlled = WICED_FALSE; -static volatile wiced_bool_t resource_download_aborted = WICED_FALSE; -/****************************************************** - * Function Definitions - ******************************************************/ - -/* Device data transfer functions */ -wwd_result_t wwd_bus_send_buffer( wiced_buffer_t buffer ) -{ - host_buffer_add_remove_at_front(&buffer, sizeof(wwd_buffer_header_t)); - wwd_bus_dma_transmit( buffer, host_buffer_get_current_piece_size( buffer ) ); - return WWD_SUCCESS; -} - -void wwd_bus_set_resource_download_halt( wiced_bool_t halt ) -{ - resource_download_aborted = halt; -} - -wwd_result_t wwd_bus_write_wifi_firmware_image( void ) -{ -#ifndef NO_WIFI_FIRMWARE - uint32_t offset = 0; - uint32_t total_size; - uint32_t reset_inst = 0; - uint32_t size_read; - - total_size = (uint32_t) resource_get_size( &wifi_firmware_image ); - - resource_read ( &wifi_firmware_image, 0, 4, &size_read, &reset_inst ); - - while ( total_size > offset ) - { - if ( resource_download_aborted == WICED_TRUE ) - { - return WWD_UNFINISHED; - } - resource_read ( &wifi_firmware_image, 0, WLAN_MEMORY_SIZE, &size_read, (uint8_t *)(WLAN_ADDR+offset) ); - offset += size_read; - } - - /* - * copy reset vector to FLOPS - * WLAN Address = {Programmable Register[31:18], - * Current Transaction's HADDR[17:0]} - */ - wwd_bus_write_reset_instruction( reset_inst ); -#else - wiced_assert("wifi_firmware_image is not included resource build", 0 == 1); -#endif - return WWD_SUCCESS; -} - -wwd_result_t wwd_bus_write_wifi_nvram_image( void ) -{ - uint32_t varsize, varaddr, ramsz, phys_size, varsizew; - uint32_t wlan_mem_start_addr; - - /* RAM size is 512K */ - ramsz = RAM_SZ; - wlan_mem_start_addr = 0x680000; - varsize = ROUNDUP(sizeof(wifi_nvram_image), 4); - - varaddr = (ramsz - 4) - varsize; - - varaddr += wlan_mem_start_addr; - - /* write Vars into WLAN RAM */ - memcpy((uint8_t *)varaddr, wifi_nvram_image, varsize); - - phys_size = ramsz; - - phys_size += wlan_mem_start_addr; - - varsize = ((phys_size - 4) - varaddr); - varsizew = varsize / 4; - varsizew = (~varsizew << 16) | (varsizew & 0x0000FFFF); - varsizew = htol32(varsizew); - memcpy((uint8_t *)(phys_size - 4), (uint8_t*)&varsizew, 4); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_bus_init( void ) -{ - wwd_result_t result = WWD_SUCCESS; - - host_platform_reset_wifi( WICED_TRUE ); - host_rtos_delay_milliseconds( 1 ); - host_platform_power_wifi( WICED_FALSE ); - wwd_bus_prepare_firmware_download( ); - result = boot_wlan( ); - - if ( result == WWD_SUCCESS ) - { - /* - * The enabling of SDIO internal clock is done in WLAN firmware. - * Doing many access across AXI-bridge without proper sequencing will lead more instability - */ - wwd_bus_dma_init( ); - - /* Reinitialise STDIO UART if WLAN UART (UART4) is used */ - platform_reinit_wlan_stdio_uart( ); - } - - return result; -} - -wwd_result_t wwd_bus_deinit( void ) -{ - wwd_bus_dma_deinit(); - /* put device in reset. */ - host_platform_reset_wifi( WICED_TRUE ); - resource_download_aborted = WICED_FALSE; - - return WWD_SUCCESS; -} - -uint32_t wwd_bus_packet_available_to_read( void ) -{ - /* Tell WWD thread there's always a packet to read */ - return 1; -} - -wwd_result_t wwd_bus_read_frame( wiced_buffer_t* buffer ) -{ - uint32_t intstatus; - uint16_t* hwtag; - - intstatus = wwd_bus_get_dma_interrupt_status( ); - - /* Handle DMA interrupts */ - if ( intstatus & DMA_TRANSMIT_INTERRUPT ) - { - wwd_bus_reclaim_dma_tx_packets( ); - } - - if ( wwd_bus_get_available_dma_rx_buffer_space( ) == 0 ) - { - wwd_bus_refill_dma_rx_buffer( ); - if ( wwd_bus_get_available_dma_rx_buffer_space( ) != 0 ) - { - wwd_bus_unmask_dma_interrupt(); - } - } - - - /* Handle DMA errors */ - if ( intstatus & DMA_ERROR_MASK ) - { - wwd_bus_refill_dma_rx_buffer( ); - } - /* Handle DMA receive interrupt */ - *buffer = wwd_bus_dma_receive( &hwtag ); - if ( *buffer == NULL ) - { - if ( wwd_bus_get_available_dma_rx_buffer_space( ) != 0 ) - { - wwd_bus_unmask_dma_interrupt(); - } - - return WWD_NO_PACKET_TO_RECEIVE; - } - - - host_buffer_add_remove_at_front( buffer, -(int) sizeof(wwd_buffer_header_t) ); - wwd_sdpcm_update_credit((uint8_t*)hwtag); - - wwd_bus_refill_dma_rx_buffer( ); - /* where are buffers from dma_rx and dma_getnextrxp created? */ - - return WWD_SUCCESS; - - - -} - -wwd_result_t wwd_ensure_wlan_bus_is_up( void ) -{ - platform_pmu_wifi_needed( ); - return WWD_SUCCESS; -} - -wwd_result_t wwd_allow_wlan_bus_to_sleep( void ) -{ - platform_pmu_wifi_not_needed( ); - return WWD_SUCCESS; -} - -wwd_result_t wwd_bus_set_flow_control( uint8_t value ) -{ - if ( value != 0 ) - { - wwd_bus_flow_controlled = WICED_TRUE; - } - else - { - wwd_bus_flow_controlled = WICED_FALSE; - } - return WWD_SUCCESS; -} - -wiced_bool_t wwd_bus_is_flow_controlled( void ) -{ - return wwd_bus_flow_controlled; -} - -wwd_result_t wwd_bus_poke_wlan( void ) -{ - return WWD_SUCCESS; -} - -wwd_result_t wwd_bus_set_backplane_window( uint32_t addr ) -{ - /* No such thing as a backplane window on 4390 */ - fake_backplane_window_addr = addr & (~((uint32_t)BACKPLANE_ADDRESS_MASK)); - return WWD_SUCCESS; -} - -wwd_result_t wwd_bus_transfer_bytes( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, uint16_t size, /*@in@*/ /*@out@*/ wwd_transfer_bytes_packet_t* data ) -{ - if ( function != BACKPLANE_FUNCTION ) - { - wiced_assert( "Only backplane available on 4390", 0 != 0 ); - return WWD_DOES_NOT_EXIST; - } - - if ( direction == BUS_WRITE ) - { - memcpy( (uint8_t *)(WLAN_ADDR + address + fake_backplane_window_addr), data->data, size ); - if ( address == 0 ) - { - uint32_t resetinst = *((uint32_t*)data->data); - wwd_bus_write_reset_instruction( resetinst ); - } - } - else - { - memcpy( data->data, (uint8_t *)(WLAN_ADDR + address + fake_backplane_window_addr), size ); - } - return WWD_SUCCESS; -} - -/* This function is needed so that the MTU size does not get compiled into the 4390 prebuilt library in releases */ -uint32_t wwd_bus_get_rx_packet_size( void ) -{ - return WICED_LINK_MTU; -} - -static wwd_result_t boot_wlan( void ) -{ - wwd_result_t result = WWD_SUCCESS; - -#ifdef MFG_TEST_ALTERNATE_WLAN_DOWNLOAD - - UNUSED_PARAMETER(result); - external_write_wifi_firmware_and_nvram_image( ); - -#else - - /* Load wlan firmware from sflash */ - result = wwd_bus_write_wifi_firmware_image(); - if ( result == WWD_UNFINISHED ) - { - /* for user abort, then put wifi module into known good state */ - host_platform_reset_wifi( WICED_TRUE ); - /* power wifi is a no-op, so don't need to do anything there */ - } - if ( result != WWD_SUCCESS ) - { - /* stop here and return control to the user */ - return result; - } /* Load nvram from sflash */ - wwd_bus_write_wifi_nvram_image( ); - -#endif /* ifdef MFG_TEST_ALTERNATE_WLAN_DOWNLOAD */ - - /* init wlan uart */ - wwd_bus_init_wlan_uart(); - - /* Reset ARM core */ - wwd_bus_reset_wlan_core( ); - - host_rtos_delay_milliseconds( 200 ); - - return WWD_SUCCESS; -} diff --git a/components/WWD/WWD/internal/bus_protocols/SoC/4390/wwd_bus_protocol.h b/components/WWD/WWD/internal/bus_protocols/SoC/4390/wwd_bus_protocol.h deleted file mode 100644 index dabd813e1be737de5fa97a504e01cbc4b2e6147a..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/bus_protocols/SoC/4390/wwd_bus_protocol.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#ifndef INCLUDED_SOC_4390_WWD_BUS_PROTOCOL_H -#define INCLUDED_SOC_4390_WWD_BUS_PROTOCOL_H - - -#include "wwd_buffer.h" -#include "internal/wwd_thread_internal.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * Constants - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - - -#pragma pack(1) - -typedef struct -{ - char dma_descriptor[8]; -} wwd_bus_header_t; - -#pragma pack() - -#define WWD_BUS_HAS_HEADER - -#define WWD_BUS_HEADER_SIZE ( sizeof(wwd_bus_header_t) ) - -#define WWD_BUS_USE_STATUS_REPORT_SCHEME ( 1 == 1 ) /* read the section "Interrupt and Status logic" in TWIKI */ - -#define WWD_BUS_MAX_BACKPLANE_TRANSFER_SIZE ( WICED_PAYLOAD_MTU ) -#define WWD_BUS_BACKPLANE_READ_PADD_SIZE ( 0 ) - -/****************************************************** - * Function declarations - ******************************************************/ - - -/****************************************************** - * Global variables - ******************************************************/ - -#ifdef __cplusplus -} /*extern "C" */ -#endif - -#endif /* ifndef INCLUDED_SOC_4390_WWD_BUS_PROTOCOL_H */ diff --git a/components/WWD/WWD/internal/bus_protocols/SoC/43909/wwd_bus_protocol.c b/components/WWD/WWD/internal/bus_protocols/SoC/43909/wwd_bus_protocol.c deleted file mode 100644 index 5cf23c5033fa4ef55cb02a051cfd172198bec0f3..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/bus_protocols/SoC/43909/wwd_bus_protocol.c +++ /dev/null @@ -1,660 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Broadcom WLAN SDIO Protocol interface - * - * Implements the WWD Bus Protocol Interface for SDIO - * Provides functions for initialising, de-intitialising 802.11 device, - * sending/receiving raw packets etc - */ - - -#include /* For memcpy */ -#include "wwd_assert.h" -#include "network/wwd_buffer_interface.h" -#include "internal/wwd_sdpcm.h" -#include "internal/wwd_internal.h" -#include "RTOS/wwd_rtos_interface.h" -#include "platform/wwd_platform_interface.h" -#include "internal/bus_protocols/wwd_bus_protocol_interface.h" -#include "chip_constants.h" -#include "wiced_resource.h" /* TODO: remove include dependency */ -#include "wiced_deep_sleep.h" -#include "resources.h" /* TODO: remove include dependency */ -#include "platform_map.h" -#include "platform_mcu_peripheral.h" -#include "wifi_nvram_image.h" /* TODO: remove include dependency */ -#include "wiced_utilities.h" -#include "wiced_resource.h" -#include "platform_m2m.h" -#include "platform_peripheral.h" -#include "platform/wwd_bus_interface.h" - -/****************************************************** - * Macros - ******************************************************/ - -#define VERIFY_RESULT( x ) { wwd_result_t verify_result; verify_result = (x); if ( verify_result != WWD_SUCCESS ) return verify_result; } - -#define ROUNDUP(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) - -/****************************************************** - * Constants - ******************************************************/ - -#define I_XI (1 << 24) /* Transmit Interrupt */ - -#define WLAN_RAM_STARTING_ADDRESS PLATFORM_ATCM_RAM_BASE(0x0) - -#define FF_ROM_SHADOW_INDEX_REGISTER *((volatile uint32_t*)(PLATFORM_WLANCR4_REGBASE(0x080))) -#define FF_ROM_SHADOW_DATA_REGISTER *((volatile uint32_t*)(PLATFORM_WLANCR4_REGBASE(0x084))) - -#ifndef PLATFORM_WLAN_DMA_RX_UNDERFLOW_THRESH -#define PLATFORM_WLAN_DMA_RX_UNDERFLOW_THRESH 3 -#endif - -#ifndef PLATFORM_WLAN_ALLOW_BUS_TO_SLEEP_DELAY_MS -#define PLATFORM_WLAN_ALLOW_BUS_TO_SLEEP_DELAY_MS 10 -#endif - -#define PLATFORM_WLAN_ALLOW_BUS_TO_SLEEP_INVALID_MS ((uint32_t)-1) - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Variables - ******************************************************/ - -/* Variables represent state and has to be reset in wwd_bus_deinit() */ -static wiced_bool_t bus_is_up = WICED_FALSE; -static wiced_bool_t WICED_DEEP_SLEEP_SAVED_VAR(wwd_bus_flow_controlled) = WICED_FALSE; -static uint32_t fake_backplane_window_addr = 0; -static volatile wiced_bool_t refill_underflow = WICED_FALSE; -static volatile wiced_bool_t resource_download_aborted = WICED_FALSE; - -#if PLATFORM_WLAN_ALLOW_BUS_TO_SLEEP_DELAY_MS -static wwd_time_t delayed_bus_release_deadline = 0; -static wiced_bool_t delayed_bus_release_scheduled = WICED_FALSE; -static uint32_t delayed_bus_release_timeout_ms = PLATFORM_WLAN_ALLOW_BUS_TO_SLEEP_DELAY_MS; -static volatile uint32_t delayed_bus_release_timeout_ms_request = PLATFORM_WLAN_ALLOW_BUS_TO_SLEEP_INVALID_MS; -#define DELAYED_BUS_RELEASE_SCHEDULE(schedule) do { delayed_bus_release_scheduled = schedule; delayed_bus_release_deadline = 0; } while(0) -#else -#define DELAYED_BUS_RELEASE_SCHEDULE(schedule) do {} while(0) -#endif - -/****************************************************** - * Function declarations - ******************************************************/ - -static wwd_result_t boot_wlan( void ); -static wwd_result_t shutdown_wlan(void); -static void write_reset_instruction( uint32_t reset_inst ); - -/****************************************************** - * Function definitions - ******************************************************/ - -wwd_result_t wwd_bus_send_buffer( wiced_buffer_t buffer ) -{ - m2m_dma_tx_data( buffer ); - DELAYED_BUS_RELEASE_SCHEDULE( WICED_TRUE ); - return WWD_SUCCESS; -} - -wwd_result_t wwd_bus_init( void ) -{ - wwd_result_t result = WWD_SUCCESS; - - PLATFORM_WLAN_POWERSAVE_RES_UP(); - result = boot_wlan(); - PLATFORM_WLAN_POWERSAVE_RES_DOWN( NULL, WICED_FALSE ); - - platform_watchdog_kick(); - - if ( result == WWD_SUCCESS ) - { - M2M_INIT_DMA_SYNC(); - } - - return result; -} - -wwd_result_t wwd_bus_resume_after_deep_sleep( void ) -{ - M2M_INIT_DMA_SYNC(); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_bus_deinit( void ) -{ - while ( wwd_allow_wlan_bus_to_sleep() == WWD_PENDING ) - { - host_rtos_delay_milliseconds( 1 ); - } - - PLATFORM_WLAN_POWERSAVE_RES_UP(); - - /* Down M2M and WLAN */ - m2m_deinit_dma(); - shutdown_wlan(); - - /* Put WLAN to reset. */ - host_platform_reset_wifi( WICED_TRUE ); - - PLATFORM_WLAN_POWERSAVE_RES_DOWN( NULL, WICED_FALSE ); - - /* Force resource down even if resource up/down is unbalanced */ - PLATFORM_WLAN_POWERSAVE_RES_DOWN( NULL, WICED_TRUE ); - - /* Reset all state variables */ - bus_is_up = WICED_FALSE; - wwd_bus_flow_controlled = WICED_FALSE; - fake_backplane_window_addr = 0; - refill_underflow = WICED_FALSE; - resource_download_aborted = WICED_FALSE; - DELAYED_BUS_RELEASE_SCHEDULE( WICED_FALSE ); - - return WWD_SUCCESS; -} - -uint32_t wwd_bus_packet_available_to_read(void) -{ - return 1; -} - -static void wwd_bus_refill_dma( void ) -{ - /* - * Set flag and clear it later if filled above threshold. - * Done this way if packet is freed during m2m_refill_dma() - * it may be too late to set flag. - */ - - refill_underflow = WICED_TRUE; - - m2m_refill_dma( ); - - if ( m2m_rxactive_dma() > PLATFORM_WLAN_DMA_RX_UNDERFLOW_THRESH ) - { - refill_underflow = WICED_FALSE; - } -} - -wwd_result_t wwd_bus_read_frame( wiced_buffer_t* buffer ) -{ - wwd_result_t result = WWD_SUCCESS; - uint32_t intstatus; - uint16_t* hwtag; - void* packet; - wiced_bool_t signal_txdone; - - M2M_INIT_DMA_ASYNC( ); - - wwd_bus_refill_dma( ); - - intstatus = m2m_read_intstatus( &signal_txdone ); - - /* Tell peer about txdone event */ - if ( signal_txdone ) - { - wwd_ensure_wlan_bus_is_up( ); - m2m_signal_txdone( ); - DELAYED_BUS_RELEASE_SCHEDULE( WICED_TRUE ); - } - - /* Handle DMA interrupts */ - if ( ( intstatus & I_XI ) != 0 ) - { - WPRINT_WWD_INFO(("DMA: TX reclaim\n")); - m2m_dma_tx_reclaim( ); - } - - /* Handle DMA receive interrupt */ - packet = m2m_read_dma_packet( &hwtag ); - if ( packet == NULL ) - { - WPRINT_WWD_INFO(("intstatus: 0x%x, NO PACKET\n", (uint)intstatus)); - result = WWD_NO_PACKET_TO_RECEIVE; - } - else - { - *buffer = packet; - WPRINT_WWD_INFO(("read pkt , p0: 0x%x\n", (uint)packet)); - - /* move the data pointer 12 bytes(sizeof(wwd_buffer_header_t)) - * back to the start of the pakcet - */ - host_buffer_add_remove_at_front( buffer, -(int)sizeof(wwd_buffer_header_t) ); - wwd_sdpcm_update_credit( (uint8_t*) hwtag ); - - DELAYED_BUS_RELEASE_SCHEDULE( WICED_TRUE ); - } - - wwd_bus_refill_dma( ); - - return result; -} - -wwd_result_t wwd_ensure_wlan_bus_is_up( void ) -{ - if ( bus_is_up == WICED_FALSE ) - { - M2M_POWERSAVE_COMM_TX_BEGIN( ); - bus_is_up = WICED_TRUE; - } - - return WWD_SUCCESS; -} - -wwd_result_t wwd_allow_wlan_bus_to_sleep( void ) -{ - wwd_result_t result = WWD_SUCCESS; - - if ( bus_is_up == WICED_TRUE ) - { - if ( M2M_POWERSAVE_COMM_TX_END( ) ) - { - bus_is_up = WICED_FALSE; - } - else - { - /* - * Not able to finish communications now, let's try later. - * Returning this error code tells that WWD thread must not sleep and return to calling us as soon as possible. - */ - result = WWD_PENDING; - } - } - - return result; -} - -wwd_result_t wwd_bus_set_flow_control( uint8_t value ) -{ - if ( value != 0 ) - { - wwd_bus_flow_controlled = WICED_TRUE; - } - else - { - wwd_bus_flow_controlled = WICED_FALSE; - } - return WWD_SUCCESS; -} - -wiced_bool_t wwd_bus_is_flow_controlled( void ) -{ - return wwd_bus_flow_controlled; -} - -void platform_wlan_powersave_set_delayed_release_milliseconds( uint32_t time_ms ) -{ -#if PLATFORM_WLAN_ALLOW_BUS_TO_SLEEP_DELAY_MS - - delayed_bus_release_timeout_ms_request = time_ms; - wwd_thread_notify( ); - -#else - - UNUSED_PARAMETER( time_ms ); - -#endif /* PLATFORM_WLAN_ALLOW_BUS_TO_SLEEP_DELAY_MS */ -} - -static uint32_t wwd_handle_delayed_bus_release( void ) -{ - uint32_t time_until_release = 0; - -#if PLATFORM_WLAN_ALLOW_BUS_TO_SLEEP_DELAY_MS - - if ( delayed_bus_release_timeout_ms_request != PLATFORM_WLAN_ALLOW_BUS_TO_SLEEP_INVALID_MS ) - { - wiced_bool_t schedule = ( ( delayed_bus_release_scheduled != 0 ) || ( delayed_bus_release_deadline != 0 ) ) ? WICED_TRUE : WICED_FALSE; - uint32_t flags; - - WICED_SAVE_INTERRUPTS( flags ); - delayed_bus_release_timeout_ms = delayed_bus_release_timeout_ms_request; - delayed_bus_release_timeout_ms_request = PLATFORM_WLAN_ALLOW_BUS_TO_SLEEP_INVALID_MS; - WICED_RESTORE_INTERRUPTS( flags ); - - DELAYED_BUS_RELEASE_SCHEDULE( schedule ); - } - - if ( delayed_bus_release_scheduled ) - { - delayed_bus_release_scheduled = WICED_FALSE; - - if ( delayed_bus_release_timeout_ms != 0 ) - { - delayed_bus_release_deadline = host_rtos_get_time() + delayed_bus_release_timeout_ms; - time_until_release = delayed_bus_release_timeout_ms; - } - } - else if ( delayed_bus_release_deadline ) - { - wwd_time_t now = host_rtos_get_time( ); - - if ( delayed_bus_release_deadline - now <= delayed_bus_release_timeout_ms ) - { - time_until_release = delayed_bus_release_deadline - now; - } - - if ( time_until_release == 0 ) - { - delayed_bus_release_deadline = 0; - } - } - - if ( time_until_release != 0 ) - { - if ( !bus_is_up ) - { - time_until_release = 0; - } - else if ( platform_mcu_powersave_is_permitted( ) && (platform_mcu_powersave_get_mode( ) == PLATFORM_MCU_POWERSAVE_MODE_DEEP_SLEEP ) ) - { - time_until_release = 0; - } - } -#endif /* PLATFORM_WLAN_ALLOW_BUS_TO_SLEEP_DELAY_MS */ - - return time_until_release; -} - -void wwd_wait_for_wlan_event( host_semaphore_type_t* transceive_semaphore ) -{ - uint32_t timeout_ms = 1; - uint32_t delayed_release_timeout_ms; - wwd_result_t result; - - REFERENCE_DEBUG_ONLY_VARIABLE( result ); - - delayed_release_timeout_ms = wwd_handle_delayed_bus_release( ); - if ( delayed_release_timeout_ms != 0 ) - { - timeout_ms = delayed_release_timeout_ms; - } - else - { - result = wwd_allow_wlan_bus_to_sleep( ); - wiced_assert( "Error setting wlan sleep", ( result == WWD_SUCCESS ) || ( result == WWD_PENDING ) ); - - if ( result == WWD_SUCCESS ) - { - timeout_ms = NEVER_TIMEOUT; - } - } - -#ifdef M2M_RX_POLL_MODE - - UNUSED_PARAMETER( transceive_semaphore ); - UNUSED_VAR( timeout_ms ); - UNUSED_VAR( delayed_release_timeout_ms ); - host_rtos_delay_milliseconds( 10 ); - -#else - - host_platform_bus_enable_interrupt( ); - - result = host_rtos_get_semaphore( transceive_semaphore, timeout_ms, WICED_FALSE ); - wiced_assert("Could not get wwd sleep semaphore\n", ( result == WWD_SUCCESS ) || ( result == WWD_TIMEOUT ) ); - -#endif /* M2M_RX_POLL_MODE */ -} - -static void wwd_notify_thread_atomically( void ) -{ - uint32_t flags; - - WICED_SAVE_INTERRUPTS( flags ); - - wwd_thread_notify_irq(); - - WICED_RESTORE_INTERRUPTS( flags ); -} - -void host_platform_bus_buffer_freed( wwd_buffer_dir_t direction ) -{ - if ( direction == WWD_NETWORK_RX ) - { - if ( refill_underflow ) - { - refill_underflow = WICED_FALSE; - wwd_notify_thread_atomically(); - } - } -} - -/* - * copy reset vector to FLOPS - * WLAN Address = {Programmable Register[31:18], - * Current Transaction's HADDR[17:0]} - */ -static void write_reset_instruction( uint32_t reset_instruction ) -{ - FF_ROM_SHADOW_INDEX_REGISTER = 0x0; - FF_ROM_SHADOW_DATA_REGISTER = reset_instruction; -} - -void wwd_bus_set_resource_download_halt( wiced_bool_t halt ) -{ - resource_download_aborted = halt; -} - -wwd_result_t wwd_bus_write_wifi_firmware_image( void ) -{ -#ifndef NO_WIFI_FIRMWARE - uint32_t offset = 0; - uint32_t total_size; - uint32_t size_read; - uint32_t reset_instruction; - - /* Halt ARM and remove from reset */ - WPRINT_WWD_INFO(("Reset wlan core..\n")); - VERIFY_RESULT( wwd_reset_device_core( WLAN_ARM_CORE, WLAN_CORE_FLAG_CPU_HALT ) ); - - total_size = (uint32_t) resource_get_size( &wifi_firmware_image ); - - resource_read ( &wifi_firmware_image, 0, 4, &size_read, &reset_instruction ); - - while ( total_size > offset ) - { - if ( resource_download_aborted == WICED_TRUE ) - { - return WWD_UNFINISHED; - } - - resource_read ( &wifi_firmware_image, 0, PLATFORM_WLAN_RAM_SIZE, &size_read, (uint8_t *)(WLAN_RAM_STARTING_ADDRESS+offset) ); - offset += size_read; - } - - WPRINT_WWD_INFO(("load_wlan_fw: write reset_inst : 0x%x\n", (uint)reset_instruction)); - - write_reset_instruction( reset_instruction ); -#else - wiced_assert("wifi_firmware_image is not included resource build", 0 == 1); -#endif - - return WWD_SUCCESS; -} - -/* - * Load the nvram to the bottom of the WLAN TCM - */ -wwd_result_t wwd_bus_write_wifi_nvram_image( void ) -{ - uint32_t nvram_size; - uint32_t nvram_destination_address; - uint32_t nvram_size_in_words; - - nvram_size = ROUNDUP(sizeof(wifi_nvram_image), 4); - - /* Put the NVRAM image at the end of RAM leaving the last 4 bytes for the size */ - nvram_destination_address = ( PLATFORM_WLAN_RAM_SIZE - 4 ) - nvram_size; - nvram_destination_address += WLAN_RAM_STARTING_ADDRESS; - - /* Write NVRAM image into WLAN RAM */ - memcpy( (uint8_t *) nvram_destination_address, wifi_nvram_image, sizeof( wifi_nvram_image ) ); - - /* Calculate the NVRAM image size in words (multiples of 4 bytes) and its bitwise inverse */ - nvram_size_in_words = nvram_size / 4; - nvram_size_in_words = ( ~nvram_size_in_words << 16 ) | ( nvram_size_in_words & 0x0000FFFF ); - - memcpy( (uint8_t*) ( WLAN_RAM_STARTING_ADDRESS + PLATFORM_WLAN_RAM_SIZE - 4 ), (uint8_t*) &nvram_size_in_words, 4 ); - - return WWD_SUCCESS; -} - -#ifdef WWD_TEST_NVRAM_OVERRIDE -wwd_result_t wwd_bus_get_wifi_nvram_image( char** nvram, uint32_t* size) -{ - if (nvram == NULL || size == NULL) - { - return WICED_ERROR; - } - - *nvram = (char *)wifi_nvram_image; - *size = sizeof(wifi_nvram_image); - - return WWD_SUCCESS; -} -#endif - -static wwd_result_t boot_wlan(void) -{ - wwd_result_t result = WICED_SUCCESS; - - /* Load WLAN firmware & NVRAM */ -#ifdef MFG_TEST_ALTERNATE_WLAN_DOWNLOAD - - UNUSED_PARAMETER(result); - VERIFY_RESULT( external_write_wifi_firmware_and_nvram_image( ) ); - -#else - - /* Load wlan firmware from sflash */ - result = wwd_bus_write_wifi_firmware_image(); - if ( result == WWD_UNFINISHED ) - { - /* for user abort, then put wifi module into known good state */ - host_platform_reset_wifi( WICED_TRUE ); - /* power wifi is a no-op, so don't need to do anything there */ - } - if ( result != WWD_SUCCESS ) - { - /* stop here and return control to the user */ - return result; - } - VERIFY_RESULT( wwd_bus_write_wifi_nvram_image( ) ); - -#endif /* ifdef MFG_TEST_ALTERNATE_WLAN_DOWNLOAD */ - - /* Release ARM core */ - WPRINT_WWD_INFO(("Release WLAN core..\n")); - VERIFY_RESULT( wwd_wlan_armcore_run( WLAN_ARM_CORE, WLAN_CORE_FLAG_NONE ) ); - - return WWD_SUCCESS; -} - -static wwd_result_t shutdown_wlan(void) -{ - /* disable wlan core */ - VERIFY_RESULT( wwd_disable_device_core( WLAN_ARM_CORE, WLAN_CORE_FLAG_CPU_HALT ) ); - - /* Stop wlan side M2MDMA */ - m2m_wlan_dma_deinit(); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_bus_set_backplane_window( uint32_t addr ) -{ - /* No such thing as a backplane window on 4390 */ - fake_backplane_window_addr = addr & (~((uint32_t)BACKPLANE_ADDRESS_MASK)); - return WWD_SUCCESS; -} - - - -wwd_result_t wwd_bus_write_backplane_value( uint32_t address, uint8_t register_length, uint32_t value ) -{ - MEMORY_BARRIER_AGAINST_COMPILER_REORDERING(); - - if ( register_length == 4 ) - { - REGISTER_WRITE_WITH_BARRIER( uint32_t, address, value ); - } - else if ( register_length == 2 ) - { - REGISTER_WRITE_WITH_BARRIER( uint16_t, address, value ); - } - else if ( register_length == 1 ) - { - REGISTER_WRITE_WITH_BARRIER( uint8_t, address, value ); - } - else - { - return WICED_ERROR; - } - - return WICED_SUCCESS; -} - -wwd_result_t wwd_bus_read_backplane_value( uint32_t address, uint8_t register_length, /*@out@*/ uint8_t* value ) -{ - MEMORY_BARRIER_AGAINST_COMPILER_REORDERING(); - - if ( register_length == 4 ) - { - *((uint32_t*)value) = REGISTER_READ( uint32_t, address ); - } - else if ( register_length == 2 ) - { - *((uint16_t*)value) = REGISTER_READ( uint16_t, address ); - } - else if ( register_length == 1 ) - { - *value = REGISTER_READ( uint8_t, address ); - } - else - { - return WICED_ERROR; - } - - return WICED_SUCCESS; -} - -wwd_result_t wwd_bus_transfer_bytes( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, uint16_t size, /*@in@*/ /*@out@*/ wwd_transfer_bytes_packet_t* data ) -{ - if ( function != BACKPLANE_FUNCTION ) - { - wiced_assert( "Only backplane available on 43909", 0 != 0 ); - return WWD_DOES_NOT_EXIST; - } - - if ( direction == BUS_WRITE ) - { - memcpy( (uint8_t *)(address + fake_backplane_window_addr), data->data, size ); - if ( address == 0 ) - { - uint32_t resetinst = *((uint32_t*)data->data); - write_reset_instruction( resetinst ); - } - } - else - { - memcpy( data->data, (uint8_t *)(address + fake_backplane_window_addr), size ); - } - return WWD_SUCCESS; -} diff --git a/components/WWD/WWD/internal/bus_protocols/SoC/43909/wwd_bus_protocol.h b/components/WWD/WWD/internal/bus_protocols/SoC/43909/wwd_bus_protocol.h deleted file mode 100644 index 094b964143b05fbe4671b1f4df4aab2f5e29c0ca..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/bus_protocols/SoC/43909/wwd_bus_protocol.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#ifndef INCLUDED_SOC_4390_WWD_BUS_PROTOCOL_H -#define INCLUDED_SOC_4390_WWD_BUS_PROTOCOL_H - - -#include "wwd_buffer.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * Macros - ******************************************************/ - -#define WWD_BUS_HAS_HEADER - -#define WWD_BUS_HEADER_SIZE (sizeof(wwd_bus_header_t)) - -/* read the section "Interrupt and Status logic" in TWIKI */ -#ifdef M2M_RX_POLL_MODE -#define WWD_BUS_USE_STATUS_REPORT_SCHEME (1==1) -#else -#define WWD_BUS_USE_STATUS_REPORT_SCHEME (1==0) -#endif - -#define WWD_BUS_MAX_BACKPLANE_TRANSFER_SIZE ( WICED_PAYLOAD_MTU ) -#define WWD_BUS_BACKPLANE_READ_PADD_SIZE ( 0 ) - -#define WWD_WLAN_KEEP_AWAKE() -#define WWD_WLAN_LET_SLEEP() -#define WWD_WLAN_MAY_SLEEP() (1==1) - -/****************************************************** - * Structures - ******************************************************/ - -#pragma pack(1) - -typedef struct -{ - char dma_descriptor[8]; -} wwd_bus_header_t; - -#pragma pack() - -/****************************************************** - * Function declarations - ******************************************************/ - -/****************************************************** - * Global variables - ******************************************************/ - -#ifdef __cplusplus -} /*extern "C" */ -#endif - -#endif /* ifndef INCLUDED_SOC_4390_WWD_BUS_PROTOCOL_H */ diff --git a/components/WWD/WWD/internal/bus_protocols/wwd_bus_common.c b/components/WWD/WWD/internal/bus_protocols/wwd_bus_common.c deleted file mode 100644 index 0f4123f32fde848206c03c39c39ff1eb5f3144d6..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/bus_protocols/wwd_bus_common.c +++ /dev/null @@ -1,353 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * - */ - - -#include -#include "wwd_debug.h" -#include "wwd_assert.h" -#include "network/wwd_buffer_interface.h" -#include "platform/wwd_resource_interface.h" -#include "network/wwd_network_constants.h" -#include "wwd_bus_protocol_interface.h" -#include "../wwd_internal.h" /* TODO: fix include dependency */ -#include "chip_constants.h" -#include "platform_toolchain.h" - -#define INDIRECT_BUFFER_SIZE ( 1024 ) -#define WWD_BUS_ROUND_UP_ALIGNMENT ( 64 ) -#ifdef WWD_DIRECT_RESOURCES -#define WWD_BUS_MAX_TRANSFER_SIZE ( 16 * 1024 ) -#else /* ifdef WWD_DIRECT_RESOURCES */ -#define WWD_BUS_MAX_TRANSFER_SIZE ( WWD_BUS_MAX_BACKPLANE_TRANSFER_SIZE ) -#endif /* ifdef WWD_DIRECT_RESOURCES */ - -#define VERIFY_RESULT( x ) \ - { \ - wwd_result_t verify_result; \ - verify_result = (x); \ - if ( verify_result != WWD_SUCCESS ) \ - { \ - wiced_assert( "command failed", ( 0 == 1 )); \ - return verify_result; \ - } \ - } - -static uint32_t backplane_window_current_base_address = 0; -static volatile wiced_bool_t resource_download_abort = WICED_FALSE; - -static wwd_result_t download_resource( wwd_resource_t resource, uint32_t address ); - -void wwd_bus_init_backplane_window( void ) -{ - backplane_window_current_base_address = 0; -} - -__weak wwd_result_t wwd_bus_write_wifi_firmware_image( void ) -{ - return download_resource( WWD_RESOURCE_WLAN_FIRMWARE, 0 ); -} - -__weak wwd_result_t wwd_bus_write_wifi_nvram_image( void ) -{ - wwd_result_t result; - uint32_t image_size; - - /* Get the size of the variable image */ - host_platform_resource_size( WWD_RESOURCE_WLAN_NVRAM, &image_size ); - - /* Round up the size of the image */ - image_size = ROUND_UP( image_size, WWD_BUS_ROUND_UP_ALIGNMENT ); - - /* Write image */ - result = download_resource( WWD_RESOURCE_WLAN_NVRAM, CHIP_RAM_SIZE - 4 - image_size ); - if ( result != WWD_SUCCESS ) - { - return result; - } - - /* Write the variable image size at the end */ - image_size = ( ~( image_size / 4 ) << 16 ) | ( image_size / 4 ); - - result = wwd_bus_write_backplane_value( (uint32_t) ( CHIP_RAM_SIZE - 4 ), 4, image_size ); - if ( result != WWD_SUCCESS ) - { - return result; - } - return WWD_SUCCESS; -} - -__weak void wwd_bus_set_resource_download_halt( wiced_bool_t halt ) -{ - resource_download_abort = halt; -} - -#if defined( WWD_DIRECT_RESOURCES ) - -static wwd_result_t download_resource( wwd_resource_t resource, uint32_t address ) -{ - uint32_t transfer_progress; - uint16_t transfer_size; - wwd_result_t result; - const uint8_t* image; - - uint32_t image_size; - host_platform_resource_size( resource, &image_size ); - - result = host_platform_resource_size( resource, &image_size ); - - if( result != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR(("Fatal error: download_resource doesn't exist\n")); - return result; - } - - if ( image_size <= 0 ) - { - WPRINT_WWD_ERROR(("Fatal error: download_resource cannot load with invalid size\n")); - return WWD_BADARG; - } - - host_platform_resource_read_direct( resource, (const void**)&image ); - - for ( transfer_progress = 0; transfer_progress < image_size; transfer_progress += transfer_size, address += transfer_size, image += transfer_size ) - { - if ( resource_download_abort == WICED_TRUE ) - { - WPRINT_WWD_ERROR(("Download_resource is aborted; terminating after %d iterations\n", transfer_progress)); - return WWD_UNFINISHED; - } - - /* Set the backplane window */ - if ( WWD_SUCCESS != ( result = wwd_bus_set_backplane_window( address ) ) ) - { - return result; - } - transfer_size = (uint16_t) MIN( WWD_BUS_MAX_TRANSFER_SIZE, (int) ( image_size - transfer_progress ) ); - - /* Round up the size of the chunk */ - transfer_size = (uint16_t) ROUND_UP( transfer_size, WWD_BUS_ROUND_UP_ALIGNMENT ); - - if ( ( result = wwd_bus_transfer_bytes( BUS_WRITE, BACKPLANE_FUNCTION, address & BACKPLANE_ADDRESS_MASK, transfer_size, (wwd_transfer_bytes_packet_t*) image ) ) != WWD_SUCCESS) - { - return result; - } -#if 0 - { - /* TODO: THIS VERIFY CODE IS CURRENTLY BROKEN - ONLY CHECKS 64 BYTES, NOT 16KB */ - /* Verify download of image data */ - uint8_t tmpbuff[64]; - if ( WWD_SUCCESS != ( result = wwd_bus_transfer_bytes( BUS_READ, BACKPLANE_FUNCTION, address & BACKPLANE_ADDRESS_MASK, 64, (wwd_transfer_bytes_packet_t*)tmpbuff ) ) ) - { - return result; - } - if ( 0 != memcmp( tmpbuff, image, (size_t) 64 ) ) - { - /* Verify failed */ - WPRINT_WWD_ERROR(("Verify of firmware/NVRAM image failed")); - } - } -#endif /* if 0 */ - } - return WWD_SUCCESS; -} - -#else /* ! defined( WWD_DIRECT_RESOURCES ) */ - -static wwd_result_t download_resource( wwd_resource_t resource, uint32_t address ) -{ - uint32_t transfer_progress; - - uint32_t size; - wwd_result_t result; - - result = host_platform_resource_size( resource, &size ); - - if( result != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR(("Fatal error: download_resource doesn't exist\n")); - return result; - } - - if ( size <= 0 ) - { - WPRINT_WWD_ERROR(("Fatal error: download_resource cannot load with invalid size\n")); - return WWD_BADARG; - } - - /* Transfer firmware image into the RAM */ - transfer_progress = 0; - - while ( transfer_progress < size ) - { - wiced_buffer_t buffer; - uint32_t buffer_size = INDIRECT_BUFFER_SIZE; - uint8_t* packet; - uint16_t transfer_size; - uint32_t segment_size; - - do - { - result = host_buffer_get( &buffer, WWD_NETWORK_TX, (unsigned short) ( buffer_size + sizeof(wwd_buffer_header_t) ), WICED_FALSE ); - } while ( ( result == WWD_BUFFER_UNAVAILABLE_PERMANENT ) && ( ( buffer_size >>= 1 ) > 1 ) ); - - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR(("Fatal error: download_resource cannot allocate buffer\n")); - return result; - } - packet = (uint8_t*) host_buffer_get_current_piece_data_pointer( buffer ); - - host_platform_resource_read_indirect( resource, transfer_progress, packet + sizeof(wwd_buffer_header_t), buffer_size, &segment_size ); - - for ( ; segment_size != 0; segment_size -= transfer_size, packet += transfer_size, transfer_progress += transfer_size, address += transfer_size ) - { - if ( resource_download_abort == WICED_TRUE ) - { - WPRINT_WWD_ERROR(("Download_resource is aborted; terminating after %lu iterations\n", transfer_progress)); - return WWD_UNFINISHED; - } - transfer_size = (uint16_t) MIN( 64, segment_size ); - result = wwd_bus_set_backplane_window( address ); - if ( result != WWD_SUCCESS ) - { - host_buffer_release( buffer, WWD_NETWORK_TX ); - return result; - } - result = wwd_bus_transfer_bytes( BUS_WRITE, BACKPLANE_FUNCTION, ( address & BACKPLANE_ADDRESS_MASK ), transfer_size, (wwd_transfer_bytes_packet_t*) ( packet + sizeof(wwd_buffer_queue_ptr_t)) ); - if ( result != WWD_SUCCESS ) - { - host_buffer_release( buffer, WWD_NETWORK_TX ); - return result; - } - } - - host_buffer_release( buffer, WWD_NETWORK_TX ); - } - return WWD_SUCCESS; -} - -#endif /* if defined( WWD_DIRECT_RESOURCES ) */ - -/* - * Update the backplane window registers - */ -__weak wwd_result_t wwd_bus_set_backplane_window( uint32_t addr ) -{ - wwd_result_t result = WWD_BUS_WRITE_REGISTER_ERROR; - uint32_t base = addr & ( (uint32_t) ~BACKPLANE_ADDRESS_MASK ); - - if ( base == backplane_window_current_base_address ) - { - return WWD_SUCCESS; - } - if ( ( base & 0xFF000000 ) != ( backplane_window_current_base_address & 0xFF000000 ) ) - { - if ( WWD_SUCCESS != ( result = wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_BACKPLANE_ADDRESS_HIGH, (uint8_t) 1, ( base >> 24 ) ) ) ) - { - return result; - } - } - if ( ( base & 0x0FF0000 ) != ( backplane_window_current_base_address & 0x00FF0000 ) ) - { - if ( WWD_SUCCESS != ( result = wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_BACKPLANE_ADDRESS_MID, (uint8_t) 1, ( base >> 16 ) ) ) ) - { - return result; - } - } - if ( ( base & 0x0000FF00 ) != ( backplane_window_current_base_address & 0x0000FF00 ) ) - { - if ( WWD_SUCCESS != ( result = wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_BACKPLANE_ADDRESS_LOW, (uint8_t) 1, ( base >> 8 ) ) ) ) - { - return result; - } - } - - backplane_window_current_base_address = base; - return WWD_SUCCESS; -} - -/* Default implementation of WWD bus resume function, which does nothing */ -__weak wwd_result_t wwd_bus_resume_after_deep_sleep( void ) -{ - wiced_assert( "In order to support deep-sleep platform need to implement this function", 0 ); - return WWD_UNSUPPORTED; -} - -wwd_result_t wwd_bus_transfer_backplane_bytes( wwd_bus_transfer_direction_t direction, uint32_t address, uint32_t size, /*@in@*/ /*@out@*/ uint8_t* data ) -{ - wiced_buffer_t pkt_buffer = NULL; - uint8_t* packet; - uint32_t transfer_size; - uint32_t remaining_buf_size; - wwd_result_t result; - - result = host_buffer_get( &pkt_buffer, ( direction == BUS_READ )? WWD_NETWORK_RX : WWD_NETWORK_TX, - (uint16_t) ( WWD_BUS_MAX_BACKPLANE_TRANSFER_SIZE + WWD_BUS_BACKPLANE_READ_PADD_SIZE + - WWD_BUS_HEADER_SIZE ), WICED_TRUE ); - if ( result != WWD_SUCCESS ) - { - goto done; - } - packet = (uint8_t*) host_buffer_get_current_piece_data_pointer( pkt_buffer ); - - result = wwd_ensure_wlan_bus_is_up(); - if ( result != WWD_SUCCESS ) - { - goto done; - } - - result = wwd_bus_set_backplane_window( address ); - if ( result != WWD_SUCCESS ) - { - goto done; - } - - remaining_buf_size = size; - for (; remaining_buf_size != 0; remaining_buf_size -= transfer_size, address += transfer_size ) - { - transfer_size = ( remaining_buf_size > WWD_BUS_MAX_BACKPLANE_TRANSFER_SIZE ) ? - WWD_BUS_MAX_BACKPLANE_TRANSFER_SIZE : remaining_buf_size; - - if ( direction == BUS_WRITE ) - { - memcpy( packet + WWD_BUS_HEADER_SIZE, data + size - remaining_buf_size, transfer_size ); - result = wwd_bus_transfer_bytes( direction, BACKPLANE_FUNCTION, ( address & BACKPLANE_ADDRESS_MASK ), - (uint16_t) transfer_size, (wwd_transfer_bytes_packet_t *) packet ); - if ( result != WWD_SUCCESS ) - { - goto done; - } - } - else - { - result = wwd_bus_transfer_bytes( direction, BACKPLANE_FUNCTION, ( address & BACKPLANE_ADDRESS_MASK ), - (uint16_t) ( transfer_size + WWD_BUS_BACKPLANE_READ_PADD_SIZE ), - (wwd_transfer_bytes_packet_t *) packet ); - if ( result != WWD_SUCCESS ) - { - goto done; - } - memcpy( data + size - remaining_buf_size, - packet + WWD_BUS_HEADER_SIZE + WWD_BUS_BACKPLANE_READ_PADD_SIZE, transfer_size ); - } - } - -done: - wwd_bus_set_backplane_window( CHIPCOMMON_BASE_ADDRESS ); - if ( pkt_buffer != NULL ) - { - host_buffer_release( pkt_buffer, ( direction == BUS_READ )? WWD_NETWORK_RX : WWD_NETWORK_TX ); - } - return result; -} diff --git a/components/WWD/WWD/internal/bus_protocols/wwd_bus_protocol_interface.h b/components/WWD/WWD/internal/bus_protocols/wwd_bus_protocol_interface.h deleted file mode 100644 index 97f5816ecdeb7be92cb6eb0111213c603041c6d7..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/bus_protocols/wwd_bus_protocol_interface.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -#ifndef INCLUDED_WWD_BUS_PROTOCOL_INTERFACE_H_ -#define INCLUDED_WWD_BUS_PROTOCOL_INTERFACE_H_ - -#include "wwd_constants.h" -//#include "wwd_buffer.h" -#include "wwd_bus_protocol.h" - - -#ifdef __cplusplus -extern "C" -{ -#endif - -/****************************************************** - * Constants - ******************************************************/ - -typedef enum -{ - BUS_FUNCTION = 0, - BACKPLANE_FUNCTION = 1, - WLAN_FUNCTION = 2 -} wwd_bus_function_t; - -#define BUS_FUNCTION_MASK (0x3) /* Update this if adding functions */ - -/****************************************************** - * Structures - ******************************************************/ - -#pragma pack(1) - -typedef struct -{ -#ifdef WWD_BUS_HAS_HEADER - wwd_bus_header_t bus_header; -#endif /* ifdef WWD_BUS_HAS_HEADER */ - uint32_t data[1]; -} wwd_transfer_bytes_packet_t; - -#pragma pack() - -/****************************************************** - * Function declarations - ******************************************************/ - -/* Initialisation functions */ -extern wwd_result_t wwd_bus_init ( void); -extern wwd_result_t wwd_bus_resume_after_deep_sleep ( void ); -extern wwd_result_t wwd_bus_deinit ( void ); - -/* Device register access functions */ -extern wwd_result_t wwd_bus_write_backplane_value ( uint32_t address, uint8_t register_length, uint32_t value ); -extern wwd_result_t wwd_bus_read_backplane_value ( uint32_t address, uint8_t register_length, /*@out@*/ uint8_t* value ); -extern wwd_result_t wwd_bus_write_register_value ( wwd_bus_function_t function, uint32_t address, uint8_t value_length, uint32_t value ); -extern wwd_result_t wwd_bus_read_register_value ( wwd_bus_function_t function, uint32_t address, uint8_t value_length, /*@out@*/ uint8_t* value ); - -/* Device data transfer functions */ -extern wwd_result_t wwd_bus_send_buffer ( wiced_buffer_t buffer ); -extern wwd_result_t wwd_bus_transfer_bytes ( wwd_bus_transfer_direction_t direction, wwd_bus_function_t function, uint32_t address, uint16_t size, /*@in@*/ /*@out@*/ wwd_transfer_bytes_packet_t* data ); -extern wwd_result_t wwd_bus_transfer_backplane_bytes ( wwd_bus_transfer_direction_t direction, uint32_t address, uint32_t size, /*@in@*/ /*@out@*/ uint8_t* data ); - -/* Frame transfer function */ -extern wwd_result_t wwd_bus_read_frame( /*@out@*/ wiced_buffer_t* buffer ); - -extern wwd_result_t wwd_bus_poke_wlan ( void ); -extern wwd_result_t wwd_bus_set_flow_control ( uint8_t value ); -extern wiced_bool_t wwd_bus_is_flow_controlled ( void ); -extern uint32_t wwd_bus_packet_available_to_read ( void ); -extern wwd_result_t wwd_bus_ack_interrupt ( uint32_t intstatus ); -extern wwd_result_t wwd_bus_write_wifi_firmware_image ( void ); -extern wwd_result_t wwd_bus_write_wifi_nvram_image ( void ); -extern void wwd_bus_set_resource_download_halt ( wiced_bool_t halt ); -extern void wwd_bus_init_backplane_window ( void ); -extern wwd_result_t wwd_bus_set_backplane_window ( uint32_t addr ); - -extern wwd_result_t wwd_bus_specific_wakeup( void ); -extern wwd_result_t wwd_bus_specific_sleep( void ); - -#ifdef WWD_TEST_NVRAM_OVERRIDE -extern wwd_result_t wwd_bus_get_wifi_nvram_image ( char** nvram, uint32_t* size); -#endif - -#ifdef MFG_TEST_ALTERNATE_WLAN_DOWNLOAD -extern wwd_result_t external_write_wifi_firmware_and_nvram_image ( void ); -#endif /* ifdef MFG_TEST_ALTERNATE_WLAN_DOWNLOAD */ - -/****************************************************** - * Global variables - ******************************************************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ifndef INCLUDED_WWD_BUS_PROTOCOL_INTERFACE_H_ */ diff --git a/components/WWD/WWD/internal/chips/4334x/chip_constants.h b/components/WWD/WWD/internal/chips/4334x/chip_constants.h deleted file mode 100644 index 742c3d2289fd9688949a06e17319ac0f7d64f89d..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/chips/4334x/chip_constants.h +++ /dev/null @@ -1,419 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -#ifndef INCLUDED_CHIP_CONSTANTS_H_ -#define INCLUDED_CHIP_CONSTANTS_H_ - -#include "wwd_wlioctl.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * Architecture Constants - ******************************************************/ - -/* General chip stats */ -#define CHIP_RAM_SIZE ( 512 * 1024 ) -#define SOCSRAM_SRMEM_SIZE ( 32 * 1024 ) - -/* Backplane architecture */ -#define CHIPCOMMON_BASE_ADDRESS 0x18000000 /* Chipcommon core register region */ -#define DOT11MAC_BASE_ADDRESS 0x18001000 /* dot11mac core register region */ -#define SDIO_BASE_ADDRESS 0x18002000 /* SDIOD Device core register region */ -#define WLAN_ARMCM3_BASE_ADDRESS 0x18003000 /* ARMCM3 core register region */ -#define SOCSRAM_BASE_ADDRESS 0x18004000 /* SOCSRAM core register region */ -#define BACKPLANE_ADDRESS_MASK 0x7FFF - -#define CHIP_STA_INTERFACE 0 -#define CHIP_AP_INTERFACE 1 -#define CHIP_P2P_INTERFACE 2 - -/* Maximum value of bus data credit difference */ -#define CHIP_MAX_BUS_DATA_CREDIT_DIFF 20 - -/* Chipcommon registers */ -#define CHIPCOMMON_GPIO_CONTROL ((uint32_t) (CHIPCOMMON_BASE_ADDRESS + 0x6C )) - -#define CHIPCOMMON_CORE_CAPEXT_ADDR ((uint32_t) (CHIPCOMMON_BASE_ADDRESS + 0x64c )) -#define CHIPCOMMON_CORE_CAPEXT_SR_SUPPORTED ((uint32_t) ( 1 << 1 )) - -#define CHIPCOMMON_CORE_RETENTION_CTL ((uint32_t) (CHIPCOMMON_BASE_ADDRESS + 0x670 )) -#define CHIPCOMMON_CORE_RCTL_MACPHY_DISABLE ((uint32_t) ( 1 << 26 )) -#define CHIPCOMMON_CORE_RCTL_LOGIC_DISABLE ((uint32_t) ( 1 << 27 )) - -/****************************************************** - * SDIO Constants - ******************************************************/ -/* CurrentSdiodProgGuide r23 */ - -/* Base registers */ -#define SDIO_CORE ((uint32_t) (SDIO_BASE_ADDRESS + 0x00) ) -#define SDIO_INT_STATUS ((uint32_t) (SDIO_BASE_ADDRESS + 0x20) ) -#define SDIO_TO_SB_MAILBOX ((uint32_t) (SDIO_BASE_ADDRESS + 0x40) ) -#define SDIO_TO_SB_MAILBOX_DATA ((uint32_t) (SDIO_BASE_ADDRESS + 0x48) ) -#define SDIO_TO_HOST_MAILBOX_DATA ((uint32_t) (SDIO_BASE_ADDRESS + 0x4C) ) -#define SDIO_TO_SB_MAIL_BOX ((uint32_t) (SDIO_BASE_ADDRESS + 0x40) ) -#define SDIO_INT_HOST_MASK ((uint32_t) (SDIO_BASE_ADDRESS + 0x24) ) -#define SDIO_FUNCTION_INT_MASK ((uint32_t) (SDIO_BASE_ADDRESS + 0x34) ) - - -/* SDIO Function 0 (SDIO Bus) register addresses */ - -/* SDIO Device CCCR offsets */ -/* TODO: What does CIS/CCCR stand for? */ -/* CCCR accesses do not require backpane clock */ -#define SDIOD_CCCR_REV ( (uint32_t) 0x00 ) /* CCCR/SDIO Revision */ -#define SDIOD_CCCR_SDREV ( (uint32_t) 0x01 ) /* SD Revision */ -#define SDIOD_CCCR_IOEN ( (uint32_t) 0x02 ) /* I/O Enable */ -#define SDIOD_CCCR_IORDY ( (uint32_t) 0x03 ) /* I/O Ready */ -#define SDIOD_CCCR_INTEN ( (uint32_t) 0x04 ) /* Interrupt Enable */ -#define SDIOD_CCCR_INTPEND ( (uint32_t) 0x05 ) /* Interrupt Pending */ -#define SDIOD_CCCR_IOABORT ( (uint32_t) 0x06 ) /* I/O Abort */ -#define SDIOD_CCCR_BICTRL ( (uint32_t) 0x07 ) /* Bus Interface control */ -#define SDIOD_CCCR_CAPABLITIES ( (uint32_t) 0x08 ) /* Card Capabilities */ -#define SDIOD_CCCR_CISPTR_0 ( (uint32_t) 0x09 ) /* Common CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_CISPTR_1 ( (uint32_t) 0x0A ) /* Common CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_CISPTR_2 ( (uint32_t) 0x0B ) /* Common CIS Base Address Pointer Register 2 (MSB - only bit 1 valid)*/ -#define SDIOD_CCCR_BUSSUSP ( (uint32_t) 0x0C ) /* */ -#define SDIOD_CCCR_FUNCSEL ( (uint32_t) 0x0D ) /* */ -#define SDIOD_CCCR_EXECFLAGS ( (uint32_t) 0x0E ) /* */ -#define SDIOD_CCCR_RDYFLAGS ( (uint32_t) 0x0F ) /* */ -#define SDIOD_CCCR_BLKSIZE_0 ( (uint32_t) 0x10 ) /* Function 0 (Bus) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_BLKSIZE_1 ( (uint32_t) 0x11 ) /* Function 0 (Bus) SDIO Block Size Register 1 (MSB) */ -#define SDIOD_CCCR_POWER_CONTROL ( (uint32_t) 0x12 ) /* Power Control */ -#define SDIOD_CCCR_SPEED_CONTROL ( (uint32_t) 0x13 ) /* Bus Speed Select (control device entry into high-speed clocking mode) */ -#define SDIOD_CCCR_UHS_I ( (uint32_t) 0x14 ) /* UHS-I Support */ -#define SDIOD_CCCR_DRIVE ( (uint32_t) 0x15 ) /* Drive Strength */ -#define SDIOD_CCCR_INTEXT ( (uint32_t) 0x16 ) /* Interrupt Extension */ -#define SDIOD_CCCR_BRCM_CARDCAP ( (uint32_t) 0xF0 ) /* Brcm Card Capability */ -#define SDIOD_SEP_INT_CTL ( (uint32_t) 0xF2 ) /* Separate Interrupt Control*/ -#define SDIOD_CCCR_F1INFO ( (uint32_t) 0x100 ) /* Function 1 (Backplane) Info */ -#define SDIOD_CCCR_F1HP ( (uint32_t) 0x102 ) /* Function 1 (Backplane) High Power */ -#define SDIOD_CCCR_F1CISPTR_0 ( (uint32_t) 0x109 ) /* Function 1 (Backplane) CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_F1CISPTR_1 ( (uint32_t) 0x10A ) /* Function 1 (Backplane) CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_F1CISPTR_2 ( (uint32_t) 0x10B ) /* Function 1 (Backplane) CIS Base Address Pointer Register 2 (MSB - only bit 1 valid) */ -#define SDIOD_CCCR_F1BLKSIZE_0 ( (uint32_t) 0x110 ) /* Function 1 (Backplane) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_F1BLKSIZE_1 ( (uint32_t) 0x111 ) /* Function 1 (Backplane) SDIO Block Size Register 1 (MSB) */ -#define SDIOD_CCCR_F2INFO ( (uint32_t) 0x200 ) /* Function 2 (WLAN Data FIFO) Info */ -#define SDIOD_CCCR_F2HP ( (uint32_t) 0x202 ) /* Function 2 (WLAN Data FIFO) High Power */ -#define SDIOD_CCCR_F2CISPTR_0 ( (uint32_t) 0x209 ) /* Function 2 (WLAN Data FIFO) CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_F2CISPTR_1 ( (uint32_t) 0x20A ) /* Function 2 (WLAN Data FIFO) CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_F2CISPTR_2 ( (uint32_t) 0x20B ) /* Function 2 (WLAN Data FIFO) CIS Base Address Pointer Register 2 (MSB - only bit 1 valid) */ -#define SDIOD_CCCR_F2BLKSIZE_0 ( (uint32_t) 0x210 ) /* Function 2 (WLAN Data FIFO) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_F2BLKSIZE_1 ( (uint32_t) 0x211 ) /* Function 2 (WLAN Data FIFO) SDIO Block Size Register 1 (MSB) */ -#define SDIOD_CCCR_F3INFO ( (uint32_t) 0x300 ) /* Function 3 (Bluetooth Data FIFO) Info */ -#define SDIOD_CCCR_F3HP ( (uint32_t) 0x302 ) /* Function 3 (Bluetooth Data FIFO) High Power */ -#define SDIOD_CCCR_F3CISPTR_0 ( (uint32_t) 0x309 ) /* Function 3 (Bluetooth Data FIFO) CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_F3CISPTR_1 ( (uint32_t) 0x30A ) /* Function 3 (Bluetooth Data FIFO) CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_F3CISPTR_2 ( (uint32_t) 0x30B ) /* Function 3 (Bluetooth Data FIFO) CIS Base Address Pointer Register 2 (MSB - only bit 1 valid) */ -#define SDIOD_CCCR_F3BLKSIZE_0 ( (uint32_t) 0x310 ) /* Function 3 (Bluetooth Data FIFO) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_F3BLKSIZE_1 ( (uint32_t) 0x311 ) /* Function 3 (Bluetooth Data FIFO) SDIO Block Size Register 1 (MSB) */ - - -/* SDIO Function 1 (Backplane) register addresses */ -/* Addresses 0x00000000 - 0x0000FFFF are directly access the backplane - * throught the backplane window. Addresses above 0x0000FFFF are - * registers relating to backplane access, and do not require a backpane - * clock to access them - */ -#define SDIO_GPIO_SELECT ( (uint32_t) 0x10005 ) -#define SDIO_GPIO_OUTPUT ( (uint32_t) 0x10006 ) -#define SDIO_GPIO_ENABLE ( (uint32_t) 0x10007 ) -#define SDIO_FUNCTION2_WATERMARK ( (uint32_t) 0x10008 ) -#define SDIO_DEVICE_CONTROL ( (uint32_t) 0x10009 ) -#define SDIO_BACKPLANE_ADDRESS_LOW ( (uint32_t) 0x1000A ) -#define SDIO_BACKPLANE_ADDRESS_MID ( (uint32_t) 0x1000B ) -#define SDIO_BACKPLANE_ADDRESS_HIGH ( (uint32_t) 0x1000C ) -#define SDIO_FRAME_CONTROL ( (uint32_t) 0x1000D ) -#define SDIO_CHIP_CLOCK_CSR ( (uint32_t) 0x1000E ) -#define SDIO_PULL_UP ( (uint32_t) 0x1000F ) -#define SDIO_READ_FRAME_BC_LOW ( (uint32_t) 0x1001B ) -#define SDIO_READ_FRAME_BC_HIGH ( (uint32_t) 0x1001C ) -#define SDIO_MES_BUSY_CTRL ( (uint32_t) 0x1001D ) -#define SDIO_WAKEUP_CTRL ( (uint32_t) 0x1001E ) -#define SDIO_SLEEP_CSR ( (uint32_t) 0x1001F ) - -#define I_HMB_SW_MASK ( (uint32_t) 0x000000F0 ) -#define I_HMB_FRAME_IND ( 1<<6 ) -#define FRAME_AVAILABLE_MASK I_HMB_SW_MASK - -/****************************************************** - * SPI Constants - ******************************************************/ -/* GSPI v1 */ -#define SPI_FRAME_CONTROL ( (uint32_t) 0x1000D ) - -/* Register addresses */ -#define SPI_BUS_CONTROL ( (uint32_t) 0x0000 ) -#define SPI_RESPONSE_DELAY ( (uint32_t) 0x0001 ) -#define SPI_STATUS_ENABLE ( (uint32_t) 0x0002 ) -#define SPI_RESET_BP ( (uint32_t) 0x0003 ) /* (corerev >= 1) */ -#define SPI_INTERRUPT_REGISTER ( (uint32_t) 0x0004 ) /* 16 bits - Interrupt status */ -#define SPI_INTERRUPT_ENABLE_REGISTER ( (uint32_t) 0x0006 ) /* 16 bits - Interrupt mask */ -#define SPI_STATUS_REGISTER ( (uint32_t) 0x0008 ) /* 32 bits */ -#define SPI_FUNCTION1_INFO ( (uint32_t) 0x000C ) /* 16 bits */ -#define SPI_FUNCTION2_INFO ( (uint32_t) 0x000E ) /* 16 bits */ -#define SPI_FUNCTION3_INFO ( (uint32_t) 0x0010 ) /* 16 bits */ -#define SPI_READ_TEST_REGISTER ( (uint32_t) 0x0014 ) /* 32 bits */ -#define SPI_RESP_DELAY_F0 ( (uint32_t) 0x001c ) /* 8 bits (corerev >= 3) */ -#define SPI_RESP_DELAY_F1 ( (uint32_t) 0x001d ) /* 8 bits (corerev >= 3) */ -#define SPI_RESP_DELAY_F2 ( (uint32_t) 0x001e ) /* 8 bits (corerev >= 3) */ -#define SPI_RESP_DELAY_F3 ( (uint32_t) 0x001f ) /* 8 bits (corerev >= 3) */ - -/****************************************************** - * Bit Masks - ******************************************************/ - -/* SDIOD_CCCR_REV Bits */ -#define SDIO_REV_SDIOID_MASK ( (uint32_t) 0xF0 ) /* SDIO spec revision number */ -#define SDIO_REV_CCCRID_MASK ( (uint32_t) 0x0F ) /* CCCR format version number */ - -/* SDIOD_CCCR_SDREV Bits */ -#define SD_REV_PHY_MASK ( (uint32_t) 0x0F ) /* SD format version number */ - -/* SDIOD_CCCR_IOEN Bits */ -#define SDIO_FUNC_ENABLE_1 ( (uint32_t) 0x02 ) /* function 1 I/O enable */ -#define SDIO_FUNC_ENABLE_2 ( (uint32_t) 0x04 ) /* function 2 I/O enable */ -#define SDIO_FUNC_ENABLE_3 ( (uint32_t) 0x08 ) /* function 3 I/O enable */ - -/* SDIOD_CCCR_IORDY Bits */ -#define SDIO_FUNC_READY_1 ( (uint32_t) 0x02 ) /* function 1 I/O ready */ -#define SDIO_FUNC_READY_2 ( (uint32_t) 0x04 ) /* function 2 I/O ready */ -#define SDIO_FUNC_READY_3 ( (uint32_t) 0x08 ) /* function 3 I/O ready */ - -/* SDIOD_CCCR_INTEN Bits */ -#define INTR_CTL_MASTER_EN ( (uint32_t) 0x01 ) /* interrupt enable master */ -#define INTR_CTL_FUNC1_EN ( (uint32_t) 0x02 ) /* interrupt enable for function 1 */ -#define INTR_CTL_FUNC2_EN ( (uint32_t) 0x04 ) /* interrupt enable for function 2 */ - -/* SDIOD_SEP_INT_CTL Bits */ -#define SEP_INTR_CTL_MASK ( (uint32_t) 0x01 ) /* out-of-band interrupt mask */ -#define SEP_INTR_CTL_EN ( (uint32_t) 0x02 ) /* out-of-band interrupt output enable */ -#define SEP_INTR_CTL_POL ( (uint32_t) 0x04 ) /* out-of-band interrupt polarity */ - -/* SDIOD_CCCR_INTPEND Bits */ -#define INTR_STATUS_FUNC1 ( (uint32_t) 0x02 ) /* interrupt pending for function 1 */ -#define INTR_STATUS_FUNC2 ( (uint32_t) 0x04 ) /* interrupt pending for function 2 */ -#define INTR_STATUS_FUNC3 ( (uint32_t) 0x08 ) /* interrupt pending for function 3 */ - -/* SDIOD_CCCR_IOABORT Bits */ -#define IO_ABORT_RESET_ALL ( (uint32_t) 0x08 ) /* I/O card reset */ -#define IO_ABORT_FUNC_MASK ( (uint32_t) 0x07 ) /* abort selction: function x */ - -/* SDIOD_CCCR_BICTRL Bits */ -#define BUS_CARD_DETECT_DIS ( (uint32_t) 0x80 ) /* Card Detect disable */ -#define BUS_SPI_CONT_INTR_CAP ( (uint32_t) 0x40 ) /* support continuous SPI interrupt */ -#define BUS_SPI_CONT_INTR_EN ( (uint32_t) 0x20 ) /* continuous SPI interrupt enable */ -#define BUS_SD_DATA_WIDTH_MASK ( (uint32_t) 0x03 ) /* bus width mask */ -#define BUS_SD_DATA_WIDTH_4BIT ( (uint32_t) 0x02 ) /* bus width 4-bit mode */ -#define BUS_SD_DATA_WIDTH_1BIT ( (uint32_t) 0x00 ) /* bus width 1-bit mode */ - -/* SDIOD_CCCR_CAPABLITIES Bits */ -#define SDIO_CAP_4BLS ( (uint32_t) 0x80 ) /* 4-bit support for low speed card */ -#define SDIO_CAP_LSC ( (uint32_t) 0x40 ) /* low speed card */ -#define SDIO_CAP_E4MI ( (uint32_t) 0x20 ) /* enable interrupt between block of data in 4-bit mode */ -#define SDIO_CAP_S4MI ( (uint32_t) 0x10 ) /* support interrupt between block of data in 4-bit mode */ -#define SDIO_CAP_SBS ( (uint32_t) 0x08 ) /* support suspend/resume */ -#define SDIO_CAP_SRW ( (uint32_t) 0x04 ) /* support read wait */ -#define SDIO_CAP_SMB ( (uint32_t) 0x02 ) /* support multi-block transfer */ -#define SDIO_CAP_SDC ( (uint32_t) 0x01 ) /* Support Direct commands during multi-byte transfer */ - -/* SDIOD_CCCR_POWER_CONTROL Bits */ -#define SDIO_POWER_SMPC ( (uint32_t) 0x01 ) /* supports master power control (RO) */ -#define SDIO_POWER_EMPC ( (uint32_t) 0x02 ) /* enable master power control (allow > 200mA) (RW) */ - -/* SDIOD_CCCR_SPEED_CONTROL Bits */ -#define SDIO_SPEED_SHS ( (uint32_t) 0x01 ) /* supports high-speed [clocking] mode (RO) */ -#define SDIO_SPEED_EHS ( (uint32_t) 0x02 ) /* enable high-speed [clocking] mode (RW) */ - -/* SDIOD_CCCR_BRCM_CARDCAP Bits */ -#define SDIOD_CCCR_BRCM_CARDCAP_CMD14_SUPPORT ( (uint32_t) 0x02 ) /* Supports CMD14 */ -#define SDIOD_CCCR_BRCM_CARDCAP_CMD14_EXT ( (uint32_t) 0x04 ) /* CMD14 is allowed in FSM command state */ -#define SDIOD_CCCR_BRCM_CARDCAP_CMD_NODEC ( (uint32_t) 0x08 ) /* sdiod_aos does not decode any command */ - -/* GSPI */ -#define SPI_READ_TEST_REGISTER_VALUE ( (uint32_t) 0xFEEDBEAD ) -#define SPI_READ_TEST_REG_LSB ( ( ( SPI_READ_TEST_REGISTER_VALUE ) ) & 0xff ) -#define SPI_READ_TEST_REG_LSB_SFT1 ( ( ( SPI_READ_TEST_REGISTER_VALUE << 1 ) ) & 0xff ) -#define SPI_READ_TEST_REG_LSB_SFT2 ( ( ( SPI_READ_TEST_REGISTER_VALUE << 1 ) + 1 ) & 0xff ) -#define SPI_READ_TEST_REG_LSB_SFT3 ( ( ( SPI_READ_TEST_REGISTER_VALUE +1 ) << 1 ) & 0xff ) - - -/* SPI_BUS_CONTROL Bits */ -#define WORD_LENGTH_32 ( (uint32_t) 0x01 ) /* 0/1 16/32 bit word length */ -#define ENDIAN_BIG ( (uint32_t) 0x02 ) /* 0/1 Little/Big Endian */ -#define CLOCK_PHASE ( (uint32_t) 0x04 ) /* 0/1 clock phase delay */ -#define CLOCK_POLARITY ( (uint32_t) 0x08 ) /* 0/1 Idle state clock polarity is low/high */ -#define HIGH_SPEED_MODE ( (uint32_t) 0x10 ) /* 1/0 High Speed mode / Normal mode */ -#define INTERRUPT_POLARITY_HIGH ( (uint32_t) 0x20 ) /* 1/0 Interrupt active polarity is high/low */ -#define WAKE_UP ( (uint32_t) 0x80 ) /* 0/1 Wake-up command from Host to WLAN */ - -/* SPI_RESPONSE_DELAY Bit mask */ -#define RESPONSE_DELAY_MASK 0xFF /* Configurable rd response delay in multiples of 8 bits */ - -/* SPI_STATUS_ENABLE Bits */ -#define STATUS_ENABLE ( (uint32_t) 0x01 ) /* 1/0 Status sent/not sent to host after read/write */ -#define INTR_WITH_STATUS ( (uint32_t) 0x02 ) /* 0/1 Do-not / do-interrupt if status is sent */ -#define RESP_DELAY_ALL ( (uint32_t) 0x04 ) /* Applicability of resp delay to F1 or all func's read */ -#define DWORD_PKT_LEN_EN ( (uint32_t) 0x08 ) /* Packet len denoted in dwords instead of bytes */ -#define CMD_ERR_CHK_EN ( (uint32_t) 0x20 ) /* Command error check enable */ -#define DATA_ERR_CHK_EN ( (uint32_t) 0x40 ) /* Data error check enable */ - - - -/* SPI_RESET_BP Bits*/ -#define RESET_ON_WLAN_BP_RESET ( (uint32_t) 0x04 ) /* enable reset for WLAN backplane */ -#define RESET_SPI ( (uint32_t) 0x80 ) /* reset the above enabled logic */ - - - -/* SPI_INTERRUPT_REGISTER and SPI_INTERRUPT_ENABLE_REGISTER Bits */ -#define DATA_UNAVAILABLE ( (uint32_t) 0x0001 ) /* Requested data not available; Clear by writing a "1" */ -#define F2_F3_FIFO_RD_UNDERFLOW ( (uint32_t) 0x0002 ) -#define F2_F3_FIFO_WR_OVERFLOW ( (uint32_t) 0x0004 ) -#define COMMAND_ERROR ( (uint32_t) 0x0008 ) /* Cleared by writing 1 */ -#define DATA_ERROR ( (uint32_t) 0x0010 ) /* Cleared by writing 1 */ -#define F2_PACKET_AVAILABLE ( (uint32_t) 0x0020 ) -#define F3_PACKET_AVAILABLE ( (uint32_t) 0x0040 ) -#define F1_OVERFLOW ( (uint32_t) 0x0080 ) /* Due to last write. Bkplane has pending write requests */ -#define MISC_INTR0 ( (uint32_t) 0x0100 ) -#define MISC_INTR1 ( (uint32_t) 0x0200 ) -#define MISC_INTR2 ( (uint32_t) 0x0400 ) -#define MISC_INTR3 ( (uint32_t) 0x0800 ) -#define MISC_INTR4 ( (uint32_t) 0x1000 ) -#define F1_INTR ( (uint32_t) 0x2000 ) -#define F2_INTR ( (uint32_t) 0x4000 ) -#define F3_INTR ( (uint32_t) 0x8000 ) - - - - -/* SPI_STATUS_REGISTER Bits */ -#define STATUS_DATA_NOT_AVAILABLE ( (uint32_t) 0x00000001 ) -#define STATUS_UNDERFLOW ( (uint32_t) 0x00000002 ) -#define STATUS_OVERFLOW ( (uint32_t) 0x00000004 ) -#define STATUS_F2_INTR ( (uint32_t) 0x00000008 ) -#define STATUS_F3_INTR ( (uint32_t) 0x00000010 ) -#define STATUS_F2_RX_READY ( (uint32_t) 0x00000020 ) -#define STATUS_F3_RX_READY ( (uint32_t) 0x00000040 ) -#define STATUS_HOST_CMD_DATA_ERR ( (uint32_t) 0x00000080 ) -#define STATUS_F2_PKT_AVAILABLE ( (uint32_t) 0x00000100 ) -#define STATUS_F2_PKT_LEN_MASK ( (uint32_t) 0x000FFE00 ) -#define STATUS_F2_PKT_LEN_SHIFT ( (uint32_t) 9 ) -#define STATUS_F3_PKT_AVAILABLE ( (uint32_t) 0x00100000 ) -#define STATUS_F3_PKT_LEN_MASK ( (uint32_t) 0xFFE00000 ) -#define STATUS_F3_PKT_LEN_SHIFT ( (uint32_t) 21 ) - - - - - -/* SDIO_CHIP_CLOCK_CSR Bits */ -#define SBSDIO_FORCE_ALP ( (uint32_t) 0x01 ) /* Force ALP request to backplane */ -#define SBSDIO_FORCE_HT ( (uint32_t) 0x02 ) /* Force HT request to backplane */ -#define SBSDIO_FORCE_ILP ( (uint32_t) 0x04 ) /* Force ILP request to backplane */ -#define SBSDIO_ALP_AVAIL_REQ ( (uint32_t) 0x08 ) /* Make ALP ready (power up xtal) */ -#define SBSDIO_HT_AVAIL_REQ ( (uint32_t) 0x10 ) /* Make HT ready (power up PLL) */ -#define SBSDIO_FORCE_HW_CLKREQ_OFF ( (uint32_t) 0x20 ) /* Squelch clock requests from HW */ -#define SBSDIO_ALP_AVAIL ( (uint32_t) 0x40 ) /* Status: ALP is ready */ -#define SBSDIO_HT_AVAIL ( (uint32_t) 0x80 ) /* Status: HT is ready */ -#define SBSDIO_Rev8_HT_AVAIL ( (uint32_t) 0x40 ) -#define SBSDIO_Rev8_ALP_AVAIL ( (uint32_t) 0x80 ) - - -/* SDIO_FRAME_CONTROL Bits */ -#define SFC_RF_TERM ( (uint32_t) (1 << 0) ) /* Read Frame Terminate */ -#define SFC_WF_TERM ( (uint32_t) (1 << 1) ) /* Write Frame Terminate */ -#define SFC_CRC4WOOS ( (uint32_t) (1 << 2) ) /* HW reports CRC error for write out of sync */ -#define SFC_ABORTALL ( (uint32_t) (1 << 3) ) /* Abort cancels all in-progress frames */ - -/* SDIO_TO_SB_MAIL_BOX bits corresponding to intstatus bits */ -#define SMB_NAK ( (uint32_t) (1 << 0) ) /* To SB Mailbox Frame NAK */ -#define SMB_INT_ACK ( (uint32_t) (1 << 1) ) /* To SB Mailbox Host Interrupt ACK */ -#define SMB_USE_OOB ( (uint32_t) (1 << 2) ) /* To SB Mailbox Use OOB Wakeup */ -#define SMB_DEV_INT ( (uint32_t) (1 << 3) ) /* To SB Mailbox Miscellaneous Interrupt */ - -/* SDIO_WAKEUP_CTRL bits */ -#define SBSDIO_WCTRL_WAKE_TILL_ALP_AVAIL ( (uint32_t) (1 << 0) ) /* WakeTillAlpAvail bit */ -#define SBSDIO_WCTRL_WAKE_TILL_HT_AVAIL ( (uint32_t) (1 << 1) ) /* WakeTillHTAvail bit */ - -/* SDIO_SLEEP_CSR bits */ -#define SBSDIO_SLPCSR_KEEP_SDIO_ON ( (uint32_t) (1 << 0) ) /* KeepSdioOn bit */ -#define SBSDIO_SLPCSR_DEVICE_ON ( (uint32_t) (1 << 1) ) /* DeviceOn bit */ - -#define WL_CHANSPEC_BAND_MASK 0xf000 -#define WL_CHANSPEC_BAND_SHIFT 12 -#define WL_CHANSPEC_BAND_5G 0x1000 -#define WL_CHANSPEC_BAND_2G 0x2000 -#define INVCHANSPEC 255 - -#define WL_CHANSPEC_CTL_SB_MASK 0x0300 -#define WL_CHANSPEC_CTL_SB_SHIFT 8 -#define WL_CHANSPEC_CTL_SB_LOWER 0x0100 -#define WL_CHANSPEC_CTL_SB_UPPER 0x0200 -#define WL_CHANSPEC_CTL_SB_NONE 0x0300 - -#define WL_CHANSPEC_BW_MASK 0x0C00 -#define WL_CHANSPEC_BW_SHIFT 10 -#define WL_CHANSPEC_BW_10 0x0400 -#define WL_CHANSPEC_BW_20 0x0800 -#define WL_CHANSPEC_BW_40 0x0C00 - -/* CIS accesses require backpane clock */ - - -#undef CHIP_HAS_BSSID_CNT_IN_ASSOC_PARAMS -#undef CHIP_FIRMWARE_SUPPORTS_PM_LIMIT_IOVAR - -struct ether_addr; -struct wl_join_scan_params; - -typedef struct wl_assoc_params -{ - struct ether_addr bssid; -#ifdef CHIP_HAS_BSSID_CNT_IN_ASSOC_PARAMS - uint16_t bssid_cnt; -#endif /* ifdef CHIP_HAS_BSSID_CNT_IN_ASSOC_PARAMS */ - uint32_t chanspec_num; - chanspec_t chanspec_list[1]; -} wl_assoc_params_t; -#define WL_ASSOC_PARAMS_FIXED_SIZE (sizeof(wl_assoc_params_t) - sizeof(wl_chanspec_t)) -typedef wl_assoc_params_t wl_reassoc_params_t; -#define WL_REASSOC_PARAMS_FIXED_SIZE WL_ASSOC_PARAMS_FIXED_SIZE -typedef wl_assoc_params_t wl_join_assoc_params_t; -#define WL_JOIN_ASSOC_PARAMS_FIXED_SIZE WL_ASSOC_PARAMS_FIXED_SIZE -typedef struct wl_join_params -{ - wlc_ssid_t ssid; - struct wl_assoc_params params; -} wl_join_params_t; -#define WL_JOIN_PARAMS_FIXED_SIZE (sizeof(wl_join_params_t) - sizeof(wl_chanspec_t)) - -/* extended join params */ -typedef struct wl_extjoin_params { - wlc_ssid_t ssid; /* {0, ""}: wildcard scan */ - struct wl_join_scan_params scan_params; - wl_join_assoc_params_t assoc_params; /* optional field, but it must include the fixed portion - * of the wl_join_assoc_params_t struct when it does - * present. - */ -} wl_extjoin_params_t; -#define WL_EXTJOIN_PARAMS_FIXED_SIZE (sizeof(wl_extjoin_params_t) - sizeof(chanspec_t)) - - -typedef wl_cnt_ver_seven_t wiced_counters_t; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ifndef INCLUDED_CHIP_CONSTANTS_H_ */ diff --git a/components/WWD/WWD/internal/chips/4334x/wwd_ap.c b/components/WWD/WWD/internal/chips/4334x/wwd_ap.c deleted file mode 100644 index 526667d41d2b06475d8ce34dc1197483bb676a91..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/chips/4334x/wwd_ap.c +++ /dev/null @@ -1,460 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Provides an APSTA functionality specific to the 43341B0 - */ - -#include -#include "wwd_rtos.h" -#include "wwd_events.h" -#include "wwd_assert.h" -#include "wwd_management.h" -#include "wwd_wifi.h" -#include "network/wwd_buffer_interface.h" -#include "internal/wwd_sdpcm.h" -#include "internal/wwd_internal.h" -#include "internal/wwd_ap.h" -#include "platform_toolchain.h" -#include "internal/wwd_ap_common.h" - -/****************************************************** - * Macros - ******************************************************/ - -/****************************************************** - * @cond Constants - ******************************************************/ - -#define WLC_EVENT_MSG_LINK (0x01) -#define RATE_SETTING_11_MBPS (11000000 / 500000) - -/* HT/AMPDU specific define */ -#define AMPDU_AP_DEFAULT_BA_WSIZE 2 /* AP default BA window size */ -#define AMPDU_STA_DEFAULT_BA_WSIZE 8 /* STA default BA window size */ -#define AMPDU_STA_DEFAULT_MPDU 4 -#define WEP40_KEY_LENGTH 5 -#define WEP104_KEY_LENGTH 13 -#define FORMATTED_ASCII_WEP40_KEY_LENGTH 28 /* For 5 bytes key */ -#define FORMATTED_ASCII_WEP104_KEY_LENGTH 60 /* For 13 bytes key */ - -/****************************************************** - * Enumerations - ******************************************************/ - -typedef enum -{ - BSS_AP = 3, - BSS_STA = 2, - BSS_UP = 1, - BSS_DOWN = 0 -} bss_arg_option_t; - -typedef enum -{ - WEP_OPEN_SYSTEM_AUTHENTICATION = 0, - WEP_SHARED_KEY_AUTHENTICATION = 1 -} wep_authentication_type_t; - -/** @endcond */ - -/****************************************************** - * Local Structures - ******************************************************/ - - -/****************************************************** - * Static Variables - ******************************************************/ - -wiced_bool_t wwd_wifi_ap_is_up = WICED_FALSE; -static host_semaphore_type_t wwd_wifi_sleep_flag; -static const wwd_event_num_t apsta_events[] = { WLC_E_IF, WLC_E_LINK, WLC_E_NONE }; - -/****************************************************** - * Static Function prototypes - ******************************************************/ - -static void* wwd_handle_apsta_event ( const wwd_event_header_t* event_header, const uint8_t* event_data, /*@returned@*/ void* handler_user_data ); -static wwd_result_t internal_ap_init ( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ); -wwd_result_t wwd_wifi_ap_init ( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ); -wwd_result_t wwd_wifi_ap_up ( void ); - -/****************************************************** - * Function definitions - ******************************************************/ - -static void* wwd_handle_apsta_event( const wwd_event_header_t* event_header, const uint8_t* event_data, /*@returned@*/ void* handler_user_data ) -{ - UNUSED_PARAMETER( event_header ); - UNUSED_PARAMETER( event_data ); - UNUSED_PARAMETER( handler_user_data ); - - if ( (wwd_interface_t) event_header->interface != WWD_AP_INTERFACE) - { - return handler_user_data; - } - - if ( ( ( event_header->event_type == (wwd_event_num_t) WLC_E_LINK ) && - ( event_header->interface == WWD_AP_INTERFACE ) ) || - ( event_header->event_type == WLC_E_IF ) ) - { - wwd_result_t result; - result = host_rtos_set_semaphore( &wwd_wifi_sleep_flag, WICED_FALSE ); - wiced_assert( "failed to post ap link semaphore", result == WWD_SUCCESS ); - REFERENCE_DEBUG_ONLY_VARIABLE( result ); - } - return handler_user_data; -} - -static wwd_result_t internal_ap_init( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ) -{ - wiced_bool_t wait_for_interface = WICED_FALSE; - wwd_result_t result; - wiced_buffer_t response; - wiced_buffer_t buffer; - uint32_t* data; - -#ifdef WICED_WIFI_SOFT_AP_WEP_SUPPORT_ENABLED - uint32_t* auth; - uint16_t length; -#endif - - - if ( ( ( auth_type == WICED_SECURITY_WPA_TKIP_PSK ) || ( auth_type == WICED_SECURITY_WPA2_AES_PSK ) || ( auth_type == WICED_SECURITY_WPA2_MIXED_PSK ) ) && - ( ( key_length < (uint8_t) 8 ) || ( key_length > (uint8_t) 64 ) ) ) - { - WPRINT_APP_INFO(( "Error: WPA security key length must be between 8 and 64\n" )); - return WWD_WPA_KEYLEN_BAD; - } - -#ifdef WICED_WIFI_SOFT_AP_WEP_SUPPORT_ENABLED - else if( (( auth_type == WICED_SECURITY_WEP_PSK ) || ( auth_type == WICED_SECURITY_WEP_SHARED )) && - (( key_length != FORMATTED_ASCII_WEP40_KEY_LENGTH ) && ( key_length != FORMATTED_ASCII_WEP104_KEY_LENGTH )) ) - { - WPRINT_APP_INFO(( "Error: WEP security Key length must be either 5 / 13 bytes\n" )); - return WWD_WEP_KEYLEN_BAD; - } -#endif - - if ( wwd_wifi_set_block_ack_window_size( WWD_AP_INTERFACE ) != WWD_SUCCESS ) - { - return WWD_SET_BLOCK_ACK_WINDOW_FAIL; - } - - /* Query bss state (does it exist? if so is it UP?) */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) CHIP_AP_INTERFACE; - if ( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_AP_INTERFACE ) != WWD_SUCCESS ) - { - /* Note: We don't need to release the response packet since the iovar failed */ - wait_for_interface = WICED_TRUE; - } - else - { - /* Check if the BSS is already UP, if so return */ - uint32_t* data2 = (uint32_t*) host_buffer_get_current_piece_data_pointer( response ); - if ( *data2 == (uint32_t) BSS_UP ) - { - host_buffer_release( response, WWD_NETWORK_RX ); - wwd_wifi_ap_is_up = WICED_TRUE; - return WWD_SUCCESS; - } - else - { - host_buffer_release( response, WWD_NETWORK_RX ); - } - } - - CHECK_RETURN( host_rtos_init_semaphore( &wwd_wifi_sleep_flag ) ); - - /* Register for interested events */ - CHECK_RETURN_WITH_SEMAPHORE( wwd_management_set_event_handler( apsta_events, wwd_handle_apsta_event, NULL, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Set the SSID */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 40, "bsscfg:" IOVAR_STR_SSID ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = (uint32_t) CHIP_AP_INTERFACE; /* Set the bsscfg index */ - data[1] = ssid->length; /* Set the ssid length */ - memcpy( &data[2], (uint8_t*) ssid->value, ssid->length ); - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Check if we need to wait for interface to be created */ - if ( wait_for_interface == WICED_TRUE ) - { - CHECK_RETURN_WITH_SEMAPHORE( host_rtos_get_semaphore( &wwd_wifi_sleep_flag, (uint32_t) 10000, WICED_FALSE ), &wwd_wifi_sleep_flag ); - } - - /* Set the channel */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - *data = channel; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_CHANNEL, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - -#ifdef WICED_WIFI_SOFT_AP_WEP_SUPPORT_ENABLED - if ( ( auth_type == WICED_SECURITY_WEP_PSK ) || ( auth_type == WICED_SECURITY_WEP_SHARED ) ) - { - for ( length = 0; length < key_length; length = (uint16_t) ( length + 2 + security_key[ 1 ] ) ) - { - const wiced_wep_key_t* in_key = (const wiced_wep_key_t*) &security_key[ length ]; - wl_wsec_key_t* out_key = (wl_wsec_key_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(wl_wsec_key_t) ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( out_key, &wwd_wifi_sleep_flag ); - memset( out_key, 0, sizeof(wl_wsec_key_t) ); - out_key->index = in_key->index; - out_key->len = in_key->length; - memcpy( out_key->data, in_key->data, in_key->length ); - switch ( in_key->length ) - { - case WEP40_KEY_LENGTH: - out_key->algo = (uint32_t) CRYPTO_ALGO_WEP1; - break; - case WEP104_KEY_LENGTH: - out_key->algo = (uint32_t) CRYPTO_ALGO_WEP128; - break; - default: - host_buffer_release( buffer, WWD_NETWORK_TX ); - return WWD_INVALID_KEY; - } - /* Set the first entry as primary key by default */ - if ( length == 0 ) - { - out_key->flags |= WL_PRIMARY_KEY; - } - out_key->index = htod32(out_key->index); - out_key->len = htod32(out_key->len); - out_key->algo = htod32(out_key->algo); - out_key->flags = htod32(out_key->flags); - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_KEY, buffer, NULL, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - } - - /* Set authentication type */ - auth = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( auth, &wwd_wifi_sleep_flag ); - if ( auth_type == WICED_SECURITY_WEP_SHARED ) - { - *auth = WEP_SHARED_KEY_AUTHENTICATION; /* 1 = Shared Key authentication */ - } - else - { - *auth = WEP_OPEN_SYSTEM_AUTHENTICATION; /* 0 = Open System authentication */ - } - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_AUTH, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - } -#endif - - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, "bsscfg:" IOVAR_STR_WSEC ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = (uint32_t) CHIP_AP_INTERFACE; - if ((auth_type & WPS_ENABLED) != 0) - { - data[1] = (uint32_t) ( ( auth_type & ( ~WPS_ENABLED ) ) | SES_OW_ENABLED ); - } - else - { - data[1] = (uint32_t) auth_type; - } - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - - if ( ( auth_type != WICED_SECURITY_OPEN ) && ( auth_type != WICED_SECURITY_WEP_PSK ) && ( auth_type != WICED_SECURITY_WEP_SHARED ) ) - { - wsec_pmk_t* psk; - - /* Set the wpa auth */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, "bsscfg:" IOVAR_STR_WPA_AUTH ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = (uint32_t) CHIP_AP_INTERFACE; - data[1] = (uint32_t) (auth_type == WICED_SECURITY_WPA_TKIP_PSK) ? ( WPA_AUTH_PSK ) : ( WPA2_AUTH_PSK | WPA_AUTH_PSK ); - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Set the passphrase */ - psk = (wsec_pmk_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(wsec_pmk_t) ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( psk, &wwd_wifi_sleep_flag ); - memcpy( psk->key, security_key, key_length ); - psk->key_len = key_length; - psk->flags = (uint16_t) WSEC_PASSPHRASE; - host_rtos_delay_milliseconds( 1 ); /* Delay required to allow radio firmware to be ready to receive PMK and avoid intermittent failure */ - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_WSEC_PMK, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - } - - /* Set the GMode */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - *data = (uint32_t) GMODE_AUTO; - - result = wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_GMODE, buffer, 0, WWD_AP_INTERFACE ); - if ( ( result != WWD_SUCCESS ) && ( result != WWD_WLAN_ASSOCIATED ) ) - { - wiced_assert("start_ap: Failed to set GMode\n", 0 == 1 ); - - (void) host_rtos_deinit_semaphore( &wwd_wifi_sleep_flag ); - return result; - } - - /* Set the multicast transmission rate to 11 Mbps rather than the default 1 Mbps */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_2G_MULTICAST_RATE ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) RATE_SETTING_11_MBPS; - result = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_AP_INTERFACE ); - wiced_assert("start_ap: Failed to set multicast transmission rate\r\n", result == WWD_SUCCESS ); - - /* Set DTIM period */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - *data = (uint32_t) WICED_DEFAULT_SOFT_AP_DTIM_PERIOD; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_DTIMPRD, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - -#ifdef WICED_DISABLE_SSID_BROADCAST - /* Make the AP "hidden" */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_CLOSEDNET ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = (uint32_t) 1; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); -#endif - -#ifdef WICED_WIFI_ISOLATE_AP_CLIENTS - result = wwd_wifi_enable_ap_isolate( WWD_AP_INTERFACE, WICED_TRUE ); - wiced_assert("start_ap: Failed to disable intra BSS routing\r\n", result == WWD_SUCCESS ); -#endif /* WICED_WIFI_ISOLATE_AP_CLIENTS */ - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_ap_init( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ) -{ - wwd_result_t result; - - /* Keep WLAN awake while setting up softAP */ - WWD_WLAN_KEEP_AWAKE( ); - - result = internal_ap_init( ssid, auth_type, security_key, key_length, channel ); - - WWD_WLAN_LET_SLEEP( ); - - return result; -} - -wwd_result_t wwd_wifi_ap_up( void ) -{ - wiced_buffer_t buffer; - uint32_t* data; - - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = (uint32_t) CHIP_AP_INTERFACE; - data[1] = (uint32_t) BSS_UP; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Wait until AP is brought up */ - CHECK_RETURN_WITH_SEMAPHORE( host_rtos_get_semaphore( &wwd_wifi_sleep_flag, (uint32_t) 10000, WICED_FALSE ), &wwd_wifi_sleep_flag ); - - wwd_wifi_ap_is_up = WICED_TRUE; - return WWD_SUCCESS; -} - -/** Starts an infrastructure WiFi network - * @param ssid : A null terminated string containing the SSID name of the network to join - * @param auth_type : Authentication type: - * - WICED_SECURITY_OPEN - Open Security - * - WICED_SECURITY_WPA_TKIP_PSK - WPA Security - * - WICED_SECURITY_WPA2_AES_PSK - WPA2 Security using AES cipher - * - WICED_SECURITY_WPA2_MIXED_PSK - WPA2 Security using AES and/or TKIP ciphers - * - WEP security is currently unimplemented due to lack of security - * @param security_key : A byte array containing the cleartext security key for the network - * @param key_length : The length of the security_key in bytes. - * @param channel : 802.11 Channel number - * - * @return WWD_SUCCESS : if successfully creates an AP - * Error code : if an error occurred - */ -wwd_result_t wwd_wifi_start_ap( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ) -{ - CHECK_RETURN( wwd_wifi_ap_init( ssid, auth_type, security_key, key_length, channel ) ); - - CHECK_RETURN( wwd_wifi_ap_up() ); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_stop_ap( void ) -{ - uint32_t* data; - wiced_buffer_t buffer; - wiced_buffer_t response; - wwd_result_t result; - wwd_result_t result2; - - /* Query bss state (does it exist? if so is it UP?) */ - data = wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) CHIP_AP_INTERFACE; - result = wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_STA_INTERFACE ); - if ( result == WWD_WLAN_NOTFOUND ) - { - /* AP interface does not exist - i.e. it is down */ - wwd_wifi_ap_is_up = WICED_FALSE; - return WWD_SUCCESS; - } - - CHECK_RETURN( result ); - - data = (uint32_t*) host_buffer_get_current_piece_data_pointer( response ); - if ( data[0] != (uint32_t) BSS_UP ) - { - /* AP interface indicates it is not up - i.e. it is down */ - host_buffer_release( response, WWD_NETWORK_RX ); - wwd_wifi_ap_is_up = WICED_FALSE; - return WWD_SUCCESS; - } - - host_buffer_release( response, WWD_NETWORK_RX ); - - /* set BSS down */ - data = wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER( data ); - data[0] = (uint32_t) CHIP_AP_INTERFACE; - data[1] = (uint32_t) BSS_DOWN; - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_AP_INTERFACE ) ); - - /* Wait until AP is brought down */ - result = host_rtos_get_semaphore( &wwd_wifi_sleep_flag, (uint32_t) 10000, WICED_FALSE ); - result2 = host_rtos_deinit_semaphore( &wwd_wifi_sleep_flag ); - if ( result != WWD_SUCCESS ) - { - return result; - } - if ( result2 != WWD_SUCCESS ) - { - return result2; - } - - CHECK_RETURN( wwd_management_set_event_handler( apsta_events, NULL, NULL, WWD_AP_INTERFACE ) ); - - wwd_wifi_ap_is_up = WICED_FALSE; - return WWD_SUCCESS; - -} - -/** Sets the chip specific AMPDU parameters for AP and STA - * For SDK 3.0, and beyond, each chip will need it's own function for setting AMPDU parameters. - */ -wwd_result_t wwd_wifi_set_ampdu_parameters( void ) -{ - return wwd_wifi_set_ampdu_parameters_common( WWD_STA_INTERFACE, AMPDU_STA_DEFAULT_BA_WSIZE, AMPDU_STA_DEFAULT_MPDU, AMPDU_RX_FACTOR_8K ); -} - -/** Sets the chip specific AMPDU parameters for AP and STA - * For SDK 3.0, and beyond, each chip will need it's own function for setting AMPDU parameters. - */ - -wwd_result_t wwd_wifi_set_block_ack_window_size( wwd_interface_t interface ) -{ - return wwd_wifi_set_block_ack_window_size_common( interface, AMPDU_AP_DEFAULT_BA_WSIZE, AMPDU_STA_DEFAULT_BA_WSIZE ); -} diff --git a/components/WWD/WWD/internal/chips/4334x/wwd_chip_specific_functions.c b/components/WWD/WWD/internal/chips/4334x/wwd_chip_specific_functions.c deleted file mode 100644 index 2b7054f8081d89e8ba12d2e054ace801b3cec916..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/chips/4334x/wwd_chip_specific_functions.c +++ /dev/null @@ -1,319 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * - */ -#include "wwd_constants.h" -#include "wwd_wifi.h" -#include "internal/wwd_internal.h" -#include "internal/bus_protocols/wwd_bus_protocol_interface.h" - -/****************************************************** - * Macros - ******************************************************/ - -#define VERIFY_RESULT( x ) { wwd_result_t verify_result; verify_result = ( x ); if ( verify_result != WWD_SUCCESS ) return verify_result; } - -/****************************************************** - * Constants - ******************************************************/ -#define PLATFORM_WLAN_RAM_BASE ( 0x0 ) -#define PLATFORM_WLAN_RAM_SIZE ( CHIP_RAM_SIZE ) - -#define WLAN_BUS_UP_ATTEMPTS ( 1000 ) -#define KSO_WAIT_MS ( 1 ) -#define MAX_KSO_ATTEMPTS ( 64 ) - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - -#ifndef WWD_DISABLE_SAVE_RESTORE -static wwd_result_t wwd_enable_save_restore( void ); -#endif -static wiced_bool_t wwd_is_fw_sr_capable( void ); -static wwd_result_t wwd_kso_enable( wiced_bool_t enable ); - -/****************************************************** - * Variables Definitions - ******************************************************/ - -static wiced_bool_t bus_is_up = WICED_FALSE; -static wiced_bool_t save_restore_enable = WICED_FALSE; - -/****************************************************** - * Function Definitions - ******************************************************/ - -wwd_result_t wwd_wifi_read_wlan_log( char* buffer, uint32_t buffer_size ) -{ - wwd_result_t result; - uint32_t wlan_shared_address; - - /* Backplane access needs HT clock. So, disabling bus sleep */ - WWD_WLAN_KEEP_AWAKE(); - - /* FW populates the last word of RAM with wlan_shared_t struct address */ - if ( wwd_is_fw_sr_capable() == WICED_TRUE ) - { - wlan_shared_address = PLATFORM_WLAN_RAM_BASE + PLATFORM_WLAN_RAM_SIZE - SOCSRAM_SRMEM_SIZE - 4; - } - else - { - wlan_shared_address = PLATFORM_WLAN_RAM_BASE + PLATFORM_WLAN_RAM_SIZE - 4; - } - - result = wwd_wifi_read_wlan_log_unsafe( wlan_shared_address, buffer, buffer_size ); - - WWD_WLAN_LET_SLEEP(); - - return result; -} - -wwd_result_t wwd_wifi_set_custom_country_code( const wiced_country_info_t* country_code ) -{ - UNUSED_PARAMETER(country_code); - return WWD_UNSUPPORTED; -} - -wwd_result_t wwd_chip_specific_init( void ) -{ -#ifndef WWD_DISABLE_SAVE_RESTORE - return wwd_enable_save_restore(); -#else - return WWD_SUCCESS; -#endif -} - -wwd_result_t wwd_chip_specific_socsram_init( void ) -{ - return WWD_SUCCESS; -} - -wwd_result_t wwd_ensure_wlan_bus_is_up( void ) -{ - /* Ensure HT clock is up */ - if ( bus_is_up == WICED_TRUE ) - { - return WWD_SUCCESS; - } - - if ( save_restore_enable == WICED_FALSE ) - { - uint8_t csr = 0; - uint32_t attempts = (uint32_t) WLAN_BUS_UP_ATTEMPTS; - - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, (uint32_t) SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, (uint32_t) SBSDIO_HT_AVAIL_REQ ) ); - - do - { - VERIFY_RESULT( wwd_bus_read_register_value( BACKPLANE_FUNCTION, (uint32_t) SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, &csr ) ); - --attempts; - } - while ( ( ( csr & SBSDIO_HT_AVAIL ) == 0 ) && - ( attempts != 0 ) && - ( host_rtos_delay_milliseconds( (uint32_t) 1 ), 1==1 ) ); - - if (attempts == 0) - { - return WWD_SDIO_BUS_UP_FAIL; - } - else - { - bus_is_up = WICED_TRUE; - return WWD_SUCCESS; - } - } - else - { - if ( wwd_kso_enable( WICED_TRUE ) == WWD_SUCCESS ) - { - bus_is_up = WICED_TRUE; - return WWD_SUCCESS; - } - else - { - return WWD_SDIO_BUS_UP_FAIL; - } - } -} - -wwd_result_t wwd_allow_wlan_bus_to_sleep( void ) -{ - /* Clear HT clock request */ - if ( bus_is_up == WICED_TRUE ) - { - bus_is_up = WICED_FALSE; - if ( save_restore_enable == WICED_FALSE ) - { - return wwd_bus_write_register_value( BACKPLANE_FUNCTION, (uint32_t) SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, 0 ); - } - else - { - return wwd_kso_enable( WICED_FALSE ); - } - } - else - { - return WWD_SUCCESS; - } -} - -#ifndef WWD_DISABLE_SAVE_RESTORE -static wwd_result_t wwd_enable_save_restore( void ) -{ - uint8_t data; - - if ( wwd_is_fw_sr_capable() == WICED_TRUE ) - { - /* Configure WakeupCtrl register to set HtAvail request bit in chipClockCSR register - * after the sdiod core is powered on. - */ - VERIFY_RESULT( wwd_bus_read_register_value( BACKPLANE_FUNCTION, (uint32_t ) SDIO_WAKEUP_CTRL, (uint8_t ) 1, &data ) ); - data |= SBSDIO_WCTRL_WAKE_TILL_HT_AVAIL; - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, (uint32_t ) SDIO_WAKEUP_CTRL, (uint8_t ) 1, data ) ); - - /* Set brcmCardCapability to noCmdDecode mode. - * It makes sdiod_aos to wakeup host for any activity of cmd line, even though - * module won't decode cmd or respond - */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, (uint32_t ) SDIOD_CCCR_BRCM_CARDCAP, (uint8_t ) 1, SDIOD_CCCR_BRCM_CARDCAP_CMD_NODEC ) ); - - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, (uint32_t) SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, (uint32_t) SBSDIO_FORCE_HT ) ); - - /* Enable KeepSdioOn (KSO) bit for normal operation */ - VERIFY_RESULT( wwd_bus_read_register_value( BACKPLANE_FUNCTION, (uint32_t ) SDIO_SLEEP_CSR, (uint8_t ) 1, &data ) ); - if ( ( data & SBSDIO_SLPCSR_KEEP_SDIO_ON ) == 0 ) - { - data |= SBSDIO_SLPCSR_KEEP_SDIO_ON; - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, (uint32_t ) SDIO_SLEEP_CSR, (uint8_t ) 1, data ) ); - } - - /* SPI bus can be configured for sleep by default. - * KSO bit solely controls the wlan chip sleep - */ - VERIFY_RESULT( wwd_bus_specific_sleep( )); - -#ifdef WWD_SPI_IRQ_FALLING_EDGE - /* Put SPI interface block to sleep */ - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, SDIO_PULL_UP, (uint8_t) 1, 0xf )); -#endif /* WWD_SPI_IRQ_FALLING_EDGE */ - - save_restore_enable = WICED_TRUE; - } - else - { - save_restore_enable = WICED_FALSE; - } - - return WWD_SUCCESS; -} -#endif /* #ifndef WWD_DISABLE_SAVE_RESTORE */ - -static wiced_bool_t wwd_is_fw_sr_capable( void ) -{ - uint32_t core_capext; - uint32_t retention_ctl; - wiced_bool_t save_restore_capable = WICED_FALSE; - - /* check if fw initialized sr engine */ - VERIFY_RESULT( wwd_bus_read_backplane_value( (uint32_t) CHIPCOMMON_CORE_CAPEXT_ADDR, (uint8_t) 4, (uint8_t*)&core_capext )); - - if (( core_capext & CHIPCOMMON_CORE_CAPEXT_SR_SUPPORTED ) != 0 ) - { - VERIFY_RESULT( wwd_bus_read_backplane_value( (uint32_t) CHIPCOMMON_CORE_RETENTION_CTL, (uint8_t) 4, (uint8_t*)&retention_ctl )); - if (( retention_ctl & ( CHIPCOMMON_CORE_RCTL_MACPHY_DISABLE | CHIPCOMMON_CORE_RCTL_LOGIC_DISABLE )) == 0 ) - { - save_restore_capable = WICED_TRUE; - } - } - return save_restore_capable; -} - -static wwd_result_t wwd_kso_enable (wiced_bool_t enable) -{ - uint8_t write_value = 0; - uint8_t read_value = 0; - uint8_t compare_value; - uint8_t bmask; - uint32_t attempts = ( uint32_t ) MAX_KSO_ATTEMPTS; - wwd_result_t result; - - if ( enable == WICED_TRUE ) - { - write_value |= SBSDIO_SLPCSR_KEEP_SDIO_ON; - } - - /* 1st KSO write goes to AOS wake up core if device is asleep */ - /* Possibly device might not respond to this cmd. So, don't check return value here */ - /* 2 Sequential writes to KSO bit are required for SR module to wakeup */ - wwd_bus_write_register_value( BACKPLANE_FUNCTION, (uint32_t) SDIO_SLEEP_CSR, (uint8_t) 1, write_value ); - wwd_bus_write_register_value( BACKPLANE_FUNCTION, (uint32_t) SDIO_SLEEP_CSR, (uint8_t) 1, write_value ); - - if ( enable == WICED_TRUE ) - { - /* device WAKEUP through KSO: - * write bit 0 & read back until - * both bits 0(kso bit) & 1 (dev on status) are set - */ - compare_value = SBSDIO_SLPCSR_KEEP_SDIO_ON | SBSDIO_SLPCSR_DEVICE_ON; - bmask = compare_value; - - host_rtos_delay_milliseconds( (uint32_t) 3 ); - } - else - { - /* Put device to sleep, turn off KSO */ - compare_value = 0; - /* Check for bit0 only, bit1(devon status) may not get cleared right away */ - bmask = SBSDIO_SLPCSR_KEEP_SDIO_ON; - } - - do - { - /* Reliable KSO bit set/clr: - * Sdiod sleep write access appears to be in sync with PMU 32khz clk - * just one write attempt may fail,(same is with read ?) - * in any case, read it back until it matches written value - */ - result = wwd_bus_read_register_value( BACKPLANE_FUNCTION, (uint32_t) SDIO_SLEEP_CSR, (uint8_t) 1, &read_value ); - if ( ( ( read_value & bmask ) == compare_value ) && ( result == WWD_SUCCESS ) ) - { - break; - } - - host_rtos_delay_milliseconds( (uint32_t) KSO_WAIT_MS ); - - wwd_bus_write_register_value( BACKPLANE_FUNCTION, (uint32_t) SDIO_SLEEP_CSR, (uint8_t) 1, write_value ); - attempts--; - } while ( attempts != 0 ); - - if ( attempts == 0 ) - { - return WWD_SDIO_BUS_UP_FAIL; - } - else - { - return WWD_SUCCESS; - } -} diff --git a/components/WWD/WWD/internal/chips/43362/chip_constants.h b/components/WWD/WWD/internal/chips/43362/chip_constants.h deleted file mode 100644 index 5198fd455d9ae42a45f0241794bfacafafe353d5..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/chips/43362/chip_constants.h +++ /dev/null @@ -1,384 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -#ifndef INCLUDED_CHIP_CONSTANTS_H_ -#define INCLUDED_CHIP_CONSTANTS_H_ - -#include "wwd_wlioctl.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * Architecture Constants - ******************************************************/ - -/* General chip stats */ -#define CHIP_RAM_SIZE 0x3C000 - -/* Backplane architecture */ -#define CHIPCOMMON_BASE_ADDRESS 0x18000000 /* Chipcommon core register region */ -#define DOT11MAC_BASE_ADDRESS 0x18001000 /* dot11mac core register region */ -#define SDIO_BASE_ADDRESS 0x18002000 /* SDIOD Device core register region */ -#define WLAN_ARMCM3_BASE_ADDRESS 0x18003000 /* ARMCM3 core register region */ -#define SOCSRAM_BASE_ADDRESS 0x18004000 /* SOCSRAM core register region */ -#define BACKPLANE_ADDRESS_MASK 0x7FFF - -#define CHIP_STA_INTERFACE 0 -#define CHIP_AP_INTERFACE 1 -#define CHIP_P2P_INTERFACE 2 - -/* Maximum value of bus data credit difference */ -#define CHIP_MAX_BUS_DATA_CREDIT_DIFF 7 - -/* Chipcommon registers */ -#define CHIPCOMMON_GPIO_CONTROL ((uint32_t) (CHIPCOMMON_BASE_ADDRESS + 0x6C) ) - -/****************************************************** - * SDIO Constants - ******************************************************/ -/* CurrentSdiodProgGuide r23 */ - -/* Base registers */ -#define SDIO_CORE ((uint32_t) (SDIO_BASE_ADDRESS + 0x00) ) -#define SDIO_INT_STATUS ((uint32_t) (SDIO_BASE_ADDRESS + 0x20) ) -#define SDIO_TO_SB_MAILBOX ((uint32_t) (SDIO_BASE_ADDRESS + 0x40) ) -#define SDIO_TO_SB_MAILBOX_DATA ((uint32_t) (SDIO_BASE_ADDRESS + 0x48) ) -#define SDIO_TO_HOST_MAILBOX_DATA ((uint32_t) (SDIO_BASE_ADDRESS + 0x4C) ) -#define SDIO_TO_SB_MAIL_BOX ((uint32_t) (SDIO_BASE_ADDRESS + 0x40) ) -#define SDIO_INT_HOST_MASK ((uint32_t) (SDIO_BASE_ADDRESS + 0x24) ) -#define SDIO_FUNCTION_INT_MASK ((uint32_t) (SDIO_BASE_ADDRESS + 0x34) ) - -/* SDIO Function 0 (SDIO Bus) register addresses */ - -/* SDIO Device CCCR offsets */ -/* TODO: What does CIS/CCCR stand for? */ -/* CCCR accesses do not require backpane clock */ -#define SDIOD_CCCR_REV ( (uint32_t) 0x00 ) /* CCCR/SDIO Revision */ -#define SDIOD_CCCR_SDREV ( (uint32_t) 0x01 ) /* SD Revision */ -#define SDIOD_CCCR_IOEN ( (uint32_t) 0x02 ) /* I/O Enable */ -#define SDIOD_CCCR_IORDY ( (uint32_t) 0x03 ) /* I/O Ready */ -#define SDIOD_CCCR_INTEN ( (uint32_t) 0x04 ) /* Interrupt Enable */ -#define SDIOD_CCCR_INTPEND ( (uint32_t) 0x05 ) /* Interrupt Pending */ -#define SDIOD_CCCR_IOABORT ( (uint32_t) 0x06 ) /* I/O Abort */ -#define SDIOD_CCCR_BICTRL ( (uint32_t) 0x07 ) /* Bus Interface control */ -#define SDIOD_CCCR_CAPABLITIES ( (uint32_t) 0x08 ) /* Card Capabilities */ -#define SDIOD_CCCR_CISPTR_0 ( (uint32_t) 0x09 ) /* Common CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_CISPTR_1 ( (uint32_t) 0x0A ) /* Common CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_CISPTR_2 ( (uint32_t) 0x0B ) /* Common CIS Base Address Pointer Register 2 (MSB - only bit 1 valid)*/ -#define SDIOD_CCCR_BUSSUSP ( (uint32_t) 0x0C ) /* */ -#define SDIOD_CCCR_FUNCSEL ( (uint32_t) 0x0D ) /* */ -#define SDIOD_CCCR_EXECFLAGS ( (uint32_t) 0x0E ) /* */ -#define SDIOD_CCCR_RDYFLAGS ( (uint32_t) 0x0F ) /* */ -#define SDIOD_CCCR_BLKSIZE_0 ( (uint32_t) 0x10 ) /* Function 0 (Bus) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_BLKSIZE_1 ( (uint32_t) 0x11 ) /* Function 0 (Bus) SDIO Block Size Register 1 (MSB) */ -#define SDIOD_CCCR_POWER_CONTROL ( (uint32_t) 0x12 ) /* Power Control */ -#define SDIOD_CCCR_SPEED_CONTROL ( (uint32_t) 0x13 ) /* Bus Speed Select (control device entry into high-speed clocking mode) */ -#define SDIOD_CCCR_UHS_I ( (uint32_t) 0x14 ) /* UHS-I Support */ -#define SDIOD_CCCR_DRIVE ( (uint32_t) 0x15 ) /* Drive Strength */ -#define SDIOD_CCCR_INTEXT ( (uint32_t) 0x16 ) /* Interrupt Extension */ -#define SDIOD_SEP_INT_CTL ( (uint32_t) 0xF2 ) /* Separate Interrupt Control*/ -#define SDIOD_CCCR_F1INFO ( (uint32_t) 0x100 ) /* Function 1 (Backplane) Info */ -#define SDIOD_CCCR_F1HP ( (uint32_t) 0x102 ) /* Function 1 (Backplane) High Power */ -#define SDIOD_CCCR_F1CISPTR_0 ( (uint32_t) 0x109 ) /* Function 1 (Backplane) CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_F1CISPTR_1 ( (uint32_t) 0x10A ) /* Function 1 (Backplane) CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_F1CISPTR_2 ( (uint32_t) 0x10B ) /* Function 1 (Backplane) CIS Base Address Pointer Register 2 (MSB - only bit 1 valid) */ -#define SDIOD_CCCR_F1BLKSIZE_0 ( (uint32_t) 0x110 ) /* Function 1 (Backplane) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_F1BLKSIZE_1 ( (uint32_t) 0x111 ) /* Function 1 (Backplane) SDIO Block Size Register 1 (MSB) */ -#define SDIOD_CCCR_F2INFO ( (uint32_t) 0x200 ) /* Function 2 (WLAN Data FIFO) Info */ -#define SDIOD_CCCR_F2HP ( (uint32_t) 0x202 ) /* Function 2 (WLAN Data FIFO) High Power */ -#define SDIOD_CCCR_F2CISPTR_0 ( (uint32_t) 0x209 ) /* Function 2 (WLAN Data FIFO) CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_F2CISPTR_1 ( (uint32_t) 0x20A ) /* Function 2 (WLAN Data FIFO) CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_F2CISPTR_2 ( (uint32_t) 0x20B ) /* Function 2 (WLAN Data FIFO) CIS Base Address Pointer Register 2 (MSB - only bit 1 valid) */ -#define SDIOD_CCCR_F2BLKSIZE_0 ( (uint32_t) 0x210 ) /* Function 2 (WLAN Data FIFO) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_F2BLKSIZE_1 ( (uint32_t) 0x211 ) /* Function 2 (WLAN Data FIFO) SDIO Block Size Register 1 (MSB) */ -#define SDIOD_CCCR_F3INFO ( (uint32_t) 0x300 ) /* Function 3 (Bluetooth Data FIFO) Info */ -#define SDIOD_CCCR_F3HP ( (uint32_t) 0x302 ) /* Function 3 (Bluetooth Data FIFO) High Power */ -#define SDIOD_CCCR_F3CISPTR_0 ( (uint32_t) 0x309 ) /* Function 3 (Bluetooth Data FIFO) CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_F3CISPTR_1 ( (uint32_t) 0x30A ) /* Function 3 (Bluetooth Data FIFO) CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_F3CISPTR_2 ( (uint32_t) 0x30B ) /* Function 3 (Bluetooth Data FIFO) CIS Base Address Pointer Register 2 (MSB - only bit 1 valid) */ -#define SDIOD_CCCR_F3BLKSIZE_0 ( (uint32_t) 0x310 ) /* Function 3 (Bluetooth Data FIFO) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_F3BLKSIZE_1 ( (uint32_t) 0x311 ) /* Function 3 (Bluetooth Data FIFO) SDIO Block Size Register 1 (MSB) */ - - -/* SDIO Function 1 (Backplane) register addresses */ -/* Addresses 0x00000000 - 0x0000FFFF are directly access the backplane - * throught the backplane window. Addresses above 0x0000FFFF are - * registers relating to backplane access, and do not require a backpane - * clock to access them - */ -#define SDIO_GPIO_SELECT ( (uint32_t) 0x10005 ) -#define SDIO_GPIO_OUTPUT ( (uint32_t) 0x10006 ) -#define SDIO_GPIO_ENABLE ( (uint32_t) 0x10007 ) -#define SDIO_FUNCTION2_WATERMARK ( (uint32_t) 0x10008 ) -#define SDIO_DEVICE_CONTROL ( (uint32_t) 0x10009 ) -#define SDIO_BACKPLANE_ADDRESS_LOW ( (uint32_t) 0x1000A ) -#define SDIO_BACKPLANE_ADDRESS_MID ( (uint32_t) 0x1000B ) -#define SDIO_BACKPLANE_ADDRESS_HIGH ( (uint32_t) 0x1000C ) -#define SDIO_FRAME_CONTROL ( (uint32_t) 0x1000D ) -#define SDIO_CHIP_CLOCK_CSR ( (uint32_t) 0x1000E ) -#define SDIO_PULL_UP ( (uint32_t) 0x1000F ) -#define SDIO_READ_FRAME_BC_LOW ( (uint32_t) 0x1001B ) -#define SDIO_READ_FRAME_BC_HIGH ( (uint32_t) 0x1001C ) - -#define I_HMB_SW_MASK ( (uint32_t) 0x000000F0 ) -#define I_HMB_FRAME_IND ( 1<<6 ) -#define FRAME_AVAILABLE_MASK I_HMB_SW_MASK - - -/****************************************************** - * SPI Constants - ******************************************************/ -/* GSPI v1 */ -#define SPI_FRAME_CONTROL ( (uint32_t) 0x1000D ) - -/* Register addresses */ -#define SPI_BUS_CONTROL ( (uint32_t) 0x0000 ) -#define SPI_RESPONSE_DELAY ( (uint32_t) 0x0001 ) -#define SPI_STATUS_ENABLE ( (uint32_t) 0x0002 ) -#define SPI_RESET_BP ( (uint32_t) 0x0003 ) /* (corerev >= 1) */ -#define SPI_INTERRUPT_REGISTER ( (uint32_t) 0x0004 ) /* 16 bits - Interrupt status */ -#define SPI_INTERRUPT_ENABLE_REGISTER ( (uint32_t) 0x0006 ) /* 16 bits - Interrupt mask */ -#define SPI_STATUS_REGISTER ( (uint32_t) 0x0008 ) /* 32 bits */ -#define SPI_FUNCTION1_INFO ( (uint32_t) 0x000C ) /* 16 bits */ -#define SPI_FUNCTION2_INFO ( (uint32_t) 0x000E ) /* 16 bits */ -#define SPI_FUNCTION3_INFO ( (uint32_t) 0x0010 ) /* 16 bits */ -#define SPI_READ_TEST_REGISTER ( (uint32_t) 0x0014 ) /* 32 bits */ -#define SPI_RESP_DELAY_F0 ( (uint32_t) 0x001c ) /* 8 bits (corerev >= 3) */ -#define SPI_RESP_DELAY_F1 ( (uint32_t) 0x001d ) /* 8 bits (corerev >= 3) */ -#define SPI_RESP_DELAY_F2 ( (uint32_t) 0x001e ) /* 8 bits (corerev >= 3) */ -#define SPI_RESP_DELAY_F3 ( (uint32_t) 0x001f ) /* 8 bits (corerev >= 3) */ - -/****************************************************** - * Bit Masks - ******************************************************/ - -/* SDIOD_CCCR_REV Bits */ -#define SDIO_REV_SDIOID_MASK ( (uint32_t) 0xF0 ) /* SDIO spec revision number */ -#define SDIO_REV_CCCRID_MASK ( (uint32_t) 0x0F ) /* CCCR format version number */ - -/* SDIOD_CCCR_SDREV Bits */ -#define SD_REV_PHY_MASK ( (uint32_t) 0x0F ) /* SD format version number */ - -/* SDIOD_CCCR_IOEN Bits */ -#define SDIO_FUNC_ENABLE_1 ( (uint32_t) 0x02 ) /* function 1 I/O enable */ -#define SDIO_FUNC_ENABLE_2 ( (uint32_t) 0x04 ) /* function 2 I/O enable */ -#define SDIO_FUNC_ENABLE_3 ( (uint32_t) 0x08 ) /* function 3 I/O enable */ - -/* SDIOD_CCCR_IORDY Bits */ -#define SDIO_FUNC_READY_1 ( (uint32_t) 0x02 ) /* function 1 I/O ready */ -#define SDIO_FUNC_READY_2 ( (uint32_t) 0x04 ) /* function 2 I/O ready */ -#define SDIO_FUNC_READY_3 ( (uint32_t) 0x08 ) /* function 3 I/O ready */ - -/* SDIOD_CCCR_INTEN Bits */ -#define INTR_CTL_MASTER_EN ( (uint32_t) 0x01 ) /* interrupt enable master */ -#define INTR_CTL_FUNC1_EN ( (uint32_t) 0x02 ) /* interrupt enable for function 1 */ -#define INTR_CTL_FUNC2_EN ( (uint32_t) 0x04 ) /* interrupt enable for function 2 */ - -/* SDIOD_SEP_INT_CTL Bits */ -#define SEP_INTR_CTL_MASK ( (uint32_t) 0x01 ) /* out-of-band interrupt mask */ -#define SEP_INTR_CTL_EN ( (uint32_t) 0x02 ) /* out-of-band interrupt output enable */ -#define SEP_INTR_CTL_POL ( (uint32_t) 0x04 ) /* out-of-band interrupt polarity */ - -/* SDIOD_CCCR_INTPEND Bits */ -#define INTR_STATUS_FUNC1 ( (uint32_t) 0x02 ) /* interrupt pending for function 1 */ -#define INTR_STATUS_FUNC2 ( (uint32_t) 0x04 ) /* interrupt pending for function 2 */ -#define INTR_STATUS_FUNC3 ( (uint32_t) 0x08 ) /* interrupt pending for function 3 */ - -/* SDIOD_CCCR_IOABORT Bits */ -#define IO_ABORT_RESET_ALL ( (uint32_t) 0x08 ) /* I/O card reset */ -#define IO_ABORT_FUNC_MASK ( (uint32_t) 0x07 ) /* abort selction: function x */ - -/* SDIOD_CCCR_BICTRL Bits */ -#define BUS_CARD_DETECT_DIS ( (uint32_t) 0x80 ) /* Card Detect disable */ -#define BUS_SPI_CONT_INTR_CAP ( (uint32_t) 0x40 ) /* support continuous SPI interrupt */ -#define BUS_SPI_CONT_INTR_EN ( (uint32_t) 0x20 ) /* continuous SPI interrupt enable */ -#define BUS_SD_DATA_WIDTH_MASK ( (uint32_t) 0x03 ) /* bus width mask */ -#define BUS_SD_DATA_WIDTH_4BIT ( (uint32_t) 0x02 ) /* bus width 4-bit mode */ -#define BUS_SD_DATA_WIDTH_1BIT ( (uint32_t) 0x00 ) /* bus width 1-bit mode */ - -/* SDIOD_CCCR_CAPABLITIES Bits */ -#define SDIO_CAP_4BLS ( (uint32_t) 0x80 ) /* 4-bit support for low speed card */ -#define SDIO_CAP_LSC ( (uint32_t) 0x40 ) /* low speed card */ -#define SDIO_CAP_E4MI ( (uint32_t) 0x20 ) /* enable interrupt between block of data in 4-bit mode */ -#define SDIO_CAP_S4MI ( (uint32_t) 0x10 ) /* support interrupt between block of data in 4-bit mode */ -#define SDIO_CAP_SBS ( (uint32_t) 0x08 ) /* support suspend/resume */ -#define SDIO_CAP_SRW ( (uint32_t) 0x04 ) /* support read wait */ -#define SDIO_CAP_SMB ( (uint32_t) 0x02 ) /* support multi-block transfer */ -#define SDIO_CAP_SDC ( (uint32_t) 0x01 ) /* Support Direct commands during multi-byte transfer */ - -/* GSPI */ -#define SPI_READ_TEST_REGISTER_VALUE ( (uint32_t) 0xFEEDBEAD ) -#define SPI_READ_TEST_REG_LSB ( ( ( SPI_READ_TEST_REGISTER_VALUE ) ) & 0xff ) -#define SPI_READ_TEST_REG_LSB_SFT1 ( ( ( SPI_READ_TEST_REGISTER_VALUE << 1 ) ) & 0xff ) -#define SPI_READ_TEST_REG_LSB_SFT2 ( ( ( SPI_READ_TEST_REGISTER_VALUE << 1 ) + 1 ) & 0xff ) -#define SPI_READ_TEST_REG_LSB_SFT3 ( ( ( SPI_READ_TEST_REGISTER_VALUE +1 ) << 1 ) & 0xff ) - - -/* SPI_BUS_CONTROL Bits */ -#define WORD_LENGTH_32 ( (uint32_t) 0x01 ) /* 0/1 16/32 bit word length */ -#define ENDIAN_BIG ( (uint32_t) 0x02 ) /* 0/1 Little/Big Endian */ -#define CLOCK_PHASE ( (uint32_t) 0x04 ) /* 0/1 clock phase delay */ -#define CLOCK_POLARITY ( (uint32_t) 0x08 ) /* 0/1 Idle state clock polarity is low/high */ -#define HIGH_SPEED_MODE ( (uint32_t) 0x10 ) /* 1/0 High Speed mode / Normal mode */ -#define INTERRUPT_POLARITY_HIGH ( (uint32_t) 0x20 ) /* 1/0 Interrupt active polarity is high/low */ -#define WAKE_UP ( (uint32_t) 0x80 ) /* 0/1 Wake-up command from Host to WLAN */ - -/* SPI_RESPONSE_DELAY Bit mask */ -#define RESPONSE_DELAY_MASK 0xFF /* Configurable rd response delay in multiples of 8 bits */ - -/* SPI_STATUS_ENABLE Bits */ -#define STATUS_ENABLE ( (uint32_t) 0x01 ) /* 1/0 Status sent/not sent to host after read/write */ -#define INTR_WITH_STATUS ( (uint32_t) 0x02 ) /* 0/1 Do-not / do-interrupt if status is sent */ -#define RESP_DELAY_ALL ( (uint32_t) 0x04 ) /* Applicability of resp delay to F1 or all func's read */ -#define DWORD_PKT_LEN_EN ( (uint32_t) 0x08 ) /* Packet len denoted in dwords instead of bytes */ -#define CMD_ERR_CHK_EN ( (uint32_t) 0x20 ) /* Command error check enable */ -#define DATA_ERR_CHK_EN ( (uint32_t) 0x40 ) /* Data error check enable */ - - - -/* SPI_RESET_BP Bits*/ -#define RESET_ON_WLAN_BP_RESET ( (uint32_t) 0x04 ) /* enable reset for WLAN backplane */ -#define RESET_ON_BT_BP_RESET ( (uint32_t) 0x08 ) /* enable reset for BT backplane */ -#define RESET_SPI ( (uint32_t) 0x80 ) /* reset the above enabled logic */ - - - -/* SPI_INTERRUPT_REGISTER and SPI_INTERRUPT_ENABLE_REGISTER Bits */ -#define DATA_UNAVAILABLE ( (uint32_t) 0x0001 ) /* Requested data not available; Clear by writing a "1" */ -#define F2_F3_FIFO_RD_UNDERFLOW ( (uint32_t) 0x0002 ) -#define F2_F3_FIFO_WR_OVERFLOW ( (uint32_t) 0x0004 ) -#define COMMAND_ERROR ( (uint32_t) 0x0008 ) /* Cleared by writing 1 */ -#define DATA_ERROR ( (uint32_t) 0x0010 ) /* Cleared by writing 1 */ -#define F2_PACKET_AVAILABLE ( (uint32_t) 0x0020 ) -#define F3_PACKET_AVAILABLE ( (uint32_t) 0x0040 ) -#define F1_OVERFLOW ( (uint32_t) 0x0080 ) /* Due to last write. Bkplane has pending write requests */ -#define MISC_INTR0 ( (uint32_t) 0x0100 ) -#define MISC_INTR1 ( (uint32_t) 0x0200 ) -#define MISC_INTR2 ( (uint32_t) 0x0400 ) -#define MISC_INTR3 ( (uint32_t) 0x0800 ) -#define MISC_INTR4 ( (uint32_t) 0x1000 ) -#define F1_INTR ( (uint32_t) 0x2000 ) -#define F2_INTR ( (uint32_t) 0x4000 ) -#define F3_INTR ( (uint32_t) 0x8000 ) - - - - -/* SPI_STATUS_REGISTER Bits */ -#define STATUS_DATA_NOT_AVAILABLE ( (uint32_t) 0x00000001 ) -#define STATUS_UNDERFLOW ( (uint32_t) 0x00000002 ) -#define STATUS_OVERFLOW ( (uint32_t) 0x00000004 ) -#define STATUS_F2_INTR ( (uint32_t) 0x00000008 ) -#define STATUS_F3_INTR ( (uint32_t) 0x00000010 ) -#define STATUS_F2_RX_READY ( (uint32_t) 0x00000020 ) -#define STATUS_F3_RX_READY ( (uint32_t) 0x00000040 ) -#define STATUS_HOST_CMD_DATA_ERR ( (uint32_t) 0x00000080 ) -#define STATUS_F2_PKT_AVAILABLE ( (uint32_t) 0x00000100 ) -#define STATUS_F2_PKT_LEN_MASK ( (uint32_t) 0x000FFE00 ) -#define STATUS_F2_PKT_LEN_SHIFT ( (uint32_t) 9 ) -#define STATUS_F3_PKT_AVAILABLE ( (uint32_t) 0x00100000 ) -#define STATUS_F3_PKT_LEN_MASK ( (uint32_t) 0xFFE00000 ) -#define STATUS_F3_PKT_LEN_SHIFT ( (uint32_t) 21 ) - - - - - -/* SDIO_CHIP_CLOCK_CSR Bits */ -#define SBSDIO_FORCE_ALP ( (uint32_t) 0x01 ) /* Force ALP request to backplane */ -#define SBSDIO_FORCE_HT ( (uint32_t) 0x02 ) /* Force HT request to backplane */ -#define SBSDIO_FORCE_ILP ( (uint32_t) 0x04 ) /* Force ILP request to backplane */ -#define SBSDIO_ALP_AVAIL_REQ ( (uint32_t) 0x08 ) /* Make ALP ready (power up xtal) */ -#define SBSDIO_HT_AVAIL_REQ ( (uint32_t) 0x10 ) /* Make HT ready (power up PLL) */ -#define SBSDIO_FORCE_HW_CLKREQ_OFF ( (uint32_t) 0x20 ) /* Squelch clock requests from HW */ -#define SBSDIO_ALP_AVAIL ( (uint32_t) 0x40 ) /* Status: ALP is ready */ -#define SBSDIO_HT_AVAIL ( (uint32_t) 0x80 ) /* Status: HT is ready */ -#define SBSDIO_Rev8_HT_AVAIL ( (uint32_t) 0x40 ) -#define SBSDIO_Rev8_ALP_AVAIL ( (uint32_t) 0x80 ) - - -/* SDIO_FRAME_CONTROL Bits */ -#define SFC_RF_TERM ( (uint32_t) (1 << 0) ) /* Read Frame Terminate */ -#define SFC_WF_TERM ( (uint32_t) (1 << 1) ) /* Write Frame Terminate */ -#define SFC_CRC4WOOS ( (uint32_t) (1 << 2) ) /* HW reports CRC error for write out of sync */ -#define SFC_ABORTALL ( (uint32_t) (1 << 3) ) /* Abort cancels all in-progress frames */ - -/* SDIO_TO_SB_MAIL_BOX bits corresponding to intstatus bits */ -#define SMB_NAK ( (uint32_t) (1 << 0) ) /* To SB Mailbox Frame NAK */ -#define SMB_INT_ACK ( (uint32_t) (1 << 1) ) /* To SB Mailbox Host Interrupt ACK */ -#define SMB_USE_OOB ( (uint32_t) (1 << 2) ) /* To SB Mailbox Use OOB Wakeup */ -#define SMB_DEV_INT ( (uint32_t) (1 << 3) ) /* To SB Mailbox Miscellaneous Interrupt */ - - -#define WL_CHANSPEC_BAND_MASK (0xf000) -#define WL_CHANSPEC_BAND_5G (0x1000) -#define WL_CHANSPEC_BAND_2G (0x2000) -#define WL_CHANSPEC_CTL_SB_MASK (0x0300) -#define WL_CHANSPEC_CTL_SB_LOWER (0x0100) -#define WL_CHANSPEC_CTL_SB_UPPER (0x0200) -#define WL_CHANSPEC_CTL_SB_NONE (0x0300) -#define WL_CHANSPEC_BW_MASK (0x0C00) -#define WL_CHANSPEC_BW_10 (0x0400) -#define WL_CHANSPEC_BW_20 (0x0800) -#define WL_CHANSPEC_BW_40 (0x0C00) - - -/* CIS accesses require backpane clock */ - - -#define CHIP_HAS_BSSID_CNT_IN_ASSOC_PARAMS -#define CHIP_FIRMWARE_SUPPORTS_PM_LIMIT_IOVAR - -struct ether_addr; -struct wl_join_scan_params; - -typedef struct wl_assoc_params -{ - struct ether_addr bssid; -#ifdef CHIP_HAS_BSSID_CNT_IN_ASSOC_PARAMS - uint16_t bssid_cnt; -#endif /* ifdef CHIP_HAS_BSSID_CNT_IN_ASSOC_PARAMS */ - uint32_t chanspec_num; - chanspec_t chanspec_list[1]; -} wl_assoc_params_t; -#define WL_ASSOC_PARAMS_FIXED_SIZE (sizeof(wl_assoc_params_t) - sizeof(wl_chanspec_t)) -typedef wl_assoc_params_t wl_reassoc_params_t; -#define WL_REASSOC_PARAMS_FIXED_SIZE WL_ASSOC_PARAMS_FIXED_SIZE -typedef wl_assoc_params_t wl_join_assoc_params_t; -#define WL_JOIN_ASSOC_PARAMS_FIXED_SIZE WL_ASSOC_PARAMS_FIXED_SIZE -typedef struct wl_join_params -{ - wlc_ssid_t ssid; - struct wl_assoc_params params; -} wl_join_params_t; -#define WL_JOIN_PARAMS_FIXED_SIZE (sizeof(wl_join_params_t) - sizeof(wl_chanspec_t)) - -/* extended join params */ -typedef struct wl_extjoin_params -{ - wlc_ssid_t ssid; /* {0, ""}: wildcard scan */ - struct wl_join_scan_params scan_params; - wl_join_assoc_params_t assoc_params; /* optional field, but it must include the fixed portion of the wl_join_assoc_params_t struct when it does present. */ -} wl_extjoin_params_t; -#define WL_EXTJOIN_PARAMS_FIXED_SIZE (sizeof(wl_extjoin_params_t) - sizeof(chanspec_t)) - -typedef wl_cnt_ver_six_t wiced_counters_t; - - -/* Chip specific IOCTLs */ -#define WLC_SET_CUSTOM_COUNTRY ( (uint32_t) 320 ) - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ifndef INCLUDED_CHIP_CONSTANTS_H_ */ diff --git a/components/WWD/WWD/internal/chips/43362/wwd_ap.c b/components/WWD/WWD/internal/chips/43362/wwd_ap.c deleted file mode 100644 index b57c1f2ebb7c0b31805c94492be0ad3617d6e195..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/chips/43362/wwd_ap.c +++ /dev/null @@ -1,468 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Provides an APSTA functionality specific to the 43362A2 - */ - -#include -#include "wwd_rtos.h" -#include "wwd_events.h" -#include "wwd_assert.h" -#include "wwd_management.h" -#include "wwd_wifi.h" -#include "network/wwd_buffer_interface.h" -#include "wwd_sdpcm.h" -#include "wwd_internal.h" -#include "wwd_ap.h" -#include "platform_toolchain.h" -#include "wwd_ap_common.h" - -/****************************************************** - * Macros - ******************************************************/ - -/****************************************************** - * @cond Constants - ******************************************************/ - -#define WLC_EVENT_MSG_LINK (0x01) -#define RATE_SETTING_11_MBPS (11000000 / 500000) - -/** @endcond */ - -/* HT/AMPDU specific define */ -#define AMPDU_AP_DEFAULT_BA_WSIZE 2 /* AP default BA window size */ -#define AMPDU_STA_DEFAULT_BA_WSIZE 8 /* STA default BA window size */ -#define AMPDU_STA_DEFAULT_MPDU 4 /* STA default num MPDU per AMPDU */ -#define WEP40_KEY_LENGTH 5 -#define WEP104_KEY_LENGTH 13 -#define FORMATTED_ASCII_WEP40_KEY_LENGTH 28 /* For 5 bytes key */ -#define FORMATTED_ASCII_WEP104_KEY_LENGTH 60 /* For 13 bytes key */ - -/****************************************************** - * Enumerations - ******************************************************/ - -typedef enum -{ - BSS_AP = 3, - BSS_STA = 2, - BSS_UP = 1, - BSS_DOWN = 0 -} bss_arg_option_t; - -typedef enum -{ - WEP_OPEN_SYSTEM_AUTHENTICATION = 0, - WEP_SHARED_KEY_AUTHENTICATION = 1 -} wep_authentication_type_t; - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - -static void* wwd_handle_apsta_event ( const wwd_event_header_t* event_header, const uint8_t* event_data, /*@returned@*/ void* handler_user_data ); -static wwd_result_t internal_ap_init ( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ); -wwd_result_t wwd_wifi_ap_init ( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ); -wwd_result_t wwd_wifi_ap_up ( void ); - -/****************************************************** - * Variables Definitions - ******************************************************/ - -wiced_bool_t wwd_wifi_ap_is_up = WICED_FALSE; -static host_semaphore_type_t wwd_wifi_sleep_flag; -static const wwd_event_num_t apsta_events[] = { WLC_E_IF, WLC_E_LINK, WLC_E_NONE }; - -/****************************************************** - * Function Definitions - ******************************************************/ - -static void* wwd_handle_apsta_event( const wwd_event_header_t* event_header, const uint8_t* event_data, /*@returned@*/ void* handler_user_data ) -{ - UNUSED_PARAMETER( event_header ); - UNUSED_PARAMETER( event_data ); - UNUSED_PARAMETER( handler_user_data ); - - if ( (wwd_interface_t) event_header->interface != WWD_AP_INTERFACE) - { - return handler_user_data; - } - - if ( ( ( event_header->event_type == (wwd_event_num_t) WLC_E_LINK ) && - ( event_header->interface == WWD_AP_INTERFACE ) ) || - ( event_header->event_type == WLC_E_IF ) ) - { - wwd_result_t result; - result = host_rtos_set_semaphore( &wwd_wifi_sleep_flag, WICED_FALSE ); - wiced_assert( "failed to post AP link semaphore", result == WWD_SUCCESS ); - REFERENCE_DEBUG_ONLY_VARIABLE( result ); - } - return handler_user_data; -} - -static wwd_result_t internal_ap_init( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ) -{ - wiced_bool_t wait_for_interface = WICED_FALSE; - wwd_result_t result; - wiced_buffer_t response; - wiced_buffer_t buffer; - uint32_t* data; - uint32_t bss_index = WWD_AP_INTERFACE; - -#ifdef WICED_WIFI_SOFT_AP_WEP_SUPPORT_ENABLED - uint32_t* auth; - uint16_t length; -#endif - - if ( ( ( auth_type == WICED_SECURITY_WPA_TKIP_PSK ) || ( auth_type == WICED_SECURITY_WPA2_AES_PSK ) || ( auth_type == WICED_SECURITY_WPA2_MIXED_PSK ) ) && - ( ( key_length < (uint8_t) 8 ) || ( key_length > (uint8_t) 64 ) ) ) - { - WPRINT_APP_INFO(( "Error: WPA security key length must be between 8 and 64\n" )); - return WWD_WPA_KEYLEN_BAD; - } - -#ifdef WICED_WIFI_SOFT_AP_WEP_SUPPORT_ENABLED - else if( (( auth_type == WICED_SECURITY_WEP_PSK ) || ( auth_type == WICED_SECURITY_WEP_SHARED )) && - (( key_length != FORMATTED_ASCII_WEP40_KEY_LENGTH ) && ( key_length != FORMATTED_ASCII_WEP104_KEY_LENGTH )) ) - { - WPRINT_APP_INFO(( "Error: WEP security Key length must be either 5 / 13 bytes\n" )); - return WWD_WEP_KEYLEN_BAD; - } -#endif - - if ( ( wwd_wifi_p2p_go_is_up == WICED_TRUE ) || ( wwd_wifi_ap_is_up == WICED_TRUE ) ) - { - WPRINT_APP_INFO(( "Error: Soft AP or Wi-Fi Direct group owner already up\n" )); - return WWD_AP_ALREADY_UP; - } - - /* Query bss state (does it exist? if so is it UP?) */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) bss_index; - if ( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_STA_INTERFACE ) != WWD_SUCCESS ) - { - /* Note: We don't need to release the response packet since the iovar failed */ - wait_for_interface = WICED_TRUE; - } - else - { - /* Check if the BSS is already UP, if so return */ - uint32_t* data2 = (uint32_t*) host_buffer_get_current_piece_data_pointer( response ); - if ( *data2 == (uint32_t) BSS_UP ) - { - host_buffer_release( response, WWD_NETWORK_RX ); - wwd_wifi_ap_is_up = WICED_TRUE; - return WWD_SUCCESS; - } - else - { - host_buffer_release( response, WWD_NETWORK_RX ); - } - } - - CHECK_RETURN( host_rtos_init_semaphore( &wwd_wifi_sleep_flag ) ); - - /* Register for interested events */ - CHECK_RETURN_WITH_SEMAPHORE( wwd_management_set_event_handler( apsta_events, wwd_handle_apsta_event, NULL, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Check if we need to wait for interface to be created */ - if ( wait_for_interface == WICED_TRUE ) - { - CHECK_RETURN_WITH_SEMAPHORE( host_rtos_get_semaphore( &wwd_wifi_sleep_flag, (uint32_t) 10000, WICED_FALSE ), &wwd_wifi_sleep_flag ); - } - - if ( wwd_wifi_set_block_ack_window_size( WWD_AP_INTERFACE ) != WWD_SUCCESS ) - { - return WWD_SET_BLOCK_ACK_WINDOW_FAIL; - } - - /* Set the SSID */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 40, "bsscfg:" IOVAR_STR_SSID ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = bss_index; /* Set the bsscfg index */ - data[1] = ssid->length; /* Set the ssid length */ - memcpy( &data[2], (uint8_t*) ssid->value, ssid->length ); - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Set the channel */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - *data = channel; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_CHANNEL, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - -#ifdef WICED_WIFI_SOFT_AP_WEP_SUPPORT_ENABLED - if ( ( auth_type == WICED_SECURITY_WEP_PSK ) || ( auth_type == WICED_SECURITY_WEP_SHARED ) ) - { - for ( length = 0; length < key_length; length = (uint16_t) ( length + 2 + security_key[ 1 ] ) ) - { - const wiced_wep_key_t* in_key = (const wiced_wep_key_t*) &security_key[ length ]; - wl_wsec_key_t* out_key = (wl_wsec_key_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(wl_wsec_key_t) ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( out_key, &wwd_wifi_sleep_flag ); - memset( out_key, 0, sizeof(wl_wsec_key_t) ); - out_key->index = in_key->index; - out_key->len = in_key->length; - memcpy( out_key->data, in_key->data, in_key->length ); - switch ( in_key->length ) - { - case WEP40_KEY_LENGTH: - out_key->algo = (uint32_t) CRYPTO_ALGO_WEP1; - break; - case WEP104_KEY_LENGTH: - out_key->algo = (uint32_t) CRYPTO_ALGO_WEP128; - break; - default: - host_buffer_release( buffer, WWD_NETWORK_TX ); - return WWD_INVALID_KEY; - } - /* Set the first entry as primary key by default */ - if ( length == 0 ) - { - out_key->flags |= WL_PRIMARY_KEY; - } - out_key->index = htod32(out_key->index); - out_key->len = htod32(out_key->len); - out_key->algo = htod32(out_key->algo); - out_key->flags = htod32(out_key->flags); - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_KEY, buffer, NULL, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - } - - /* Set authentication type */ - auth = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( auth, &wwd_wifi_sleep_flag ); - if ( auth_type == WICED_SECURITY_WEP_SHARED ) - { - *auth = WEP_SHARED_KEY_AUTHENTICATION; /* 1 = Shared Key authentication */ - } - else - { - *auth = WEP_OPEN_SYSTEM_AUTHENTICATION; /* 0 = Open System authentication */ - } - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_AUTH, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - } -#endif - - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, "bsscfg:" IOVAR_STR_WSEC ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = bss_index; - if ((auth_type & WPS_ENABLED) != 0) - { - data[1] = (uint32_t) ( ( auth_type & ( ~WPS_ENABLED ) ) | SES_OW_ENABLED ); - } - else - { - data[1] = (uint32_t) auth_type; - } - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ), &wwd_wifi_sleep_flag ); - - if ( ( auth_type != WICED_SECURITY_OPEN ) && ( auth_type != WICED_SECURITY_WEP_PSK ) && ( auth_type != WICED_SECURITY_WEP_SHARED ) ) - { - wsec_pmk_t* psk; - - /* Set the wpa auth */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, "bsscfg:" IOVAR_STR_WPA_AUTH ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = bss_index; - data[1] = (uint32_t) (auth_type == WICED_SECURITY_WPA_TKIP_PSK) ? ( WPA_AUTH_PSK ) : ( WPA2_AUTH_PSK | WPA_AUTH_PSK ); - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Set the passphrase */ - psk = (wsec_pmk_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(wsec_pmk_t) ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( psk, &wwd_wifi_sleep_flag ); - memcpy( psk->key, security_key, key_length ); - psk->key_len = key_length; - psk->flags = (uint16_t) WSEC_PASSPHRASE; - host_rtos_delay_milliseconds( 1 ); /* Delay required to allow radio firmware to be ready to receive PMK and avoid intermittent failure */ - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_WSEC_PMK, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - } - - /* Set the GMode */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - *data = (uint32_t) GMODE_AUTO; - - result = wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_GMODE, buffer, 0, WWD_AP_INTERFACE ); - if ( ( result != WWD_SUCCESS ) && ( result != WWD_WLAN_ASSOCIATED ) ) - { - wiced_assert("start_ap: Failed to set GMode\n", 0 == 1 ); - - (void) host_rtos_deinit_semaphore( &wwd_wifi_sleep_flag ); - return result; - } - - /* Set the multicast transmission rate to 11 Mbps rather than the default 1 Mbps */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_2G_MULTICAST_RATE ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) RATE_SETTING_11_MBPS; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Set DTIM period */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - *data = (uint32_t) WICED_DEFAULT_SOFT_AP_DTIM_PERIOD; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_DTIMPRD, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - -#ifdef WICED_DISABLE_SSID_BROADCAST - /* Make the AP "hidden" */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_CLOSEDNET ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = (uint32_t) 1; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); -#endif - -#ifdef WICED_WIFI_ISOLATE_AP_CLIENTS - result = wwd_wifi_enable_ap_isolate( WWD_AP_INTERFACE, WICED_TRUE ); - wiced_assert("start_ap: Failed to disable intra BSS routing\r\n", result == WWD_SUCCESS ); -#endif /* WICED_WIFI_ISOLATE_AP_CLIENTS */ - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_ap_init( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ) -{ - wwd_result_t result; - - /* Keep WLAN awake while setting up softAP */ -// WWD_WLAN_KEEP_AWAKE( ); - - result = internal_ap_init( ssid, auth_type, security_key, key_length, channel ); - -// WWD_WLAN_LET_SLEEP( ); - - return result; -} - -wwd_result_t wwd_wifi_ap_up( void ) -{ - wiced_buffer_t buffer; - uint32_t* data; - - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = wwd_get_bss_index( WWD_AP_INTERFACE ); - data[1] = (uint32_t) BSS_UP; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Wait until AP is brought up */ - CHECK_RETURN_WITH_SEMAPHORE( host_rtos_get_semaphore( &wwd_wifi_sleep_flag, (uint32_t) 10000, WICED_FALSE ), &wwd_wifi_sleep_flag ); - - wwd_wifi_ap_is_up = WICED_TRUE; - return WWD_SUCCESS; -} - -/** Starts an infrastructure WiFi network - * @param ssid : A null terminated string containing the SSID name of the network to join - * @param auth_type : Authentication type: - * - WICED_SECURITY_OPEN - Open Security - * - WICED_SECURITY_WPA_TKIP_PSK - WPA Security - * - WICED_SECURITY_WPA2_AES_PSK - WPA2 Security using AES cipher - * - WICED_SECURITY_WPA2_MIXED_PSK - WPA2 Security using AES and/or TKIP ciphers - * - WEP security is currently unimplemented due to lack of security - * @param security_key : A byte array containing the cleartext security key for the network - * @param key_length : The length of the security_key in bytes. - * @param channel : 802.11 Channel number - * - * @return WWD_SUCCESS : if successfully creates an AP - * Error code : if an error occurred - */ -wwd_result_t wwd_wifi_start_ap( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ) -{ - CHECK_RETURN( wwd_wifi_ap_init( ssid, auth_type, security_key, key_length, channel ) ); - - CHECK_RETURN( wwd_wifi_ap_up() ); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_stop_ap( void ) -{ - uint32_t* data; - wiced_buffer_t buffer; - wiced_buffer_t response; - wwd_result_t result; - wwd_result_t result2; - - /* Query bss state (does it exist? if so is it UP?) */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER( data ); - *data = wwd_get_bss_index( WWD_AP_INTERFACE ); - result = wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_STA_INTERFACE ); - if ( result == WWD_WLAN_NOTFOUND ) - { - /* AP interface does not exist - i.e. it is down */ - wwd_wifi_ap_is_up = WICED_FALSE; - return WWD_SUCCESS; - } - - CHECK_RETURN( result ); - - data = (uint32_t*) host_buffer_get_current_piece_data_pointer( response ); - if ( data[0] != (uint32_t) BSS_UP ) - { - /* AP interface indicates it is not up - i.e. it is down */ - host_buffer_release( response, WWD_NETWORK_RX ); - wwd_wifi_ap_is_up = WICED_FALSE; - return WWD_SUCCESS; - } - - host_buffer_release( response, WWD_NETWORK_RX ); - - /* set BSS down */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER( data ); - data[0] = wwd_get_bss_index( WWD_AP_INTERFACE ); - data[1] = (uint32_t) BSS_DOWN; - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ) ); - - /* Wait until AP is brought down */ - result = host_rtos_get_semaphore( &wwd_wifi_sleep_flag, (uint32_t) 10000, WICED_FALSE ); - result2 = host_rtos_deinit_semaphore( &wwd_wifi_sleep_flag ); - if ( result != WWD_SUCCESS ) - { - return result; - } - if ( result2 != WWD_SUCCESS ) - { - return result2; - } - - CHECK_RETURN( wwd_management_set_event_handler( apsta_events, NULL, NULL, WWD_AP_INTERFACE ) ); - - wwd_wifi_ap_is_up = WICED_FALSE; - return WWD_SUCCESS; - -} - -/** Sets the chip specific AMPDU parameters for AP and STA - * For SDK 3.0, and beyond, each chip will need it's own function for setting AMPDU parameters. - */ - -wwd_result_t wwd_wifi_set_ampdu_parameters( void ) -{ - return wwd_wifi_set_ampdu_parameters_common( WWD_STA_INTERFACE, AMPDU_STA_DEFAULT_BA_WSIZE, AMPDU_STA_DEFAULT_MPDU, AMPDU_RX_FACTOR_8K ); -} - -/** Sets the chip specific AMPDU parameters for AP and STA - * For SDK 3.0, and beyond, each chip will need it's own function for setting AMPDU parameters. - */ -wwd_result_t wwd_wifi_set_block_ack_window_size( wwd_interface_t interface ) -{ - return wwd_wifi_set_block_ack_window_size_common( interface, AMPDU_AP_DEFAULT_BA_WSIZE, AMPDU_STA_DEFAULT_BA_WSIZE ); -} diff --git a/components/WWD/WWD/internal/chips/43362/wwd_chip_specific_functions.c b/components/WWD/WWD/internal/chips/43362/wwd_chip_specific_functions.c deleted file mode 100644 index 40cc7a52a7d738b78675428c0a82675de6f65516..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/chips/43362/wwd_chip_specific_functions.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * - */ -#include "wwd_constants.h" -#include "wwd_wifi.h" -//#include "internal/wwd_sdpcm.h" -#include -#include "wwd_internal.h" -#include "bus_protocols/wwd_bus_protocol_interface.h" - -/****************************************************** - * Macros - ******************************************************/ -#define VERIFY_RESULT( x ) { wwd_result_t verify_result; verify_result = ( x ); if ( verify_result != WWD_SUCCESS ) return verify_result; } - -/****************************************************** - * Constants - ******************************************************/ -#define PLATFORM_WLAN_RAM_BASE (0x0) -#define PLATFORM_WLAN_RAM_SIZE (CHIP_RAM_SIZE) -#define WLAN_SHARED_ADDR (PLATFORM_WLAN_RAM_BASE + PLATFORM_WLAN_RAM_SIZE - 4) - -#define WLAN_BUS_UP_ATTEMPTS (1000) - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - -/****************************************************** - * Variables Definitions - ******************************************************/ -static wiced_bool_t bus_is_up = WICED_FALSE; - -/****************************************************** - * Function Definitions - ******************************************************/ - -wwd_result_t wwd_wifi_read_wlan_log( char* buffer, uint32_t buffer_size ) -{ - wwd_result_t result; - - result = wwd_wifi_read_wlan_log_unsafe( WLAN_SHARED_ADDR, buffer, buffer_size ); - - return result; -} - -//wwd_result_t wwd_wifi_set_custom_country_code( const wiced_country_info_t* country_code ) -//{ -// wiced_buffer_t buffer; -// wwd_result_t result; -// wiced_country_info_t* data; - -// data = (wiced_country_info_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) sizeof(wiced_country_info_t) + 10 ); -// memcpy( data, country_code, sizeof(wiced_country_info_t) ); -// result = wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_CUSTOM_COUNTRY, buffer, NULL, WWD_STA_INTERFACE ); - -// return result; -//} - -wwd_result_t wwd_chip_specific_init( void ) -{ - return WWD_SUCCESS; -} - -wwd_result_t wwd_chip_specific_socsram_init( void ) -{ - return WWD_SUCCESS; -} - -wwd_result_t wwd_ensure_wlan_bus_is_up( void ) -{ - uint8_t csr = 0; - uint32_t attempts = (uint32_t) WLAN_BUS_UP_ATTEMPTS; - - /* Ensure HT clock is up */ - if ( bus_is_up == WICED_TRUE ) - { - return WWD_SUCCESS; - } - - /* Bus specific wakeup routine */ - VERIFY_RESULT( wwd_bus_specific_wakeup( )); - - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, (uint32_t) SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, (uint32_t) SBSDIO_HT_AVAIL_REQ ) ); - - do - { - VERIFY_RESULT( wwd_bus_read_register_value( BACKPLANE_FUNCTION, (uint32_t) SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, &csr ) ); - --attempts; - } - while ( ( ( csr & SBSDIO_HT_AVAIL ) == 0 ) && - ( attempts != 0 ) - &&( host_rtos_delay_milliseconds( (uint32_t) 1 ), 1==1 )); - - if (attempts == 0) - { - return WWD_SDIO_BUS_UP_FAIL; - } - else - { - bus_is_up = WICED_TRUE; - return WWD_SUCCESS; - } -} - -wwd_result_t wwd_allow_wlan_bus_to_sleep( void ) -{ - /* Clear HT clock request */ - if (bus_is_up == WICED_TRUE) - { - bus_is_up = WICED_FALSE; - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, (uint32_t) SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, 0 )); - - /* Bus specific sleep routine */ - return wwd_bus_specific_sleep( ); - } - else - { - return WWD_SUCCESS; - } -} diff --git a/components/WWD/WWD/internal/chips/4343x/chip_constants.h b/components/WWD/WWD/internal/chips/4343x/chip_constants.h deleted file mode 100644 index de37a7f426695a224798ef779da8f08995e40b4e..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/chips/4343x/chip_constants.h +++ /dev/null @@ -1,434 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -#ifndef INCLUDED_CHIP_CONSTANTS_H_ -#define INCLUDED_CHIP_CONSTANTS_H_ - -#include "wwd_wlioctl.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * Architecture Constants - ******************************************************/ - -/* General chip stats */ -#define CHIP_RAM_SIZE ( 512 * 1024 ) -#define SOCSRAM_SRMEM_SIZE ( 64 * 1024 ) - -/* Backplane architecture */ -#define CHIPCOMMON_BASE_ADDRESS 0x18000000 /* Chipcommon core register region */ -#define DOT11MAC_BASE_ADDRESS 0x18001000 /* dot11mac core register region */ -#define SDIO_BASE_ADDRESS 0x18002000 /* SDIOD Device core register region */ -#define WLAN_ARMCM3_BASE_ADDRESS 0x18003000 /* ARMCM3 core register region */ -#define SOCSRAM_BASE_ADDRESS 0x18004000 /* SOCSRAM core register region */ -#define BACKPLANE_ADDRESS_MASK 0x7FFF - -#define CHIP_STA_INTERFACE 0 -#define CHIP_AP_INTERFACE 1 - -/* Maximum value of bus data credit difference */ -#define CHIP_MAX_BUS_DATA_CREDIT_DIFF 20 - -/* Chipcommon registers */ -#define CHIPCOMMON_GPIO_CONTROL ((uint32_t) (CHIPCOMMON_BASE_ADDRESS + 0x6C) ) -#define CHIPCOMMON_SR_CONTROL0 ((uint32_t) (CHIPCOMMON_BASE_ADDRESS + 0x504) ) -#define CHIPCOMMON_SR_CONTROL1 ((uint32_t) (CHIPCOMMON_BASE_ADDRESS + 0x508) ) - -/* SOCSRAM core registers */ -#define SOCSRAM_BANKX_INDEX ((uint32_t) (SOCSRAM_BASE_ADDRESS + 0x10) ) -#define SOCSRAM_BANKX_PDA ((uint32_t) (SOCSRAM_BASE_ADDRESS + 0x44) ) - -/****************************************************** - * SDIO Constants - ******************************************************/ -/* CurrentSdiodProgGuide r23 */ - -/* Base registers */ -#define SDIO_CORE ((uint32_t) (SDIO_BASE_ADDRESS + 0x00) ) -#define SDIO_INT_STATUS ((uint32_t) (SDIO_BASE_ADDRESS + 0x20) ) -#define SDIO_TO_SB_MAILBOX ((uint32_t) (SDIO_BASE_ADDRESS + 0x40) ) -#define SDIO_TO_SB_MAILBOX_DATA ((uint32_t) (SDIO_BASE_ADDRESS + 0x48) ) -#define SDIO_TO_HOST_MAILBOX_DATA ((uint32_t) (SDIO_BASE_ADDRESS + 0x4C) ) -#define SDIO_TO_SB_MAIL_BOX ((uint32_t) (SDIO_BASE_ADDRESS + 0x40) ) -#define SDIO_INT_HOST_MASK ((uint32_t) (SDIO_BASE_ADDRESS + 0x24) ) -#define SDIO_FUNCTION_INT_MASK ((uint32_t) (SDIO_BASE_ADDRESS + 0x34) ) - - -/* SDIO Function 0 (SDIO Bus) register addresses */ - -/* SDIO Device CCCR offsets */ -/* TODO: What does CIS/CCCR stand for? */ -/* CCCR accesses do not require backpane clock */ -#define SDIOD_CCCR_REV ( (uint32_t) 0x00 ) /* CCCR/SDIO Revision */ -#define SDIOD_CCCR_SDREV ( (uint32_t) 0x01 ) /* SD Revision */ -#define SDIOD_CCCR_IOEN ( (uint32_t) 0x02 ) /* I/O Enable */ -#define SDIOD_CCCR_IORDY ( (uint32_t) 0x03 ) /* I/O Ready */ -#define SDIOD_CCCR_INTEN ( (uint32_t) 0x04 ) /* Interrupt Enable */ -#define SDIOD_CCCR_INTPEND ( (uint32_t) 0x05 ) /* Interrupt Pending */ -#define SDIOD_CCCR_IOABORT ( (uint32_t) 0x06 ) /* I/O Abort */ -#define SDIOD_CCCR_BICTRL ( (uint32_t) 0x07 ) /* Bus Interface control */ -#define SDIOD_CCCR_CAPABLITIES ( (uint32_t) 0x08 ) /* Card Capabilities */ -#define SDIOD_CCCR_CISPTR_0 ( (uint32_t) 0x09 ) /* Common CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_CISPTR_1 ( (uint32_t) 0x0A ) /* Common CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_CISPTR_2 ( (uint32_t) 0x0B ) /* Common CIS Base Address Pointer Register 2 (MSB - only bit 1 valid)*/ -#define SDIOD_CCCR_BUSSUSP ( (uint32_t) 0x0C ) /* */ -#define SDIOD_CCCR_FUNCSEL ( (uint32_t) 0x0D ) /* */ -#define SDIOD_CCCR_EXECFLAGS ( (uint32_t) 0x0E ) /* */ -#define SDIOD_CCCR_RDYFLAGS ( (uint32_t) 0x0F ) /* */ -#define SDIOD_CCCR_BLKSIZE_0 ( (uint32_t) 0x10 ) /* Function 0 (Bus) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_BLKSIZE_1 ( (uint32_t) 0x11 ) /* Function 0 (Bus) SDIO Block Size Register 1 (MSB) */ -#define SDIOD_CCCR_POWER_CONTROL ( (uint32_t) 0x12 ) /* Power Control */ -#define SDIOD_CCCR_SPEED_CONTROL ( (uint32_t) 0x13 ) /* Bus Speed Select (control device entry into high-speed clocking mode) */ -#define SDIOD_CCCR_UHS_I ( (uint32_t) 0x14 ) /* UHS-I Support */ -#define SDIOD_CCCR_DRIVE ( (uint32_t) 0x15 ) /* Drive Strength */ -#define SDIOD_CCCR_INTEXT ( (uint32_t) 0x16 ) /* Interrupt Extension */ -#define SDIOD_CCCR_BRCM_CARDCAP ( (uint32_t) 0xF0 ) /* Brcm Card Capability */ -#define SDIOD_SEP_INT_CTL ( (uint32_t) 0xF2 ) /* Separate Interrupt Control*/ -#define SDIOD_CCCR_F1INFO ( (uint32_t) 0x100 ) /* Function 1 (Backplane) Info */ -#define SDIOD_CCCR_F1HP ( (uint32_t) 0x102 ) /* Function 1 (Backplane) High Power */ -#define SDIOD_CCCR_F1CISPTR_0 ( (uint32_t) 0x109 ) /* Function 1 (Backplane) CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_F1CISPTR_1 ( (uint32_t) 0x10A ) /* Function 1 (Backplane) CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_F1CISPTR_2 ( (uint32_t) 0x10B ) /* Function 1 (Backplane) CIS Base Address Pointer Register 2 (MSB - only bit 1 valid) */ -#define SDIOD_CCCR_F1BLKSIZE_0 ( (uint32_t) 0x110 ) /* Function 1 (Backplane) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_F1BLKSIZE_1 ( (uint32_t) 0x111 ) /* Function 1 (Backplane) SDIO Block Size Register 1 (MSB) */ -#define SDIOD_CCCR_F2INFO ( (uint32_t) 0x200 ) /* Function 2 (WLAN Data FIFO) Info */ -#define SDIOD_CCCR_F2HP ( (uint32_t) 0x202 ) /* Function 2 (WLAN Data FIFO) High Power */ -#define SDIOD_CCCR_F2CISPTR_0 ( (uint32_t) 0x209 ) /* Function 2 (WLAN Data FIFO) CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_F2CISPTR_1 ( (uint32_t) 0x20A ) /* Function 2 (WLAN Data FIFO) CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_F2CISPTR_2 ( (uint32_t) 0x20B ) /* Function 2 (WLAN Data FIFO) CIS Base Address Pointer Register 2 (MSB - only bit 1 valid) */ -#define SDIOD_CCCR_F2BLKSIZE_0 ( (uint32_t) 0x210 ) /* Function 2 (WLAN Data FIFO) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_F2BLKSIZE_1 ( (uint32_t) 0x211 ) /* Function 2 (WLAN Data FIFO) SDIO Block Size Register 1 (MSB) */ -#define SDIOD_CCCR_F3INFO ( (uint32_t) 0x300 ) /* Function 3 (Bluetooth Data FIFO) Info */ -#define SDIOD_CCCR_F3HP ( (uint32_t) 0x302 ) /* Function 3 (Bluetooth Data FIFO) High Power */ -#define SDIOD_CCCR_F3CISPTR_0 ( (uint32_t) 0x309 ) /* Function 3 (Bluetooth Data FIFO) CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_F3CISPTR_1 ( (uint32_t) 0x30A ) /* Function 3 (Bluetooth Data FIFO) CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_F3CISPTR_2 ( (uint32_t) 0x30B ) /* Function 3 (Bluetooth Data FIFO) CIS Base Address Pointer Register 2 (MSB - only bit 1 valid) */ -#define SDIOD_CCCR_F3BLKSIZE_0 ( (uint32_t) 0x310 ) /* Function 3 (Bluetooth Data FIFO) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_F3BLKSIZE_1 ( (uint32_t) 0x311 ) /* Function 3 (Bluetooth Data FIFO) SDIO Block Size Register 1 (MSB) */ - - -/* SDIO Function 1 (Backplane) register addresses */ -/* Addresses 0x00000000 - 0x0000FFFF are directly access the backplane - * throught the backplane window. Addresses above 0x0000FFFF are - * registers relating to backplane access, and do not require a backpane - * clock to access them - */ -#define SDIO_GPIO_SELECT ( (uint32_t) 0x10005 ) -#define SDIO_GPIO_OUTPUT ( (uint32_t) 0x10006 ) -#define SDIO_GPIO_ENABLE ( (uint32_t) 0x10007 ) -#define SDIO_FUNCTION2_WATERMARK ( (uint32_t) 0x10008 ) -#define SDIO_DEVICE_CONTROL ( (uint32_t) 0x10009 ) -#define SDIO_BACKPLANE_ADDRESS_LOW ( (uint32_t) 0x1000A ) -#define SDIO_BACKPLANE_ADDRESS_MID ( (uint32_t) 0x1000B ) -#define SDIO_BACKPLANE_ADDRESS_HIGH ( (uint32_t) 0x1000C ) -#define SDIO_FRAME_CONTROL ( (uint32_t) 0x1000D ) -#define SDIO_CHIP_CLOCK_CSR ( (uint32_t) 0x1000E ) -#define SDIO_PULL_UP ( (uint32_t) 0x1000F ) -#define SDIO_READ_FRAME_BC_LOW ( (uint32_t) 0x1001B ) -#define SDIO_READ_FRAME_BC_HIGH ( (uint32_t) 0x1001C ) -#define SDIO_MES_BUSY_CTRL ( (uint32_t) 0x1001D ) -#define SDIO_WAKEUP_CTRL ( (uint32_t) 0x1001E ) -#define SDIO_SLEEP_CSR ( (uint32_t) 0x1001F ) - -#define I_HMB_SW_MASK ( (uint32_t) 0x000000F0 ) -#define I_HMB_FRAME_IND ( 1<<6 ) -#define FRAME_AVAILABLE_MASK I_HMB_SW_MASK - -/****************************************************** - * SPI Constants - ******************************************************/ -/* GSPI v1 */ -#define SPI_FRAME_CONTROL ( (uint32_t) 0x1000D ) - -/* Register addresses */ -#define SPI_BUS_CONTROL ( (uint32_t) 0x0000 ) -#define SPI_RESPONSE_DELAY ( (uint32_t) 0x0001 ) -#define SPI_STATUS_ENABLE ( (uint32_t) 0x0002 ) -#define SPI_RESET_BP ( (uint32_t) 0x0003 ) /* (corerev >= 1) */ -#define SPI_INTERRUPT_REGISTER ( (uint32_t) 0x0004 ) /* 16 bits - Interrupt status */ -#define SPI_INTERRUPT_ENABLE_REGISTER ( (uint32_t) 0x0006 ) /* 16 bits - Interrupt mask */ -#define SPI_STATUS_REGISTER ( (uint32_t) 0x0008 ) /* 32 bits */ -#define SPI_FUNCTION1_INFO ( (uint32_t) 0x000C ) /* 16 bits */ -#define SPI_FUNCTION2_INFO ( (uint32_t) 0x000E ) /* 16 bits */ -#define SPI_FUNCTION3_INFO ( (uint32_t) 0x0010 ) /* 16 bits */ -#define SPI_READ_TEST_REGISTER ( (uint32_t) 0x0014 ) /* 32 bits */ -#define SPI_RESP_DELAY_F0 ( (uint32_t) 0x001c ) /* 8 bits (corerev >= 3) */ -#define SPI_RESP_DELAY_F1 ( (uint32_t) 0x001d ) /* 8 bits (corerev >= 3) */ -#define SPI_RESP_DELAY_F2 ( (uint32_t) 0x001e ) /* 8 bits (corerev >= 3) */ -#define SPI_RESP_DELAY_F3 ( (uint32_t) 0x001f ) /* 8 bits (corerev >= 3) */ - -/****************************************************** - * Bit Masks - ******************************************************/ - -/* SDIOD_CCCR_REV Bits */ -#define SDIO_REV_SDIOID_MASK ( (uint32_t) 0xF0 ) /* SDIO spec revision number */ -#define SDIO_REV_CCCRID_MASK ( (uint32_t) 0x0F ) /* CCCR format version number */ - -/* SDIOD_CCCR_SDREV Bits */ -#define SD_REV_PHY_MASK ( (uint32_t) 0x0F ) /* SD format version number */ - -/* SDIOD_CCCR_IOEN Bits */ -#define SDIO_FUNC_ENABLE_1 ( (uint32_t) 0x02 ) /* function 1 I/O enable */ -#define SDIO_FUNC_ENABLE_2 ( (uint32_t) 0x04 ) /* function 2 I/O enable */ -#define SDIO_FUNC_ENABLE_3 ( (uint32_t) 0x08 ) /* function 3 I/O enable */ - -/* SDIOD_CCCR_IORDY Bits */ -#define SDIO_FUNC_READY_1 ( (uint32_t) 0x02 ) /* function 1 I/O ready */ -#define SDIO_FUNC_READY_2 ( (uint32_t) 0x04 ) /* function 2 I/O ready */ -#define SDIO_FUNC_READY_3 ( (uint32_t) 0x08 ) /* function 3 I/O ready */ - -/* SDIOD_CCCR_INTEN Bits */ -#define INTR_CTL_MASTER_EN ( (uint32_t) 0x01 ) /* interrupt enable master */ -#define INTR_CTL_FUNC1_EN ( (uint32_t) 0x02 ) /* interrupt enable for function 1 */ -#define INTR_CTL_FUNC2_EN ( (uint32_t) 0x04 ) /* interrupt enable for function 2 */ - -/* SDIOD_SEP_INT_CTL Bits */ -#define SEP_INTR_CTL_MASK ( (uint32_t) 0x01 ) /* out-of-band interrupt mask */ -#define SEP_INTR_CTL_EN ( (uint32_t) 0x02 ) /* out-of-band interrupt output enable */ -#define SEP_INTR_CTL_POL ( (uint32_t) 0x04 ) /* out-of-band interrupt polarity */ - -/* SDIOD_CCCR_INTPEND Bits */ -#define INTR_STATUS_FUNC1 ( (uint32_t) 0x02 ) /* interrupt pending for function 1 */ -#define INTR_STATUS_FUNC2 ( (uint32_t) 0x04 ) /* interrupt pending for function 2 */ -#define INTR_STATUS_FUNC3 ( (uint32_t) 0x08 ) /* interrupt pending for function 3 */ - -/* SDIOD_CCCR_IOABORT Bits */ -#define IO_ABORT_RESET_ALL ( (uint32_t) 0x08 ) /* I/O card reset */ -#define IO_ABORT_FUNC_MASK ( (uint32_t) 0x07 ) /* abort selction: function x */ - -/* SDIOD_CCCR_BICTRL Bits */ -#define BUS_CARD_DETECT_DIS ( (uint32_t) 0x80 ) /* Card Detect disable */ -#define BUS_SPI_CONT_INTR_CAP ( (uint32_t) 0x40 ) /* support continuous SPI interrupt */ -#define BUS_SPI_CONT_INTR_EN ( (uint32_t) 0x20 ) /* continuous SPI interrupt enable */ -#define BUS_SD_DATA_WIDTH_MASK ( (uint32_t) 0x03 ) /* bus width mask */ -#define BUS_SD_DATA_WIDTH_4BIT ( (uint32_t) 0x02 ) /* bus width 4-bit mode */ -#define BUS_SD_DATA_WIDTH_1BIT ( (uint32_t) 0x00 ) /* bus width 1-bit mode */ - -/* SDIOD_CCCR_CAPABLITIES Bits */ -#define SDIO_CAP_4BLS ( (uint32_t) 0x80 ) /* 4-bit support for low speed card */ -#define SDIO_CAP_LSC ( (uint32_t) 0x40 ) /* low speed card */ -#define SDIO_CAP_E4MI ( (uint32_t) 0x20 ) /* enable interrupt between block of data in 4-bit mode */ -#define SDIO_CAP_S4MI ( (uint32_t) 0x10 ) /* support interrupt between block of data in 4-bit mode */ -#define SDIO_CAP_SBS ( (uint32_t) 0x08 ) /* support suspend/resume */ -#define SDIO_CAP_SRW ( (uint32_t) 0x04 ) /* support read wait */ -#define SDIO_CAP_SMB ( (uint32_t) 0x02 ) /* support multi-block transfer */ -#define SDIO_CAP_SDC ( (uint32_t) 0x01 ) /* Support Direct commands during multi-byte transfer */ - -/* SDIOD_CCCR_POWER_CONTROL Bits */ -#define SDIO_POWER_SMPC ( (uint32_t) 0x01 ) /* supports master power control (RO) */ -#define SDIO_POWER_EMPC ( (uint32_t) 0x02 ) /* enable master power control (allow > 200mA) (RW) */ - -/* SDIOD_CCCR_SPEED_CONTROL Bits */ -#define SDIO_SPEED_SHS ( (uint32_t) 0x01 ) /* supports high-speed [clocking] mode (RO) */ -#define SDIO_SPEED_EHS ( (uint32_t) 0x02 ) /* enable high-speed [clocking] mode (RW) */ - -/* SDIOD_CCCR_BRCM_CARDCAP Bits */ -#define SDIOD_CCCR_BRCM_CARDCAP_CMD14_SUPPORT ( (uint32_t) 0x02 ) /* Supports CMD14 */ -#define SDIOD_CCCR_BRCM_CARDCAP_CMD14_EXT ( (uint32_t) 0x04 ) /* CMD14 is allowed in FSM command state */ -#define SDIOD_CCCR_BRCM_CARDCAP_CMD_NODEC ( (uint32_t) 0x08 ) /* sdiod_aos does not decode any command */ - -/* GSPI */ -#define SPI_READ_TEST_REGISTER_VALUE ( (uint32_t) 0xFEEDBEAD ) -#define SPI_READ_TEST_REG_LSB ( ( ( SPI_READ_TEST_REGISTER_VALUE ) ) & 0xff ) -#define SPI_READ_TEST_REG_LSB_SFT1 ( ( ( SPI_READ_TEST_REGISTER_VALUE << 1 ) ) & 0xff ) -#define SPI_READ_TEST_REG_LSB_SFT2 ( ( ( SPI_READ_TEST_REGISTER_VALUE << 1 ) + 1 ) & 0xff ) -#define SPI_READ_TEST_REG_LSB_SFT3 ( ( ( SPI_READ_TEST_REGISTER_VALUE +1 ) << 1 ) & 0xff ) - - -/* SPI_BUS_CONTROL Bits */ -#define WORD_LENGTH_32 ( (uint32_t) 0x01 ) /* 0/1 16/32 bit word length */ -#define ENDIAN_BIG ( (uint32_t) 0x02 ) /* 0/1 Little/Big Endian */ -#define CLOCK_PHASE ( (uint32_t) 0x04 ) /* 0/1 clock phase delay */ -#define CLOCK_POLARITY ( (uint32_t) 0x08 ) /* 0/1 Idle state clock polarity is low/high */ -#define HIGH_SPEED_MODE ( (uint32_t) 0x10 ) /* 1/0 High Speed mode / Normal mode */ -#define INTERRUPT_POLARITY_HIGH ( (uint32_t) 0x20 ) /* 1/0 Interrupt active polarity is high/low */ -#define WAKE_UP ( (uint32_t) 0x80 ) /* 0/1 Wake-up command from Host to WLAN */ - -/* SPI_RESPONSE_DELAY Bit mask */ -#define RESPONSE_DELAY_MASK 0xFF /* Configurable rd response delay in multiples of 8 bits */ - -/* SPI_STATUS_ENABLE Bits */ -#define STATUS_ENABLE ( (uint32_t) 0x01 ) /* 1/0 Status sent/not sent to host after read/write */ -#define INTR_WITH_STATUS ( (uint32_t) 0x02 ) /* 0/1 Do-not / do-interrupt if status is sent */ -#define RESP_DELAY_ALL ( (uint32_t) 0x04 ) /* Applicability of resp delay to F1 or all func's read */ -#define DWORD_PKT_LEN_EN ( (uint32_t) 0x08 ) /* Packet len denoted in dwords instead of bytes */ -#define CMD_ERR_CHK_EN ( (uint32_t) 0x20 ) /* Command error check enable */ -#define DATA_ERR_CHK_EN ( (uint32_t) 0x40 ) /* Data error check enable */ - - - -/* SPI_RESET_BP Bits*/ -#define RESET_ON_WLAN_BP_RESET ( (uint32_t) 0x04 ) /* enable reset for WLAN backplane */ -//#define RESET_ON_BT_BP_RESET ( (uint32_t) 0x08 ) /* enable reset for BT backplane */ -#define RESET_SPI ( (uint32_t) 0x80 ) /* reset the above enabled logic */ - - - -/* SPI_INTERRUPT_REGISTER and SPI_INTERRUPT_ENABLE_REGISTER Bits */ -#define DATA_UNAVAILABLE ( (uint32_t) 0x0001 ) /* Requested data not available; Clear by writing a "1" */ -#define F2_F3_FIFO_RD_UNDERFLOW ( (uint32_t) 0x0002 ) -#define F2_F3_FIFO_WR_OVERFLOW ( (uint32_t) 0x0004 ) -#define COMMAND_ERROR ( (uint32_t) 0x0008 ) /* Cleared by writing 1 */ -#define DATA_ERROR ( (uint32_t) 0x0010 ) /* Cleared by writing 1 */ -#define F2_PACKET_AVAILABLE ( (uint32_t) 0x0020 ) -#define F3_PACKET_AVAILABLE ( (uint32_t) 0x0040 ) -#define F1_OVERFLOW ( (uint32_t) 0x0080 ) /* Due to last write. Bkplane has pending write requests */ -#define MISC_INTR0 ( (uint32_t) 0x0100 ) -#define MISC_INTR1 ( (uint32_t) 0x0200 ) -#define MISC_INTR2 ( (uint32_t) 0x0400 ) -#define MISC_INTR3 ( (uint32_t) 0x0800 ) -#define MISC_INTR4 ( (uint32_t) 0x1000 ) -#define F1_INTR ( (uint32_t) 0x2000 ) -#define F2_INTR ( (uint32_t) 0x4000 ) -#define F3_INTR ( (uint32_t) 0x8000 ) - - - - -/* SPI_STATUS_REGISTER Bits */ -#define STATUS_DATA_NOT_AVAILABLE ( (uint32_t) 0x00000001 ) -#define STATUS_UNDERFLOW ( (uint32_t) 0x00000002 ) -#define STATUS_OVERFLOW ( (uint32_t) 0x00000004 ) -#define STATUS_F2_INTR ( (uint32_t) 0x00000008 ) -#define STATUS_F3_INTR ( (uint32_t) 0x00000010 ) -#define STATUS_F2_RX_READY ( (uint32_t) 0x00000020 ) -#define STATUS_F3_RX_READY ( (uint32_t) 0x00000040 ) -#define STATUS_HOST_CMD_DATA_ERR ( (uint32_t) 0x00000080 ) -#define STATUS_F2_PKT_AVAILABLE ( (uint32_t) 0x00000100 ) -#define STATUS_F2_PKT_LEN_MASK ( (uint32_t) 0x000FFE00 ) -#define STATUS_F2_PKT_LEN_SHIFT ( (uint32_t) 9 ) -#define STATUS_F3_PKT_AVAILABLE ( (uint32_t) 0x00100000 ) -#define STATUS_F3_PKT_LEN_MASK ( (uint32_t) 0xFFE00000 ) -#define STATUS_F3_PKT_LEN_SHIFT ( (uint32_t) 21 ) - - - - - -/* SDIO_CHIP_CLOCK_CSR Bits */ -#define SBSDIO_FORCE_ALP ( (uint32_t) 0x01 ) /* Force ALP request to backplane */ -#define SBSDIO_FORCE_HT ( (uint32_t) 0x02 ) /* Force HT request to backplane */ -#define SBSDIO_FORCE_ILP ( (uint32_t) 0x04 ) /* Force ILP request to backplane */ -#define SBSDIO_ALP_AVAIL_REQ ( (uint32_t) 0x08 ) /* Make ALP ready (power up xtal) */ -#define SBSDIO_HT_AVAIL_REQ ( (uint32_t) 0x10 ) /* Make HT ready (power up PLL) */ -#define SBSDIO_FORCE_HW_CLKREQ_OFF ( (uint32_t) 0x20 ) /* Squelch clock requests from HW */ -#define SBSDIO_ALP_AVAIL ( (uint32_t) 0x40 ) /* Status: ALP is ready */ -#define SBSDIO_HT_AVAIL ( (uint32_t) 0x80 ) /* Status: HT is ready */ -#define SBSDIO_Rev8_HT_AVAIL ( (uint32_t) 0x40 ) -#define SBSDIO_Rev8_ALP_AVAIL ( (uint32_t) 0x80 ) - - -/* SDIO_FRAME_CONTROL Bits */ -#define SFC_RF_TERM ( (uint32_t) (1 << 0) ) /* Read Frame Terminate */ -#define SFC_WF_TERM ( (uint32_t) (1 << 1) ) /* Write Frame Terminate */ -#define SFC_CRC4WOOS ( (uint32_t) (1 << 2) ) /* HW reports CRC error for write out of sync */ -#define SFC_ABORTALL ( (uint32_t) (1 << 3) ) /* Abort cancels all in-progress frames */ - -/* SDIO_TO_SB_MAIL_BOX bits corresponding to intstatus bits */ -#define SMB_NAK ( (uint32_t) (1 << 0) ) /* To SB Mailbox Frame NAK */ -#define SMB_INT_ACK ( (uint32_t) (1 << 1) ) /* To SB Mailbox Host Interrupt ACK */ -#define SMB_USE_OOB ( (uint32_t) (1 << 2) ) /* To SB Mailbox Use OOB Wakeup */ -#define SMB_DEV_INT ( (uint32_t) (1 << 3) ) /* To SB Mailbox Miscellaneous Interrupt */ - -/* SDIO_WAKEUP_CTRL bits */ -#define SBSDIO_WCTRL_WAKE_TILL_ALP_AVAIL ( (uint32_t) (1 << 0) ) /* WakeTillAlpAvail bit */ -#define SBSDIO_WCTRL_WAKE_TILL_HT_AVAIL ( (uint32_t) (1 << 1) ) /* WakeTillHTAvail bit */ - -/* SDIO_SLEEP_CSR bits */ -#define SBSDIO_SLPCSR_KEEP_SDIO_ON ( (uint32_t) (1 << 0) ) /* KeepSdioOn bit */ -#define SBSDIO_SLPCSR_DEVICE_ON ( (uint32_t) (1 << 1) ) /* DeviceOn bit */ - -#define WL_CHANSPEC_CTL_SB_LLL 0x0000 -#define WL_CHANSPEC_CTL_SB_LLU 0x0100 -#define WL_CHANSPEC_CTL_SB_LUL 0x0200 -#define WL_CHANSPEC_CTL_SB_LUU 0x0300 -#define WL_CHANSPEC_CTL_SB_ULL 0x0400 -#define WL_CHANSPEC_CTL_SB_ULU 0x0500 -#define WL_CHANSPEC_CTL_SB_UUL 0x0600 -#define WL_CHANSPEC_CTL_SB_UUU 0x0700 -#define WL_CHANSPEC_CTL_SB_LL WL_CHANSPEC_CTL_SB_LLL -#define WL_CHANSPEC_CTL_SB_LU WL_CHANSPEC_CTL_SB_LLU -#define WL_CHANSPEC_CTL_SB_UL WL_CHANSPEC_CTL_SB_LUL -#define WL_CHANSPEC_CTL_SB_UU WL_CHANSPEC_CTL_SB_LUU -#define WL_CHANSPEC_CTL_SB_L WL_CHANSPEC_CTL_SB_LLL -#define WL_CHANSPEC_CTL_SB_U WL_CHANSPEC_CTL_SB_LLU -#define WL_CHANSPEC_CTL_SB_LOWER WL_CHANSPEC_CTL_SB_LLL -#define WL_CHANSPEC_CTL_SB_UPPER WL_CHANSPEC_CTL_SB_LLU -#define WL_CHANSPEC_CTL_SB_NONE WL_CHANSPEC_CTL_SB_LLL -#define WL_CHANSPEC_BAND_MASK 0xc000 -#define WL_CHANSPEC_BAND_SHIFT 14 -#define WL_CHANSPEC_BAND_5G 0xc000 -#define WL_CHANSPEC_BAND_2G 0x0000 -#define INVCHANSPEC 255 - -#define WL_CHANSPEC_CTL_SB_MASK 0x0700 -#define WL_CHANSPEC_CTL_SB_SHIFT 8 -#define WL_CHANSPEC_CTL_SB_LOWER WL_CHANSPEC_CTL_SB_LLL -#define WL_CHANSPEC_CTL_SB_UPPER WL_CHANSPEC_CTL_SB_LLU - #define WL_CHANSPEC_CTL_SB_NONE WL_CHANSPEC_CTL_SB_LLL -#define WL_CHANSPEC_BW_MASK 0x3800 -#define WL_CHANSPEC_BW_SHIFT 11 -#define WL_CHANSPEC_BW_10 0x0800 -#define WL_CHANSPEC_BW_20 0x1000 -#define WL_CHANSPEC_BW_40 0x1800 - -/* CIS accesses require backpane clock */ - - -#undef CHIP_HAS_BSSID_CNT_IN_ASSOC_PARAMS -#undef CHIP_FIRMWARE_SUPPORTS_PM_LIMIT_IOVAR - -struct ether_addr; -struct wl_join_scan_params; - -typedef struct wl_assoc_params -{ - struct ether_addr bssid; -#ifdef CHIP_HAS_BSSID_CNT_IN_ASSOC_PARAMS - uint16_t bssid_cnt; -#endif /* ifdef CHIP_HAS_BSSID_CNT_IN_ASSOC_PARAMS */ - uint32_t chanspec_num; - chanspec_t chanspec_list[1]; -} wl_assoc_params_t; -#define WL_ASSOC_PARAMS_FIXED_SIZE (sizeof(wl_assoc_params_t) - sizeof(wl_chanspec_t)) -typedef wl_assoc_params_t wl_reassoc_params_t; -#define WL_REASSOC_PARAMS_FIXED_SIZE WL_ASSOC_PARAMS_FIXED_SIZE -typedef wl_assoc_params_t wl_join_assoc_params_t; -#define WL_JOIN_ASSOC_PARAMS_FIXED_SIZE WL_ASSOC_PARAMS_FIXED_SIZE -typedef struct wl_join_params -{ - wlc_ssid_t ssid; - struct wl_assoc_params params; -} wl_join_params_t; -#define WL_JOIN_PARAMS_FIXED_SIZE (sizeof(wl_join_params_t) - sizeof(wl_chanspec_t)) - -/* extended join params */ -typedef struct wl_extjoin_params { - wlc_ssid_t ssid; /* {0, ""}: wildcard scan */ - struct wl_join_scan_params scan_params; - wl_join_assoc_params_t assoc_params; /* optional field, but it must include the fixed portion - * of the wl_join_assoc_params_t struct when it does - * present. - */ -} wl_extjoin_params_t; -#define WL_EXTJOIN_PARAMS_FIXED_SIZE (sizeof(wl_extjoin_params_t) - sizeof(chanspec_t)) - - -typedef wl_cnt_ver_ten_t wiced_counters_t; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ifndef INCLUDED_CHIP_CONSTANTS_H_ */ diff --git a/components/WWD/WWD/internal/chips/4343x/wwd_ap.c b/components/WWD/WWD/internal/chips/4343x/wwd_ap.c deleted file mode 100644 index dcb71d191fe0bc5278fe7179f25ebe5fc5756b56..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/chips/4343x/wwd_ap.c +++ /dev/null @@ -1,469 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Provides an APSTA functionality specific to the 43362A2 - */ - -#include -#include "wwd_rtos.h" -#include "wwd_events.h" -#include "wwd_assert.h" -#include "wwd_management.h" -#include "wwd_wifi.h" -#include "network/wwd_buffer_interface.h" -#include "internal/wwd_sdpcm.h" -#include "internal/wwd_internal.h" -#include "internal/wwd_ap.h" -#include "platform_toolchain.h" -#include "internal/wwd_ap_common.h" - -/****************************************************** - * Macros - ******************************************************/ - -/****************************************************** - * @cond Constants - ******************************************************/ - -#define WLC_EVENT_MSG_LINK (0x01) -#define RATE_SETTING_11_MBPS (11000000 / 500000) - -/** @endcond */ - -/* HT/AMPDU specific define */ -#define AMPDU_AP_DEFAULT_BA_WSIZE 2 /* AP default BA window size */ -#define AMPDU_STA_DEFAULT_BA_WSIZE 8 /* STA default BA window size */ -#define AMPDU_STA_DEFAULT_MPDU 4 /* STA default num MPDU per AMPDU */ - -#define WEP40_KEY_LENGTH 5 -#define WEP104_KEY_LENGTH 13 -#define FORMATTED_ASCII_WEP40_KEY_LENGTH 28 /* For 5 bytes key */ -#define FORMATTED_ASCII_WEP104_KEY_LENGTH 60 /* For 13 bytes key */ - -/****************************************************** - * Enumerations - ******************************************************/ - -typedef enum -{ - BSS_AP = 3, - BSS_STA = 2, - BSS_UP = 1, - BSS_DOWN = 0 -} bss_arg_option_t; - -typedef enum -{ - WEP_OPEN_SYSTEM_AUTHENTICATION = 0, - WEP_SHARED_KEY_AUTHENTICATION = 1 -} wep_authentication_type_t; - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - -static void* wwd_handle_apsta_event ( const wwd_event_header_t* event_header, const uint8_t* event_data, /*@returned@*/ void* handler_user_data ); -static wwd_result_t internal_ap_init ( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ); -wwd_result_t wwd_wifi_ap_init ( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ); -wwd_result_t wwd_wifi_ap_up ( void ); - -/****************************************************** - * Variables Definitions - ******************************************************/ - -wiced_bool_t wwd_wifi_ap_is_up = WICED_FALSE; -static host_semaphore_type_t wwd_wifi_sleep_flag; -static const wwd_event_num_t apsta_events[] = { WLC_E_IF, WLC_E_LINK, WLC_E_NONE }; - -/****************************************************** - * Function Definitions - ******************************************************/ - -static void* wwd_handle_apsta_event( const wwd_event_header_t* event_header, const uint8_t* event_data, /*@returned@*/ void* handler_user_data ) -{ - UNUSED_PARAMETER( event_header ); - UNUSED_PARAMETER( event_data ); - UNUSED_PARAMETER( handler_user_data ); - - if ( (wwd_interface_t) event_header->interface != WWD_AP_INTERFACE) - { - return handler_user_data; - } - - if ( ( ( event_header->event_type == (wwd_event_num_t) WLC_E_LINK ) && - ( event_header->interface == WWD_AP_INTERFACE ) ) || - ( event_header->event_type == WLC_E_IF ) ) - { - wwd_result_t result; - result = host_rtos_set_semaphore( &wwd_wifi_sleep_flag, WICED_FALSE ); - wiced_assert( "failed to post AP link semaphore", result == WWD_SUCCESS ); - REFERENCE_DEBUG_ONLY_VARIABLE( result ); - } - return handler_user_data; -} - -static wwd_result_t internal_ap_init( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ) -{ - wiced_bool_t wait_for_interface = WICED_FALSE; - wwd_result_t result; - wiced_buffer_t response; - wiced_buffer_t buffer; - uint32_t* data; - uint32_t bss_index = WWD_AP_INTERFACE; - -#ifdef WICED_WIFI_SOFT_AP_WEP_SUPPORT_ENABLED - uint32_t* auth; - uint16_t length; -#endif - - if ( ( ( auth_type == WICED_SECURITY_WPA_TKIP_PSK ) || ( auth_type == WICED_SECURITY_WPA2_AES_PSK ) || ( auth_type == WICED_SECURITY_WPA2_MIXED_PSK ) ) && - ( ( key_length < (uint8_t) 8 ) || ( key_length > (uint8_t) 64 ) ) ) - { - WPRINT_APP_INFO(( "Error: WPA security key length must be between 8 and 64\n" )); - return WWD_WPA_KEYLEN_BAD; - } - -#ifdef WICED_WIFI_SOFT_AP_WEP_SUPPORT_ENABLED - else if( (( auth_type == WICED_SECURITY_WEP_PSK ) || ( auth_type == WICED_SECURITY_WEP_SHARED )) && - (( key_length != FORMATTED_ASCII_WEP40_KEY_LENGTH ) && ( key_length != FORMATTED_ASCII_WEP104_KEY_LENGTH )) ) - { - WPRINT_APP_INFO(( "Error: WEP security Key length must be either 5 / 13 bytes\n" )); - return WWD_WEP_KEYLEN_BAD; - } -#endif - - if ( ( wwd_wifi_p2p_go_is_up == WICED_TRUE ) || ( wwd_wifi_ap_is_up == WICED_TRUE ) ) - { - WPRINT_APP_INFO(( "Error: Soft AP or Wi-Fi Direct group owner already up\n" )); - return WWD_AP_ALREADY_UP; - } - - /* Query bss state (does it exist? if so is it UP?) */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) bss_index; - if ( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_STA_INTERFACE ) != WWD_SUCCESS ) - { - /* Note: We don't need to release the response packet since the iovar failed */ - wait_for_interface = WICED_TRUE; - } - else - { - /* Check if the BSS is already UP, if so return */ - uint32_t* data2 = (uint32_t*) host_buffer_get_current_piece_data_pointer( response ); - if ( *data2 == (uint32_t) BSS_UP ) - { - host_buffer_release( response, WWD_NETWORK_RX ); - wwd_wifi_ap_is_up = WICED_TRUE; - return WWD_SUCCESS; - } - else - { - host_buffer_release( response, WWD_NETWORK_RX ); - } - } - - CHECK_RETURN( host_rtos_init_semaphore( &wwd_wifi_sleep_flag ) ); - - /* Register for interested events */ - CHECK_RETURN_WITH_SEMAPHORE( wwd_management_set_event_handler( apsta_events, wwd_handle_apsta_event, NULL, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Check if we need to wait for interface to be created */ - if ( wait_for_interface == WICED_TRUE ) - { - CHECK_RETURN_WITH_SEMAPHORE( host_rtos_get_semaphore( &wwd_wifi_sleep_flag, (uint32_t) 10000, WICED_FALSE ), &wwd_wifi_sleep_flag ); - } - - if ( wwd_wifi_set_block_ack_window_size( WWD_AP_INTERFACE ) != WWD_SUCCESS ) - { - return WWD_SET_BLOCK_ACK_WINDOW_FAIL; - } - - /* Set the SSID */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 40, "bsscfg:" IOVAR_STR_SSID ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = bss_index; /* Set the bsscfg index */ - data[1] = ssid->length; /* Set the ssid length */ - memcpy( &data[2], (uint8_t*) ssid->value, ssid->length ); - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Set the channel */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - *data = channel; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_CHANNEL, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - -#ifdef WICED_WIFI_SOFT_AP_WEP_SUPPORT_ENABLED - if ( ( auth_type == WICED_SECURITY_WEP_PSK ) || ( auth_type == WICED_SECURITY_WEP_SHARED ) ) - { - for ( length = 0; length < key_length; length = (uint16_t) ( length + 2 + security_key[ 1 ] ) ) - { - const wiced_wep_key_t* in_key = (const wiced_wep_key_t*) &security_key[ length ]; - wl_wsec_key_t* out_key = (wl_wsec_key_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(wl_wsec_key_t) ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( out_key, &wwd_wifi_sleep_flag ); - memset( out_key, 0, sizeof(wl_wsec_key_t) ); - out_key->index = in_key->index; - out_key->len = in_key->length; - memcpy( out_key->data, in_key->data, in_key->length ); - switch ( in_key->length ) - { - case WEP40_KEY_LENGTH: - out_key->algo = (uint32_t) CRYPTO_ALGO_WEP1; - break; - case WEP104_KEY_LENGTH: - out_key->algo = (uint32_t) CRYPTO_ALGO_WEP128; - break; - default: - host_buffer_release( buffer, WWD_NETWORK_TX ); - return WWD_INVALID_KEY; - } - /* Set the first entry as primary key by default */ - if ( length == 0 ) - { - out_key->flags |= WL_PRIMARY_KEY; - } - out_key->index = htod32(out_key->index); - out_key->len = htod32(out_key->len); - out_key->algo = htod32(out_key->algo); - out_key->flags = htod32(out_key->flags); - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_KEY, buffer, NULL, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - } - - /* Set authentication type */ - auth = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( auth, &wwd_wifi_sleep_flag ); - if ( auth_type == WICED_SECURITY_WEP_SHARED ) - { - *auth = WEP_SHARED_KEY_AUTHENTICATION; /* 1 = Shared Key authentication */ - } - else - { - *auth = WEP_OPEN_SYSTEM_AUTHENTICATION; /* 0 = Open System authentication */ - } - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_AUTH, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - } -#endif - - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, "bsscfg:" IOVAR_STR_WSEC ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = bss_index; - if ((auth_type & WPS_ENABLED) != 0) - { - data[1] = (uint32_t) ( ( auth_type & ( ~WPS_ENABLED ) ) | SES_OW_ENABLED ); - } - else - { - data[1] = (uint32_t) auth_type; - } - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ), &wwd_wifi_sleep_flag ); - - if ( ( auth_type != WICED_SECURITY_OPEN ) && ( auth_type != WICED_SECURITY_WEP_PSK ) && ( auth_type != WICED_SECURITY_WEP_SHARED ) ) - { - wsec_pmk_t* psk; - - /* Set the wpa auth */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, "bsscfg:" IOVAR_STR_WPA_AUTH ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = bss_index; - data[1] = (uint32_t) (auth_type == WICED_SECURITY_WPA_TKIP_PSK) ? ( WPA_AUTH_PSK ) : ( WPA2_AUTH_PSK | WPA_AUTH_PSK ); - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Set the passphrase */ - psk = (wsec_pmk_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(wsec_pmk_t) ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( psk, &wwd_wifi_sleep_flag ); - memcpy( psk->key, security_key, key_length ); - psk->key_len = key_length; - psk->flags = (uint16_t) WSEC_PASSPHRASE; - host_rtos_delay_milliseconds( 1 ); /* Delay required to allow radio firmware to be ready to receive PMK and avoid intermittent failure */ - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_WSEC_PMK, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - } - - /* Set the GMode */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - *data = (uint32_t) GMODE_AUTO; - - result = wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_GMODE, buffer, 0, WWD_AP_INTERFACE ); - if ( ( result != WWD_SUCCESS ) && ( result != WWD_WLAN_ASSOCIATED ) ) - { - wiced_assert("start_ap: Failed to set GMode\n", 0 == 1 ); - - (void) host_rtos_deinit_semaphore( &wwd_wifi_sleep_flag ); - return result; - } - - /* Set the multicast transmission rate to 11 Mbps rather than the default 1 Mbps */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_2G_MULTICAST_RATE ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) RATE_SETTING_11_MBPS; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Set DTIM period */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - *data = (uint32_t) WICED_DEFAULT_SOFT_AP_DTIM_PERIOD; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_DTIMPRD, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - -#ifdef WICED_DISABLE_SSID_BROADCAST - /* Make the AP "hidden" */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_CLOSEDNET ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = (uint32_t) 1; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); -#endif - -#ifdef WICED_WIFI_ISOLATE_AP_CLIENTS - result = wwd_wifi_enable_ap_isolate( WWD_AP_INTERFACE, WICED_TRUE ); - wiced_assert("start_ap: Failed to disable intra BSS routing\r\n", result == WWD_SUCCESS ); -#endif /* WICED_WIFI_ISOLATE_AP_CLIENTS */ - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_ap_init( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ) -{ - wwd_result_t result; - - /* Keep WLAN awake while setting up softAP */ - WWD_WLAN_KEEP_AWAKE( ); - - result = internal_ap_init( ssid, auth_type, security_key, key_length, channel ); - - WWD_WLAN_LET_SLEEP( ); - - return result; -} - -wwd_result_t wwd_wifi_ap_up( void ) -{ - wiced_buffer_t buffer; - uint32_t* data; - - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = wwd_get_bss_index( WWD_AP_INTERFACE ); - data[1] = (uint32_t) BSS_UP; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Wait until AP is brought up */ - CHECK_RETURN_WITH_SEMAPHORE( host_rtos_get_semaphore( &wwd_wifi_sleep_flag, (uint32_t) 10000, WICED_FALSE ), &wwd_wifi_sleep_flag ); - - wwd_wifi_ap_is_up = WICED_TRUE; - return WWD_SUCCESS; -} - -/** Starts an infrastructure WiFi network - * @param ssid : A null terminated string containing the SSID name of the network to join - * @param auth_type : Authentication type: - * - WICED_SECURITY_OPEN - Open Security - * - WICED_SECURITY_WPA_TKIP_PSK - WPA Security - * - WICED_SECURITY_WPA2_AES_PSK - WPA2 Security using AES cipher - * - WICED_SECURITY_WPA2_MIXED_PSK - WPA2 Security using AES and/or TKIP ciphers - * - WEP security is currently unimplemented due to lack of security - * @param security_key : A byte array containing the cleartext security key for the network - * @param key_length : The length of the security_key in bytes. - * @param channel : 802.11 Channel number - * - * @return WWD_SUCCESS : if successfully creates an AP - * Error code : if an error occurred - */ -wwd_result_t wwd_wifi_start_ap( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ) -{ - CHECK_RETURN( wwd_wifi_ap_init( ssid, auth_type, security_key, key_length, channel ) ); - - CHECK_RETURN( wwd_wifi_ap_up() ); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_stop_ap( void ) -{ - uint32_t* data; - wiced_buffer_t buffer; - wiced_buffer_t response; - wwd_result_t result; - wwd_result_t result2; - - /* Query bss state (does it exist? if so is it UP?) */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER( data ); - *data = wwd_get_bss_index( WWD_AP_INTERFACE ); - result = wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_STA_INTERFACE ); - if ( result == WWD_WLAN_NOTFOUND ) - { - /* AP interface does not exist - i.e. it is down */ - wwd_wifi_ap_is_up = WICED_FALSE; - return WWD_SUCCESS; - } - - CHECK_RETURN( result ); - - data = (uint32_t*) host_buffer_get_current_piece_data_pointer( response ); - if ( data[0] != (uint32_t) BSS_UP ) - { - /* AP interface indicates it is not up - i.e. it is down */ - host_buffer_release( response, WWD_NETWORK_RX ); - wwd_wifi_ap_is_up = WICED_FALSE; - return WWD_SUCCESS; - } - - host_buffer_release( response, WWD_NETWORK_RX ); - - /* set BSS down */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER( data ); - data[0] = wwd_get_bss_index( WWD_AP_INTERFACE ); - data[1] = (uint32_t) BSS_DOWN; - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ) ); - - /* Wait until AP is brought down */ - result = host_rtos_get_semaphore( &wwd_wifi_sleep_flag, (uint32_t) 10000, WICED_FALSE ); - result2 = host_rtos_deinit_semaphore( &wwd_wifi_sleep_flag ); - if ( result != WWD_SUCCESS ) - { - return result; - } - if ( result2 != WWD_SUCCESS ) - { - return result2; - } - - CHECK_RETURN( wwd_management_set_event_handler( apsta_events, NULL, NULL, WWD_AP_INTERFACE ) ); - - wwd_wifi_ap_is_up = WICED_FALSE; - return WWD_SUCCESS; - -} - -/** Sets the chip specific AMPDU parameters for AP and STA - * For SDK 3.0, and beyond, each chip will need it's own function for setting AMPDU parameters. - */ - -wwd_result_t wwd_wifi_set_ampdu_parameters( void ) -{ - return wwd_wifi_set_ampdu_parameters_common( WWD_STA_INTERFACE, AMPDU_STA_DEFAULT_BA_WSIZE, AMPDU_STA_DEFAULT_MPDU, AMPDU_RX_FACTOR_8K ); -} - -/** Sets the chip specific AMPDU parameters for AP and STA - * For SDK 3.0, and beyond, each chip will need it's own function for setting AMPDU parameters. - */ -wwd_result_t wwd_wifi_set_block_ack_window_size( wwd_interface_t interface ) -{ - return wwd_wifi_set_block_ack_window_size_common( interface, AMPDU_AP_DEFAULT_BA_WSIZE, AMPDU_STA_DEFAULT_BA_WSIZE ); -} diff --git a/components/WWD/WWD/internal/chips/4343x/wwd_chip_specific_functions.c b/components/WWD/WWD/internal/chips/4343x/wwd_chip_specific_functions.c deleted file mode 100644 index 4a1c0c7b2f9644e24ea3fff3452dc73c549620b8..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/chips/4343x/wwd_chip_specific_functions.c +++ /dev/null @@ -1,316 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * - */ -#include "wwd_constants.h" -#include "wwd_wifi.h" -#include "internal/wwd_internal.h" -#include "internal/bus_protocols/wwd_bus_protocol_interface.h" - -/****************************************************** - * Macros - ******************************************************/ - -#define VERIFY_RESULT( x ) { wwd_result_t verify_result; verify_result = ( x ); if ( verify_result != WWD_SUCCESS ) return verify_result; } - -/****************************************************** - * Constants - ******************************************************/ -#define PLATFORM_WLAN_RAM_BASE ( 0x0 ) -#define PLATFORM_WLAN_RAM_SIZE ( CHIP_RAM_SIZE ) - -#define WLAN_BUS_UP_ATTEMPTS ( 1000 ) -#define KSO_WAIT_MS ( 1 ) -#define MAX_KSO_ATTEMPTS ( 64 ) - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - -#ifndef WWD_DISABLE_SAVE_RESTORE -static wwd_result_t wwd_enable_save_restore( void ); -#endif /* WWD_DISABLE_SAVE_RESTORE */ -static wiced_bool_t wwd_is_fw_sr_capable( void ); -static wwd_result_t wwd_kso_enable( wiced_bool_t enable ); - -/****************************************************** - * Variables Definitions - ******************************************************/ - -static wiced_bool_t bus_is_up = WICED_FALSE; -static wiced_bool_t save_restore_enable = WICED_FALSE; - -/****************************************************** - * Function Definitions - ******************************************************/ - -wwd_result_t wwd_wifi_read_wlan_log( char* buffer, uint32_t buffer_size ) -{ - wwd_result_t result; - uint32_t wlan_shared_address; - - /* Backplane access needs HT clock. So, disabling bus sleep */ - WWD_WLAN_KEEP_AWAKE(); - - /* FW populates the last word of RAM with wlan_shared_t struct address */ - if ( wwd_is_fw_sr_capable() == WICED_TRUE ) - { - wlan_shared_address = PLATFORM_WLAN_RAM_BASE + PLATFORM_WLAN_RAM_SIZE - SOCSRAM_SRMEM_SIZE - 4; - } - else - { - wlan_shared_address = PLATFORM_WLAN_RAM_BASE + PLATFORM_WLAN_RAM_SIZE - 4; - } - - result = wwd_wifi_read_wlan_log_unsafe( wlan_shared_address, buffer, buffer_size ); - - WWD_WLAN_LET_SLEEP(); - - return result; -} - -wwd_result_t wwd_wifi_set_custom_country_code( const wiced_country_info_t* country_code ) -{ - UNUSED_PARAMETER(country_code); - return WWD_UNSUPPORTED; -} - -wwd_result_t wwd_chip_specific_init( void ) -{ -#ifndef WWD_DISABLE_SAVE_RESTORE - return wwd_enable_save_restore(); -#else - return WWD_SUCCESS; -#endif -} - -wwd_result_t wwd_chip_specific_socsram_init( void ) -{ - /* Disable remap for SRAM_3. Required only for 4343x */ - VERIFY_RESULT( wwd_bus_write_backplane_value( SOCSRAM_BANKX_INDEX, 4, 0x3 )); - VERIFY_RESULT( wwd_bus_write_backplane_value( SOCSRAM_BANKX_PDA, 4, 0 )); - return WWD_SUCCESS; -} - -wwd_result_t wwd_ensure_wlan_bus_is_up( void ) -{ - /* Ensure HT clock is up */ - if ( bus_is_up == WICED_TRUE ) - { - return WWD_SUCCESS; - } - - if ( save_restore_enable == WICED_FALSE ) - { - uint8_t csr = 0; - uint32_t attempts = (uint32_t) WLAN_BUS_UP_ATTEMPTS; - - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, (uint32_t) SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, (uint32_t) SBSDIO_HT_AVAIL_REQ ) ); - - do - { - VERIFY_RESULT( wwd_bus_read_register_value( BACKPLANE_FUNCTION, (uint32_t) SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, &csr ) ); - --attempts; - } - while ( ( ( csr & SBSDIO_HT_AVAIL ) == 0 ) && - ( attempts != 0 ) && - ( host_rtos_delay_milliseconds( (uint32_t) 1 ), 1==1 ) ); - - if ( attempts == 0 ) - { - return WWD_SDIO_BUS_UP_FAIL; - } - else - { - bus_is_up = WICED_TRUE; - return WWD_SUCCESS; - } - } - else - { - if ( wwd_kso_enable( WICED_TRUE ) == WWD_SUCCESS ) - { - bus_is_up = WICED_TRUE; - return WWD_SUCCESS; - } - else - { - return WWD_SDIO_BUS_UP_FAIL; - } - } -} - -wwd_result_t wwd_allow_wlan_bus_to_sleep( void ) -{ - /* Clear HT clock request */ - if ( bus_is_up == WICED_TRUE ) - { - bus_is_up = WICED_FALSE; - if ( save_restore_enable == WICED_FALSE ) - { - return wwd_bus_write_register_value( BACKPLANE_FUNCTION, (uint32_t) SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, 0 ); - } - else - { - return wwd_kso_enable( WICED_FALSE ); - } - } - else - { - return WWD_SUCCESS; - } -} - -#ifndef WWD_DISABLE_SAVE_RESTORE -static wwd_result_t wwd_enable_save_restore( void ) -{ - uint8_t data; - - if ( wwd_is_fw_sr_capable() == WICED_TRUE ) - { - /* Configure WakeupCtrl register to set HtAvail request bit in chipClockCSR register - * after the sdiod core is powered on. - */ - VERIFY_RESULT( wwd_bus_read_register_value( BACKPLANE_FUNCTION, (uint32_t ) SDIO_WAKEUP_CTRL, (uint8_t ) 1, &data ) ); - data |= SBSDIO_WCTRL_WAKE_TILL_HT_AVAIL; - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, (uint32_t ) SDIO_WAKEUP_CTRL, (uint8_t ) 1, data ) ); - - /* Set brcmCardCapability to noCmdDecode mode. - * It makes sdiod_aos to wakeup host for any activity of cmd line, even though - * module won't decode cmd or respond - */ - VERIFY_RESULT( wwd_bus_write_register_value( BUS_FUNCTION, (uint32_t ) SDIOD_CCCR_BRCM_CARDCAP, (uint8_t ) 1, SDIOD_CCCR_BRCM_CARDCAP_CMD_NODEC ) ); - - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, (uint32_t) SDIO_CHIP_CLOCK_CSR, (uint8_t) 1, (uint32_t) SBSDIO_FORCE_HT ) ); - - /* Enable KeepSdioOn (KSO) bit for normal operation */ - VERIFY_RESULT( wwd_bus_read_register_value( BACKPLANE_FUNCTION, (uint32_t ) SDIO_SLEEP_CSR, (uint8_t ) 1, &data ) ); - if ( ( data & SBSDIO_SLPCSR_KEEP_SDIO_ON ) == 0 ) - { - data |= SBSDIO_SLPCSR_KEEP_SDIO_ON; - VERIFY_RESULT( wwd_bus_write_register_value( BACKPLANE_FUNCTION, (uint32_t ) SDIO_SLEEP_CSR, (uint8_t ) 1, data ) ); - } - - /* SPI bus can be configured for sleep by default. - * KSO bit solely controls the wlan chip sleep - */ - VERIFY_RESULT( wwd_bus_specific_sleep( ) ); - - save_restore_enable = WICED_TRUE; - } - else - { - save_restore_enable = WICED_FALSE; - } - - return WWD_SUCCESS; -} -#endif /* WWD_DISABLE_SAVE_RESTORE */ - -static wiced_bool_t wwd_is_fw_sr_capable( void ) -{ - uint32_t srctrl = 0; - /* check if fw initialized sr engine */ - if( wwd_bus_read_backplane_value( (uint32_t) CHIPCOMMON_SR_CONTROL1, (uint8_t) 4, (uint8_t*)&srctrl ) != WWD_SUCCESS) - { - return WICED_FALSE; - } - - if ( srctrl != 0 ) - { - return WICED_TRUE; - } - else - { - return WICED_FALSE; - } -} - -static wwd_result_t wwd_kso_enable( wiced_bool_t enable ) -{ - uint8_t write_value = 0; - uint8_t read_value = 0; - uint8_t compare_value; - uint8_t bmask; - uint32_t attempts = ( uint32_t ) MAX_KSO_ATTEMPTS; - wwd_result_t result; - - if ( enable == WICED_TRUE ) - { - write_value |= SBSDIO_SLPCSR_KEEP_SDIO_ON; - } - - /* 1st KSO write goes to AOS wake up core if device is asleep */ - /* Possibly device might not respond to this cmd. So, don't check return value here */ - /* 2 Sequential writes to KSO bit are required for SR module to wakeup */ - wwd_bus_write_register_value( BACKPLANE_FUNCTION, (uint32_t) SDIO_SLEEP_CSR, (uint8_t) 1, write_value ); - wwd_bus_write_register_value( BACKPLANE_FUNCTION, (uint32_t) SDIO_SLEEP_CSR, (uint8_t) 1, write_value ); - - if ( enable == WICED_TRUE ) - { - /* device WAKEUP through KSO: - * write bit 0 & read back until - * both bits 0(kso bit) & 1 (dev on status) are set - */ - compare_value = SBSDIO_SLPCSR_KEEP_SDIO_ON | SBSDIO_SLPCSR_DEVICE_ON; - bmask = compare_value; - - host_rtos_delay_milliseconds( (uint32_t) 3 ); - } - else - { - /* Put device to sleep, turn off KSO */ - compare_value = 0; - /* Check for bit0 only, bit1(devon status) may not get cleared right away */ - bmask = SBSDIO_SLPCSR_KEEP_SDIO_ON; - } - - do - { - /* Reliable KSO bit set/clr: - * Sdiod sleep write access appears to be in sync with PMU 32khz clk - * just one write attempt may fail,(same is with read ?) - * in any case, read it back until it matches written value - */ - result = wwd_bus_read_register_value( BACKPLANE_FUNCTION, (uint32_t) SDIO_SLEEP_CSR, (uint8_t) 1, &read_value ); - if ( ( ( read_value & bmask ) == compare_value ) && ( result == WWD_SUCCESS ) ) - { - break; - } - - host_rtos_delay_milliseconds( (uint32_t) KSO_WAIT_MS ); - - wwd_bus_write_register_value( BACKPLANE_FUNCTION, (uint32_t) SDIO_SLEEP_CSR, (uint8_t) 1, write_value ); - attempts--; - } while ( attempts != 0 ); - - if ( attempts == 0 ) - { - return WWD_SDIO_BUS_UP_FAIL;; - } - else - { - return WWD_SUCCESS; - } -} diff --git a/components/WWD/WWD/internal/chips/4390/chip_constants.h b/components/WWD/WWD/internal/chips/4390/chip_constants.h deleted file mode 100644 index 477b601a3253f632098499c7190ffbf99976d3cb..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/chips/4390/chip_constants.h +++ /dev/null @@ -1,404 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -#ifndef INCLUDED_CHIP_CONSTANTS_H_ -#define INCLUDED_CHIP_CONSTANTS_H_ - -#include "wwd_wlioctl.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * Architecture Constants - ******************************************************/ - -/* General chip stats */ -#define CHIP_RAM_SIZE 0x3C000 - -/* Backplane architecture */ -#define CHIPCOMMON_BASE_ADDRESS 0x18000000 /* Chipcommon core register region */ -#define DOT11MAC_BASE_ADDRESS 0x18001000 /* dot11mac core register region */ -#define SDIO_BASE_ADDRESS 0x18002000 /* SDIOD Device core register region */ -#define WLAN_ARMCR4_BASE_ADDRESS 0x18003000 /* ARMCR4 core register region */ -#define SOCSRAM_BASE_ADDRESS 0x18004000 /* SOCSRAM core register region */ -#define BACKPLANE_ADDRESS_MASK 0x7FFF - -#define CHIP_STA_INTERFACE 0 -#define CHIP_AP_INTERFACE 1 -#define CHIP_P2P_INTERFACE 2 - -/* Maximum value of bus data credit difference */ -#define CHIP_MAX_BUS_DATA_CREDIT_DIFF 20 - -/* Chipcommon registers */ -#define CHIPCOMMON_GPIO_CONTROL ((uint32_t) (CHIPCOMMON_BASE_ADDRESS + 0x6C) ) - -/****************************************************** - * SDIO Constants - ******************************************************/ -/* CurrentSdiodProgGuide r23 */ - -/* Base registers */ -#define SDIO_INT_STATUS ((uint32_t) (SDIO_BASE_ADDRESS + 0x20) ) -#define SDIO_TO_SB_MAILBOX_DATA ((uint32_t) (SDIO_BASE_ADDRESS + 0x48) ) -#define SDIO_TO_HOST_MAILBOX_DATA ((uint32_t) (SDIO_BASE_ADDRESS + 0x4C) ) -#define SDIO_TO_SB_MAIL_BOX ((uint32_t) (SDIO_BASE_ADDRESS + 0x40) ) -#define SDIO_INT_HOST_MASK ((uint32_t) (SDIO_BASE_ADDRESS + 0x24) ) -#define SDIO_FUNCTION_INT_MASK ((uint32_t) (SDIO_BASE_ADDRESS + 0x34) ) - -/* SDIO Function 0 (SDIO Bus) register addresses */ - -/* SDIO Device CCCR offsets */ -/* TODO: What does CIS/CCCR stand for? */ -/* CCCR accesses do not require backpane clock */ -#define SDIOD_CCCR_REV ( (uint32_t) 0x00 ) /* CCCR/SDIO Revision */ -#define SDIOD_CCCR_SDREV ( (uint32_t) 0x01 ) /* SD Revision */ -#define SDIOD_CCCR_IOEN ( (uint32_t) 0x02 ) /* I/O Enable */ -#define SDIOD_CCCR_IORDY ( (uint32_t) 0x03 ) /* I/O Ready */ -#define SDIOD_CCCR_INTEN ( (uint32_t) 0x04 ) /* Interrupt Enable */ -#define SDIOD_CCCR_INTPEND ( (uint32_t) 0x05 ) /* Interrupt Pending */ -#define SDIOD_CCCR_IOABORT ( (uint32_t) 0x06 ) /* I/O Abort */ -#define SDIOD_CCCR_BICTRL ( (uint32_t) 0x07 ) /* Bus Interface control */ -#define SDIOD_CCCR_CAPABLITIES ( (uint32_t) 0x08 ) /* Card Capabilities */ -#define SDIOD_CCCR_CISPTR_0 ( (uint32_t) 0x09 ) /* Common CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_CISPTR_1 ( (uint32_t) 0x0A ) /* Common CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_CISPTR_2 ( (uint32_t) 0x0B ) /* Common CIS Base Address Pointer Register 2 (MSB - only bit 1 valid)*/ -#define SDIOD_CCCR_BUSSUSP ( (uint32_t) 0x0C ) /* */ -#define SDIOD_CCCR_FUNCSEL ( (uint32_t) 0x0D ) /* */ -#define SDIOD_CCCR_EXECFLAGS ( (uint32_t) 0x0E ) /* */ -#define SDIOD_CCCR_RDYFLAGS ( (uint32_t) 0x0F ) /* */ -#define SDIOD_CCCR_BLKSIZE_0 ( (uint32_t) 0x10 ) /* Function 0 (Bus) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_BLKSIZE_1 ( (uint32_t) 0x11 ) /* Function 0 (Bus) SDIO Block Size Register 1 (MSB) */ -#define SDIOD_CCCR_POWER_CONTROL ( (uint32_t) 0x12 ) /* Power Control */ -#define SDIOD_CCCR_SPEED_CONTROL ( (uint32_t) 0x13 ) /* Bus Speed Select (control device entry into high-speed clocking mode) */ -#define SDIOD_CCCR_UHS_I ( (uint32_t) 0x14 ) /* UHS-I Support */ -#define SDIOD_CCCR_DRIVE ( (uint32_t) 0x15 ) /* Drive Strength */ -#define SDIOD_CCCR_INTEXT ( (uint32_t) 0x16 ) /* Interrupt Extension */ -#define SDIOD_SEP_INT_CTL ( (uint32_t) 0xF2 ) /* Separate Interrupt Control*/ -#define SDIOD_CCCR_F1INFO ( (uint32_t) 0x100 ) /* Function 1 (Backplane) Info */ -#define SDIOD_CCCR_F1HP ( (uint32_t) 0x102 ) /* Function 1 (Backplane) High Power */ -#define SDIOD_CCCR_F1CISPTR_0 ( (uint32_t) 0x109 ) /* Function 1 (Backplane) CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_F1CISPTR_1 ( (uint32_t) 0x10A ) /* Function 1 (Backplane) CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_F1CISPTR_2 ( (uint32_t) 0x10B ) /* Function 1 (Backplane) CIS Base Address Pointer Register 2 (MSB - only bit 1 valid) */ -#define SDIOD_CCCR_F1BLKSIZE_0 ( (uint32_t) 0x110 ) /* Function 1 (Backplane) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_F1BLKSIZE_1 ( (uint32_t) 0x111 ) /* Function 1 (Backplane) SDIO Block Size Register 1 (MSB) */ -#define SDIOD_CCCR_F2INFO ( (uint32_t) 0x200 ) /* Function 2 (WLAN Data FIFO) Info */ -#define SDIOD_CCCR_F2HP ( (uint32_t) 0x202 ) /* Function 2 (WLAN Data FIFO) High Power */ -#define SDIOD_CCCR_F2CISPTR_0 ( (uint32_t) 0x209 ) /* Function 2 (WLAN Data FIFO) CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_F2CISPTR_1 ( (uint32_t) 0x20A ) /* Function 2 (WLAN Data FIFO) CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_F2CISPTR_2 ( (uint32_t) 0x20B ) /* Function 2 (WLAN Data FIFO) CIS Base Address Pointer Register 2 (MSB - only bit 1 valid) */ -#define SDIOD_CCCR_F2BLKSIZE_0 ( (uint32_t) 0x210 ) /* Function 2 (WLAN Data FIFO) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_F2BLKSIZE_1 ( (uint32_t) 0x211 ) /* Function 2 (WLAN Data FIFO) SDIO Block Size Register 1 (MSB) */ -#define SDIOD_CCCR_F3INFO ( (uint32_t) 0x300 ) /* Function 3 (Bluetooth Data FIFO) Info */ -#define SDIOD_CCCR_F3HP ( (uint32_t) 0x302 ) /* Function 3 (Bluetooth Data FIFO) High Power */ -#define SDIOD_CCCR_F3CISPTR_0 ( (uint32_t) 0x309 ) /* Function 3 (Bluetooth Data FIFO) CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_F3CISPTR_1 ( (uint32_t) 0x30A ) /* Function 3 (Bluetooth Data FIFO) CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_F3CISPTR_2 ( (uint32_t) 0x30B ) /* Function 3 (Bluetooth Data FIFO) CIS Base Address Pointer Register 2 (MSB - only bit 1 valid) */ -#define SDIOD_CCCR_F3BLKSIZE_0 ( (uint32_t) 0x310 ) /* Function 3 (Bluetooth Data FIFO) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_F3BLKSIZE_1 ( (uint32_t) 0x311 ) /* Function 3 (Bluetooth Data FIFO) SDIO Block Size Register 1 (MSB) */ - - -/* SDIO Function 1 (Backplane) register addresses */ -/* Addresses 0x00000000 - 0x0000FFFF are directly access the backplane - * throught the backplane window. Addresses above 0x0000FFFF are - * registers relating to backplane access, and do not require a backpane - * clock to access them - */ -#define SDIO_GPIO_SELECT ( (uint32_t) 0x10005 ) -#define SDIO_GPIO_OUTPUT ( (uint32_t) 0x10006 ) -#define SDIO_GPIO_ENABLE ( (uint32_t) 0x10007 ) -#define SDIO_FUNCTION2_WATERMARK ( (uint32_t) 0x10008 ) -#define SDIO_DEVICE_CONTROL ( (uint32_t) 0x10009 ) -#define SDIO_BACKPLANE_ADDRESS_LOW ( (uint32_t) 0x1000A ) -#define SDIO_BACKPLANE_ADDRESS_MID ( (uint32_t) 0x1000B ) -#define SDIO_BACKPLANE_ADDRESS_HIGH ( (uint32_t) 0x1000C ) -#define SDIO_FRAME_CONTROL ( (uint32_t) 0x1000D ) -#define SDIO_CHIP_CLOCK_CSR ( (uint32_t) 0x1000E ) -#define SDIO_PULL_UP ( (uint32_t) 0x1000F ) -#define SDIO_READ_FRAME_BC_LOW ( (uint32_t) 0x1001B ) -#define SDIO_READ_FRAME_BC_HIGH ( (uint32_t) 0x1001C ) - -#define I_HMB_SW_MASK ( (uint32_t) 0x000000F0 ) - -/****************************************************** - * SPI Constants - ******************************************************/ -/* GSPI v1 */ -#define SPI_FRAME_CONTROL ( (uint32_t) 0x1000D ) - -/* Register addresses */ -#define SPI_BUS_CONTROL ( (uint32_t) 0x0000 ) -#define SPI_RESPONSE_DELAY ( (uint32_t) 0x0001 ) -#define SPI_STATUS_ENABLE ( (uint32_t) 0x0002 ) -#define SPI_RESET_BP ( (uint32_t) 0x0003 ) /* (corerev >= 1) */ -#define SPI_INTERRUPT_REGISTER ( (uint32_t) 0x0004 ) /* 16 bits - Interrupt status */ -#define SPI_INTERRUPT_ENABLE_REGISTER ( (uint32_t) 0x0006 ) /* 16 bits - Interrupt mask */ -#define SPI_STATUS_REGISTER ( (uint32_t) 0x0008 ) /* 32 bits */ -#define SPI_FUNCTION1_INFO ( (uint32_t) 0x000C ) /* 16 bits */ -#define SPI_FUNCTION2_INFO ( (uint32_t) 0x000E ) /* 16 bits */ -#define SPI_FUNCTION3_INFO ( (uint32_t) 0x0010 ) /* 16 bits */ -#define SPI_READ_TEST_REGISTER ( (uint32_t) 0x0014 ) /* 32 bits */ -#define SPI_RESP_DELAY_F0 ( (uint32_t) 0x001c ) /* 8 bits (corerev >= 3) */ -#define SPI_RESP_DELAY_F1 ( (uint32_t) 0x001d ) /* 8 bits (corerev >= 3) */ -#define SPI_RESP_DELAY_F2 ( (uint32_t) 0x001e ) /* 8 bits (corerev >= 3) */ -#define SPI_RESP_DELAY_F3 ( (uint32_t) 0x001f ) /* 8 bits (corerev >= 3) */ - -/****************************************************** - * Bit Masks - ******************************************************/ - -/* SDIOD_CCCR_REV Bits */ -#define SDIO_REV_SDIOID_MASK ( (uint32_t) 0xF0 ) /* SDIO spec revision number */ -#define SDIO_REV_CCCRID_MASK ( (uint32_t) 0x0F ) /* CCCR format version number */ - -/* SDIOD_CCCR_SDREV Bits */ -#define SD_REV_PHY_MASK ( (uint32_t) 0x0F ) /* SD format version number */ - -/* SDIOD_CCCR_IOEN Bits */ -#define SDIO_FUNC_ENABLE_1 ( (uint32_t) 0x02 ) /* function 1 I/O enable */ -#define SDIO_FUNC_ENABLE_2 ( (uint32_t) 0x04 ) /* function 2 I/O enable */ -#define SDIO_FUNC_ENABLE_3 ( (uint32_t) 0x08 ) /* function 3 I/O enable */ - -/* SDIOD_CCCR_IORDY Bits */ -#define SDIO_FUNC_READY_1 ( (uint32_t) 0x02 ) /* function 1 I/O ready */ -#define SDIO_FUNC_READY_2 ( (uint32_t) 0x04 ) /* function 2 I/O ready */ -#define SDIO_FUNC_READY_3 ( (uint32_t) 0x08 ) /* function 3 I/O ready */ - -/* SDIOD_CCCR_INTEN Bits */ -#define INTR_CTL_MASTER_EN ( (uint32_t) 0x01 ) /* interrupt enable master */ -#define INTR_CTL_FUNC1_EN ( (uint32_t) 0x02 ) /* interrupt enable for function 1 */ -#define INTR_CTL_FUNC2_EN ( (uint32_t) 0x04 ) /* interrupt enable for function 2 */ - -/* SDIOD_SEP_INT_CTL Bits */ -#define SEP_INTR_CTL_MASK ( (uint32_t) 0x01 ) /* out-of-band interrupt mask */ -#define SEP_INTR_CTL_EN ( (uint32_t) 0x02 ) /* out-of-band interrupt output enable */ -#define SEP_INTR_CTL_POL ( (uint32_t) 0x04 ) /* out-of-band interrupt polarity */ - -/* SDIOD_CCCR_INTPEND Bits */ -#define INTR_STATUS_FUNC1 ( (uint32_t) 0x02 ) /* interrupt pending for function 1 */ -#define INTR_STATUS_FUNC2 ( (uint32_t) 0x04 ) /* interrupt pending for function 2 */ -#define INTR_STATUS_FUNC3 ( (uint32_t) 0x08 ) /* interrupt pending for function 3 */ - -/* SDIOD_CCCR_IOABORT Bits */ -#define IO_ABORT_RESET_ALL ( (uint32_t) 0x08 ) /* I/O card reset */ -#define IO_ABORT_FUNC_MASK ( (uint32_t) 0x07 ) /* abort selction: function x */ - -/* SDIOD_CCCR_BICTRL Bits */ -#define BUS_CARD_DETECT_DIS ( (uint32_t) 0x80 ) /* Card Detect disable */ -#define BUS_SPI_CONT_INTR_CAP ( (uint32_t) 0x40 ) /* support continuous SPI interrupt */ -#define BUS_SPI_CONT_INTR_EN ( (uint32_t) 0x20 ) /* continuous SPI interrupt enable */ -#define BUS_SD_DATA_WIDTH_MASK ( (uint32_t) 0x03 ) /* bus width mask */ -#define BUS_SD_DATA_WIDTH_4BIT ( (uint32_t) 0x02 ) /* bus width 4-bit mode */ -#define BUS_SD_DATA_WIDTH_1BIT ( (uint32_t) 0x00 ) /* bus width 1-bit mode */ - -/* SDIOD_CCCR_CAPABLITIES Bits */ -#define SDIO_CAP_4BLS ( (uint32_t) 0x80 ) /* 4-bit support for low speed card */ -#define SDIO_CAP_LSC ( (uint32_t) 0x40 ) /* low speed card */ -#define SDIO_CAP_E4MI ( (uint32_t) 0x20 ) /* enable interrupt between block of data in 4-bit mode */ -#define SDIO_CAP_S4MI ( (uint32_t) 0x10 ) /* support interrupt between block of data in 4-bit mode */ -#define SDIO_CAP_SBS ( (uint32_t) 0x08 ) /* support suspend/resume */ -#define SDIO_CAP_SRW ( (uint32_t) 0x04 ) /* support read wait */ -#define SDIO_CAP_SMB ( (uint32_t) 0x02 ) /* support multi-block transfer */ -#define SDIO_CAP_SDC ( (uint32_t) 0x01 ) /* Support Direct commands during multi-byte transfer */ - -/* SDIOD_CCCR_POWER_CONTROL Bits */ -#define SDIO_POWER_SMPC ( (uint32_t) 0x01 ) /* supports master power control (RO) */ -#define SDIO_POWER_EMPC ( (uint32_t) 0x02 ) /* enable master power control (allow > 200mA) (RW) */ - -/* SDIOD_CCCR_SPEED_CONTROL Bits */ -#define SDIO_SPEED_SHS ( (uint32_t) 0x01 ) /* supports high-speed [clocking] mode (RO) */ -#define SDIO_SPEED_EHS ( (uint32_t) 0x02 ) /* enable high-speed [clocking] mode (RW) */ - - - -/* GSPI */ -#define SPI_READ_TEST_REGISTER_VALUE ( (uint32_t) 0xFEEDBEAD ) -#define SPI_READ_TEST_REG_LSB ( ( ( SPI_READ_TEST_REGISTER_VALUE ) ) & 0xff ) -#define SPI_READ_TEST_REG_LSB_SFT1 ( ( ( SPI_READ_TEST_REGISTER_VALUE << 1 ) ) & 0xff ) -#define SPI_READ_TEST_REG_LSB_SFT2 ( ( ( SPI_READ_TEST_REGISTER_VALUE << 1 ) + 1 ) & 0xff ) -#define SPI_READ_TEST_REG_LSB_SFT3 ( ( ( SPI_READ_TEST_REGISTER_VALUE +1 ) << 1 ) & 0xff ) - - -/* SPI_BUS_CONTROL Bits */ -#define WORD_LENGTH_32 ( (uint32_t) 0x01 ) /* 0/1 16/32 bit word length */ -#define ENDIAN_BIG ( (uint32_t) 0x02 ) /* 0/1 Little/Big Endian */ -#define CLOCK_PHASE ( (uint32_t) 0x04 ) /* 0/1 clock phase delay */ -#define CLOCK_POLARITY ( (uint32_t) 0x08 ) /* 0/1 Idle state clock polarity is low/high */ -#define HIGH_SPEED_MODE ( (uint32_t) 0x10 ) /* 1/0 High Speed mode / Normal mode */ -#define INTERRUPT_POLARITY_HIGH ( (uint32_t) 0x20 ) /* 1/0 Interrupt active polarity is high/low */ -#define WAKE_UP ( (uint32_t) 0x80 ) /* 0/1 Wake-up command from Host to WLAN */ - -/* SPI_RESPONSE_DELAY Bit mask */ -#define RESPONSE_DELAY_MASK 0xFF /* Configurable rd response delay in multiples of 8 bits */ - -/* SPI_STATUS_ENABLE Bits */ -#define STATUS_ENABLE ( (uint32_t) 0x01 ) /* 1/0 Status sent/not sent to host after read/write */ -#define INTR_WITH_STATUS ( (uint32_t) 0x02 ) /* 0/1 Do-not / do-interrupt if status is sent */ -#define RESP_DELAY_ALL ( (uint32_t) 0x04 ) /* Applicability of resp delay to F1 or all func's read */ -#define DWORD_PKT_LEN_EN ( (uint32_t) 0x08 ) /* Packet len denoted in dwords instead of bytes */ -#define CMD_ERR_CHK_EN ( (uint32_t) 0x20 ) /* Command error check enable */ -#define DATA_ERR_CHK_EN ( (uint32_t) 0x40 ) /* Data error check enable */ - - - -/* SPI_RESET_BP Bits*/ -#define RESET_ON_WLAN_BP_RESET ( (uint32_t) 0x04 ) /* enable reset for WLAN backplane */ -#define RESET_SPI ( (uint32_t) 0x80 ) /* reset the above enabled logic */ - - - -/* SPI_INTERRUPT_REGISTER and SPI_INTERRUPT_ENABLE_REGISTER Bits */ -#define DATA_UNAVAILABLE ( (uint32_t) 0x0001 ) /* Requested data not available; Clear by writing a "1" */ -#define F2_F3_FIFO_RD_UNDERFLOW ( (uint32_t) 0x0002 ) -#define F2_F3_FIFO_WR_OVERFLOW ( (uint32_t) 0x0004 ) -#define COMMAND_ERROR ( (uint32_t) 0x0008 ) /* Cleared by writing 1 */ -#define DATA_ERROR ( (uint32_t) 0x0010 ) /* Cleared by writing 1 */ -#define F2_PACKET_AVAILABLE ( (uint32_t) 0x0020 ) -#define F3_PACKET_AVAILABLE ( (uint32_t) 0x0040 ) -#define F1_OVERFLOW ( (uint32_t) 0x0080 ) /* Due to last write. Bkplane has pending write requests */ -#define MISC_INTR0 ( (uint32_t) 0x0100 ) -#define MISC_INTR1 ( (uint32_t) 0x0200 ) -#define MISC_INTR2 ( (uint32_t) 0x0400 ) -#define MISC_INTR3 ( (uint32_t) 0x0800 ) -#define MISC_INTR4 ( (uint32_t) 0x1000 ) -#define F1_INTR ( (uint32_t) 0x2000 ) -#define F2_INTR ( (uint32_t) 0x4000 ) -#define F3_INTR ( (uint32_t) 0x8000 ) - - - - -/* SPI_STATUS_REGISTER Bits */ -#define STATUS_DATA_NOT_AVAILABLE ( (uint32_t) 0x00000001 ) -#define STATUS_UNDERFLOW ( (uint32_t) 0x00000002 ) -#define STATUS_OVERFLOW ( (uint32_t) 0x00000004 ) -#define STATUS_F2_INTR ( (uint32_t) 0x00000008 ) -#define STATUS_F3_INTR ( (uint32_t) 0x00000010 ) -#define STATUS_F2_RX_READY ( (uint32_t) 0x00000020 ) -#define STATUS_F3_RX_READY ( (uint32_t) 0x00000040 ) -#define STATUS_HOST_CMD_DATA_ERR ( (uint32_t) 0x00000080 ) -#define STATUS_F2_PKT_AVAILABLE ( (uint32_t) 0x00000100 ) -#define STATUS_F2_PKT_LEN_MASK ( (uint32_t) 0x000FFE00 ) -#define STATUS_F2_PKT_LEN_SHIFT ( (uint32_t) 9 ) -#define STATUS_F3_PKT_AVAILABLE ( (uint32_t) 0x00100000 ) -#define STATUS_F3_PKT_LEN_MASK ( (uint32_t) 0xFFE00000 ) -#define STATUS_F3_PKT_LEN_SHIFT ( (uint32_t) 21 ) - - - - - -/* SDIO_CHIP_CLOCK_CSR Bits */ -#define SBSDIO_FORCE_ALP ( (uint32_t) 0x01 ) /* Force ALP request to backplane */ -#define SBSDIO_FORCE_HT ( (uint32_t) 0x02 ) /* Force HT request to backplane */ -#define SBSDIO_FORCE_ILP ( (uint32_t) 0x04 ) /* Force ILP request to backplane */ -#define SBSDIO_ALP_AVAIL_REQ ( (uint32_t) 0x08 ) /* Make ALP ready (power up xtal) */ -#define SBSDIO_HT_AVAIL_REQ ( (uint32_t) 0x10 ) /* Make HT ready (power up PLL) */ -#define SBSDIO_FORCE_HW_CLKREQ_OFF ( (uint32_t) 0x20 ) /* Squelch clock requests from HW */ -#define SBSDIO_ALP_AVAIL ( (uint32_t) 0x40 ) /* Status: ALP is ready */ -#define SBSDIO_HT_AVAIL ( (uint32_t) 0x80 ) /* Status: HT is ready */ -#define SBSDIO_Rev8_HT_AVAIL ( (uint32_t) 0x40 ) -#define SBSDIO_Rev8_ALP_AVAIL ( (uint32_t) 0x80 ) - - -/* SDIO_FRAME_CONTROL Bits */ -#define SFC_RF_TERM ( (uint32_t) (1 << 0) ) /* Read Frame Terminate */ -#define SFC_WF_TERM ( (uint32_t) (1 << 1) ) /* Write Frame Terminate */ -#define SFC_CRC4WOOS ( (uint32_t) (1 << 2) ) /* HW reports CRC error for write out of sync */ -#define SFC_ABORTALL ( (uint32_t) (1 << 3) ) /* Abort cancels all in-progress frames */ - -/* SDIO_TO_SB_MAIL_BOX bits corresponding to intstatus bits */ -#define SMB_NAK ( (uint32_t) (1 << 0) ) /* To SB Mailbox Frame NAK */ -#define SMB_INT_ACK ( (uint32_t) (1 << 1) ) /* To SB Mailbox Host Interrupt ACK */ -#define SMB_USE_OOB ( (uint32_t) (1 << 2) ) /* To SB Mailbox Use OOB Wakeup */ -#define SMB_DEV_INT ( (uint32_t) (1 << 3) ) /* To SB Mailbox Miscellaneous Interrupt */ - -#define WL_CHANSPEC_BAND_MASK 0xc000 -#define WL_CHANSPEC_BAND_SHIFT 14 -#define WL_CHANSPEC_BAND_2G 0x0000 -#define WL_CHANSPEC_BAND_5G 0xc000 - -#define WL_CHANSPEC_CTL_SB_MASK 0x0700 -#define WL_CHANSPEC_CTL_SB_SHIFT 8 -#define WL_CHANSPEC_CTL_SB_LLL 0x0000 -#define WL_CHANSPEC_CTL_SB_LLU 0x0100 -#define WL_CHANSPEC_CTL_SB_LUL 0x0200 -#define WL_CHANSPEC_CTL_SB_LUU 0x0300 -#define WL_CHANSPEC_CTL_SB_ULL 0x0400 -#define WL_CHANSPEC_CTL_SB_ULU 0x0500 -#define WL_CHANSPEC_CTL_SB_UUL 0x0600 -#define WL_CHANSPEC_CTL_SB_UUU 0x0700 -#define WL_CHANSPEC_CTL_SB_LL WL_CHANSPEC_CTL_SB_LLL -#define WL_CHANSPEC_CTL_SB_LU WL_CHANSPEC_CTL_SB_LLU -#define WL_CHANSPEC_CTL_SB_UL WL_CHANSPEC_CTL_SB_LUL -#define WL_CHANSPEC_CTL_SB_UU WL_CHANSPEC_CTL_SB_LUU -#define WL_CHANSPEC_CTL_SB_L WL_CHANSPEC_CTL_SB_LLL -#define WL_CHANSPEC_CTL_SB_U WL_CHANSPEC_CTL_SB_LLU -#define WL_CHANSPEC_CTL_SB_LOWER WL_CHANSPEC_CTL_SB_LLL -#define WL_CHANSPEC_CTL_SB_UPPER WL_CHANSPEC_CTL_SB_LLU -#define WL_CHANSPEC_CTL_SB_NONE WL_CHANSPEC_CTL_SB_LLL -#define WL_CHANSPEC_BW_MASK 0x3800 -#define WL_CHANSPEC_BW_SHIFT 11 -#define WL_CHANSPEC_BW_5 0x0000 -#define WL_CHANSPEC_BW_10 0x0800 -#define WL_CHANSPEC_BW_20 0x1000 -#define WL_CHANSPEC_BW_40 0x1800 - - -/* CIS accesses require backpane clock */ - - -#undef CHIP_HAS_BSSID_CNT_IN_ASSOC_PARAMS -#undef CHIP_FIRMWARE_SUPPORTS_PM_LIMIT_IOVAR - -struct ether_addr; -struct wl_join_scan_params; - -typedef struct wl_assoc_params -{ - struct ether_addr bssid; -#ifdef CHIP_HAS_BSSID_CNT_IN_ASSOC_PARAMS - uint16_t bssid_cnt; -#endif /* ifdef CHIP_HAS_BSSID_CNT_IN_ASSOC_PARAMS */ - uint32_t chanspec_num; - chanspec_t chanspec_list[1]; -} wl_assoc_params_t; -#define WL_ASSOC_PARAMS_FIXED_SIZE (sizeof(wl_assoc_params_t) - sizeof(wl_chanspec_t)) -typedef wl_assoc_params_t wl_reassoc_params_t; -#define WL_REASSOC_PARAMS_FIXED_SIZE WL_ASSOC_PARAMS_FIXED_SIZE -typedef wl_assoc_params_t wl_join_assoc_params_t; -#define WL_JOIN_ASSOC_PARAMS_FIXED_SIZE WL_ASSOC_PARAMS_FIXED_SIZE -typedef struct wl_join_params -{ - wlc_ssid_t ssid; - struct wl_assoc_params params; -} wl_join_params_t; -#define WL_JOIN_PARAMS_FIXED_SIZE (sizeof(wl_join_params_t) - sizeof(wl_chanspec_t)) - -/* extended join params */ -typedef struct wl_extjoin_params { - wlc_ssid_t ssid; /* {0, ""}: wildcard scan */ - struct wl_join_scan_params scan_params; - wl_join_assoc_params_t assoc_params; /* optional field, but it must include the fixed portion - * of the wl_join_assoc_params_t struct when it does - * present. - */ -} wl_extjoin_params_t; -#define WL_EXTJOIN_PARAMS_FIXED_SIZE (sizeof(wl_extjoin_params_t) - sizeof(chanspec_t)) - -typedef wl_cnt_ver_eight_t wiced_counters_t; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ifndef INCLUDED_CHIP_CONSTANTS_H_ */ diff --git a/components/WWD/WWD/internal/chips/4390/wwd_ap.c b/components/WWD/WWD/internal/chips/4390/wwd_ap.c deleted file mode 100644 index 8cdeda7402dc57004d1194e018a1d2682d863629..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/chips/4390/wwd_ap.c +++ /dev/null @@ -1,459 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Provides an APSTA functionality specific to the 4390A1 - */ - -#include -#include "wwd_rtos.h" -#include "wwd_events.h" -#include "wwd_assert.h" -#include "wwd_management.h" -#include "wwd_wifi.h" -#include "network/wwd_buffer_interface.h" -#include "internal/wwd_sdpcm.h" -#include "internal/wwd_internal.h" -#include "internal/wwd_ap.h" -#include "platform_toolchain.h" -#include "internal/wwd_ap_common.h" - -/****************************************************** - * Macros - ******************************************************/ - -/****************************************************** - * @cond Constants - ******************************************************/ - -#define WLC_EVENT_MSG_LINK (0x01) -#define RATE_SETTING_11_MBPS (11000000 / 500000) - -/* HT/AMPDU specific define */ -#define AMPDU_AP_DEFAULT_BA_WSIZE 2 /* AP default BA window size */ -#define AMPDU_STA_DEFAULT_BA_WSIZE 8 /* STA default BA window size */ -#define AMPDU_STA_DEFAULT_MPDU 4 /* STA default num MPDU per AMPDU */ - -#define WEP40_KEY_LENGTH 5 -#define WEP104_KEY_LENGTH 13 -#define FORMATTED_ASCII_WEP40_KEY_LENGTH 28 /* For 5 bytes key */ -#define FORMATTED_ASCII_WEP104_KEY_LENGTH 60 /* For 13 bytes key */ - -/****************************************************** - * Enumerations - ******************************************************/ - -typedef enum -{ - BSS_AP = 3, - BSS_STA = 2, - BSS_UP = 1, - BSS_DOWN = 0 -} bss_arg_option_t; - -typedef enum -{ - WEP_OPEN_SYSTEM_AUTHENTICATION = 0, - WEP_SHARED_KEY_AUTHENTICATION = 1 -} wep_authentication_type_t; - -/** @endcond */ - -/****************************************************** - * Local Structures - ******************************************************/ - -/****************************************************** - * Static Variables - ******************************************************/ - -wiced_bool_t wwd_wifi_ap_is_up = WICED_FALSE; -static host_semaphore_type_t wwd_wifi_sleep_flag; -static const wwd_event_num_t apsta_events[] = { WLC_E_IF, WLC_E_LINK, WLC_E_NONE }; - -/****************************************************** - * Static Function prototypes - ******************************************************/ - -static void* wwd_handle_apsta_event ( const wwd_event_header_t* event_header, const uint8_t* event_data, /*@returned@*/ void* handler_user_data ); -static wwd_result_t internal_ap_init ( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ); -wwd_result_t wwd_wifi_ap_init ( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ); -wwd_result_t wwd_wifi_ap_up ( void ); - -/****************************************************** - * Function definitions - ******************************************************/ - -static void* wwd_handle_apsta_event( const wwd_event_header_t* event_header, const uint8_t* event_data, /*@returned@*/ void* handler_user_data ) -{ - UNUSED_PARAMETER( event_header ); - UNUSED_PARAMETER( event_data ); - UNUSED_PARAMETER( handler_user_data ); - - if ( (wwd_interface_t) event_header->interface != WWD_AP_INTERFACE) - { - return handler_user_data; - } - - if ( ( ( event_header->event_type == (wwd_event_num_t) WLC_E_LINK ) && - ( event_header->interface == WWD_AP_INTERFACE ) ) || - ( event_header->event_type == WLC_E_IF ) ) - { - wwd_result_t result; - result = host_rtos_set_semaphore( &wwd_wifi_sleep_flag, WICED_FALSE ); - wiced_assert( "failed to post ap link semaphore", result == WWD_SUCCESS ); - REFERENCE_DEBUG_ONLY_VARIABLE( result ); - } - return handler_user_data; -} - -static wwd_result_t internal_ap_init( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ) -{ - wiced_bool_t wait_for_interface = WICED_FALSE; - wwd_result_t result; - wiced_buffer_t response; - wiced_buffer_t buffer; - uint32_t* data; - -#ifdef WICED_WIFI_SOFT_AP_WEP_SUPPORT_ENABLED - uint32_t* auth; - uint16_t length; -#endif - - if ( ( ( auth_type == WICED_SECURITY_WPA_TKIP_PSK ) || ( auth_type == WICED_SECURITY_WPA2_AES_PSK ) || ( auth_type == WICED_SECURITY_WPA2_MIXED_PSK ) ) && - ( ( key_length < (uint8_t) 8 ) || ( key_length > (uint8_t) 64 ) ) ) - { - WPRINT_APP_INFO(( "Error: WPA security key length must be between 8 and 64\n" )); - return WWD_WPA_KEYLEN_BAD; - } - -#ifdef WICED_WIFI_SOFT_AP_WEP_SUPPORT_ENABLED - else if( (( auth_type == WICED_SECURITY_WEP_PSK ) || ( auth_type == WICED_SECURITY_WEP_SHARED )) && - (( key_length != FORMATTED_ASCII_WEP40_KEY_LENGTH ) && ( key_length != FORMATTED_ASCII_WEP104_KEY_LENGTH )) ) - { - WPRINT_APP_INFO(( "Error: WEP security Key length must be either 5 / 13 bytes\n" )); - return WWD_WEP_KEYLEN_BAD; - } -#endif - - if ( wwd_wifi_set_block_ack_window_size( WWD_AP_INTERFACE ) != WWD_SUCCESS ) - { - return WWD_SET_BLOCK_ACK_WINDOW_FAIL; - } - - /* Query bss state (does it exist? if so is it UP?) */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) CHIP_AP_INTERFACE; - if ( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_AP_INTERFACE ) != WWD_SUCCESS ) - { - /* Note: We don't need to release the response packet since the iovar failed */ - wait_for_interface = WICED_TRUE; - } - else - { - /* Check if the BSS is already UP, if so return */ - uint32_t* data2 = (uint32_t*) host_buffer_get_current_piece_data_pointer( response ); - if ( *data2 == (uint32_t) BSS_UP ) - { - host_buffer_release( response, WWD_NETWORK_RX ); - wwd_wifi_ap_is_up = WICED_TRUE; - return WWD_SUCCESS; - } - else - { - host_buffer_release( response, WWD_NETWORK_RX ); - } - } - - CHECK_RETURN( host_rtos_init_semaphore( &wwd_wifi_sleep_flag ) ); - - /* Register for interested events */ - CHECK_RETURN_WITH_SEMAPHORE( wwd_management_set_event_handler( apsta_events, wwd_handle_apsta_event, NULL, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Set the SSID */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 40, "bsscfg:" IOVAR_STR_SSID ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = (uint32_t) CHIP_AP_INTERFACE; /* Set the bsscfg index */ - data[1] = ssid->length; /* Set the ssid length */ - memcpy( &data[2], (uint8_t*) ssid->value, ssid->length ); - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Check if we need to wait for interface to be created */ - if ( wait_for_interface == WICED_TRUE ) - { - CHECK_RETURN_WITH_SEMAPHORE( host_rtos_get_semaphore( &wwd_wifi_sleep_flag, (uint32_t) 10000, WICED_FALSE ), &wwd_wifi_sleep_flag ); - } - - /* Set the channel */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - *data = channel; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_CHANNEL, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - -#ifdef WICED_WIFI_SOFT_AP_WEP_SUPPORT_ENABLED - if ( ( auth_type == WICED_SECURITY_WEP_PSK ) || ( auth_type == WICED_SECURITY_WEP_SHARED ) ) - { - for ( length = 0; length < key_length; length = (uint16_t) ( length + 2 + security_key[ 1 ] ) ) - { - const wiced_wep_key_t* in_key = (const wiced_wep_key_t*) &security_key[ length ]; - wl_wsec_key_t* out_key = (wl_wsec_key_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(wl_wsec_key_t) ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( out_key, &wwd_wifi_sleep_flag ); - memset( out_key, 0, sizeof(wl_wsec_key_t) ); - out_key->index = in_key->index; - out_key->len = in_key->length; - memcpy( out_key->data, in_key->data, in_key->length ); - switch ( in_key->length ) - { - case WEP40_KEY_LENGTH: - out_key->algo = (uint32_t) CRYPTO_ALGO_WEP1; - break; - case WEP104_KEY_LENGTH: - out_key->algo = (uint32_t) CRYPTO_ALGO_WEP128; - break; - default: - host_buffer_release( buffer, WWD_NETWORK_TX ); - return WWD_INVALID_KEY; - } - /* Set the first entry as primary key by default */ - if ( length == 0 ) - { - out_key->flags |= WL_PRIMARY_KEY; - } - out_key->index = htod32(out_key->index); - out_key->len = htod32(out_key->len); - out_key->algo = htod32(out_key->algo); - out_key->flags = htod32(out_key->flags); - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_KEY, buffer, NULL, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - } - - /* Set authentication type */ - auth = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( auth, &wwd_wifi_sleep_flag ); - if ( auth_type == WICED_SECURITY_WEP_SHARED ) - { - *auth = WEP_SHARED_KEY_AUTHENTICATION; /* 1 = Shared Key authentication */ - } - else - { - *auth = WEP_OPEN_SYSTEM_AUTHENTICATION; /* 0 = Open System authentication */ - } - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_AUTH, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - } -#endif - - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, "bsscfg:" IOVAR_STR_WSEC ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = (uint32_t) CHIP_AP_INTERFACE; - if ((auth_type & WPS_ENABLED) != 0) - { - data[1] = (uint32_t) ( ( auth_type & ( ~WPS_ENABLED ) ) | SES_OW_ENABLED ); - } - else - { - data[1] = (uint32_t) auth_type; - } - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - - if ( ( auth_type != WICED_SECURITY_OPEN ) && ( auth_type != WICED_SECURITY_WEP_PSK ) && ( auth_type != WICED_SECURITY_WEP_SHARED ) ) - { - wsec_pmk_t* psk; - - /* Set the wpa auth */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, "bsscfg:" IOVAR_STR_WPA_AUTH ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = (uint32_t) CHIP_AP_INTERFACE; - data[1] = (uint32_t) (auth_type == WICED_SECURITY_WPA_TKIP_PSK) ? ( WPA_AUTH_PSK ) : ( WPA2_AUTH_PSK | WPA_AUTH_PSK ); - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Set the passphrase */ - psk = (wsec_pmk_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(wsec_pmk_t) ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( psk, &wwd_wifi_sleep_flag ); - memcpy( psk->key, security_key, key_length ); - psk->key_len = key_length; - psk->flags = (uint16_t) WSEC_PASSPHRASE; - host_rtos_delay_milliseconds( 1 ); /* Delay required to allow radio firmware to be ready to receive PMK and avoid intermittent failure */ - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_WSEC_PMK, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - } - - /* Set the GMode */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - *data = (uint32_t) GMODE_AUTO; - - result = wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_GMODE, buffer, 0, WWD_AP_INTERFACE ); - if ( ( result != WWD_SUCCESS ) && ( result != WWD_WLAN_ASSOCIATED ) ) - { - wiced_assert("start_ap: Failed to set GMode\n", 0 == 1 ); - - (void) host_rtos_deinit_semaphore( &wwd_wifi_sleep_flag ); - return result; - } - - /* Set the multicast transmission rate to 11 Mbps rather than the default 1 Mbps */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_2G_MULTICAST_RATE ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) RATE_SETTING_11_MBPS; - result = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_AP_INTERFACE ); - wiced_assert("start_ap: Failed to set multicast transmission rate\r\n", result == WWD_SUCCESS ); - - /* Set DTIM period */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - *data = (uint32_t) WICED_DEFAULT_SOFT_AP_DTIM_PERIOD; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_DTIMPRD, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - -#ifdef WICED_DISABLE_SSID_BROADCAST - /* Make the AP "hidden" */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_CLOSEDNET ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = (uint32_t) 1; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); -#endif - -#ifdef WICED_WIFI_ISOLATE_AP_CLIENTS - result = wwd_wifi_enable_ap_isolate( WWD_AP_INTERFACE, WICED_TRUE ); - wiced_assert("start_ap: Failed to disable intra BSS routing\r\n", result == WWD_SUCCESS ); -#endif /* WICED_WIFI_ISOLATE_AP_CLIENTS */ - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_ap_init( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ) -{ - wwd_result_t result; - - /* Keep WLAN awake while setting up softAP */ - WWD_WLAN_KEEP_AWAKE( ); - - result = internal_ap_init( ssid, auth_type, security_key, key_length, channel ); - - WWD_WLAN_LET_SLEEP( ); - - return result; -} - -wwd_result_t wwd_wifi_ap_up( void ) -{ - wiced_buffer_t buffer; - uint32_t* data; - - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = (uint32_t) CHIP_AP_INTERFACE; - data[1] = (uint32_t) BSS_UP; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Wait until AP is brought up */ - CHECK_RETURN_WITH_SEMAPHORE( host_rtos_get_semaphore( &wwd_wifi_sleep_flag, (uint32_t) 10000, WICED_FALSE ), &wwd_wifi_sleep_flag ); - - wwd_wifi_ap_is_up = WICED_TRUE; - return WWD_SUCCESS; -} - -/** Starts an infrastructure WiFi network - * @param ssid : A null terminated string containing the SSID name of the network to join - * @param auth_type : Authentication type: - * - WICED_SECURITY_OPEN - Open Security - * - WICED_SECURITY_WPA_TKIP_PSK - WPA Security - * - WICED_SECURITY_WPA2_AES_PSK - WPA2 Security using AES cipher - * - WICED_SECURITY_WPA2_MIXED_PSK - WPA2 Security using AES and/or TKIP ciphers - * - WEP security is currently unimplemented due to lack of security - * @param security_key : A byte array containing the cleartext security key for the network - * @param key_length : The length of the security_key in bytes. - * @param channel : 802.11 Channel number - * - * @return WWD_SUCCESS : if successfully creates an AP - * Error code : if an error occurred - */ -wwd_result_t wwd_wifi_start_ap( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ) -{ - CHECK_RETURN( wwd_wifi_ap_init( ssid, auth_type, security_key, key_length, channel ) ); - - CHECK_RETURN( wwd_wifi_ap_up() ); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_stop_ap( void ) -{ - uint32_t* data; - wiced_buffer_t buffer; - wiced_buffer_t response; - wwd_result_t result; - wwd_result_t result2; - - /* Query bss state (does it exist? if so is it UP?) */ - data = wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) CHIP_AP_INTERFACE; - result = wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_STA_INTERFACE ); - if ( result == WWD_WLAN_NOTFOUND ) - { - /* AP interface does not exist - i.e. it is down */ - wwd_wifi_ap_is_up = WICED_FALSE; - return WWD_SUCCESS; - } - - CHECK_RETURN( result ); - - data = (uint32_t*) host_buffer_get_current_piece_data_pointer( response ); - if ( data[0] != (uint32_t) BSS_UP ) - { - /* AP interface indicates it is not up - i.e. it is down */ - host_buffer_release( response, WWD_NETWORK_RX ); - wwd_wifi_ap_is_up = WICED_FALSE; - return WWD_SUCCESS; - } - - host_buffer_release( response, WWD_NETWORK_RX ); - - /* set BSS down */ - data = wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER( data ); - data[0] = (uint32_t) CHIP_AP_INTERFACE; - data[1] = (uint32_t) BSS_DOWN; - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_AP_INTERFACE ) ); - - /* Wait until AP is brought down */ - result = host_rtos_get_semaphore( &wwd_wifi_sleep_flag, (uint32_t) 10000, WICED_FALSE ); - result2 = host_rtos_deinit_semaphore( &wwd_wifi_sleep_flag ); - if ( result != WWD_SUCCESS ) - { - return result; - } - if ( result2 != WWD_SUCCESS ) - { - return result2; - } - - CHECK_RETURN( wwd_management_set_event_handler( apsta_events, NULL, NULL, WWD_AP_INTERFACE ) ); - - wwd_wifi_ap_is_up = WICED_FALSE; - return WWD_SUCCESS; - -} - -/** Sets the chip specific AMPDU parameters for AP and STA - * For SDK 3.0, and beyond, each chip will need it's own function for setting AMPDU parameters. - */ -wwd_result_t wwd_wifi_set_ampdu_parameters( void ) -{ - return wwd_wifi_set_ampdu_parameters_common( WWD_STA_INTERFACE, AMPDU_STA_DEFAULT_BA_WSIZE, AMPDU_STA_DEFAULT_MPDU, AMPDU_RX_FACTOR_8K ); -} - -/** Sets the chip specific AMPDU parameters for AP and STA - * For SDK 3.0, and beyond, each chip will need it's own function for setting AMPDU parameters. - */ - -wwd_result_t wwd_wifi_set_block_ack_window_size( wwd_interface_t interface ) -{ - return wwd_wifi_set_block_ack_window_size_common( interface, AMPDU_AP_DEFAULT_BA_WSIZE, AMPDU_STA_DEFAULT_BA_WSIZE ); -} diff --git a/components/WWD/WWD/internal/chips/4390/wwd_chip_specific_functions.c b/components/WWD/WWD/internal/chips/4390/wwd_chip_specific_functions.c deleted file mode 100644 index 21dacd45b2f59581de86ef3ca5125ea3fce41fa2..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/chips/4390/wwd_chip_specific_functions.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * - */ -#include "wwd_constants.h" -#include "wwd_wifi.h" - -/****************************************************** - * Macros - ******************************************************/ - -/****************************************************** - * Constants - ******************************************************/ - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - -/****************************************************** - * Variables Definitions - ******************************************************/ - -/****************************************************** - * Function Definitions - ******************************************************/ - -wwd_result_t wwd_wifi_read_wlan_log( char* buffer, uint32_t buffer_size ) -{ - UNUSED_PARAMETER(buffer); - UNUSED_PARAMETER(buffer_size); - return WWD_UNSUPPORTED; -} - -wwd_result_t wwd_wifi_set_custom_country_code( const wiced_country_info_t* country_code ) -{ - UNUSED_PARAMETER(country_code); - return WWD_UNSUPPORTED; -} diff --git a/components/WWD/WWD/internal/chips/4390x/chip_constants.h b/components/WWD/WWD/internal/chips/4390x/chip_constants.h deleted file mode 100644 index f538ffd7845a89789ca756275ae2fe8af87b67cb..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/chips/4390x/chip_constants.h +++ /dev/null @@ -1,411 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -#ifndef INCLUDED_CHIP_CONSTANTS_H_ -#define INCLUDED_CHIP_CONSTANTS_H_ - -#include "wwd_wlioctl.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * Architecture Constants - ******************************************************/ - -/* General chip stats */ -#define CHIP_RAM_SIZE 0x90000 - -/* Backplane architecture */ -#define CHIPCOMMON_BASE_ADDRESS 0x18000000 /* Chipcommon core register region */ -#define I2S0_BASE_ADDRESS 0x18001000 /* I2S0 core register region */ -#define I2S1_BASE_ADDRESS 0x18002000 /* I2S1 core register region */ -#define APPS_ARMCR4_BASE_ADDRESS 0x18003000 /* Apps Cortex-R4 core register region */ -#define DMA_BASE_ADDRESS 0x18004000 /* DMA core register region */ -#define GMAC_BASE_ADDRESS 0x18005000 /* GMAC core register region */ -#define USB20H0_BASE_ADDRESS 0x18006000 /* USB20H0 core register region */ -#define USB20D_BASE_ADDRESS 0x18007000 /* USB20D core register region */ -#define SDIOH_BASE_ADDRESS 0x18008000 /* SDIOH Device core register region */ -#define SDIO_BASE_ADDRESS 0x18009000 /* SDIOD Device core register region */ - -#define DOT11MAC_BASE_ADDRESS 0x18010000 /* dot11mac core register region */ -#define WLAN_ARMCR4_BASE_ADDRESS 0x18011000 /* WLAN_ARMCR4 core register region */ -#define SOCSRAM_BASE_ADDRESS 0x1800c000 /* SOCSRAM core register region */ -#define BACKPLANE_ADDRESS_MASK 0x7FFF - -#define CHIP_STA_INTERFACE 0 -#define CHIP_AP_INTERFACE 1 -#define CHIP_P2P_INTERFACE 2 - -/* Maximum value of bus data credit difference */ -#define CHIP_MAX_BUS_DATA_CREDIT_DIFF 20 - -/* Chipcommon registers */ -#define CHIPCOMMON_GPIO_CONTROL ((uint32_t) (CHIPCOMMON_BASE_ADDRESS + 0x6C) ) - -/****************************************************** - * SDIO Constants - ******************************************************/ -/* CurrentSdiodProgGuide r23 */ - -/* Base registers */ -#define SDIO_INT_STATUS ((uint32_t) (SDIO_BASE_ADDRESS + 0x20) ) -#define SDIO_TO_SB_MAILBOX_DATA ((uint32_t) (SDIO_BASE_ADDRESS + 0x48) ) -#define SDIO_TO_HOST_MAILBOX_DATA ((uint32_t) (SDIO_BASE_ADDRESS + 0x4C) ) -#define SDIO_TO_SB_MAIL_BOX ((uint32_t) (SDIO_BASE_ADDRESS + 0x40) ) -#define SDIO_INT_HOST_MASK ((uint32_t) (SDIO_BASE_ADDRESS + 0x24) ) -#define SDIO_FUNCTION_INT_MASK ((uint32_t) (SDIO_BASE_ADDRESS + 0x34) ) - -/* SDIO Function 0 (SDIO Bus) register addresses */ - -/* SDIO Device CCCR offsets */ -/* TODO: What does CIS/CCCR stand for? */ -/* CCCR accesses do not require backpane clock */ -#define SDIOD_CCCR_REV ( (uint32_t) 0x00 ) /* CCCR/SDIO Revision */ -#define SDIOD_CCCR_SDREV ( (uint32_t) 0x01 ) /* SD Revision */ -#define SDIOD_CCCR_IOEN ( (uint32_t) 0x02 ) /* I/O Enable */ -#define SDIOD_CCCR_IORDY ( (uint32_t) 0x03 ) /* I/O Ready */ -#define SDIOD_CCCR_INTEN ( (uint32_t) 0x04 ) /* Interrupt Enable */ -#define SDIOD_CCCR_INTPEND ( (uint32_t) 0x05 ) /* Interrupt Pending */ -#define SDIOD_CCCR_IOABORT ( (uint32_t) 0x06 ) /* I/O Abort */ -#define SDIOD_CCCR_BICTRL ( (uint32_t) 0x07 ) /* Bus Interface control */ -#define SDIOD_CCCR_CAPABLITIES ( (uint32_t) 0x08 ) /* Card Capabilities */ -#define SDIOD_CCCR_CISPTR_0 ( (uint32_t) 0x09 ) /* Common CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_CISPTR_1 ( (uint32_t) 0x0A ) /* Common CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_CISPTR_2 ( (uint32_t) 0x0B ) /* Common CIS Base Address Pointer Register 2 (MSB - only bit 1 valid)*/ -#define SDIOD_CCCR_BUSSUSP ( (uint32_t) 0x0C ) /* */ -#define SDIOD_CCCR_FUNCSEL ( (uint32_t) 0x0D ) /* */ -#define SDIOD_CCCR_EXECFLAGS ( (uint32_t) 0x0E ) /* */ -#define SDIOD_CCCR_RDYFLAGS ( (uint32_t) 0x0F ) /* */ -#define SDIOD_CCCR_BLKSIZE_0 ( (uint32_t) 0x10 ) /* Function 0 (Bus) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_BLKSIZE_1 ( (uint32_t) 0x11 ) /* Function 0 (Bus) SDIO Block Size Register 1 (MSB) */ -#define SDIOD_CCCR_POWER_CONTROL ( (uint32_t) 0x12 ) /* Power Control */ -#define SDIOD_CCCR_SPEED_CONTROL ( (uint32_t) 0x13 ) /* Bus Speed Select (control device entry into high-speed clocking mode) */ -#define SDIOD_CCCR_UHS_I ( (uint32_t) 0x14 ) /* UHS-I Support */ -#define SDIOD_CCCR_DRIVE ( (uint32_t) 0x15 ) /* Drive Strength */ -#define SDIOD_CCCR_INTEXT ( (uint32_t) 0x16 ) /* Interrupt Extension */ -#define SDIOD_SEP_INT_CTL ( (uint32_t) 0xF2 ) /* Separate Interrupt Control*/ -#define SDIOD_CCCR_F1INFO ( (uint32_t) 0x100 ) /* Function 1 (Backplane) Info */ -#define SDIOD_CCCR_F1HP ( (uint32_t) 0x102 ) /* Function 1 (Backplane) High Power */ -#define SDIOD_CCCR_F1CISPTR_0 ( (uint32_t) 0x109 ) /* Function 1 (Backplane) CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_F1CISPTR_1 ( (uint32_t) 0x10A ) /* Function 1 (Backplane) CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_F1CISPTR_2 ( (uint32_t) 0x10B ) /* Function 1 (Backplane) CIS Base Address Pointer Register 2 (MSB - only bit 1 valid) */ -#define SDIOD_CCCR_F1BLKSIZE_0 ( (uint32_t) 0x110 ) /* Function 1 (Backplane) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_F1BLKSIZE_1 ( (uint32_t) 0x111 ) /* Function 1 (Backplane) SDIO Block Size Register 1 (MSB) */ -#define SDIOD_CCCR_F2INFO ( (uint32_t) 0x200 ) /* Function 2 (WLAN Data FIFO) Info */ -#define SDIOD_CCCR_F2HP ( (uint32_t) 0x202 ) /* Function 2 (WLAN Data FIFO) High Power */ -#define SDIOD_CCCR_F2CISPTR_0 ( (uint32_t) 0x209 ) /* Function 2 (WLAN Data FIFO) CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_F2CISPTR_1 ( (uint32_t) 0x20A ) /* Function 2 (WLAN Data FIFO) CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_F2CISPTR_2 ( (uint32_t) 0x20B ) /* Function 2 (WLAN Data FIFO) CIS Base Address Pointer Register 2 (MSB - only bit 1 valid) */ -#define SDIOD_CCCR_F2BLKSIZE_0 ( (uint32_t) 0x210 ) /* Function 2 (WLAN Data FIFO) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_F2BLKSIZE_1 ( (uint32_t) 0x211 ) /* Function 2 (WLAN Data FIFO) SDIO Block Size Register 1 (MSB) */ -#define SDIOD_CCCR_F3INFO ( (uint32_t) 0x300 ) /* Function 3 (Bluetooth Data FIFO) Info */ -#define SDIOD_CCCR_F3HP ( (uint32_t) 0x302 ) /* Function 3 (Bluetooth Data FIFO) High Power */ -#define SDIOD_CCCR_F3CISPTR_0 ( (uint32_t) 0x309 ) /* Function 3 (Bluetooth Data FIFO) CIS Base Address Pointer Register 0 (LSB) */ -#define SDIOD_CCCR_F3CISPTR_1 ( (uint32_t) 0x30A ) /* Function 3 (Bluetooth Data FIFO) CIS Base Address Pointer Register 1 */ -#define SDIOD_CCCR_F3CISPTR_2 ( (uint32_t) 0x30B ) /* Function 3 (Bluetooth Data FIFO) CIS Base Address Pointer Register 2 (MSB - only bit 1 valid) */ -#define SDIOD_CCCR_F3BLKSIZE_0 ( (uint32_t) 0x310 ) /* Function 3 (Bluetooth Data FIFO) SDIO Block Size Register 0 (LSB) */ -#define SDIOD_CCCR_F3BLKSIZE_1 ( (uint32_t) 0x311 ) /* Function 3 (Bluetooth Data FIFO) SDIO Block Size Register 1 (MSB) */ - - -/* SDIO Function 1 (Backplane) register addresses */ -/* Addresses 0x00000000 - 0x0000FFFF are directly access the backplane - * throught the backplane window. Addresses above 0x0000FFFF are - * registers relating to backplane access, and do not require a backpane - * clock to access them - */ -#define SDIO_GPIO_SELECT ( (uint32_t) 0x10005 ) -#define SDIO_GPIO_OUTPUT ( (uint32_t) 0x10006 ) -#define SDIO_GPIO_ENABLE ( (uint32_t) 0x10007 ) -#define SDIO_FUNCTION2_WATERMARK ( (uint32_t) 0x10008 ) -#define SDIO_DEVICE_CONTROL ( (uint32_t) 0x10009 ) -#define SDIO_BACKPLANE_ADDRESS_LOW ( (uint32_t) 0x1000A ) -#define SDIO_BACKPLANE_ADDRESS_MID ( (uint32_t) 0x1000B ) -#define SDIO_BACKPLANE_ADDRESS_HIGH ( (uint32_t) 0x1000C ) -#define SDIO_FRAME_CONTROL ( (uint32_t) 0x1000D ) -#define SDIO_CHIP_CLOCK_CSR ( (uint32_t) 0x1000E ) -#define SDIO_PULL_UP ( (uint32_t) 0x1000F ) -#define SDIO_READ_FRAME_BC_LOW ( (uint32_t) 0x1001B ) -#define SDIO_READ_FRAME_BC_HIGH ( (uint32_t) 0x1001C ) - -#define I_HMB_SW_MASK ( (uint32_t) 0x000000F0 ) - -/****************************************************** - * SPI Constants - ******************************************************/ -/* GSPI v1 */ -#define SPI_FRAME_CONTROL ( (uint32_t) 0x1000D ) - -/* Register addresses */ -#define SPI_BUS_CONTROL ( (uint32_t) 0x0000 ) -#define SPI_RESPONSE_DELAY ( (uint32_t) 0x0001 ) -#define SPI_STATUS_ENABLE ( (uint32_t) 0x0002 ) -#define SPI_RESET_BP ( (uint32_t) 0x0003 ) /* (corerev >= 1) */ -#define SPI_INTERRUPT_REGISTER ( (uint32_t) 0x0004 ) /* 16 bits - Interrupt status */ -#define SPI_INTERRUPT_ENABLE_REGISTER ( (uint32_t) 0x0006 ) /* 16 bits - Interrupt mask */ -#define SPI_STATUS_REGISTER ( (uint32_t) 0x0008 ) /* 32 bits */ -#define SPI_FUNCTION1_INFO ( (uint32_t) 0x000C ) /* 16 bits */ -#define SPI_FUNCTION2_INFO ( (uint32_t) 0x000E ) /* 16 bits */ -#define SPI_FUNCTION3_INFO ( (uint32_t) 0x0010 ) /* 16 bits */ -#define SPI_READ_TEST_REGISTER ( (uint32_t) 0x0014 ) /* 32 bits */ -#define SPI_RESP_DELAY_F0 ( (uint32_t) 0x001c ) /* 8 bits (corerev >= 3) */ -#define SPI_RESP_DELAY_F1 ( (uint32_t) 0x001d ) /* 8 bits (corerev >= 3) */ -#define SPI_RESP_DELAY_F2 ( (uint32_t) 0x001e ) /* 8 bits (corerev >= 3) */ -#define SPI_RESP_DELAY_F3 ( (uint32_t) 0x001f ) /* 8 bits (corerev >= 3) */ - -/****************************************************** - * Bit Masks - ******************************************************/ - -/* SDIOD_CCCR_REV Bits */ -#define SDIO_REV_SDIOID_MASK ( (uint32_t) 0xF0 ) /* SDIO spec revision number */ -#define SDIO_REV_CCCRID_MASK ( (uint32_t) 0x0F ) /* CCCR format version number */ - -/* SDIOD_CCCR_SDREV Bits */ -#define SD_REV_PHY_MASK ( (uint32_t) 0x0F ) /* SD format version number */ - -/* SDIOD_CCCR_IOEN Bits */ -#define SDIO_FUNC_ENABLE_1 ( (uint32_t) 0x02 ) /* function 1 I/O enable */ -#define SDIO_FUNC_ENABLE_2 ( (uint32_t) 0x04 ) /* function 2 I/O enable */ -#define SDIO_FUNC_ENABLE_3 ( (uint32_t) 0x08 ) /* function 3 I/O enable */ - -/* SDIOD_CCCR_IORDY Bits */ -#define SDIO_FUNC_READY_1 ( (uint32_t) 0x02 ) /* function 1 I/O ready */ -#define SDIO_FUNC_READY_2 ( (uint32_t) 0x04 ) /* function 2 I/O ready */ -#define SDIO_FUNC_READY_3 ( (uint32_t) 0x08 ) /* function 3 I/O ready */ - -/* SDIOD_CCCR_INTEN Bits */ -#define INTR_CTL_MASTER_EN ( (uint32_t) 0x01 ) /* interrupt enable master */ -#define INTR_CTL_FUNC1_EN ( (uint32_t) 0x02 ) /* interrupt enable for function 1 */ -#define INTR_CTL_FUNC2_EN ( (uint32_t) 0x04 ) /* interrupt enable for function 2 */ - -/* SDIOD_SEP_INT_CTL Bits */ -#define SEP_INTR_CTL_MASK ( (uint32_t) 0x01 ) /* out-of-band interrupt mask */ -#define SEP_INTR_CTL_EN ( (uint32_t) 0x02 ) /* out-of-band interrupt output enable */ -#define SEP_INTR_CTL_POL ( (uint32_t) 0x04 ) /* out-of-band interrupt polarity */ - -/* SDIOD_CCCR_INTPEND Bits */ -#define INTR_STATUS_FUNC1 ( (uint32_t) 0x02 ) /* interrupt pending for function 1 */ -#define INTR_STATUS_FUNC2 ( (uint32_t) 0x04 ) /* interrupt pending for function 2 */ -#define INTR_STATUS_FUNC3 ( (uint32_t) 0x08 ) /* interrupt pending for function 3 */ - -/* SDIOD_CCCR_IOABORT Bits */ -#define IO_ABORT_RESET_ALL ( (uint32_t) 0x08 ) /* I/O card reset */ -#define IO_ABORT_FUNC_MASK ( (uint32_t) 0x07 ) /* abort selction: function x */ - -/* SDIOD_CCCR_BICTRL Bits */ -#define BUS_CARD_DETECT_DIS ( (uint32_t) 0x80 ) /* Card Detect disable */ -#define BUS_SPI_CONT_INTR_CAP ( (uint32_t) 0x40 ) /* support continuous SPI interrupt */ -#define BUS_SPI_CONT_INTR_EN ( (uint32_t) 0x20 ) /* continuous SPI interrupt enable */ -#define BUS_SD_DATA_WIDTH_MASK ( (uint32_t) 0x03 ) /* bus width mask */ -#define BUS_SD_DATA_WIDTH_4BIT ( (uint32_t) 0x02 ) /* bus width 4-bit mode */ -#define BUS_SD_DATA_WIDTH_1BIT ( (uint32_t) 0x00 ) /* bus width 1-bit mode */ - -/* SDIOD_CCCR_CAPABLITIES Bits */ -#define SDIO_CAP_4BLS ( (uint32_t) 0x80 ) /* 4-bit support for low speed card */ -#define SDIO_CAP_LSC ( (uint32_t) 0x40 ) /* low speed card */ -#define SDIO_CAP_E4MI ( (uint32_t) 0x20 ) /* enable interrupt between block of data in 4-bit mode */ -#define SDIO_CAP_S4MI ( (uint32_t) 0x10 ) /* support interrupt between block of data in 4-bit mode */ -#define SDIO_CAP_SBS ( (uint32_t) 0x08 ) /* support suspend/resume */ -#define SDIO_CAP_SRW ( (uint32_t) 0x04 ) /* support read wait */ -#define SDIO_CAP_SMB ( (uint32_t) 0x02 ) /* support multi-block transfer */ -#define SDIO_CAP_SDC ( (uint32_t) 0x01 ) /* Support Direct commands during multi-byte transfer */ - -/* SDIOD_CCCR_POWER_CONTROL Bits */ -#define SDIO_POWER_SMPC ( (uint32_t) 0x01 ) /* supports master power control (RO) */ -#define SDIO_POWER_EMPC ( (uint32_t) 0x02 ) /* enable master power control (allow > 200mA) (RW) */ - -/* SDIOD_CCCR_SPEED_CONTROL Bits */ -#define SDIO_SPEED_SHS ( (uint32_t) 0x01 ) /* supports high-speed [clocking] mode (RO) */ -#define SDIO_SPEED_EHS ( (uint32_t) 0x02 ) /* enable high-speed [clocking] mode (RW) */ - - - -/* GSPI */ -#define SPI_READ_TEST_REGISTER_VALUE ( (uint32_t) 0xFEEDBEAD ) -#define SPI_READ_TEST_REG_LSB ( ( ( SPI_READ_TEST_REGISTER_VALUE ) ) & 0xff ) -#define SPI_READ_TEST_REG_LSB_SFT1 ( ( ( SPI_READ_TEST_REGISTER_VALUE << 1 ) ) & 0xff ) -#define SPI_READ_TEST_REG_LSB_SFT2 ( ( ( SPI_READ_TEST_REGISTER_VALUE << 1 ) + 1 ) & 0xff ) -#define SPI_READ_TEST_REG_LSB_SFT3 ( ( ( SPI_READ_TEST_REGISTER_VALUE +1 ) << 1 ) & 0xff ) - - -/* SPI_BUS_CONTROL Bits */ -#define WORD_LENGTH_32 ( (uint32_t) 0x01 ) /* 0/1 16/32 bit word length */ -#define ENDIAN_BIG ( (uint32_t) 0x02 ) /* 0/1 Little/Big Endian */ -#define CLOCK_PHASE ( (uint32_t) 0x04 ) /* 0/1 clock phase delay */ -#define CLOCK_POLARITY ( (uint32_t) 0x08 ) /* 0/1 Idle state clock polarity is low/high */ -#define HIGH_SPEED_MODE ( (uint32_t) 0x10 ) /* 1/0 High Speed mode / Normal mode */ -#define INTERRUPT_POLARITY_HIGH ( (uint32_t) 0x20 ) /* 1/0 Interrupt active polarity is high/low */ -#define WAKE_UP ( (uint32_t) 0x80 ) /* 0/1 Wake-up command from Host to WLAN */ - -/* SPI_RESPONSE_DELAY Bit mask */ -#define RESPONSE_DELAY_MASK 0xFF /* Configurable rd response delay in multiples of 8 bits */ - -/* SPI_STATUS_ENABLE Bits */ -#define STATUS_ENABLE ( (uint32_t) 0x01 ) /* 1/0 Status sent/not sent to host after read/write */ -#define INTR_WITH_STATUS ( (uint32_t) 0x02 ) /* 0/1 Do-not / do-interrupt if status is sent */ -#define RESP_DELAY_ALL ( (uint32_t) 0x04 ) /* Applicability of resp delay to F1 or all func's read */ -#define DWORD_PKT_LEN_EN ( (uint32_t) 0x08 ) /* Packet len denoted in dwords instead of bytes */ -#define CMD_ERR_CHK_EN ( (uint32_t) 0x20 ) /* Command error check enable */ -#define DATA_ERR_CHK_EN ( (uint32_t) 0x40 ) /* Data error check enable */ - - - -/* SPI_RESET_BP Bits*/ -#define RESET_ON_WLAN_BP_RESET ( (uint32_t) 0x04 ) /* enable reset for WLAN backplane */ -#define RESET_SPI ( (uint32_t) 0x80 ) /* reset the above enabled logic */ - - - -/* SPI_INTERRUPT_REGISTER and SPI_INTERRUPT_ENABLE_REGISTER Bits */ -#define DATA_UNAVAILABLE ( (uint32_t) 0x0001 ) /* Requested data not available; Clear by writing a "1" */ -#define F2_F3_FIFO_RD_UNDERFLOW ( (uint32_t) 0x0002 ) -#define F2_F3_FIFO_WR_OVERFLOW ( (uint32_t) 0x0004 ) -#define COMMAND_ERROR ( (uint32_t) 0x0008 ) /* Cleared by writing 1 */ -#define DATA_ERROR ( (uint32_t) 0x0010 ) /* Cleared by writing 1 */ -#define F2_PACKET_AVAILABLE ( (uint32_t) 0x0020 ) -#define F3_PACKET_AVAILABLE ( (uint32_t) 0x0040 ) -#define F1_OVERFLOW ( (uint32_t) 0x0080 ) /* Due to last write. Bkplane has pending write requests */ -#define MISC_INTR0 ( (uint32_t) 0x0100 ) -#define MISC_INTR1 ( (uint32_t) 0x0200 ) -#define MISC_INTR2 ( (uint32_t) 0x0400 ) -#define MISC_INTR3 ( (uint32_t) 0x0800 ) -#define MISC_INTR4 ( (uint32_t) 0x1000 ) -#define F1_INTR ( (uint32_t) 0x2000 ) -#define F2_INTR ( (uint32_t) 0x4000 ) -#define F3_INTR ( (uint32_t) 0x8000 ) - - - - -/* SPI_STATUS_REGISTER Bits */ -#define STATUS_DATA_NOT_AVAILABLE ( (uint32_t) 0x00000001 ) -#define STATUS_UNDERFLOW ( (uint32_t) 0x00000002 ) -#define STATUS_OVERFLOW ( (uint32_t) 0x00000004 ) -#define STATUS_F2_INTR ( (uint32_t) 0x00000008 ) -#define STATUS_F3_INTR ( (uint32_t) 0x00000010 ) -#define STATUS_F2_RX_READY ( (uint32_t) 0x00000020 ) -#define STATUS_F3_RX_READY ( (uint32_t) 0x00000040 ) -#define STATUS_HOST_CMD_DATA_ERR ( (uint32_t) 0x00000080 ) -#define STATUS_F2_PKT_AVAILABLE ( (uint32_t) 0x00000100 ) -#define STATUS_F2_PKT_LEN_MASK ( (uint32_t) 0x000FFE00 ) -#define STATUS_F2_PKT_LEN_SHIFT ( (uint32_t) 9 ) -#define STATUS_F3_PKT_AVAILABLE ( (uint32_t) 0x00100000 ) -#define STATUS_F3_PKT_LEN_MASK ( (uint32_t) 0xFFE00000 ) -#define STATUS_F3_PKT_LEN_SHIFT ( (uint32_t) 21 ) - - - - - -/* SDIO_CHIP_CLOCK_CSR Bits */ -#define SBSDIO_FORCE_ALP ( (uint32_t) 0x01 ) /* Force ALP request to backplane */ -#define SBSDIO_FORCE_HT ( (uint32_t) 0x02 ) /* Force HT request to backplane */ -#define SBSDIO_FORCE_ILP ( (uint32_t) 0x04 ) /* Force ILP request to backplane */ -#define SBSDIO_ALP_AVAIL_REQ ( (uint32_t) 0x08 ) /* Make ALP ready (power up xtal) */ -#define SBSDIO_HT_AVAIL_REQ ( (uint32_t) 0x10 ) /* Make HT ready (power up PLL) */ -#define SBSDIO_FORCE_HW_CLKREQ_OFF ( (uint32_t) 0x20 ) /* Squelch clock requests from HW */ -#define SBSDIO_ALP_AVAIL ( (uint32_t) 0x40 ) /* Status: ALP is ready */ -#define SBSDIO_HT_AVAIL ( (uint32_t) 0x80 ) /* Status: HT is ready */ -#define SBSDIO_Rev8_HT_AVAIL ( (uint32_t) 0x40 ) -#define SBSDIO_Rev8_ALP_AVAIL ( (uint32_t) 0x80 ) - - -/* SDIO_FRAME_CONTROL Bits */ -#define SFC_RF_TERM ( (uint32_t) (1 << 0) ) /* Read Frame Terminate */ -#define SFC_WF_TERM ( (uint32_t) (1 << 1) ) /* Write Frame Terminate */ -#define SFC_CRC4WOOS ( (uint32_t) (1 << 2) ) /* HW reports CRC error for write out of sync */ -#define SFC_ABORTALL ( (uint32_t) (1 << 3) ) /* Abort cancels all in-progress frames */ - -/* SDIO_TO_SB_MAIL_BOX bits corresponding to intstatus bits */ -#define SMB_NAK ( (uint32_t) (1 << 0) ) /* To SB Mailbox Frame NAK */ -#define SMB_INT_ACK ( (uint32_t) (1 << 1) ) /* To SB Mailbox Host Interrupt ACK */ -#define SMB_USE_OOB ( (uint32_t) (1 << 2) ) /* To SB Mailbox Use OOB Wakeup */ -#define SMB_DEV_INT ( (uint32_t) (1 << 3) ) /* To SB Mailbox Miscellaneous Interrupt */ - -#define WL_CHANSPEC_BAND_MASK 0xc000 -#define WL_CHANSPEC_BAND_SHIFT 14 -#define WL_CHANSPEC_BAND_2G 0x0000 -#define WL_CHANSPEC_BAND_5G 0xc000 - -#define WL_CHANSPEC_CTL_SB_MASK 0x0700 -#define WL_CHANSPEC_CTL_SB_SHIFT 8 -#define WL_CHANSPEC_CTL_SB_LLL 0x0000 -#define WL_CHANSPEC_CTL_SB_LLU 0x0100 -#define WL_CHANSPEC_CTL_SB_LUL 0x0200 -#define WL_CHANSPEC_CTL_SB_LUU 0x0300 -#define WL_CHANSPEC_CTL_SB_ULL 0x0400 -#define WL_CHANSPEC_CTL_SB_ULU 0x0500 -#define WL_CHANSPEC_CTL_SB_UUL 0x0600 -#define WL_CHANSPEC_CTL_SB_UUU 0x0700 -#define WL_CHANSPEC_CTL_SB_LL WL_CHANSPEC_CTL_SB_LLL -#define WL_CHANSPEC_CTL_SB_LU WL_CHANSPEC_CTL_SB_LLU -#define WL_CHANSPEC_CTL_SB_UL WL_CHANSPEC_CTL_SB_LUL -#define WL_CHANSPEC_CTL_SB_UU WL_CHANSPEC_CTL_SB_LUU -#define WL_CHANSPEC_CTL_SB_L WL_CHANSPEC_CTL_SB_LLL -#define WL_CHANSPEC_CTL_SB_U WL_CHANSPEC_CTL_SB_LLU -#define WL_CHANSPEC_CTL_SB_LOWER WL_CHANSPEC_CTL_SB_LLL -#define WL_CHANSPEC_CTL_SB_UPPER WL_CHANSPEC_CTL_SB_LLU -#define WL_CHANSPEC_CTL_SB_NONE WL_CHANSPEC_CTL_SB_LLL -#define WL_CHANSPEC_BW_MASK 0x3800 -#define WL_CHANSPEC_BW_SHIFT 11 -#define WL_CHANSPEC_BW_5 0x0000 -#define WL_CHANSPEC_BW_10 0x0800 -#define WL_CHANSPEC_BW_20 0x1000 -#define WL_CHANSPEC_BW_40 0x1800 - - -/* CIS accesses require backpane clock */ - - -#undef CHIP_HAS_BSSID_CNT_IN_ASSOC_PARAMS -#undef CHIP_FIRMWARE_SUPPORTS_PM_LIMIT_IOVAR - -struct ether_addr; -struct wl_join_scan_params; - -typedef struct wl_assoc_params -{ - struct ether_addr bssid; -#ifdef CHIP_HAS_BSSID_CNT_IN_ASSOC_PARAMS - uint16_t bssid_cnt; -#endif /* ifdef CHIP_HAS_BSSID_CNT_IN_ASSOC_PARAMS */ - uint32_t chanspec_num; - chanspec_t chanspec_list[1]; -} wl_assoc_params_t; -#define WL_ASSOC_PARAMS_FIXED_SIZE (sizeof(wl_assoc_params_t) - sizeof(wl_chanspec_t)) -typedef wl_assoc_params_t wl_reassoc_params_t; -#define WL_REASSOC_PARAMS_FIXED_SIZE WL_ASSOC_PARAMS_FIXED_SIZE -typedef wl_assoc_params_t wl_join_assoc_params_t; -#define WL_JOIN_ASSOC_PARAMS_FIXED_SIZE WL_ASSOC_PARAMS_FIXED_SIZE -typedef struct wl_join_params -{ - wlc_ssid_t ssid; - struct wl_assoc_params params; -} wl_join_params_t; -#define WL_JOIN_PARAMS_FIXED_SIZE (sizeof(wl_join_params_t) - sizeof(wl_chanspec_t)) - -/* extended join params */ -typedef struct wl_extjoin_params -{ - wlc_ssid_t ssid; /* {0, ""}: wildcard scan */ - struct wl_join_scan_params scan_params; - wl_join_assoc_params_t assoc_params; /* optional field, but it must include the fixed portion of the wl_join_assoc_params_t struct when it does present. */ -} wl_extjoin_params_t; -#define WL_EXTJOIN_PARAMS_FIXED_SIZE (sizeof(wl_extjoin_params_t) - sizeof(chanspec_t)) - -typedef wl_cnt_ver_ten_t wiced_counters_t; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ifndef INCLUDED_CHIP_CONSTANTS_H_ */ diff --git a/components/WWD/WWD/internal/chips/4390x/wwd_ap.c b/components/WWD/WWD/internal/chips/4390x/wwd_ap.c deleted file mode 100644 index 063c4aa87aa15f0a7fdcdae1cd4485eb6faefd70..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/chips/4390x/wwd_ap.c +++ /dev/null @@ -1,396 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Provides an APSTA functionality specific to the 4319B0 - */ - -#include -#include "wwd_wifi.h" -#include "wwd_rtos.h" -#include "wwd_events.h" -#include "wwd_assert.h" -#include "wwd_management.h" -#include "network/wwd_buffer_interface.h" -#include "RTOS/wwd_rtos_interface.h" -#include "internal/wwd_sdpcm.h" -#include "internal/wwd_internal.h" -#include "internal/wwd_ap.h" -#include "internal/wwd_ap_common.h" - -/****************************************************** - * Macros - ******************************************************/ - -/****************************************************** - * @cond Constants - ******************************************************/ - -#define WLC_EVENT_MSG_LINK (0x01) -#define RATE_SETTING_11_MBPS (11000000 / 500000) - -#define AMPDU_STA_DEFAULT_BA_WSIZE (12) /* STA mode default AMPDU block ack window size */ -#define AMPDU_AP_DEFAULT_BA_WSIZE (8) /* SoftAP mode default AMPDU block ack window size */ - -typedef enum -{ - BSS_AP = 3, - BSS_STA = 2, - BSS_UP = 1, - BSS_DOWN = 0 -} bss_arg_option_t; - -/** @endcond */ - - -/****************************************************** - * Local Structures - ******************************************************/ - - -/****************************************************** - * Static Variables - ******************************************************/ - -wiced_bool_t wwd_wifi_ap_is_up = WICED_FALSE; -static host_semaphore_type_t wwd_wifi_sleep_flag; -static const wwd_event_num_t apsta_events[] = { WLC_E_IF, WLC_E_LINK, WLC_E_NONE }; - -/****************************************************** - * Static Function prototypes - ******************************************************/ - -static void* wwd_handle_apsta_event ( const wwd_event_header_t* event_header, const uint8_t* event_data, /*@returned@*/ void* handler_user_data ); -static wwd_result_t internal_ap_init ( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ); -wwd_result_t wwd_wifi_ap_init ( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ); -wwd_result_t wwd_wifi_ap_up ( void ); - -/****************************************************** - * Function definitions - ******************************************************/ - -static void* wwd_handle_apsta_event( const wwd_event_header_t* event_header, const uint8_t* event_data, /*@null@*/ void* handler_user_data ) -{ - UNUSED_PARAMETER( event_header ); - UNUSED_PARAMETER( event_data ); - UNUSED_PARAMETER( handler_user_data ); - - if ( (wwd_interface_t) event_header->interface != WWD_AP_INTERFACE) - { - return handler_user_data; - } - - if ( ( ( event_header->event_type == (wwd_event_num_t) WLC_E_LINK ) && - ( event_header->interface == WWD_AP_INTERFACE ) ) || - ( event_header->event_type == WLC_E_IF ) ) - { - wwd_result_t result; - result = host_rtos_set_semaphore( &wwd_wifi_sleep_flag, WICED_FALSE ); - wiced_assert( "failed to post ap link semaphore", result == WWD_SUCCESS ); - REFERENCE_DEBUG_ONLY_VARIABLE( result); - } - return handler_user_data; -} - -static wwd_result_t internal_ap_init( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ) -{ - wiced_bool_t wait_for_interface = WICED_FALSE; - wwd_result_t result; - wiced_buffer_t response; - wiced_buffer_t buffer; - uint32_t* data; - - if ( auth_type == WICED_SECURITY_WEP_PSK ) - { - return WWD_WEP_NOT_ALLOWED; - } - if ( ( ( auth_type == WICED_SECURITY_WPA_TKIP_PSK ) || ( auth_type == WICED_SECURITY_WPA2_AES_PSK ) || ( auth_type == WICED_SECURITY_WPA2_MIXED_PSK ) ) && - ( ( key_length < (uint8_t) 8 ) || ( key_length > (uint8_t) 64 ) ) ) - { - return WWD_WPA_KEYLEN_BAD; - } - - if ( wwd_wifi_set_block_ack_window_size( WWD_AP_INTERFACE ) != WWD_SUCCESS ) - { - return WWD_SET_BLOCK_ACK_WINDOW_FAIL; - } - - /* Query bss state (does it exist? if so is it UP?) */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) CHIP_AP_INTERFACE; - if ( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_STA_INTERFACE ) != WWD_SUCCESS ) - { - /* Note: We don't need to release the response packet since the iovar failed */ - wait_for_interface = WICED_TRUE; - } - else - { - /* Check if the BSS is already UP, if so return */ - uint32_t* data2 = (uint32_t*) host_buffer_get_current_piece_data_pointer( response ); - if ( *data2 == (uint32_t) BSS_UP ) - { - host_buffer_release( response, WWD_NETWORK_RX ); - wwd_wifi_ap_is_up = WICED_TRUE; - return WWD_SUCCESS; - } - else - { - host_buffer_release( response, WWD_NETWORK_RX ); - } - } - - CHECK_RETURN( host_rtos_init_semaphore( &wwd_wifi_sleep_flag ) ); - - /* Register for interested events */ - CHECK_RETURN_WITH_SEMAPHORE( wwd_management_set_event_handler( apsta_events, wwd_handle_apsta_event, NULL, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - - - - /* Set AP mode */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - *data = 1; /* Turn on AP */ - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_AP, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - - - /* Set the SSID */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 40, "bsscfg:" IOVAR_STR_SSID ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = (uint32_t) CHIP_AP_INTERFACE; /* Set the bsscfg index */ - data[1] = ssid->length; /* Set the ssid length */ - memcpy( &data[2], (uint8_t*) ssid->value, ssid->length ); - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Check if we need to wait for interface to be created */ - if ( wait_for_interface == WICED_TRUE ) - { - CHECK_RETURN_WITH_SEMAPHORE( host_rtos_get_semaphore( &wwd_wifi_sleep_flag, (uint32_t) 10000, WICED_FALSE ), &wwd_wifi_sleep_flag ); - } - - /* Set the channel */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - *data = channel; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_CHANNEL, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, "bsscfg:" IOVAR_STR_WSEC ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = (uint32_t) CHIP_AP_INTERFACE; - if ((auth_type & WPS_ENABLED) != 0) - { - data[1] = (uint32_t) ( ( auth_type & ( ~WPS_ENABLED ) ) | SES_OW_ENABLED ); - } - else - { - data[1] = (uint32_t) auth_type; - } - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ), &wwd_wifi_sleep_flag ); - - if ( auth_type != WICED_SECURITY_OPEN ) - { - wsec_pmk_t* psk; - - /* Set the wpa auth */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, "bsscfg:" IOVAR_STR_WPA_AUTH ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = (uint32_t) CHIP_AP_INTERFACE; - data[1] = (uint32_t) (auth_type == WICED_SECURITY_WPA_TKIP_PSK) ? ( WPA_AUTH_PSK ) : ( WPA2_AUTH_PSK | WPA_AUTH_PSK ); - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Set the passphrase */ - psk = (wsec_pmk_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(wsec_pmk_t) ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( psk, &wwd_wifi_sleep_flag ); - memcpy( psk->key, security_key, key_length ); - psk->key_len = key_length; - psk->flags = (uint16_t) WSEC_PASSPHRASE; - host_rtos_delay_milliseconds( 1 ); /* Delay required to allow radio firmware to be ready to receive PMK and avoid intermittent failure */ - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_WSEC_PMK, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - } - - /* Set the GMode */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - *data = (uint32_t) GMODE_AUTO; - - result = wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_GMODE, buffer, 0, WWD_AP_INTERFACE ); - if ( ( result != WWD_SUCCESS ) && ( result != WWD_WLAN_ASSOCIATED ) ) - { - wiced_assert("start_ap: Failed to set GMode\n", 0 == 1 ); - - (void) host_rtos_deinit_semaphore( &wwd_wifi_sleep_flag ); - return result; - } - - /* Set the multicast transmission rate to 11 Mbps rather than the default 1 Mbps */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_2G_MULTICAST_RATE ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) RATE_SETTING_11_MBPS; - result = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_AP_INTERFACE ); - wiced_assert("start_ap: Failed to set multicast transmission rate\r\n", result == WWD_SUCCESS ); - - /* Set DTIM period */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - *data = (uint32_t) WICED_DEFAULT_SOFT_AP_DTIM_PERIOD; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_DTIMPRD, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); - -#ifdef WICED_DISABLE_SSID_BROADCAST - /* Make the AP "hidden" */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_CLOSEDNET ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = (uint32_t) 1; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_AP_INTERFACE ), &wwd_wifi_sleep_flag ); -#endif - -#ifdef WICED_WIFI_ISOLATE_AP_CLIENTS - result = wwd_wifi_enable_ap_isolate( WWD_AP_INTERFACE, WICED_TRUE ); - wiced_assert("start_ap: Failed to disable intra BSS routing\r\n", result == WWD_SUCCESS ); -#endif /* WICED_WIFI_ISOLATE_AP_CLIENTS */ - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_ap_init( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ) -{ - wwd_result_t result; - - /* Keep WLAN awake while setting up softAP */ - WWD_WLAN_KEEP_AWAKE( ); - - result = internal_ap_init( ssid, auth_type, security_key, key_length, channel ); - - WWD_WLAN_LET_SLEEP( ); - - return result; -} - -wwd_result_t wwd_wifi_ap_up( void ) -{ - wiced_buffer_t buffer; - uint32_t* data; - - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( data, &wwd_wifi_sleep_flag ); - data[0] = (uint32_t) CHIP_AP_INTERFACE; - data[1] = (uint32_t) BSS_UP; - CHECK_RETURN_WITH_SEMAPHORE( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ), &wwd_wifi_sleep_flag ); - - /* Wait until AP is brought up */ - CHECK_RETURN_WITH_SEMAPHORE( host_rtos_get_semaphore( &wwd_wifi_sleep_flag, (uint32_t) 10000, WICED_FALSE ), &wwd_wifi_sleep_flag ); - - wwd_wifi_ap_is_up = WICED_TRUE; - return WWD_SUCCESS; -} - -/** Starts an infrastructure WiFi network - * @param ssid : A null terminated string containing the SSID name of the network to join - * @param auth_type : Authentication type: - * - WICED_SECURITY_OPEN - Open Security - * - WICED_SECURITY_WPA_TKIP_PSK - WPA Security - * - WICED_SECURITY_WPA2_AES_PSK - WPA2 Security using AES cipher - * - WICED_SECURITY_WPA2_MIXED_PSK - WPA2 Security using AES and/or TKIP ciphers - * - WEP security is currently unimplemented due to lack of security - * @param security_key : A byte array containing the cleartext security key for the network - * @param key_length : The length of the security_key in bytes. - * @param channel : 802.11 Channel number - * - * @return WWD_SUCCESS : if successfully creates an AP - * Error code : if an error occurred - */ -wwd_result_t wwd_wifi_start_ap( wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, uint8_t channel ) -{ - CHECK_RETURN( wwd_wifi_ap_init( ssid, auth_type, security_key, key_length, channel ) ); - - CHECK_RETURN( wwd_wifi_ap_up() ); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_stop_ap( void ) -{ - uint32_t* data; - wiced_buffer_t buffer; - wiced_buffer_t response; - wwd_result_t result; - wwd_result_t result2; - - /* Query bss state (does it exist? if so is it UP?) */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) CHIP_AP_INTERFACE; - result = wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_STA_INTERFACE ); - - if ( result == WWD_WLAN_NOTFOUND ) - { - /* AP interface does not exist - i.e. it is down */ - wwd_wifi_ap_is_up = WICED_FALSE; - return WWD_SUCCESS; - } - - CHECK_RETURN( result ); - - data = (uint32_t*) host_buffer_get_current_piece_data_pointer( response ); - if ( data[0] != (uint32_t) BSS_UP ) - { - /* AP interface indicates it is not up - i.e. it is down */ - host_buffer_release( response, WWD_NETWORK_RX ); - wwd_wifi_ap_is_up = WICED_FALSE; - return WWD_SUCCESS; - } - - host_buffer_release( response, WWD_NETWORK_RX ); - - /* set BSS down */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, IOVAR_STR_BSS ); - CHECK_IOCTL_BUFFER( data ); - data[0] = (uint32_t) CHIP_AP_INTERFACE; - data[1] = (uint32_t) BSS_DOWN; - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_AP_INTERFACE ) ); - - /* Wait until AP is brought down */ - result = host_rtos_get_semaphore( &wwd_wifi_sleep_flag, (uint32_t) 10000, WICED_FALSE ); - result2 = host_rtos_deinit_semaphore( &wwd_wifi_sleep_flag ); - if ( result != WWD_SUCCESS ) - { - return result; - } - if ( result2 != WWD_SUCCESS ) - { - return result2; - } - - CHECK_RETURN( wwd_management_set_event_handler( apsta_events, NULL, NULL, WWD_AP_INTERFACE ) ); - - wwd_wifi_ap_is_up = WICED_FALSE; - return WWD_SUCCESS; - -} - -/** Sets the chip specific AMPDU parameters for AP and STA - * For SDK 3.0, and beyond, each chip will need it's own function for setting AMPDU parameters. - */ -wwd_result_t wwd_wifi_set_ampdu_parameters( void ) -{ -#ifdef AMPDU_CUSTOM_RX_FACTOR - return wwd_wifi_set_ampdu_parameters_common( WWD_STA_INTERFACE, AMPDU_STA_DEFAULT_BA_WSIZE, AMPDU_MPDU_AUTO, AMPDU_CUSTOM_RX_FACTOR ); -#else - return wwd_wifi_set_ampdu_parameters_common( WWD_STA_INTERFACE, AMPDU_STA_DEFAULT_BA_WSIZE, AMPDU_MPDU_AUTO, AMPDU_RX_FACTOR_INVALID ); -#endif /* AMPDU_CUSTOM_RX_FACTOR */ -} - -/** Sets the chip specific AMPDU parameters for AP and STA - * For SDK 3.0, and beyond, each chip will need it's own function for setting AMPDU parameters. - */ - -wwd_result_t wwd_wifi_set_block_ack_window_size( wwd_interface_t interface ) -{ - return wwd_wifi_set_block_ack_window_size_common( interface, AMPDU_AP_DEFAULT_BA_WSIZE, AMPDU_STA_DEFAULT_BA_WSIZE ); -} diff --git a/components/WWD/WWD/internal/chips/4390x/wwd_chip_specific_functions.c b/components/WWD/WWD/internal/chips/4390x/wwd_chip_specific_functions.c deleted file mode 100644 index b14152cbc741755b5d53c677800f97ac5756d279..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/chips/4390x/wwd_chip_specific_functions.c +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * - */ - -#include -#include - -#include "wwd_wifi.h" -#include "wwd_debug.h" -#include "wwd_constants.h" -#include "internal/wwd_bcmendian.h" -#include "internal/bus_protocols/wwd_bus_protocol_interface.h" - -#include "platform_map.h" -#include "platform_mcu_peripheral.h" -#include "wiced_deep_sleep.h" -#include "internal/wwd_internal.h" - -/****************************************************** - * Macros - ******************************************************/ - -/****************************************************** - * Constants - ******************************************************/ - -#define WLAN_SHARED_ADDR (PLATFORM_ATCM_RAM_BASE(0) + PLATFORM_WLAN_RAM_SIZE - 4) - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - -/****************************************************** - * Variables Definitions - ******************************************************/ - -/****************************************************** - * Function Definitions - ******************************************************/ - -wwd_result_t wwd_wifi_read_wlan_log( char* buffer, uint32_t buffer_size ) -{ - wwd_result_t result; - - PLATFORM_WLAN_POWERSAVE_RES_UP(); - - result = wwd_wifi_read_wlan_log_unsafe( WLAN_SHARED_ADDR, buffer, buffer_size ); - - PLATFORM_WLAN_POWERSAVE_RES_DOWN( NULL, WICED_FALSE ); - - return result; -} - -wwd_result_t wwd_wifi_set_custom_country_code( const wiced_country_info_t* country_code ) -{ - UNUSED_PARAMETER(country_code); - return WWD_UNSUPPORTED; -} diff --git a/components/WWD/WWD/internal/wwd_ap.h b/components/WWD/WWD/internal/wwd_ap.h deleted file mode 100644 index 845c462724de8ad226c0033c293877ca8bcc9d27..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/wwd_ap.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Provides prototypes / declarations for chip-specific APSTA functionality - */ - -#ifndef INCLUDED_WWD_AP_H_ -#define INCLUDED_WWD_AP_H_ - -#include -#include "wwd_constants.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern wiced_bool_t wiced_wifi_ap_is_up; - -#ifdef __cplusplus -} /*extern "C" */ -#endif - -#endif /* ifndef INCLUDED_WWD_AP_H_ */ diff --git a/components/WWD/WWD/internal/wwd_ap_common.c b/components/WWD/WWD/internal/wwd_ap_common.c deleted file mode 100644 index ef30d68d9221adb057a2dbe282e12bfe8b491eb4..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/wwd_ap_common.c +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Provides generic APSTA functionality that chip specific files use - */ -#include -//#include "wwd_rtos.h" -#include "wwd_events.h" -#include "wwd_assert.h" -#include "wwd_management.h" -#include "wwd_wifi.h" -#include "network/wwd_buffer_interface.h" -//#include "internal/wwd_sdpcm.h" -#include "wwd_internal.h" -#include "wwd_ap.h" -#include "platform_toolchain.h" -#include "wwd_ap_common.h" -//extern wiced_bool_t wwd_wifi_ap_is_up; - - -wwd_result_t wwd_wifi_set_block_ack_window_size_common( wwd_interface_t interface, uint16_t ap_win_size, uint16_t sta_win_size ) -{ - wwd_result_t retval; - uint16_t block_ack_window_size = ap_win_size; - - /* If the AP interface is already up then don't change the Block Ack window size */ - if ( wwd_wifi_is_ready_to_transceive( WWD_AP_INTERFACE ) == WWD_SUCCESS ) - { - return WWD_SUCCESS; - } - - if ( interface == WWD_STA_INTERFACE ) - { - block_ack_window_size = sta_win_size; - } - - retval = wwd_wifi_set_iovar_value( IOVAR_STR_AMPDU_BA_WINDOW_SIZE, ( uint32_t ) block_ack_window_size, WWD_STA_INTERFACE ); - - wiced_assert("set_block_ack_window_size: Failed to set block ack window size\r\n", retval == WWD_SUCCESS ); - - return retval; -} - -wwd_result_t wwd_wifi_set_ampdu_parameters_common( wwd_interface_t interface, uint8_t ba_window_size, int8_t ampdu_mpdu, uint8_t rx_factor ) -{ - CHECK_RETURN( wwd_wifi_set_iovar_value( IOVAR_STR_AMPDU_BA_WINDOW_SIZE, ba_window_size, interface ) ); - - /* Set number of MPDUs available for AMPDU */ - CHECK_RETURN( wwd_wifi_set_iovar_value( IOVAR_STR_AMPDU_MPDU, ( uint32_t ) ampdu_mpdu, interface ) ); - - if ( rx_factor != AMPDU_RX_FACTOR_INVALID ) - { - CHECK_RETURN( wwd_wifi_set_iovar_value( IOVAR_STR_AMPDU_RX_FACTOR, rx_factor, interface ) ); - } - return WWD_SUCCESS; -} diff --git a/components/WWD/WWD/internal/wwd_ap_common.h b/components/WWD/WWD/internal/wwd_ap_common.h deleted file mode 100644 index 3bb71b3fbc3582a5646bdf67c8b0e2b810b9ce4e..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/wwd_ap_common.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Provides prototypes / declarations for common APSTA functionality - */ -#ifndef _WWD_INTERNAL_AP_COMMON_H_ -#define _WWD_INTERNAL_AP_COMMON_H_ -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * Macros - ******************************************************/ -#define AMPDU_RX_FACTOR_8K 0 /* max receive AMPDU length is 8kb */ -#define AMPDU_RX_FACTOR_16K 1 /* max receive AMPDU length is 16kb */ -#define AMPDU_RX_FACTOR_32K 2 /* max receive AMPDU length is 32kb */ -#define AMPDU_RX_FACTOR_64K 3 /* max receive AMPDU length is 64kb */ -#define AMPDU_RX_FACTOR_INVALID 0xff /* invalid rx factor; ignore */ -#define AMPDU_MPDU_AUTO (-1) /* Auto number of mpdu in ampdu */ - -#define htod32(i) ((uint32_t)(i)) -#define htod16(i) ((uint16_t)(i)) -#define dtoh32(i) ((uint32_t)(i)) -#define dtoh16(i) ((uint16_t)(i)) -#define CHECK_IOCTL_BUFFER( buff ) if ( buff == NULL ) { wiced_assert("Buffer alloc failed\n", 0); return WWD_BUFFER_ALLOC_FAIL; } -#define CHECK_IOCTL_BUFFER_WITH_SEMAPHORE( buff, sema ) if ( buff == NULL ) { wiced_assert("Buffer alloc failed\n", 0 == 1 ); (void) host_rtos_deinit_semaphore( sema ); return WWD_BUFFER_ALLOC_FAIL; } -#define CHECK_RETURN( expr ) { wwd_result_t check_res = (expr); if ( check_res != WWD_SUCCESS ) { wiced_assert("Command failed\n", 0 == 1 ); return check_res; } } -#define CHECK_RETURN_WITH_SEMAPHORE( expr, sema ) { wwd_result_t check_res = (expr); if ( check_res != WWD_SUCCESS ) { wiced_assert("Command failed\n", 0 == 1 ); (void) host_rtos_deinit_semaphore( sema ); return check_res; } } - -/****************************************************** - * Function prototypes - ******************************************************/ -extern wwd_result_t wwd_wifi_set_block_ack_window_size_common( wwd_interface_t interface, uint16_t ap_win_size, uint16_t sta_win_size ); -extern wwd_result_t wwd_wifi_set_ampdu_parameters_common( wwd_interface_t interface, uint8_t ba_window_size, int8_t ampdu_mpdu, uint8_t rx_factor ); - -#ifdef __cplusplus -} /*extern "C" */ -#endif - -#endif /* ifndef _WWD_INTERNAL_AP_COMMON_H_ */ diff --git a/components/WWD/WWD/internal/wwd_bcmendian.h b/components/WWD/WWD/internal/wwd_bcmendian.h deleted file mode 100644 index 51d8b89b9a0de20e0641f80516bec1924aaccc96..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/wwd_bcmendian.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -/* - * Byte order utilities - * - * This file by default provides proper behavior on little-endian architectures. - * On big-endian architectures, IL_BIGENDIAN should be defined. - */ - -#ifndef INCLUDED_WWD_BCMENDIAN_H -#define INCLUDED_WWD_BCMENDIAN_H - -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* Reverse the bytes in a 16-bit value */ -#define BCMSWAP16(val) \ - ((uint16_t)((((uint16_t)(val) & (uint16_t)0x00ffU) << 8) | \ - (((uint16_t)(val) & (uint16_t)0xff00U) >> 8))) - -/* Reverse the bytes in a 32-bit value */ -#define BCMSWAP32(val) \ - ((uint32_t)((((uint32_t)(val) & (uint32_t)0x000000ffU) << 24) | \ - (((uint32_t)(val) & (uint32_t)0x0000ff00U) << 8) | \ - (((uint32_t)(val) & (uint32_t)0x00ff0000U) >> 8) | \ - (((uint32_t)(val) & (uint32_t)0xff000000U) >> 24))) - -/* Reverse the two 16-bit halves of a 32-bit value */ -#define BCMSWAP32BY16(val) \ - ((uint32_t)((((uint32_t)(val) & (uint32_t)0x0000ffffU) << 16) | \ - (((uint32_t)(val) & (uint32_t)0xffff0000U) >> 16))) - -extern uint16_t bcmswap16 ( uint16_t val ); -extern uint32_t bcmswap32 ( uint32_t val ); -extern uint32_t bcmswap32by16 ( uint32_t val ); -extern void bcmswap16_buf ( uint16_t* buf, uint32_t len ); -extern void htol16_ua_store( uint16_t val, uint8_t* bytes ); -extern void htol32_ua_store( uint32_t val, uint8_t* bytes ); -extern void hton16_ua_store( uint16_t val, uint8_t* bytes ); -extern void hton32_ua_store( uint32_t val, uint8_t* bytes ); -extern uint16_t ltoh16_ua ( const void* bytes ); -extern uint32_t ltoh32_ua ( const void* bytes ); -extern uint16_t ntoh16_ua ( const void* bytes ); -extern uint32_t ntoh32_ua ( const void* bytes ); - -#ifndef hton16 -#ifndef IL_BIGENDIAN -#define HTON16(i) BCMSWAP16(i) -#define HTON32(i) BCMSWAP32(i) -#define NTOH16(i) BCMSWAP16(i) -#define NTOH32(i) BCMSWAP32(i) -#define hton16(i) bcmswap16(i) -#define hton32(i) bcmswap32(i) -#define ntoh16(i) bcmswap16(i) -#define ntoh32(i) bcmswap32(i) -#define HTOL16(i) (i) -#define HTOL32(i) (i) -#define ltoh16(i) (i) -#define ltoh32(i) (i) -#define htol16(i) (i) -#define htol32(i) (i) -#else -#define HTON16(i) (i) -#define HTON32(i) (i) -#define hton16(i) (i) -#define hton32(i) (i) -#define ntoh16(i) (i) -#define ntoh32(i) (i) -#define HTOL16(i) BCMSWAP16(i) -#define HTOL32(i) BCMSWAP32(i) -#define ltoh16(i) bcmswap16(i) -#define ltoh32(i) bcmswap32(i) -#define htol16(i) bcmswap16(i) -#define htol32(i) bcmswap32(i) -#endif /* IL_BIGENDIAN */ -#endif /* hton16 */ - -#ifndef IL_BIGENDIAN -#define ltoh16_buf(buf, i) -#define htol16_buf(buf, i) -#else -#define ltoh16_buf(buf, i) bcmswap16_buf((uint16_t*)buf, i) -#define htol16_buf(buf, i) bcmswap16_buf((uint16_t*)buf, i) -#endif /* IL_BIGENDIAN */ - - -#define _LTOH16_UA(cp) ((cp)[0] | ((cp)[1] << 8)) -#define _LTOH32_UA(cp) ((cp)[0] | ((cp)[1] << 8) | ((cp)[2] << 16) | ((cp)[3] << 24)) -#define _NTOH16_UA(cp) (((cp)[0] << 8) | (cp)[1]) -#define _NTOH32_UA(cp) (((cp)[0] << 24) | ((cp)[1] << 16) | ((cp)[2] << 8) | (cp)[3]) - -#define ltoh_ua(ptr) \ - (sizeof(*(ptr)) == sizeof(uint8_t) ? *(const uint8_t*)ptr : \ - sizeof(*(ptr)) == sizeof(uint16_t) ? _LTOH16_UA((const uint8_t*)ptr) : \ - sizeof(*(ptr)) == sizeof(uint32_t) ? _LTOH32_UA((const uint8_t*)ptr) : \ - 0xfeedf00d) - -#define ntoh_ua(ptr) \ - (sizeof(*(ptr)) == sizeof(uint8_t) ? *(const uint8_t*)ptr : \ - sizeof(*(ptr)) == sizeof(uint16_t) ? _NTOH16_UA((const uint8_t*)ptr) : \ - sizeof(*(ptr)) == sizeof(uint32_t) ? _NTOH32_UA((const uint8_t*)ptr) : \ - 0xfeedf00d) - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* INCLUDED_WWD_BCMENDIAN_H */ diff --git a/components/WWD/WWD/internal/wwd_eapol.c b/components/WWD/WWD/internal/wwd_eapol.c deleted file mode 100644 index d0a167f47a551a8c8e96ac6718c6c7be154c52a2..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/wwd_eapol.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * - */ - -#include "network/wwd_buffer_interface.h" -#include "wwd_network_constants.h" -#include "wwd_eapol.h" -#include - -/****************************************************** - * Macros - ******************************************************/ - -/****************************************************** - * Constants - ******************************************************/ - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - -/****************************************************** - * Variables Definitions - ******************************************************/ - -eapol_packet_handler_t wwd_eapol_packet_handler = NULL; - -/****************************************************** - * Function Definitions - ******************************************************/ - -void wwd_eapol_receive_eapol_packet( /*@only@*/ wiced_buffer_t buffer, wwd_interface_t interface ) -{ - if ( buffer != NULL ) - { - if ( wwd_eapol_packet_handler != NULL ) - { - wwd_eapol_packet_handler( buffer, interface ); - } - else - { - host_buffer_release( buffer, WWD_NETWORK_RX ); - } - } -} - -uint8_t* wwd_eapol_get_eapol_data( wwd_eapol_packet_t packet ) -{ - return host_buffer_get_current_piece_data_pointer( packet ); -} - -uint16_t wwd_get_eapol_packet_size( wwd_eapol_packet_t packet ) -{ - return host_buffer_get_current_piece_size( packet ); -} - -wwd_result_t wwd_eapol_register_receive_handler( eapol_packet_handler_t eapol_packet_handler ) -{ - if ( wwd_eapol_packet_handler == NULL ) - { - wwd_eapol_packet_handler = eapol_packet_handler; - return WWD_SUCCESS; - } - return WWD_HANDLER_ALREADY_REGISTERED; -} - -void wwd_eapol_unregister_receive_handler( void ) -{ - wwd_eapol_packet_handler = NULL; -} diff --git a/components/WWD/WWD/internal/wwd_internal.c b/components/WWD/WWD/internal/wwd_internal.c deleted file mode 100644 index b13f485b4d8cbb9680603d2a4b66f93fb82ac1b3..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/wwd_internal.c +++ /dev/null @@ -1,533 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -#include -#include -#include "wwd_management.h" -#include "wwd_rtos_interface.h" -#include "wwd_internal.h" -#include "bus_protocols/wwd_bus_protocol_interface.h" -#include "wwd_sdpcm.h" -#include "chip_constants.h" -#include "wwd_bcmendian.h" -#include "wwd_debug.h" -//#include "wiced_deep_sleep.h" -#include "network/wwd_buffer_interface.h" -#include "network/wwd_network_constants.h" -//#include "bcmutils.h" - -/* Offset of member MEMBER in a struct of type TYPE. */ -#define offsetof(TYPE, MEMBER) ((uint)(unsigned int)&((TYPE *)0)->MEMBER) - -/****************************************************** - * Constants - ******************************************************/ - -#define AI_IOCTRL_OFFSET (0x408) -#define SICF_CPUHALT (0x0020) -#define SICF_FGC (0x0002) -#define SICF_CLOCK_EN (0x0001) -#define AI_RESETCTRL_OFFSET (0x800) -#define AIRC_RESET (1) -#define WRAPPER_REGISTER_OFFSET (0x100000) - -#define WLAN_SHARED_VERSION_MASK 0x00ff -#define WLAN_SHARED_VERSION 0x0001 - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Variables - ******************************************************/ - -static const uint32_t core_base_address[] = -{ -#ifdef WLAN_ARMCM3_BASE_ADDRESS - (uint32_t) ( WLAN_ARMCM3_BASE_ADDRESS + WRAPPER_REGISTER_OFFSET ), -#endif /* ifdef WLAN_ARMCM3_BASE_ADDRESS */ -#ifdef WLAN_ARMCR4_BASE_ADDRESS - (uint32_t) ( WLAN_ARMCR4_BASE_ADDRESS + WRAPPER_REGISTER_OFFSET ), -#endif /* ifdef WLAN_ARMCR4_BASE_ADDRESS */ - (uint32_t) ( SOCSRAM_BASE_ADDRESS + WRAPPER_REGISTER_OFFSET ), - (uint32_t) ( SDIO_BASE_ADDRESS ) -}; - -wwd_wlan_status_t wwd_wlan_status = -{ - .state = WLAN_OFF, - .country_code = WICED_COUNTRY_AUSTRALIA, - .keep_wlan_awake = 0, -}; - -static wifi_console_t *c; -wifi_console_t console; -static wlan_shared_t sh; -static uint console_addr = 0; -static uint con_lastpos= 0; - -/****************************************************** - * Static Function Declarations - ******************************************************/ - -static uint32_t wwd_get_core_address( device_core_t core_id ); - -/****************************************************** - * Function definitions - ******************************************************/ - -/* - * Returns the base address of the core identified by the provided coreId - */ -uint32_t wwd_get_core_address( device_core_t core_id ) -{ - return core_base_address[(int) core_id]; -} - -/* - * Returns WWD_SUCCESS is the core identified by the provided coreId is up, otherwise WWD result code - */ -wwd_result_t wwd_device_core_is_up( device_core_t core_id ) -{ - uint8_t regdata; - uint32_t base; - wwd_result_t result; - - base = wwd_get_core_address( core_id ); - - /* Read the IO control register */ - result = wwd_bus_read_backplane_value( base + AI_IOCTRL_OFFSET, (uint8_t) 1, ®data ); - if ( result != WWD_SUCCESS ) - { - return result; - } - - /* Verify that the clock is enabled and something else is not on */ - if ( ( regdata & ( SICF_FGC | SICF_CLOCK_EN ) ) != (uint8_t) SICF_CLOCK_EN ) - { - return WWD_CORE_CLOCK_NOT_ENABLED; - } - - /* Read the reset control and verify it is not in reset */ - result = wwd_bus_read_backplane_value( base + AI_RESETCTRL_OFFSET, (uint8_t) 1, ®data ); - if ( result != WWD_SUCCESS ) - { - return result; - } - if ( ( regdata & AIRC_RESET ) != 0 ) - { - return WWD_CORE_IN_RESET; - } - - return WWD_SUCCESS; -} - -/* - * Disables the core identified by the provided coreId - */ -wwd_result_t wwd_disable_device_core( device_core_t core_id, wlan_core_flag_t core_flag ) -{ - uint32_t base = wwd_get_core_address( core_id ); - wwd_result_t result; - uint8_t junk; - uint8_t regdata; - - /* Read the reset control */ - result = wwd_bus_read_backplane_value( base + AI_RESETCTRL_OFFSET, (uint8_t) 1, &junk ); - if ( result != WWD_SUCCESS ) - { - return result; - } - - /* Read the reset control and check if it is already in reset */ - result = wwd_bus_read_backplane_value( base + AI_RESETCTRL_OFFSET, (uint8_t) 1, ®data ); - if ( result != WWD_SUCCESS ) - { - return result; - } - if ( ( regdata & AIRC_RESET ) != 0 ) - { - /* Core already in reset */ - return WWD_SUCCESS; - } - - /* Write 0 to the IO control and read it back */ - result = wwd_bus_write_backplane_value( base + AI_IOCTRL_OFFSET, (uint8_t) 1, ( core_flag == WLAN_CORE_FLAG_CPU_HALT )? SICF_CPUHALT : 0 ); - if ( result != WWD_SUCCESS ) - { - return result; - } - - result = wwd_bus_read_backplane_value( base + AI_IOCTRL_OFFSET, (uint8_t) 1, &junk ); - if ( result != WWD_SUCCESS ) - { - return result; - } - -// (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); - - result = wwd_bus_write_backplane_value( base + AI_RESETCTRL_OFFSET, (uint8_t) 1, (uint32_t) AIRC_RESET ); - if ( result != WWD_SUCCESS ) - { - return result; - } - -// (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); - - return result; -} - -/* - * Resets the core identified by the provided coreId - */ -wwd_result_t wwd_reset_device_core( device_core_t core_id, wlan_core_flag_t core_flag ) -{ - uint32_t base = wwd_get_core_address( core_id ); - wwd_result_t result; - uint8_t junk; - - result = wwd_disable_device_core( core_id, core_flag ); - if ( result != WWD_SUCCESS ) - { - return result; - } - - result = wwd_bus_write_backplane_value( base + AI_IOCTRL_OFFSET, (uint8_t) 1, (uint32_t) ( SICF_FGC | SICF_CLOCK_EN | (( core_flag == WLAN_CORE_FLAG_CPU_HALT )? SICF_CPUHALT : 0 ) ) ); - if ( result != WWD_SUCCESS ) - { - return result; - } - - result = wwd_bus_read_backplane_value( base + AI_IOCTRL_OFFSET, (uint8_t) 1, &junk ); - if ( result != WWD_SUCCESS ) - { - return result; - } - - result = wwd_bus_write_backplane_value( base + AI_RESETCTRL_OFFSET, (uint8_t) 1, 0 ); - if ( result != WWD_SUCCESS ) - { - return result; - } - -// (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); - - result = wwd_bus_write_backplane_value( base + AI_IOCTRL_OFFSET, (uint8_t) 1, (uint32_t) ( SICF_CLOCK_EN | ( ( core_flag == WLAN_CORE_FLAG_CPU_HALT )? SICF_CPUHALT : 0 ) ) ); - if ( result != WWD_SUCCESS ) - { - return result; - } - - result = wwd_bus_read_backplane_value( base + AI_IOCTRL_OFFSET, (uint8_t) 1, &junk ); - if ( result != WWD_SUCCESS ) - { - return result; - } - -// (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); - - return result; -} - -/* - * Release ARM core to run instructions - */ -wwd_result_t wwd_wlan_armcore_run( device_core_t core_id, wlan_core_flag_t core_flag ) -{ - uint32_t base = wwd_get_core_address( core_id ); - wwd_result_t result; - uint8_t junk; - - /* Only work for WLAN arm core! */ - if (WLAN_ARM_CORE != core_id) - { - return WWD_UNSUPPORTED; - } - - result = wwd_bus_write_backplane_value( base + AI_IOCTRL_OFFSET, (uint8_t) 1, (uint32_t) ( SICF_FGC | SICF_CLOCK_EN | (( core_flag == WLAN_CORE_FLAG_CPU_HALT )? SICF_CPUHALT : 0 ) ) ); - if ( result != WWD_SUCCESS ) - { - return result; - } - - result = wwd_bus_read_backplane_value( base + AI_IOCTRL_OFFSET, (uint8_t) 1, &junk ); - if ( result != WWD_SUCCESS ) - { - return result; - } - - result = wwd_bus_write_backplane_value( base + AI_RESETCTRL_OFFSET, (uint8_t) 1, 0 ); - if ( result != WWD_SUCCESS ) - { - return result; - } - -// (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); - - result = wwd_bus_write_backplane_value( base + AI_IOCTRL_OFFSET, (uint8_t) 1, (uint32_t) ( SICF_CLOCK_EN | ( ( core_flag == WLAN_CORE_FLAG_CPU_HALT )? SICF_CPUHALT : 0 ) ) ); - if ( result != WWD_SUCCESS ) - { - return result; - } - - result = wwd_bus_read_backplane_value( base + AI_IOCTRL_OFFSET, (uint8_t) 1, &junk ); - if ( result != WWD_SUCCESS ) - { - return result; - } - -// (void) host_rtos_delay_milliseconds( (uint32_t) 1 ); - - return result; -} - -wwd_result_t wwd_wifi_read_wlan_log_unsafe( uint32_t wlan_shared_address, char* buffer, uint32_t buffer_size ) -{ - char ch; - uint32_t n; - uint32_t index; - uint32_t address; - wwd_result_t result = WWD_WLAN_ERROR; - - c = &console; - - if ( console_addr == 0 ) - { - uint shared_addr; - - address = wlan_shared_address; - result = wwd_bus_read_backplane_value( address, 4, (uint8_t*) &shared_addr ); - if ( result != WWD_SUCCESS ) - { - goto done; - } - - result = wwd_bus_transfer_backplane_bytes( BUS_READ, shared_addr, sizeof(wlan_shared_t), (uint8_t *) &sh); - if ( result != WWD_SUCCESS ) - { - goto done; - } - - sh.flags = ltoh32( sh.flags ); - sh.trap_addr = ltoh32( sh.trap_addr ); - sh.assert_exp_addr = ltoh32( sh.assert_exp_addr ); - sh.assert_file_addr = ltoh32( sh.assert_file_addr ); - sh.assert_line = ltoh32( sh.assert_line ); - sh.console_addr = ltoh32( sh.console_addr ); - sh.msgtrace_addr = ltoh32( sh.msgtrace_addr ); - - if ( ( sh.flags & WLAN_SHARED_VERSION_MASK ) != WLAN_SHARED_VERSION ) - { - WPRINT_APP_INFO( ( "Readconsole: WLAN shared version is not valid\n\r") ); - result = WWD_WLAN_ERROR; - goto done; - } - console_addr = sh.console_addr; - } - - /* Read console log struct */ - address = console_addr + offsetof( hnd_cons_t, log ); - result = wwd_bus_transfer_backplane_bytes( BUS_READ, address, sizeof(c->log), (uint8_t*)&c->log ); - if ( result != WWD_SUCCESS ) - { - goto done; - } - - /* Allocate console buffer (one time only) */ - if ( c->buf == NULL ) - { - c->bufsize = ltoh32( c->log.buf_size ); - c->buf = malloc( c->bufsize ); - if ( c->buf == NULL ) - { - result = WWD_WLAN_ERROR; - goto done; - } - } - - /* Retrieve last read position */ - c->last = con_lastpos; - - index = ltoh32( c->log.idx ); - - /* Protect against corrupt value */ - if ( index > c->bufsize ) - { - result = WWD_WLAN_ERROR; - goto done; - } - - /* Skip reading the console buffer if the index pointer has not moved */ - if ( index == c->last ) - { - result = WWD_SUCCESS; - goto done; - } - - /* Read the console buffer */ - /* xxx this could optimize and read only the portion of the buffer needed, but - * it would also have to handle wrap-around. - */ - address = ltoh32( c->log.buf ); - result = wwd_bus_transfer_backplane_bytes( BUS_READ, address, c->bufsize, (uint8_t*) c->buf ); - if ( result != WWD_SUCCESS ) - { - goto done; - } - - while ( c->last != index ) - { - for ( n = 0; n < buffer_size - 2; n++ ) - { - if ( c->last == index ) - { - /* This would output a partial line. Instead, back up - * the buffer pointer and output this line next time around. - */ - if ( c->last >= n ) - { - c->last -= n; - } - else - { - c->last = c->bufsize - n; - } - /* Save last read position */ - con_lastpos = c->last; - - result = WWD_SUCCESS; - goto done; - } - ch = c->buf[ c->last ]; - c->last = ( c->last + 1 ) % c->bufsize; - if ( ch == '\n' ) - { - break; - } - buffer[ n ] = ch; - } - - if ( n > 0 ) - { - if ( buffer[ n - 1 ] == '\r' ) - n--; - buffer[ n ] = 0; - WPRINT_APP_INFO( ("CONSOLE: %s\n", buffer) ); - } - } - /* Save last read position */ - con_lastpos = c->last; - result = WWD_SUCCESS; - -done: - return result; -} - -inline uint16_t bcmswap16( uint16_t val ) -{ - return BCMSWAP16(val); -} - -inline uint32_t bcmswap32( uint32_t val ) -{ - return BCMSWAP32(val); -} - -inline uint32_t bcmswap32by16( uint32_t val ) -{ - return BCMSWAP32BY16(val); -} - -/* Reverse pairs of bytes in a buffer (not for high-performance use) */ -/* buf - start of buffer of shorts to swap */ -/* len - byte length of buffer */ -inline void bcmswap16_buf( uint16_t* buf, uint32_t len ) -{ - len = len / 2; - - while ( ( len-- ) != 0 ) - { - *buf = bcmswap16( *buf ); - buf++; - } -} - -/* - * Store 16-bit value to unaligned little-endian byte array. - */ -inline void htol16_ua_store( uint16_t val, uint8_t* bytes ) -{ - bytes[0] = (uint8_t) ( val & 0xff ); - bytes[1] = (uint8_t) ( val >> 8 ); -} - -/* - * Store 32-bit value to unaligned little-endian byte array. - */ -inline void htol32_ua_store( uint32_t val, uint8_t* bytes ) -{ - bytes[0] = (uint8_t) ( val & 0xff ); - bytes[1] = (uint8_t) ( ( val >> 8 ) & 0xff ); - bytes[2] = (uint8_t) ( ( val >> 16 ) & 0xff ); - bytes[3] = (uint8_t) ( val >> 24 ); -} - -/* - * Store 16-bit value to unaligned network-(big-)endian byte array. - */ -inline void hton16_ua_store( uint16_t val, uint8_t* bytes ) -{ - bytes[0] = (uint8_t) ( val >> 8 ); - bytes[1] = (uint8_t) ( val & 0xff ); -} - -/* - * Store 32-bit value to unaligned network-(big-)endian byte array. - */ -inline void hton32_ua_store( uint32_t val, uint8_t* bytes ) -{ - bytes[0] = (uint8_t) ( val >> 24 ); - bytes[1] = (uint8_t) ( ( val >> 16 ) & 0xff ); - bytes[2] = (uint8_t) ( ( val >> 8 ) & 0xff ); - bytes[3] = (uint8_t) ( val & 0xff ); -} - -/* - * Load 16-bit value from unaligned little-endian byte array. - */ -inline uint16_t ltoh16_ua( const void* bytes ) -{ - return (uint16_t) _LTOH16_UA((const uint8_t*)bytes); -} - -/* - * Load 32-bit value from unaligned little-endian byte array. - */ -inline uint32_t ltoh32_ua( const void* bytes ) -{ - return (uint32_t) _LTOH32_UA((const uint8_t*)bytes); -} - -/* - * Load 16-bit value from unaligned big-(network-)endian byte array. - */ -inline uint16_t ntoh16_ua( const void* bytes ) -{ - return (uint16_t) _NTOH16_UA((const uint8_t*)bytes); -} - -/* - * Load 32-bit value from unaligned big-(network-)endian byte array. - */ -inline uint32_t ntoh32_ua( const void* bytes ) -{ - return (uint32_t) _NTOH32_UA((const uint8_t*)bytes); -} diff --git a/components/WWD/WWD/internal/wwd_internal.h b/components/WWD/WWD/internal/wwd_internal.h deleted file mode 100644 index 127ad8035fb1f8f77547b60ea9b714e2f4c1a416..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/wwd_internal.h +++ /dev/null @@ -1,274 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -#ifndef INCLUDED_WWD_INTERNAL_H -#define INCLUDED_WWD_INTERNAL_H - -#include "tlv.h" -//#include "wwd_eapol.h" -//#include "wwd_thread.h" -#include "wwd_rtos.h" -#include "wwd_bus_protocol.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/****************************************************** - * Constants - ******************************************************/ - -typedef enum -{ - /* Note : If changing this, core_base_address must be changed also */ - WLAN_ARM_CORE = 0, - SOCRAM_CORE = 1, - SDIOD_CORE = 2 -} device_core_t; - -typedef enum -{ - WLAN_DOWN, - WLAN_UP, - WLAN_OFF -} wlan_state_t; - -typedef enum -{ - WLAN_CORE_FLAG_NONE, - WLAN_CORE_FLAG_CPU_HALT, -} wlan_core_flag_t; - -/** - * Enumeration of AKM (authentication and key management) suites. Table 8-140 802.11mc D3.0. - */ -typedef enum -{ - WICED_AKM_RESERVED = 0, - WICED_AKM_8021X = 1, /**< WPA2 enterprise */ - WICED_AKM_PSK = 2, /**< WPA2 PSK */ - WICED_AKM_FT_8021X = 3, /**< 802.11r Fast Roaming enterprise */ - WICED_AKM_FT_PSK = 4, /**< 802.11r Fast Roaming PSK */ - WICED_AKM_8021X_SHA256 = 5, - WICED_AKM_PSK_SHA256 = 6, - WICED_AKM_TDLS = 7, /**< Tunneled Direct Link Setup */ - WICED_AKM_SAE_SHA256 = 8, - WICED_AKM_FT_SAE_SHA256 = 9, - WICED_AKM_AP_PEER_KEY_SHA256 = 10, - WICED_AKM_SUITEB_8021X_HMAC_SHA256 = 11, - WICED_AKM_SUITEB_8021X_HMAC_SHA384 = 12, - WICED_AKM_SUITEB_FT_8021X_HMAC_SHA384 = 13, -} wiced_akm_suite_t; - -/** - * Enumeration of cipher suites. Table 8-138 802.11mc D3.0. - */ -typedef enum -{ - WICED_CIPHER_GROUP = 0, /**< Use group cipher suite */ - WICED_CIPHER_WEP_40 = 1, /**< WEP-40 */ - WICED_CIPHER_TKIP = 2, /**< TKIP */ - WICED_CIPHER_RESERVED = 3, /**< Reserved */ - WICED_CIPHER_CCMP_128 = 4, /**< CCMP-128 - default pairwise and group cipher suite in an RSNA */ - WICED_CIPHER_WEP_104 = 5, /**< WEP-104 - also known as WEP-128 */ - WICED_CIPHER_BIP_CMAC_128 = 6, /**< BIP-CMAC-128 - default management frame cipher suite */ - WICED_CIPHER_GROUP_DISALLOWED = 7, /**< Group address traffic not allowed */ - WICED_CIPHER_GCMP_128 = 8, /**< GCMP-128 - default for 60 GHz STAs */ - WICED_CIPHER_GCMP_256 = 9, /**< GCMP-256 - introduced for Suite B */ - WICED_CIPHER_CCMP_256 = 10, /**< CCMP-256 - introduced for suite B */ - WICED_CIPHER_BIP_GMAC_128 = 11, /**< BIP-GMAC-128 - introduced for suite B */ - WICED_CIPHER_BIP_GMAC_256 = 12, /**< BIP-GMAC-256 - introduced for suite B */ - WICED_CIPHER_BIP_CMAC_256 = 13, /**< BIP-CMAC-256 - introduced for suite B */ -} wiced_80211_cipher_t; - -/****************************************************** - * Structures - ******************************************************/ - -typedef struct -{ - wlan_state_t state; - wiced_country_code_t country_code; - uint32_t keep_wlan_awake; -} wwd_wlan_status_t; - -#pragma pack(1) - -/* 802.11 Information Element structures */ - -/* Robust Secure Network */ -typedef struct -{ - tlv8_header_t tlv_header; /* id, length */ - uint16_t version; - uint32_t group_key_suite; /* See wiced_80211_cipher_t for values */ - uint16_t pairwise_suite_count; - uint32_t pairwise_suite_list[1]; -} rsn_ie_fixed_portion_t; - -#define RSN_IE_MINIMUM_LENGTH (8) - -typedef struct -{ - tlv8_header_t tlv_header; /* id, length */ - uint8_t oui[4]; -} vendor_specific_ie_header_t; - -#define VENDOR_SPECIFIC_IE_MINIMUM_LENGTH (4) - -/* WPA IE */ -typedef struct -{ - vendor_specific_ie_header_t vendor_specific_header; - uint16_t version; - uint32_t multicast_suite; - uint16_t unicast_suite_count; - uint8_t unicast_suite_list[1][4]; -} wpa_ie_fixed_portion_t; - -#define WPA_IE_MINIMUM_LENGTH (12) - -typedef struct -{ - uint16_t akm_suite_count; - uint32_t akm_suite_list[1]; -} akm_suite_portion_t; - -typedef struct -{ - tlv8_header_t tlv_header; /* id, length */ - uint16_t ht_capabilities_info; - uint8_t ampdu_parameters; - uint8_t rx_mcs[10]; - uint16_t rxhighest_supported_data_rate; - uint8_t tx_supported_mcs_set; - uint8_t tx_mcs_info[3]; - uint16_t ht_extended_capabilities; - uint32_t transmit_beam_forming_capabilities; - uint8_t antenna_selection_capabilities; -} ht_capabilities_ie_t; - -#define HT_CAPABILITIES_INFO_LDPC_CODING_CAPABILITY ( 1 << 0 ) -#define HT_CAPABILITIES_INFO_SUPPORTED_CHANNEL_WIDTH_SET ( 1 << 1 ) -#define HT_CAPABILITIES_INFO_SM_POWER_SAVE_OFFSET ( 1 << 2 ) -#define HT_CAPABILITIES_INFO_SM_POWER_SAVE_MASK ( 3 << 2 ) -#define HT_CAPABILITIES_INFO_HT_GREENFIELD ( 1 << 4 ) -#define HT_CAPABILITIES_INFO_SHORT_GI_FOR_20MHZ ( 1 << 5 ) -#define HT_CAPABILITIES_INFO_SHORT_GI_FOR_40MHZ ( 1 << 6 ) -#define HT_CAPABILITIES_INFO_TX_STBC ( 1 << 7 ) -#define HT_CAPABILITIES_INFO_RX_STBC_OFFSET ( 1 << 8 ) -#define HT_CAPABILITIES_INFO_RX_STBC_MASK ( 3 << 8 ) -#define HT_CAPABILITIES_INFO_HT_DELAYED_BLOCK_ACK ( 1 << 10 ) -#define HT_CAPABILITIES_INFO_MAXIMUM_A_MSDU_LENGTH ( 1 << 11 ) -#define HT_CAPABILITIES_INFO_DSSS_CCK_MODE_IN_40MHZ ( 1 << 12 ) -/* bit 13 reserved */ -#define HT_CAPABILITIES_INFO_40MHZ_INTOLERANT ( 1 << 14 ) -#define HT_CAPABILITIES_INFO_L_SIG_TXOP_PROTECTION_SUPPORT ( 1 << 15 ) - -typedef unsigned int uint; -typedef struct -{ - uint buf; - uint buf_size; - uint idx; - uint out_idx; /* output index */ -} hnd_log_t; - -#define CBUF_LEN 128 - -typedef struct -{ - /* Virtual UART - * When there is no UART (e.g. Quickturn), the host should write a complete - * input line directly into cbuf and then write the length into vcons_in. - * This may also be used when there is a real UART (at risk of conflicting with - * the real UART). vcons_out is currently unused. - */ - volatile uint vcons_in; - volatile uint vcons_out; - - /* Output (logging) buffer - * Console output is written to a ring buffer log_buf at index log_idx. - * The host may read the output when it sees log_idx advance. - * Output will be lost if the output wraps around faster than the host polls. - */ - hnd_log_t log; - - /* Console input line buffer - * Characters are read one at a time into cbuf until is received, then - * the buffer is processed as a command line. Also used for virtual UART. - */ - uint cbuf_idx; - char cbuf[ CBUF_LEN ]; -} hnd_cons_t; - -typedef struct wifi_console -{ - uint count; /* Poll interval msec counter */ - uint log_addr; /* Log struct address (fixed) */ - hnd_log_t log; /* Log struct (host copy) */ - uint bufsize; /* Size of log buffer */ - char *buf; /* Log buffer (host copy) */ - uint last; /* Last buffer read index */ -} wifi_console_t; - -typedef struct -{ - uint flags; - uint trap_addr; - uint assert_exp_addr; - uint assert_file_addr; - uint assert_line; - uint console_addr; - uint msgtrace_addr; - uint fwid; -} wlan_shared_t; - -#pragma pack() - -/****************************************************** - * Function declarations - ******************************************************/ - -extern wiced_bool_t wwd_wifi_ap_is_up; -extern uint8_t wwd_tos_map[8]; -//extern eapol_packet_handler_t wwd_eapol_packet_handler; - -/* Device core control functions */ -extern wwd_result_t wwd_disable_device_core ( device_core_t core_id, wlan_core_flag_t core_flag ); -extern wwd_result_t wwd_reset_device_core ( device_core_t core_id, wlan_core_flag_t core_flag ); -extern wwd_result_t wwd_wlan_armcore_run ( device_core_t core_id, wlan_core_flag_t core_flag ); -extern wwd_result_t wwd_device_core_is_up ( device_core_t core_id ); -extern wwd_result_t wwd_wifi_set_down ( void ); -extern wwd_result_t wwd_wifi_set_up ( void ); -extern void wwd_set_country ( wiced_country_code_t code ); - -extern void wwd_wait_for_wlan_event ( host_semaphore_type_t* transceive_semaphore ); - -/* Chip specific functions */ -extern wwd_result_t wwd_allow_wlan_bus_to_sleep ( void ); -extern wwd_result_t wwd_ensure_wlan_bus_is_up ( void ); - -extern wwd_result_t wwd_chip_specific_init ( void ); -extern wwd_result_t wwd_chip_specific_socsram_init ( void ); -extern wwd_result_t wwd_wifi_read_wlan_log_unsafe( uint32_t wlan_shared_address, char* buffer, uint32_t buffer_size ); - -/****************************************************** - * Global variables - ******************************************************/ - -extern wwd_wlan_status_t wwd_wlan_status; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ifndef INCLUDED_WWD_INTERNAL_H */ diff --git a/components/WWD/WWD/internal/wwd_logging.c b/components/WWD/WWD/internal/wwd_logging.c deleted file mode 100644 index 7e8c2dedb77641401d55020922cd6b607fa65c04..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/wwd_logging.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#include -#include -#include -#include "wwd_logging.h" - -#ifdef WWD_LOGGING_STDOUT_ENABLE -int wwd_logging_enabled = 0; - -#elif defined WWD_LOGGING_BUFFER_ENABLE - -#ifndef LOGGING_BUFFER_SIZE -#error LOGGING_BUFFER_SIZE is not defined -#endif /* LOGGING_BUFFER_SIZE */ - -static unsigned long logging_buffer_position = 0; -static char logging_buffer[LOGGING_BUFFER_SIZE]; -int wwd_logging_enabled = 0; - -int wwd_logging_printf(const char *format, ...) -{ - int potential_num_written = 0; - va_list args; - va_start (args, format); - potential_num_written = vsnprintf (&logging_buffer[logging_buffer_position], (size_t)(LOGGING_BUFFER_SIZE - logging_buffer_position), format, args); - if ( potential_num_written > (int)(LOGGING_BUFFER_SIZE - logging_buffer_position) ) - { - /* full print did not fit in buffer - wipe what was just written and reprint at start of buffer */ - memset( &logging_buffer[logging_buffer_position], (int)'\n', (size_t)(LOGGING_BUFFER_SIZE - logging_buffer_position ) ); - logging_buffer_position = 0; - potential_num_written = vsnprintf (&logging_buffer[logging_buffer_position], (size_t)(LOGGING_BUFFER_SIZE - logging_buffer_position), format, args); - } - logging_buffer_position += (unsigned)potential_num_written; - if ( logging_buffer_position >= LOGGING_BUFFER_SIZE ) - { - logging_buffer_position = 0; - } - - va_end (args); - return potential_num_written; -} - -#endif /* ifdef WWD_LOGGING_BUFFER_ENABLE */ - diff --git a/components/WWD/WWD/internal/wwd_logging.h b/components/WWD/WWD/internal/wwd_logging.h deleted file mode 100644 index 333a568842cfb3a5940e17e6177fd1fc0ec74c73..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/wwd_logging.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#ifndef INCLUDED_WWD_LOGGING_H_ -#define INCLUDED_WWD_LOGGING_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* -#define WWD_LOGGING_STDOUT_ENABLE -*/ -/* -#define WWD_LOGGING_BUFFER_ENABLE -*/ - -#if defined( WWD_LOGGING_STDOUT_ENABLE ) - -#include -extern int wwd_logging_enabled; -#define WWD_LOG( x ) if (wwd_logging_enabled) {printf x; } - -#elif defined( WWD_LOGGING_BUFFER_ENABLE ) -extern int wwd_logging_enabled; - -extern int wwd_logging_printf(const char *format, ...); - -#define WWD_LOG( x ) if (wwd_logging_enabled) {wwd_logging_printf x; } - - -#else /* if defined( WWD_LOGGING_BUFFER_ENABLE ) */ - -#define WWD_LOG(x) - -#endif /* if defined( WWD_LOGGING_BUFFER_ENABLE ) */ - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ifndef INCLUDED_WWD_LOGGING_H_ */ diff --git a/components/WWD/WWD/internal/wwd_management.c b/components/WWD/WWD/internal/wwd_management.c deleted file mode 100644 index 4cd850fb6edee3c832eb4cd9f66f089092f4bd94..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/wwd_management.c +++ /dev/null @@ -1,371 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Implements initialisation and other management functions for WWD system - * - */ - -#include -#include "wwd_management.h" -#include "wwd_events.h" -#include "wwd_wlioctl.h" -#include "wwd_assert.h" -#include "wwd_wifi.h" -#include "platform/wwd_bus_interface.h" -#include "platform/wwd_platform_interface.h" -#include "network/wwd_network_interface.h" -#include "network/wwd_buffer_interface.h" -#include "wwd_rtos_interface.h" -#include "wwd_sdpcm.h" -#include "wwd_internal.h" -#include "wwd_thread.h" -#include "bus_protocols/wwd_bus_protocol_interface.h" - - -/****************************************************** - * Constants - ******************************************************/ - -#define MAX_POST_SET_COUNTRY_RETRY 3 - -/****************************************************** - * Static Variables - ******************************************************/ - -/****************************************************** - * Function definitions - ******************************************************/ - -/** - * Initialise Wi-Fi platform - * - * - Initialises the required parts of the hardware platform - * i.e. pins for SDIO/SPI, interrupt, reset, power etc. - * - * - Initialises the WWD thread which arbitrates access - * to the SDIO/SPI bus - * - * @return WWD_SUCCESS if initialization is successful, error code otherwise - */ -wwd_result_t wwd_management_wifi_platform_init( wiced_country_code_t country, wiced_bool_t resume_after_deep_sleep) -{ - wwd_result_t retval; - - wwd_wlan_status.country_code = country; - -// retval = (wwd_result_t)host_platform_init( ); -// if ( retval != WWD_SUCCESS ) -// { -// WPRINT_WWD_ERROR(("Could not initialize platform interface\n")); -// return retval; -// } - /*³õʼ»¯SDIOÓ²¼þ£¬Ê¹ÄÜSDIO*/ - retval = (wwd_result_t)host_platform_bus_init( ); - if ( retval != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR(("Could not initialize platform bus interface\n")); - return retval; - } - -// /* Enable 32K WLAN sleep clock */ -// host_platform_init_wlan_powersave_clock(); -// if ( resume_after_deep_sleep == WICED_TRUE ) -// { -// retval = ( wwd_result_t ) wwd_bus_resume_after_deep_sleep( ); -// } -// else - { - /*³õʼ»¯WIFI,ÏÂÔØ¹Ì¼þ£¬²¢È·±£WIFIϵͳÒѾ­ÅÜÆðÀ´*/ - retval = ( wwd_result_t ) wwd_bus_init(); - } - - if ( retval != WWD_SUCCESS ) - { - printf("Could not initialize bus");//WPRINT_WWD_ERROR(("Could not initialize bus\n")); - return retval; - } - - /* WLAN device is now powered up. Change state from OFF to DOWN */ - wwd_wlan_status.state = WLAN_DOWN; - - retval = wwd_thread_init( ); - if ( retval != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR(("Could not initialize WWD thread\n")); - return retval; - } - -// host_platform_bus_enable_interrupt( ); - - return WWD_SUCCESS; -} - -/* -* Halt resource download and abort init -*/ -wwd_result_t wwd_management_wifi_platform_init_halt( wiced_bool_t halt ) -{ - wwd_bus_set_resource_download_halt( halt ); - return WWD_SUCCESS; -} - -/** - * Turn on the Wi-Fi device - * - * - Initialise Wi-Fi device - * - * - Program various WiFi parameters and modes - * - * @return WWD_SUCCESS if initialization is successful, error code otherwise - */ -wwd_result_t wwd_management_wifi_on( wiced_country_code_t country) -{ - wl_country_t* country_struct; - uint32_t* ptr; - wwd_result_t retval; - wiced_buffer_t buffer; - uint8_t* event_mask; - uint32_t* data; - uint32_t counter; -#ifdef WICED_DISABLE_AMPDU_TX - uint8_t i; -#endif -#ifdef MAC_ADDRESS_SET_BY_HOST - wiced_mac_t mac_address; -#endif - - if ( wwd_wlan_status.state == WLAN_UP ) - { - return WWD_SUCCESS; - } - - retval = wwd_management_wifi_platform_init( country, WICED_FALSE); - if ( retval != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR(("Could not initialize")); - return retval; - } - -#ifdef MAC_ADDRESS_SET_BY_HOST - /* See /generated_mac_address.txt for info about setting the MAC address */ - host_platform_get_mac_address(&mac_address); - wwd_wifi_set_mac_address(mac_address); -#endif - - /* Turn off SDPCM TX Glomming */ - /* Note: This is only required for later chips. - * The 4319 has glomming off by default however the 43362 has it on by default. - */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_TX_GLOM ); - if ( data == NULL ) - { - wiced_assert( "Could not get buffer for IOVAR", 0 != 0 ); - /*@-unreachable@*/ /* Lint: Reachable after hitting assert */ - return WWD_BUFFER_ALLOC_FAIL; - /*@-unreachable@*/ - } - *data = 0; - retval = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ); - if (( retval != WWD_SUCCESS ) && (retval != WWD_UNSUPPORTED)) - { - /* Note: System may time out here if bus interrupts are not working properly */ - WPRINT_WWD_ERROR(("Could not turn off TX glomming\n")); - return retval; - } - - /* Turn APSTA on */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) sizeof(*data), IOVAR_STR_APSTA ); - if ( data == NULL ) - { - wiced_assert( "Could not get buffer for IOVAR", 0 != 0 ); - return WWD_BUFFER_ALLOC_FAIL; - } - *data = (uint32_t) 1; - /* This will fail on manufacturing test build since it does not have APSTA available */ - retval = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ); - if ( ( retval != WWD_SUCCESS ) && ( retval != WWD_UNSUPPORTED ) ) - { - /* Could not turn on APSTA */ - WPRINT_WWD_DEBUG( ("Could not turn on APSTA\n") ); - } - -#ifdef WICED_DISABLE_AMPDU_TX - /* Disable AMPDU for TX */ - for ( i = 0; i < 8; ++i ) - { - struct ampdu_tid_control* ampdu_tid; - ampdu_tid = (struct ampdu_tid_control*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) sizeof(struct ampdu_tid_control), IOVAR_STR_AMPDU_TID ); - if ( ampdu_tid == NULL ) - { - wiced_assert( "Could not get buffer for IOVAR", 0 != 0 ); - return WWD_BUFFER_ALLOC_FAIL; - } - ampdu_tid->tid = i; - ampdu_tid->enable = 0; - retval = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ); - if ( retval != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR( ("Could not disable ampdu for tid: %u\n", i) ); - } - } -#endif - - retval = wwd_wifi_set_ampdu_parameters(); - if ( retval != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR(("Could not set AMPDU parameters\r\n")); - return retval; - } - -#ifdef WICED_STARTUP_DELAY - (void) host_rtos_delay_milliseconds( (uint32_t) WWD_STARTUP_DELAY ); -#endif - - /* Send set country command */ - /* This is the first time that the WLAN chip is required to respond - * in it's normal run mode. - * If you are porting a new system and it stalls here, it could - * be one of the following problems: - * - Bus interrupt not triggering properly - the WLAN chip is unable to signal the host that there is data available. - * - Timing problems - if the timeouts on semaphores are not working correctly, then the - * system might think that the IOCTL has timed out much faster than it should do. - * - */ -#ifdef WICED_ENABLE_AUTO_COUNTRY - /* Turn auto country on */ - retval = wwd_wifi_set_iovar_value( IOVAR_STR_AUTOCOUNTRY, 1, WWD_STA_INTERFACE ); - if( retval != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR(("Could not enable auto country\r\n")); - return retval; - } -#endif /* WICED_ENABLE_AUTO_COUNTRY */ - - country_struct = (wl_country_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) sizeof(wl_country_t), IOVAR_STR_COUNTRY ); - if ( country_struct == NULL ) - { - wiced_assert( "Could not get buffer for IOCTL", 0 != 0 ); - return WWD_BUFFER_ALLOC_FAIL; - } - memset(country_struct, 0, sizeof(wl_country_t)); - - ptr = (uint32_t*)country_struct->ccode; - *ptr = (uint32_t) wwd_wlan_status.country_code & 0x0000ffff; - ptr = (uint32_t*)country_struct->country_abbrev; - *ptr = (uint32_t) wwd_wlan_status.country_code & 0x0000ffff; - country_struct->rev = (int32_t) ( ( wwd_wlan_status.country_code & 0xffff0000 ) >> 16 ); - - retval = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ); - if ( retval != WWD_SUCCESS ) - { - /* Could not set wifi country */ - WPRINT_WWD_ERROR(("Could not set Country code\n")); - return retval; - } - - /* NOTE: The set country command requires time to process on the WLAN firmware and the following IOCTL may fail on initial attempts therefore we try a few times */ - - /* Set the event mask, indicating initially we do not want any asynchronous events */ - for ( counter = 0, retval = WWD_PENDING; retval != WWD_SUCCESS && counter < (uint32_t)MAX_POST_SET_COUNTRY_RETRY; ++counter ) - { - event_mask = (uint8_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) WL_EVENTING_MASK_LEN, IOVAR_STR_EVENT_MSGS ); - if ( event_mask == NULL ) - { - wiced_assert( "Could not get buffer for IOVAR", 0 != 0 ); - return WWD_BUFFER_ALLOC_FAIL; - } - memset( event_mask, 0, (size_t) WL_EVENTING_MASK_LEN ); - retval = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ); - } - if ( retval != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR(("Could not set Event mask\n")); - return retval; - } - - /* Send UP command */ - wwd_wifi_set_up( ); - - /* Set the GMode */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - if ( data == NULL ) - { - wiced_assert( "Could not get buffer for IOCTL", 0 != 0 ); - return WWD_BUFFER_ALLOC_FAIL; - } - *data = (uint32_t) GMODE_AUTO; - retval = wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_GMODE, buffer, 0, WWD_STA_INTERFACE ); - if ( retval != WWD_SUCCESS ) - { - /* Note: System may time out here if bus interrupts are not working properly */ - WPRINT_WWD_ERROR(("Error setting gmode\n")); - return retval; - } - - return WWD_SUCCESS; -} - -/** - * Turn off the Wi-Fi device - * - * - De-Initialises the required parts of the hardware platform - * i.e. pins for SDIO/SPI, interrupt, reset, power etc. - * - * - De-Initialises the WWD thread which arbitrates access - * to the SDIO/SPI bus - * - * @return WWD_SUCCESS if deinitialization is successful, error code otherwise - */ -wwd_result_t wwd_management_wifi_off( void ) -{ - wwd_result_t retval; - - if ( wwd_wlan_status.state == WLAN_OFF ) - { - return WWD_SUCCESS; - } - - //host_platform_bus_disable_interrupt( ); - - wwd_thread_quit( ); - - retval = wwd_bus_deinit( ); - if ( retval != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("Error de-initializing bus\n")); - return retval; - } - - retval = host_platform_bus_deinit( ); - if ( retval != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("Error de-initializing platform bus interface\n")); - return retval; - } - -// retval = host_platform_deinit( ); - if ( retval != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("Error de-initializing platform interface\n")); - return retval; - } - - /* Disable 32K WLAN sleep clock */ -// host_platform_deinit_wlan_powersave_clock(); - - wwd_wlan_status.state = WLAN_OFF; - return WWD_SUCCESS; -} - -void wwd_set_country( wiced_country_code_t code ) -{ - wwd_wlan_status.country_code = code; -} diff --git a/components/WWD/WWD/internal/wwd_sdpcm.c b/components/WWD/WWD/internal/wwd_sdpcm.c deleted file mode 100644 index 73064c7dd088c86c520e48ab109dcb17efcebd06..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/wwd_sdpcm.c +++ /dev/null @@ -1,1369 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Provides an implementation of the Broadcom SDPCM protocol. - * The Broadcom SDPCM protocol provides multiplexing of Wireless Data frames, - * I/O Control functions (IOCTL), and Asynchronous Event signalling. - * It is required when communicating with Broadcom 802.11 devices. - * - */ - -#include -#include /* For strlen, memcpy */ -#include "wwd_rtos.h" -#include "wwd_buffer.h" -#include "wwd_constants.h" -#include "wwd_wifi.h" -#include "wwd_assert.h" -#include "wwd_logging.h" -#include "wwd_events.h" -#include "RTOS/wwd_rtos_interface.h" -#include "network/wwd_buffer_interface.h" -#include "network/wwd_network_interface.h" -#include "network/wwd_network_constants.h" -#include "internal/wwd_sdpcm.h" -#include "internal/wwd_ap.h" -#include "internal/wwd_thread.h" -#include "internal/wwd_bcmendian.h" -#include "internal/bus_protocols/wwd_bus_protocol_interface.h" -#include "internal/wwd_internal.h" -#include "wwd_management.h" -#include "wiced_utilities.h" - -/****************************************************** - * @cond Constants - ******************************************************/ - -#ifndef WWD_EVENT_HANDLER_LIST_SIZE -#define WWD_EVENT_HANDLER_LIST_SIZE (5) /** Maximum number of simultaneously registered event handlers */ -#endif - -#ifndef WICED_IOCTL_PACKET_TIMEOUT -#define WICED_IOCTL_PACKET_TIMEOUT WICED_DEFAULT_IOCTL_PACKET_TIMEOUT -#endif - -#define WWD_IOCTL_TIMEOUT_MS (1000) -#define WWD_IOCTL_MAX_TX_PKT_LEN ( 1500 ) - - -#define BDC_PROTO_VER (2) /** Version number of BDC header */ -#define BDC_FLAG_VER_SHIFT (4) /** Number of bits to shift BDC version number in the flags field */ -#define ETHER_TYPE_BRCM (0x886C) /** Broadcom Ethertype for identifying event packets - Copied from DHD include/proto/ethernet.h */ -#define BRCM_OUI "\x00\x10\x18" /** Broadcom OUI (Organizationally Unique Identifier): Used in the proprietary(221) IE (Information Element) in all Broadcom devices */ -#define DOT11_OUI_LEN (3) /** Length in bytes of 802.11 OUI*/ -#define BCM_MSG_IFNAME_MAX (16) /** Maximum length of an interface name in a wl_event_msg_t structure*/ - -/* QoS related definitions (type of service) */ -#define IPV4_DSCP_OFFSET (15) /** Offset for finding the DSCP field in an IPv4 header */ - -/* CDC flag definitions taken from bcmcdc.h */ -#define CDCF_IOC_ERROR (0x01) /** 0=success, 1=ioctl cmd failed */ -#define CDCF_IOC_IF_MASK (0xF000) /** I/F index */ -#define CDCF_IOC_IF_SHIFT (12) /** # of bits of shift for I/F Mask */ -#define CDCF_IOC_ID_MASK (0xFFFF0000) /** used to uniquely id an ioctl req/resp pairing */ -#define CDCF_IOC_ID_SHIFT (16) /** # of bits of shift for ID Mask */ - -#define BDC_FLAG2_IF_MASK (0x0f) - -#define SDPCM_HEADER_LEN (12) -#define BDC_HEADER_LEN (4) - -/* Event flags */ -#define WLC_EVENT_MSG_LINK (0x01) /** link is up */ -#define WLC_EVENT_MSG_FLUSHTXQ (0x02) /** flush tx queue on MIC error */ -#define WLC_EVENT_MSG_GROUP (0x04) /** group MIC error */ -#define WLC_EVENT_MSG_UNKBSS (0x08) /** unknown source bsscfg */ -#define WLC_EVENT_MSG_UNKIF (0x10) /** unknown source OS i/f */ - - -/****************************************************** - * Macros - ******************************************************/ - -/* bit map related macros */ -#ifndef setbit -#ifndef NBBY /* the BSD family defines NBBY */ -#define NBBY 8 /* 8 bits per byte */ -#endif /* #ifndef NBBY */ -#define setbit(a, i) (((uint8_t*) a)[(int)(i)/(int)(NBBY)] |= (uint8_t)(1<<((i)%NBBY))) -#define clrbit(a, i) (((uint8_t*) a)[(int)(i)/(int)(NBBY)] &= (uint8_t)~(1<<((i)%NBBY))) -#define isset(a, i) (((const uint8_t*) a)[(int)(i)/(int)(NBBY)] & (1<<((i)%NBBY))) -#define isclr(a, i) ((((const uint8_t*)a)[(int)(i)/(int)(NBBY)] & (1<<((i)%NBBY))) == 0) -#endif /* setbit */ - -#define DATA_AFTER_HEADER( x ) ((void*)(&x[1])) - -/****************************************************** - * Local Structures - ******************************************************/ - -typedef enum -{ - DATA_HEADER = 2, - ASYNCEVENT_HEADER = 1, - CONTROL_HEADER = 0 -} sdpcm_header_type_t; - -#pragma pack(1) - -/*TODO: Keep this typedef? (in preference to the defines above */ -#if 0 -typedef struct -{ - uint16_t control_id; - uint8_t interface_index :4; - uint16_t reserved :10; - uint8_t set :1; - uint8_t error :1; -}sdpcm_cdc_flags_t; -#endif /* if 0 */ -typedef struct -{ - uint8_t sequence; - uint8_t channel_and_flags; - uint8_t next_length; - uint8_t header_length; - uint8_t wireless_flow_control; - uint8_t bus_data_credit; - uint8_t _reserved[2]; -} sdpcm_sw_header_t; - -typedef struct -{ - uint32_t cmd; /* ioctl command value */ - uint32_t len; /* lower 16: output buflen; upper 16: input buflen (excludes header) */ - uint32_t flags; /* flag defns given in bcmcdc.h */ - uint32_t status; /* status code returned from the device */ -} sdpcm_cdc_header_t; - -typedef struct -{ - uint8_t flags; /* Flags */ - uint8_t priority; /* 802.1d Priority (low 3 bits) */ - uint8_t flags2; - uint8_t data_offset; /* Offset from end of BDC header to packet data, in 4-uint8_t words. Leaves room for optional headers.*/ -} sdpcm_bdc_header_t; - -typedef struct -{ - wiced_mac_t destination_address; - wiced_mac_t source_address; - uint16_t ethertype; -} sdpcm_ethernet_header_t; - - -/* - * SDPCM header definitions - */ -typedef struct -{ - uint16_t frametag[2]; - sdpcm_sw_header_t sw_header; -} sdpcm_header_t; - -/* - * SDPCM Packet structure definitions - */ -typedef struct -{ - wwd_buffer_header_t buffer_header; - sdpcm_header_t sdpcm_header; -} sdpcm_common_header_t; - -typedef struct -{ - sdpcm_common_header_t common; - sdpcm_cdc_header_t cdc_header; -} sdpcm_control_header_t; - -typedef struct -{ - sdpcm_common_header_t common; - uint8_t _padding[2]; - sdpcm_bdc_header_t bdc_header; -} sdpcm_data_header_t; - -typedef struct bcmeth_hdr -{ - uint16_t subtype; /** Vendor specific..32769 */ - uint16_t length; - uint8_t version; /** Version is 0 */ - uint8_t oui[3]; /** Broadcom OUI */ - uint16_t usr_subtype; /** user specific Data */ -} sdpcm_bcmeth_header_t; - -/* these fields are stored in network order */ -typedef struct -{ - - uint16_t version; /** Version 1 has fields up to ifname. Version 2 has all fields including ifidx and bss_cfg_idx */ - uint16_t flags; /** see flags */ - uint32_t event_type; /** Message */ - uint32_t status; /** Status code */ - uint32_t reason; /** Reason code (if applicable) */ - uint32_t auth_type; /** WLC_E_AUTH */ - uint32_t datalen; /** data buf */ - wiced_mac_t addr; /** Station address (if applicable) */ - char ifname[BCM_MSG_IFNAME_MAX]; /** name of the packet incoming interface */ - uint8_t ifidx; /** destination OS i/f index */ - uint8_t bss_cfg_idx; /** source bsscfg index */ -} sdpcm_raw_event_header_t; - -/* used by driver msgs */ -typedef struct bcm_event -{ - sdpcm_ethernet_header_t ether; - sdpcm_bcmeth_header_t bcmeth; - union - { - wwd_event_header_t wwd; - sdpcm_raw_event_header_t raw; - } event; -} sdpcm_bcm_event_t; - -#pragma pack() - -/** Event list element structure - * - * events : A pointer to a wwd_event_num_t array that is terminated with a WLC_E_NONE event - * handler: A pointer to the wwd_event_handler_t function that will receive the event - * handler_user_data : User provided data that will be passed to the handler when a matching event occurs - */ -typedef struct -{ - const /*@null@*/ wwd_event_num_t* events; - /*@null@*/ wwd_event_handler_t handler; - /*@null@*/ void* handler_user_data; -} sdpcm_event_list_elem_t; - -/** @endcond */ - -/****************************************************** - * Static Variables - ******************************************************/ - -/* Event list variables */ -static sdpcm_event_list_elem_t wwd_sdpcm_event_list[WWD_EVENT_HANDLER_LIST_SIZE]; - -/* IOCTL variables*/ -static uint16_t wwd_sdpcm_requested_ioctl_id; -static host_semaphore_type_t wwd_sdpcm_ioctl_mutex; -static /*@only@*/ wiced_buffer_t wwd_sdpcm_ioctl_response; -static host_semaphore_type_t wwd_sdpcm_ioctl_sleep; - -/* Bus data credit variables */ -static uint8_t wwd_sdpcm_packet_transmit_sequence_number; -static uint8_t wwd_sdpcm_last_bus_data_credit = 0; -static uint8_t wwd_sdpcm_credit_diff = 0; -static uint8_t wwd_sdpcm_largest_credit_diff = 0; - -/* QoS related variables */ -static uint8_t wwd_sdpcm_highest_rx_tos = 0; - -/* Packet send queue variables */ -static host_semaphore_type_t wwd_sdpcm_send_queue_mutex; -static wiced_buffer_t /*@owned@*/ /*@null@*/ wwd_sdpcm_send_queue_head = (wiced_buffer_t) NULL; -static wiced_buffer_t /*@owned@*/ /*@null@*/ wwd_sdpcm_send_queue_tail = (wiced_buffer_t) NULL; - -static wwd_wifi_raw_packet_processor_t wwd_sdpcm_raw_packet_processor = NULL; - -static uint32_t wwd_host_interface_to_bss_index_array[3] = { WWD_STA_INTERFACE, WWD_AP_INTERFACE, WWD_P2P_INTERFACE }; /* Default mapping of host interface to BSS index */ -static wwd_interface_t wwd_bss_index_to_host_interface_array[3] = { WWD_STA_INTERFACE, WWD_AP_INTERFACE, WWD_P2P_INTERFACE }; - - -/* QoS related variables */ -uint8_t sdpcm_highest_rx_tos = 0; // XXX remove later, currently used by 11n certification test applications - - -/****************************************************** - * SDPCM Logging - * - * Enable this section to allow logging of SDPCM packets - * into a buffer for later perusal - * - * See sdpcm_log and next_sdpcm_log_pos - * - ******************************************************/ -/** @cond */ - -#if 0 - -#define SDPCM_LOG_SIZE 30 -#define SDPCM_LOG_HEADER_SIZE (0x60) - -typedef enum { UNUSED, LOG_TX, LOG_RX } sdpcm_log_direction_t; -typedef enum { IOCTL, DATA, EVENT } sdpcm_log_type_t; - -typedef struct SDPCM_log_entry_struct -{ - sdpcm_log_direction_t direction; - sdpcm_log_type_t type; - unsigned long time; - unsigned long length; - unsigned char header[SDPCM_LOG_HEADER_SIZE]; -}sdpcm_log_entry_t; - -static int next_sdpcm_log_pos = 0; -static sdpcm_log_entry_t sdpcm_log[SDPCM_LOG_SIZE]; - -static void add_sdpcm_log_entry( sdpcm_log_direction_t dir, sdpcm_log_type_t type, unsigned long length, char* eth_data ) -{ - - sdpcm_log[next_sdpcm_log_pos].direction = dir; - sdpcm_log[next_sdpcm_log_pos].type = type; - sdpcm_log[next_sdpcm_log_pos].time = host_rtos_get_time(); - sdpcm_log[next_sdpcm_log_pos].length = length; - memcpy( sdpcm_log[next_sdpcm_log_pos].header, eth_data, SDPCM_LOG_HEADER_SIZE ); - next_sdpcm_log_pos++; - if (next_sdpcm_log_pos >= SDPCM_LOG_SIZE) - { - next_sdpcm_log_pos = 0; - } -} -#else -#define add_sdpcm_log_entry( dir, type, length, eth_data ) -#endif - -/** @endcond */ - -/****************************************************** - * Static Function Prototypes - ******************************************************/ - -static wiced_buffer_t wwd_sdpcm_get_next_buffer_in_queue ( wiced_buffer_t buffer ); -static void wwd_sdpcm_set_next_buffer_in_queue ( wiced_buffer_t buffer, wiced_buffer_t prev_buffer ); -static void wwd_sdpcm_send_common ( /*@only@*/ wiced_buffer_t buffer, sdpcm_header_type_t header_type ); -static uint8_t wwd_map_dscp_to_priority ( uint8_t dscp_val ); -static wwd_interface_t wwd_wifi_get_source_interface ( uint8_t flags2 ); - -/****************************************************** - * Function definitions - ******************************************************/ - -/** Initialises the SDPCM protocol handler - * - * Initialises mutex and semaphore flags needed by the SDPCM handler. - * Also initialises the list of event handlers. This function is called - * from the @ref wwd_thread_init function. - * - * @return WWD result code - */ - -wwd_result_t wwd_sdpcm_init( void ) -{ - /* Create the mutex protecting the packet send queue */ - if ( host_rtos_init_semaphore( &wwd_sdpcm_ioctl_mutex ) != WWD_SUCCESS ) - { - return WWD_SEMAPHORE_ERROR; - } - if ( host_rtos_set_semaphore( &wwd_sdpcm_ioctl_mutex, WICED_FALSE ) != WWD_SUCCESS ) - { - return WWD_SEMAPHORE_ERROR; - } - - /* Create the event flag which signals the wwd thread needs to wake up */ - if ( host_rtos_init_semaphore( &wwd_sdpcm_ioctl_sleep ) != WWD_SUCCESS ) - { - host_rtos_deinit_semaphore( &wwd_sdpcm_ioctl_mutex ); - return WWD_SEMAPHORE_ERROR; - } - - /* Create the sdpcm packet queue semaphore */ - if ( host_rtos_init_semaphore( &wwd_sdpcm_send_queue_mutex ) != WWD_SUCCESS ) - { - host_rtos_deinit_semaphore( &wwd_sdpcm_ioctl_sleep ); - host_rtos_deinit_semaphore( &wwd_sdpcm_ioctl_mutex ); - return WWD_SEMAPHORE_ERROR; - } - if ( host_rtos_set_semaphore( &wwd_sdpcm_send_queue_mutex, WICED_FALSE ) != WWD_SUCCESS ) - { - return WWD_SEMAPHORE_ERROR; - } - - wwd_sdpcm_send_queue_head = NULL; - wwd_sdpcm_send_queue_tail = NULL; - - /* Initialise the list of event handler functions */ - memset( wwd_sdpcm_event_list, 0, sizeof(wwd_sdpcm_event_list) ); - - wwd_sdpcm_highest_rx_tos = 0; - wwd_sdpcm_packet_transmit_sequence_number = 0; - wwd_sdpcm_last_bus_data_credit = (uint8_t) 1; - - return WWD_SUCCESS; -} - - -/** Initialises the SDPCM protocol handler - * - * De-initialises mutex and semaphore flags needed by the SDPCM handler. - * This function is called from the @ref wwd_thread_func function when it is exiting. - */ - -void wwd_sdpcm_quit( void ) /*@globals killed wwd_sdpcm_ioctl_sleep, killed wwd_sdpcm_ioctl_mutex, killed wwd_sdpcm_send_queue_mutex@*/ /*@modifies wwd_sdpcm_send_queue_head@*/ -{ - /* Delete the sleep mutex */ - (void) host_rtos_deinit_semaphore( &wwd_sdpcm_ioctl_sleep ); /* Ignore return - not much can be done about failure */ - - /* Delete the queue mutex. */ - (void) host_rtos_deinit_semaphore( &wwd_sdpcm_ioctl_mutex ); /* Ignore return - not much can be done about failure */ - - /* Delete the SDPCM queue mutex */ - (void) host_rtos_deinit_semaphore( &wwd_sdpcm_send_queue_mutex ); /* Ignore return - not much can be done about failure */ - - /* Free any left over packets in the queue */ - while (wwd_sdpcm_send_queue_head != NULL) - { - wiced_buffer_t buf = wwd_sdpcm_get_next_buffer_in_queue( wwd_sdpcm_send_queue_head ); - host_buffer_release(wwd_sdpcm_send_queue_head, WWD_NETWORK_TX); - wwd_sdpcm_send_queue_head = buf; - } -} - - -/** Sets/Gets an I/O Variable (IOVar) - * - * This function either sets or retrieves the value of an I/O variable from the Broadcom 802.11 device. - * The data which is set or retrieved must be in a format structure which is appropriate for the particular - * I/O variable being accessed. These structures can only be found in the DHD source code such as wl/exe/wlu.c. - * - * @Note: The function blocks until the I/O variable read/write has completed - * - * @param type : SDPCM_SET or SDPCM_GET - indicating whether to set or get the I/O variable value - * @param send_buffer_hnd : A handle for a packet buffer containing the data value to be sent. - * @param response_buffer_hnd : A pointer which will receive the handle for the packet buffer containing the response data value received.. - * @param interface : Which interface to send the iovar to (AP or STA) - * - * @return WWD result code - */ -wwd_result_t wwd_sdpcm_send_iovar( sdpcm_command_type_t type, /*@only@*/ wiced_buffer_t send_buffer_hnd, /*@special@*/ /*@out@*/ /*@null@*/ wiced_buffer_t* response_buffer_hnd, wwd_interface_t interface ) /*@allocates *response_buffer_hnd@*/ /*@defines **response_buffer_hnd@*/ -{ - if ( type == SDPCM_SET ) - { - return wwd_sdpcm_send_ioctl( SDPCM_SET, (uint32_t) WLC_SET_VAR, send_buffer_hnd, response_buffer_hnd, interface ); - } - else - { - return wwd_sdpcm_send_ioctl( SDPCM_GET, (uint32_t) WLC_GET_VAR, send_buffer_hnd, response_buffer_hnd, interface ); - } -} - -/** Sends a data packet. - * - * This function should be called by the bottom of the network stack in order for it - * to send an ethernet frame. - * The function prepends a BDC header, before sending to @ref wwd_sdpcm_send_common where - * the SDPCM header will be added - * - * @param buffer : The ethernet packet buffer to be sent - * @param interface : the interface over which to send the packet (AP or STA) - * - */ -void wwd_network_send_ethernet_data( /*@only@*/ wiced_buffer_t buffer, wwd_interface_t interface ) /* Returns immediately - Wiced_buffer_tx_completed will be called once the transmission has finished */ -{ - sdpcm_data_header_t* packet; - wwd_result_t result; - uint8_t* dscp = NULL; - uint8_t priority = 0; - sdpcm_ethernet_header_t* ethernet_header = (sdpcm_ethernet_header_t*)host_buffer_get_current_piece_data_pointer( buffer ); - uint16_t ether_type; - - ether_type = NTOH16( ethernet_header->ethertype ); - if (( ether_type == WICED_ETHERTYPE_IPv4 ) || (ether_type == WICED_ETHERTYPE_DOT1AS)) - { - dscp = (uint8_t*)host_buffer_get_current_piece_data_pointer( buffer ) + IPV4_DSCP_OFFSET; - } - - add_sdpcm_log_entry( LOG_TX, DATA, host_buffer_get_current_piece_size( buffer ), (char*) host_buffer_get_current_piece_data_pointer( buffer ) ); - - WWD_LOG( ( "Wcd:> DATA pkt 0x%08lX len %d\n", (unsigned long)buffer, (int)host_buffer_get_current_piece_size( buffer ) ) ); - - - /* Add link space at front of packet */ - result = host_buffer_add_remove_at_front( &buffer, - (int) (sizeof(sdpcm_data_header_t)) ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("Unable to adjust header space\n")); - host_buffer_release( buffer, WWD_NETWORK_TX ); - return; - } - - packet = (sdpcm_data_header_t*) host_buffer_get_current_piece_data_pointer( buffer ); - - if ( interface > WWD_P2P_INTERFACE ) - { - WPRINT_WWD_DEBUG(("No interface for packet send\n")); - host_buffer_release( buffer, WWD_NETWORK_TX ); - return; - } - - /* Prepare the BDC header */ - packet->bdc_header.flags = 0; - packet->bdc_header.flags = (uint8_t) ( BDC_PROTO_VER << BDC_FLAG_VER_SHIFT ); - /* If it's an IPv4 packet set the BDC header priority based on the DSCP field */ - if ( ((ether_type == WICED_ETHERTYPE_IPv4) || (ether_type == WICED_ETHERTYPE_DOT1AS)) && (dscp != NULL) ) - { - if (*dscp != 0) /* If it's equal 0 then it's best effort traffic and nothing needs to be done */ - { - priority = wwd_map_dscp_to_priority( *dscp ); - } - } - - /* If STA interface, re-map prio to the prio allowed by the AP, regardless of whether it's an IPv4 packet */ - if ( interface == WWD_STA_INTERFACE ) - { - packet->bdc_header.priority = wwd_tos_map[priority]; - } - else - { - packet->bdc_header.priority = priority; - } - - packet->bdc_header.flags2 = (uint8_t)wwd_get_bss_index( interface ); - packet->bdc_header.data_offset = 0; - - /* Add the length of the BDC header and pass "down" */ - wwd_sdpcm_send_common( buffer, DATA_HEADER ); -} - -void wwd_sdpcm_update_credit(uint8_t* data) -{ - sdpcm_sw_header_t* header = (sdpcm_sw_header_t*)(data + 4); - - if ( ( header->channel_and_flags & 0x0f ) < (uint8_t) 3 ) - { - wwd_sdpcm_credit_diff = (uint8_t)(header->bus_data_credit - wwd_sdpcm_last_bus_data_credit); - WWD_LOG(("credit update =%d\n ",header->bus_data_credit) ); - if ( wwd_sdpcm_credit_diff <= (uint8_t) CHIP_MAX_BUS_DATA_CREDIT_DIFF ) - { - wwd_sdpcm_last_bus_data_credit = header->bus_data_credit; - } - else - { - if (wwd_sdpcm_credit_diff > wwd_sdpcm_largest_credit_diff) - { - wwd_sdpcm_largest_credit_diff = wwd_sdpcm_credit_diff; - } - } - } - - wwd_bus_set_flow_control(header->wireless_flow_control); -} - -/** Processes and directs incoming SDPCM packets - * - * This function receives SDPCM packets from the Broadcom 802.11 device and decodes the SDPCM header - * to determine where the packet should be directed. - * - * - Control packets (IOCTL/IOVAR) cause the IOCTL flag to be set to allow the resumption of the thread - * which sent the IOCTL - * - Data Packets are sent to the bottom layer of the network stack via the @ref host_network_process_ethernet_data function - * - Event Packets are decoded to determine which event occurred, and the event handler list is consulted - * and the appropriate event handler is called. - * - * @param buffer : The SDPCM packet buffer received from the Broadcom 802.11 device - * - */ -void wwd_sdpcm_process_rx_packet( /*@only@*/ wiced_buffer_t buffer ) -{ - sdpcm_common_header_t* packet; - uint16_t i; - uint16_t j; - uint16_t size; - uint16_t size_inv; - uint32_t flags; - uint16_t id; - sdpcm_common_header_t* common_header; - sdpcm_cdc_header_t* cdc_header; - - packet = (sdpcm_common_header_t*) host_buffer_get_current_piece_data_pointer( buffer ); - - /* Extract the total SDPCM packet size from the first two frametag bytes */ - size = packet->sdpcm_header.frametag[0]; - - /* Check that the second two frametag bytes are the binary inverse of the size */ - size_inv = (uint16_t) ~size; /* Separate variable due to GCC Bug 38341 */ - if ( packet->sdpcm_header.frametag[1] != size_inv ) - { - WPRINT_WWD_DEBUG(("Received a packet with a frametag which is wrong\n")); - host_buffer_release( buffer, WWD_NETWORK_RX ); - return; - } - - /* Check whether the packet is big enough to contain the SDPCM header (or) it's too big to handle */ - if ( ( size < (uint16_t) SDPCM_HEADER_LEN ) || ( size > (uint16_t) WICED_LINK_MTU ) ) - { - wiced_minor_assert( "Packet size invalid", 0 == 1 ); - WPRINT_WWD_DEBUG(("Received a packet that is too small to contain anything useful (or) too big. Packet Size = [%d]\n", size)); - host_buffer_release( buffer, WWD_NETWORK_RX ); - return; - } - - wwd_sdpcm_update_credit((uint8_t*)&packet->sdpcm_header.frametag); - - if ( size == (uint16_t) SDPCM_HEADER_LEN ) - { - /* This is a flow control update packet with no data - release it. */ - host_buffer_release( buffer, WWD_NETWORK_RX ); - return; - } - - /* Check the SDPCM channel to decide what to do with packet. */ - switch ( packet->sdpcm_header.sw_header.channel_and_flags & 0x0f ) - { - case CONTROL_HEADER: /* IOCTL/IOVAR reply packet */ - add_sdpcm_log_entry( LOG_RX, IOCTL, host_buffer_get_current_piece_size( buffer ), (char*) host_buffer_get_current_piece_data_pointer( buffer ) ); - - /* Check that packet size is big enough to contain the CDC header as well as the SDPCM header */ - if ( packet->sdpcm_header.frametag[0] < ( sizeof( packet->sdpcm_header.frametag ) + sizeof(sdpcm_sw_header_t) + sizeof(sdpcm_cdc_header_t) ) ) - { - /* Received a too-short SDPCM packet! */ - WPRINT_WWD_DEBUG(("Received a too-short SDPCM packet!\n")); - host_buffer_release( buffer, WWD_NETWORK_RX ); - break; - } - - /* Check that the IOCTL identifier matches the identifier that was sent */ - common_header = (sdpcm_common_header_t*) host_buffer_get_current_piece_data_pointer( buffer ); - cdc_header = (sdpcm_cdc_header_t*) &( (char*) &common_header->sdpcm_header )[ common_header->sdpcm_header.sw_header.header_length ]; - flags = ltoh32( cdc_header->flags ); - id = (uint16_t) ( ( flags & CDCF_IOC_ID_MASK ) >> CDCF_IOC_ID_SHIFT ); - - if ( id == wwd_sdpcm_requested_ioctl_id ) - { - /* Save the response packet in a global variable */ - wwd_sdpcm_ioctl_response = buffer; - - WWD_LOG( ( "Wcd:< Procd pkt 0x%08lX: IOCTL Response (%d bytes)\n", (unsigned long)buffer, size ) ); - - /* Wake the thread which sent the IOCTL/IOVAR so that it will resume */ - host_rtos_set_semaphore( &wwd_sdpcm_ioctl_sleep, WICED_FALSE ); - } - else - { - host_buffer_release( buffer, WWD_NETWORK_RX ); - WPRINT_WWD_DEBUG(("Received a response for a different IOCTL - retry\n")); - } - break; - - case DATA_HEADER: - { - sdpcm_bdc_header_t* bdc_header; - int32_t headers_len_below_payload; - - /* Check that the packet is big enough to contain SDPCM & BDC headers */ - if ( packet->sdpcm_header.frametag[0] <= (uint16_t)( SDPCM_HEADER_LEN + BDC_HEADER_LEN ) ) - { - WPRINT_WWD_DEBUG(("Packet too small to contain SDPCM + BDC headers\n")); - host_buffer_release( buffer, WWD_NETWORK_RX ); - break; - } - - /* Calculate where the BDC header is - this is dependent on the data offset field of the SDPCM SW header */ - bdc_header = (sdpcm_bdc_header_t*) &((char*)&packet->sdpcm_header)[ packet->sdpcm_header.sw_header.header_length ]; - - /* Calculate where the payload is - this is dependent on the data offset fields of the SDPCM SW header and the BDC header */ - headers_len_below_payload = (int32_t) ( (int32_t)sizeof(wwd_buffer_header_t) + (int32_t) packet->sdpcm_header.sw_header.header_length + (int32_t)BDC_HEADER_LEN + (int32_t)(bdc_header->data_offset<<2) ); - - /* Move buffer pointer past gSPI, SDPCM, BCD headers and padding, so that the network stack or 802.11 monitor sees only the payload */ - if ( WWD_SUCCESS != host_buffer_add_remove_at_front( &buffer, headers_len_below_payload ) ) - { - WPRINT_WWD_DEBUG(("No space for headers without chaining. this should never happen\n")); - host_buffer_release( buffer, WWD_NETWORK_RX ); - break; - } - - add_sdpcm_log_entry( LOG_RX, DATA, host_buffer_get_current_piece_size( buffer ), (char*) host_buffer_get_current_piece_data_pointer( buffer ) ); - WWD_LOG( ( "Wcd:< Procd pkt 0x%08lX: Data (%d bytes)\n", (unsigned long)buffer, size ) ); - - - /* Check if we are in monitor mode */ - if ( wwd_wifi_monitor_mode_is_enabled() == WICED_TRUE ) - { - if ( wwd_sdpcm_raw_packet_processor != NULL ) - { - wwd_sdpcm_raw_packet_processor( buffer, WWD_STA_INTERFACE ); - } - else - { - host_buffer_release( buffer, WWD_NETWORK_RX ); - } - } - else - { - /* Otherwise an Ethernet data frame received */ - - if ( bdc_header->priority > wwd_sdpcm_highest_rx_tos ) - { - wwd_sdpcm_highest_rx_tos = bdc_header->priority; - } - - /* Send packet to bottom of network stack */ - host_network_process_ethernet_data( buffer, wwd_wifi_get_source_interface( bdc_header->flags2 ) ); - } - } - break; - - case ASYNCEVENT_HEADER: - { - sdpcm_bdc_header_t* bdc_header; - uint16_t ether_type; - wwd_event_header_t* wwd_event; - sdpcm_bcm_event_t* event; - - bdc_header = (sdpcm_bdc_header_t*) &((char*)&packet->sdpcm_header)[ packet->sdpcm_header.sw_header.header_length ]; - - event = (sdpcm_bcm_event_t*) &bdc_header[ bdc_header->data_offset + 1 ]; - - ether_type = NTOH16( event->ether.ethertype ); - - /* If frame is truly an event, it should have EtherType equal to the Broadcom type. */ - if ( ether_type != (uint16_t)ETHER_TYPE_BRCM ) - { - WPRINT_WWD_DEBUG(("Error - received a channel 1 packet which was not BRCM ethertype\n")); - host_buffer_release( buffer, WWD_NETWORK_RX ); - break; - } - - /* If ethertype is correct, the contents of the ethernet packet - * are a structure of type bcm_event_t - */ - - /* Check that the OUI matches the Broadcom OUI */ - if ( 0 != memcmp( BRCM_OUI, &event->bcmeth.oui[0], (size_t)DOT11_OUI_LEN ) ) - { - WPRINT_WWD_DEBUG(("Event OUI mismatch\n")); - host_buffer_release( buffer, WWD_NETWORK_RX ); - break; - } - - wwd_event = &event->event.wwd; - - /* Search for the event type in the list of event handler functions - * event data is stored in network endianness - */ - wwd_event->flags = NTOH16( wwd_event->flags ); - wwd_event->event_type = (wwd_event_num_t) NTOH32( wwd_event->event_type ); - wwd_event->status = (wwd_event_status_t) NTOH32( wwd_event->status ); - wwd_event->reason = (wwd_event_reason_t) NTOH32( wwd_event->reason ); - wwd_event->auth_type = NTOH32( wwd_event->auth_type ); - wwd_event->datalen = NTOH32( wwd_event->datalen ); - /* Ensure data length is correct */ - if ( wwd_event->datalen > (uint32_t)( size - ((char *)DATA_AFTER_HEADER( event ) - (char *)&packet->sdpcm_header ) ) ) - { - WPRINT_WWD_DEBUG(("Error - (data length received [%d] > expected data length [%d]). SDPCM packet size = [%d]. Ignoring the packet\n", - (int)wwd_event->datalen, size - ((char *)DATA_AFTER_HEADER( event ) - (char *)&packet->sdpcm_header ), size)); - host_buffer_release( buffer, WWD_NETWORK_RX ); - break; - } - //wwd_event->interface = ( event->event.raw.ifidx & 3); - wwd_event->interface = (uint8_t)wwd_bss_index_to_host_interface_array[event->event.raw.ifidx]; - - /* This is necessary because people who defined event statuses and reasons overlapped values. */ - if ( wwd_event->event_type == WLC_E_PSK_SUP ) - { - wwd_event->status = (wwd_event_status_t) ( (int)wwd_event->status + WLC_SUP_STATUS_OFFSET ); - wwd_event->reason = (wwd_event_reason_t) ( (int)wwd_event->reason + WLC_E_SUP_REASON_OFFSET ); - } - else if ( wwd_event->event_type == WLC_E_PRUNE ) - { - wwd_event->reason = (wwd_event_reason_t) ( (int)wwd_event->reason + WLC_E_PRUNE_REASON_OFFSET ); - } - else if ( ( wwd_event->event_type == WLC_E_DISASSOC ) || ( wwd_event->event_type == WLC_E_DEAUTH ) ) - { - wwd_event->status = (wwd_event_status_t) ( (int)wwd_event->status + WLC_DOT11_SC_STATUS_OFFSET ); - wwd_event->reason = (wwd_event_reason_t) ( (int)wwd_event->reason + WLC_E_DOT11_RC_REASON_OFFSET ); - } - - /* do any needed debug logging of event */ - wwd_log_event( wwd_event, (uint8_t*) DATA_AFTER_HEADER( event ) ); - - for ( i = 0; i < (uint16_t) WWD_EVENT_HANDLER_LIST_SIZE; i++ ) - { - if ( wwd_sdpcm_event_list[i].events != NULL ) - { - for ( j = 0; wwd_sdpcm_event_list[i].events[j] != WLC_E_NONE; ++j ) - { - if ( wwd_sdpcm_event_list[i].events[j] == wwd_event->event_type ) - { - /* Correct event type has been found - call the handler function and exit loop */ - wwd_sdpcm_event_list[i].handler_user_data = wwd_sdpcm_event_list[i].handler( wwd_event, (uint8_t*) DATA_AFTER_HEADER( event ), wwd_sdpcm_event_list[i].handler_user_data ); - /*@innerbreak@*/ - break; - } - } - } - } - - add_sdpcm_log_entry( LOG_RX, EVENT, host_buffer_get_current_piece_size( buffer ), (char*) host_buffer_get_current_piece_data_pointer( buffer ) ); - WWD_LOG( ( "Wcd:< Procd pkt 0x%08lX: Evnt %d (%d bytes)\n", (unsigned long)buffer, (int)event->event.raw.event_type, size ) ); - - /* Release the event packet buffer */ - host_buffer_release( buffer, WWD_NETWORK_RX ); - } - break; - - default: - wiced_minor_assert("SDPCM packet of unknown channel received - dropping packet", 0 != 0); - host_buffer_release( buffer, WWD_NETWORK_RX ); - break; - } -} - - -/** Sends an IOCTL command - * - * Sends a I/O Control command to the Broadcom 802.11 device. - * The data which is set or retrieved must be in a format structure which is appropriate for the particular - * I/O control being sent. These structures can only be found in the DHD source code such as wl/exe/wlu.c. - * The I/O control will always respond with a packet buffer which may contain data in a format specific to - * the I/O control being used. - * - * @Note: The caller is responsible for releasing the response buffer. - * @Note: The function blocks until the IOCTL has completed - * @Note: Only one IOCTL may happen simultaneously. - * - * @param type : SDPCM_SET or SDPCM_GET - indicating whether to set or get the I/O control - * @param send_buffer_hnd : A handle for a packet buffer containing the data value to be sent. - * @param response_buffer_hnd : A pointer which will receive the handle for the packet buffer containing the response data value received.. - * @param interface : Which interface to send the iovar to (WWD_STA_INTERFACE or WWD_AP_INTERFACE) - * - * @return WWD result code - */ - -wwd_result_t wwd_sdpcm_send_ioctl( sdpcm_command_type_t type, uint32_t command, /*@only@*/ wiced_buffer_t send_buffer_hnd, /*@special@*/ /*@out@*/ /*@null@*/ wiced_buffer_t* response_buffer_hnd, wwd_interface_t interface ) /*@allocates *response_buffer_hnd@*/ /*@defines **response_buffer_hnd@*/ -{ - uint32_t data_length; - uint32_t flags; - wwd_result_t retval; - sdpcm_control_header_t* send_packet; - sdpcm_common_header_t* common_header; - sdpcm_cdc_header_t* cdc_header; - uint32_t bss_index = wwd_host_interface_to_bss_index_array[interface & 3]; - - /* Acquire mutex which prevents multiple simultaneous IOCTLs */ - retval = host_rtos_get_semaphore( &wwd_sdpcm_ioctl_mutex, NEVER_TIMEOUT, WICED_FALSE ); - if ( retval != WWD_SUCCESS ) - { - host_buffer_release( send_buffer_hnd, WWD_NETWORK_TX ); - return retval; - } - - /* Get the data length and cast packet to a CDC SDPCM header */ - data_length = (uint32_t)( host_buffer_get_current_piece_size( send_buffer_hnd ) - sizeof(sdpcm_common_header_t) - sizeof(sdpcm_cdc_header_t) ); - send_packet = (sdpcm_control_header_t*) host_buffer_get_current_piece_data_pointer( send_buffer_hnd ); - - /* Check if IOCTL is actually IOVAR */ - if ( command == WLC_SET_VAR || command == WLC_GET_VAR ) - { - uint8_t* data = (uint8_t*)DATA_AFTER_HEADER( send_packet ); - uint8_t* ptr = data; - - /* Calculate the offset added to compensate for IOVAR string creating unaligned data section */ - while ( *ptr == 0 ) - { - ptr++; - } - if ( data != ptr ) - { - data_length -= (uint32_t)( ptr - data ); - memmove( data, ptr, data_length ); - host_buffer_set_size( send_buffer_hnd, (uint16_t) ( data_length + sizeof(sdpcm_common_header_t) + sizeof(sdpcm_cdc_header_t) ) ); - } - - } - - /* Prepare the CDC header */ - send_packet->cdc_header.cmd = command; - send_packet->cdc_header.len = data_length; - send_packet->cdc_header.flags = ( ( (uint32_t) ++wwd_sdpcm_requested_ioctl_id << CDCF_IOC_ID_SHIFT ) & CDCF_IOC_ID_MASK ) | type | bss_index << CDCF_IOC_IF_SHIFT; - send_packet->cdc_header.status = 0; - - WWD_LOG( ( "Wcd:> IOCTL pkt 0x%08lX: cmd %d, len %d\n", (unsigned long)send_buffer_hnd, (int)command, (int)data_length ) ); - - /* Manufacturing test can receive big buffers, but sending big buffers causes a wlan firmware error */ - /* Even though data portion needs to be truncated, cdc_header should have the actual length of the ioctl packet */ - if ( host_buffer_get_current_piece_size( send_buffer_hnd ) > WWD_IOCTL_MAX_TX_PKT_LEN ) - { - host_buffer_set_size( send_buffer_hnd, WWD_IOCTL_MAX_TX_PKT_LEN ); - } - - /* Store the length of the data and the IO control header and pass "down" */ - wwd_sdpcm_send_common( send_buffer_hnd, CONTROL_HEADER ); - - /* Wait till response has been received */ - retval = host_rtos_get_semaphore( &wwd_sdpcm_ioctl_sleep, (uint32_t) WWD_IOCTL_TIMEOUT_MS, WICED_FALSE ); - if ( retval != WWD_SUCCESS ) - { - /* Release the mutex since wwd_sdpcm_ioctl_response will no longer be referenced. */ - host_rtos_set_semaphore( &wwd_sdpcm_ioctl_mutex, WICED_FALSE ); - return retval; - } - - common_header = (sdpcm_common_header_t*) host_buffer_get_current_piece_data_pointer( wwd_sdpcm_ioctl_response ); - cdc_header = (sdpcm_cdc_header_t*) &( (char*) &common_header->sdpcm_header )[ common_header->sdpcm_header.sw_header.header_length ]; - flags = ltoh32( cdc_header->flags ); - - retval = (wwd_result_t) ( WLAN_ENUM_OFFSET - ltoh32( cdc_header->status ) ); - - /* Check if the caller wants the response */ - if ( response_buffer_hnd != NULL ) - { - *response_buffer_hnd = wwd_sdpcm_ioctl_response; - host_buffer_add_remove_at_front( response_buffer_hnd, - (int32_t) ( sizeof(wwd_buffer_header_t) + sizeof(sdpcm_cdc_header_t) + - common_header->sdpcm_header.sw_header.header_length )); - } - else - { - host_buffer_release( wwd_sdpcm_ioctl_response, WWD_NETWORK_RX ); - } - - wwd_sdpcm_ioctl_response = NULL; - - /* Release the mutex since wwd_sdpcm_ioctl_response will no longer be referenced. */ - host_rtos_set_semaphore( &wwd_sdpcm_ioctl_mutex, WICED_FALSE ); - - - /* Check whether the IOCTL response indicates it failed. */ - if ( ( flags & CDCF_IOC_ERROR ) != 0) - { - if ( response_buffer_hnd != NULL ) - { - host_buffer_release( *response_buffer_hnd, WWD_NETWORK_RX ); - *response_buffer_hnd = NULL; - } - wiced_minor_assert("IOCTL failed\n", 0 != 0 ); - return retval; - } - - return WWD_SUCCESS; -} - -/** - * Registers locally a handler to receive event callbacks. - * Does not notify Wi-Fi about event subscription change. - * Can be used to refresh local callbacks (e.g. after deep-sleep) - * if Wi-Fi is already notified about them. - * - * This function registers a callback handler to be notified when - * a particular event is received. - * - * Alternately the function clears callbacks for given event type. - * - * @note : Currently each event may only be registered to one handler - * and there is a limit to the number of simultaneously registered - * events - * - * @param event_nums An array of event types that is to trigger the handler. The array must be terminated with a WLC_E_NONE event - * See @ref wwd_event_num_t for available events - * @param handler_func A function pointer to the new handler callback, - * or NULL if callbacks are to be disabled for the given event type - * @param handler_user_data A pointer value which will be passed to the event handler function - * at the time an event is triggered (NULL is allowed) - * @param interface The interface to set the handler for. - * - * @return WWD result code - */ -wwd_result_t wwd_management_set_event_handler_locally( /*@keep@*/ const wwd_event_num_t* event_nums, /*@null@*/ wwd_event_handler_t handler_func, /*@null@*/ /*@keep@*/ void* handler_user_data, wwd_interface_t interface ) -{ - uint16_t entry = (uint16_t) 0xFF; - uint16_t i; - - UNUSED_PARAMETER( interface ); - - /* Find an existing matching entry OR the next empty entry */ - for ( i = 0; i < (uint16_t) WWD_EVENT_HANDLER_LIST_SIZE; i++ ) - { - /* Find a matching event list OR the first empty event entry */ - if ( wwd_sdpcm_event_list[i].events == event_nums ) - { - /* Check if all the data already matches */ - if ( wwd_sdpcm_event_list[i].handler == handler_func && - wwd_sdpcm_event_list[i].handler_user_data == handler_user_data ) - { - return WWD_SUCCESS; - } - - /* Delete the entry */ - wwd_sdpcm_event_list[i].events = NULL; - wwd_sdpcm_event_list[i].handler = NULL; - wwd_sdpcm_event_list[i].handler_user_data = NULL; - - entry = i; - break; - } - else if ( ( entry == (uint16_t) 0xFF ) && ( wwd_sdpcm_event_list[i].events == NULL ) ) - { - entry = i; - } - } - - /* Check if handler function was provided */ - if ( handler_func != NULL ) - { - /* Check if an empty entry was not found */ - if ( entry == (uint16_t) 0xFF ) - { - WPRINT_WWD_DEBUG(("Out of space in event handlers table - try increasing WWD_EVENT_HANDLER_LIST_SIZE\n")); - return WWD_OUT_OF_EVENT_HANDLER_SPACE; - } - - /* Add the new handler in at the free space */ - wwd_sdpcm_event_list[entry].handler = handler_func; - wwd_sdpcm_event_list[entry].handler_user_data = handler_user_data; - wwd_sdpcm_event_list[entry].events = event_nums; - } - - return WWD_SUCCESS; -} - -/** - * Registers a handler to receive event callbacks. - * Subscribe locally and notify Wi-Fi about subscription. - * - * This function registers a callback handler to be notified when - * a particular event is received. - * - * Alternately the function clears callbacks for given event type. - * - * @note : Currently each event may only be registered to one handler - * and there is a limit to the number of simultaneously registered - * events - * - * @param event_nums An array of event types that is to trigger the handler. The array must be terminated with a WLC_E_NONE event - * See @ref wwd_event_num_t for available events - * @param handler_func A function pointer to the new handler callback, - * or NULL if callbacks are to be disabled for the given event type - * @param handler_user_data A pointer value which will be passed to the event handler function - * at the time an event is triggered (NULL is allowed) - * @param interface The interface to set the handler for. - * - * @return WWD result code - */ -wwd_result_t wwd_management_set_event_handler( /*@keep@*/ const wwd_event_num_t* event_nums, /*@null@*/ wwd_event_handler_t handler_func, /*@null@*/ /*@keep@*/ void* handler_user_data, wwd_interface_t interface ) -{ - wiced_buffer_t buffer; - uint8_t* event_mask; - uint16_t i; - uint16_t j; - wwd_result_t res; - uint32_t* data; - - /* Set event handler locally */ - res = wwd_management_set_event_handler_locally( event_nums, handler_func, handler_user_data, interface ); - if ( res != WWD_SUCCESS ) - { - return res; - } - - /* Send the new event mask value to the wifi chip */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) WL_EVENTING_MASK_LEN + 4, "bsscfg:" IOVAR_STR_EVENT_MSGS ); - if ( data == NULL ) - { - return WWD_BUFFER_UNAVAILABLE_PERMANENT; - } - - data[0] = wwd_get_bss_index( interface ); - event_mask = (uint8_t*)&data[1]; - - /* Keep the wlan awake while we set the event_msgs */ -// WWD_WLAN_KEEP_AWAKE( ); - - /* Set the event bits for each event from every handler */ - memset( event_mask, 0, (size_t) WL_EVENTING_MASK_LEN ); - for ( i = 0; i < (uint16_t) WWD_EVENT_HANDLER_LIST_SIZE; i++ ) - { - if ( wwd_sdpcm_event_list[i].events != NULL ) - { - for ( j = 0; wwd_sdpcm_event_list[i].events[j] != WLC_E_NONE; j++ ) - { - setbit(event_mask, wwd_sdpcm_event_list[i].events[j]); - } - } - } - res = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ); - - /* The wlan chip can sleep from now on */ -// WWD_WLAN_LET_SLEEP( ); - - return res; -} - -/** A helper function to easily acquire and initialise a buffer destined for use as an iovar - * - * @param buffer : A pointer to a wiced_buffer_t object where the created buffer will be stored - * @param data_length : The length of space reserved for user data - * @param name : The name of the iovar - * - * @return A pointer to the start of user data with data_length space available - */ -/*@null@*/ /*@exposed@*/ void* wwd_sdpcm_get_iovar_buffer( /*@special@*/ /*@out@*/ wiced_buffer_t* buffer, uint16_t data_length, const char* name ) /*@allocates *buffer@*/ /*@defines **buffer@*/ -{ - uint32_t name_length = (uint32_t) strlen( name ) + 1; /* + 1 for terminating null */ - uint32_t name_length_alignment_offset = (64 - name_length) % sizeof(uint32_t); - if ( internal_host_buffer_get( buffer, WWD_NETWORK_TX, (unsigned short) ( IOCTL_OFFSET + data_length + name_length + name_length_alignment_offset ), (unsigned long) 0xFFFFFFFF ) == WWD_SUCCESS ) - { - uint8_t* data = ( host_buffer_get_current_piece_data_pointer( *buffer ) + IOCTL_OFFSET ); - memset( data, 0, name_length_alignment_offset ); - memcpy( data + name_length_alignment_offset, name, name_length ); - return ( data + name_length + name_length_alignment_offset ); - } - else - { - WPRINT_WWD_DEBUG(("Error - failed to allocate a packet buffer for IOVAR\n")); - return NULL; - } -} - -/** A helper function to easily acquire and initialise a buffer destined for use as an ioctl - * - * @param buffer : A pointer to a wiced_buffer_t object where the created buffer will be stored - * @param data_length : The length of space reserved for user data - * - * @return A pointer to the start of user data with data_length space available - */ -/*@null@*/ /*@exposed@*/ void* wwd_sdpcm_get_ioctl_buffer( /*@special@*/ /*@out@*/ wiced_buffer_t* buffer, uint16_t data_length ) /*@allocates *buffer@*/ /*@defines **buffer@*/ -{ - if ( internal_host_buffer_get( buffer, WWD_NETWORK_TX, (unsigned short) ( IOCTL_OFFSET + data_length ), (unsigned long) 0xFFFFFFFF ) == WWD_SUCCESS ) - { - return ( host_buffer_get_current_piece_data_pointer( *buffer ) + IOCTL_OFFSET ); - } - else - { - WPRINT_WWD_DEBUG(("Error - failed to allocate a packet buffer for IOCTL\n")); - return NULL; - } -} - - -wwd_result_t wwd_sdpcm_get_packet_to_send( /*@special@*/ /*@out@*/ wiced_buffer_t* buffer) /*@allocates *buffer@*/ /*@defines **buffer@*/ -{ - sdpcm_common_header_t* packet; - if ( wwd_sdpcm_send_queue_head != NULL ) - { - /* Check if we're being flow controlled */ - if ( wwd_bus_is_flow_controlled() == WICED_TRUE ) - { - return WWD_FLOW_CONTROLLED; - } - - /* Check if we have enough bus data credits spare */ - if ( wwd_sdpcm_packet_transmit_sequence_number == wwd_sdpcm_last_bus_data_credit ) - { - return WWD_NO_CREDITS; - } - - /* There is a packet waiting to be sent - send it then fix up queue and release packet */ - if ( host_rtos_get_semaphore( &wwd_sdpcm_send_queue_mutex, NEVER_TIMEOUT, WICED_FALSE ) != WWD_SUCCESS ) - { - /* Could not obtain mutex, push back the flow control semaphore */ - return WWD_SEMAPHORE_ERROR; - } - - /* Pop the head off and set the new send_queue head */ - *buffer = wwd_sdpcm_send_queue_head; - wwd_sdpcm_send_queue_head = wwd_sdpcm_get_next_buffer_in_queue( *buffer ); - if ( wwd_sdpcm_send_queue_head == NULL ) - { - wwd_sdpcm_send_queue_tail = NULL; - } - host_rtos_set_semaphore( &wwd_sdpcm_send_queue_mutex, WICED_FALSE ); - - /* Set the sequence number */ - packet = (sdpcm_common_header_t*) host_buffer_get_current_piece_data_pointer( *buffer ); - packet->sdpcm_header.sw_header.sequence = wwd_sdpcm_packet_transmit_sequence_number; - wwd_sdpcm_packet_transmit_sequence_number++; - - return WWD_SUCCESS; - } - else - { - return WWD_NO_PACKET_TO_SEND; - } -} - - -/** Returns the number of bus credits available - * - * @return The number of bus credits available - */ -uint8_t wwd_sdpcm_get_available_credits( void ) -{ - return (uint8_t)( wwd_sdpcm_last_bus_data_credit - wwd_sdpcm_packet_transmit_sequence_number ); -} - - -/** Sets a handler functions for monitor mode - * - * Packets received in monitor mode have raw 802.11 headers - * and cannot be processed by the normal stack. - * Use this function to set a handler function which will - * process and free the raw packets received in monitor mode. - * - * @param func : function pointer to handler. Set to NULL to clear handler. - * - * @return result code - */ -wwd_result_t wwd_wifi_set_raw_packet_processor( wwd_wifi_raw_packet_processor_t function ) -{ - wwd_sdpcm_raw_packet_processor = function; - return WWD_SUCCESS; -} - - -uint32_t wwd_get_bss_index( wwd_interface_t interface ) -{ - if ( interface <= WWD_P2P_INTERFACE ) - { - return wwd_host_interface_to_bss_index_array[interface]; - } - return 0; -} - - -/****************************************************** - * Static Functions - ******************************************************/ - -/** Writes SDPCM headers and sends packet to WWD Thread - * - * Prepends the given packet with a new SDPCM header, - * then passes the packet to the WWD thread via a queue - * - * This function is called by @ref wwd_network_send_ethernet_data and @ref wwd_sdpcm_send_ioctl - * - * @param buffer : The handle of the packet buffer to send - * @param header_type : DATA_HEADER, ASYNCEVENT_HEADER or CONTROL_HEADER - indicating what type of SDPCM packet this is. - */ - -static void wwd_sdpcm_send_common( /*@only@*/ wiced_buffer_t buffer, sdpcm_header_type_t header_type ) -{ - uint16_t size; - sdpcm_common_header_t* packet = (sdpcm_common_header_t *) host_buffer_get_current_piece_data_pointer( buffer ); - - size = host_buffer_get_current_piece_size( buffer ); - -#ifdef SUPPORT_BUFFER_CHAINING - wiced_buffer_t tmp_buff; - while ( NULL != ( tmp_buff = host_buffer_get_next_piece( tmp_buff ) ) ) - { - size += host_buffer_get_current_piece_size( tmp_buff ); - } -#endif /* ifdef SUPPORT_BUFFER_CHAINING */ - - size = (uint16_t) ( size - (uint16_t) sizeof(wwd_buffer_header_t) ); - - /* Prepare the SDPCM header */ - memset( (uint8_t*) &packet->sdpcm_header, 0, sizeof(sdpcm_header_t) ); - packet->sdpcm_header.sw_header.channel_and_flags = (uint8_t) header_type; - packet->sdpcm_header.sw_header.header_length = ( header_type == DATA_HEADER ) ? sizeof(sdpcm_header_t) + 2 : sizeof(sdpcm_header_t); - packet->sdpcm_header.sw_header.sequence = 0; /* Note: The real sequence will be written later */ - packet->sdpcm_header.frametag[0] = size; - packet->sdpcm_header.frametag[1] = (uint16_t) ~size; - - add_sdpcm_log_entry( LOG_TX, ( header_type == DATA_HEADER )? DATA : ( header_type == CONTROL_HEADER)? IOCTL : EVENT, host_buffer_get_current_piece_size( buffer ), (char*) host_buffer_get_current_piece_data_pointer( buffer ) ); - - /* Add the length of the SDPCM header and pass "down" */ - if ( host_rtos_get_semaphore( &wwd_sdpcm_send_queue_mutex, NEVER_TIMEOUT, WICED_FALSE ) != WWD_SUCCESS ) - { - /* Could not obtain mutex */ - /* Fatal error */ - host_buffer_release(buffer, WWD_NETWORK_TX); - return; - } - - wwd_sdpcm_set_next_buffer_in_queue( NULL, buffer ); - if ( wwd_sdpcm_send_queue_tail != NULL ) - { - wwd_sdpcm_set_next_buffer_in_queue( buffer, wwd_sdpcm_send_queue_tail ); - } - wwd_sdpcm_send_queue_tail = buffer; - if ( wwd_sdpcm_send_queue_head == NULL ) - { - wwd_sdpcm_send_queue_head = buffer; - } - host_rtos_set_semaphore( &wwd_sdpcm_send_queue_mutex, WICED_FALSE ); - - wwd_thread_notify(); -} - - -static wiced_buffer_t wwd_sdpcm_get_next_buffer_in_queue( wiced_buffer_t buffer ) -{ - wwd_buffer_header_t* packet = (wwd_buffer_header_t*) host_buffer_get_current_piece_data_pointer( buffer ); - return packet->queue_next; -} - - -/** Sets the next buffer in the send queue - * - * The send queue is a linked list of packet buffers where the 'next' pointer - * is stored in the first 4 bytes of the buffer content. - * This function sets that pointer. - * - * @param buffer : handle of packet in the send queue - * prev_buffer : handle of new packet whose 'next' pointer will point to 'buffer' - */ -static void wwd_sdpcm_set_next_buffer_in_queue( wiced_buffer_t buffer, wiced_buffer_t prev_buffer ) -{ - wwd_buffer_header_t* packet = (wwd_buffer_header_t*) host_buffer_get_current_piece_data_pointer( prev_buffer ); - packet->queue_next = buffer; -} - - -/** Map a DSCP value from an IP header to a WMM QoS priority - * - * @param dscp_val : DSCP value from IP header - * - * @return wmm_qos : WMM priority - * - */ -static const uint8_t dscp_to_wmm_qos[] = - { 0, 0, 0, 0, 0, 0, 0, 0, /* 0 - 7 */ - 1, 1, 1, 1, 1, 1, 1, /* 8 - 14 */ - 1, 1, 1, 1, 1, 1, 1, /* 15 - 21 */ - 1, 1, 0, 0, 0, 0, 0, /* 22 - 28 */ - 0, 0, 0, 5, 5, 5, 5, /* 29 - 35 */ - 5, 5, 5, 5, 5, 5, 5, /* 36 - 42 */ - 5, 5, 5, 5, 5, 7, 7, /* 43 - 49 */ - 7, 7, 7, 7, 7, 7, 7, /* 50 - 56 */ - 7, 7, 7, 7, 7, 7, 7, /* 57 - 63 */ - }; - -static uint8_t wwd_map_dscp_to_priority( uint8_t val ) -{ - uint8_t dscp_val = (uint8_t)(val >> 2); /* DSCP field is the high 6 bits of the second byte of an IPv4 header */ - - return dscp_to_wmm_qos[dscp_val]; -} - -static wwd_interface_t wwd_wifi_get_source_interface( uint8_t flags2 ) -{ - uint32_t bssid_index = (uint32_t)(flags2 & BDC_FLAG2_IF_MASK); - - if ( bssid_index <= WWD_P2P_INTERFACE ) - { - return wwd_bss_index_to_host_interface_array[bssid_index]; - } - return WWD_STA_INTERFACE; -} - -void wwd_update_host_interface_to_bss_index_mapping( wwd_interface_t interface, uint32_t bss_index ) -{ - wwd_host_interface_to_bss_index_array[interface] = bss_index; - wwd_bss_index_to_host_interface_array[bss_index] = interface; -} - -int wwd_sdpcm_data_header_size(void) -{ - return sizeof(sdpcm_data_header_t); -} diff --git a/components/WWD/WWD/internal/wwd_sdpcm.h b/components/WWD/WWD/internal/wwd_sdpcm.h deleted file mode 100644 index 6a709355b6107fda717c8ca64064e15620b685e3..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/wwd_sdpcm.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Provides Wiced with function prototypes for IOCTL commands, - * and for communicating with the SDPCM module - * - */ - -#ifndef INCLUDED_WWD_SDPCM_H -#define INCLUDED_WWD_SDPCM_H - -#include "wwd_buffer.h" -#include "wwd_constants.h" -#include "wwd_bus_protocol.h" -#include "chip_constants.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/****************************************************** - * Constants - ******************************************************/ - -/* CDC flag definition taken from bcmcdc.h */ -#ifndef CDCF_IOC_SET -#define CDCF_IOC_SET (0x02) /** 0=get, 1=set cmd */ -#endif /* ifndef CDCF_IOC_SET */ - -typedef enum sdpcm_command_type_enum -{ - SDPCM_GET = 0x00, - SDPCM_SET = CDCF_IOC_SET -} sdpcm_command_type_t; - - -/* IOCTL swapping mode for Big Endian host with Little Endian wlan. Default to off */ -#ifdef IL_BIGENDIAN -wiced_bool_t swap = WICED_FALSE; -#define htod32(i) (swap?bcmswap32(i):i) -#define htod16(i) (swap?bcmswap16(i):i) -#define dtoh32(i) (swap?bcmswap32(i):i) -#define dtoh16(i) (swap?bcmswap16(i):i) -#else /* IL_BIGENDIAN */ -#define htod32(i) ((uint32_t)(i)) -#define htod16(i) ((uint16_t)(i)) -#define dtoh32(i) ((uint32_t)(i)) -#define dtoh16(i) ((uint16_t)(i)) -#endif /* IL_BIGENDIAN */ - -/****************************************************** - * Structures - ******************************************************/ - -#define IOCTL_OFFSET ( sizeof(wwd_buffer_header_t) + 12 + 16 ) - -/****************************************************** - * Function declarations - ******************************************************/ - -extern /*@null@*/ /*@exposed@*/ void* wwd_sdpcm_get_iovar_buffer ( /*@special@*/ /*@out@*/ wiced_buffer_t* buffer, uint16_t data_length, const char* name ) /*@allocates *buffer@*/ /*@defines **buffer@*/; -extern /*@null@*/ /*@exposed@*/ void* wwd_sdpcm_get_ioctl_buffer ( /*@special@*/ /*@out@*/ wiced_buffer_t* buffer, uint16_t data_length ) /*@allocates *buffer@*/ /*@defines **buffer@*/; -extern wwd_result_t wwd_sdpcm_send_ioctl ( sdpcm_command_type_t type, uint32_t command, wiced_buffer_t send_buffer_hnd, /*@null@*/ /*@out@*/ wiced_buffer_t* response_buffer_hnd, wwd_interface_t interface ) /*@releases send_buffer_hnd@*/ ; -extern wwd_result_t wwd_sdpcm_send_iovar ( sdpcm_command_type_t type, /*@only@*/ wiced_buffer_t send_buffer_hnd, /*@special@*/ /*@out@*/ /*@null@*/ wiced_buffer_t* response_buffer_hnd, wwd_interface_t interface ) /*@allocates *response_buffer_hnd@*/ /*@defines **response_buffer_hnd@*/; -extern void wwd_sdpcm_process_rx_packet ( /*@only@*/ wiced_buffer_t buffer ); -extern wwd_result_t wwd_sdpcm_init ( void ); -extern void wwd_sdpcm_quit ( void ) /*@modifies internalState@*/; -extern wwd_result_t wwd_sdpcm_get_packet_to_send ( /*@out@*/ wiced_buffer_t* buffer ); -extern void wwd_sdpcm_update_credit ( uint8_t* data ); -extern uint8_t wwd_sdpcm_get_available_credits ( void ); -extern void wwd_update_host_interface_to_bss_index_mapping( wwd_interface_t interface, uint32_t bssid_index ); - - -extern void wwd_sdpcm_send_lwip(wiced_buffer_t buffer); - - -/****************************************************** - * Global variables - ******************************************************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ifndef INCLUDED_WWD_SDPCM_H */ diff --git a/components/WWD/WWD/internal/wwd_thread.c b/components/WWD/WWD/internal/wwd_thread.c deleted file mode 100644 index 3b21f9bf7255793daad738cdebcfac3f4a7943c9..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/wwd_thread.c +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Allows thread safe access to the WICED WiFi Driver (WWD) hardware bus - * - * This file provides functions which allow multiple threads to use the WWD hardware bus (SDIO or SPI) - * This is achieved by having a single thread (the "WWD Thread") which queues messages to be sent, sending - * them sequentially, as well as receiving messages as they arrive. - * - * Messages to be sent come from the @ref wwd_sdpcm_send_common function in wwd_sdpcm.c . The messages already - * contain SDPCM headers, but not any bus headers (GSPI), and are passed to the wwd_thread_send_data function. - * This function can be called from any thread. - * - * Messages are received by way of a callback supplied by in SDPCM.c - wwd_sdpcm_process_rx_packet - * Received messages are delivered in the context of the WWD Thread, so the callback function needs to avoid blocking. - * - * It is also possible to use these functions without any operating system, by periodically calling the wwd_thread_send_one_packet, - * @ref wwd_thread_receive_one_packet or @ref wwd_thread_poll_all functions - * - */ - -#include -#include "wwd_assert.h" -#include "wwd_logging.h" -#include "wwd_poll.h" -#include "wwd_rtos.h" -#include "wwd_rtos_interface.h" -#include "network/wwd_buffer_interface.h" -#include "network/wwd_network_interface.h" -#include "platform/wwd_bus_interface.h" -#include "wwd_thread.h" -#include "wwd_sdpcm.h" -#include "wwd_internal.h" -#include "bus_protocols/wwd_bus_protocol_interface.h" - -#ifdef RTOS_USE_STATIC_THREAD_STACK -static uint8_t wwd_thread_stack[WWD_THREAD_STACK_SIZE]; -#define WWD_THREAD_STACK wwd_thread_stack -#else -#ifdef RTOS_USE_DYNAMIC_THREAD_STACK -#define WWD_THREAD_STACK NULL -#else -#error RTOS_USE_STATIC_THREAD_STACK or RTOS_USE_DYNAMIC_THREAD_STACK must be defined -#endif -#endif - - -/****************************************************** - * Static Variables - ******************************************************/ - -static volatile wiced_bool_t wwd_thread_quit_flag = WICED_FALSE; -static volatile wiced_bool_t wwd_inited = WICED_FALSE; -static host_thread_type_t wwd_thread; -static host_semaphore_type_t wwd_transceive_semaphore; -static volatile wiced_bool_t wwd_bus_interrupt = WICED_FALSE; - -/****************************************************** - * Static Function Prototypes - ******************************************************/ - -static void wwd_thread_func( wwd_thread_arg_t /*@unused@*/thread_input ) /*@globals killed wwd_transceive_semaphore@*/ /*@modifies wwd_wlan_status, wwd_bus_interrupt, wwd_thread_quit_flag@*/; - -/****************************************************** - * Global Functions - ******************************************************/ - - -/** Initialises the WWD Thread - * - * Initialises the WWD thread, and its flags/semaphores, - * then starts it running - * - * @return WWD_SUCCESS : if initialisation succeeds - * otherwise, a result code - */ -wwd_result_t wwd_thread_init( void ) /*@globals undef wwd_thread, undef wwd_transceive_semaphore@*/ /*@modifies wwd_inited@*/ -{ - wwd_result_t retval; - - retval = wwd_sdpcm_init( ); - - if ( retval != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR(("Could not initialize SDPCM codec\n")); - /*@-unreachable@*/ /*@-globstate@*/ /* Lint: Reachable after hitting assert & globals not defined due to error */ - return retval; - /*@+unreachable@*/ /*@+globstate@*/ - } - - /* Create the event flag which signals the WWD thread needs to wake up */ - retval = host_rtos_init_semaphore( &wwd_transceive_semaphore ); - if ( retval != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR(("Could not initialize WWD thread semaphore\n")); - /*@-unreachable@*/ /*@-globstate@*/ /* Lint: Reachable after hitting assert & globals not defined due to error */ - return retval; - /*@+unreachable@*/ /*@+globstate@*/ - } - - retval = host_rtos_create_thread( &wwd_thread, wwd_thread_func, "WWD", WWD_THREAD_STACK, (uint32_t) WWD_THREAD_STACK_SIZE, (uint32_t) WWD_THREAD_PRIORITY ); - if ( retval != WWD_SUCCESS ) - { - /* Could not start WWD main thread */ - WPRINT_WWD_ERROR(("Could not start WWD thread\n")); - /*@-unreachable@*/ /* Reachable after hitting assert */ - return retval; - /*@+unreachable@*/ - } - - /* Ready now. Indicate it here and in thread, whatever be executed first. */ - wwd_inited = WICED_TRUE; - - return WWD_SUCCESS; -} - -/** Sends the first queued packet - * - * Checks the queue to determine if there is any packets waiting - * to be sent. If there are, then it sends the first one. - * - * This function is normally used by the WWD Thread, but can be - * called periodically by systems which have no RTOS to ensure - * packets get sent. - * - * @return 1 : packet was sent - * 0 : no packet sent - */ -int8_t wwd_thread_send_one_packet( void ) /*@modifies internalState @*/ -{ - wiced_buffer_t tmp_buf_hnd = NULL; - wwd_result_t result; - - if ( wwd_sdpcm_get_packet_to_send( &tmp_buf_hnd ) != WWD_SUCCESS ) - { - /*@-mustfreeonly@*/ /* Failed to get a packet */ - return 0; - /*@+mustfreeonly@*/ - } - - /* Ensure the wlan backplane bus is up */ - result = wwd_ensure_wlan_bus_is_up(); - if ( result != WWD_SUCCESS ) - { - wiced_assert("Could not bring bus back up", 0 != 0 ); - host_buffer_release( tmp_buf_hnd, WWD_NETWORK_TX ); - return 0; - } - - WWD_LOG(("Wcd:> Sending pkt 0x%08lX\n", (unsigned long)tmp_buf_hnd )); - if ( wwd_bus_send_buffer( tmp_buf_hnd ) != WWD_SUCCESS ) - { - return 0; - } - return (int8_t) 1; -} - -/** Receives a packet if one is waiting - * - * Checks the wifi chip fifo to determine if there is any packets waiting - * to be received. If there are, then it receives the first one, and calls - * the callback @ref wwd_sdpcm_process_rx_packet (in wwd_sdpcm.c). - * - * This function is normally used by the WWD Thread, but can be - * called periodically by systems which have no RTOS to ensure - * packets get received properly. - * - * @return 1 : packet was received - * 0 : no packet waiting - */ -int8_t wwd_thread_receive_one_packet( void ) -{ - /* Check if there is a packet ready to be received */ - wiced_buffer_t recv_buffer; - if ( wwd_bus_read_frame( &recv_buffer ) != WWD_SUCCESS) - { - /*@-mustfreeonly@*/ /* Failed to read a packet */ - return 0; - /*@+mustfreeonly@*/ - } - - if ( recv_buffer != NULL ) /* Could be null if it was only a credit update */ - { - - WWD_LOG(("Wcd:< Rcvd pkt 0x%08lX\n", (unsigned long)recv_buffer )); - - /* Send received buffer up to SDPCM layer */ - wwd_sdpcm_process_rx_packet( recv_buffer ); - } - return (int8_t) 1; -} - -/** Sends and Receives all waiting packets - * - * Calls wwd_thread_send_one_packet and wwd_thread_receive_one_packet - * once to send and receive packets, until there are no more packets waiting to - * be transferred. - * - * This function is normally used by the WWD Thread, but can be - * called periodically by systems which have no RTOS to ensure - * packets get send and received properly. - * - * Note: do not loop in here, to avoid overwriting previously rx-ed packets - */ -int8_t wwd_thread_poll_all( void ) /*@modifies internalState@*/ -{ - int8_t result = 0; - result |= wwd_thread_send_one_packet( ) ; - result |= wwd_thread_receive_one_packet( ); - return result; -} - -/** Terminates the WWD Thread - * - * Sets a flag then wakes the WWD Thread to force it to terminate. - * - */ -void wwd_thread_quit( void ) -{ - wwd_result_t result; - - /* signal main thread and wake it */ - wwd_thread_quit_flag = WICED_TRUE; - result = host_rtos_set_semaphore( &wwd_transceive_semaphore, WICED_FALSE ); - - if ( result == WWD_SUCCESS ) - { - /* Wait for the WWD thread to end */ -// host_rtos_join_thread( &wwd_thread ); - - (void) host_rtos_delete_terminated_thread( &wwd_thread ); /* Ignore return - not much can be done about failure */ - } -} - -/** - * Informs WWD of an interrupt - * - * This function should be called from the SDIO/SPI interrupt function - * and usually indicates newly received data is available. - * It wakes the WWD Thread, forcing it to check the send/receive - * - */ -void wwd_thread_notify_irq( void ) -{ - wwd_bus_interrupt = WICED_TRUE; - - /* just wake up the main thread and let it deal with the data */ - if ( wwd_inited == WICED_TRUE ) - { - (void) host_rtos_set_semaphore( &wwd_transceive_semaphore, WICED_TRUE ); /* ignore failure since there is nothing that can be done about it in a ISR */ - } -} - -void wwd_thread_notify( void ) -{ - /* just wake up the main thread and let it deal with the data */ - if ( wwd_inited == WICED_TRUE ) - { - (void) host_rtos_set_semaphore( &wwd_transceive_semaphore, WICED_FALSE ); /* Ignore return - not much can be done about failure */ - } -} - -/****************************************************** - * Static Functions - ******************************************************/ - -/** The WWD Thread function - * - * This is the main loop of the WWD Thread. - * It simply calls @ref wwd_thread_poll_all to send/receive all waiting packets, then goes - * to sleep. The sleep has a 100ms timeout, causing the send/receive queues to be - * checked 10 times per second in case an interrupt is missed. - * Once the quit flag has been set, flags/mutexes are cleaned up, and the function exits. - * - * @param thread_input : unused parameter needed to match thread prototype. - * - */ -static void wwd_thread_func( wwd_thread_arg_t /*@unused@*/thread_input ) /*@globals killed wwd_transceive_semaphore@*/ /*@modifies wwd_wlan_status, wwd_bus_interrupt, wwd_thread_quit_flag, wwd_inited, wwd_thread@*/ -{ - int8_t rx_status; - int8_t tx_status; - - UNUSED_PARAMETER(thread_input); - - WWD_LOG(("Started Wiced Thread\n")); - - /* Interrupts may be enabled inside thread. To make sure none lost set flag now. */ - wwd_inited = WICED_TRUE; - - while ( wwd_thread_quit_flag != WICED_TRUE ) - { - /* Check if we were woken by interrupt */ - if ( ( wwd_bus_interrupt == WICED_TRUE ) || - ( WWD_BUS_USE_STATUS_REPORT_SCHEME ) ) - { - wwd_bus_interrupt = WICED_FALSE; - - /* Check if the interrupt indicated there is a packet to read */ - if ( wwd_bus_packet_available_to_read( ) != 0) - { - /* Receive all available packets */ - do - { - rx_status = wwd_thread_receive_one_packet( ); - } while ( rx_status != 0 ); - } - } - - /* Send all queued packets */ - do - { - tx_status = wwd_thread_send_one_packet( ); - } - while (tx_status != 0); - - /* Sleep till WLAN do something */ - wwd_wait_for_wlan_event( &wwd_transceive_semaphore ); - WWD_LOG(("Wiced Thread: Woke\n")); - } - - /* Set flag before releasing objects */ - wwd_inited = WICED_FALSE; - - /* Reset the quit flag */ - wwd_thread_quit_flag = WICED_FALSE; - - /* Delete the semaphore */ - (void) host_rtos_deinit_semaphore( &wwd_transceive_semaphore ); /* Ignore return - not much can be done about failure */ - - wwd_sdpcm_quit( ); - - WWD_LOG(("Stopped Wiced Thread\n")); - - if ( WWD_SUCCESS != host_rtos_finish_thread( &wwd_thread ) ) - { - WPRINT_WWD_DEBUG(("Could not close WWD thread\n")); - } -} - diff --git a/components/WWD/WWD/internal/wwd_thread.h b/components/WWD/WWD/internal/wwd_thread.h deleted file mode 100644 index 5bed55faa622e7fa0a8c7ad9c9476c09711d30f8..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/wwd_thread.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * The Wiced Thread allows thread safe access to the Wiced hardware bus - * This is an Wiced internal file and should not be used by functions outside Wiced. - * - * This file provides prototypes for functions which allow multiple threads to use the Wiced hardware bus (SDIO or SPI) - * This is achieved by having a single thread (the "Wiced Thread") which queues messages to be sent, sending - * them sequentially, as well as receiving messages as they arrive. - * - * Messages to be sent come from the @ref wwd_sdpcm_send_common function in wwd_sdpcm.c . The messages already - * contain SDPCM headers, but not any bus headers (GSPI), and are passed via a queue - * This function can be called from any thread. - * - * Messages are received by way of a callback supplied by in wwd_sdpcm.c - wwd_sdpcm_process_rx_packet - * Received messages are delivered in the context of the Wiced Thread, so the callback function needs to avoid blocking. - * - */ - -#ifndef INCLUDED_WWD_THREAD_H_ -#define INCLUDED_WWD_THREAD_H_ - -#include "wwd_buffer.h" -#include "wwd_constants.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define WWD_THREAD_PRIORITY RTOS_DEFAULT_THREAD_PRIORITY - -/** Initialises the Wiced Thread - * - * Initialises the Wiced thread, and its flags/semaphores, - * then starts it running - * - * @return wiced result code - */ -extern wwd_result_t wwd_thread_init( void ) /*@modifies internalState@*/; - - -/** Terminates the Wiced Thread - * - * Sets a flag then wakes the Wiced Thread to force it to terminate. - * - */ -extern void wwd_thread_quit( void ); - - -extern void wwd_thread_notify( void ); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ifndef INCLUDED_WWD_THREAD_H_ */ diff --git a/components/WWD/WWD/internal/wwd_thread_internal.c b/components/WWD/WWD/internal/wwd_thread_internal.c deleted file mode 100644 index caf0c3b917b1ea20785be9d043eabe8489e1367c..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/wwd_thread_internal.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -#include "wwd_rtos.h" -#include "wwd_assert.h" -#include "internal/wwd_sdpcm.h" -#include "internal/wwd_internal.h" -#include "internal/bus_protocols/wwd_bus_protocol_interface.h" -#include "RTOS/wwd_rtos_interface.h" -#include "platform_toolchain.h" - -/****************************************************** - * Macros - ******************************************************/ - -#ifndef WWD_THREAD_POLL_TIMEOUT -#define WWD_THREAD_POLL_TIMEOUT (NEVER_TIMEOUT) -#endif - -#ifndef WWD_THREAD_POKE_TIMEOUT -#define WWD_THREAD_POKE_TIMEOUT (100) -#endif - -/****************************************************** - * Global Functions - ******************************************************/ - -__weak void wwd_wait_for_wlan_event( host_semaphore_type_t* transceive_semaphore ) -{ - wwd_result_t result = WWD_SUCCESS; - - REFERENCE_DEBUG_ONLY_VARIABLE( result ); - - /* Check if we have run out of bus credits */ - if ( wwd_sdpcm_get_available_credits( ) == 0 ) - { - /* Keep poking the WLAN until it gives us more credits */ - result = wwd_bus_poke_wlan( ); - wiced_assert( "Poking failed!", result == WWD_SUCCESS ); - - result = host_rtos_get_semaphore( transceive_semaphore, (uint32_t) WWD_THREAD_POKE_TIMEOUT, WICED_FALSE ); - } - else - { - /* Put the bus to sleep and wait for something else to do */ -// if ( WWD_WLAN_MAY_SLEEP( ) ) -// { -// result = wwd_allow_wlan_bus_to_sleep( ); -// wiced_assert( "Error setting wlan sleep", result == WWD_SUCCESS ); -// } - result = host_rtos_get_semaphore( transceive_semaphore, (uint32_t) WWD_THREAD_POLL_TIMEOUT, WICED_FALSE ); - } - wiced_assert("Could not get wwd sleep semaphore\n", (result == WWD_SUCCESS)||(result == WWD_TIMEOUT) ); -} diff --git a/components/WWD/WWD/internal/wwd_thread_internal.h b/components/WWD/WWD/internal/wwd_thread_internal.h deleted file mode 100644 index 9b910e4e9cf28bbe6d3fb0be17619c30277cecbc..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/wwd_thread_internal.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -#ifndef INCLUDED_WWD_THREAD_INTERNAL_H -#define INCLUDED_WWD_THREAD_INTERNAL_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include "wwd_assert.h" -/****************************************************** - * Macros - ******************************************************/ - -#define WWD_WLAN_KEEP_AWAKE() \ - do { \ - wwd_result_t verify_result; \ - wwd_wlan_status.keep_wlan_awake++; \ - verify_result = wwd_ensure_wlan_bus_is_up( ); \ - wiced_assert( "Could not bring bus up", ( verify_result == WWD_SUCCESS )); \ - } while (0) -#define WWD_WLAN_LET_SLEEP() \ - do { \ - wwd_wlan_status.keep_wlan_awake--; \ - if ( wwd_wlan_status.keep_wlan_awake == 0 ) \ - wwd_thread_notify( ); \ - } while (0) -#define WWD_WLAN_MAY_SLEEP() \ - ( ( wwd_wlan_status.keep_wlan_awake == 0 ) && ( wwd_wlan_status.state == WLAN_UP ) ) - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ifndef INCLUDED_WWD_THREAD_INTERNAL_H */ diff --git a/components/WWD/WWD/internal/wwd_wifi.c b/components/WWD/WWD/internal/wwd_wifi.c deleted file mode 100644 index 6df69ea0e90e14ee2a37d981fc3b40325fc36493..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/internal/wwd_wifi.c +++ /dev/null @@ -1,4851 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Implements user functions for controlling the Wi-Fi system - * - * This file provides end-user functions which allow actions such as scanning for - * Wi-Fi networks, joining Wi-Fi networks, getting the MAC address, etc - * - */ - -#include /* For strlen, stricmp, memcpy. memset */ -#include -#include "wwd_management.h" -#include "wwd_wifi.h" -#include "wwd_assert.h" -#include "wwd_wlioctl.h" -#include "wwd_debug.h" -#include "platform/wwd_platform_interface.h" -#include "network/wwd_buffer_interface.h" -#include "network/wwd_network_constants.h" -#include "wwd_rtos_interface.h" -#include "wwd_sdpcm.h" -#include "wwd_bcmendian.h" -#include "wwd_ap.h" -#include "wwd_internal.h" -#include "wwd_bus_protocol.h" -#include "wiced_utilities.h" -//#include "wiced_deep_sleep.h" -#include "wwd_events.h" - - -#include "tlv.h" -/****************************************************** - * @cond Constants - ******************************************************/ - -/* These are the flags in the BSS Capability Information field as defined in section 7.3.1.4 of IEEE Std 802.11-2007 */ -#define DOT11_CAP_ESS (0x0001) /** Extended service set capability */ -#define DOT11_CAP_IBSS (0x0002) /** Ad-hoc capability (Independent Basic Service Set) */ -#define DOT11_CAP_PRIVACY (0x0010) /** Privacy subfield - indicates data confidentiality is required for all data frames exchanged */ -#define WL_CHANSPEC_CHAN_MASK (0x00ff) -#define LEGACY_WL_BSS_INFO_VERSION (107) /** older version of wl_bss_info struct */ - -#define WICED_CREDENTIAL_TEST_TIMEOUT (1500) - -#define WPA_OUI_TYPE1 "\x00\x50\xF2\x01" /** WPA OUI */ - -#define MAX_SUPPORTED_MCAST_ENTRIES (10) - -#define WLC_EVENT_MSG_LINK (0x01) - -#define JOIN_ASSOCIATED (uint32_t)(1 << 0) -#define JOIN_AUTHENTICATED (uint32_t)(1 << 1) -#define JOIN_LINK_READY (uint32_t)(1 << 2) -#define JOIN_SECURITY_COMPLETE (uint32_t)(1 << 3) -#define JOIN_SSID_SET (uint32_t)(1 << 4) -#define JOIN_NO_NETWORKS (uint32_t)(1 << 5) -#define JOIN_EAPOL_KEY_M1_TIMEOUT (uint32_t)(1 << 6) -#define JOIN_EAPOL_KEY_M3_TIMEOUT (uint32_t)(1 << 7) -#define JOIN_EAPOL_KEY_G1_TIMEOUT (uint32_t)(1 << 8) -#define JOIN_EAPOL_KEY_FAILURE (uint32_t)(1 << 9) - -#define DEFAULT_JOIN_ATTEMPT_TIMEOUT (7000) /* Overall join attempt timeout in milliseconds. */ -#define DEFAULT_EAPOL_KEY_PACKET_TIMEOUT (2500) /* Timeout when waiting for EAPOL key packet M1 or M3 in milliseconds. Some APs may be slow to provide M1 and 1000 ms is not long enough for edge of cell. */ - -#ifndef DEFAULT_PM2_SLEEP_RET_TIME -#define DEFAULT_PM2_SLEEP_RET_TIME (40) -#endif - -#define NULL_FRAMES_WITH_PM_SET_LIMIT ( 100 ) - -#define VALID_SECURITY_MASK 0x00FFFFFF - -#define CHECK_IOCTL_BUFFER( buff ) if ( buff == NULL ) { wiced_assert("Allocation failed\n", 0 == 1); return WWD_BUFFER_ALLOC_FAIL; } -#define CHECK_RETURN( expr ) { wwd_result_t check_res = (expr); if ( check_res != WWD_SUCCESS ) { wiced_assert("Command failed\n", 0 == 1); return check_res; } } -#define CHECK_RETURN_UNSUPPORTED_OK( expr ) { wwd_result_t check_res = (expr); if ( check_res != WWD_SUCCESS ) { wiced_assert("Command failed\n", check_res == WWD_WLAN_UNSUPPORTED); return check_res; } } -#define CHECK_RETURN_UNSUPPORTED_CONTINUE( expr ) { wwd_result_t check_res = (expr); if ( check_res != WWD_SUCCESS && check_res != WWD_WLAN_UNSUPPORTED ) { wiced_assert("Command failed\n", 0 == 1); return check_res; } } -#define RETURN_WITH_ASSERT( expr ) { wwd_result_t check_res = (expr); wiced_assert("Command failed\n", check_res == WWD_SUCCESS ); return check_res; } - -#define PACKET_FILTER_LIST_BUFFER_MAX_LEN ( WICED_LINK_MTU - sizeof(IOVAR_STR_PKT_FILTER_LIST) - IOCTL_OFFSET ) - -#define RSPEC_KBPS_MASK (0x7f) -#define RSPEC_500KBPS( rate ) ((rate) & RSPEC_KBPS_MASK) -#define RSPEC_TO_KBPS( rate ) (RSPEC_500KBPS((rate)) * (unsigned int) 500) - -#define OTP_WORD_SIZE 16 /* Word size in bits */ - -/** @endcond */ - -/****************************************************** - * Local Structures - ******************************************************/ - -#pragma pack(1) - -typedef struct -{ - uint32_t entry_count; - wiced_mac_t macs[1]; -} mcast_list_t; - -typedef struct -{ - uint32_t cfg; - uint32_t val; -} bss_setbuf_t; - -typedef struct -{ - int32_t value; - wiced_mac_t mac_address; -} client_rssi_t; - -typedef struct -{ - wiced_security_t security; - int32_t auth_algo; - int32_t wpa_auth; - int32_t wsec; -} wwd_security_to_auth_wsec_map_t; - -#pragma pack() - -/****************************************************** - * Static Variables - ******************************************************/ - -static wiced_scan_result_callback_t scan_result_callback = NULL; -static wiced_scan_result_t** wwd_scan_result_ptr = NULL; -static wwd_interface_t wiced_cached_mac_interface = WWD_INTERFACE_MAX; -static wiced_mac_t wiced_cached_mac ; -static uint32_t wiced_join_status[WWD_INTERFACE_MAX] ; - -/* LOOK: !!!When adding events below, please modify wwd_event_to_string!!! */ -const wwd_event_num_t join_events[] = { WLC_E_SET_SSID, WLC_E_LINK, WLC_E_AUTH, WLC_E_DEAUTH_IND, WLC_E_DISASSOC_IND, WLC_E_PSK_SUP, WLC_E_CSA_COMPLETE_IND, WLC_E_NONE }; -static const wwd_event_num_t scan_events[] = { WLC_E_ESCAN_RESULT, WLC_E_PFN_NET_FOUND, WLC_E_NONE }; -static const wwd_event_num_t rrm_events[] = { WLC_E_RRM, WLC_E_NONE }; - -static uint8_t wiced_wifi_powersave_mode = NO_POWERSAVE_MODE; -static uint16_t wiced_wifi_return_to_sleep_delay; - -/* Note: monitor_mode_enabled variable is accessed by SDPCM */ -static wiced_bool_t wwd_sdpcm_monitor_mode_enabled = WICED_FALSE; - -wiced_bool_t wwd_wifi_p2p_go_is_up = WICED_FALSE; - -/* Values are in 100's of Kbit/sec (1 = 100Kbit/s). Arranged as: - * [Bit index] - * [0] = 20Mhz only - * [0] = Long GI - * [1] = Short GI - * [1] = 40MHz support - * [0] = Long GI - * [1] = Short GI - */ -static const uint16_t mcs_data_rate_lookup_table[32][2][2] = -{ - [0 ] = { { 65 , 72 }, { 135 , 150 } }, - [1 ] = { { 130 , 144 }, { 270 , 300 } }, - [2 ] = { { 195 , 217 }, { 405 , 450 } }, - [3 ] = { { 260 , 289 }, { 540 , 600 } }, - [4 ] = { { 390 , 433 }, { 810 , 900 } }, - [5 ] = { { 520 , 578 }, { 1080, 1200} }, - [6 ] = { { 585 , 650 }, { 1215, 1350} }, - [7 ] = { { 650 , 722 }, { 1350, 1500} }, - [8 ] = { { 130 , 144 }, { 270 , 300 } }, - [9 ] = { { 260 , 289 }, { 540 , 600 } }, - [10] = { { 390 , 433 }, { 810 , 900 } }, - [11] = { { 520 , 578 }, { 1080, 1200} }, - [12] = { { 780 , 867 }, { 1620, 1800} }, - [13] = { { 1040, 1156}, { 2160, 2400} }, - [14] = { { 1170, 1300}, { 2430, 2700} }, - [15] = { { 1300, 1444}, { 2700, 3000} }, - [16] = { { 195 , 217 }, { 405 , 450 } }, - [17] = { { 390 , 433 }, { 810 , 900 } }, - [18] = { { 585 , 650 }, { 1215, 1350} }, - [19] = { { 780 , 867 }, { 1620, 1800} }, - [20] = { { 1170, 1300}, { 2430, 2700} }, - [21] = { { 1560, 1733}, { 3240, 3600} }, - [22] = { { 1755, 1950}, { 3645, 4050} }, - [23] = { { 1950, 2167}, { 4050, 4500} }, - [24] = { { 260 , 288 }, { 540 , 600 } }, - [25] = { { 520 , 576 }, { 1080, 1200} }, - [26] = { { 780 , 868 }, { 1620, 1800} }, - [27] = { { 1040, 1156}, { 2160, 2400} }, - [28] = { { 1560, 1732}, { 3240, 3600} }, - [29] = { { 2080, 2312}, { 4320, 4800} }, - [30] = { { 2340, 2600}, { 4860, 5400} }, - [31] = { { 2600, 2888}, { 5400, 6000} }, -}; - -/* Note that the qos_map is accessed by SDPCM */ -uint8_t wwd_tos_map[8] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }; - -/****************************************************** - * Static Function prototypes - ******************************************************/ -static inline /*@null@*/ tlv8_header_t* wlu_parse_tlvs ( const tlv8_header_t* tlv_buf, uint32_t buflen, dot11_ie_id_t key ); -static wiced_bool_t wlu_is_wpa_ie ( vendor_specific_ie_header_t* wpaie, tlv8_header_t** tlvs, uint32_t* tlvs_len ); -static /*@null@*/ void* wiced_join_events_handler ( const wwd_event_header_t* event_header, const uint8_t* event_data, /*@returned@*/ void* handler_user_data ); -static void* wwd_scan_events_handler ( const wwd_event_header_t* event_header, const uint8_t* event_data, /*@returned@*/ void* handler_user_data ); -static wwd_result_t wwd_wifi_prepare_join ( wwd_interface_t interface, wiced_security_t security, /*@unique@*/ const uint8_t* security_key, uint8_t key_length, host_semaphore_type_t* semaphore ); -static wwd_result_t wwd_wifi_get_packet_filters_inner ( uint32_t max_count, uint32_t offset, wiced_packet_filter_t* list, wiced_bool_t enabled_list, uint32_t* count_out ); -static wwd_result_t wwd_wifi_set_band_specific_rate ( wwd_interface_t interface, uint32_t rate ); -static wwd_result_t wwd_wifi_check_join_status ( wwd_interface_t interface ); -static tlv8_header_t* wwd_parse_dot11_tlvs ( const tlv8_header_t* tlv_buf, uint32_t buflen, dot11_ie_id_t key ); -static wwd_result_t wwd_wifi_set_iovar_buffer( const char* iovar, void *buffer, uint16_t buffer_length, wwd_interface_t interface ); -static wwd_result_t wwd_wifi_set_iovar_void( const char* iovar, wwd_interface_t interface ); -static wwd_result_t wwd_wifi_pno_set_enable( wiced_bool_t enable ); -/****************************************************** - * Debug helper functionality - ******************************************************/ -#ifdef WPRINT_ENABLE_WWD_DEBUG -static const char* wwd_event_to_string (wwd_event_num_t var); -static char* wwd_ssid_to_string (uint8_t *value, uint8_t length, char *ssid_buf, uint8_t ssid_buf_len); -static const char* wwd_status_to_string (wwd_event_status_t status); -static const char* wwd_reason_to_string (wwd_event_reason_t reason); -static const char* wwd_interface_to_string (wwd_interface_t interface); -#endif /* ifdef WPRINT_ENABLE_WWD_DEBUG */ - - -/****************************************************** - * Function definitions - ******************************************************/ - -/* - * NOTE: search references of function wlu_get in wl/exe/wlu.c to find what format the returned IOCTL data is. - */ - -wwd_result_t wwd_wifi_scan( wiced_scan_type_t scan_type, - wiced_bss_type_t bss_type, - /*@null@*/ const wiced_ssid_t* optional_ssid, - /*@null@*/ const wiced_mac_t* optional_mac, - /*@null@*/ /*@unique@*/ const uint16_t* optional_channel_list, - /*@null@*/ const wiced_scan_extended_params_t* optional_extended_params, - wiced_scan_result_callback_t callback, - wiced_scan_result_t** result_ptr, - /*@null@*/ void* user_data, - wwd_interface_t interface - ) -{ - wiced_buffer_t buffer; - wl_escan_params_t* scan_params; - wwd_result_t retval; - uint16_t param_size = offsetof( wl_escan_params_t, params ) + WL_SCAN_PARAMS_FIXED_SIZE; - uint16_t channel_list_size = 0; - - wiced_assert("Bad args", callback != NULL); - - /* Determine size of channel_list, and add it to the parameter size so correct sized buffer can be allocated */ - if ( optional_channel_list != NULL ) - { - /* Look for entry with channel number 0, which suggests the end of channel_list */ - for ( channel_list_size = 0; optional_channel_list[channel_list_size] != 0; channel_list_size++ ) - { - } - param_size = (uint16_t) ( param_size + channel_list_size * sizeof(uint16_t) ); - } - - CHECK_RETURN( wwd_management_set_event_handler( scan_events, wwd_scan_events_handler, user_data, interface ) ); - - if ( scan_type == WICED_SCAN_TYPE_PNO ) - { - scan_result_callback = callback; - wwd_scan_result_ptr = result_ptr; - - return wwd_wifi_pno_start( ); - } - - /* Allocate a buffer for the IOCTL message */ - scan_params = (wl_escan_params_t*) wwd_sdpcm_get_iovar_buffer( &buffer, param_size, IOVAR_STR_ESCAN ); - CHECK_IOCTL_BUFFER( scan_params ); - - /* Clear the scan parameters structure */ - memset( scan_params, 0, sizeof(wl_escan_params_t) ); - - /* Fill in the appropriate details of the scan parameters structure */ - scan_params->version = htod32(ESCAN_REQ_VERSION); - scan_params->action = htod16(WL_SCAN_ACTION_START); - scan_params->params.scan_type = (int8_t) scan_type; - scan_params->params.bss_type = (int8_t) bss_type; - - /* Fill out the SSID parameter if provided */ - if ( optional_ssid != NULL ) - { - scan_params->params.ssid.SSID_len = optional_ssid->length; - memcpy( scan_params->params.ssid.SSID, optional_ssid->value, scan_params->params.ssid.SSID_len ); - } - - /* Fill out the BSSID parameter if provided */ - if ( optional_mac != NULL ) - { - memcpy( scan_params->params.bssid.octet, optional_mac, sizeof(wiced_mac_t) ); - } - else - { - memset( scan_params->params.bssid.octet, 0xff, sizeof(wiced_mac_t) ); - } - - /* Fill out the extended parameters if provided */ - if ( optional_extended_params != NULL ) - { - scan_params->params.nprobes = optional_extended_params->number_of_probes_per_channel; - scan_params->params.active_time = optional_extended_params->scan_active_dwell_time_per_channel_ms; - scan_params->params.passive_time = optional_extended_params->scan_passive_dwell_time_per_channel_ms; - scan_params->params.home_time = optional_extended_params->scan_home_channel_dwell_time_between_channels_ms; - } - else - { - scan_params->params.nprobes = (int32_t) -1; - scan_params->params.active_time = (int32_t) -1; - scan_params->params.passive_time = (int32_t) -1; - scan_params->params.home_time = (int32_t) -1; - } - - /* Copy the channel list parameter if provided */ - if ( ( channel_list_size > 0 ) && ( optional_channel_list != NULL ) ) - { - memcpy( scan_params->params.channel_list, optional_channel_list, channel_list_size * sizeof(uint16_t) ); - scan_params->params.channel_num = (int32_t) channel_list_size; - } - - scan_result_callback = callback; - wwd_scan_result_ptr = result_ptr; - - /* Send the Incremental Scan IOVAR message - blocks until the response is received */ - retval = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, interface ); - - /* Return the success of the IOCTL */ - return retval; -} - - -wwd_result_t wwd_wifi_abort_scan( void ) -{ - wiced_buffer_t buffer; - wl_escan_params_t* scan_params; - wwd_result_t result; - - /* Allocate a buffer for the IOCTL message */ - scan_params = (wl_escan_params_t*) wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(wl_escan_params_t), IOVAR_STR_ESCAN ); - CHECK_IOCTL_BUFFER( scan_params ); - - /* Clear the scan parameters structure */ - memset( scan_params, 0, sizeof(wl_escan_params_t) ); - - /* Fill in the appropriate details of the scan parameters structure */ - scan_params->version = ESCAN_REQ_VERSION; - scan_params->action = WL_SCAN_ACTION_ABORT; - - /* Send the Scan IOVAR message to abort scan*/ - result = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ); - - return result; -} - -/** Handles scan result events - * - * This function receives scan record events, and parses them into a better format, then passes the results - * to the user application. - * - * @param event_header : The event details - * @param event_data : The data for the event which contains the scan result structure - * @param handler_user_data: data which will be passed to user application - * - * @returns : handler_user_data parameter - * - */ -static void* wwd_scan_events_handler( const wwd_event_header_t* event_header, const uint8_t* event_data, /*@returned@*/ void* handler_user_data ) -{ - wiced_scan_result_t* record; - wl_escan_result_t* eresult; - wl_bss_info_t* bss_info; - uint16_t chanspec; - uint32_t version; - tlv8_header_t* cp; - uint32_t len; - uint16_t ie_offset; - uint32_t bss_info_length; - rsn_ie_fixed_portion_t* rsnie; - wpa_ie_fixed_portion_t* wpaie = NULL; - uint8_t rate_num; - dsss_parameter_set_ie_t* dsie = NULL; - ht_capabilities_ie_t* ht_capabilities_ie = NULL; - ht_operation_ie_t* ht_operation_ie = NULL; - uint32_t count_tmp = 0; - uint16_t temp16; - uint16_t bss_count; - wl_pfn_scanresult_t* pfn_result = NULL; - wl_pfn_net_info_t* pfn_net_info = NULL; - wl_pfn_subnet_info_t* pfn_subnet = NULL; - - if ( scan_result_callback == NULL ) - { - return handler_user_data; - } - - record = (wiced_scan_result_t*) ( *wwd_scan_result_ptr ); - - /* process the pfn net found */ - if ( event_header->event_type == WLC_E_PFN_NET_FOUND ) - { - if ( record == NULL ) - { - scan_result_callback( (wiced_scan_result_t**)event_data, handler_user_data, WICED_SCAN_INCOMPLETE ); - return handler_user_data; - } - - - pfn_result = (wl_pfn_scanresult_t *)event_data; - pfn_subnet = &pfn_result->netinfo.pfnsubnet; - pfn_net_info = &pfn_result->netinfo; - - /* Firmware needs to be patched to allow returning the bss info in the result, if we want full scan results from PNO. - * As the supported use case doesn't require that, leaving as-is to reduce memory usage here and in FW. - */ - record->SSID.length = pfn_subnet->SSID_len; - memset( record->SSID.value, 0, sizeof(record->SSID.value) ); - memcpy( record->SSID.value, pfn_subnet->SSID, pfn_subnet->SSID_len ); - memcpy( record->BSSID.octet, pfn_subnet->BSSID.octet, sizeof(record->BSSID.octet) ); - record->signal_strength = pfn_net_info->RSSI; - record->bss_type = WICED_BSS_TYPE_INFRASTRUCTURE; - record->channel = pfn_subnet->channel; - record->band = ( wwd_channel_to_wl_band( record->channel ) == (uint16_t) WL_CHANSPEC_BAND_2G ) ? WICED_802_11_BAND_2_4GHZ : WICED_802_11_BAND_5GHZ;; - record->on_channel = WICED_TRUE; - - /* For PNO, the user has already specified security to look for; Wiced layer will update this from recorded data */ - record->security = WICED_SECURITY_UNKNOWN; - - /* event header status checks don't make sense for pno events - * Also, firmware isn't passing up valid data in the bss_info field, so fill out and return what we have - */ - scan_result_callback( wwd_scan_result_ptr, handler_user_data, WICED_SCAN_INCOMPLETE ); - return handler_user_data; - } - - if ( event_header->status == WLC_E_STATUS_SUCCESS) - { - scan_result_callback( NULL, handler_user_data, WICED_SCAN_COMPLETED_SUCCESSFULLY ); - scan_result_callback = NULL; - return handler_user_data; - } - if ( event_header->status == WLC_E_STATUS_NEWSCAN || - event_header->status == WLC_E_STATUS_NEWASSOC || - event_header->status == WLC_E_STATUS_ABORT ) - { - scan_result_callback( NULL, handler_user_data, WICED_SCAN_ABORTED ); - scan_result_callback = NULL; - return handler_user_data; - } - - if ( event_header->status != WLC_E_STATUS_PARTIAL ) - { - return handler_user_data; - } - - eresult = (wl_escan_result_t*) event_data; - bss_info = &eresult->bss_info[0]; - bss_count = eresult->bss_count; - - version = WICED_READ_32( &bss_info->version ); - wiced_minor_assert( "wl_bss_info_t has wrong version", version == WL_BSS_INFO_VERSION ); - - - if ( wwd_scan_result_ptr == NULL ) - { - scan_result_callback( (wiced_scan_result_t**)event_data, handler_user_data, WICED_SCAN_INCOMPLETE ); - return handler_user_data; - } - - /* PNO bss info doesn't contain the correct bss info version */ - if ( version != WL_BSS_INFO_VERSION ) - { - wiced_minor_assert( "Invalid bss_info version returned by firmware\n", version != WL_BSS_INFO_VERSION ); - - return handler_user_data; - } - - wiced_minor_assert( "More than one result returned by firmware", bss_count == 1 ); - if ( bss_count != 1 ) - { - return handler_user_data; - } - - /* Copy the SSID into the output record structure */ - record->SSID.length = (uint8_t) MIN(sizeof(record->SSID.value), bss_info->SSID_len); - memset( record->SSID.value, 0, sizeof(record->SSID.value) ); - memcpy( record->SSID.value, bss_info->SSID, record->SSID.length ); - - /* Copy the BSSID into the output record structure */ - memcpy( (void*) record->BSSID.octet, (const void*) bss_info->BSSID.octet, sizeof(bss_info->BSSID.octet) ); - - /* Copy the RSSI into the output record structure */ - record->signal_strength = (int16_t)(WICED_READ_16(&bss_info->RSSI)); - record->on_channel = WICED_TRUE; - - /* Find maximum data rate and put it in the output record structure */ - record->max_data_rate = 0; - count_tmp = WICED_READ_32(&bss_info->rateset.count); - if ( count_tmp > 16 ) - { - count_tmp = 16; - } - -#ifdef WPRINT_ENABLE_WWD_DEBUG - /* print out scan results info */ - { - char ea_buf[WICED_ETHER_ADDR_STR_LEN]; - char ssid_buf[SSID_NAME_SIZE + 1]; - - WPRINT_WWD_DEBUG(("Scan result: channel=%d signal=%d ssid=%s bssid=%s\n", record->channel, record->signal_strength, - wwd_ssid_to_string(record->SSID.value, record->SSID.length, ssid_buf, (uint8_t)sizeof(ssid_buf)), - wiced_ether_ntoa(( const uint8_t * ) bss_info->BSSID.octet, ea_buf, sizeof( ea_buf )))); - } -#endif /* WPRINT_ENABLE_WWD_DEBUG */ - - for ( rate_num = 0; rate_num < count_tmp; rate_num++ ) - { - uint32_t rate = RSPEC_TO_KBPS( bss_info->rateset.rates[rate_num] ); - if ( record->max_data_rate < rate ) - { - record->max_data_rate = rate; - } - } - - /* Write the BSS type into the output record structure */ - record->bss_type = ( ( bss_info->capability & DOT11_CAP_ESS ) != 0 ) ? WICED_BSS_TYPE_INFRASTRUCTURE : - ( ( bss_info->capability & DOT11_CAP_IBSS ) != 0 ) ? WICED_BSS_TYPE_ADHOC : - WICED_BSS_TYPE_UNKNOWN; - - /* Determine the network security. - * Some of this section has been copied from the standard broadcom host driver file wl/exe/wlu.c function wl_dump_wpa_rsn_ies - */ - - ie_offset = WICED_READ_16(&bss_info->ie_offset); - cp = (tlv8_header_t*) ( ( (uint8_t*) bss_info ) + ie_offset ); - len = WICED_READ_32(&bss_info->ie_length); - bss_info_length = WICED_READ_32(&bss_info->length); - - /* Validate the length of the IE section */ - if ( ( ie_offset > bss_info_length ) || - ( len > bss_info_length - ie_offset ) ) - { - wiced_minor_assert( "Invalid ie length", 1 == 0 ); - return handler_user_data; - } - - /* Find an RSN IE (Robust-Security-Network Information-Element) */ - rsnie = (rsn_ie_fixed_portion_t*) wwd_parse_dot11_tlvs( cp, len, DOT11_IE_ID_RSN ); - - /* Find a WPA IE */ - if ( rsnie == NULL ) - { - tlv8_header_t* parse = cp; - uint32_t parse_len = len; - while ( ( wpaie = (wpa_ie_fixed_portion_t*) wlu_parse_tlvs( parse, parse_len, DOT11_IE_ID_VENDOR_SPECIFIC ) ) != 0 ) - { - if ( wlu_is_wpa_ie( (vendor_specific_ie_header_t*) wpaie, &parse, &parse_len ) != WICED_FALSE ) - { - break; - } - } - } - - temp16 = WICED_READ_16(&bss_info->capability); - - /* Check if AP is configured for WPA2 */ - if ( ( rsnie != NULL ) && - ( rsnie->tlv_header.length >= RSN_IE_MINIMUM_LENGTH + rsnie->pairwise_suite_count * sizeof(uint32_t) ) ) - { - uint16_t a; - uint32_t group_key_suite; - record->security = (wiced_security_t)WPA2_SECURITY; - - group_key_suite = NTOH32( rsnie->group_key_suite ) & 0xFF; - /* Check the RSN contents to see if there are any references to TKIP cipher (2) in the group key or pairwise keys. If so it must be mixed mode. */ - if ( group_key_suite == (uint32_t) WICED_CIPHER_TKIP ) - { - record->security |= TKIP_ENABLED; - } - if ( group_key_suite == (uint32_t) WICED_CIPHER_CCMP_128 ) - { - record->security |= AES_ENABLED; - } - - for ( a = 0; a < rsnie->pairwise_suite_count; ++a ) - { - uint32_t pairwise_suite_list_item = NTOH32( rsnie->pairwise_suite_list[a] ) & 0xFF; - if ( pairwise_suite_list_item == (uint32_t) WICED_CIPHER_TKIP ) - { - record->security |= TKIP_ENABLED; - } - - if ( pairwise_suite_list_item == (uint32_t) WICED_CIPHER_CCMP_128 ) - { - record->security |= AES_ENABLED; - } - } - - if (record->security == WPA2_SECURITY) - { - record->security = WICED_SECURITY_UNKNOWN; - } - else - { - akm_suite_portion_t* akm_suites; - akm_suites = (akm_suite_portion_t*) &(rsnie->pairwise_suite_list[rsnie->pairwise_suite_count]); - for ( a = 0; a < akm_suites->akm_suite_count; ++a ) - { - uint32_t akm_suite_list_item = NTOH32(akm_suites->akm_suite_list[a]) & 0xFF; - if ( akm_suite_list_item == (uint32_t) WICED_AKM_8021X ) - { - record->security |= ENTERPRISE_ENABLED; - } - } - } - } - /* Check if AP is configured for WPA */ - else if ( ( wpaie != NULL ) && - ( wpaie->vendor_specific_header.tlv_header.length >= WPA_IE_MINIMUM_LENGTH + wpaie->unicast_suite_count * sizeof(uint32_t) ) ) - { - uint16_t a; - uint32_t group_key_suite; - akm_suite_portion_t* akm_suites; - - record->security = (wiced_security_t) WPA_SECURITY; - group_key_suite = NTOH32( wpaie->multicast_suite ) & 0xFF; - if ( group_key_suite == (uint32_t) WICED_CIPHER_TKIP ) - { - record->security |= TKIP_ENABLED; - } - if ( group_key_suite == (uint32_t) WICED_CIPHER_CCMP_128 ) - { - record->security |= AES_ENABLED; - } - - akm_suites = (akm_suite_portion_t*) &(wpaie->unicast_suite_list[wpaie->unicast_suite_count]); - for ( a = 0; a < akm_suites->akm_suite_count; ++a ) - { - uint32_t akm_suite_list_item = NTOH32(akm_suites->akm_suite_list[a]) & 0xFF; - if ( akm_suite_list_item == (uint32_t) WICED_AKM_8021X ) - { - record->security |= ENTERPRISE_ENABLED; - } - } - - for ( a = 0; a < wpaie->unicast_suite_count; ++a ) - { - if ( wpaie->unicast_suite_list[a][3] == (uint32_t) WICED_CIPHER_CCMP_128 ) - { - record->security |= AES_ENABLED; - } - } - } - /* Check if AP is configured for WEP, that is, if the capabilities field indicates privacy, then security supports WEP */ - else if ( ( temp16 & DOT11_CAP_PRIVACY ) != 0 ) - { - record->security = WICED_SECURITY_WEP_PSK; - } - else - { - /* Otherwise no security */ - record->security = WICED_SECURITY_OPEN; - } - - /* Update the maximum data rate with 11n rates from the HT Capabilities IE */ - ht_capabilities_ie = (ht_capabilities_ie_t*)wlu_parse_tlvs( cp, len, DOT11_IE_ID_HT_CAPABILITIES ); - if ( ( ht_capabilities_ie != NULL ) && - ( ht_capabilities_ie->tlv_header.length == HT_CAPABILITIES_IE_LENGTH ) ) - { - uint8_t a; - uint8_t supports_40mhz = ( ht_capabilities_ie->ht_capabilities_info & HT_CAPABILITIES_INFO_SUPPORTED_CHANNEL_WIDTH_SET ) != 0 ? 1 : 0; - uint8_t short_gi[2] = { ( ht_capabilities_ie->ht_capabilities_info & HT_CAPABILITIES_INFO_SHORT_GI_FOR_20MHZ ) != 0 ? 1 : 0, - ( ht_capabilities_ie->ht_capabilities_info & HT_CAPABILITIES_INFO_SHORT_GI_FOR_40MHZ ) != 0 ? 1 : 0 }; - - /* Find highest bit from MCS info */ - for (a = 31; a != 0xFF; --a) - { - if ( ( ht_capabilities_ie->rx_mcs[a / 8] & ( 1 << ( a % 8 ) )) != 0 ) - { - break; - } - } - if (a != 0xFF) - { - record->max_data_rate = (uint32_t)( 100UL * mcs_data_rate_lookup_table[a][supports_40mhz][short_gi[supports_40mhz]] ); - } - } - - /* Get the channel */ - chanspec = WICED_READ_16( &bss_info->chanspec ); - record->channel = ( (uint8_t) ( chanspec & WL_CHANSPEC_CHAN_MASK ) ); - - /* In 2.4 GHz the radio firmware may report off channel probe responses. Parse the response to check if it is on or off the AP operating channel. */ - dsie = (dsss_parameter_set_ie_t*) wlu_parse_tlvs( cp, len, DOT11_IE_ID_DSSS_PARAMETER_SET ); - if ( ( dsie != NULL ) && - ( dsie->length == DSSS_PARAMETER_SET_LENGTH ) && - ( record->channel != dsie->current_channel ) ) - { - /* Received an off channel report */ - record->channel = dsie->current_channel; - record->on_channel = WICED_FALSE; - } - - /* In 5GHz the DS Parameter Set element may not be present. If it's not present then for an 802.11a AP we use the channel from the chanspec, since - * it will be a 20 MHz wide channel. If it's an 802.11n AP then we need to examine the HT operations element to find the primary 20 MHz channel - * since the chanspec may report the center frequency if it's an 802.11n 40MHz or wider channel, which is not the same as the 20 MHz channel that the - * beacons are on. */ - if ( ( dsie == NULL ) && ( ht_capabilities_ie != NULL ) ) - { - /* Find the primary channel */ - ht_operation_ie = (ht_operation_ie_t*)wlu_parse_tlvs( cp, len, DOT11_IE_ID_HT_OPERATION ); - if ( ( ht_operation_ie != NULL ) && - ( ht_operation_ie->length == HT_OPERATION_IE_LENGTH ) ) - { - record->channel = ht_operation_ie->primary_channel; - } - } - - record->band = ( ( chanspec & WL_CHANSPEC_BAND_MASK ) == (uint16_t) WL_CHANSPEC_BAND_2G ) ? WICED_802_11_BAND_2_4GHZ : WICED_802_11_BAND_5GHZ; - - scan_result_callback( wwd_scan_result_ptr, handler_user_data, WICED_SCAN_INCOMPLETE ); - if ( *wwd_scan_result_ptr == NULL ) - { -#if 0 - wwd_management_set_event_handler( scan_events, NULL, NULL ); -#endif /* if 0 */ - } - - return handler_user_data; -} - -wwd_result_t wwd_wifi_set_scan_params( uint32_t assoc_time, - uint32_t unassoc_time, - uint32_t passive_time, - uint32_t home_time, - uint32_t nprobes ) -{ - CHECK_RETURN( wwd_wifi_set_iovar_value( IOVAR_STR_SCAN_ASSOC_TIME, assoc_time, WWD_STA_INTERFACE )); - CHECK_RETURN( wwd_wifi_set_iovar_value( IOVAR_STR_SCAN_UNASSOC_TIME, unassoc_time, WWD_STA_INTERFACE )); - CHECK_RETURN( wwd_wifi_set_iovar_value( IOVAR_STR_SCAN_PASSIVE_TIME, passive_time, WWD_STA_INTERFACE )); - CHECK_RETURN( wwd_wifi_set_iovar_value( IOVAR_STR_SCAN_HOME_TIME, home_time, WWD_STA_INTERFACE )); - CHECK_RETURN( wwd_wifi_set_iovar_value( IOVAR_STR_SCAN_NPROBES, nprobes, WWD_STA_INTERFACE )); - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_get_scan_params( uint32_t* assoc_time, - uint32_t* unassoc_time, - uint32_t* passive_time, - uint32_t* home_time, - uint32_t* nprobes ) -{ - CHECK_RETURN( wwd_wifi_get_iovar_value( IOVAR_STR_SCAN_ASSOC_TIME, assoc_time, WWD_STA_INTERFACE )); - CHECK_RETURN( wwd_wifi_get_iovar_value( IOVAR_STR_SCAN_UNASSOC_TIME, unassoc_time, WWD_STA_INTERFACE )); - CHECK_RETURN( wwd_wifi_get_iovar_value( IOVAR_STR_SCAN_PASSIVE_TIME, passive_time, WWD_STA_INTERFACE )); - CHECK_RETURN( wwd_wifi_get_iovar_value( IOVAR_STR_SCAN_HOME_TIME, home_time, WWD_STA_INTERFACE )); - CHECK_RETURN( wwd_wifi_get_iovar_value( IOVAR_STR_SCAN_NPROBES, nprobes, WWD_STA_INTERFACE )); - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_join( const wiced_ssid_t* ssid, wiced_security_t auth_type, const uint8_t* security_key, uint8_t key_length, host_semaphore_type_t* semaphore ) -{ - wiced_buffer_t buffer; - host_semaphore_type_t join_sema; - wwd_result_t result; - wlc_ssid_t* ssid_params; - - if ( ssid->length > (size_t) SSID_NAME_SIZE ) - { - WPRINT_WWD_ERROR(("%s: failure: SSID too long\n", __func__)); - return WWD_WLAN_BADSSIDLEN; - } - - /* Keep WLAN awake while joining */ - //WWD_WLAN_KEEP_AWAKE( ); - - if ( wwd_wifi_set_block_ack_window_size( WWD_STA_INTERFACE ) != WWD_SUCCESS ) - { - WPRINT_WWD_ERROR(("%s: failed to set ba win\n", __func__)); -// WWD_WLAN_LET_SLEEP( ); - return WWD_SET_BLOCK_ACK_WINDOW_FAIL; - } - - if ( semaphore == NULL ) - { - CHECK_RETURN( host_rtos_init_semaphore( &join_sema ) ); - - result = wwd_wifi_prepare_join( WWD_STA_INTERFACE, auth_type, security_key, key_length, &join_sema ); - } - else - { - result = wwd_wifi_prepare_join( WWD_STA_INTERFACE, auth_type, security_key, key_length, semaphore ); - } - - if ( result == WWD_SUCCESS ) - { - /* Join network */ - ssid_params = (struct wlc_ssid *) wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(wlc_ssid_t) ); - CHECK_IOCTL_BUFFER( ssid_params ); - memset( ssid_params, 0, sizeof(wlc_ssid_t) ); - ssid_params->SSID_len = ssid->length; - memcpy( ssid_params->SSID, ssid->value, ssid_params->SSID_len ); - result = wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_SSID, buffer, 0, WWD_STA_INTERFACE ); - - if ( result == WWD_SUCCESS && semaphore == NULL ) - { - result = host_rtos_get_semaphore( &join_sema, DEFAULT_JOIN_ATTEMPT_TIMEOUT, WICED_FALSE ); - wiced_assert( "Get semaphore failed", ( result == WWD_SUCCESS ) || ( result == WWD_TIMEOUT ) ); - REFERENCE_DEBUG_ONLY_VARIABLE( result ); - - result = wwd_wifi_is_ready_to_transceive( WWD_STA_INTERFACE ); - if ( result != WWD_SUCCESS ) - { - wwd_wifi_leave( WWD_STA_INTERFACE ); - WPRINT_WWD_INFO(("%s: not ready to transceive (err %d); left network\n", __func__, result)); - } - } - } - - if ( semaphore == NULL ) - { - host_rtos_deinit_semaphore( &join_sema ); - } - -// WWD_WLAN_LET_SLEEP( ); - return result; -} - - -wwd_result_t wwd_wifi_join_specific( const wiced_scan_result_t* ap, const uint8_t* security_key, uint8_t key_length, host_semaphore_type_t* semaphore, wwd_interface_t interface ) -{ - wiced_buffer_t buffer; - host_semaphore_type_t join_semaphore; - wwd_result_t result; - wl_extjoin_params_t* ext_join_params; - wl_join_params_t* join_params; - wiced_security_t security = ap->security; - uint16_t wl_band_for_channel = 0; - /* Keep WLAN awake while joining */ -// WWD_WLAN_KEEP_AWAKE( ); - - if ( wwd_wifi_set_block_ack_window_size( interface ) != WWD_SUCCESS ) - { -// WWD_WLAN_LET_SLEEP( ); - return WWD_SET_BLOCK_ACK_WINDOW_FAIL; - } - - if ( ap->bss_type == WICED_BSS_TYPE_ADHOC ) - { - security |= IBSS_ENABLED; - } - - if ( semaphore == NULL ) - { - CHECK_RETURN( host_rtos_init_semaphore( &join_semaphore ) ); - - result = wwd_wifi_prepare_join( interface, security, security_key, key_length, &join_semaphore ); - } - else - { - result = wwd_wifi_prepare_join( interface, security, security_key, key_length, semaphore ); - } - - if ( result == WWD_SUCCESS ) - { - /* Check if soft AP is running, if so, move its current channel to the the destination AP */ - if ( wwd_wifi_is_ready_to_transceive( WWD_AP_INTERFACE ) == WWD_SUCCESS ) - { - uint32_t current_softap_channel = 0; - wwd_wifi_get_channel( WWD_AP_INTERFACE, ¤t_softap_channel ); - if ( current_softap_channel != ap->channel ) - { - wwd_wifi_set_channel( WWD_AP_INTERFACE, ap->channel ); - host_rtos_delay_milliseconds( 100 ); - } - } - else - { - if (ap->bss_type == WICED_BSS_TYPE_ADHOC) - wwd_wifi_set_channel( WWD_STA_INTERFACE, ap->channel ); - } - - /* Join network */ - ext_join_params = (wl_extjoin_params_t*) wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(wl_extjoin_params_t), "join" ); - CHECK_IOCTL_BUFFER( ext_join_params ); - memset( ext_join_params, 0, sizeof(wl_extjoin_params_t) ); - - ext_join_params->ssid.SSID_len = ap->SSID.length; - memcpy( ext_join_params->ssid.SSID, ap->SSID.value, ext_join_params->ssid.SSID_len ); - memcpy( &ext_join_params->assoc_params.bssid, &ap->BSSID, sizeof(wiced_mac_t) ); - ext_join_params->scan_params.scan_type = 0; - ext_join_params->scan_params.active_time = -1; - ext_join_params->scan_params.home_time = -1; - ext_join_params->scan_params.nprobes = -1; - ext_join_params->scan_params.passive_time = -1; -#ifdef CHIP_HAS_BSSID_CNT_IN_ASSOC_PARAMS - ext_join_params->assoc_params.bssid_cnt = 0; -#endif /* ifdef CHIP_HAS_BSSID_CNT_IN_ASSOC_PARAMS */ - ext_join_params->assoc_params.chanspec_num = (uint32_t) 1; - ext_join_params->assoc_params.chanspec_list[0] = (wl_chanspec_t) htod16((ap->channel | WL_CHANSPEC_BW_20 | WL_CHANSPEC_CTL_SB_NONE)); - - /* set band properly */ - wl_band_for_channel = wwd_channel_to_wl_band( ap->channel ); - - ext_join_params->assoc_params.chanspec_list[0] |= wl_band_for_channel; - - result = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, interface ); - - /* Some firmware, e.g. for 4390, does not support the join IOVAR, so use the older IOCTL call instead */ - if ( result == WWD_WLAN_UNSUPPORTED ) - { - join_params = (wl_join_params_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(wl_join_params_t) ); - CHECK_IOCTL_BUFFER( join_params ); - memset( join_params, 0, sizeof(wl_join_params_t) ); - memcpy( &join_params->ssid, &ext_join_params->ssid, sizeof ( wlc_ssid_t ) ); - memcpy( &join_params->params.bssid, &ap->BSSID, sizeof(wiced_mac_t) ); -#ifdef CHIP_HAS_BSSID_CNT_IN_ASSOC_PARAMS - join_params->params.bssid_cnt = 0; -#endif /* ifdef CHIP_HAS_BSSID_CNT_IN_ASSOC_PARAMS */ - join_params->params.chanspec_num = (uint32_t) 1; - join_params->params.chanspec_list[0] = (wl_chanspec_t) htod16((ap->channel | WL_CHANSPEC_BW_20 | WL_CHANSPEC_CTL_SB_NONE)); - - /* set band properly */ - join_params->params.chanspec_list[0] |= wl_band_for_channel; - - result = wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_SSID, buffer, 0, interface ); - } - - if ( result == WWD_SUCCESS && semaphore == NULL ) - { - host_rtos_get_semaphore( &join_semaphore, (uint32_t) DEFAULT_JOIN_ATTEMPT_TIMEOUT, WICED_FALSE ); - result = wwd_wifi_is_ready_to_transceive( interface ); - if ( result != WWD_SUCCESS ) - { - wwd_wifi_leave( interface ); - WPRINT_WWD_INFO(("%s: not ready to transceive (err %d); left network\n", __func__, result)); - } - } - } - if ( semaphore == NULL ) - { - host_rtos_deinit_semaphore( &join_semaphore ); - } - if ( WWD_SUCCESS != result ) - { - WPRINT_WWD_INFO(("%s: failed join (err %d)\n", __func__, result)); - } - -// WWD_WLAN_LET_SLEEP( ); - return result; -} - -static wwd_result_t wwd_wifi_prepare_join( wwd_interface_t interface, wiced_security_t auth_type, /*@unique@*/ const uint8_t* security_key, uint8_t key_length, host_semaphore_type_t* semaphore ) -{ - wiced_buffer_t buffer; - wwd_result_t retval = WWD_SUCCESS; - uint16_t a; - uint32_t* wsec_setting; - uint32_t* data; - uint32_t* infra; - uint32_t* wpa_auth; - uint32_t* auth; - uint32_t bss_index = 0; - (void)bss_index; - if ( ( ( ( key_length > (uint8_t) WSEC_MAX_PSK_LEN ) || - ( key_length < (uint8_t) WSEC_MIN_PSK_LEN ) ) && - ( ( auth_type == WICED_SECURITY_WPA_TKIP_PSK ) || - ( auth_type == WICED_SECURITY_WPA_AES_PSK ) || - ( auth_type == WICED_SECURITY_WPA2_AES_PSK ) || - ( auth_type == WICED_SECURITY_WPA2_TKIP_PSK ) || - ( auth_type == WICED_SECURITY_WPA2_MIXED_PSK ) ) ) ) - { -#if 0 - WPRINT_WWD_DEBUG(("wiced_wifi_prepare_join: Security key invalid\n")); -#endif /* if 0 */ - return WWD_INVALID_KEY; - } - - (void)interface, (void)auth_type, (void)security_key, (void)key_length, (void)semaphore; - if ( !( ( interface == WWD_STA_INTERFACE ) || ( ( interface == WWD_P2P_INTERFACE ) && ( wwd_wifi_p2p_go_is_up == WICED_FALSE ) ) ) ) - { - return WWD_INVALID_INTERFACE; - } - - /* Clear the current join status */ - wiced_join_status[ interface ] = 0; - - /* Set Wireless Security Type */ - wsec_setting = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER( wsec_setting ); - *wsec_setting = (uint32_t) ((auth_type&0xFF) & ~WPS_ENABLED); - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_WSEC, buffer, 0, interface ) ); - - /* Map the interface to a BSS index */ - bss_index = wwd_get_bss_index( interface ); - - /* Set supplicant variable - mfg app doesn't support these iovars, so don't care if return fails */ - data = wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, "bsscfg:" IOVAR_STR_SUP_WPA ); - CHECK_IOCTL_BUFFER( data ); - data[0] = bss_index; - data[1] = (uint32_t) ( ( ( ( auth_type & WPA_SECURITY ) != 0 ) || - ( ( auth_type & WPA2_SECURITY ) != 0 ) ) ? 1 : 0 ); - (void)wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ); - - /* Set the EAPOL version to whatever the AP is using (-1) */ - data = wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, "bsscfg:" IOVAR_STR_SUP_WPA2_EAPVER ); - CHECK_IOCTL_BUFFER( data ); - data[0] = bss_index; - data[1] = (uint32_t)-1; - (void)wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ); - - /* Send WPA Key */ - switch ( auth_type ) - { - case WICED_SECURITY_OPEN: - case WICED_SECURITY_IBSS_OPEN: - case WICED_SECURITY_WPS_OPEN: - case WICED_SECURITY_WPS_SECURE: - break; - case WICED_SECURITY_WPA_TKIP_PSK: - case WICED_SECURITY_WPA_AES_PSK: - case WICED_SECURITY_WPA_MIXED_PSK: - case WICED_SECURITY_WPA2_AES_PSK: - case WICED_SECURITY_WPA2_TKIP_PSK: - case WICED_SECURITY_WPA2_MIXED_PSK: - /* Set the EAPOL key packet timeout value, otherwise unsuccessful supplicant events aren't reported. If the IOVAR is unsupported then continue. */ - CHECK_RETURN_UNSUPPORTED_CONTINUE( wwd_wifi_set_supplicant_eapol_key_timeout( interface, DEFAULT_EAPOL_KEY_PACKET_TIMEOUT ) ); - CHECK_RETURN( wwd_wifi_set_passphrase( security_key, key_length, interface ) ); - break; - - case WICED_SECURITY_WPA_TKIP_ENT: - case WICED_SECURITY_WPA_AES_ENT: - case WICED_SECURITY_WPA_MIXED_ENT: - case WICED_SECURITY_WPA2_TKIP_ENT: - case WICED_SECURITY_WPA2_AES_ENT: - case WICED_SECURITY_WPA2_MIXED_ENT: - break; - - case WICED_SECURITY_WEP_PSK: - case WICED_SECURITY_WEP_SHARED: - for ( a = 0; a < key_length; a = (uint16_t) ( a + 2 + security_key[1] ) ) - { - const wiced_wep_key_t* in_key = (const wiced_wep_key_t*) &security_key[a]; - wl_wsec_key_t* out_key = (wl_wsec_key_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(wl_wsec_key_t) ); - CHECK_IOCTL_BUFFER( out_key ); - memset( out_key, 0, sizeof(wl_wsec_key_t) ); - out_key->index = in_key->index; - out_key->len = in_key->length; - memcpy( out_key->data, in_key->data, in_key->length ); - switch ( in_key->length ) - { - case 5: - out_key->algo = (uint32_t) CRYPTO_ALGO_WEP1; - break; - case 13: - out_key->algo = (uint32_t)CRYPTO_ALGO_WEP128; - break; - case 16: - /* default to AES-CCM */ - out_key->algo = (uint32_t) CRYPTO_ALGO_AES_CCM; - break; - case 32: - out_key->algo = (uint32_t) CRYPTO_ALGO_TKIP; - break; - default: - host_buffer_release(buffer, WWD_NETWORK_TX); - return WWD_INVALID_KEY; - } - /* Set the first entry as primary key by default */ - if ( a == 0 ) - { - out_key->flags |= WL_PRIMARY_KEY; - } - out_key->index = htod32(out_key->index); - out_key->len = htod32(out_key->len); - out_key->algo = htod32(out_key->algo); - out_key->flags = htod32(out_key->flags); - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_KEY, buffer, NULL, interface ) ); - } - break; - case WICED_SECURITY_FORCE_32_BIT: - case WICED_SECURITY_UNKNOWN: - default: - wiced_assert("wiced_wifi_prepare_join: Unsupported security type\n", 0 != 0 ); - break; - } - - /* Set infrastructure mode */ - infra = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER( infra ); - *infra = (uint32_t) ( ( auth_type & IBSS_ENABLED ) == 0 )? 1 : 0; - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_INFRA, buffer, 0, interface ) ); - - /* Set authentication type */ - auth = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER( auth ); - if ( auth_type == WICED_SECURITY_WEP_SHARED ) - { - *auth = 1; /* 1 = Shared Key authentication */ - } - else - { - *auth = 0; /* 0 = Open System authentication */ - } - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_AUTH, buffer, 0, interface ) ); - - /* Set WPA authentication mode */ - wpa_auth = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER( wpa_auth ); - - switch ( auth_type ) - { - case WICED_SECURITY_IBSS_OPEN: - wiced_join_status[interface] |= JOIN_AUTHENTICATED; /* IBSS does not get authenticated onto an AP */ - /* intentional fall-thru */ - /* Disables Eclipse static analysis warning */ - /* no break */ - case WICED_SECURITY_OPEN: - case WICED_SECURITY_WPS_OPEN: - case WICED_SECURITY_WPS_SECURE: - *wpa_auth = WPA_AUTH_DISABLED; - wiced_join_status[interface] |= JOIN_SECURITY_COMPLETE; /* Open Networks do not have to complete security */ - break; - case WICED_SECURITY_WPA_TKIP_PSK: - case WICED_SECURITY_WPA_AES_PSK: - case WICED_SECURITY_WPA_MIXED_PSK: - *wpa_auth = (uint32_t) WPA_AUTH_PSK; - break; - case WICED_SECURITY_WPA2_AES_PSK: - case WICED_SECURITY_WPA2_TKIP_PSK: - case WICED_SECURITY_WPA2_MIXED_PSK: - *wpa_auth = (uint32_t) WPA2_AUTH_PSK; - break; - - case WICED_SECURITY_WPA_TKIP_ENT: - case WICED_SECURITY_WPA_AES_ENT: - case WICED_SECURITY_WPA_MIXED_ENT: - *wpa_auth = (uint32_t) WPA_AUTH_UNSPECIFIED; - break; - - case WICED_SECURITY_WPA2_TKIP_ENT: - case WICED_SECURITY_WPA2_AES_ENT: - case WICED_SECURITY_WPA2_MIXED_ENT: - *wpa_auth = (uint32_t) WPA2_AUTH_UNSPECIFIED; - break; - - case WICED_SECURITY_WEP_PSK: - case WICED_SECURITY_WEP_SHARED: - *wpa_auth = WPA_AUTH_DISABLED; - wiced_join_status[interface] |= JOIN_SECURITY_COMPLETE; - break; - case WICED_SECURITY_UNKNOWN: - case WICED_SECURITY_FORCE_32_BIT: - default: - WPRINT_WWD_DEBUG(("Unsupported Security type\n")); - *wpa_auth = WPA_AUTH_DISABLED; - break; - } - - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_WPA_AUTH, buffer, 0, interface ) ); - - retval = wwd_management_set_event_handler( join_events, wiced_join_events_handler, (void*) semaphore, interface ); - wiced_assert("Set join Event handler failed\n", retval == WWD_SUCCESS ); - - return retval; -} - -wwd_result_t wwd_wifi_leave( wwd_interface_t interface ) -{ - wiced_buffer_t buffer; - wwd_result_t result = WWD_SUCCESS; - - CHECK_RETURN( wwd_management_set_event_handler( join_events, NULL, NULL, interface ) ); - - /* Disassociate from AP */ - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_ioctl_buffer( &buffer, 0 ) ) - - result = wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_DISASSOC, buffer, 0, interface ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("wwd_sdpcm_send_ioctl(WLC_DISASSOC) failed:%d\r\n", result)); - } - - /* Only clear the current join status, not the last join result */ - wiced_join_status[ interface ] = 0; - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_deauth_sta( const wiced_mac_t* mac, wwd_dot11_reason_code_t reason, wwd_interface_t interface ) -{ - wiced_buffer_t buffer; - wwd_result_t result; - scb_val_t* scb_val; - - scb_val = (scb_val_t *) wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(scb_val_t) ); - CHECK_IOCTL_BUFFER( scb_val ); - memset((char *)scb_val, 0, sizeof(scb_val_t)); - memcpy((char *)&scb_val->ea, (char *) mac, sizeof(wiced_mac_t)); - scb_val->val = (uint32_t)reason; - result = wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SCB_DEAUTHENTICATE_FOR_REASON, buffer, 0, interface ); - - return result; -} - -wwd_result_t wwd_wifi_deauth_all_associated_client_stas( wwd_dot11_reason_code_t reason, wwd_interface_t interface ) -{ - uint8_t* buffer = NULL; - wiced_maclist_t* clients = NULL; - const wiced_mac_t* current; - wwd_result_t result; - wl_bss_info_t ap_info; - wiced_security_t sec; - uint32_t max_clients = 0; - size_t size = 0; - - result = wwd_wifi_get_max_associations( &max_clients ); - if ( result != WWD_SUCCESS ) - { - WPRINT_APP_INFO( ("Failed to get max number of associated clients\n") ); - max_clients = 5; - } - - size = ( sizeof(uint32_t) + (max_clients * sizeof(wiced_mac_t))); - buffer = calloc(1, size); - - if ( buffer == NULL ) - { - WPRINT_APP_INFO(( "Unable to allocate memory for associated clients list\n" )); - return WWD_MALLOC_FAILURE; - } - clients = (wiced_maclist_t*)buffer; - clients->count = max_clients; - memset(&ap_info, 0, sizeof(wl_bss_info_t)); - - result = wwd_wifi_get_associated_client_list( clients, ( uint16_t )size ); - if ( result != WWD_SUCCESS ) - { - WPRINT_APP_INFO(( "Failed to get client list\n" )); - free( buffer ); - return result; - } - - current = &clients->mac_list[0]; - wwd_wifi_get_ap_info( &ap_info, &sec ); - - while ((clients->count > 0) && (!(NULL_MAC(current->octet)))) - { - if (memcmp(current->octet, &(ap_info.BSSID), sizeof(wiced_mac_t) ) != 0) - { - WPRINT_APP_INFO(("Deauthenticating STA MAC: %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n", current->octet[0], current->octet[1], current->octet[2], current->octet[3], current->octet[4], current->octet[5])); - result = wwd_wifi_deauth_sta(current, reason, interface ); - if ( result != WWD_SUCCESS) - { - WPRINT_APP_INFO(("Failed to deauth client\n")); - } - } - - --clients->count; - ++current; - } - - free( buffer ); - - return WWD_SUCCESS; -} - -#ifdef WPRINT_ENABLE_WWD_DEBUG -static char* wwd_ssid_to_string( uint8_t *value, uint8_t length, char *ssid_buf, uint8_t ssid_buf_len ) -{ - memset(ssid_buf, 0, ssid_buf_len); - - if (ssid_buf_len > 0) - { - memcpy(ssid_buf, value, ssid_buf_len < length ? ssid_buf_len : length); - } - - return ssid_buf; -} - -/* When adding new events, update this switch statement to print correct string */ -#define CASE_RETURN_STRING(value) case value: return #value; -#define CASE_RETURN(value) case value: break; - -static const char* wwd_event_to_string( wwd_event_num_t value ) -{ - switch ( value ) - { - CASE_RETURN_STRING(WLC_E_NONE) - CASE_RETURN_STRING(WLC_E_SET_SSID) - CASE_RETURN(WLC_E_JOIN) - CASE_RETURN(WLC_E_START) - CASE_RETURN_STRING(WLC_E_AUTH) - CASE_RETURN(WLC_E_AUTH_IND) - CASE_RETURN(WLC_E_DEAUTH) - CASE_RETURN_STRING(WLC_E_DEAUTH_IND) - CASE_RETURN(WLC_E_ASSOC) - CASE_RETURN(WLC_E_ASSOC_IND) - CASE_RETURN(WLC_E_REASSOC) - CASE_RETURN(WLC_E_REASSOC_IND) - CASE_RETURN(WLC_E_DISASSOC) - CASE_RETURN_STRING(WLC_E_DISASSOC_IND) - CASE_RETURN(WLC_E_ROAM) - CASE_RETURN(WLC_E_ROAM_PREP) - CASE_RETURN(WLC_E_ROAM_START) - CASE_RETURN(WLC_E_QUIET_START) - CASE_RETURN(WLC_E_QUIET_END) - CASE_RETURN(WLC_E_BEACON_RX) - CASE_RETURN_STRING(WLC_E_LINK) - CASE_RETURN_STRING(WLC_E_RRM) - CASE_RETURN(WLC_E_MIC_ERROR) - CASE_RETURN(WLC_E_NDIS_LINK) - CASE_RETURN(WLC_E_TXFAIL) - CASE_RETURN(WLC_E_PMKID_CACHE) - CASE_RETURN(WLC_E_RETROGRADE_TSF) - CASE_RETURN(WLC_E_PRUNE) - CASE_RETURN(WLC_E_AUTOAUTH) - CASE_RETURN(WLC_E_EAPOL_MSG) - CASE_RETURN(WLC_E_SCAN_COMPLETE) - CASE_RETURN(WLC_E_ADDTS_IND) - CASE_RETURN(WLC_E_DELTS_IND) - CASE_RETURN(WLC_E_BCNSENT_IND) - CASE_RETURN(WLC_E_BCNRX_MSG) - CASE_RETURN(WLC_E_BCNLOST_MSG) - CASE_RETURN_STRING(WLC_E_PFN_NET_FOUND) - CASE_RETURN(WLC_E_PFN_NET_LOST) - CASE_RETURN(WLC_E_RESET_COMPLETE) - CASE_RETURN(WLC_E_JOIN_START) - CASE_RETURN(WLC_E_ASSOC_START) - CASE_RETURN(WLC_E_IBSS_ASSOC) - CASE_RETURN(WLC_E_RADIO) - CASE_RETURN(WLC_E_PSM_WATCHDOG) - CASE_RETURN(WLC_E_CCX_ASSOC_START) - CASE_RETURN(WLC_E_CCX_ASSOC_ABORT) - CASE_RETURN(WLC_E_PROBREQ_MSG) - CASE_RETURN(WLC_E_SCAN_CONFIRM_IND) - CASE_RETURN_STRING(WLC_E_PSK_SUP) - CASE_RETURN(WLC_E_COUNTRY_CODE_CHANGED) - CASE_RETURN(WLC_E_EXCEEDED_MEDIUM_TIME) - CASE_RETURN(WLC_E_ICV_ERROR) - CASE_RETURN(WLC_E_UNICAST_DECODE_ERROR) - CASE_RETURN(WLC_E_MULTICAST_DECODE_ERROR) - CASE_RETURN(WLC_E_TRACE) - CASE_RETURN(WLC_E_BTA_HCI_EVENT) - CASE_RETURN(WLC_E_IF) - CASE_RETURN(WLC_E_P2P_DISC_LISTEN_COMPLETE) - CASE_RETURN(WLC_E_RSSI) - CASE_RETURN(WLC_E_PFN_SCAN_COMPLETE) - CASE_RETURN(WLC_E_EXTLOG_MSG) - CASE_RETURN(WLC_E_ACTION_FRAME) - CASE_RETURN(WLC_E_ACTION_FRAME_COMPLETE) - CASE_RETURN(WLC_E_PRE_ASSOC_IND) - CASE_RETURN(WLC_E_PRE_REASSOC_IND) - CASE_RETURN(WLC_E_CHANNEL_ADOPTED) - CASE_RETURN(WLC_E_AP_STARTED) - CASE_RETURN(WLC_E_DFS_AP_STOP) - CASE_RETURN(WLC_E_DFS_AP_RESUME) - CASE_RETURN(WLC_E_WAI_STA_EVENT) - CASE_RETURN(WLC_E_WAI_MSG) - CASE_RETURN_STRING(WLC_E_ESCAN_RESULT) - CASE_RETURN(WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE) - CASE_RETURN(WLC_E_PROBRESP_MSG) - CASE_RETURN(WLC_E_P2P_PROBREQ_MSG) - CASE_RETURN(WLC_E_DCS_REQUEST) - CASE_RETURN(WLC_E_FIFO_CREDIT_MAP) - CASE_RETURN(WLC_E_ACTION_FRAME_RX) - CASE_RETURN(WLC_E_WAKE_EVENT) - CASE_RETURN(WLC_E_RM_COMPLETE) - CASE_RETURN(WLC_E_HTSFSYNC) - CASE_RETURN(WLC_E_OVERLAY_REQ) - CASE_RETURN_STRING(WLC_E_CSA_COMPLETE_IND) - CASE_RETURN(WLC_E_EXCESS_PM_WAKE_EVENT) - CASE_RETURN(WLC_E_PFN_SCAN_NONE) - CASE_RETURN(WLC_E_PFN_SCAN_ALLGONE) - CASE_RETURN(WLC_E_GTK_PLUMBED) - CASE_RETURN(WLC_E_ASSOC_IND_NDIS) - CASE_RETURN(WLC_E_REASSOC_IND_NDIS) - CASE_RETURN(WLC_E_ASSOC_REQ_IE) - CASE_RETURN(WLC_E_ASSOC_RESP_IE) - CASE_RETURN(WLC_E_ASSOC_RECREATED) - CASE_RETURN(WLC_E_ACTION_FRAME_RX_NDIS) - CASE_RETURN(WLC_E_AUTH_REQ) - CASE_RETURN(WLC_E_TDLS_PEER_EVENT) - CASE_RETURN(WLC_E_SPEEDY_RECREATE_FAIL) - CASE_RETURN(WLC_E_NATIVE) - CASE_RETURN(WLC_E_PKTDELAY_IND) - CASE_RETURN(WLC_E_AWDL_AW) - CASE_RETURN(WLC_E_AWDL_ROLE) - CASE_RETURN(WLC_E_AWDL_EVENT) - CASE_RETURN(WLC_E_NIC_AF_TXS) - CASE_RETURN(WLC_E_NIC_NIC_REPORT) - CASE_RETURN(WLC_E_BEACON_FRAME_RX) - CASE_RETURN(WLC_E_SERVICE_FOUND) - CASE_RETURN(WLC_E_GAS_FRAGMENT_RX) - CASE_RETURN(WLC_E_GAS_COMPLETE) - CASE_RETURN(WLC_E_P2PO_ADD_DEVICE) - CASE_RETURN(WLC_E_P2PO_DEL_DEVICE) - CASE_RETURN(WLC_E_WNM_STA_SLEEP) - CASE_RETURN(WLC_E_TXFAIL_THRESH) - CASE_RETURN(WLC_E_PROXD) - CASE_RETURN(WLC_E_IBSS_COALESCE) - CASE_RETURN(WLC_E_AWDL_RX_PRB_RESP) - CASE_RETURN(WLC_E_AWDL_RX_ACT_FRAME) - CASE_RETURN(WLC_E_AWDL_WOWL_NULLPKT) - CASE_RETURN(WLC_E_AWDL_PHYCAL_STATUS) - CASE_RETURN(WLC_E_AWDL_OOB_AF_STATUS) - CASE_RETURN(WLC_E_AWDL_SCAN_STATUS) - CASE_RETURN(WLC_E_AWDL_AW_START) - CASE_RETURN(WLC_E_AWDL_AW_END) - CASE_RETURN(WLC_E_AWDL_AW_EXT) - CASE_RETURN(WLC_E_AWDL_PEER_CACHE_CONTROL) - CASE_RETURN(WLC_E_CSA_START_IND) - CASE_RETURN(WLC_E_CSA_DONE_IND) - CASE_RETURN(WLC_E_CSA_FAILURE_IND) - CASE_RETURN(WLC_E_CCA_CHAN_QUAL) - CASE_RETURN(WLC_E_BSSID) - CASE_RETURN(WLC_E_TX_STAT_ERROR) - CASE_RETURN(WLC_E_BCMC_CREDIT_SUPPORT) - CASE_RETURN(WLC_E_PSTA_PRIMARY_INTF_IND) - CASE_RETURN(WLC_E_FORCE_32_BIT) - CASE_RETURN(WLC_E_BT_WIFI_HANDOVER_REQ) - CASE_RETURN(WLC_E_SPW_TXINHIBIT) - CASE_RETURN(WLC_E_FBT_AUTH_REQ_IND) - CASE_RETURN(WLC_E_RSSI_LQM) - CASE_RETURN(WLC_E_PFN_GSCAN_FULL_RESULT) - CASE_RETURN(WLC_E_PFN_SWC) - CASE_RETURN(WLC_E_AUTHORIZED) - CASE_RETURN(WLC_E_PROBREQ_MSG_RX) - CASE_RETURN(WLC_E_RMC_EVENT) - CASE_RETURN(WLC_E_PFN_BEST_BATCHING) - CASE_RETURN(WLC_E_DPSTA_INTF_IND) - case WLC_E_LAST: - default: - return "Unknown"; - break; - } - - return "Unknown"; -} - -static const char* wwd_status_to_string(wwd_event_status_t status) -{ - switch ( status ) - { - CASE_RETURN_STRING(WLC_E_STATUS_SUCCESS) - CASE_RETURN_STRING(WLC_E_STATUS_FAIL) - CASE_RETURN_STRING(WLC_E_STATUS_TIMEOUT) - CASE_RETURN_STRING(WLC_E_STATUS_NO_NETWORKS) - CASE_RETURN_STRING(WLC_E_STATUS_ABORT) - CASE_RETURN_STRING(WLC_E_STATUS_NO_ACK) - CASE_RETURN_STRING(WLC_E_STATUS_UNSOLICITED) - CASE_RETURN_STRING(WLC_E_STATUS_ATTEMPT) - CASE_RETURN_STRING(WLC_E_STATUS_PARTIAL) - CASE_RETURN_STRING(WLC_E_STATUS_NEWSCAN) - CASE_RETURN_STRING(WLC_E_STATUS_NEWASSOC) - CASE_RETURN_STRING(WLC_E_STATUS_11HQUIET) - CASE_RETURN_STRING(WLC_E_STATUS_SUPPRESS) - CASE_RETURN_STRING(WLC_E_STATUS_NOCHANS) - CASE_RETURN_STRING(WLC_E_STATUS_CCXFASTRM) - CASE_RETURN_STRING(WLC_E_STATUS_CS_ABORT) - CASE_RETURN_STRING(WLC_SUP_DISCONNECTED) - CASE_RETURN_STRING(WLC_SUP_CONNECTING) - CASE_RETURN_STRING(WLC_SUP_IDREQUIRED) - CASE_RETURN_STRING(WLC_SUP_AUTHENTICATING) - CASE_RETURN_STRING(WLC_SUP_AUTHENTICATED) - CASE_RETURN_STRING(WLC_SUP_KEYXCHANGE) - CASE_RETURN_STRING(WLC_SUP_KEYED) - CASE_RETURN_STRING(WLC_SUP_TIMEOUT) - CASE_RETURN_STRING(WLC_SUP_LAST_BASIC_STATE) - CASE_RETURN_STRING(WLC_SUP_KEYXCHANGE_PREP_M4) - CASE_RETURN_STRING(WLC_SUP_KEYXCHANGE_WAIT_G1) - CASE_RETURN_STRING(WLC_SUP_KEYXCHANGE_PREP_G2) - CASE_RETURN_STRING(WLC_DOT11_SC_SUCCESS) - CASE_RETURN_STRING(WLC_DOT11_SC_FAILURE) - CASE_RETURN_STRING(WLC_DOT11_SC_CAP_MISMATCH) - CASE_RETURN_STRING(WLC_DOT11_SC_REASSOC_FAIL) - CASE_RETURN_STRING(WLC_DOT11_SC_ASSOC_FAIL) - CASE_RETURN_STRING(WLC_DOT11_SC_AUTH_MISMATCH) - CASE_RETURN_STRING(WLC_DOT11_SC_AUTH_SEQ) - CASE_RETURN_STRING(WLC_DOT11_SC_AUTH_CHALLENGE_FAIL) - CASE_RETURN_STRING(WLC_DOT11_SC_AUTH_TIMEOUT) - CASE_RETURN_STRING(WLC_DOT11_SC_ASSOC_BUSY_FAIL) - CASE_RETURN_STRING(WLC_DOT11_SC_ASSOC_RATE_MISMATCH) - CASE_RETURN_STRING(WLC_DOT11_SC_ASSOC_SHORT_REQUIRED) - CASE_RETURN_STRING(WLC_DOT11_SC_ASSOC_PBCC_REQUIRED) - CASE_RETURN_STRING(WLC_DOT11_SC_ASSOC_AGILITY_REQUIRED) - CASE_RETURN_STRING(WLC_DOT11_SC_ASSOC_SPECTRUM_REQUIRED) - CASE_RETURN_STRING(WLC_DOT11_SC_ASSOC_BAD_POWER_CAP) - CASE_RETURN_STRING(WLC_DOT11_SC_ASSOC_BAD_SUP_CHANNELS) - CASE_RETURN_STRING(WLC_DOT11_SC_ASSOC_SHORTSLOT_REQUIRED) - CASE_RETURN_STRING(WLC_DOT11_SC_ASSOC_ERPBCC_REQUIRED) - CASE_RETURN_STRING(WLC_DOT11_SC_ASSOC_DSSOFDM_REQUIRED) - CASE_RETURN_STRING(WLC_DOT11_SC_DECLINED) - CASE_RETURN_STRING(WLC_DOT11_SC_INVALID_PARAMS) - CASE_RETURN_STRING(WLC_DOT11_SC_INVALID_AKMP) - CASE_RETURN_STRING(WLC_DOT11_SC_INVALID_MDID) - CASE_RETURN_STRING(WLC_DOT11_SC_INVALID_FTIE) - case WLC_E_STATUS_FORCE_32_BIT: - default: - break; - } - return "Unknown"; -} - -static const char* wwd_reason_to_string(wwd_event_reason_t reason) -{ - switch ( reason ) - { - CASE_RETURN_STRING(WLC_E_REASON_INITIAL_ASSOC) - CASE_RETURN_STRING(WLC_E_REASON_LOW_RSSI) - CASE_RETURN_STRING(WLC_E_REASON_DEAUTH) - CASE_RETURN_STRING(WLC_E_REASON_DISASSOC) - CASE_RETURN_STRING(WLC_E_REASON_BCNS_LOST) - CASE_RETURN_STRING(WLC_E_REASON_FAST_ROAM_FAILED) - CASE_RETURN_STRING(WLC_E_REASON_DIRECTED_ROAM) - CASE_RETURN_STRING(WLC_E_REASON_TSPEC_REJECTED) - CASE_RETURN_STRING(WLC_E_REASON_BETTER_AP) - CASE_RETURN_STRING(WLC_E_PRUNE_ENCR_MISMATCH) - CASE_RETURN_STRING(WLC_E_PRUNE_BCAST_BSSID) - CASE_RETURN_STRING(WLC_E_PRUNE_MAC_DENY) - CASE_RETURN_STRING(WLC_E_PRUNE_MAC_NA) - CASE_RETURN_STRING(WLC_E_PRUNE_REG_PASSV) - CASE_RETURN_STRING(WLC_E_PRUNE_SPCT_MGMT) - CASE_RETURN_STRING(WLC_E_PRUNE_RADAR) - CASE_RETURN_STRING(WLC_E_RSN_MISMATCH) - CASE_RETURN_STRING(WLC_E_PRUNE_NO_COMMON_RATES) - CASE_RETURN_STRING(WLC_E_PRUNE_BASIC_RATES) - CASE_RETURN_STRING(WLC_E_PRUNE_CCXFAST_PREVAP) - CASE_RETURN_STRING(WLC_E_PRUNE_CIPHER_NA) - CASE_RETURN_STRING(WLC_E_PRUNE_KNOWN_STA) - CASE_RETURN_STRING(WLC_E_PRUNE_CCXFAST_DROAM) - CASE_RETURN_STRING(WLC_E_PRUNE_WDS_PEER) - CASE_RETURN_STRING(WLC_E_PRUNE_QBSS_LOAD) - CASE_RETURN_STRING(WLC_E_PRUNE_HOME_AP) - CASE_RETURN_STRING(WLC_E_PRUNE_AP_BLOCKED) - CASE_RETURN_STRING(WLC_E_PRUNE_NO_DIAG_SUPPORT) - CASE_RETURN_STRING(WLC_E_SUP_OTHER) - CASE_RETURN_STRING(WLC_E_SUP_DECRYPT_KEY_DATA) - CASE_RETURN_STRING(WLC_E_SUP_BAD_UCAST_WEP128) - CASE_RETURN_STRING(WLC_E_SUP_BAD_UCAST_WEP40) - CASE_RETURN_STRING(WLC_E_SUP_UNSUP_KEY_LEN) - CASE_RETURN_STRING(WLC_E_SUP_PW_KEY_CIPHER) - CASE_RETURN_STRING(WLC_E_SUP_MSG3_TOO_MANY_IE) - CASE_RETURN_STRING(WLC_E_SUP_MSG3_IE_MISMATCH) - CASE_RETURN_STRING(WLC_E_SUP_NO_INSTALL_FLAG) - CASE_RETURN_STRING(WLC_E_SUP_MSG3_NO_GTK) - CASE_RETURN_STRING(WLC_E_SUP_GRP_KEY_CIPHER) - CASE_RETURN_STRING(WLC_E_SUP_GRP_MSG1_NO_GTK) - CASE_RETURN_STRING(WLC_E_SUP_GTK_DECRYPT_FAIL) - CASE_RETURN_STRING(WLC_E_SUP_SEND_FAIL) - CASE_RETURN_STRING(WLC_E_SUP_DEAUTH) - CASE_RETURN_STRING(WLC_E_SUP_WPA_PSK_TMO) - CASE_RETURN_STRING(DOT11_RC_RESERVED) - CASE_RETURN_STRING(DOT11_RC_UNSPECIFIED) - CASE_RETURN_STRING(DOT11_RC_AUTH_INVAL) - CASE_RETURN_STRING(DOT11_RC_DEAUTH_LEAVING) - CASE_RETURN_STRING(DOT11_RC_INACTIVITY) - CASE_RETURN_STRING(DOT11_RC_BUSY) - CASE_RETURN_STRING(DOT11_RC_INVAL_CLASS_2) - CASE_RETURN_STRING(DOT11_RC_INVAL_CLASS_3) - CASE_RETURN_STRING(DOT11_RC_DISASSOC_LEAVING) - CASE_RETURN_STRING(DOT11_RC_NOT_AUTH) - CASE_RETURN_STRING(DOT11_RC_BAD_PC) - CASE_RETURN_STRING(DOT11_RC_BAD_CHANNELS) - CASE_RETURN_STRING(DOT11_RC_UNSPECIFIED_QOS) - CASE_RETURN_STRING(DOT11_RC_INSUFFCIENT_BW) - CASE_RETURN_STRING(DOT11_RC_EXCESSIVE_FRAMES) - CASE_RETURN_STRING(DOT11_RC_TX_OUTSIDE_TXOP) - CASE_RETURN_STRING(DOT11_RC_LEAVING_QBSS) - CASE_RETURN_STRING(DOT11_RC_BAD_MECHANISM) - CASE_RETURN_STRING(DOT11_RC_SETUP_NEEDED) - CASE_RETURN_STRING(DOT11_RC_TIMEOUT) - case DOT11_RC_MAX: - case WLC_E_REASON_FORCE_32_BIT: - default: - break; - } - - return "Unknown"; -} - -static const char* wwd_interface_to_string(wwd_interface_t interface) -{ - switch ( interface ) - { - CASE_RETURN_STRING(WWD_STA_INTERFACE) - CASE_RETURN_STRING(WWD_AP_INTERFACE) - CASE_RETURN_STRING(WWD_P2P_INTERFACE) - CASE_RETURN_STRING(WWD_ETHERNET_INTERFACE) - case WWD_INTERFACE_MAX: - case WWD_INTERFACE_FORCE_32_BIT: - default: - break; - } - return "Unknown"; -} -#endif /* WPRINT_ENABLE_WWD_DEBUG */ - -void wwd_log_event( const wwd_event_header_t* event_header, const uint8_t* event_data ) -{ - UNUSED_PARAMETER(event_header); - UNUSED_PARAMETER(event_data); - WPRINT_WWD_DEBUG(("%lu: Event (interface, type, status, reason): %s %s %s %s\n", - (uint32_t) host_rtos_get_time( ), - wwd_interface_to_string(event_header->interface), - wwd_event_to_string(event_header->event_type), - wwd_status_to_string(event_header->status), - wwd_reason_to_string(event_header->reason))); -} - -/** Callback for join events - * This is called when the WLC_E_SET_SSID event is received, - * indicating that the system has joined successfully. - * Wakes the thread which was doing the join, allowing it to resume. - */ -static /*@null@*/ void* wiced_join_events_handler( const wwd_event_header_t* event_header, const uint8_t* event_data, /*@returned@*/ void* handler_user_data ) -{ - host_semaphore_type_t* semaphore = (host_semaphore_type_t*) handler_user_data; - wiced_bool_t join_attempt_complete = WICED_FALSE; - - UNUSED_PARAMETER(event_data); - - if ( ( (uint32_t)event_header->interface != WWD_STA_INTERFACE ) && ( (uint32_t)event_header->interface != WWD_P2P_INTERFACE ) ) - { - return handler_user_data; - } - - switch ( event_header->event_type ) - { - case WLC_E_PSK_SUP: - if ( event_header->status == WLC_SUP_KEYED ) - { - /* Successful WPA key exchange */ - wiced_join_status[event_header->interface] |= JOIN_SECURITY_COMPLETE; - } - else if ( ( event_header->status == WLC_SUP_KEYXCHANGE_WAIT_M1 ) && ( event_header->reason == WLC_E_SUP_WPA_PSK_TMO ) ) - { - /* A timeout waiting for M1 may occur at the edge of the cell or if the AP is particularly slow. */ - WPRINT_WWD_DEBUG(("Supplicant M1 timeout event\n")); - wiced_join_status[event_header->interface] |= JOIN_EAPOL_KEY_M1_TIMEOUT; - join_attempt_complete = WICED_TRUE; - } - else if ( ( event_header->status == WLC_SUP_KEYXCHANGE_WAIT_M3 ) && ( event_header->reason == WLC_E_SUP_WPA_PSK_TMO ) ) - { - /* A timeout waiting for M3 is an indicator that the passphrase may be incorrect. */ - WPRINT_WWD_DEBUG(("Supplicant M3 timeout event\n")); - wiced_join_status[event_header->interface] |= JOIN_EAPOL_KEY_M3_TIMEOUT; - join_attempt_complete = WICED_TRUE; - } - else if ( ( event_header->status == WLC_SUP_KEYXCHANGE_WAIT_G1 ) && ( event_header->reason == WLC_E_SUP_WPA_PSK_TMO ) ) - { - /* A timeout waiting for G1 (group key) may occur at the edge of the cell. */ - WPRINT_WWD_DEBUG(("Supplicant G1 timeout event\n")); - wiced_join_status[event_header->interface] |= JOIN_EAPOL_KEY_G1_TIMEOUT; - join_attempt_complete = WICED_TRUE; - } - else - { - WPRINT_WWD_DEBUG(("Unsuccessful supplicant event; status=0x%x\n", event_header->status)); - /* Unknown failure during EAPOL key handshake */ - wiced_join_status[event_header->interface] |= JOIN_EAPOL_KEY_FAILURE; - join_attempt_complete = WICED_TRUE; - } - break; - - case WLC_E_SET_SSID: - if ( event_header->status == WLC_E_STATUS_SUCCESS ) - { - /* SSID has been successfully set. */ - wiced_join_status[event_header->interface] |= JOIN_SSID_SET; - } - else if ( event_header->status == WLC_E_STATUS_NO_NETWORKS ) /* We don't bail out on this event or things like WPS won't work if the AP is rebooting after configuration */ - { - wiced_join_status[event_header->interface] |= JOIN_NO_NETWORKS; - } - else - { - join_attempt_complete = WICED_TRUE; - } - break; - - case WLC_E_LINK: - if ( ( event_header->flags & WLC_EVENT_MSG_LINK ) != 0 ) - { - wiced_join_status[event_header->interface] |= JOIN_LINK_READY; - } - else - { - wiced_join_status[event_header->interface] &= ~JOIN_LINK_READY; - } - break; - - case WLC_E_DEAUTH_IND: - case WLC_E_DISASSOC_IND: - wiced_join_status[event_header->interface] &= ~JOIN_AUTHENTICATED; - break; - - case WLC_E_AUTH: - if ( event_header->status == WLC_E_STATUS_SUCCESS ) - { - wiced_join_status[event_header->interface] |= JOIN_AUTHENTICATED; - } - else - { - /* We cannot authenticate. Perhaps we're blocked or at the edge of a cell. */ - join_attempt_complete = WICED_TRUE; - } - break; - - case WLC_E_CSA_COMPLETE_IND: - if (event_header->datalen >= sizeof(wl_chan_switch_t)) - { - wl_chan_switch_t* wl_csa = (wl_chan_switch_t *)event_data; - WPRINT_APP_INFO(("CSA event => chan %d\n", wl_csa->chspec & 0xff)); - } - break; - - /* Note - These are listed to keep gcc pedantic checking happy */ - case WLC_E_RRM: - case WLC_E_NONE: - case WLC_E_ROAM: - case WLC_E_JOIN: - case WLC_E_START: - case WLC_E_AUTH_IND: - case WLC_E_DEAUTH: - case WLC_E_ASSOC: - case WLC_E_ASSOC_IND: - case WLC_E_REASSOC: - case WLC_E_REASSOC_IND: - case WLC_E_DISASSOC: - case WLC_E_QUIET_START: - case WLC_E_QUIET_END: - case WLC_E_BEACON_RX: - case WLC_E_MIC_ERROR: - case WLC_E_NDIS_LINK: - case WLC_E_TXFAIL: - case WLC_E_PMKID_CACHE: - case WLC_E_RETROGRADE_TSF: - case WLC_E_PRUNE: - case WLC_E_AUTOAUTH: - case WLC_E_EAPOL_MSG: - case WLC_E_SCAN_COMPLETE: - case WLC_E_ADDTS_IND: - case WLC_E_DELTS_IND: - case WLC_E_BCNSENT_IND: - case WLC_E_BCNRX_MSG: - case WLC_E_BCNLOST_MSG: - case WLC_E_ROAM_PREP: - case WLC_E_PFN_NET_FOUND: - case WLC_E_PFN_NET_LOST: - case WLC_E_RESET_COMPLETE: - case WLC_E_JOIN_START: - case WLC_E_ROAM_START: - case WLC_E_ASSOC_START: - case WLC_E_IBSS_ASSOC: - case WLC_E_RADIO: - case WLC_E_PSM_WATCHDOG: - case WLC_E_CCX_ASSOC_START: - case WLC_E_CCX_ASSOC_ABORT: - case WLC_E_PROBREQ_MSG: - case WLC_E_SCAN_CONFIRM_IND: - case WLC_E_COUNTRY_CODE_CHANGED: - case WLC_E_EXCEEDED_MEDIUM_TIME: - case WLC_E_ICV_ERROR: - case WLC_E_UNICAST_DECODE_ERROR: - case WLC_E_MULTICAST_DECODE_ERROR: - case WLC_E_TRACE: - case WLC_E_BTA_HCI_EVENT: - case WLC_E_IF: - case WLC_E_PFN_BEST_BATCHING: - case WLC_E_RSSI: - case WLC_E_EXTLOG_MSG: - case WLC_E_ACTION_FRAME: - case WLC_E_ACTION_FRAME_COMPLETE: - case WLC_E_PRE_ASSOC_IND: - case WLC_E_PRE_REASSOC_IND: - case WLC_E_CHANNEL_ADOPTED: - case WLC_E_AP_STARTED: - case WLC_E_DFS_AP_STOP: - case WLC_E_DFS_AP_RESUME: - case WLC_E_WAI_STA_EVENT: - case WLC_E_WAI_MSG: - case WLC_E_ESCAN_RESULT: - case WLC_E_ACTION_FRAME_OFF_CHAN_COMPLETE: - case WLC_E_PROBRESP_MSG: - case WLC_E_P2P_PROBREQ_MSG: - case WLC_E_DCS_REQUEST: - case WLC_E_FIFO_CREDIT_MAP: - case WLC_E_ACTION_FRAME_RX: - case WLC_E_WAKE_EVENT: - case WLC_E_RM_COMPLETE: - case WLC_E_HTSFSYNC: - case WLC_E_OVERLAY_REQ: - case WLC_E_EXCESS_PM_WAKE_EVENT: - case WLC_E_PFN_SCAN_NONE: - case WLC_E_PFN_SCAN_ALLGONE: - case WLC_E_GTK_PLUMBED: - case WLC_E_ASSOC_IND_NDIS: - case WLC_E_REASSOC_IND_NDIS: - case WLC_E_ASSOC_REQ_IE: - case WLC_E_ASSOC_RESP_IE: - case WLC_E_ASSOC_RECREATED: - case WLC_E_ACTION_FRAME_RX_NDIS: - case WLC_E_AUTH_REQ: - case WLC_E_TDLS_PEER_EVENT: - case WLC_E_SPEEDY_RECREATE_FAIL: - case WLC_E_NATIVE: - case WLC_E_PKTDELAY_IND: - case WLC_E_AWDL_AW: - case WLC_E_AWDL_ROLE: - case WLC_E_AWDL_EVENT: - case WLC_E_NIC_AF_TXS: - case WLC_E_NIC_NIC_REPORT: - case WLC_E_BEACON_FRAME_RX: - case WLC_E_SERVICE_FOUND: - case WLC_E_GAS_FRAGMENT_RX: - case WLC_E_GAS_COMPLETE: - case WLC_E_P2PO_ADD_DEVICE: - case WLC_E_P2PO_DEL_DEVICE: - case WLC_E_WNM_STA_SLEEP: - case WLC_E_TXFAIL_THRESH: - case WLC_E_PROXD: - case WLC_E_IBSS_COALESCE: - case WLC_E_AWDL_RX_PRB_RESP: - case WLC_E_AWDL_RX_ACT_FRAME: - case WLC_E_AWDL_WOWL_NULLPKT: - case WLC_E_AWDL_PHYCAL_STATUS: - case WLC_E_AWDL_OOB_AF_STATUS: - case WLC_E_AWDL_SCAN_STATUS: - case WLC_E_AWDL_AW_START: - case WLC_E_AWDL_AW_END: - case WLC_E_AWDL_AW_EXT: - case WLC_E_AWDL_PEER_CACHE_CONTROL: - case WLC_E_CSA_START_IND: - case WLC_E_CSA_DONE_IND: - case WLC_E_CSA_FAILURE_IND: - case WLC_E_CCA_CHAN_QUAL: - case WLC_E_BSSID: - case WLC_E_TX_STAT_ERROR: - case WLC_E_BCMC_CREDIT_SUPPORT: - case WLC_E_PSTA_PRIMARY_INTF_IND: - case WLC_E_P2P_DISC_LISTEN_COMPLETE: - case WLC_E_BT_WIFI_HANDOVER_REQ: - case WLC_E_SPW_TXINHIBIT: - case WLC_E_FBT_AUTH_REQ_IND: - case WLC_E_RSSI_LQM: - case WLC_E_PFN_GSCAN_FULL_RESULT: - case WLC_E_PFN_SWC: - case WLC_E_AUTHORIZED: - case WLC_E_PROBREQ_MSG_RX: - case WLC_E_PFN_SCAN_COMPLETE: - case WLC_E_RMC_EVENT: - case WLC_E_DPSTA_INTF_IND: - case WLC_E_FORCE_32_BIT: - case WLC_E_LAST: - default: - wiced_assert( "Received event which was not registered\n", 0 != 0 ); - break; - } - - if ( wwd_wifi_is_ready_to_transceive( (wwd_interface_t) event_header->interface ) == WWD_SUCCESS ) - { - join_attempt_complete = WICED_TRUE; - } - - if ( join_attempt_complete == WICED_TRUE ) - { - if ( semaphore != NULL ) - { - host_rtos_set_semaphore( semaphore, WICED_FALSE ); - } - return NULL; - } - else - { - return handler_user_data; - } -} - -wwd_result_t wwd_wifi_send_csa( const wiced_chan_switch_t* wiced_csa, wwd_interface_t interface ) -{ - wiced_buffer_t buffer; - wl_chan_switch_t* wl_csa; - - wl_csa = (wl_chan_switch_t*) wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(wl_chan_switch_t), IOVAR_STR_CSA ); - CHECK_IOCTL_BUFFER( wl_csa ); - memset( wl_csa, 0, sizeof(wl_chan_switch_t) ); - wl_csa->mode = wiced_csa->mode; - wl_csa->count = wiced_csa->count; - wl_csa->chspec = wiced_csa->chspec; - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ) ); - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_get_mac_address( wiced_mac_t* mac, wwd_interface_t interface ) -{ - if ( interface == wiced_cached_mac_interface ) - { - memcpy( mac, &wiced_cached_mac, sizeof( wiced_cached_mac ) ); - } - else - { - wiced_buffer_t buffer; - wiced_buffer_t response; - - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(wiced_mac_t), IOVAR_STR_CUR_ETHERADDR ) ); - - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, interface ) ); - - memcpy( mac, host_buffer_get_current_piece_data_pointer( response ), sizeof(wiced_mac_t) ); - host_buffer_release( response, WWD_NETWORK_RX ); - } - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_set_mac_address( wiced_mac_t mac ) -{ - wiced_buffer_t buffer; - uint32_t* data; - - /* Assert when WLAN is UP */ - wiced_assert("WLAN is UP. Ensure WLAN is DOWN before invoking this API", wwd_wlan_status.state == WLAN_DOWN ); - - /* Set the MAC address */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(wiced_mac_t), IOVAR_STR_CUR_ETHERADDR ); - CHECK_IOCTL_BUFFER( data ); - memcpy( data, &mac, sizeof(wiced_mac_t) ); - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_STA_INTERFACE ) ); - - /* Update cache */ - if ( wiced_cached_mac_interface == WWD_STA_INTERFACE ) - { - memcpy( &wiced_cached_mac, &mac, sizeof( wiced_cached_mac ) ); - } - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_get_and_cache_mac_address( wwd_interface_t interface ) -{ - wwd_result_t result; - - if ( interface == WWD_INTERFACE_MAX ) - { - wiced_cached_mac_interface = interface; - return WWD_SUCCESS; - } - - result = wwd_wifi_get_mac_address( &wiced_cached_mac, interface ); - if ( result == WWD_SUCCESS ) - { - wiced_cached_mac_interface = interface; - } - - return result; -} - -wwd_result_t wwd_wifi_is_ready_to_transceive( wwd_interface_t interface ) -{ -#if 0 - /* Handle Splint bug */ /*@-noeffect@*/ (void) wwd_wifi_ap_is_up; /*@+noeffect@*/ -#endif - - switch ( interface ) - { - case WWD_AP_INTERFACE: - return ( wwd_wifi_ap_is_up == WICED_TRUE ) ? WWD_SUCCESS : WWD_INTERFACE_NOT_UP; - - case WWD_P2P_INTERFACE: - if ( wwd_wifi_p2p_go_is_up == WICED_TRUE ) - { - return WWD_SUCCESS; - } - // Otherwise fall through and check P2P client join status - /* Disables Eclipse static analysis warning */ - /* no break */ - case WWD_STA_INTERFACE: - return wwd_wifi_check_join_status( interface ); - /* Disables Eclipse static analysis warning */ - /* No break needed due to returns in all case paths */ - /* no break */ - case WWD_ETHERNET_INTERFACE: - case WWD_INTERFACE_MAX: - case WWD_INTERFACE_FORCE_32_BIT: - default: - wiced_assert( "Bad interface", 0 != 0 ); - return WWD_UNKNOWN_INTERFACE; - } -} - - -wwd_result_t wwd_wifi_enable_powersave_with_throughput( uint16_t return_to_sleep_delay_ms ) -{ - wiced_buffer_t buffer; - uint32_t* data; - - if ( return_to_sleep_delay_ms == 0 ) - { - return_to_sleep_delay_ms = 200; // Use the default value - } - else if ( return_to_sleep_delay_ms < 10 ) - { - return WWD_DELAY_TOO_SHORT; - } - else if ( return_to_sleep_delay_ms > 2000 ) - { - return WWD_DELAY_TOO_LONG; - } - - /* Set the maximum time to wait before going back to sleep */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_PM2_SLEEP_RET ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) ( return_to_sleep_delay_ms / 10 )* 10; - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_STA_INTERFACE ) ); - -#ifdef CHIP_FIRMWARE_SUPPORTS_PM_LIMIT_IOVAR - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_PM_LIMIT ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) NULL_FRAMES_WITH_PM_SET_LIMIT; - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_STA_INTERFACE ) ); -#endif /* ifdef CHIP_FIRMWARE_SUPPORTS_PM_LIMIT_IOVAR */ - - /* set PM2 fast return to sleep powersave mode */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) PM2_POWERSAVE_MODE; - - /* Record the power save mode and the return to sleep delay */ - wiced_wifi_powersave_mode = PM2_POWERSAVE_MODE; - wiced_wifi_return_to_sleep_delay = return_to_sleep_delay_ms; - - RETURN_WITH_ASSERT( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_PM, buffer, NULL, WWD_STA_INTERFACE ) ); -} - - -wwd_result_t wwd_wifi_enable_powersave( void ) -{ - wiced_buffer_t buffer; - uint32_t* data; - - /* Set legacy powersave mode - PM1 */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) PM1_POWERSAVE_MODE; - - /* Save the power save mode */ - wiced_wifi_powersave_mode = PM1_POWERSAVE_MODE; - - RETURN_WITH_ASSERT( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_PM, buffer, NULL, WWD_STA_INTERFACE ) ); -} - - -wwd_result_t wwd_wifi_disable_powersave( void ) -{ - wiced_buffer_t buffer; - - uint32_t* data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER( data ); - *data = NO_POWERSAVE_MODE; - - /* Save the power save mode */ - wiced_wifi_powersave_mode = NO_POWERSAVE_MODE; - - return wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_PM, buffer, NULL, WWD_STA_INTERFACE ); -} - - -uint8_t wiced_wifi_get_powersave_mode( void ) -{ - return wiced_wifi_powersave_mode; -} - -uint16_t wiced_wifi_get_return_to_sleep_delay( void ) -{ - return wiced_wifi_return_to_sleep_delay; -} - -wwd_result_t wwd_wifi_get_tx_power( uint8_t* dbm ) -{ - uint32_t data; - CHECK_RETURN( wwd_wifi_get_iovar_value( IOVAR_STR_QTXPOWER, &data, (wwd_interface_t)(sizeof(data)&3))); - *dbm = ( uint8_t ) ( data / 4 ); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_set_tx_power( uint8_t dbm ) -{ - uint32_t data; - - if ( dbm == (uint8_t) 0xFF ) - { - data = (uint32_t) 127; - } - else - { - data = (uint32_t) ( 4 * dbm ); - } - RETURN_WITH_ASSERT( wwd_wifi_set_iovar_value( IOVAR_STR_QTXPOWER, data, WWD_STA_INTERFACE ) ); -} - - -wwd_result_t wwd_wifi_set_listen_interval( uint8_t listen_interval, wiced_listen_interval_time_unit_t time_unit ) -{ - uint32_t* data; - wiced_buffer_t buffer; - uint8_t listen_interval_dtim; - - if (time_unit == WICED_LISTEN_INTERVAL_TIME_UNIT_DTIM) - { - listen_interval_dtim = listen_interval; - } - else - { - /* If the wake interval measured in DTIMs is set to 0, the wake interval is measured in beacon periods */ - listen_interval_dtim = 0; - - /* The wake period is measured in beacon periods, set the value as required */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_LISTEN_INTERVAL_BEACON ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) listen_interval; - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_STA_INTERFACE ) ); - } - - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_LISTEN_INTERVAL_DTIM ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) listen_interval_dtim; - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_STA_INTERFACE ) ); - - return wwd_wifi_set_listen_interval_assoc( (uint16_t)listen_interval ); - -} - - -wwd_result_t wwd_wifi_set_listen_interval_assoc( uint16_t listen_interval ) -{ - RETURN_WITH_ASSERT( wwd_wifi_set_iovar_value( IOVAR_STR_LISTEN_INTERVAL_ASSOC, listen_interval, WWD_STA_INTERFACE ) ); -} - - -wwd_result_t wwd_wifi_get_listen_interval( wiced_listen_interval_t* li ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - int* data; - - data = (int*)wwd_sdpcm_get_iovar_buffer( &buffer, 4, IOVAR_STR_LISTEN_INTERVAL_BEACON ); - CHECK_IOCTL_BUFFER( data ); - memset( data, 0, 1 ); - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_STA_INTERFACE ) ); - - memcpy( (uint8_t *) &(li->beacon), (char *)host_buffer_get_current_piece_data_pointer( response ), 1 ); - host_buffer_release(response, WWD_NETWORK_RX); - - data = (int*)wwd_sdpcm_get_iovar_buffer( &buffer, 4, IOVAR_STR_LISTEN_INTERVAL_DTIM ); - CHECK_IOCTL_BUFFER( data ); - memset( data, 0, 1 ); - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_STA_INTERFACE ) ); - - memcpy( (uint8_t *) &(li->dtim), (char *)host_buffer_get_current_piece_data_pointer( response ), 1 ); - host_buffer_release(response, WWD_NETWORK_RX); - - data = (int*)wwd_sdpcm_get_iovar_buffer( &buffer, 4, IOVAR_STR_LISTEN_INTERVAL_ASSOC ); - CHECK_IOCTL_BUFFER( data ); - memset( data, 0, 4 ); - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_STA_INTERFACE ) ); - - memcpy( (uint16_t *) &(li->assoc), (char *)host_buffer_get_current_piece_data_pointer( response ), 2 ); - host_buffer_release(response, WWD_NETWORK_RX); - - return WWD_SUCCESS; -} - - -wwd_result_t wwd_wifi_set_ofdm_dutycycle( uint8_t duty_cycle_val ) -{ - if ( duty_cycle_val > 100 ) - { - return WWD_INVALID_DUTY_CYCLE; - } - - RETURN_WITH_ASSERT( wwd_wifi_set_iovar_value( IOVAR_STR_DUTY_CYCLE_OFDM, duty_cycle_val, WWD_STA_INTERFACE ) ); -} - - -wwd_result_t wwd_wifi_set_cck_dutycycle( uint8_t duty_cycle_val ) -{ - if ( duty_cycle_val > 100 ) - { - return WWD_INVALID_DUTY_CYCLE; - } - - RETURN_WITH_ASSERT( wwd_wifi_set_iovar_value( IOVAR_STR_DUTY_CYCLE_CCK, duty_cycle_val, WWD_STA_INTERFACE ) ); -} - - -wwd_result_t wwd_wifi_get_ofdm_dutycycle( uint8_t* duty_cycle_value ) -{ - uint32_t data; - CHECK_RETURN( wwd_wifi_get_iovar_value( IOVAR_STR_DUTY_CYCLE_OFDM, &data, WWD_STA_INTERFACE ) ); - - *duty_cycle_value = (uint8_t)data; - - return WWD_SUCCESS; -} - - -wwd_result_t wwd_wifi_get_cck_dutycycle( uint8_t* duty_cycle_value ) -{ - uint32_t data; - CHECK_RETURN( wwd_wifi_get_iovar_value( IOVAR_STR_DUTY_CYCLE_CCK, &data, WWD_STA_INTERFACE ) ); - - *duty_cycle_value = (uint8_t)data; - - return WWD_SUCCESS; -} - - -wwd_result_t wwd_wifi_get_pmk( const char* psk, uint8_t psk_length, char* pmk ) -{ - wsec_pmk_t* psk_ioctl; - wiced_buffer_t buffer; - wiced_buffer_t response; - wsec_pmk_t* psk_info; - - psk_ioctl = ( wsec_pmk_t* )wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(wsec_pmk_t) ); - CHECK_IOCTL_BUFFER( psk_ioctl ); - - /* validate the input: can be called from command line */ - if ( psk_length > sizeof(psk_ioctl->key) ) - { - return WWD_WLAN_ERROR; - } - else if (psk_length < sizeof(psk_ioctl->key)) - { - /* 0 terminate if possible */ - psk_ioctl->key[psk_length] = 0; - } - - memcpy( psk_ioctl->key, psk, psk_length ); - - psk_ioctl->key_len = psk_length; - psk_ioctl->flags = 0; - - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_GET_WSEC_PMK, buffer, &response, WWD_STA_INTERFACE ) ); - - psk_info = (wsec_pmk_t*) host_buffer_get_current_piece_data_pointer( response ); - if ( psk_info->key_len != WSEC_MAX_PSK_LEN ) - { - host_buffer_release( response, WWD_NETWORK_RX ); - return WWD_PMK_WRONG_LENGTH; - } - memcpy( pmk, psk_info->key, psk_info->key_len ); - host_buffer_release( response, WWD_NETWORK_RX ); - return WWD_SUCCESS; -} - - -wwd_result_t wwd_wifi_register_multicast_address_for_interface( const wiced_mac_t* mac, wwd_interface_t interface ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - uint16_t a; - mcast_list_t* orig_mcast_list; - mcast_list_t* new_mcast_list; - - /* Get the current multicast list */ - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(uint32_t) + MAX_SUPPORTED_MCAST_ENTRIES * sizeof(wiced_mac_t), IOVAR_STR_MCAST_LIST ) ); - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, interface ) ); - - /* Verify address is not currently registered */ - orig_mcast_list = (mcast_list_t*) host_buffer_get_current_piece_data_pointer( response ); - for ( a = 0; a < orig_mcast_list->entry_count; ++a ) - { - /* Check if any address matches */ - if ( 0 == memcmp( mac, &orig_mcast_list->macs[a], sizeof(wiced_mac_t) ) ) - { - /* A matching address has been found so we can stop now. */ - host_buffer_release( response, WWD_NETWORK_RX ); - return WWD_SUCCESS; - } - } - - /* Add the provided address to the list and write the new multicast list */ - new_mcast_list = (mcast_list_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) ( sizeof(uint32_t) + ( orig_mcast_list->entry_count + 1 ) * sizeof(wiced_mac_t) ), IOVAR_STR_MCAST_LIST ); - CHECK_IOCTL_BUFFER( new_mcast_list ); - new_mcast_list->entry_count = orig_mcast_list->entry_count; - memcpy( new_mcast_list->macs, orig_mcast_list->macs, orig_mcast_list->entry_count * sizeof(wiced_mac_t) ); - host_buffer_release( response, WWD_NETWORK_RX ); - memcpy( &new_mcast_list->macs[new_mcast_list->entry_count], mac, sizeof(wiced_mac_t) ); - ++new_mcast_list->entry_count; - RETURN_WITH_ASSERT( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ) ); -} - - -wwd_result_t wwd_wifi_register_multicast_address( const wiced_mac_t* mac ) -{ - return wwd_wifi_register_multicast_address_for_interface( mac, WWD_STA_INTERFACE ); -} - -wwd_result_t wwd_wifi_unregister_multicast_address_for_interface( const wiced_mac_t* mac, wwd_interface_t interface ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - uint16_t a; - mcast_list_t* orig_mcast_list; - - /* Get the current multicast list */ - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(uint32_t) + MAX_SUPPORTED_MCAST_ENTRIES * sizeof(wiced_mac_t), IOVAR_STR_MCAST_LIST ) ); - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, interface ) ); - - /* Find the address, assuming it is part of the list */ - orig_mcast_list = (mcast_list_t*) host_buffer_get_current_piece_data_pointer( response ); - if ( orig_mcast_list->entry_count != 0 ) - { - mcast_list_t* new_mcast_list = (mcast_list_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) ( sizeof(uint32_t) + ( orig_mcast_list->entry_count - 1 ) * sizeof(wiced_mac_t) ), IOVAR_STR_MCAST_LIST ); - CHECK_IOCTL_BUFFER( new_mcast_list ); - for ( a = 0; a < orig_mcast_list->entry_count; ++a ) - { - if ( 0 == memcmp( mac, &orig_mcast_list->macs[a], sizeof(wiced_mac_t) ) ) - { - /* Copy the existing list up to the matching address */ - memcpy( new_mcast_list->macs, orig_mcast_list->macs, a * sizeof(wiced_mac_t) ); - - /* Skip the current address and copy the remaining entries */ - memcpy( &new_mcast_list->macs[a], &orig_mcast_list->macs[a + 1], ( size_t )( orig_mcast_list->entry_count - a - 1 ) * sizeof(wiced_mac_t) ); - - new_mcast_list->entry_count = orig_mcast_list->entry_count - 1; - host_buffer_release( response, WWD_NETWORK_RX ); - RETURN_WITH_ASSERT( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ) ); - } - } - /* There was something in the list, but the request MAC wasn't there */ - host_buffer_release( buffer, WWD_NETWORK_TX ); - } - /* If we get here than the address wasn't in the list or the list was empty */ - host_buffer_release( response, WWD_NETWORK_RX ); - return WWD_SUCCESS; -} - - -wwd_result_t wwd_wifi_unregister_multicast_address( const wiced_mac_t* mac ) -{ - return wwd_wifi_unregister_multicast_address_for_interface( mac, WWD_STA_INTERFACE ); -} - -wwd_result_t wwd_wifi_get_rssi( int32_t* rssi ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ) ); - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_GET_RSSI, buffer, &response, WWD_STA_INTERFACE ) ); - - memcpy( rssi, host_buffer_get_current_piece_data_pointer( response ), sizeof(int32_t) ); - host_buffer_release( response, WWD_NETWORK_RX ); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_get_noise( int32_t* noise ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ) ); - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_GET_PHY_NOISE, buffer, &response, WWD_STA_INTERFACE ) ); - - memcpy( noise, host_buffer_get_current_piece_data_pointer( response ), sizeof(int32_t) ); - host_buffer_release( response, WWD_NETWORK_RX ); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_get_ap_client_rssi( int32_t* rssi, const wiced_mac_t* client_mac_addr ) -{ - client_rssi_t* client_rssi; - wiced_buffer_t buffer; - wiced_buffer_t response; - - /* WLAN expects buffer size to be 4-byte aligned */ - client_rssi = (client_rssi_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, ROUND_UP( sizeof(client_rssi_t), sizeof(uint32_t)) ); - CHECK_IOCTL_BUFFER( client_rssi ); - - memcpy(&client_rssi->mac_address, client_mac_addr, sizeof(wiced_mac_t)); - client_rssi->value = 0; - - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_GET_RSSI, buffer, &response, WWD_AP_INTERFACE ) ); - - memcpy( rssi, host_buffer_get_current_piece_data_pointer( response ), sizeof(int32_t) ); - host_buffer_release( response, WWD_NETWORK_RX ); - return WWD_SUCCESS; -} - - -wwd_result_t wwd_wifi_select_antenna( wiced_antenna_t antenna ) -{ - wiced_buffer_t buffer; - uint32_t* data; - - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) antenna; - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_TXANT, buffer, 0, WWD_STA_INTERFACE ) ); - - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) antenna; - RETURN_WITH_ASSERT( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_ANTDIV, buffer, 0, WWD_STA_INTERFACE ) ); -} - - -wwd_result_t wwd_wifi_set_roam_trigger( int32_t trigger_level ) -{ - wiced_buffer_t buffer; - uint32_t* data; - - data = (uint32_t*)wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t)sizeof(uint32_t) ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t)trigger_level; - - return wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_ROAM_TRIGGER, buffer, 0, WWD_STA_INTERFACE ); -} - - -wwd_result_t wwd_wifi_get_roam_trigger( int32_t* trigger_level ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - int32_t* data; - - /* Validate input arguments */ - wiced_assert("Bad args", trigger_level != NULL); - - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t)sizeof(uint32_t) ) ); - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_GET_ROAM_TRIGGER, buffer, &response, WWD_STA_INTERFACE ) ); - data = (int32_t*)host_buffer_get_current_piece_data_pointer( response ); - *trigger_level = *data; - - host_buffer_release( response, WWD_NETWORK_RX ); - return WWD_SUCCESS; -} - - -wwd_result_t wwd_wifi_set_roam_delta( int32_t trigger_delta ) -{ - wiced_buffer_t buffer; - uint32_t* data; - - data = (uint32_t*)wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t)sizeof(uint32_t) ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) trigger_delta; - - return wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_ROAM_DELTA, buffer, 0, WWD_STA_INTERFACE ); -} - - -wwd_result_t wwd_wifi_get_roam_delta( int32_t* trigger_delta ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - int32_t* data; - - wiced_assert("Bad args", trigger_delta != NULL); - - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t)sizeof(uint32_t) ) ); - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_GET_ROAM_DELTA, buffer, &response, WWD_STA_INTERFACE ) ); - data = (int32_t*)host_buffer_get_current_piece_data_pointer( response ); - *trigger_delta = *data; - - host_buffer_release( response, WWD_NETWORK_RX ); - return WWD_SUCCESS; -} - - -wwd_result_t wwd_wifi_set_roam_scan_period( uint32_t roam_scan_period ) -{ - wiced_buffer_t buffer; - uint32_t* data; - - data = (uint32_t*)wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t)sizeof(uint32_t) ); - CHECK_IOCTL_BUFFER( data ); - *data = roam_scan_period; - - return wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_ROAM_SCAN_PERIOD, buffer, 0, WWD_STA_INTERFACE ); -} - - -wwd_result_t wwd_wifi_get_roam_scan_period( uint32_t* roam_scan_period ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - uint32_t* data; - - /* Validate input arguments */ - wiced_assert("Bad args", roam_scan_period != NULL); - - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t)sizeof(uint32_t) ) ); - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_GET_ROAM_SCAN_PERIOD, buffer, &response, WWD_STA_INTERFACE ) ); - data = (uint32_t*)host_buffer_get_current_piece_data_pointer( response ); - *roam_scan_period = *data; - - host_buffer_release( response, WWD_NETWORK_RX ); - return WWD_SUCCESS; -} - - -wwd_result_t wwd_wifi_turn_off_roam( wiced_bool_t disable ) -{ - wiced_buffer_t buffer; - - uint32_t* data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(wl_pkt_filter_enable_t), IOVAR_STR_ROAM_OFF ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t)disable; - RETURN_WITH_ASSERT( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_STA_INTERFACE ) ); -} - - -wwd_result_t wwd_wifi_send_action_frame( const wl_action_frame_t* action_frame, wwd_interface_t interface ) -{ - wiced_buffer_t buffer; - wiced_action_frame_t* frame; - uint32_t* a = (uint32_t*) wwd_sdpcm_get_iovar_buffer(&buffer, sizeof(wiced_action_frame_t)+4, "bsscfg:" IOVAR_STR_ACTION_FRAME ); - CHECK_IOCTL_BUFFER( a ); - *a = wwd_get_bss_index( interface ); - frame = (wiced_action_frame_t*)(a+1); - memcpy(frame, action_frame, sizeof(wiced_action_frame_t)); - RETURN_WITH_ASSERT( wwd_sdpcm_send_iovar(SDPCM_SET, buffer, NULL, WWD_STA_INTERFACE) ); -} - - -wwd_result_t wwd_wifi_get_acparams_sta( edcf_acparam_t *acp ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - - int* data = (int*) wwd_sdpcm_get_iovar_buffer( &buffer, 64, IOVAR_STR_AC_PARAMS_STA ); - CHECK_IOCTL_BUFFER( data ); - memset( data, 0, 64 ); - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_STA_INTERFACE ) ); - - memcpy( (char *)acp, (char *)host_buffer_get_current_piece_data_pointer( response ), ( sizeof( edcf_acparam_t ) * 4 ) ); - host_buffer_release(response, WWD_NETWORK_RX); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_enable_monitor_mode( void ) -{ - wiced_buffer_t buffer; - uint32_t* data; - - /* Enable allmulti mode */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer(&buffer, 4, IOVAR_STR_ALLMULTI ); - CHECK_IOCTL_BUFFER( data ); - *data = 1; - - CHECK_RETURN( wwd_sdpcm_send_iovar(SDPCM_SET, buffer, NULL, WWD_STA_INTERFACE) ); - - /* Enable monitor mode */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer(&buffer, 4); - CHECK_IOCTL_BUFFER( data ); - *data = 1; - - CHECK_RETURN( wwd_sdpcm_send_ioctl(SDPCM_SET, WLC_SET_MONITOR, buffer, NULL, WWD_STA_INTERFACE) ); - - wwd_sdpcm_monitor_mode_enabled = WICED_TRUE; - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_disable_monitor_mode( void ) -{ - wiced_buffer_t buffer; - uint32_t* data; - - /* Disable allmulti mode */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer(&buffer, 4, IOVAR_STR_ALLMULTI ); - CHECK_IOCTL_BUFFER( data ); - *data = 0; - - CHECK_RETURN( wwd_sdpcm_send_iovar(SDPCM_SET, buffer, NULL, WWD_STA_INTERFACE) ); - - /* Disable monitor mode */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer(&buffer, 4); - CHECK_IOCTL_BUFFER( data ); - *data = 0; - - CHECK_RETURN( wwd_sdpcm_send_ioctl(SDPCM_SET, WLC_SET_MONITOR, buffer, NULL, WWD_STA_INTERFACE) ); - - wwd_sdpcm_monitor_mode_enabled = WICED_FALSE; - return WWD_SUCCESS; -} - -wiced_bool_t wwd_wifi_monitor_mode_is_enabled( void ) -{ - return wwd_sdpcm_monitor_mode_enabled; -} - -wwd_result_t wwd_wifi_get_bssid( wiced_mac_t* bssid ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - wwd_result_t result; - - memset( bssid, 0, sizeof( wiced_mac_t ) ); - - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof( wiced_mac_t ) ) ); - if ( ( result = wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_GET_BSSID, buffer, &response, WWD_STA_INTERFACE ) ) == WWD_SUCCESS ) - { - memcpy( bssid->octet, host_buffer_get_current_piece_data_pointer( response ), sizeof( wiced_mac_t ) ); - host_buffer_release( response, WWD_NETWORK_RX ); - } - - return result; -} - -wwd_result_t wwd_wifi_set_preferred_association_band( int32_t band ) -{ - wiced_buffer_t buffer; - int32_t* data; - - /* Set preferred band */ - data = (int32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t)sizeof(int32_t) ); - CHECK_IOCTL_BUFFER( data ); - *data = band; - - RETURN_WITH_ASSERT( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_ASSOC_PREFER, buffer, NULL, WWD_STA_INTERFACE ) ); -} - -wwd_result_t wwd_wifi_get_preferred_association_band( int32_t* band ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - int32_t* data; - - wiced_assert("Bad args", band != NULL); - - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t)sizeof(uint32_t) ) ); - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_SET_ASSOC_PREFER, buffer, &response, WWD_STA_INTERFACE ) ); - data = (int32_t*)host_buffer_get_current_piece_data_pointer( response ); - *band = *data; - - host_buffer_release( response, WWD_NETWORK_RX ); - return WWD_SUCCESS; -} - - -/****************************************************** - * Wiced-internal functions - ******************************************************/ - -/** Set the Wi-Fi device down. Internal use only - * - * @param interface - * @return - */ -wwd_result_t wwd_wifi_set_down( void ) -{ - wiced_buffer_t buffer; - - if (wwd_wlan_status.state != WLAN_UP) - { - WPRINT_WWD_INFO(("wwd_wifi_set_down: already down.\n")); - return WWD_INTERFACE_NOT_UP; - } - - /* Send DOWN command */ - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_ioctl_buffer( &buffer, 0 ) ) - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_DOWN, buffer, 0, WWD_STA_INTERFACE ) ); - - /* Update wlan status */ - wwd_wlan_status.state = WLAN_DOWN; - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_set_up( void ) -{ - wiced_buffer_t buffer; - - if (wwd_wlan_status.state == WLAN_UP) - { - WPRINT_WWD_INFO(("wwd_wifi_set_up: already up.\n")); - return WWD_SUCCESS; - } - - /* Send UP command */ - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_ioctl_buffer( &buffer, 0 ) ) - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_UP, buffer, 0, WWD_STA_INTERFACE ) ); - - /* Update wlan status */ - wwd_wlan_status.state = WLAN_UP; - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_manage_custom_ie( wwd_interface_t interface, wiced_custom_ie_action_t action, /*@unique@*/ const uint8_t* oui, uint8_t subtype, const void* data, uint16_t length, uint16_t which_packets) -{ - wiced_buffer_t buffer; - vndr_ie_setbuf_t* ie_setbuf; - uint32_t* iovar_data; - - wiced_assert("Bad Args", oui != NULL); - - iovar_data = (uint32_t*)wwd_sdpcm_get_iovar_buffer(&buffer, (uint16_t)(sizeof(vndr_ie_setbuf_t) + length + 4), "bsscfg:" IOVAR_STR_VENDOR_IE ); - CHECK_IOCTL_BUFFER( iovar_data ); - *iovar_data = wwd_get_bss_index( interface ); - ie_setbuf = (vndr_ie_setbuf_t*)(iovar_data+1); - - /* Copy the vndr_ie SET command ("add"/"del") to the buffer */ - if (action == WICED_ADD_CUSTOM_IE) - { - memcpy( (char*)ie_setbuf->cmd, "add", 3 ); - } - else - { - memcpy( (char*)ie_setbuf->cmd, "del", 3 ); - } - ie_setbuf->cmd[3] = 0; - - /* Set the values */ - ie_setbuf->vndr_ie_buffer.iecount = (int32_t) 1; - - ie_setbuf->vndr_ie_buffer.vndr_ie_list[0].pktflag = which_packets; - ie_setbuf->vndr_ie_buffer.vndr_ie_list[0].vndr_ie_data.id = 0xdd; - ie_setbuf->vndr_ie_buffer.vndr_ie_list[0].vndr_ie_data.len = (uint8_t)(length + sizeof(ie_setbuf->vndr_ie_buffer.vndr_ie_list[0].vndr_ie_data.oui) + 1); /* +1: one byte for sub type */ - - /*@-usedef@*/ /* Stop lint warning about vndr_ie_list array element not yet being defined */ - memcpy( ie_setbuf->vndr_ie_buffer.vndr_ie_list[0].vndr_ie_data.oui, oui, (size_t)WIFI_IE_OUI_LENGTH ); - /*@+usedef@*/ - - ie_setbuf->vndr_ie_buffer.vndr_ie_list[0].vndr_ie_data.data[0] = subtype; - - memcpy(&ie_setbuf->vndr_ie_buffer.vndr_ie_list[0].vndr_ie_data.data[1], data, length); - - RETURN_WITH_ASSERT( wwd_sdpcm_send_iovar(SDPCM_SET, buffer, NULL, WWD_STA_INTERFACE ) ); -} - - -void wwd_wifi_prioritize_acparams( const edcf_acparam_t *acp, int *priority ) -{ - int aci; - int aifsn; - int ecwmin; - int ecwmax; - int ranking_basis[AC_COUNT]; - int *p; - int i; - - p = priority; - - for (aci = 0; aci < AC_COUNT; aci++, acp++, p++) - { - aifsn = acp->ACI & EDCF_AIFSN_MASK; - ecwmin = acp->ECW & EDCF_ECWMIN_MASK; - ecwmax = (acp->ECW & EDCF_ECWMAX_MASK) >> EDCF_ECWMAX_SHIFT; - ranking_basis[aci] = aifsn + ecwmin + ecwmax; /* Default AC_VO will be the littlest ranking value */ - *p = 1; /* Initialise priority starting at 1 */ - } - - p = priority; - - /* Primitive ranking method which works for AC priority swapping when values for cwmin, cwmax and aifsn are varied */ - for (aci = 0; aci < AC_COUNT; aci++, p++) /* Compare each ACI against each other ACI */ - { - for (i = 0; i < AC_COUNT; i++) - { - if ( i != aci ) - { - /* Smaller ranking value has higher priority, so increment priority for each ACI which has a higher ranking value */ - if (ranking_basis[aci] < ranking_basis[i]) - { - *p = *p + 1; - } - } - } - } - - // Now invert so that highest priority is the lowest number, e.g. for default settings voice will be priority 1 and background will be priority 4 - p = priority; - for (i = 0; i < AC_COUNT; i++, p++) - { - *p = AC_COUNT + 1 - *p; - } -} - -wwd_result_t wwd_wifi_update_tos_map( void ) -{ - edcf_acparam_t ac_params[AC_COUNT]; - const wiced_qos_access_category_t tos_to_ac_map[8] = { WMM_AC_BE, WMM_AC_BK, WMM_AC_BK, WMM_AC_BE, WMM_AC_VI, WMM_AC_VI, WMM_AC_VO, WMM_AC_VO }; - wiced_qos_access_category_t ac; - wiced_bool_t admission_control_mandatory[AC_COUNT]; - int i, j; - - if ( wwd_wifi_get_acparams_sta( ac_params ) != WWD_SUCCESS ) - { - return WWD_WLAN_ERROR; - } - - /* For each access category, record whether admission control is necessary or not */ - for (i = 0; i < AC_COUNT; i++) - { - j = (ac_params[i].ACI & EDCF_ACI_MASK) >> EDCF_ACI_SHIFT; // Determine which access category (in case they're out of order) - if ( ( ac_params[i].ACI & EDCF_ACM_MASK ) == 0 ) - { - admission_control_mandatory[j] = WICED_FALSE; - } - else - { - admission_control_mandatory[j] = WICED_TRUE; - } - } - - /* For each type of service value look up the Access Category that is mapped to this type of service and update the TOS map - * with what the AP actually allows, if necessary */ - for (i = 0; i < 8; i++ ) - { - ac = tos_to_ac_map[i]; - if ( admission_control_mandatory[ac] == WICED_FALSE ) /* No need to re-map to lower priority */ - { - wwd_tos_map[i] = (uint8_t)i; - } - else - { - if ( ac == WMM_AC_VO ) - { - if ( admission_control_mandatory[WMM_AC_VI] == WICED_FALSE ) - { - wwd_tos_map[i] = WMM_AC_VI; - } - else if ( admission_control_mandatory[WMM_AC_BE] == WICED_FALSE ) - { - wwd_tos_map[i] = WMM_AC_BE; - } - else - { - wwd_tos_map[i] = WMM_AC_BK; - } - } - else if ( ac == WMM_AC_VI ) - { - if ( admission_control_mandatory[WMM_AC_BE] == WICED_FALSE ) - { - wwd_tos_map[i] = WMM_AC_BE; - } - else - { - wwd_tos_map[i] = WMM_AC_BK; - } - } - else /* Case for best effort and background is the same since we are going to send at lowest priority anyway */ - { - wwd_tos_map[i] = WMM_AC_BK; - } - } - } - - return WWD_SUCCESS; -} - -void wwd_wifi_edcf_ac_params_print( const wiced_edcf_ac_param_t *acp, const int *priority ) -{ -#ifdef WPRINT_ENABLE_WWD_DEBUG - int aci; - int acm, aifsn, ecwmin, ecwmax, txop; - static const char ac_names[AC_COUNT][6] = {"AC_BE", "AC_BK", "AC_VI", "AC_VO"}; - - if ( acp != NULL ) - { - for (aci = 0; aci < AC_COUNT; aci++, acp++) - { - if (((acp->ACI & EDCF_ACI_MASK) >> EDCF_ACI_SHIFT) != aci) - { - WPRINT_WWD_ERROR(("Warning: AC params out of order\n")); - } - acm = (acp->ACI & EDCF_ACM_MASK) ? 1 : 0; - aifsn = acp->ACI & EDCF_AIFSN_MASK; - ecwmin = acp->ECW & EDCF_ECWMIN_MASK; - ecwmax = (acp->ECW & EDCF_ECWMAX_MASK) >> EDCF_ECWMAX_SHIFT; - txop = (uint16_t)acp->TXOP; - WPRINT_WWD_DEBUG(("%s: raw: ACI 0x%x ECW 0x%x TXOP 0x%x\n", ac_names[aci], acp->ACI, acp->ECW, txop)); - WPRINT_WWD_DEBUG((" dec: aci %d acm %d aifsn %d " "ecwmin %d ecwmax %d txop 0x%x\n", aci, acm, aifsn, ecwmin, ecwmax, txop) ); - /* CWmin = 2^(ECWmin) - 1 */ - /* CWmax = 2^(ECWmax) - 1 */ - /* TXOP = number of 32 us units */ - WPRINT_WWD_DEBUG((" eff: CWmin %d CWmax %d TXop %dusec\n", EDCF_ECW2CW(ecwmin), EDCF_ECW2CW(ecwmax), EDCF_TXOP2USEC(txop))); - } - } - - if ( priority != NULL ) - { - for (aci = 0; aci < AC_COUNT; aci++, priority++) - { - WPRINT_WWD_DEBUG(("%s: ACI %d Priority %d\n", ac_names[aci], aci, *priority)); - } - } -#else /* ifdef WPRINT_ENABLE_WWD_DEBUG */ - UNUSED_PARAMETER( acp ); - UNUSED_PARAMETER( priority ); -#endif /* ifdef WPRINT_ENABLE_WWD_DEBUG */ -} - - -wwd_result_t wwd_wifi_get_channel( wwd_interface_t interface, uint32_t* channel ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - channel_info_t* channel_info; - - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(channel_info_t) ) ); - - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_GET_CHANNEL, buffer, &response, interface ) ); - - channel_info = (channel_info_t*) host_buffer_get_current_piece_data_pointer( response ); - *channel = (uint32_t)channel_info->hw_channel; - host_buffer_release( response, WWD_NETWORK_RX ); - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_set_channel( wwd_interface_t interface, uint32_t channel ) -{ - wiced_buffer_t buffer; - uint32_t* data; - wl_chan_switch_t* chan_switch; - wwd_interface_t temp_interface = interface; - - /* Map P2P interface to either STA or AP interface depending if it's running as group owner or client */ - if ( interface == WWD_P2P_INTERFACE ) - { - if ( wwd_wifi_p2p_go_is_up == WICED_TRUE ) - { - temp_interface = WWD_AP_INTERFACE; - } - else - { - temp_interface = WWD_STA_INTERFACE; - } - } - - switch ( temp_interface ) - { - case WWD_STA_INTERFACE: - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(uint32_t) ); - CHECK_IOCTL_BUFFER( data ); - *data = channel; - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_SET_CHANNEL, buffer, NULL, interface ) ); - break; - - case WWD_AP_INTERFACE: - chan_switch = (wl_chan_switch_t*)wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(wl_chan_switch_t), IOVAR_STR_CSA ); - CHECK_IOCTL_BUFFER( chan_switch ); - chan_switch->chspec = (wl_chanspec_t)(WL_CHANSPEC_BW_20 | WL_CHANSPEC_CTL_SB_NONE | channel); - chan_switch->chspec |= wwd_channel_to_wl_band( channel ); - chan_switch->count = 1; - chan_switch->mode = 1; - chan_switch->reg = 0; - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, interface ) ); - break; - - case WWD_P2P_INTERFACE: - case WWD_ETHERNET_INTERFACE: - case WWD_INTERFACE_MAX: - case WWD_INTERFACE_FORCE_32_BIT: - default: - wiced_assert( "Bad interface", 0 != 0 ); - return WWD_UNKNOWN_INTERFACE; - } - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_get_counters( wwd_interface_t interface, wiced_counters_t* counters ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - wiced_counters_t* received_counters; - - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(wiced_counters_t), IOVAR_STR_COUNTERS ) ); - - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, interface ) ); - - received_counters = (wiced_counters_t*) host_buffer_get_current_piece_data_pointer( response ); - memcpy(counters, received_counters, sizeof(wiced_counters_t)); - host_buffer_release( response, WWD_NETWORK_RX ); - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_get_rate( wwd_interface_t interface, uint32_t* rate ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - int32_t* wl_rate; - - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(int32_t) ) ); - CHECK_RETURN (wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_GET_RATE, buffer, &response, interface )); - wl_rate = (int32_t*) host_buffer_get_current_piece_data_pointer( response ); - memcpy(rate, wl_rate, sizeof(uint32_t)); - if (*wl_rate == -1) - *rate = 0; - host_buffer_release(response, WWD_NETWORK_RX); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_set_band_specific_rate( wwd_interface_t interface, uint32_t rate ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - uint32_t band; - uint32_t bandlist[3]; - char aname[] = IOVAR_STR_ARATE; - char bgname[] = IOVAR_STR_BGRATE; - char *name; - int32_t *data; - - /* Get band */ - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(uint32_t) ) ); - CHECK_RETURN (wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_GET_BAND, buffer, &response, interface )); - band = *(uint32_t*) host_buffer_get_current_piece_data_pointer( response ); - host_buffer_release(response, WWD_NETWORK_RX); - - /* Get supported Band List */ - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(bandlist) ) ); - CHECK_RETURN (wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_GET_BANDLIST, buffer, &response, interface )); - memcpy(bandlist, (uint32_t*) host_buffer_get_current_piece_data_pointer( response ), sizeof(bandlist)); - host_buffer_release(response, WWD_NETWORK_RX); - - /* only support a maximum of 2 bands */ - if (!bandlist[0]) - return WWD_WLAN_ERROR; - else if (bandlist[0] > 2) - bandlist[0] = 2; - - switch (band) { - /* In case of auto band selection the current associated band will be in the entry 1 */ - case WLC_BAND_AUTO : - if (bandlist[1] == WLC_BAND_5G) - name = (char *)aname; - else if (bandlist[1] == WLC_BAND_2G) - name = (char *)bgname; - else - return WWD_WLAN_ERROR; - - break; - - case WLC_BAND_5G : - name = (char *)aname; - break; - - case WLC_BAND_2G : - name = (char *)bgname; - break; - - default : - return WWD_WLAN_ERROR; - //break; - } - - data = (int32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(int32_t), name ); - CHECK_IOCTL_BUFFER( data ); - if (rate == 0) - *data = -1; // Auto rate - else - *data = (int32_t)rate; - - RETURN_WITH_ASSERT( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_STA_INTERFACE ) ); -} - -wwd_result_t wwd_wifi_get_supported_band_list( wiced_band_list_t* band_list ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - - /* Get supported Band List */ - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(wiced_band_list_t) ) ); - CHECK_RETURN (wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_GET_BANDLIST, buffer, &response, WWD_STA_INTERFACE )); - memcpy(band_list, (uint32_t*) host_buffer_get_current_piece_data_pointer( response ), sizeof(wiced_band_list_t)); - host_buffer_release(response, WWD_NETWORK_RX); - - if ( band_list->number_of_bands == 0 ) - { - return WWD_WLAN_ERROR; - } - - return WWD_SUCCESS; -} - - -/* STF parameters are not yet supported - FIXME*/ -wwd_result_t wwd_wifi_set_mcs_rate( wwd_interface_t interface, int32_t mcs, wiced_bool_t mcsonly ) -{ - wiced_buffer_t buffer; - int32_t *data; - uint32_t nrate = 0; - - if (mcs != -1) - { - nrate |= mcs & NRATE_RATE_MASK; - nrate |= NRATE_MCS_INUSE; - - if (mcsonly) - { - nrate |= NRATE_OVERRIDE_MCS_ONLY; - } - data = (int32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(int32_t), IOVAR_STR_NRATE ); - CHECK_IOCTL_BUFFER( data ); - *data = (int32_t)nrate; - - RETURN_WITH_ASSERT( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ) ); - } - else - { - /* reset rates to auto */ - RETURN_WITH_ASSERT( wwd_wifi_set_band_specific_rate( interface, 0 )); - } -} - -wwd_result_t wwd_wifi_set_legacy_rate( wwd_interface_t interface, int32_t rate ) -{ - wiced_buffer_t buffer; - int32_t *data; - uint32_t nrate = 0; - - if (rate != 0) - { - nrate |= rate & NRATE_RATE_MASK; - - data = (int32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(int32_t), IOVAR_STR_NRATE ); - CHECK_IOCTL_BUFFER( data ); - *data = (int32_t)nrate; - - RETURN_WITH_ASSERT( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ) ); - } - else - { - /* reset rates to auto */ - data = (int32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(int32_t), IOVAR_STR_BGRATE ); - CHECK_IOCTL_BUFFER( data ); - *data = -1; - - RETURN_WITH_ASSERT( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ) ); - } -} - -wwd_result_t wwd_wifi_set_11n_support( wwd_interface_t interface, wiced_11n_support_t value ) -{ - wiced_buffer_t buffer; - uint32_t* data; - - /* Assert when WLAN is UP */ - wiced_assert("WLAN is UP. Ensure WLAN is DOWN before invoking this API", wwd_wlan_status.state == WLAN_DOWN ); - - /* Configure PHY for N-Mode */ - data = wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(uint32_t), IOVAR_STR_NMODE ); - CHECK_IOCTL_BUFFER( data ); - *data = value; - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ) ); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_set_packet_filter_mode( wiced_packet_filter_mode_t mode ) -{ - wiced_buffer_t buffer; - - uint32_t* data = (uint32_t*)wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(uint32_t), IOVAR_STR_PKT_FILTER_MODE ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t)mode; - RETURN_WITH_ASSERT( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_STA_INTERFACE ) ); -} - -wwd_result_t wwd_wifi_add_packet_filter( const wiced_packet_filter_t* settings ) -{ - wl_pkt_filter_t* packet_filter; - wiced_buffer_t buffer; - uint32_t buffer_length = (uint32_t)(( 2 * (uint32_t)settings->mask_size ) + WL_PKT_FILTER_FIXED_LEN + WL_PKT_FILTER_PATTERN_FIXED_LEN); - - packet_filter = (wl_pkt_filter_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t)buffer_length , IOVAR_STR_PKT_FILTER_ADD ); - CHECK_IOCTL_BUFFER( packet_filter ); - - /* Copy filter entries */ - packet_filter->id = settings->id; - packet_filter->type = 0; - packet_filter->negate_match = settings->rule; - packet_filter->u.pattern.offset = (uint32_t)settings->offset; - packet_filter->u.pattern.size_bytes = settings->mask_size; - - /* Copy mask */ - memcpy( packet_filter->u.pattern.mask_and_pattern, settings->mask, settings->mask_size ); - - /* Copy filter pattern */ - memcpy( packet_filter->u.pattern.mask_and_pattern + settings->mask_size, settings->pattern, settings->mask_size ); - - RETURN_WITH_ASSERT( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_STA_INTERFACE ) ); -} - -wwd_result_t wwd_wifi_remove_packet_filter( uint8_t filter_id ) -{ - wiced_buffer_t buffer; - - uint32_t* data = (uint32_t*)wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(uint32_t), IOVAR_STR_PKT_FILTER_DELETE ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t)filter_id; - RETURN_WITH_ASSERT( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_STA_INTERFACE ) ); -} - -wwd_result_t wwd_wifi_enable_packet_filter( uint8_t filter_id ) -{ - return wwd_wifi_toggle_packet_filter( filter_id, WICED_TRUE ); -} - -wwd_result_t wwd_wifi_disable_packet_filter( uint8_t filter_id ) -{ - return wwd_wifi_toggle_packet_filter( filter_id, WICED_FALSE ); -} - -wwd_result_t wwd_wifi_toggle_packet_filter( uint8_t filter_id, wiced_bool_t enable ) -{ - wiced_buffer_t buffer; - - wl_pkt_filter_enable_t* data = (wl_pkt_filter_enable_t*) wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(wl_pkt_filter_enable_t), IOVAR_STR_PKT_FILTER_ENABLE ); - CHECK_IOCTL_BUFFER( data ); - data->id = (uint32_t)filter_id; - data->enable = (uint32_t)enable; - RETURN_WITH_ASSERT( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_STA_INTERFACE ) ); -} - -wwd_result_t wwd_wifi_get_packet_filter_stats( uint8_t filter_id, wiced_packet_filter_stats_t* stats ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - - uint32_t* data = (uint32_t*)wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(uint32_t) + sizeof(wiced_packet_filter_stats_t), IOVAR_STR_PKT_FILTER_STATS ); - CHECK_IOCTL_BUFFER( data ); - - memset( data, 0, sizeof(uint32_t) + sizeof(wiced_packet_filter_stats_t) ); - *data = (uint32_t)filter_id; - - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_STA_INTERFACE ) ); - - memcpy( (char *)stats, (char *)host_buffer_get_current_piece_data_pointer( response ), ( sizeof(wiced_packet_filter_stats_t) ) ); - host_buffer_release( response, WWD_NETWORK_RX ); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_clear_packet_filter_stats( uint32_t filter_id ) -{ - wiced_buffer_t buffer; - - uint32_t* data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(uint32_t), IOVAR_STR_PKT_FILTER_CLEAR_STATS ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t)filter_id; - RETURN_WITH_ASSERT( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_STA_INTERFACE ) ); -} - - -wwd_result_t wwd_wifi_get_packet_filters( uint32_t max_count, uint32_t offset, wiced_packet_filter_t* list, uint32_t* count_out ) -{ - wiced_bool_t enabled_list; - - *count_out = 0; - - for ( enabled_list = WICED_FALSE; enabled_list <= WICED_TRUE; enabled_list++ ) - { - uint32_t num_returned = 0; - wwd_result_t retval; - retval = wwd_wifi_get_packet_filters_inner( max_count, offset, list, enabled_list, &num_returned ); - list += num_returned; - offset = MAX( offset - num_returned, 0 ); - max_count = MAX( max_count - num_returned, 0 ); - *count_out += num_returned; - CHECK_RETURN( retval ); - } - - return WWD_SUCCESS; -} - - -static wwd_result_t wwd_wifi_get_packet_filters_inner( uint32_t max_count, uint32_t offset, wiced_packet_filter_t* list, wiced_bool_t enabled_list, uint32_t* count_out ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - uint32_t* data; - wl_pkt_filter_list_t* filter_list; - wl_pkt_filter_t* filter_ptr; - uint32_t i; - - wwd_result_t retval = WWD_SUCCESS; - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, PACKET_FILTER_LIST_BUFFER_MAX_LEN, IOVAR_STR_PKT_FILTER_LIST ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t)enabled_list; - - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_STA_INTERFACE ) ); - - filter_list = (wl_pkt_filter_list_t*)host_buffer_get_current_piece_data_pointer( response ); - filter_ptr = filter_list->filter; - - *count_out = 0; - - for ( i = offset; i < filter_list->num; i++ ) - { - wl_pkt_filter_t* in_filter = (wl_pkt_filter_t*)filter_ptr; - wiced_packet_filter_t* out_filter = &list[i-offset]; - - if ( i >= offset + max_count ) - { - retval = WWD_PARTIAL_RESULTS; - break; - } - - out_filter->id = in_filter->id; - out_filter->rule = ( in_filter->negate_match == 0 ) ? WICED_PACKET_FILTER_RULE_POSITIVE_MATCHING : WICED_PACKET_FILTER_RULE_NEGATIVE_MATCHING; - out_filter->offset = (uint16_t)in_filter->u.pattern.offset; - out_filter->mask_size = (uint16_t)in_filter->u.pattern.size_bytes; - out_filter->enabled_status = enabled_list; - - out_filter->mask = NULL; - out_filter->pattern = NULL; - - /* Update WL filter pointer */ - filter_ptr = (wl_pkt_filter_t*) ( (char*)filter_ptr + (WL_PKT_FILTER_FIXED_LEN + WL_PKT_FILTER_PATTERN_FIXED_LEN + 2 * in_filter->u.pattern.size_bytes) ); - - /* WLAN returns word-aligned filter list */ - filter_ptr = (wl_pkt_filter_t*) ROUND_UP( (unsigned long)filter_ptr, 4 ); - - (*count_out)++; - } - - host_buffer_release( response, WWD_NETWORK_RX ); - return retval; -} - - -wwd_result_t wwd_wifi_get_packet_filter_mask_and_pattern( uint32_t filter_id, uint32_t max_size, uint8_t* mask, uint8_t* pattern, uint32_t* size_out ) -{ - wiced_bool_t enabled_list; - - for ( enabled_list = WICED_FALSE; enabled_list <= WICED_TRUE; enabled_list++ ) - { - - wiced_buffer_t buffer; - wiced_buffer_t response; - uint32_t* data; - wl_pkt_filter_list_t* filter_list; - wl_pkt_filter_t* filter_ptr; - uint32_t i; - wl_pkt_filter_t* in_filter; - - data = wwd_sdpcm_get_iovar_buffer( &buffer, PACKET_FILTER_LIST_BUFFER_MAX_LEN, IOVAR_STR_PKT_FILTER_LIST ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t)enabled_list; - - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_STA_INTERFACE ) ); - - filter_list = (wl_pkt_filter_list_t*)host_buffer_get_current_piece_data_pointer( response ); - filter_ptr = filter_list->filter; - - for ( i = 0; i < filter_list->num; i++ ) - { - in_filter = filter_ptr; - - if ( in_filter->id == filter_id ) - { - *size_out = MIN( in_filter->u.pattern.size_bytes, max_size ); - memcpy ( mask, in_filter->u.pattern.mask_and_pattern, *size_out ); - memcpy ( pattern, in_filter->u.pattern.mask_and_pattern + in_filter->u.pattern.size_bytes, *size_out ); - host_buffer_release( response, WWD_NETWORK_RX ); - if ( *size_out < in_filter->u.pattern.size_bytes ) - { - return WWD_PARTIAL_RESULTS; - } - return WWD_SUCCESS; - } - - /* Update WL filter pointer */ - filter_ptr = (wl_pkt_filter_t*)( (char*)filter_ptr + (WL_PKT_FILTER_FIXED_LEN + WL_PKT_FILTER_PATTERN_FIXED_LEN + 2 * in_filter->u.pattern.size_bytes) ); - - /* WLAN returns word-aligned filter list */ - filter_ptr = (wl_pkt_filter_t*) ROUND_UP( (unsigned long)filter_ptr, 4 ); - } - } - return WWD_FILTER_NOT_FOUND; -} - - - -wwd_result_t wwd_wifi_add_keep_alive( const wiced_keep_alive_packet_t* keep_alive_packet_info ) -{ - wiced_buffer_t buffer; - - uint16_t length = (uint16_t)(keep_alive_packet_info->packet_length + WL_MKEEP_ALIVE_FIXED_LEN); - wl_mkeep_alive_pkt_t* packet_info = (wl_mkeep_alive_pkt_t*) wwd_sdpcm_get_iovar_buffer( &buffer, length, IOVAR_STR_MKEEP_ALIVE ); - CHECK_IOCTL_BUFFER( packet_info ); - - packet_info->version = htod16(WL_MKEEP_ALIVE_VERSION); - packet_info->length = htod16(WL_MKEEP_ALIVE_FIXED_LEN); - packet_info->keep_alive_id = keep_alive_packet_info->keep_alive_id; - packet_info->period_msec = htod32(keep_alive_packet_info->period_msec); - packet_info->len_bytes = htod16(keep_alive_packet_info->packet_length); - memcpy(packet_info->data, keep_alive_packet_info->packet, keep_alive_packet_info->packet_length); - - RETURN_WITH_ASSERT( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_STA_INTERFACE ) ); -} - -wwd_result_t wwd_wifi_get_keep_alive( wiced_keep_alive_packet_t* keep_alive_packet_info ) -{ - wl_mkeep_alive_pkt_t* packet_info; - wiced_buffer_t buffer; - wiced_buffer_t response; - uint32_t* data; - uint16_t max_info_length = (uint16_t)(WL_MKEEP_ALIVE_FIXED_LEN + keep_alive_packet_info->packet_length); - - wiced_assert("Bad args", (keep_alive_packet_info != NULL) && (keep_alive_packet_info->packet_length > 4) && (keep_alive_packet_info->keep_alive_id <= 3)); - - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, max_info_length, IOVAR_STR_MKEEP_ALIVE ); /* get a buffer to store the keep_alive info into */ - CHECK_IOCTL_BUFFER( data ); - memset( data, 0, max_info_length ); - data[0] = keep_alive_packet_info->keep_alive_id; - - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_STA_INTERFACE ) ); - - packet_info = (wl_mkeep_alive_pkt_t*)host_buffer_get_current_piece_data_pointer( response ); - keep_alive_packet_info->packet_length = packet_info->len_bytes; - keep_alive_packet_info->period_msec = packet_info->period_msec; - memcpy( keep_alive_packet_info->packet, packet_info->data, (size_t)MIN(keep_alive_packet_info->packet_length, (host_buffer_get_current_piece_size(response)-WL_MKEEP_ALIVE_FIXED_LEN)) ); - host_buffer_release( response, WWD_NETWORK_RX ); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_disable_keep_alive( uint8_t id ) -{ - wiced_keep_alive_packet_t packet_info; - packet_info.keep_alive_id = id; - packet_info.period_msec = 0; - packet_info.packet_length = 0; - packet_info.packet = NULL; - return wwd_wifi_add_keep_alive( &packet_info ); -} - -wwd_result_t wwd_wifi_get_associated_client_list( void* client_list_buffer, uint16_t buffer_length ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - - wiced_maclist_t* data = (wiced_maclist_t*)wwd_sdpcm_get_ioctl_buffer( &buffer, buffer_length ); - CHECK_IOCTL_BUFFER( data ); - memset(data, 0, buffer_length); - data->count = ((wiced_maclist_t*)client_list_buffer)->count; - - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_GET_ASSOCLIST, buffer, &response, WWD_AP_INTERFACE ) ); - - memcpy( client_list_buffer, (void*) host_buffer_get_current_piece_data_pointer( response ), (size_t)MIN(host_buffer_get_current_piece_size(response), buffer_length) ); - host_buffer_release( response, WWD_NETWORK_RX ); - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_get_max_associations( uint32_t* max_assoc ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - wwd_result_t result; - - uint32_t* data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, IOVAR_STR_MAX_ASSOC ); - CHECK_IOCTL_BUFFER( data ); - result = wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_STA_INTERFACE ); - - if ( result != WWD_SUCCESS ) - { - return result; - } - - data = (uint32_t*) host_buffer_get_current_piece_data_pointer( response ); - *max_assoc = (uint8_t)*data; - host_buffer_release( response, WWD_NETWORK_RX ); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_test_credentials( wiced_scan_result_t* ap, const uint8_t* security_key, uint8_t key_length ) -{ - host_semaphore_type_t semaphore; - wwd_result_t result; - uint32_t previous_softap_channel = 0; - - host_rtos_init_semaphore( &semaphore ); - - /* Check if soft AP interface is up, if so, record its current channel */ - if ( wwd_wifi_is_ready_to_transceive( WWD_AP_INTERFACE ) == WWD_SUCCESS ) - { - wwd_wifi_get_channel( WWD_AP_INTERFACE, &previous_softap_channel ); - } - - /* Try and join the AP with the credentials provided, but only wait for a short time */ - result = wwd_wifi_join_specific( ap, security_key, key_length, &semaphore, WWD_STA_INTERFACE ); - if ( result != WWD_SUCCESS ) - { - goto test_credentials_deinit; - } - - result = host_rtos_get_semaphore( &semaphore, WICED_CREDENTIAL_TEST_TIMEOUT, WICED_FALSE ); - - /* Immediately leave so we can go back to the original soft AP channel */ - wwd_wifi_leave( WWD_STA_INTERFACE ); - - /* If applicable, move the soft AP back to its original channel */ - if ( ( previous_softap_channel != 0 ) && ( previous_softap_channel != ap->channel ) ) - { - wwd_wifi_set_channel( WWD_AP_INTERFACE, previous_softap_channel ); - } -test_credentials_deinit: - host_rtos_deinit_semaphore( &semaphore ); - - return result; -} - -wwd_result_t wwd_wifi_get_ap_info( wl_bss_info_t* ap_info, wiced_security_t* security ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - uint32_t* data; - wwd_result_t result = WWD_SUCCESS; - - /* Read the BSS info */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(wl_bss_info_t) + 4 ); - CHECK_IOCTL_BUFFER( data ); - *data = sizeof(wl_bss_info_t) + 4; - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_GET_BSS_INFO, buffer, &response, WWD_STA_INTERFACE ) ); - - memcpy( ap_info, (void*) (host_buffer_get_current_piece_data_pointer( response ) + 4), sizeof(wl_bss_info_t) ); - host_buffer_release( response, WWD_NETWORK_RX ); - - /* Read the WSEC setting */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(uint32_t) ); - CHECK_IOCTL_BUFFER( data ); - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_GET_WSEC, buffer, &response, WWD_STA_INTERFACE ) ); - - data = (uint32_t*)host_buffer_get_current_piece_data_pointer( response ); - *security = (wiced_security_t)(*data); - host_buffer_release( response, WWD_NETWORK_RX ); - - if ( *security == WICED_SECURITY_WEP_PSK ) - { - /* Read the WEP auth setting */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(uint32_t) ); - CHECK_IOCTL_BUFFER( data ); - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_GET_AUTH, buffer, &response, WWD_STA_INTERFACE ) ); - - data = (uint32_t*)host_buffer_get_current_piece_data_pointer( response ); - - if ( *data == SHARED_AUTH ) - { - *security |= SHARED_ENABLED; - } - host_buffer_release( response, WWD_NETWORK_RX ); - } - else if ( (*security & (TKIP_ENABLED | AES_ENABLED) ) != 0 ) - { - /* Read the WPA auth setting */ - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(uint32_t) ); - CHECK_IOCTL_BUFFER( data ); - CHECK_RETURN( wwd_sdpcm_send_ioctl( SDPCM_GET, WLC_GET_WPA_AUTH, buffer, &response, WWD_STA_INTERFACE ) ); - - data = (uint32_t*)host_buffer_get_current_piece_data_pointer( response ); - - if ( *data == WPA2_AUTH_PSK ) - { - *security |= WPA2_SECURITY; - } - else if ( *data == WPA_AUTH_PSK ) - { - *security |= WPA_SECURITY; - } - host_buffer_release( response, WWD_NETWORK_RX ); - } - else if ( *security != WICED_SECURITY_OPEN ) - { - *security = WICED_SECURITY_UNKNOWN; - result = WWD_UNKNOWN_SECURITY_TYPE; - } - - return result; -} - -wwd_result_t wwd_wifi_set_ht_mode( wwd_interface_t interface, wiced_ht_mode_t ht_mode ) -{ - wiced_buffer_t buffer; - uint32_t* data; - - /* Assert when WLAN is UP */ - wiced_assert("WLAN is UP. Ensure WLAN is DOWN before invoking this API", wwd_wlan_status.state == WLAN_DOWN ); - - /* Set HT40 intolerance bit if the mode is HT20 */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(uint32_t), IOVAR_STR_HT40_INTOLERANCE ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) (ht_mode == WICED_HT_MODE_HT20) ? 1 : 0; - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ) ); - - /* Set HT mode */ - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(uint32_t), IOVAR_STR_MIMO_BW_CAP ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) ht_mode; - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ) ); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_get_ht_mode( wwd_interface_t interface, wiced_ht_mode_t* ht_mode ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - uint32_t* data; - - /* Validate the input arguments */ - wiced_assert("Bad args", ht_mode != NULL); - - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(uint32_t), IOVAR_STR_MIMO_BW_CAP ); - CHECK_IOCTL_BUFFER( data ); - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, interface ) ); - - data = (uint32_t*) host_buffer_get_current_piece_data_pointer( response ); - *ht_mode = (wiced_ht_mode_t)(*data); - host_buffer_release( response, WWD_NETWORK_RX ); - - return WWD_SUCCESS; -} - - -wwd_result_t wwd_wifi_set_passphrase( const uint8_t* security_key, uint8_t key_length, wwd_interface_t interface ) -{ - wiced_buffer_t buffer; - wsec_pmk_t* psk = (wsec_pmk_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, sizeof(wsec_pmk_t) ); - - CHECK_IOCTL_BUFFER( psk ); - memset( psk, 0, sizeof(wsec_pmk_t) ); - memcpy( psk->key, security_key, key_length ); - psk->key_len = key_length; - psk->flags = (uint16_t) WSEC_PASSPHRASE; - - host_rtos_delay_milliseconds( 1 ); /* Delay required to allow radio firmware to be ready to receive PMK and avoid intermittent failure */ - - return wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_WSEC_PMK, buffer, 0, interface ); -} - -static wwd_result_t wwd_wifi_set_iovar_buffer( const char* iovar, void *in_buffer, uint16_t in_buffer_length, wwd_interface_t interface ) -{ - wiced_buffer_t buffer; - uint32_t* data; - - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, in_buffer_length, iovar ); - CHECK_IOCTL_BUFFER( data ); - - memcpy( data, in_buffer, in_buffer_length ); - - return wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ); -} - -static wwd_result_t wwd_wifi_set_iovar_void( const char* iovar, wwd_interface_t interface ) -{ - wiced_buffer_t buffer; - - wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 0, iovar ); - - return wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ); -} - -wwd_result_t wwd_wifi_set_iovar_value( const char* iovar, uint32_t value, wwd_interface_t interface ) -{ - wiced_buffer_t buffer; - uint32_t* data; - - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) sizeof(value), iovar ); - CHECK_IOCTL_BUFFER( data ); - *data = value; - return wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ); -} - -wwd_result_t wwd_wifi_get_iovar_value( const char* iovar, uint32_t* value, wwd_interface_t interface ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_iovar_buffer( &buffer, 4, iovar ) ); - CHECK_RETURN_UNSUPPORTED_OK( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, interface ) ); - - *value = *(uint32_t*) host_buffer_get_current_piece_data_pointer( response ); - host_buffer_release( response, WWD_NETWORK_RX ); - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_set_ioctl_value( uint32_t ioctl, uint32_t value, wwd_interface_t interface ) -{ - wiced_buffer_t buffer; - uint32_t* data; - - data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) sizeof(value) ); - CHECK_IOCTL_BUFFER( data ); - *data = value; - return wwd_sdpcm_send_ioctl( SDPCM_SET, ioctl, buffer, 0, interface ); -} - -wwd_result_t wwd_wifi_get_ioctl_value( uint32_t ioctl, uint32_t* value, wwd_interface_t interface ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - - CHECK_IOCTL_BUFFER( wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) sizeof(*value) ) ); - CHECK_RETURN_UNSUPPORTED_OK( wwd_sdpcm_send_ioctl( SDPCM_GET, ioctl, buffer, &response, interface ) ); - - *value = * (uint32_t*) host_buffer_get_current_piece_data_pointer( response ); - host_buffer_release( response, WWD_NETWORK_RX ); - return WWD_SUCCESS; -} - -/* - * - * This function sets Radio Resource Management Capabilities in the WLAN firmware. - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param radio_resource_management_capability_ie_t : The data structure to set the different Radio Resource capabilities. - * - * - * @returns : status WWD_SUCCESS or failure - */ -wwd_result_t wwd_wifi_set_radio_resource_management_capabilities(wwd_interface_t interface, radio_resource_management_capability_ie_t *rrm_cap ) -{ - wiced_buffer_t buffer; - uint8_t* data; - wwd_result_t result; - - if ( sizeof(radio_resource_management_capability_ie_t) > RRM_CAPABILITIES_LEN ) - { - WPRINT_WWD_DEBUG(("wwd_wifi_set_rrm_capabilities: RRM_CAPABILITIES_LEN too long\n")); - return WWD_WLAN_BADLEN; - } - - /* set wwd_wifi_set_radio_resource_management_capabilities buffer */ - data = (uint8_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) sizeof(*rrm_cap), IOVAR_STR_RRM ); - CHECK_IOCTL_BUFFER( data ); - - memcpy( data, rrm_cap, sizeof(*rrm_cap) ); - result = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ); - wiced_assert("wwd_wifi_set_rrm_capabilities failed..", result == WWD_SUCCESS ); - - return WWD_SUCCESS; -} - -/* - * - * This function gets Radio Resource Management Capabilities and parses them and - * then passes them to user application to format the data. - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param radio_resource_management_capability_ie_t : The data structure get the different Radio Resource capabilities. - * - * - * @returns : status WWD_SUCCESS or failure - */ -wwd_result_t wwd_wifi_get_radio_resource_management_capabilities(wwd_interface_t interface, radio_resource_management_capability_ie_t *rrm_cap ) -{ - wiced_buffer_t buffer; - uint8_t* data; - wwd_result_t result; - wiced_buffer_t response; - - if ( sizeof(radio_resource_management_capability_ie_t) > RRM_CAPABILITIES_LEN ) - { - WPRINT_WWD_DEBUG(("wwd_wifi_get_rrm_capabilities: RRM_CAPABILITIES_LEN too long\n")); - return WWD_WLAN_BADLEN; - } - - /* get wwd_wifi_get_radio_resource_management_capabilities buffer */ - data = (uint8_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) sizeof(*rrm_cap), IOVAR_STR_RRM ); - CHECK_IOCTL_BUFFER( data ); - result = wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, interface ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("wwd_wifi_get_radio_resource_management_capabilities failed..result:%d\n", result )); - return WWD_WLAN_UNSUPPORTED; - } - - data = (uint8_t*) host_buffer_get_current_piece_data_pointer( response ); - memcpy( rrm_cap, data, sizeof(*rrm_cap) ); - - host_buffer_release( response, WWD_NETWORK_RX ); - - return WWD_SUCCESS; -} - -/* - * - * This function sets 11k beacon measurement request in the WLAN firmware. - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param radio_resource_management_beacon_req_t : pointer to data structure of rrm_bcn_req_t - * - * - * @returns : status WWD_SUCCESS or failure - */ -wwd_result_t wwd_wifi_radio_resource_management_beacon_req( wwd_interface_t interface, radio_resource_management_beacon_req_t *rrm_bcn_req ) -{ - wiced_buffer_t buffer; - uint8_t* data; - wwd_result_t result; - - /* get wwd_wifi_radio_resource_management_beacon_req buffer */ - data = (uint8_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) sizeof(*rrm_bcn_req), IOVAR_STR_RRM_BCN_REQ ); - CHECK_IOCTL_BUFFER( data ); - memcpy( data , rrm_bcn_req, sizeof(*rrm_bcn_req) ); - result = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("wwd_wifi_radio_resource_management_beacon_req failed..result:%d\n", result )); - return WWD_WLAN_UNSUPPORTED; - } - - return WWD_SUCCESS; -} - -/* - * - * This function sets 11k channel load measurement request in the WLAN firmware. - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param radio_resource_management_req_t : pointer to data structure of rrm_chload_req - * - * - * @returns : status WWD_SUCCESS or failure - */ -wwd_result_t wwd_wifi_radio_resource_management_channel_load_req( wwd_interface_t interface, radio_resource_management_req_t *rrm_chload_req ) -{ - wiced_buffer_t buffer; - uint8_t* data; - wwd_result_t result; - - /* get wwd_wifi_radio_resource_management_channel_load_req buffer */ - data = (uint8_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) sizeof(*rrm_chload_req), IOVAR_STR_RRM_CHLOAD_REQ ); - CHECK_IOCTL_BUFFER( data ); - memcpy( data , rrm_chload_req, sizeof(*rrm_chload_req) ); - result = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("wwd_wifi_radio_resource_management_channel_load_req failed..result:%d\n", result )); - return WWD_WLAN_UNSUPPORTED; - } - - return WWD_SUCCESS; -} - -/* - * - * This function sets 11k noise measurement request in the WLAN firmware. - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param radio_resource_management_req_t : pointer to data structure of rrm_noise_req - * - * - * @returns : status WWD_SUCCESS or failure - */ -wwd_result_t wwd_wifi_radio_resource_management_noise_req( wwd_interface_t interface, radio_resource_management_req_t *rrm_noise_req ) -{ - wiced_buffer_t buffer; - uint8_t* data; - wwd_result_t result; - - /* get wwd_wifi_radio_resource_management_noise_req buffer */ - data = (uint8_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) sizeof(*rrm_noise_req), IOVAR_STR_RRM_NOISE_REQ ); - CHECK_IOCTL_BUFFER( data ); - memcpy( data , rrm_noise_req, sizeof(radio_resource_management_req_t) ); - result = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("wwd_wifi_radio_resource_management_noise_req failed..result:%d\n", result )); - return WWD_WLAN_UNSUPPORTED; - } - - return WWD_SUCCESS; -} - -/* - * - * This function sets 11k frame measurement request in the WLAN firmware. - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param radio_resource_management_framereq_t : pointer to data structure of rrm_framereq - * - * - * @returns : status WWD_SUCCESS or failure - */ -wwd_result_t wwd_wifi_radio_resource_management_frame_req( wwd_interface_t interface, radio_resource_management_framereq_t *rrm_framereq ) -{ - wiced_buffer_t buffer; - uint8_t* data; - wwd_result_t result; - - /* get wwd_wifi_radio_resource_management_frame_req buffer */ - data = (uint8_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) sizeof(*rrm_framereq), IOVAR_STR_RRM_FRAME_REQ ); - CHECK_IOCTL_BUFFER( data ); - memcpy( data , rrm_framereq, sizeof(*rrm_framereq) ); - result = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("wwd_wifi_radio_resource_management_frame_req failed..result:%d\n", result )); - return WWD_WLAN_UNSUPPORTED; - } - - return WWD_SUCCESS; -} - -/* - * - * This function sets 11k stat measurement request in the WLAN firmware. - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param radio_resource_management_statreq_t : pointer to data structure of rrm_statreq - * - * - * @returns : status WWD_SUCCESS or failure - */ -wwd_result_t wwd_wifi_radio_resource_management_stat_req( wwd_interface_t interface, radio_resource_management_statreq_t *rrm_statreq ) -{ - wiced_buffer_t buffer; - uint8_t* data; - wwd_result_t result; - - /* get wwd_wifi_radio_resource_management_stat_req buffer */ - data = (uint8_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) sizeof(*rrm_statreq), IOVAR_STR_RRM_STAT_REQ ); - CHECK_IOCTL_BUFFER( data ); - memcpy( data , rrm_statreq, sizeof(*rrm_statreq) ); - result = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("wwd_wifi_radio_resource_management_stat_req failed..result:%d\n", result )); - return WWD_WLAN_UNSUPPORTED; - } - - return WWD_SUCCESS; -} - -/* - * - * This function gets 11k neighbor report list works from the WLAN firmware. - * - * @param interface : WWD_AP_INTERFACE (works only in AP mode) - * @param uint8_t : buffer pointer to data structure - * @param uint16_t : buffer length - * - * @returns : status WWD_SUCCESS or failure - */ -wwd_result_t wwd_wifi_radio_resource_management_neighbor_list ( wwd_interface_t interface, uint8_t *buf, uint16_t buflen ) -{ - - wiced_buffer_t buffer; - uint8_t* data; - wwd_result_t result; - wiced_buffer_t response; - - /* get wwd_wifi_radio_resource_management_neighbor_list buffer */ - data = (uint8_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t)buflen, IOVAR_STR_RRM_NBR_LIST ); - CHECK_IOCTL_BUFFER( data ); - - result = wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, interface ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("wwd_wifi_radio_resource_management_neighbor_list failed..result:%d\n", result )); - return WWD_WLAN_UNSUPPORTED; - } - - data = (uint8_t*) host_buffer_get_current_piece_data_pointer( response ); - memcpy(buf, data, buflen); - - host_buffer_release( response, WWD_NETWORK_RX ); - - return WWD_SUCCESS; - -} - -/* - * - * This function deletes node from 11k neighbor report list - * - * @param interface : WWD_AP_INTERFACE (works only in AP mode) - * @param wiced_mac_t : bssid of the node to be deleted from neighbor report list - * - * - * @returns : status WWD_SUCCESS or failure - */ -wwd_result_t wwd_wifi_radio_resource_management_neighbor_del_neighbor( wwd_interface_t interface, wiced_mac_t *bssid ) -{ - - wiced_buffer_t buffer; - uint8_t* data; - wwd_result_t result; - - /* get wwd_wifi_radio_resource_management_neighbor_del_neighbor buffer */ - data = (uint8_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) sizeof(*bssid), IOVAR_STR_RRM_NBR_DEL ); - CHECK_IOCTL_BUFFER( data ); - memcpy( data , bssid, sizeof(*bssid) ); - result = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("wwd_wifi_radio_resource_management_neighbor_del_neighbor failed..result:%d\n", result )); - return WWD_WLAN_UNSUPPORTED; - } - - return WWD_SUCCESS; -} - -/* - * - * This function adds a node to Neighbor list - * - * @param interface : WWD_AP_INTERFACE (works only in AP mode) - * @param radio_resource_management_nbr_element_t : pointer to the neighbor element data structure. - * @param buflen : buffer length of the neighbor element data. - * - * - * @returns : status WWD_SUCCESS or failure - */ -wwd_result_t wwd_wifi_radio_resource_management_neighbor_add_neighbor( wwd_interface_t interface, radio_resource_management_nbr_element_t *nbr_elt, uint16_t buflen ) -{ - - wiced_buffer_t buffer; - uint8_t* data; - wwd_result_t result; - - /* get wwd_wifi_radio_resource_management_neighbor_add_neighbor buffer */ - data = (uint8_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) buflen, IOVAR_STR_RRM_NBR_ADD ); - CHECK_IOCTL_BUFFER( data ); - memcpy( data , nbr_elt, buflen ); - result = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("wwd_wifi_radio_resource_management_neighbor_add_neighbor failed..result:%d\n", result )); - return WWD_WLAN_UNSUPPORTED; - } - - return WWD_SUCCESS; -} - -/* - * - * This function sets 11k link measurement request for the particular BSSID in the WLAN firmware. - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param wiced_mac_t : Mac Address of the destination - * - * - * @returns : status WWD_SUCCESS or failure - */ -wwd_result_t wwd_wifi_radio_resource_management_link_management_req( wwd_interface_t interface, wiced_mac_t *da ) -{ - wiced_buffer_t buffer; - uint8_t* data; - wwd_result_t result; - - /* get wwd_wifi_radio_resource_management_link_management_req buffer */ - data = (uint8_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) sizeof(*da), IOVAR_STR_RRM_LM_REQ ); - CHECK_IOCTL_BUFFER( data ); - memcpy( data , da, sizeof(*da) ); - result = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("wwd_wifi_radio_resource_management_link_management_req failed..result:%d\n", result )); - return WWD_WLAN_UNSUPPORTED; - } - - return WWD_SUCCESS; -} - -/* - * - * This function sets sets 11k link measurement request for the particular SSID in the WLAN firmware. - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param wiced_ssid_t : The data structure of the SSID. - * - * - * @returns : status WWD_SUCCESS or failure - */ -wwd_result_t wwd_wifi_radio_resource_management_neighbor_req( wwd_interface_t interface, wiced_ssid_t *ssid ) -{ - wiced_buffer_t buffer; - uint8_t* data; - wwd_result_t result; - - if ( ssid->length > (size_t) SSID_NAME_SIZE ) - { - WPRINT_WWD_DEBUG(("wiced_wifi_join: SSID too long\n")); - return WWD_WLAN_BADSSIDLEN; - } - result = wwd_wifi_check_join_status(interface); - if ( result != WWD_SUCCESS ) { - WPRINT_WWD_DEBUG(("STA is not associated to an AP\n")); - return WWD_INTERFACE_NOT_UP; - } - - /* get wwd_wifi_radio_resource_management_neighbor_req buffer */ - data = (uint8_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) sizeof(*ssid), IOVAR_STR_RRM_NBR_REQ ); - CHECK_IOCTL_BUFFER( data ); - memcpy( data , ssid->value, ssid->length ); - result = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("wwd_wifi_radio_resource_management_neighbor_req failed..result:%d\n", result )); - return WWD_WLAN_UNSUPPORTED; - } - - return WWD_SUCCESS; -} - -/* - * - * This function sets/resets the value of FBT(Fast BSS Transition) Over-the-DS(Distribution System) - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param set : If the value 1 then FBT over the DS is allowed - * : if the value is 0 then FBT over the DS is not allowed (over the air is the only option) - * @param value : value of the data. - * - * - * @returns : status WWD_SUCCESS or failure - */ -wwd_result_t wwd_wifi_fast_bss_transition_over_distribution_system( wwd_interface_t interface, wiced_bool_t set, int *value ) -{ - wiced_buffer_t buffer; - uint8_t* data; - wwd_result_t result; - wiced_buffer_t response; - - /* get wwd_wifi_fast_bss_transition_over_distribution_system buffer */ - data = (uint8_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) sizeof(*value), IOVAR_STR_FBT_OVER_DS ); - CHECK_IOCTL_BUFFER( data ); - - if ( set ) { - memcpy( data , value, sizeof(*value) ); - result = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, interface ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("wwd_wifi_fast_bss_transition_over_distribution_system failed..result:%d\n", result )); - return WWD_WLAN_UNSUPPORTED; - } - } - else - { - result = wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, interface ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("wwd_wifi_fast_bss_transition_over_distribution_system failed..result:%d\n", result )); - return WWD_WLAN_UNSUPPORTED; - } - - data = (uint8_t*) host_buffer_get_current_piece_data_pointer( response ); - memcpy( value, data, sizeof(*value) ); - host_buffer_release( response, WWD_NETWORK_RX ); - } - - return WWD_SUCCESS; -} - -/* - * - * This function returns the value of Fast BSS Transition (1 if Driver 4-way handshake & reassoc is enabled 1 and 0 if disabled) - * - * @param interface : WWD_STA_INTERFACE or WWD_AP_INTERFACE - * @param value : gets value of the Fast BSS Transition capabilities. - * - * - * @returns : status WWD_SUCCESS or failure - */ -wwd_result_t wwd_wifi_fast_bss_transition_capabilities( wwd_interface_t interface, wiced_bool_t* enable ) -{ - - wiced_buffer_t buffer; - uint8_t* data; - wwd_result_t result; - wiced_buffer_t response; - - /* get wwd_wifi_fast_bss_transition_capabilities buffer */ - data = (uint8_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) sizeof(*enable), IOVAR_STR_FBT_CAPIBILITIES ); - CHECK_IOCTL_BUFFER( data ); - - result = wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, interface ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("wwd_wifi_fast_bss_transition_capabilities failed..result:%d\n", result )); - return WWD_WLAN_UNSUPPORTED; - } - - data = (uint8_t*) host_buffer_get_current_piece_data_pointer( response ); - memcpy( enable, data, sizeof(*enable) ); - host_buffer_release( response, WWD_NETWORK_RX ); - - return WWD_SUCCESS; -} - -/*! - ****************************************************************************** - * Prints partial details of a scan result on a single line - * - * @param[in] record A pointer to the wiced_scan_result_t record - * - */ -void print_scan_result( wiced_scan_result_t* record ) -{ - WPRINT_APP_INFO( ( "%5s ", ( record->bss_type == WICED_BSS_TYPE_ADHOC ) ? "Adhoc" : "Infra" ) ); - WPRINT_APP_INFO( ( "%02X:%02X:%02X:%02X:%02X:%02X ", record->BSSID.octet[0], record->BSSID.octet[1], record->BSSID.octet[2], record->BSSID.octet[3], record->BSSID.octet[4], record->BSSID.octet[5] ) ); - WPRINT_APP_INFO( ( " %d ", record->signal_strength ) ); - if ( record->max_data_rate < 100000 ) - { - WPRINT_APP_INFO( ( " %.1f ", (double) (record->max_data_rate / 1000.0) ) ); - } - else - { - WPRINT_APP_INFO( ( "%.1f ", (double) (record->max_data_rate / 1000.0) ) ); - } - WPRINT_APP_INFO( ( " %3d ", record->channel ) ); - WPRINT_APP_INFO( ( "%-15s ", ( record->security == WICED_SECURITY_OPEN ) ? "Open " : - ( record->security == WICED_SECURITY_WEP_PSK ) ? "WEP " : - ( record->security == WICED_SECURITY_WPA_TKIP_PSK ) ? "WPA TKIP PSK " : - ( record->security == WICED_SECURITY_WPA_AES_PSK ) ? "WPA AES PSK " : - ( record->security == WICED_SECURITY_WPA_MIXED_PSK ) ? "WPA Mixed PSK " : - ( record->security == WICED_SECURITY_WPA2_AES_PSK ) ? "WPA2 AES PSK " : - ( record->security == WICED_SECURITY_WPA2_TKIP_PSK ) ? "WPA2 TKIP PSK " : - ( record->security == WICED_SECURITY_WPA2_MIXED_PSK ) ? "WPA2 Mixed PSK " : - ( record->security == WICED_SECURITY_WPA_TKIP_ENT ) ? "WPA TKIP Enterprise" : - ( record->security == WICED_SECURITY_WPA_AES_ENT ) ? "WPA AES Enterprise" : - ( record->security == WICED_SECURITY_WPA_MIXED_ENT ) ? "WPA Mixed Enterprise" : - ( record->security == WICED_SECURITY_WPA2_TKIP_ENT ) ? "WPA2 TKIP Enterprise" : - ( record->security == WICED_SECURITY_WPA2_AES_ENT ) ? "WPA2 AES Enterprise" : - ( record->security == WICED_SECURITY_WPA2_MIXED_ENT ) ? "WPA2 Mixed Enterprise" : - "Unknown " ) ); - WPRINT_APP_INFO( ( " %.32s ", record->SSID.value ) ); - WPRINT_APP_INFO( ( "\n" ) ); -} - -wwd_result_t wwd_wifi_get_supplicant_eapol_key_timeout( wwd_interface_t interface, int32_t* eapol_key_timeout ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - int32_t* data; - - data = (int32_t*)wwd_sdpcm_get_iovar_buffer( &buffer, 4, IOVAR_STR_SUP_WPA_TMO ); - CHECK_IOCTL_BUFFER( data ); - memset( data, 0, 4 ); - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, interface ) ); - - memcpy( eapol_key_timeout, host_buffer_get_current_piece_data_pointer( response ), 4 ); - host_buffer_release(response, WWD_NETWORK_TX); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_set_supplicant_eapol_key_timeout( wwd_interface_t interface, int32_t eapol_key_timeout ) -{ - wiced_buffer_t buffer; - int32_t* data; - uint32_t bss_index = 0; - - /* Map the interface to a BSS index */ - bss_index = wwd_get_bss_index(interface ); - - data = wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 8, "bsscfg:" IOVAR_STR_SUP_WPA_TMO ); - CHECK_IOCTL_BUFFER( data ); - data[0] = (int32_t)bss_index; - data[1] = eapol_key_timeout; - CHECK_RETURN( wwd_sdpcm_send_iovar( SDPCM_SET, buffer, 0, WWD_STA_INTERFACE ) ); - - return WWD_SUCCESS; -} - -/****************************************************** - * Static Functions - ******************************************************/ - -/** Searches for a specific WiFi Information Element in a byte array - * - * Traverse a string of 1-byte tag/1-byte length/variable-length value - * triples, returning a pointer to the substring whose first element - * matches tag - * - * @note : This function has been copied directly from the standard Broadcom host driver file wl/exe/wlu.c - * - * - * @param tlv_buf : The byte array containing the Information Elements (IEs) - * @param buflen : The length of the tlv_buf byte array - * @param key : The Information Element tag to search for - * - * @return NULL : if no matching Information Element was found - * Non-Null : Pointer to the start of the matching Information Element - */ - -static inline /*@null@*/ tlv8_header_t* wlu_parse_tlvs( const tlv8_header_t* tlv_buf, uint32_t buflen, dot11_ie_id_t key ) -{ - - return (tlv8_header_t*) tlv_find_tlv8( (const uint8_t*) tlv_buf, buflen, key ); -} - -/** Checks if a WiFi Information Element is a WPA entry - * - * Is this body of this tlvs entry a WPA entry? If - * not update the tlvs buffer pointer/length - * - * @note : This function has been copied directly from the standard Broadcom host driver file wl/exe/wlu.c - * - * @param wpaie : The byte array containing the Information Element (IE) - * @param tlvs : The larger IE array to be updated if not a WPA IE - * @param tlvs_len : The current length of larger IE array - * - * @return WICED_TRUE : if IE matches the WPA OUI (Organizationally Unique Identifier) and its type = 1 - * WICED_FALSE : otherwise - */ -static wiced_bool_t wlu_is_wpa_ie( vendor_specific_ie_header_t* wpaie, tlv8_header_t** tlvs, uint32_t* tlvs_len ) -{ - vendor_specific_ie_header_t* ie = wpaie; - - /* If the contents match the WPA_OUI and type=1 */ - if ( ( ie->tlv_header.length >= (uint8_t) VENDOR_SPECIFIC_IE_MINIMUM_LENGTH ) && - ( memcmp( ie->oui, WPA_OUI_TYPE1, sizeof(ie->oui) ) == 0 ) ) - { - /* Found the WPA IE */ - return WICED_TRUE; - } - - /* point to the next ie */ - *tlvs = (tlv8_header_t*)( ((uint8_t*) ie) + ie->tlv_header.length + sizeof(tlv8_header_t) ); - - /* calculate the length of the rest of the buffer */ - *tlvs_len -= (uint32_t) ( *tlvs - (tlv8_header_t*)ie ); - - return WICED_FALSE; -} - -/** Searches for a specific WiFi Information Element in a byte array - * - * Traverse a string of 1-byte tag/1-byte length/variable-length value - * triples, returning a pointer to the substring whose first element - * matches tag - * - * @note : This function has been copied directly from the standard Broadcom host driver file wl/exe/wlu.c - * - * - * @param tlv_buf : The byte array containing the Information Elements (IEs) - * @param buflen : The length of the tlv_buf byte array - * @param key : The Information Element tag to search for - * - * @return NULL : if no matching Information Element was found - * Non-Null : Pointer to the start of the matching Information Element - */ -static tlv8_header_t* wwd_parse_dot11_tlvs( const tlv8_header_t* tlv_buf, uint32_t buflen, dot11_ie_id_t key ) -{ - - return (tlv8_header_t*) tlv_find_tlv8( (const uint8_t*) tlv_buf, buflen, key ); -} - -/** Map channel to its band, comparing channel to max 2g channel - * - * @param channel : The channel to map to a band - * - * @return : WL_CHANSPEC_BAND_2G or WL_CHANSPEC_BAND_5G - */ -inline wl_chanspec_t wwd_channel_to_wl_band( uint32_t channel ) -{ - return ( ( (channel) <= CH_MAX_2G_CHANNEL ) ? WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G ); -} - -wwd_result_t wwd_wifi_get_wifi_version( char* version, uint8_t length ) -{ - wiced_buffer_t buffer; - wiced_buffer_t response; - wwd_result_t result; - uint32_t* data; - - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, length, IOVAR_STR_VERSION ); - CHECK_IOCTL_BUFFER( data ); - - result = wwd_sdpcm_send_iovar( SDPCM_GET, buffer, &response, WWD_STA_INTERFACE ); - if ( result == WWD_SUCCESS ) - { - char* wlan_firmware_version = (char*)host_buffer_get_current_piece_data_pointer( response ); - - if ( wlan_firmware_version != NULL ) - { - uint32_t version_length = (uint32_t) MIN( strlen( wlan_firmware_version ), length ); - - memcpy( version, wlan_firmware_version, version_length ); - - if ( version[version_length - 1] == '\n' ) - { - /* Remove newline in WLAN firmware version string. Formatting is handled by WPRINT below */ - version[version_length - 1] = '\0'; - } - } - - host_buffer_release( response, WWD_NETWORK_RX ); - } - return result; -} - -/* GET firmware revision info */ -wwd_result_t wwd_wifi_get_revision_info ( wwd_interface_t interface, wlc_rev_info_t *buf, uint16_t buflen ) -{ - - wiced_buffer_t buffer; - uint8_t* data; - wwd_result_t result; - wiced_buffer_t response; - - /* get wwd_wifi_radio_resource_management_neighbor_list buffer */ - data = (uint8_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t)buflen ); - CHECK_IOCTL_BUFFER( data ); - - result = wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_GET_REVINFO, buffer, &response, interface ); - if ( result != WWD_SUCCESS ) - { - WPRINT_WWD_DEBUG(("wwd_wifi_get_revision_info failed..result:%d\n", result )); - return result; - } - - data = (uint8_t*) host_buffer_get_current_piece_data_pointer( response ); - memcpy( buf, data, buflen ); - - host_buffer_release( response, WWD_NETWORK_RX ); - - return WWD_SUCCESS; - -} - -wwd_result_t wwd_wifi_enable_minimum_power_consumption( void ) -{ - wiced_buffer_t buffer; - uint32_t* data; - wwd_result_t result; - - data = (uint32_t*) wwd_sdpcm_get_iovar_buffer( &buffer, (uint16_t) 4, "mpc" ); - CHECK_IOCTL_BUFFER( data ); - *data = (uint32_t) 1; - result = wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_STA_INTERFACE ); - wiced_assert("mpc 1 failed", result == WWD_SUCCESS ); - return result; -} - -static wwd_result_t wwd_wifi_check_join_status( wwd_interface_t interface ) -{ - switch ( wiced_join_status[ interface ] ) - { - case JOIN_NO_NETWORKS : - return WWD_NETWORK_NOT_FOUND; - - case JOIN_AUTHENTICATED | JOIN_LINK_READY | JOIN_EAPOL_KEY_M1_TIMEOUT : - return WWD_EAPOL_KEY_PACKET_M1_TIMEOUT; - - case JOIN_AUTHENTICATED | JOIN_LINK_READY | JOIN_EAPOL_KEY_M3_TIMEOUT : - case JOIN_AUTHENTICATED | JOIN_LINK_READY | JOIN_SSID_SET | JOIN_EAPOL_KEY_M3_TIMEOUT : - return WWD_EAPOL_KEY_PACKET_M3_TIMEOUT; - - case JOIN_AUTHENTICATED | JOIN_LINK_READY | JOIN_EAPOL_KEY_G1_TIMEOUT : - case JOIN_AUTHENTICATED | JOIN_LINK_READY | JOIN_SSID_SET | JOIN_EAPOL_KEY_G1_TIMEOUT : - return WWD_EAPOL_KEY_PACKET_G1_TIMEOUT; - - case JOIN_AUTHENTICATED | JOIN_LINK_READY | JOIN_EAPOL_KEY_FAILURE : - case JOIN_AUTHENTICATED | JOIN_LINK_READY | JOIN_SSID_SET | JOIN_EAPOL_KEY_FAILURE : - return WWD_EAPOL_KEY_FAILURE; - - case JOIN_AUTHENTICATED | JOIN_LINK_READY | JOIN_SSID_SET | JOIN_SECURITY_COMPLETE : - return WWD_SUCCESS; - - case 0: - case JOIN_SECURITY_COMPLETE : /* For open/WEP */ - return WWD_NOT_AUTHENTICATED; - - case JOIN_AUTHENTICATED | JOIN_LINK_READY | JOIN_SECURITY_COMPLETE : - return WWD_JOIN_IN_PROGRESS; - - case JOIN_AUTHENTICATED | JOIN_LINK_READY : - case JOIN_AUTHENTICATED | JOIN_LINK_READY | JOIN_SSID_SET : - return WWD_NOT_KEYED; - - default: - return WWD_INVALID_JOIN_STATUS; - } -} - -static wwd_result_t wwd_wifi_otp_write_bits( uint32_t bit_offset, uint32_t bit_length, uint8_t* bit_stream ) -{ - wwd_result_t result; - wiced_buffer_t request; - uint16_t request_size; - uint8_t* req; - - request_size = (uint16_t)(sizeof(bit_offset) + sizeof(bit_length) + ((ROUND_UP(bit_length, 32)) / 8)); - - req = (uint8_t*)wwd_sdpcm_get_iovar_buffer( &request, request_size, IOVAR_STR_OTPRAW ); - if ( req == NULL ) - { - WPRINT_WWD_DEBUG(( "IOVAR buffer allocation failed\n" )); - return WWD_BUFFER_ALLOC_FAIL; - } - memset( req, 0, request_size ); - - *(uint32_t*)req = htod32(bit_offset); - req += 4; - *(uint32_t*)req = htod32(bit_length); - req += 4; - memcpy( req, bit_stream, (DIV_ROUND_UP(bit_length, 8)) ); - - /* Writes the specified bit stream into the OTP at the specified bit offset */ - result = wwd_sdpcm_send_iovar( SDPCM_SET, request, NULL, WWD_STA_INTERFACE ); - - if (result != WWD_SUCCESS) - { - if ( result == WWD_WLAN_UNSUPPORTED ) - { - WPRINT_WWD_DEBUG(( "WLAN IOVAR not supported: %d\n", result )); - return WWD_WLAN_UNSUPPORTED; - } - else - { - WPRINT_WWD_DEBUG(( "WLAN IOVAR unknown error: %d\n", result )); - return WWD_WLAN_ERROR; - } - } - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_otp_write_bit( uint16_t bit_offset, uint16_t write_bit ) -{ - uint32_t offset = (uint32_t)(bit_offset); - uint32_t length = 1; - uint8_t stream = (uint8_t)(write_bit & 0x1); - return wwd_wifi_otp_write_bits( offset, length, &stream ); -} - -wwd_result_t wwd_wifi_otp_write_word( uint16_t word_offset, uint16_t write_word ) -{ - uint32_t offset = (uint32_t)(word_offset * OTP_WORD_SIZE); - uint32_t length = OTP_WORD_SIZE; - uint8_t stream[2] = {(uint8_t)(write_word & 0xFF), (uint8_t)((write_word >> 8) & 0xFF)}; - return wwd_wifi_otp_write_bits( offset, length, stream ); -} - -wwd_result_t wwd_reset_statistics_counters( void ) -{ - uint32_t value; - return wwd_wifi_get_iovar_value( IOVAR_STR_RESET_CNTS, &value, WWD_STA_INTERFACE ); -} - -wwd_result_t wwd_phyrate_log( unsigned int mode) -{ - return wwd_wifi_set_iovar_value( IOVAR_STR_PHYRATE_LOG, mode, WWD_STA_INTERFACE ); -} - -wwd_result_t wwd_get_phyrate_statistics_counters( wiced_phyrate_counters_t *counts_buffer, unsigned int size) -{ - wwd_interface_t interface = WWD_STA_INTERFACE; - wiced_buffer_t buffer; - wiced_buffer_t response; - wiced_counters_t* data; - wwd_result_t result; - - if (size < WICED_WIFI_PHYRATE_COUNT * sizeof(uint32_t)) - return WWD_BADARG; - - wwd_sdpcm_get_iovar_buffer(&buffer, sizeof(*data), IOVAR_STR_COUNTERS); - - result = wwd_sdpcm_send_iovar(SDPCM_GET, buffer, &response, interface); - - if (result == WWD_SUCCESS) - { - data = (wiced_counters_t*)host_buffer_get_current_piece_data_pointer(response); - - memcpy(counts_buffer, &data->rx1mbps, WICED_WIFI_PHYRATE_COUNT * sizeof(uint32_t)); - - host_buffer_release(response, WWD_NETWORK_RX); - } - - return result; -} - -wwd_result_t wwd_get_phyrate_log_size( unsigned int *size) -{ - return wwd_wifi_get_iovar_value( IOVAR_STR_PHYRATE_LOG_SIZE, (uint32_t *)size, WWD_STA_INTERFACE ); -} - -wwd_result_t wwd_get_phyrate_log( wiced_phyrate_log_t *data) -{ - wwd_interface_t interface = WWD_STA_INTERFACE; - wiced_phyrate_log_t *temp; - wiced_buffer_t buffer; - wiced_buffer_t response; - wwd_result_t result; - - wwd_sdpcm_get_iovar_buffer(&buffer, sizeof(*data), IOVAR_STR_PHYRATE_LOG_DUMP); - - result = wwd_sdpcm_send_iovar(SDPCM_GET, buffer, &response, interface); - - if (result == WWD_SUCCESS) - { - temp = (wiced_phyrate_log_t*)host_buffer_get_current_piece_data_pointer(response); - memcpy(data, temp, sizeof(*data)); - - host_buffer_release(response, WWD_NETWORK_RX); - } - - return result; -} - -wwd_result_t wwd_get_counters( wiced_counters_t *data) -{ - wwd_interface_t interface = WWD_STA_INTERFACE; - wiced_buffer_t buffer; - wiced_buffer_t response; - wiced_counters_t *counters; - wwd_result_t result; - - wwd_sdpcm_get_iovar_buffer(&buffer, sizeof(*data), IOVAR_STR_COUNTERS); - result = wwd_sdpcm_send_iovar(SDPCM_GET, buffer, &response, interface); - if (result == WWD_SUCCESS) - { - counters = (wiced_counters_t*)host_buffer_get_current_piece_data_pointer(response); - memcpy(data, counters, sizeof(*data)); - host_buffer_release(response, WWD_NETWORK_RX); - } - - return result; -} - -/** Handles Radio Resource Management events - * - * This function receives Radio Resource Management events and calls the registered callback - * of user application. - * - * @param[in] wwd_rrm_report_type_t : Radio Resource report type - * @param[out] wwd_event_handler_t : callback function to be call event is received - * @param[in] void* : pointer to Radio Resource management request - * @param[out] wwd_rrm_report_t : Radio Resource report pointer - * @param[in] void* : semaphore - * @param[in] wwd_interface_t : interface type - * - */ -wwd_result_t wwd_wifi_rrm_request( wwd_rrm_report_type_t report_type, - wwd_event_handler_t callback, - void* rrm_req, - wwd_rrm_report_t** report_ptr, - void* user_data, - wwd_interface_t interface - ) - -{ - wwd_result_t err = WWD_SUCCESS; - radio_resource_management_req_t *rrm_chload_req; - radio_resource_management_beacon_req_t *bcnreq; - wiced_ssid_t *wiced; - wiced_mac_t *mac; - - - UNUSED_PARAMETER(report_ptr); - UNUSED_PARAMETER(user_data); - wwd_management_set_event_handler( rrm_events, callback, user_data, interface ); - - switch (report_type) - { - case WICED_RRM_CHLOAD_REPORT: - { - rrm_chload_req = (radio_resource_management_req_t *)rrm_req; - err = wwd_wifi_radio_resource_management_channel_load_req( interface, rrm_chload_req ); - break; - } - - case WICED_RRM_NBR_LIST_REPORT: - { - wiced = (wiced_ssid_t *)rrm_req; - err = wwd_wifi_radio_resource_management_neighbor_req( interface, wiced); - break; - } - - case WICED_RRM_BCN_REPORT: - { - bcnreq = (radio_resource_management_beacon_req_t *)rrm_req; - err = wwd_wifi_radio_resource_management_beacon_req(interface, bcnreq); - break; - } - - case WICED_LM_REPORT: - { - mac = (wiced_mac_t *)rrm_req; - wwd_wifi_radio_resource_management_link_management_req(WWD_STA_INTERFACE, mac); - break; - } - default: - break; - } - return err; -} - -static wwd_result_t wwd_wiced_security_to_pfn_auth_wsec( wiced_security_t security, wl_pfn_t *pfn_net ) -{ - wwd_result_t result = WWD_SUCCESS; - uint8_t table_index = 0; - - wwd_security_to_auth_wsec_map_t wiced_security2pfn_auth_wsec[] = - { - { WICED_SECURITY_OPEN, AUTH_ALGO_80211_OPEN, WPA_AUTH_DISABLED, 0 }, - { WICED_SECURITY_WEP_PSK, AUTH_ALGO_80211_OPEN, WPA_AUTH_DISABLED, WEP_ENABLED }, - { WICED_SECURITY_WEP_SHARED, AUTH_ALGO_80211_SHARED_KEY, WPA_AUTH_DISABLED, WEP_ENABLED}, - { WICED_SECURITY_WPA2_TKIP_PSK, AUTH_ALGO_RSNA_PSK, WPA2_AUTH_PSK, TKIP_ENABLED }, - { WICED_SECURITY_WPA2_AES_PSK, AUTH_ALGO_RSNA_PSK, WPA2_AUTH_PSK, AES_ENABLED }, - { WICED_SECURITY_WPA_TKIP_PSK, AUTH_ALGO_WPA_PSK, WPA_AUTH_PSK, TKIP_ENABLED }, - { WICED_SECURITY_WPA_AES_PSK, AUTH_ALGO_WPA_PSK, WPA_AUTH_PSK, AES_ENABLED }, - - { WICED_SECURITY_WPA_TKIP_ENT, AUTH_ALGO_WPA, WPA_AUTH_UNSPECIFIED, TKIP_ENABLED }, - { WICED_SECURITY_WPA_AES_ENT, AUTH_ALGO_WPA, WPA_AUTH_UNSPECIFIED, AES_ENABLED }, - { WICED_SECURITY_WPA2_TKIP_ENT, AUTH_ALGO_RSNA, WPA2_AUTH_UNSPECIFIED, TKIP_ENABLED }, - { WICED_SECURITY_WPA2_AES_ENT, AUTH_ALGO_RSNA, WPA2_AUTH_UNSPECIFIED, AES_ENABLED }, - - { WICED_SECURITY_WPA_MIXED_PSK, AUTH_ALGO_WPA_PSK, WPA_AUTH_PSK, ( TKIP_ENABLED | AES_ENABLED ) }, - { WICED_SECURITY_WPA2_MIXED_PSK, AUTH_ALGO_RSNA_PSK, WPA2_AUTH_PSK, ( TKIP_ENABLED | AES_ENABLED ) }, - { WICED_SECURITY_WPA_MIXED_ENT, AUTH_ALGO_WPA_PSK, WPA_AUTH_PSK, ( TKIP_ENABLED | AES_ENABLED ) }, - { WICED_SECURITY_WPA2_MIXED_ENT, AUTH_ALGO_RSNA_PSK, WPA2_AUTH_PSK, ( TKIP_ENABLED | AES_ENABLED ) } - }; - - for ( table_index = 0; table_index < sizeof( wiced_security2pfn_auth_wsec )/sizeof( wiced_security2pfn_auth_wsec[0] ); table_index++ ) - { - if ( security == wiced_security2pfn_auth_wsec[table_index].security ) - { - pfn_net->auth = wiced_security2pfn_auth_wsec[table_index].auth_algo; - pfn_net->wpa_auth = wiced_security2pfn_auth_wsec[table_index].wpa_auth; - pfn_net->wsec = wiced_security2pfn_auth_wsec[table_index].wsec; - break; - } - } - - /* unsupported security type */ - if ( table_index == sizeof( wiced_security2pfn_auth_wsec )/sizeof( wiced_security2pfn_auth_wsec[0] ) ) - { - result = WWD_BADARG; - } - - return result; -} - -static wwd_result_t wwd_pno_add_ssid_network( wiced_ssid_t *ssid, wiced_security_t security ) -{ - wl_pfn_t pfn_net; - uint8_t ssid_len = MIN( ssid->length, sizeof( pfn_net.ssid.SSID ) ); - - /* add network */ - memset( &pfn_net, 0, sizeof( pfn_net ) ); - memcpy( pfn_net.ssid.SSID, ssid->value, ssid_len ); - - pfn_net.ssid.SSID_len = ssid_len; - wwd_wiced_security_to_pfn_auth_wsec( security, &pfn_net ); - - /* Note: BSS is searched for as infra is set to 0 */ - - /* do not report loss of network as a result -- we only want to know if and when it appears */ - pfn_net.flags |= WL_PFN_SUPPRESSLOST_MASK; - - /* call driver */ - CHECK_RETURN( wwd_wifi_set_iovar_buffer( IOVAR_STR_PNO_ADD, &pfn_net, sizeof( pfn_net ), WWD_STA_INTERFACE ) ); - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_pno_add_network( wiced_ssid_t *ssid, wiced_security_t security ) -{ - /* must be stopped before adding */ - CHECK_RETURN( wwd_wifi_pno_stop( ) ); - - wwd_pno_add_ssid_network( ssid, security ); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_pno_start( void ) -{ - wl_pfn_param_t pfn_param; - - /* configure pfn parameters: must be called prior to starting */ - memset( &pfn_param, 0, sizeof(pfn_param) ); - - pfn_param.version = PFN_VERSION; - - /* in seconds: how frequent does this scan get launched */ - pfn_param.scan_freq = WICED_WIFI_PNO_SCAN_PERIOD; - - /* report event immediately */ - pfn_param.flags |= 1 << IMMEDIATE_EVENT_BIT; - - /* background scanning is fine */ - pfn_param.flags |= 1 << ENABLE_BKGRD_SCAN_BIT; - - /* kick off scan as soon as possible */ - pfn_param.flags |= 1 << IMMEDIATE_SCAN_BIT; - - /* hide ssid info in pfn scan */ - pfn_param.flags |= 1 << SUPPRESS_SSID_BIT; - - /* enable for nlo offload */ - pfn_param.flags |= 1 << ENABLE_NET_OFFLOAD_BIT; - - /* set pfn parameters */ - CHECK_RETURN( wwd_wifi_set_iovar_buffer( IOVAR_STR_PNO_SET, &pfn_param, sizeof( pfn_param ), WWD_STA_INTERFACE ) ); - - /* re-enable pfn */ - CHECK_RETURN( wwd_wifi_pno_set_enable( WICED_TRUE ) ); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_pno_stop( void ) -{ - CHECK_RETURN( wwd_wifi_pno_set_enable( WICED_FALSE ) ); - - return WWD_SUCCESS; -} - -wwd_result_t wwd_wifi_pno_clear( void ) -{ - /* must be stopped before clearing */ - CHECK_RETURN( wwd_wifi_pno_stop( ) ); - - /* clear all added networks */ - CHECK_RETURN( wwd_wifi_set_iovar_void( IOVAR_STR_PNO_CLEAR, WWD_STA_INTERFACE ) ); - - return WWD_SUCCESS; -} - -static wwd_result_t wwd_wifi_pno_set_enable( wiced_bool_t enable ) -{ - if ( enable == WICED_FALSE ) - { - /* disable pfn */ - CHECK_RETURN( wwd_wifi_set_iovar_value( IOVAR_STR_PNO_ON, 0, WWD_STA_INTERFACE ) ); - } - else - { - /* enable pfn */ - CHECK_RETURN( wwd_wifi_set_iovar_value( IOVAR_STR_PNO_ON, 1, WWD_STA_INTERFACE ) ); - } - return WWD_SUCCESS; -} diff --git a/components/WWD/WWD/network/resources.h b/components/WWD/WWD/network/resources.h deleted file mode 100644 index d50dc08f39d2753f0d3358c319efe94fa89e19f8..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/network/resources.h +++ /dev/null @@ -1 +0,0 @@ -/* Automatically generated file - this comment ensures resources.h file creation */ diff --git a/components/WWD/WWD/network/wwd_buffer.c b/components/WWD/WWD/network/wwd_buffer.c deleted file mode 100644 index 4ae799953cf6638059aa23f40777f1a2157baf8f..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/network/wwd_buffer.c +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Copyright 2018, Cypress Semiconductor Corporation or a subsidiary of - * Cypress Semiconductor Corporation. All Rights Reserved. - * - * This software, associated documentation and materials ("Software"), - * is owned by Cypress Semiconductor Corporation - * or one of its subsidiaries ("Cypress") and is protected by and subject to - * worldwide patent protection (United States and foreign), - * United States copyright laws and international treaty provisions. - * Therefore, you may use this Software only as provided in the license - * agreement accompanying the software package from which you - * obtained this Software ("EULA"). - * If no EULA applies, Cypress hereby grants you a personal, non-exclusive, - * non-transferable license to copy, modify, and compile the Software - * source code solely for use in connection with Cypress's - * integrated circuit products. Any reproduction, modification, translation, - * compilation, or representation of this Software except as specified - * above is prohibited without the express written permission of Cypress. - * - * Disclaimer: THIS SOFTWARE IS PROVIDED AS-IS, WITH NO WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, NONINFRINGEMENT, IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Cypress - * reserves the right to make changes to the Software without notice. Cypress - * does not assume any liability arising out of the application or use of the - * Software or any product or circuit described in the Software. Cypress does - * not authorize its products for use in any products where a malfunction or - * failure of the Cypress product may reasonably be expected to result in - * significant property damage, injury or death ("High Risk Product"). By - * including Cypress's product in a High Risk Product, the manufacturer - * of such system or application assumes all risk of such use and in doing - * so agrees to indemnify Cypress against all liability. - */ -#include "network/wwd_network_constants.h" -#include "network/wwd_buffer_interface.h" -#include "platform/wwd_bus_interface.h" -#include "lwip/netbuf.h" -#include "lwip/memp.h" -#include /* for NULL */ -#include "wwd_assert.h" -#include "RTOS/wwd_rtos_interface.h" -#include "wiced_utilities.h" -#include "wwd_wifi.h" - -void memp_free_notify( unsigned int type ); - -wwd_result_t wwd_buffer_init( /*@null@*/ /*@unused@*/ void * native_arg ) -{ - UNUSED_PARAMETER( native_arg ); - - return WWD_SUCCESS; -} - -wwd_result_t host_buffer_check_leaked( void ) -{ - - return WWD_SUCCESS; -} - -wwd_result_t host_buffer_add_application_defined_pool( void* pool_in, wwd_buffer_dir_t direction ) -{ - - return WWD_SUCCESS; -} - -wwd_result_t internal_host_buffer_get( wiced_buffer_t * buffer, wwd_buffer_dir_t direction, unsigned short size, unsigned long timeout_ms ) -{ - UNUSED_PARAMETER( direction ); - - wiced_assert("Error: Invalid buffer size\n", size != 0); - - *buffer = NULL; - - if ( size > (unsigned short) WICED_LINK_MTU ) - { - WPRINT_NETWORK_DEBUG(("Attempt to allocate a buffer larger than the MTU of the link\n")); - /*@-compdef@*/ /* Lint: buffer is not allocated in error case */ - return WWD_BUFFER_UNAVAILABLE_PERMANENT; - /*@+compdef@*/ - } - - do - { - *buffer = pbuf_alloc( PBUF_RAW, size, PBUF_RAM); - if ( *buffer != NULL ) - { - break; - } - - host_rtos_delay_milliseconds( 1 ); - - } while ( timeout_ms-- > 0); - - if ( *buffer == NULL ) - { - return WWD_BUFFER_UNAVAILABLE_TEMPORARY; - } - - /*@-compdef@*/ /* Lint does not realise allocation has occurred */ - return WWD_SUCCESS; - /*@+compdef@*/ -} - -wwd_result_t host_buffer_get( /*@special@*/ /*@out@*/ wiced_buffer_t* buffer, wwd_buffer_dir_t direction, unsigned short size, wiced_bool_t wait ) /*@allocates *buffer@*/ /*@defines **buffer@*/ -{ - unsigned long wait_option = ( wait == WICED_TRUE ) ? (unsigned long) WICED_NEVER_TIMEOUT : 0; - return internal_host_buffer_get(buffer, direction, size, wait_option); -} - -#include -wwd_result_t host_protocol_buffer_get(wiced_buffer_t *buffer) -{ - *buffer = (wiced_buffer_t)os_calloc(1, sizeof(struct pbuf)); - if (*buffer == OS_NULL) - return WWD_BUFFER_UNAVAILABLE_TEMPORARY; - - return WWD_SUCCESS; -} - - -void host_buffer_release( /*@only@*/ wiced_buffer_t buffer, wwd_buffer_dir_t direction ) -{ - UNUSED_PARAMETER( direction ); - - wiced_assert("Error: Invalid buffer\n", buffer != NULL); - - (void) pbuf_free( buffer ); -} - -/*@exposed@*/ uint8_t* host_buffer_get_current_piece_data_pointer( /*@temp@*/ wiced_buffer_t buffer ) -{ - wiced_assert("Error: Invalid buffer\n", buffer != NULL); - return (uint8_t*) buffer->payload; -} - -uint16_t host_buffer_get_current_piece_size( /*@temp@*/ wiced_buffer_t buffer ) -{ - wiced_assert("Error: Invalid buffer\n", buffer != NULL); - return (uint16_t) buffer->tot_len; -} - -/*@exposed@*/ /*@dependent@*/ /*@null@*/ wiced_buffer_t host_buffer_get_next_piece( /*@dependent@*/ wiced_buffer_t buffer ) -{ - wiced_assert("Error: Invalid buffer\n", buffer != NULL); - return buffer->next; -} - -wwd_result_t host_buffer_add_remove_at_front( wiced_buffer_t * buffer, int32_t add_remove_amount ) -{ - wiced_assert("Error: Invalid buffer\n", buffer != NULL); - if ( (u8_t) 0 != pbuf_header( *buffer, (s16_t) ( -add_remove_amount ) ) ) - { - WPRINT_NETWORK_DEBUG(("Failed to move pointer - usually because not enough space at front of buffer\n")); - return WWD_BUFFER_POINTER_MOVE_ERROR; - } - - return WWD_SUCCESS; -} - -wiced_buffer_t host_buffer_pop_from_fifo( wiced_buffer_fifo_t* fifos, wwd_interface_t* interface_return ) -{ - wiced_buffer_t buffer = NULL; - int interface_index = 0; - wwd_interface_t current_interface = WWD_INDEX_TO_INTERFACE( interface_index ); - for ( ; interface_index < WWD_INTERFACE_MAX ; interface_index++, current_interface = WWD_INDEX_TO_INTERFACE( interface_index ) ) - { - wiced_buffer_interface_fifo_t *fifo = &( fifos->per_interface_fifos[ WWD_INTERFACE_INDEX( current_interface ) ] ); - - if ( fifo->first != NULL ) - { - buffer = fifo->first; - if ( interface_return != NULL ) - { - *interface_return = current_interface; - } - fifo->first = buffer->next; - } - } - return buffer; -} - -void host_buffer_push_to_fifo( wiced_buffer_fifo_t* fifos, wiced_buffer_t buffer, wwd_interface_t interface ) -{ - - wiced_buffer_interface_fifo_t *fifo = &( fifos->per_interface_fifos[ WWD_INTERFACE_INDEX( interface ) ] ); - buffer->next = NULL; - - if ( fifo->first == NULL ) - { - fifo->first = buffer; - fifo->last = buffer; - } - else - { - fifo->last->next = buffer; - fifo->last = buffer; - } -} - -wwd_result_t host_buffer_set_size( /*@temp@*/ wiced_buffer_t buffer, unsigned short size ) -{ - if ( size > (unsigned short) WICED_LINK_MTU ) - { - WPRINT_NETWORK_ERROR(("Attempt to set a length larger than the MTU of the link\n")); - /*@-unreachable@*/ /* Reachable after hitting assert */ - return WWD_BUFFER_SIZE_SET_ERROR; - /*@+unreachable@*/ - } - buffer->tot_len = size; - buffer->len = size; - - return WWD_SUCCESS; -} - -wiced_bool_t host_buffer_pool_is_full( wwd_buffer_dir_t direction ) -{ - wiced_bool_t full = WICED_TRUE; - uint16_t one_byte = 1; - wiced_buffer_t buffer; - - /* not full if we can pull even one byte long out of the pool */ - if ( WWD_SUCCESS == host_buffer_get( &buffer, direction, one_byte, (wiced_bool_t)WICED_NO_WAIT ) ) - { - full = WICED_FALSE; - host_buffer_release( buffer, direction ); - } - - return full; -} - -void memp_free_notify( unsigned int type ) -{ -} - -void host_network_send_ethernet_data(char *buff, wwd_interface_t interface) -{ - wiced_buffer_t buffer = OS_NULL; - - buffer = pbuf_alloc(PBUF_RAW, wwd_sdpcm_data_header_size() + ((wiced_buffer_t)buff)->tot_len, PBUF_RAM); - pbuf_header(buffer, -wwd_sdpcm_data_header_size()); - pbuf_copy(buffer, (wiced_buffer_t)buff); - - wwd_network_send_ethernet_data(buffer, interface); -} diff --git a/components/WWD/WWD/network/wwd_buffer.h b/components/WWD/WWD/network/wwd_buffer.h deleted file mode 100644 index 1df52ee95570aec660985465b72512b8f1880aec..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/network/wwd_buffer.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2018, Cypress Semiconductor Corporation or a subsidiary of - * Cypress Semiconductor Corporation. All Rights Reserved. - * - * This software, associated documentation and materials ("Software"), - * is owned by Cypress Semiconductor Corporation - * or one of its subsidiaries ("Cypress") and is protected by and subject to - * worldwide patent protection (United States and foreign), - * United States copyright laws and international treaty provisions. - * Therefore, you may use this Software only as provided in the license - * agreement accompanying the software package from which you - * obtained this Software ("EULA"). - * If no EULA applies, Cypress hereby grants you a personal, non-exclusive, - * non-transferable license to copy, modify, and compile the Software - * source code solely for use in connection with Cypress's - * integrated circuit products. Any reproduction, modification, translation, - * compilation, or representation of this Software except as specified - * above is prohibited without the express written permission of Cypress. - * - * Disclaimer: THIS SOFTWARE IS PROVIDED AS-IS, WITH NO WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, NONINFRINGEMENT, IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Cypress - * reserves the right to make changes to the Software without notice. Cypress - * does not assume any liability arising out of the application or use of the - * Software or any product or circuit described in the Software. Cypress does - * not authorize its products for use in any products where a malfunction or - * failure of the Cypress product may reasonably be expected to result in - * significant property damage, injury or death ("High Risk Product"). By - * including Cypress's product in a High Risk Product, the manufacturer - * of such system or application assumes all risk of such use and in doing - * so agrees to indemnify Cypress against all liability. - */ -#ifndef INCLUDED_WWD_BUFFER_H_ -#define INCLUDED_WWD_BUFFER_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif -#include "wwd_constants.h" -#include "wiced_constants.h" - -/****************************************************** - * Constants - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -typedef /*@owned@*/ struct pbuf * wiced_buffer_t; - -typedef struct -{ - wiced_buffer_t first; - wiced_buffer_t last; -} wiced_buffer_interface_fifo_t; - -typedef struct -{ - wiced_buffer_interface_fifo_t per_interface_fifos[WICED_INTERFACE_MAX]; -} wiced_buffer_fifo_t; - -/****************************************************** - * Function declarations - ******************************************************/ - -/****************************************************** - * Global variables - ******************************************************/ - -wwd_result_t host_protocol_buffer_get(wiced_buffer_t *buffer); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ifndef INCLUDED_WWD_BUFFER_H_ */ diff --git a/components/WWD/WWD/network/wwd_resources.c b/components/WWD/WWD/network/wwd_resources.c deleted file mode 100644 index 84baee688cd0ecc21ee4eede68fe597dcea00a2a..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/network/wwd_resources.c +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Defines WWD resource functions for BCM943341WCD1 platform - */ -#include "resources.h" -//#include "wifi_nvram_image.h" -#include "platform/wwd_resource_interface.h" -//#include "wiced_resource.h" -#include "wwd_assert.h" -//#include "wiced_result.h" -//#include "platform_dct.h" -//#include "wiced_waf_common.h" - -/****************************************************** - * Macros - ******************************************************/ - -/****************************************************** - * Constants - ******************************************************/ - -#if defined( WWD_DYNAMIC_NVRAM ) -#define NVRAM_SIZE dynamic_nvram_size -#define NVRAM_IMAGE_VARIABLE dynamic_nvram_image -#else -#define NVRAM_SIZE sizeof( wifi_nvram_image ) -#define NVRAM_IMAGE_VARIABLE wifi_nvram_image -#endif - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Static Function Declarations - ******************************************************/ - -/****************************************************** - * Variable Definitions - ******************************************************/ - -extern const resource_hnd_t wifi_firmware_image; - -#if defined( WWD_DYNAMIC_NVRAM ) -uint32_t dynamic_nvram_size = sizeof( wifi_nvram_image ); -void* dynamic_nvram_image = &wifi_nvram_image; -#endif - -/****************************************************** - * Function Definitions - ******************************************************/ - -wwd_result_t host_platform_resource_size( wwd_resource_t resource, uint32_t* size_out ) -{ - if ( resource == WWD_RESOURCE_WLAN_FIRMWARE ) - { - -#ifdef NO_WIFI_FIRMWARE - wiced_assert("Request firmware in a no wifi firmware application", 0 == 1); - *size_out = 0; -#else -#ifdef WIFI_FIRMWARE_IN_MULTI_APP - wiced_app_t wifi_app; - - *size_out = 0; - if ( wiced_waf_app_open( DCT_WIFI_FIRMWARE_INDEX, &wifi_app ) != WICED_SUCCESS ) - { - return ( wwd_result_t ) RESOURCE_UNSUPPORTED; - } - wiced_waf_app_get_size( &wifi_app, size_out ); -#else - *size_out = (uint32_t) resource_get_size( &wifi_firmware_image ); -#endif -#endif - - } - else - { - *size_out = NVRAM_SIZE; - } - return WWD_SUCCESS; -} - -#if defined( WWD_DIRECT_RESOURCES ) -wwd_result_t host_platform_resource_read_direct( wwd_resource_t resource, const void** ptr_out ) -{ - if ( resource == WWD_RESOURCE_WLAN_FIRMWARE ) - { -#ifndef NO_WIFI_FIRMWARE - *ptr_out = wifi_firmware_image.val.mem.data; -#else - wiced_assert("Request firmware in a no wifi firmware application", 0 == 1); - *ptr_out = NULL; -#endif - } - else - { - *ptr_out = NVRAM_IMAGE_VARIABLE; - } - return WWD_SUCCESS; -} -#else /* ! defined( WWD_DIRECT_RESOURCES ) */ -wwd_result_t host_platform_resource_read_indirect( wwd_resource_t resource, uint32_t offset, void* buffer, uint32_t buffer_size, uint32_t* size_out ) -{ - if ( resource == WWD_RESOURCE_WLAN_FIRMWARE ) - { - -#ifdef NO_WIFI_FIRMWARE - wiced_assert("Request firmware in a no wifi firmware application", 0 == 1); - return ( wwd_result_t ) RESOURCE_UNSUPPORTED; -#else -#ifdef WIFI_FIRMWARE_IN_MULTI_APP - wiced_app_t wifi_app; - if ( wiced_waf_app_open( DCT_WIFI_FIRMWARE_INDEX, &wifi_app ) != WICED_SUCCESS ) - { - return ( wwd_result_t ) RESOURCE_UNSUPPORTED; - } - if ( wiced_waf_app_read_chunk( &wifi_app, offset, buffer, buffer_size ) == WICED_SUCCESS ) - { - *size_out = buffer_size; - } - else - { - *size_out = 0; - } - return WWD_SUCCESS; -#else - return resource_read( &wifi_firmware_image, offset, buffer_size, size_out, buffer ); -#endif -#endif - - } - else - { - *size_out = MIN( buffer_size, NVRAM_SIZE - offset ); - memcpy( buffer, &NVRAM_IMAGE_VARIABLE[ offset ], *size_out ); - return WWD_SUCCESS; - } -} -#endif /* if defined( WWD_DIRECT_RESOURCES ) */ diff --git a/components/WWD/WWD/platform/NoOS_canned_send.h b/components/WWD/WWD/platform/NoOS_canned_send.h deleted file mode 100644 index d04dc0d661a5342607b1ec44ecf6041b50b7dbc1..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/platform/NoOS_canned_send.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - - -/** - * @file - * Provides structures and macros for Canned Send example application - */ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -/** @cond */ -/****************************************************** - * Macros - ******************************************************/ - -#define MAKE_IPV4_ADDRESS(a, b, c, d) ((((uint32_t) (d)) << 24) | (((uint32_t) (c)) << 16) | (((uint32_t) (b)) << 8) | ((uint32_t) (a))) -#define SWAP16( a ) ((uint16_t)( ((((uint16_t)(a))&0xff)<<8) + ((((uint16_t)(a))&0xff00)>>8) )) - -/****************************************************** - * Constants - ******************************************************/ - -#define MIN_IOCTL_BUFFER_SIZE (120) -#define PACKET_SIZE (sizeof(udp_packet_t) + MAX_PAYLOAD) -#define ARP_OPERATION_REQUEST (1) -#define ARP_OPERATION_REPLY (2) -#define ARP_PROTOCOL_TYPE_IPV4 (0x0800) -#define ARP_HARDWARE_TYPE_ETHERNET (1) - -/****************************************************** - * Enumerations - ******************************************************/ -typedef enum -{ - ETHER_TYPE_IPv4 = 0x0800, -/* ETHER_TYPE_ARP = 0x0806, */ - ETHER_TYPE_IPv6 = 0x86DD, -} ether_type_t; - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -#pragma pack(1) - -typedef struct -{ - wiced_mac_t destination; - wiced_mac_t source; - uint16_t ether_type; -} ethernet_header_t; - -typedef struct -{ - uint16_t hardware_type; - uint16_t protocol_type; - uint8_t hardware_address_length; - uint8_t protocol_address_length; - uint16_t operation; - wiced_mac_t sender_hardware_address; - uint32_t sender_protocol_address; - wiced_mac_t target_hardware_address; - uint32_t target_protocol_address; -} arp_message_t; - -typedef struct -{ - uint8_t header_length : 4; - uint8_t version : 4; - uint8_t differentiated_services; - uint16_t total_length; - uint16_t identification; - uint16_t flags_fragment_offset; - uint8_t time_to_live; - uint8_t protocol; - uint16_t header_checksum; - uint32_t source_address; - uint32_t destination_address; -} ipv4_header_t; - -typedef struct -{ - uint16_t source_port; - uint16_t dest_port; - uint16_t udp_length; - uint16_t checksum; -} udp_header_t; - -typedef struct -{ - char reserved[WICED_LINK_OVERHEAD_BELOW_ETHERNET_FRAME_MAX]; - ethernet_header_t ethernet_header; - arp_message_t arp_message; -} arp_packet_t; - -typedef struct -{ - char reserved[WICED_LINK_OVERHEAD_BELOW_ETHERNET_FRAME_MAX]; - ethernet_header_t ethernet_header; - ipv4_header_t ip_header; - udp_header_t udp_header; - char data[1]; -} udp_packet_t; - -#pragma pack() - -/****************************************************** - * Global Variables - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - -/****************************************************** - * Local Enumerations and Structures - ******************************************************/ - -/** @endcond */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif diff --git a/components/WWD/WWD/platform/platform_assert.h b/components/WWD/WWD/platform/platform_assert.h deleted file mode 100644 index 8bbfbdc9b12d2a8a8daceafff029f402e122ae79..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/platform/platform_assert.h +++ /dev/null @@ -1,67 +0,0 @@ -/** -****************************************************************************** -* @file platform_assert.h -* @author William Xu -* @version V1.0.0 -* @date 05-May-2014 -****************************************************************************** -* -* The MIT License -* Copyright (c) 2014 MXCHIP Inc. -* -* 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. -****************************************************************************** -*/ - -#pragma once - -/****************************************************** - * Macros - ******************************************************/ - -/****************************************************** - * Constants - ******************************************************/ - -#ifdef __GNUC__ -#define MICO_ASSERTION_FAIL_ACTION() __asm__("bkpt") -#elif defined ( __IAR_SYSTEMS_ICC__ ) -#define MICO_ASSERTION_FAIL_ACTION() __asm("bkpt 0") -#elif defined ( __CC_ARM ) -#define MICO_ASSERTION_FAIL_ACTION() __asm("bkpt 0") -#endif - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Global Variables - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ diff --git a/components/WWD/WWD/platform/platform_constants.h b/components/WWD/WWD/platform/platform_constants.h deleted file mode 100644 index 7a2b4ce5669c69796dfda39b1ecd683d663f72a4..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/platform/platform_constants.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Defines platform constants - */ -#pragma once - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * Constants - ******************************************************/ - -/****************************************************** - * Macros - ******************************************************/ - -#ifndef TO_STRING -#define TO_STRING( a ) #a -#endif - -#ifndef RESULT_ENUM -#define RESULT_ENUM( prefix, name, value ) prefix ## name = (value) -#endif /* ifndef RESULT_ENUM */ - -/* These Enum result values are for platform errors - * Values: 1000 - 1999 - */ -#define PLATFORM_RESULT_LIST( prefix ) \ - RESULT_ENUM( prefix, SUCCESS, 0 ), /**< Success */ \ - RESULT_ENUM( prefix, PENDING, 1 ), /**< Pending */ \ - RESULT_ENUM( prefix, TIMEOUT, 2 ), /**< Timeout */ \ - RESULT_ENUM( prefix, PARTIAL_RESULTS, 3 ), /**< Partial results */ \ - RESULT_ENUM( prefix, ERROR, 4 ), /**< Error */ \ - RESULT_ENUM( prefix, BADARG, 5 ), /**< Bad Arguments */ \ - RESULT_ENUM( prefix, BADOPTION, 6 ), /**< Mode not supported */ \ - RESULT_ENUM( prefix, UNSUPPORTED, 7 ), /**< Unsupported function */ \ - RESULT_ENUM( prefix, UNINITLIASED, 6008 ), /**< Unitialised */ \ - RESULT_ENUM( prefix, INIT_FAIL, 6009 ), /**< Initialisation failed */ \ - RESULT_ENUM( prefix, NO_EFFECT, 6010 ), /**< No effect */ \ - RESULT_ENUM( prefix, FEATURE_DISABLED, 6011 ), /**< Feature disabled */ \ - RESULT_ENUM( prefix, NO_WLAN_POWER, 6012 ), /**< WLAN core is not powered */ \ - RESULT_ENUM( prefix, SPI_SLAVE_INVALID_COMMAND, 6013 ), /**< Command is invalid */ \ - RESULT_ENUM( prefix, SPI_SLAVE_ADDRESS_UNAVAILABLE, 6014 ), /**< Address specified in the command is unavailable */ \ - RESULT_ENUM( prefix, SPI_SLAVE_LENGTH_MISMATCH, 6015 ), /**< Length specified in the command doesn't match with the actual data length */ \ - RESULT_ENUM( prefix, SPI_SLAVE_READ_NOT_ALLOWED, 6016 ), /**< Read operation is not allowed for the address specified */ \ - RESULT_ENUM( prefix, SPI_SLAVE_WRITE_NOT_ALLOWED, 6017 ), /**< Write operation is not allowed for the address specified */ \ - RESULT_ENUM( prefix, SPI_SLAVE_HARDWARE_ERROR, 6018 ), /**< Hardware error occurred during transfer */ - -/****************************************************** - * Enumerations - ******************************************************/ - -/* Platform result enumeration */ -typedef enum -{ - PLATFORM_RESULT_LIST( PLATFORM_ ) -} platform_result_t; - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Global Variables - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - diff --git a/components/WWD/WWD/platform/platform_dct.h b/components/WWD/WWD/platform/platform_dct.h deleted file mode 100644 index 2b83a3be8020371434115b2316066984606e966f..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/platform/platform_dct.h +++ /dev/null @@ -1,823 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Defines Device Configuration Table (DCT) structures - * - * Instructions for adding to the DCT - * - * 1) Basic Rules: - * - * WE CANNOT CHANGE THE LAYOUT OF platform_dct_header_t FROM THE SDK VERSION THE BOOTLOADER WAS BUILT WITH - * - * ---> DO NOT CHANGE platform_dct_header_t !!! <--- - * - * The Bootloader only knows about platform_dct_header_t for the SDK it was built upon. - * The Bootloader is not upgrade-able, so platform_dct_header_t MUST match the platform_dct_header_t - * and all fields be used in the same manner as the Bootloader's SDK. - * - * ---> DO NOT CHANGE platform_dct_header_t !!! <--- - * - * If you need to add something that you believe should be in platform_dct_header_t. - * see if it makes sense to put the field into platform_dct_version_h. Doing this will make - * maintenance much much simpler. - * - * ---> ONLY ADD DATA TO THE END of platform_dct_data_t after platform_dct_version_h !!! <--- - * - * Adding/removing/changing fields in existing structures will require - * code to update from the previous version of the DCT to the new version you are creating. - * - * All sub-structures MUST be a multiple of 4 bytes in size. - * - * All previously optional sub-structures are always defined. This simplifies updating SDKs in the future. - * - * If you are adding an "optional" structure, see how bt, p2p, and ota2 are handled below using flags to indicate - * if the structures are in use or not. - * WICED_DCT_INCLUDE_BT_CONFIG - * WICED_DCT_INCLUDE_P2P_CONFIG - * WICED_DCT_INCLUDE_OTA2_CONFIG - * - * 2) Steps to ADD data to the end of platform_dct_data_t - * - Encapsulate the new data in a structure (or use an existing structure if appropriate) - * - Add the new structure inside platform_dct_data_t, after the last structure (currently platform_dct_version_h) - * - Add a new DCT_BOOTLOADER_SDK_CURRENT to the #defines below and comment changes - * - Add code to platform_dct_upgrade.c to support changes from the previous DCT version to the new DCT version - * - * 3) If you are deprecating a field in an existing structure - * - change the name of the field to "deprecated_xxxx" where xxx is teh previous field's name - * - This will keep the documentation of the change as part of the code, which may be important in future - * - * 4) If you must change or add fields in an existing DCT structure - * - provide the previous structure define with the SDK version at the end of the structure name. See the file - * platform_dct_old_sdk.h in this directory. - * (i.e. platform_dct_sdk_ver_t becomes platform_dct_sdk_ver_sdk_x_x_x_t) - * - modify the new structure with your changes - * - Add a new DCT_BOOTLOADER_SDK_CURRENT to the #defines below and comment changes - * - Add code to platform_dct_upgrade.c to support changing the previous - * DCT version to the new DCT version - * - Add support to call the upgrade routine in wiced_dct_external_common.c and wiced_dct_internal_common.c in - * functions wiced_dct_external_dct_update() and wiced_dct_internal_dct_update() respectively. - * - * Instructions for an application that is going to be upgraded on a system - * built with an older SDK. - * - * - Define the SDK used when the ORIGINAL bootloader was built on the command line - * ex: - * ./make - UPDATE_FROM_SDK=3_3_1 - * - Define the optional substructures (if used) when upgrading an SDK before SDK-3.6.x //: TODO: which rev are we releasing this update to? - * - * - */ -#pragma once - -#include -#include -#include "wwd_structures.h" -#include "wiced_constants.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Add new SDK version defines to this list - */ -#define DCT_BOOTLOADER_SDK_UNKNOWN 0x7fff /* large, non-negative (if interpreted as int) */ -#define DCT_BOOTLOADER_SDK_3_0_1 0x0301 /* No support for pre-SDK-3.0.1 */ -#define DCT_BOOTLOADER_SDK_3_1_0 0x0310 /* Changes from SDK-3.0.0 to SDK-3.1.0 - * TODO: check - NONE ?? - */ -#define DCT_BOOTLOADER_SDK_3_1_1 0x0311 /* Changes from SDK-3.1.0 to SDK-3.1.1 - * platform_dct_header_t - * Addition of apps_locations[ DCT_MAX_APP_COUNT ]; - */ -#define DCT_BOOTLOADER_SDK_3_1_2 0x0312 /* Changes from SDK-3.1.1 to SDK-3.1.2 - * platform_dct_header_t - * optional padding added to end of structure (DCT_HEADER_ALIGN_SIZE) - * OPTIONAL STRUCTS: - * platform_dct_bt_config_t - * New structure added as OPTIONAL - * (wrapped with WICED_DCT_INCLUDE_BT_CONFIG) - */ -#define DCT_BOOTLOADER_SDK_3_3_0 0x0330 /* Baseline - * Changes from SDK-3.1.2 to SDK-3.3.0 - * platform_dct_ethernet_config_t - * New structure added - * platform_dct_network_config_t - * New structure added - * - */ -#define DCT_BOOTLOADER_SDK_3_3_1 0x0331 /* Changes from SDK-3.3.0 to SDK-3.3.1 - * platform_dct_network_config_t - * changed char hostname[ HOSTNAME_SIZE + 1 ]; - * to wiced_hostname_t hostname; - * - */ -#define DCT_BOOTLOADER_SDK_3_4_0 0x0340 /* Changes from SDK-3.3.1 to SDK-3.4.0 - * platform_dct_bt_config_t - * added bluetooth_device_class - * changed padding - */ -#define DCT_BOOTLOADER_SDK_3_5_1 0x0351 /* Changes from SDK-3.4.0 to SDK-3.5.1 - * OPTIONAL STRUCTS: - * platform_p2p_config_t - * New structure added as OPTIONAL - * (wrapped with WICED_DCT_INCLUDE_P2P_CONFIG) - */ -#define DCT_BOOTLOADER_SDK_3_5_2 0x0352 /* Changes from SDK-3.5.1 to SDK-3.5.2 - * platform_dct_header_t - * moved magic_number, write_incomplete - * added CRC, sequence number - * removed is_current_dct - * OPTIONAL STRUCTS: - * platform_dct_ota2_config_t - * New structure added as OPTIONAL - * (wrapped with WICED_DCT_INCLUDE_OTA2_CONFIG) - * - */ -#define DCT_BOOTLOADER_SDK_3_6_0 0x0360 /* Changes from SDK-3.5.2 to SDK-3.6.0 - * OPTIONAL STRUCTS: - * platform_dct_ota2_header_t - * changed padding[1] to force_factory_reset - * field size not changed, struct size not changed - */ -#define DCT_BOOTLOADER_SDK_3_6_1 0x0361 /* Changes from SDK-3.6.0 to SDK-3.6.1 NONE */ -#define DCT_BOOTLOADER_SDK_3_6_2 0x0362 /* Changes from SDK-3.6.1 to SDK-3.6.2 NONE */ -#define DCT_BOOTLOADER_SDK_3_6_3 0x0363 /* Changes from SDK-3.6.2 to SDK-3.6.3 NONE */ -#define DCT_BOOTLOADER_SDK_3_7_0 0x0370 /* Changes from SDK-3.6.3 to SDK-3.7.0 - * platform_dct_header_t - * reverted to match SDK-3.3.0 (Baseline ) - * moved magic_number, write_incomplete - * removed CRC, sequence number - * added is_current_dct - * platform_dct_sdk_ver_t - * new structure - * CRC, seq. # - * dct_sdk_ver # - */ - -#define DCT_BOOTLOADER_SDK_CURRENT DCT_BOOTLOADER_SDK_3_7_0 - - -typedef uint16_t wiced_dct_sdk_ver_t; - -/* If the Bootloader SDK was defined, used that to support - * upgrading from that SDK's DCT layout to the current DCT layout - */ - -#if (defined(BOOTLOADER_SDK_3_0_0) || defined(BOOTLOADER_SDK_3_0_1)) - -#define DCT_BOOTLOADER_SDK_VERSION DCT_BOOTLOADER_SDK_3_0_0 -#define BOOTLOADER_NO_ETHER_CONFIG -#define BOOTLOADER_NO_NETWORK_CONFIG -#define BOOTLOADER_NO_BT_CONFIG -#define BOOTLOADER_NO_P2P_CONFIG -#define BOOTLOADER_NO_OTA2_CONFIG -#define BOOTLOADER_NO_VERSION -#define BOOTLOADER_APP_LUT_NO_SECURE_FLAG -#define dct_header_to_use platform_dct_header_sdk_3_0_0_t - -#elif defined(BOOTLOADER_SDK_3_1_0) - -#define DCT_BOOTLOADER_SDK_VERSION DCT_BOOTLOADER_SDK_3_1_0 -#define BOOTLOADER_NO_ETHER_CONFIG -#define BOOTLOADER_NO_NETWORK_CONFIG -#define BOOTLOADER_NO_BT_CONFIG -#define BOOTLOADER_NO_P2P_CONFIG -#define BOOTLOADER_NO_OTA2_CONFIG -#define BOOTLOADER_NO_VERSION -#define BOOTLOADER_APP_LUT_NO_SECURE_FLAG -#define dct_header_to_use platform_dct_header_sdk_3_1_0_t - -#elif defined(BOOTLOADER_SDK_3_1_1) - -#define DCT_BOOTLOADER_SDK_VERSION DCT_BOOTLOADER_SDK_3_1_1 -#define BOOTLOADER_NO_ETHER_CONFIG -#define BOOTLOADER_NO_NETWORK_CONFIG -#define BOOTLOADER_NO_BT_CONFIG -#define BOOTLOADER_NO_P2P_CONFIG -#define BOOTLOADER_NO_OTA2_CONFIG -#define BOOTLOADER_NO_VERSION -#define BOOTLOADER_APP_LUT_NO_SECURE_FLAG -#define dct_header_to_use platform_dct_header_sdk_3_1_1_t - -#elif defined(BOOTLOADER_SDK_3_1_2) - -#define DCT_BOOTLOADER_SDK_VERSION DCT_BOOTLOADER_SDK_3_1_2 -#define BOOTLOADER_NO_ETHER_CONFIG -#define BOOTLOADER_NO_NETWORK_CONFIG -#ifndef ORIGINAL_APP_SDK_USED_BT_CONFIG -#define BOOTLOADER_NO_BT_CONFIG -#else -#define bootloader_dct_bt_config_to_use platform_dct_bt_config_sdk_3_1_2_t -#endif -#define BOOTLOADER_NO_P2P_CONFIG -#define BOOTLOADER_NO_OTA2_CONFIG -#define BOOTLOADER_NO_VERSION -#define BOOTLOADER_APP_LUT_NO_SECURE_FLAG -#define dct_header_to_use platform_dct_header_sdk_3_1_2_t - -#elif defined(BOOTLOADER_SDK_3_3_0) - -#define DCT_BOOTLOADER_SDK_VERSION DCT_BOOTLOADER_SDK_3_3_0 -#ifndef ORIGINAL_APP_SDK_USED_BT_CONFIG -#define BOOTLOADER_NO_BT_CONFIG -#else -#define bootloader_dct_bt_config_to_use platform_dct_bt_config_sdk_3_1_2_t -#endif -#define BOOTLOADER_NO_P2P_CONFIG -#define BOOTLOADER_NO_OTA2_CONFIG -#define BOOTLOADER_NO_VERSION -#define BOOTLOADER_APP_LUT_NO_SECURE_FLAG -#define dct_header_to_use platform_dct_header_sdk_3_1_2_t -#define bootloader_dct_network_config_to_use platform_dct_network_config_sdk_3_3_0_t - -#elif defined(BOOTLOADER_SDK_3_3_1) - -#define DCT_BOOTLOADER_SDK_VERSION DCT_BOOTLOADER_SDK_3_3_1 -#ifndef ORIGINAL_APP_SDK_USED_BT_CONFIG -#define BOOTLOADER_NO_BT_CONFIG -#else -#define bootloader_dct_bt_config_to_use platform_dct_bt_config_sdk_3_1_2_t -#endif -#define BOOTLOADER_NO_P2P_CONFIG -#define BOOTLOADER_NO_OTA2_CONFIG -#define BOOTLOADER_NO_VERSION -#define BOOTLOADER_APP_LUT_NO_SECURE_FLAG -#define dct_header_to_use platform_dct_header_sdk_3_1_2_t -#define bootloader_dct_network_config_to_use platform_dct_network_config_sdk_3_3_1_t - -#elif defined(BOOTLOADER_SDK_3_4_0) - -#define DCT_BOOTLOADER_SDK_VERSION DCT_BOOTLOADER_SDK_3_4_0 -#ifndef ORIGINAL_APP_SDK_USED_BT_CONFIG -#define BOOTLOADER_NO_BT_CONFIG -#else -#define bootloader_dct_bt_config_to_use platform_dct_bt_config_sdk_3_4_0_t -#endif -#define BOOTLOADER_NO_P2P_CONFIG -#define BOOTLOADER_NO_OTA2_CONFIG -#define BOOTLOADER_NO_VERSION -#define dct_header_to_use platform_dct_header_sdk_3_1_2_t - -#elif defined(BOOTLOADER_SDK_3_5_1) - -#define DCT_BOOTLOADER_SDK_VERSION DCT_BOOTLOADER_SDK_3_5_1 -#ifndef ORIGINAL_APP_SDK_USED_BT_CONFIG -#define BOOTLOADER_NO_BT_CONFIG -#else -#define bootloader_dct_bt_config_to_use platform_dct_bt_config_sdk_3_4_0_t -#endif -#ifndef ORIGINAL_APP_SDK_USED_P2P_CONFIG -#define BOOTLOADER_NO_P2P_CONFIG -#endif -#define BOOTLOADER_NO_OTA2_CONFIG -#define BOOTLOADER_NO_VERSION -#define dct_header_to_use platform_dct_header_sdk_3_1_2_t - -#elif defined(BOOTLOADER_SDK_3_5_2) - -#define DCT_BOOTLOADER_SDK_VERSION DCT_BOOTLOADER_SDK_3_5_2 -#define DCT_BOOTLOADER_CRC_IS_IN_HEADER -#ifndef ORIGINAL_APP_SDK_USED_BT_CONFIG -#define BOOTLOADER_NO_BT_CONFIG -#else -#define bootloader_dct_bt_config_to_use platform_dct_bt_config_sdk_3_4_0_t -#endif -#ifndef ORIGINAL_APP_SDK_USED_P2P_CONFIG -#define BOOTLOADER_NO_P2P_CONFIG -#endif -#ifndef ORIGINAL_APP_SDK_USED_OTA2_CONFIG -#define BOOTLOADER_NO_OTA2_CONFIG -#else -#define bootloader_dct_ota2_config_to_use platform_dct_ota2_config_sdk_3_5_2_t -#endif -#define BOOTLOADER_NO_VERSION -#define dct_header_to_use platform_dct_header_sdk_3_5_2_t - -#elif defined(BOOTLOADER_SDK_3_6_0) - -#define DCT_BOOTLOADER_SDK_VERSION DCT_BOOTLOADER_SDK_3_6_0 -#define DCT_BOOTLOADER_CRC_IS_IN_HEADER -#ifndef ORIGINAL_APP_SDK_USED_BT_CONFIG -#define BOOTLOADER_NO_BT_CONFIG -#else -#define bootloader_dct_bt_config_to_use platform_dct_bt_config_sdk_3_4_0_t -#endif -#ifndef ORIGINAL_APP_SDK_USED_P2P_CONFIG -#define BOOTLOADER_NO_P2P_CONFIG -#endif -#ifndef ORIGINAL_APP_SDK_USED_OTA2_CONFIG -#define BOOTLOADER_NO_OTA2_CONFIG -#else -#define bootloader_dct_ota2_config_to_use platform_dct_ota2_config_sdk_3_6_0_t -#endif -#define BOOTLOADER_NO_VERSION -#define dct_header_to_use platform_dct_header_sdk_3_5_2_t - -#elif defined(BOOTLOADER_SDK_3_6_1) - -#define DCT_BOOTLOADER_SDK_VERSION DCT_BOOTLOADER_SDK_3_6_1 -#define DCT_BOOTLOADER_CRC_IS_IN_HEADER -#ifndef ORIGINAL_APP_SDK_USED_BT_CONFIG -#define BOOTLOADER_NO_BT_CONFIG -#else -#define bootloader_dct_bt_config_to_use platform_dct_bt_config_sdk_3_4_0_t -#endif -#ifndef ORIGINAL_APP_SDK_USED_P2P_CONFIG -#define BOOTLOADER_NO_P2P_CONFIG -#endif -#ifndef ORIGINAL_APP_SDK_USED_OTA2_CONFIG -#define BOOTLOADER_NO_OTA2_CONFIG -#else -#define bootloader_dct_ota2_config_to_use platform_dct_ota2_config_sdk_3_6_0_t -#endif -#define BOOTLOADER_NO_VERSION -#define dct_header_to_use platform_dct_header_sdk_3_5_2_t - -#elif defined(BOOTLOADER_SDK_3_6_2) - -#define DCT_BOOTLOADER_SDK_VERSION DCT_BOOTLOADER_SDK_3_6_2 -#define DCT_BOOTLOADER_CRC_IS_IN_HEADER -#ifndef ORIGINAL_APP_SDK_USED_BT_CONFIG -#define BOOTLOADER_NO_BT_CONFIG -#else -#define bootloader_dct_bt_config_to_use platform_dct_bt_config_sdk_3_4_0_t -#endif -#ifndef ORIGINAL_APP_SDK_USED_P2P_CONFIG -#define BOOTLOADER_NO_P2P_CONFIG -#endif -#ifndef ORIGINAL_APP_SDK_USED_OTA2_CONFIG -#define BOOTLOADER_NO_OTA2_CONFIG -#else -#define bootloader_dct_ota2_config_to_use platform_dct_ota2_config_sdk_3_6_0_t -#endif -#define BOOTLOADER_NO_VERSION -#define dct_header_to_use platform_dct_header_sdk_3_5_2_t - -#elif defined(BOOTLOADER_SDK_3_6_3) - -#define DCT_BOOTLOADER_SDK_VERSION DCT_BOOTLOADER_SDK_3_6_3 -#define DCT_BOOTLOADER_CRC_IS_IN_HEADER -#ifndef ORIGINAL_APP_SDK_USED_BT_CONFIG -#define BOOTLOADER_NO_BT_CONFIG -#else -#define bootloader_dct_bt_config_to_use platform_dct_bt_config_sdk_3_4_0_t -#endif -#ifndef ORIGINAL_APP_SDK_USED_P2P_CONFIG -#define BOOTLOADER_NO_P2P_CONFIG -#endif -#ifndef ORIGINAL_APP_SDK_USED_OTA2_CONFIG -#define BOOTLOADER_NO_OTA2_CONFIG -#else -#define bootloader_dct_ota2_config_to_use platform_dct_ota2_config_sdk_3_6_0_t -#endif -#define BOOTLOADER_NO_VERSION -#define dct_header_to_use platform_dct_header_sdk_3_5_2_t - -#elif defined(BOOTLOADER_SDK_3_7_0) - -#define DCT_BOOTLOADER_SDK_VERSION DCT_BOOTLOADER_SDK_3_7_0 -#define DCT_BOOTLOADER_CRC_IS_IN_VERSION - -#else - -/* if there is no BOOTLOADER SDK defined in the makefile, use the current version */ -#define DCT_BOOTLOADER_SDK_VERSION DCT_BOOTLOADER_SDK_CURRENT -#define DCT_BOOTLOADER_CRC_IS_IN_VERSION -#endif - -#define DCT_VERSION_MAGIC_NUMBER 0xDC0200CD - - -/****************************************************** - * Macros - ******************************************************/ - -/* TODO: find platform-specific file to allow other defines for these */ -#ifndef CRC_INIT_VALUE -#include "crc.h" -#define CRC_INIT_VALUE CRC32_INIT_VALUE -#define CRC_FUNCTION(address, size, previous_value) (uint32_t)crc32(address, size, previous_value) -typedef uint32_t CRC_TYPE; -#endif - -/* the CRC was added into platform_dct_header_t in SDK-5.1.2, moved to platform_dct_version_t in SDK-3.6.4 */ -#define IS_DCT_CRC_IN_HEADER(sdk) ( ((sdk == DCT_BOOTLOADER_SDK_3_5_2) || (sdk == DCT_BOOTLOADER_SDK_3_6_0) || \ - (sdk == DCT_BOOTLOADER_SDK_3_6_1) || (sdk == DCT_BOOTLOADER_SDK_3_6_2) || \ - (sdk == DCT_BOOTLOADER_SDK_3_6_3)) ? \ - WICED_TRUE : WICED_FALSE ) - -#define IS_DCT_CRC_IN_VERSION(sdk) ( (sdk >= DCT_BOOTLOADER_SDK_3_7_0) ? WICED_TRUE : WICED_FALSE ) - -/****************************************************** - * Constants - ******************************************************/ - -#ifndef PRIVATE_KEY_SIZE -#define PRIVATE_KEY_SIZE (2*1024) -#endif - -#ifndef CERTIFICATE_SIZE -#define CERTIFICATE_SIZE (4*1024) -#endif - -#ifndef CONFIG_AP_LIST_SIZE -#define CONFIG_AP_LIST_SIZE (5) -#endif - -#ifndef COOEE_KEY_SIZE -#define COOEE_KEY_SIZE (16) -#endif - -#ifndef SECURITY_KEY_SIZE -#define SECURITY_KEY_SIZE (64) -#endif - -#define CONFIG_VALIDITY_VALUE 0xCA1BDF58 - -#define DCT_FR_APP_INDEX ( 0 ) -#define DCT_DCT_IMAGE_INDEX ( 1 ) -#define DCT_OTA_APP_INDEX ( 2 ) -#define DCT_FILESYSTEM_IMAGE_INDEX ( 3 ) -#define DCT_WIFI_FIRMWARE_INDEX ( 4 ) -#define DCT_APP0_INDEX ( 5 ) -#define DCT_APP1_INDEX ( 6 ) -#define DCT_APP2_INDEX ( 7 ) - -#define DCT_MAX_APP_COUNT ( 8 ) - -#if (DCT_BOOTLOADER_SDK_VERSION >= DCT_BOOTLOADER_SDK_3_1_1) -#define DCT_APP_LOCATION_OF(APP_INDEX) (uint32_t)(ptrdiff_t)((uint8_t *)&((platform_dct_header_t *)0)->apps_locations + sizeof(image_location_t) * ( APP_INDEX )) -#else - /* this SDK does not have apps_locations in bootloader_dct_header_t (platform_dct_header_t for the SDK) */ -#endif - -/****************************************************** - * Enumerations - ******************************************************/ -/* these indicate which sections are in use, all sections are included in latest builds */ -#define WICED_DCT_BT_CONFIG_USE_FLAG (1 << 0) -#define WICED_DCT_P2P_CONFIG_USE_FLAG (1 << 1) -#define WICED_DCT_OTA2_CONFIG_USE_FLAG (1 << 2) - -#define WICED_DCT_ALL_USE_FLAGS (WICED_DCT_BT_CONFIG_USE_FLAG | WICED_DCT_P2P_CONFIG_USE_FLAG | WICED_DCT_OTA2_CONFIG_USE_FLAG) - -typedef uint16_t wiced_dct_config_flag_t; - - -#ifdef WICED_DCT_INCLUDE_BT_CONFIG -#define WICED_DCT_FLAG_BT WICED_DCT_BT_CONFIG_USE_FLAG -#else -#define WICED_DCT_FLAG_BT 0 -#endif - -#ifdef WICED_DCT_INCLUDE_P2P_CONFIG -#define WICED_DCT_FLAG_P2P WICED_DCT_P2P_CONFIG_USE_FLAG -#else -#define WICED_DCT_FLAG_P2P 0 -#endif - -#ifdef WICED_DCT_INCLUDE_OTA2_CONFIG -#define WICED_DCT_FLAG_OTA2 WICED_DCT_OTA2_CONFIG_USE_FLAG -#else -#define WICED_DCT_FLAG_OTA2 0 -#endif - -/* This defines the configurations that are in use - * in the current DCT - * default_dct_data.dct_sdk_ver.data_dct_usage_flags = - * WICED_DCT_CONFIG_FLAGS; - */ -#define WICED_DCT_CONFIG_FLAGS (WICED_DCT_FLAG_BT | WICED_DCT_FLAG_P2P | WICED_DCT_FLAG_OTA2) - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -typedef void (*dct_load_app_func_t)( void ); - -typedef struct -{ - uint32_t location; - uint32_t size; -} fixed_location_t; - - -typedef enum -{ - NONE, - INTERNAL, - EXTERNAL_FIXED_LOCATION, - EXTERNAL_FILESYSTEM_FILE, -} image_location_id_t; - -typedef struct -{ - image_location_id_t id; - union - { - fixed_location_t internal_fixed; - fixed_location_t external_fixed; - char filesystem_filename[32]; - } detail; -} image_location_t; - -typedef struct -{ - image_location_t source; - image_location_t destination; - char load_once; - char valid; -} load_details_t; - -typedef struct -{ - load_details_t load_details; - - uint32_t entry_point; -} boot_detail_t; - -typedef struct -{ - char manufacturer[ 32 ]; - char product_name[ 32 ]; - char BOM_name[24]; - char BOM_rev[8]; - char serial_number[20]; - char manufacture_date_time[20]; - char manufacture_location[12]; - char bootloader_version[8]; -} platform_dct_mfg_info_t; - -typedef struct -{ - char private_key[ PRIVATE_KEY_SIZE ]; - char certificate[ CERTIFICATE_SIZE ]; - uint8_t cooee_key [ COOEE_KEY_SIZE ]; -} platform_dct_security_t; - -typedef struct -{ - wiced_ap_info_t details; - uint8_t security_key_length; - char security_key[ SECURITY_KEY_SIZE ]; -} wiced_config_ap_entry_t; - -typedef struct -{ - wiced_ssid_t SSID; - wiced_security_t security; - uint8_t channel; - uint8_t security_key_length; - char security_key[ SECURITY_KEY_SIZE ]; - uint32_t details_valid; -} wiced_config_soft_ap_t; - -typedef struct -{ - wiced_bool_t device_configured; - wiced_config_ap_entry_t stored_ap_list[CONFIG_AP_LIST_SIZE]; - wiced_config_soft_ap_t soft_ap_settings; - wiced_config_soft_ap_t config_ap_settings; - wiced_country_code_t country_code; - wiced_mac_t mac_address; - uint8_t padding[2]; /* ensure 32bit aligned size */ -} platform_dct_wifi_config_t; - -typedef struct -{ - wiced_mac_t mac_address; - uint8_t padding[2]; /* ensure 32bit aligned size */ -} platform_dct_ethernet_config_t; - -typedef struct -{ - wiced_interface_t interface; - wiced_hostname_t hostname; - uint8_t padding[2]; /* ensure 32bit aligned size */ -} platform_dct_network_config_t; - -/** - * If you change anything in platform_dct_bt_config_t, go back to the other - * platform_dct_old_sdk.h files and make sure the old bt structure - * is defined so as to allow an update to the new layout! - */ -typedef struct -{ - uint8_t bluetooth_device_address[6]; - uint8_t bluetooth_device_name[249]; /* including null termination */ - uint8_t bluetooth_device_class[3]; - wiced_bool_t ssp_debug_mode; - uint8_t padding[2]; /* ensure 32-bit aligned size */ -} platform_dct_bt_config_t; - -/** - * If you change anything in platform_dct_p2p_config_t, go back to the other - * platform_dct_old_sdk.h files and make sure the old p2p structure - * is defined so as to allow an update to the new layout! - */ -typedef struct -{ - wiced_config_soft_ap_t p2p_group_owner_settings; - uint8_t padding[2]; /* ensure 32-bit aligned size */ -} platform_dct_p2p_config_t; - -/** - * If you change anything in platform_dct_ota2_config_t, go back to the other - * platform_dct_old_sdk.h files and make sure the old ota2 structure - * is defined so as to allow an update to the new layout! - */ -typedef struct -{ - uint16_t update_count; /* 0x00 when first programmed, incremented when updated -or- factory reset */ - uint8_t boot_type; /* value = ota2_boot_type_t */ - uint8_t force_factory_reset; /* call wiced_ota2_force_factory_reset_on_reboot() - set to non-zero to force reboot ) */ -} platform_dct_ota2_config_t; - -/* - * if valid, use sequence to determine current DCT - */ -typedef struct -{ - uint32_t magic_number; /* DCT_VERSION_MAGIC_NUMBER */ - wiced_dct_config_flag_t data_dct_usage_flags; /* which of the optional sub-structures are in use */ - wiced_dct_sdk_ver_t version; /* current DCT_BOOTLOADER_SDK_XXXX version */ - CRC_TYPE crc32; /* crc for this DCT (0 for SDKs 3.5.2 thru 3.6.2, CRC is dct_header) */ - char initial_write; /* 1 = first time DCT is written at manufacture (crc will also be 0x00) */ - uint8_t sequence; /* sequence number to know which DCT is the latest */ - uint8_t padding[2]; /* ensure 32-bit aligned size */ -} platform_dct_version_t; - -/* Include the headers for previous version DCT headers - * so that we can use the proper ones for - * platform_dct_header_t -- THIS STRUCTURE MUST ALWAYS MATCH THE BOOTLOADER IT IS BUILT FOR -- - * bootloader_dct_data_t & sub structures - */ - -#if (DCT_BOOTLOADER_SDK_VERSION != DCT_BOOTLOADER_SDK_CURRENT) -#include "platform_dct_old_sdk.h" -#endif - - -struct platform_dct_header_current_s /* SDK-3.6.4 */ -{ - unsigned long full_size; - unsigned long used_size; - char write_incomplete; - char is_current_dct; - char app_valid; - char mfg_info_programmed; - unsigned long magic_number; - boot_detail_t boot_detail; - image_location_t apps_locations[ DCT_MAX_APP_COUNT ]; - void (*load_app_func)( void ); /* WARNING: TEMPORARY */ -}; - -typedef struct /* SDK-3.6.4 */ -{ - unsigned long full_size; - unsigned long used_size; - char write_incomplete; - char is_current_dct; - char app_valid; - char mfg_info_programmed; - unsigned long magic_number; - boot_detail_t boot_detail; - image_location_t apps_locations[ DCT_MAX_APP_COUNT ]; - void (*load_app_func)( void ); /* WARNING: TEMPORARY */ -#ifdef DCT_HEADER_ALIGN_SIZE - uint8_t padding[DCT_HEADER_ALIGN_SIZE - sizeof(struct platform_dct_header_current_s)]; -#endif -} platform_dct_header_current_t; - -/* if the dct header is not defined, we are building a new application (not an upgrade). - * use the current structure definition - */ -#ifndef dct_header_to_use -#define dct_header_to_use platform_dct_header_current_t -#endif -typedef dct_header_to_use platform_dct_header_t; - -/* The structure for the complete system DCT layout. - * The application DCT data follows this structure in the DCT section of FLASH. - */ -typedef struct -{ - platform_dct_header_t dct_header; - platform_dct_mfg_info_t mfg_info; - platform_dct_security_t security_credentials; - platform_dct_wifi_config_t wifi_config; - platform_dct_ethernet_config_t ethernet_config; - platform_dct_network_config_t network_config; - platform_dct_bt_config_t bt_config; - platform_dct_p2p_config_t p2p_config; - platform_dct_ota2_config_t ota2_config; - platform_dct_version_t dct_version; -} platform_dct_data_t; - - -/*********************************************************************************** - * - * BOOTLOADER DCT may be from an older SDK (for OTA or OTA2 upgrades) - * - * if we are building an upgrade, some of the sub structures might be different than - * the current build - use this structure to access them - * - ***********************************************************************************/ - -/* struct added 3.3.0 field hostname changed string to struct in SDK 3.3.1 */ -#ifndef bootloader_dct_network_config_to_use -#define bootloader_dct_network_config_to_use platform_dct_network_config_t -#endif -typedef bootloader_dct_network_config_to_use bootloader_dct_network_config_t; - -/* struct added 3.1.2 added bluetooth_device_class (and padding) in SDK 3.4.0 */ -#ifndef bootloader_dct_bt_config_to_use -#define bootloader_dct_bt_config_to_use platform_dct_bt_config_t -#endif -typedef bootloader_dct_bt_config_to_use bootloader_dct_bt_config_t; - -/* struct added 3.5.2 changed padding into force_factory_reset for SDK 3.6.0 */ -#ifndef bootloader_dct_ota2_config_to_use -#define bootloader_dct_ota2_config_to_use platform_dct_ota2_config_t -#endif -typedef bootloader_dct_ota2_config_to_use bootloader_dct_ota2_config_t; - -typedef struct -{ - platform_dct_header_t dct_header; /* always the same as the bootloader dct header Changed often */ - platform_dct_mfg_info_t mfg_info; /* has not changed */ - platform_dct_security_t security_credentials; /* has not changed */ - platform_dct_wifi_config_t wifi_config; /* has not changed */ - -#ifndef BOOTLOADER_NO_ETHER_CONFIG - platform_dct_ethernet_config_t ethernet_config; /* struct added 3.3.0 field sizes, struct size has not changed */ -#endif -#ifndef BOOTLOADER_NO_NETWORK_CONFIG - bootloader_dct_network_config_t network_config; /* struct added 3.3.0 field hostname changed string to struct in SDK 3.3.1 */ -#endif -#ifndef BOOTLOADER_NO_BT_CONFIG - bootloader_dct_bt_config_t bt_config; /* struct added 3.1.2 (was optional) bluetooth_device_class added 3.4.0 */ -#endif -#ifndef BOOTLOADER_NO_P2P_CONFIG - platform_dct_p2p_config_t p2p_config; /* struct added 3.5.1 (was optional) */ -#endif -#ifndef BOOTLOADER_NO_OTA2_CONFIG - bootloader_dct_ota2_config_t ota2_config; /* struct added 3.5.2 (was optional) padding, changed force_factory_reset 3.6.0 */ -#endif -#ifndef BOOTLOADER_NO_VERSION - platform_dct_version_t dct_version; /* struct added 3.6.4 */ -#endif -} bootloader_dct_data_t; - - - -/* determine smallest and largest sizes of bootloader and application DCTs for buffer sizes for upgrades */ - -#define APPLICATION_DCT_DATA_SIZE sizeof(platform_dct_data_t) -#define BOOTLOADER_DCT_DATA_SIZE sizeof(bootloader_dct_data_t) -#define SMALLER_DCT_DATA_SIZE ((APPLICATION_DCT_DATA_SIZE < BOOTLOADER_DCT_DATA_SIZE) ? APPLICATION_DCT_DATA_SIZE : BOOTLOADER_DCT_DATA_SIZE ) -#define BIGGER_DCT_DATA_SIZE ((APPLICATION_DCT_DATA_SIZE > BOOTLOADER_DCT_DATA_SIZE) ? APPLICATION_DCT_DATA_SIZE : BOOTLOADER_DCT_DATA_SIZE ) - -#if defined(_app_dct) -#define APPLICATION_DCT_WITH_APP_DCT_DATA_SIZE (APPLICATION_DCT_DATA_SIZE + sizeof(_app_dct)) -#define BOOTLOADER_DCT_WITH_APP_DCT_DATA_SIZE (BOOTLOADER_DCT_DATA_SIZE + sizeof(_app_dct)) -#else -#define APPLICATION_DCT_WITH_APP_DCT_DATA_SIZE APPLICATION_DCT_DATA_SIZE -#define BOOTLOADER_DCT_WITH_APP_DCT_DATA_SIZE BOOTLOADER_DCT_DATA_SIZE -#endif - -/* - * For the DCT update, we don't want to allocate 2 buffers sizeof(platform_dct_data_t) and sizeof(bootloader_dct_data_t) - * as this would be ~ 16K. THis is too much RAM to pull aside for Internal Flash systems (some have small RAM sizes). - * Iinstead, we break the update down enough so that we are using the largest field size (CERTIFICATE_SIZE). - * - * NOTE: We also use the resulting source and destination buffers to load the - * header & version structures (src & dst) into these same buffers, - * so they can also not be < sizeof(platform_dct_header_t) + sizeof(platform_dct_version_t) (~800 bytes) - * - */ -#define LARGEST_DCT_SUB_STRUCTURE_SIZE CERTIFICATE_SIZE -/****************************************************** - * Global Variables - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif diff --git a/components/WWD/WWD/platform/platform_isr.h b/components/WWD/WWD/platform/platform_isr.h deleted file mode 100644 index d5c87dcde3d846a100f927100399c971a3d1fd23..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/platform/platform_isr.h +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Defines macros for defining and mapping interrupt handlers to the vector table of ARM-Cortex-M3 CPU - */ -#pragma once -#include "platform_constants.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * Macros - ******************************************************/ - -/* Section where IRQ handlers are placed */ -#define IRQ_SECTION ".text.irq" - -/* Macro for defining an interrupt handler (non-RTOS-aware) - * - * @warning: - * Do NOT call any RTOS primitive functions from here. If you need to call them, - * define your interrupt handler using WWD_RTOS_DEFINE_ISR() - * - * @usage: - * PLATFORM_DEFINE_ISR( my_irq ) - * { - * // Do something here - * } - * - */ -#if defined ( __GNUC__ ) -/* GCC */ -#define PLATFORM_DEFINE_NAKED_ISR( function ) \ - void function( void ); \ - __attribute__(( naked, interrupt, used, section( IRQ_SECTION ) )) void function( void ) - -#define PLATFORM_DEFINE_ISR( name ) \ - void name( void ); \ - __attribute__(( interrupt, used, section( IRQ_SECTION ) )) void name( void ) - -#elif defined ( __IAR_SYSTEMS_ICC__ ) -/* IAR Systems */ -#define PLATFORM_DEFINE_NAKED_ISR( function ) \ - __root __stackless void function( void ); \ - __root __stackless void function( void ) - -#define PLATFORM_DEFINE_ISR( name ) \ - __root void name( void ); \ - __root void name( void ) - -#else - -#define PLATFORM_DEFINE_ISR( name ) - -#endif - - -/* Macro for mapping a defined function to an interrupt handler declared in - * /WICED/platform///platform_interrupt_handlers.h - * - * @usage: - * PLATFORM_MAP_ISR( my_irq, USART1_irq ) - */ -#if defined( __GNUC__ ) - -#define PLATFORM_MAP_ISR( function, irq_handler ) \ - extern void irq_handler( void ); \ - __attribute__(( alias( #function ))) void irq_handler ( void ); - -#elif defined ( __IAR_SYSTEMS_ICC__ ) - -#define PLATFORM_MAP_ISR( function, irq_handler ) \ - extern void irq_handler( void ); \ - _Pragma( TO_STRING( weak irq_handler=function ) ) - -#else - -#define PLATFORM_MAP_ISR( function, irq_handler ) - -#endif - - -/* Macro for declaring a default handler for an unhandled interrupt - * - * @usage: - * PLATFORM_SET_DEFAULT_ISR( USART1_irq, default_handler ) - */ -#if defined( __GNUC__ ) - -#define PLATFORM_SET_DEFAULT_ISR( irq_handler, default_handler ) \ - __attribute__(( weak, alias( #default_handler ))) void irq_handler ( void ); - -#elif defined ( __IAR_SYSTEMS_ICC__ ) - -#define PLATFORM_SET_DEFAULT_ISR( irq_handler, default_handler ) \ - _Pragma( TO_STRING( weak irq_handler=default_handler ) ) - -#else - -#define PLATFORM_SET_DEFAULT_ISR( irq_handler, default_handler ) - -#endif - - -/* Macro for defining the interrupt vector table for ARM Cortex-M. - * - * @usage: - * PLATFORM_DEFINE_INTERRUPT_VECTOR_TABLE_ARRAY( interrupt_vector_table, PLATFORM_INTERRUPT_VECTOR_TABLE_SIZE_VARIABLE ) - */ -#if defined( __GNUC__ ) - -#define PLATFORM_DEFINE_INTERRUPT_VECTOR_TABLE_ARRAY(_NAME_, _SIZE_) \ - const uint32_t _NAME_[_SIZE_] - -#elif defined ( __IAR_SYSTEMS_ICC__ ) - -#define PLATFORM_DEFINE_INTERRUPT_VECTOR_TABLE_ARRAY(_NAME_, _SIZE_) \ - const uint32_t _NAME_ [_SIZE_] @ ".intvec" - -#else - -#define PLATFORM_DEFINE_INTERRUPT_VECTOR_TABLE_ARRAY(_NAME_, _SIZE_) - -#endif - -#define PLATFORM_INTERRUPT_VECTOR_TABLE_HAS_VARIABLE_SIZE - -/****************************************************** - * Constants - ******************************************************/ - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Global Variables - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - -#ifdef __cplusplus -} /*extern "C" */ -#endif diff --git a/components/WWD/WWD/platform/platform_resource.c b/components/WWD/WWD/platform/platform_resource.c deleted file mode 100644 index 87cf31a161eab5c79ae41b1fdd1ca85411cfe82b..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/platform/platform_resource.c +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Common resource implementation - */ - -#include -#include -#include "stdlib.h" -//#include "wicedfs.h" -#include "wiced_resource.h" -#include "platform_resource.h" -#include "platform_toolchain.h" - -/****************************************************** - * Macros - ******************************************************/ - -/****************************************************** - * Constants - ******************************************************/ - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Static Function Declarations - ******************************************************/ - -/****************************************************** - * Variable Definitions - ******************************************************/ - -/****************************************************** - * Function Definitions - ******************************************************/ - -resource_result_t resource_read ( const resource_hnd_t* resource, uint32_t offset, uint32_t maxsize, uint32_t* size, void* buffer ) -{ - if ( offset > resource->size ) - { - return RESOURCE_OFFSET_TOO_BIG; - } - - *size = MIN( maxsize, resource->size - offset ); - - if (resource->location == RESOURCE_IN_MEMORY) - { - memcpy(buffer, &resource->val.mem.data[offset], *size); - } -#ifdef USES_RESOURCES_IN_EXTERNAL_STORAGE - else if ( resource->location == RESOURCE_IN_EXTERNAL_STORAGE ) - { - return platform_read_external_resource( resource, offset, maxsize, size, buffer ); - } -#endif -#ifdef USES_RESOURCE_FILESYSTEM - else - { - wicedfs_file_t file_hnd; - - if ( 0 != wicedfs_fopen( &resource_fs_handle, &file_hnd, resource->val.fs.filename ) ) - { - return RESOURCE_FILE_OPEN_FAIL; - } - - if ( 0 != wicedfs_fseek( &file_hnd, (long)(offset + resource->val.fs.offset), SEEK_SET ) ) - { - wicedfs_fclose( &file_hnd ); - return RESOURCE_FILE_SEEK_FAIL; - } - - if ( *size != wicedfs_fread( buffer, 1, *size, &file_hnd ) ) - { - wicedfs_fclose( &file_hnd ); - return RESOURCE_FILE_READ_FAIL; - } - - wicedfs_fclose( &file_hnd ); - } -#endif /* ifdef USES_RESOURCE_FILESYSTEM */ - return RESOURCE_SUCCESS; -} - -resource_result_t resource_get_readonly_buffer ( const resource_hnd_t* resource, uint32_t offset, uint32_t maxsize, uint32_t* size_out, const void** buffer ) -{ - UNUSED_PARAMETER( maxsize ); - - if ( offset > resource->size ) - { - return RESOURCE_OFFSET_TOO_BIG; - } - - if ( resource->location == RESOURCE_IN_MEMORY ) - { - *buffer = &resource->val.mem.data[offset]; - *size_out = MIN(maxsize, resource->size - offset); - return RESOURCE_SUCCESS; - } -#ifdef USES_RESOURCE_FILESYSTEM - else - { - resource_result_t result; - uint32_t size_returned = 0; - *size_out = MIN(maxsize, resource->size - offset); - *buffer = malloc( *size_out ); - result = resource_read( resource, offset, *size_out, &size_returned, (void*) *buffer ); - *size_out = MIN( *size_out, size_returned ); - - if ( result != RESOURCE_SUCCESS ) - { - free( (void*) *buffer ); - return result; - } - return RESOURCE_SUCCESS; - } -#endif /* ifdef USES_RESOURCE_FILESYSTEM */ - return RESOURCE_UNSUPPORTED; -} - -resource_result_t resource_free_readonly_buffer( const resource_hnd_t* resource, const void* buffer ) -{ - if ( resource->location != RESOURCE_IN_MEMORY ) - { - free( (void*) buffer ); - } - return RESOURCE_SUCCESS; -} - diff --git a/components/WWD/WWD/platform/platform_resource.h b/components/WWD/WWD/platform/platform_resource.h deleted file mode 100644 index e78a39ffa99d04d6847ddeeb53b246760ceaa1c4..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/platform/platform_resource.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Defines globally accessible resource functions - */ -#pragma once -#include "wiced_resource.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * Macros - ******************************************************/ - -/****************************************************** - * Constants - ******************************************************/ - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Global Variables - ******************************************************/ - -#ifdef USES_RESOURCE_FILESYSTEM -#include "wicedfs.h" - -extern wicedfs_filesystem_t resource_fs_handle; -#endif /* ifdef USES_RESOURCE_FILESYSTEM */ - -/****************************************************** - * Function Declarations - ******************************************************/ - -/* Resource reading */ -extern resource_result_t resource_get_readonly_buffer ( const resource_hnd_t* resource, uint32_t offset, uint32_t maxsize, uint32_t* size_out, const void** buffer ); -extern resource_result_t resource_free_readonly_buffer( const resource_hnd_t* handle, const void* buffer ); - -extern resource_result_t platform_read_external_resource( const resource_hnd_t* resource, uint32_t offset, uint32_t maxsize, uint32_t* size, void* buffer ); - -#ifdef __cplusplus -} /*extern "C" */ -#endif diff --git a/components/WWD/WWD/platform/platform_toolchain.h b/components/WWD/WWD/platform/platform_toolchain.h deleted file mode 100644 index d0a74b9bd4c6f314dae32574f1f119021c8fcdb3..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/platform/platform_toolchain.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * UNPUBLISHED PROPRIETARY SOURCE CODE - * Copyright (c) 2016 MXCHIP Inc. - * - * The contents of this file may not be disclosed to third parties, copied or - * duplicated in any form, in whole or in part, without the prior written - * permission of MXCHIP Corporation. - * - */ - -#ifndef INCLUDED_WWD_TOOLCHAIN_H -#define INCLUDED_WWD_TOOLCHAIN_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -#if defined(__CLANG_ARM) || defined(__GNUC__) -#define __weak __attribute__((weak)) -#endif - -/****************************************************** - * Macros - ******************************************************/ - -#ifndef ALWAYS_INLINE -#define ALWAYS_INLINE -#endif - -#ifndef MAY_BE_UNUSED -#define MAY_BE_UNUSED -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif -#endif diff --git a/components/WWD/WWD/platform/wifi_nvram_image.h b/components/WWD/WWD/platform/wifi_nvram_image.h deleted file mode 100644 index 9f150fe7235600cc7fffdea8f070de148e9982b2..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/platform/wifi_nvram_image.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * NVRAM variables which define BCM43362 Parameters for the - * USI module used on the BCM943362WCD6_3 board - * - */ - -#ifndef INCLUDED_NVRAM_IMAGE_H_ -#define INCLUDED_NVRAM_IMAGE_H_ - -#include -#include -//#include "../generated_mac_address.txt" -#define NVRAM_GENERATED_MAC_ADDRESS "macaddr=02:0A:F7:7b:a4:ce" -#define DCT_GENERATED_MAC_ADDRESS "\x02\x0A\xF7\xce\x7b\xa4" -#define DCT_GENERATED_ETHERNET_MAC_ADDRESS "\x02\x0A\xF7\xce\x7b\xa5" - -#ifdef __cplusplus -extern "C" { -#endif - - -/** - * Character array of NVRAM image - */ - -static const char wifi_nvram_image[] = -"manfid=0x2d0" "\x00" -"prodid=0x492" "\x00" -"vendid=0x14e4" "\x00" -"devid=0x4343" "\x00" -"boardtype=0x0598" "\x00" -"boardrev=0x1307" "\x00" -"boardnum=777" "\x00" -"xtalfreq=26000" "\x00" -"boardflags=0xa00" "\x00" -"sromrev=3" "\x00" -"wl0id=0x431b" "\x00" -"macaddr=02:0A:F7:fe:86:1c" "\x00" -"aa2g=1" "\x00" -"ag0=2" "\x00" -"maxp2ga0=74" "\x00" -"cck2gpo=0x2222" "\x00" -"ofdm2gpo=0x66666666" "\x00" -"mcs2gpo0=0x7777" "\x00" -"mcs2gpo1=0x7777" "\x00" -"pa0maxpwr=56" "\x00" -"pa0b0=5447" "\x00" -"pa0b1=-607" "\x00" -"pa0b2=-160" "\x00" -"pa0itssit=62" "\x00" -"pa1itssit=62" "\x00" -"temp_based_dutycy_en=1" "\x00" -"tx_duty_cycle_ofdm=100" "\x00" -"tx_duty_cycle_cck=100" "\x00" -"tx_ofdm_temp_0=115" "\x00" -"tx_cck_temp_0=115" "\x00" -"tx_ofdm_dutycy_0=40" "\x00" -"tx_cck_dutycy_0=40" "\x00" -"tx_ofdm_temp_1=255" "\x00" -"tx_cck_temp_1=255" "\x00" -"tx_ofdm_dutycy_1=40" "\x00" -"tx_cck_dutycy_1=40" "\x00" -"tx_tone_power_index=40" "\x00" -"tx_tone_power_index.fab.3=48" "\x00" -"cckPwrOffset=5" "\x00" -"ccode=0" "\x00" -"rssismf2g=0xf" "\x00" -"rssismc2g=0x8" "\x00" -"rssisav2g=0x1" "\x00" -"triso2g=0" "\x00" -"noise_cal_enable_2g=0" "\x00" -"noise_cal_po_2g=0" "\x00" -"noise_cal_po_2g.fab.3=-2" "\x00" -"swctrlmap_2g=0x04040404,0x02020202,0x02020202,0x010101,0x1ff" "\x00" -"temp_add=29767" "\x00" -"temp_mult=425" "\x00" -"edonthd=-30" "\x00" -"edoffthd=-36" "\x00" -"temp_q=10" "\x00" -"initxidx2g=45" "\x00" -"tssitime=1" "\x00" -"rfreg033=0x19" "\x00" -"rfreg033_cck=0x1f" "\x00" -"cckPwrIdxCorr=-8" "\x00" -"spuravoid_enable2g=1" "\x00" -"sd_gpout=1" "\x00" -"sd_oobonly=1" "\x00" -"sd_level_trigger=1" "\x00" -"\x00\x00"; - - -#else /* ifndef INCLUDED_NVRAM_IMAGE_H_ */ - -#error Wi-Fi NVRAM image included twice - -#endif /* ifndef INCLUDED_NVRAM_IMAGE_H_ */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif diff --git a/components/WWD/WWD/platform/wwd_resources.c b/components/WWD/WWD/platform/wwd_resources.c deleted file mode 100644 index a14704c7d4f634597b3e67b33b6f25c465f14a92..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/platform/wwd_resources.c +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - -/** @file - * Defines WWD resource functions for BCM943341WCD1 platform - */ -#include "resources.h" -#include "wifi_nvram_image.h" -#include "platform/wwd_resource_interface.h" -#include "wiced_resource.h" -#include "wwd_assert.h" -#include "wiced_result.h" -#include "platform_dct.h" -//#include "wiced_waf_common.h" - -/****************************************************** - * Macros - ******************************************************/ - -/****************************************************** - * Constants - ******************************************************/ - -#if defined( WWD_DYNAMIC_NVRAM ) -#define NVRAM_SIZE dynamic_nvram_size -#define NVRAM_IMAGE_VARIABLE dynamic_nvram_image -#else -#define NVRAM_SIZE sizeof( wifi_nvram_image ) -#define NVRAM_IMAGE_VARIABLE wifi_nvram_image -#endif - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Static Function Declarations - ******************************************************/ - -/****************************************************** - * Variable Definitions - ******************************************************/ - -extern const resource_hnd_t wifi_firmware_image; - -#if defined( WWD_DYNAMIC_NVRAM ) -uint32_t dynamic_nvram_size = sizeof( wifi_nvram_image ); -void* dynamic_nvram_image = &wifi_nvram_image; -#endif - -/****************************************************** - * Function Definitions - ******************************************************/ - -wwd_result_t host_platform_resource_size( wwd_resource_t resource, uint32_t* size_out ) -{ - if ( resource == WWD_RESOURCE_WLAN_FIRMWARE ) - { - -#ifdef NO_WIFI_FIRMWARE - wiced_assert("Request firmware in a no wifi firmware application", 0 == 1); - *size_out = 0; -#else -#ifdef WIFI_FIRMWARE_IN_MULTI_APP - wiced_app_t wifi_app; - - *size_out = 0; - if ( wiced_waf_app_open( DCT_WIFI_FIRMWARE_INDEX, &wifi_app ) != WICED_SUCCESS ) - { - return ( wwd_result_t ) RESOURCE_UNSUPPORTED; - } - wiced_waf_app_get_size( &wifi_app, size_out ); -#else - *size_out = (uint32_t) resource_get_size( &wifi_firmware_image ); -#endif -#endif - - } - else - { - *size_out = NVRAM_SIZE; - } - return WWD_SUCCESS; -} - -#if defined( WWD_DIRECT_RESOURCES ) -wwd_result_t host_platform_resource_read_direct( wwd_resource_t resource, const void** ptr_out ) -{ - if ( resource == WWD_RESOURCE_WLAN_FIRMWARE ) - { -#ifndef NO_WIFI_FIRMWARE - *ptr_out = wifi_firmware_image.val.mem.data; -#else - wiced_assert("Request firmware in a no wifi firmware application", 0 == 1); - *ptr_out = NULL; -#endif - } - else - { - *ptr_out = NVRAM_IMAGE_VARIABLE; - } - return WWD_SUCCESS; -} -#else /* ! defined( WWD_DIRECT_RESOURCES ) */ -wwd_result_t host_platform_resource_read_indirect( wwd_resource_t resource, uint32_t offset, void* buffer, uint32_t buffer_size, uint32_t* size_out ) -{ - if ( resource == WWD_RESOURCE_WLAN_FIRMWARE ) - { - -#ifdef NO_WIFI_FIRMWARE - wiced_assert("Request firmware in a no wifi firmware application", 0 == 1); - return ( wwd_result_t ) RESOURCE_UNSUPPORTED; -#else -#ifdef WIFI_FIRMWARE_IN_MULTI_APP - wiced_app_t wifi_app; - if ( wiced_waf_app_open( DCT_WIFI_FIRMWARE_INDEX, &wifi_app ) != WICED_SUCCESS ) - { - return ( wwd_result_t ) RESOURCE_UNSUPPORTED; - } - if ( wiced_waf_app_read_chunk( &wifi_app, offset, buffer, buffer_size ) == WICED_SUCCESS ) - { - *size_out = buffer_size; - } - else - { - *size_out = 0; - } - return WWD_SUCCESS; -#else - return (wwd_result_t)resource_read( &wifi_firmware_image, offset, buffer_size, size_out, buffer ); -#endif -#endif - - } - else - { - *size_out = MIN( buffer_size, NVRAM_SIZE - offset ); - memcpy( buffer, &NVRAM_IMAGE_VARIABLE[ offset ], *size_out ); - return WWD_SUCCESS; - } -} -#endif /* if defined( WWD_DIRECT_RESOURCES ) */ diff --git a/components/WWD/WWD/sdio_driver/43362A2_bin.c b/components/WWD/WWD/sdio_driver/43362A2_bin.c deleted file mode 100644 index 083741f35dd96add14349272e9a923b941a802b7..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/sdio_driver/43362A2_bin.c +++ /dev/null @@ -1,12628 +0,0 @@ -#include "wiced_resource.h" - -const char wifi_firmware_image_data[210624] = { - 0, 0, 0, 0, 249, 194, 0, 0, 189, 193, 0, 0, 189, 193, 0, 0, 189, 193, - 0, 0, 189, 193, 0, 0, 189, 193, 0, 0, 189, 193, 0, 0, 189, 193, 0, 0, - 189, 193, 0, 0, 189, 193, 0, 0, 189, 193, 0, 0, 189, 193, 0, 0, 189, - 193, 0, 0, 189, 193, 0, 0, 189, 193, 0, 0, 189, 193, 0, 0, 189, 193, - 0, 0, 189, 193, 0, 0, 189, 193, 0, 0, 189, 193, 0, 0, 189, 193, 0, 0, - 189, 193, 0, 0, 189, 193, 0, 0, 189, 193, 0, 0, 189, 193, 0, 0, 189, - 193, 0, 0, 189, 193, 0, 0, 189, 193, 0, 0, 189, 193, 0, 0, 189, 193, - 0, 0, 189, 193, 0, 0, 0, 72, 0, 71, 249, 194, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 209, - 30, 128, 0, 181, 34, 128, 0, 189, 36, 128, 0, 73, 31, 128, 0, 249, 33, - 128, 0, 213, 248, 0, 0, 241, 32, 128, 0, 209, 32, 128, 0, 89, 72, 128, - 0, 105, 72, 128, 0, 21, 100, 128, 0, 225, 98, 128, 0, 41, 98, 128, 0, - 61, 101, 128, 0, 141, 98, 128, 0, 197, 98, 128, 0, 89, 99, 128, 0, 93, - 101, 128, 0, 125, 99, 128, 0, 157, 99, 128, 0, 13, 102, 128, 0, 169, - 97, 128, 0, 97, 97, 128, 0, 117, 96, 128, 0, 149, 96, 128, 0, 221, 99, - 128, 0, 157, 101, 128, 0, 41, 102, 128, 0, 253, 97, 128, 0, 185, 101, - 128, 0, 29, 97, 128, 0, 241, 101, 128, 0, 157, 102, 128, 0, 109, 101, - 128, 0, 145, 108, 128, 0, 205, 107, 128, 0, 49, 108, 128, 0, 141, 107, - 128, 0, 85, 108, 128, 0, 173, 106, 128, 0, 193, 106, 128, 0, 213, 106, - 128, 0, 73, 107, 128, 0, 29, 106, 128, 0, 253, 106, 128, 0, 173, 104, - 128, 0, 193, 105, 128, 0, 209, 104, 128, 0, 53, 107, 128, 0, 177, 105, - 128, 0, 205, 201, 0, 0, 209, 102, 128, 0, 225, 103, 128, 0, 141, 103, - 128, 0, 205, 103, 128, 0, 157, 104, 128, 0, 237, 103, 128, 0, 189, 103, - 128, 0, 161, 103, 128, 0, 237, 102, 128, 0, 9, 103, 128, 0, 97, 103, - 128, 0, 77, 72, 128, 0, 29, 72, 128, 0, 133, 152, 128, 0, 221, 150, - 128, 0, 81, 148, 128, 0, 177, 155, 128, 0, 57, 148, 128, 0, 5, 152, - 128, 0, 25, 152, 128, 0, 45, 152, 128, 0, 197, 155, 128, 0, 209, 154, - 128, 0, 137, 157, 128, 0, 209, 147, 128, 0, 217, 145, 128, 0, 237, 154, - 128, 0, 1, 41, 0, 0, 105, 248, 0, 0, 81, 41, 0, 0, 69, 248, 0, 0, 81, - 155, 128, 0, 121, 41, 0, 0, 73, 169, 128, 0, 153, 152, 128, 0, 177, - 41, 0, 0, 49, 168, 128, 0, 5, 167, 128, 0, 33, 162, 128, 0, 189, 147, - 128, 0, 221, 147, 128, 0, 25, 158, 128, 0, 125, 147, 128, 0, 69, 152, - 128, 0, 229, 155, 128, 0, 109, 166, 128, 0, 193, 156, 128, 0, 197, 159, - 128, 0, 161, 157, 128, 0, 173, 42, 0, 0, 145, 248, 0, 0, 165, 248, 0, - 0, 41, 170, 128, 0, 185, 169, 128, 0, 117, 170, 128, 0, 225, 169, 128, - 0, 57, 170, 128, 0, 141, 170, 128, 0, 93, 170, 128, 0, 13, 170, 128, - 0, 197, 169, 128, 0, 157, 169, 128, 0, 169, 12, 128, 0, 133, 13, 128, - 0, 193, 6, 128, 0, 41, 8, 128, 0, 105, 70, 128, 0, 77, 70, 128, 0, 217, - 68, 128, 0, 65, 70, 128, 0, 33, 68, 128, 0, 245, 67, 128, 0, 21, 68, - 128, 0, 225, 67, 128, 0, 225, 66, 128, 0, 133, 70, 128, 0, 117, 68, - 128, 0, 45, 68, 128, 0, 169, 66, 128, 0, 249, 66, 128, 0, 205, 67, 128, - 0, 185, 69, 128, 0, 245, 68, 128, 0, 57, 69, 128, 0, 9, 0, 128, 0, 61, - 0, 128, 0, 73, 1, 128, 0, 209, 4, 128, 0, 13, 4, 128, 0, 145, 3, 128, - 0, 77, 3, 128, 0, 229, 3, 128, 0, 53, 3, 128, 0, 101, 3, 128, 0, 41, - 2, 128, 0, 205, 2, 128, 0, 81, 2, 128, 0, 133, 2, 128, 0, 245, 2, 128, - 0, 149, 6, 128, 0, 57, 6, 128, 0, 129, 5, 128, 0, 5, 6, 128, 0, 253, - 4, 128, 0, 105, 15, 128, 0, 37, 22, 128, 0, 21, 22, 128, 0, 69, 19, - 128, 0, 21, 19, 128, 0, 37, 19, 128, 0, 9, 19, 128, 0, 53, 19, 128, - 0, 13, 30, 128, 0, 249, 29, 128, 0, 41, 29, 128, 0, 29, 28, 128, 0, - 57, 28, 128, 0, 49, 22, 128, 0, 89, 19, 128, 0, 101, 14, 128, 0, 149, - 19, 128, 0, 185, 28, 128, 0, 115, 40, 0, 0, 109, 13, 2, 0, 117, 29, - 128, 0, 173, 5, 1, 0, 61, 29, 128, 0, 13, 27, 128, 0, 233, 16, 128, - 0, 121, 15, 128, 0, 169, 22, 128, 0, 49, 20, 128, 0, 45, 17, 128, 0, - 165, 30, 128, 0, 177, 30, 128, 0, 189, 30, 128, 0, 105, 43, 128, 0, - 173, 40, 128, 0, 17, 41, 128, 0, 137, 43, 128, 0, 253, 43, 128, 0, 225, - 40, 128, 0, 101, 40, 128, 0, 181, 44, 128, 0, 145, 44, 128, 0, 29, 43, - 128, 0, 117, 45, 128, 0, 37, 44, 128, 0, 77, 48, 128, 0, 221, 45, 128, - 0, 89, 39, 128, 0, 49, 49, 128, 0, 241, 247, 0, 0, 141, 38, 128, 0, - 197, 38, 128, 0, 229, 36, 128, 0, 253, 38, 128, 0, 33, 37, 128, 0, 177, - 42, 128, 0, 101, 37, 128, 0, 37, 40, 128, 0, 97, 41, 128, 0, 65, 41, - 128, 0, 217, 41, 128, 0, 157, 41, 128, 0, 129, 41, 128, 0, 137, 48, - 128, 0, 77, 46, 128, 0, 177, 43, 128, 0, 49, 44, 128, 0, 225, 44, 128, - 0, 97, 50, 128, 0, 45, 50, 128, 0, 201, 51, 128, 0, 77, 54, 128, 0, - 105, 58, 128, 0, 181, 53, 128, 0, 249, 52, 128, 0, 169, 52, 128, 0, - 61, 51, 128, 0, 157, 51, 128, 0, 1, 52, 128, 0, 53, 54, 128, 0, 49, - 56, 128, 0, 53, 58, 128, 0, 33, 58, 128, 0, 173, 50, 128, 0, 13, 51, - 128, 0, 221, 50, 128, 0, 149, 58, 128, 0, 217, 55, 128, 0, 153, 54, - 128, 0, 25, 55, 128, 0, 89, 56, 128, 0, 73, 56, 128, 0, 25, 57, 128, - 0, 49, 61, 128, 0, 213, 58, 128, 0, 201, 60, 128, 0, 225, 59, 128, 0, - 81, 61, 128, 0, 217, 61, 128, 0, 173, 62, 128, 0, 89, 63, 128, 0, 153, - 65, 128, 0, 65, 71, 128, 0, 205, 91, 128, 0, 137, 83, 128, 0, 45, 77, - 128, 0, 169, 76, 128, 0, 225, 77, 128, 0, 233, 79, 128, 0, 177, 79, - 128, 0, 201, 78, 128, 0, 141, 78, 128, 0, 241, 81, 128, 0, 93, 82, 128, - 0, 209, 81, 128, 0, 45, 82, 128, 0, 1, 82, 128, 0, 201, 79, 128, 0, - 89, 76, 128, 0, 109, 76, 128, 0, 69, 91, 128, 0, 57, 86, 128, 0, 21, - 90, 128, 0, 201, 88, 128, 0, 49, 90, 128, 0, 129, 87, 128, 0, 249, 89, - 128, 0, 29, 86, 128, 0, 173, 85, 128, 0, 145, 85, 128, 0, 77, 90, 128, - 0, 45, 85, 128, 0, 113, 75, 128, 0, 113, 84, 128, 0, 9, 84, 128, 0, - 245, 77, 128, 0, 29, 76, 128, 0, 249, 75, 128, 0, 9, 76, 128, 0, 17, - 78, 128, 0, 21, 88, 128, 0, 253, 3, 1, 0, 45, 80, 128, 0, 229, 88, 128, - 0, 85, 86, 128, 0, 125, 90, 128, 0, 5, 79, 128, 0, 53, 78, 128, 0, 217, - 85, 128, 0, 81, 88, 128, 0, 157, 87, 128, 0, 89, 81, 128, 0, 97, 77, - 128, 0, 177, 72, 128, 0, 93, 91, 128, 0, 129, 82, 128, 0, 73, 76, 128, - 0, 65, 255, 0, 0, 241, 91, 128, 0, 229, 92, 128, 0, 225, 95, 128, 0, - 165, 94, 128, 0, 125, 94, 128, 0, 141, 92, 128, 0, 1, 92, 128, 0, 161, - 95, 128, 0, 137, 93, 128, 0, 5, 96, 128, 0, 57, 93, 128, 0, 209, 94, - 128, 0, 73, 94, 128, 0, 237, 108, 128, 0, 101, 109, 128, 0, 221, 109, - 128, 0, 13, 109, 128, 0, 41, 109, 128, 0, 137, 109, 128, 0, 249, 108, - 128, 0, 217, 108, 128, 0, 61, 110, 128, 0, 97, 111, 128, 0, 117, 110, - 128, 0, 5, 110, 128, 0, 169, 116, 128, 0, 85, 117, 128, 0, 213, 116, - 128, 0, 5, 116, 128, 0, 209, 124, 128, 0, 69, 125, 128, 0, 117, 124, - 128, 0, 17, 126, 128, 0, 137, 126, 128, 0, 233, 126, 128, 0, 145, 125, - 128, 0, 61, 126, 128, 0, 81, 127, 128, 0, 165, 129, 128, 0, 101, 132, - 128, 0, 65, 132, 128, 0, 141, 131, 128, 0, 101, 131, 128, 0, 53, 133, - 128, 0, 229, 132, 128, 0, 157, 132, 128, 0, 33, 133, 128, 0, 117, 132, - 128, 0, 189, 131, 128, 0, 93, 133, 128, 0, 189, 133, 128, 0, 21, 143, - 128, 0, 145, 141, 128, 0, 213, 137, 128, 0, 25, 134, 128, 0, 25, 171, - 128, 0, 93, 172, 128, 0, 161, 170, 128, 0, 181, 171, 128, 0, 93, 171, - 128, 0, 253, 176, 128, 0, 125, 177, 128, 0, 101, 176, 128, 0, 109, 174, - 128, 0, 133, 174, 128, 0, 237, 173, 128, 0, 65, 175, 128, 0, 29, 174, - 128, 0, 49, 177, 128, 0, 61, 177, 128, 0, 185, 174, 128, 0, 245, 177, - 128, 0, 121, 176, 128, 0, 253, 173, 128, 0, 9, 177, 128, 0, 141, 176, - 128, 0, 73, 177, 128, 0, 105, 177, 128, 0, 77, 174, 128, 0, 61, 174, - 128, 0, 149, 174, 128, 0, 41, 179, 128, 0, 201, 174, 128, 0, 205, 175, - 128, 0, 229, 175, 128, 0, 37, 176, 128, 0, 141, 175, 128, 0, 181, 178, - 128, 0, 253, 178, 128, 0, 25, 179, 128, 0, 237, 176, 128, 0, 93, 174, - 128, 0, 45, 174, 128, 0, 41, 178, 128, 0, 169, 176, 128, 0, 161, 177, - 128, 0, 5, 178, 128, 0, 57, 178, 128, 0, 169, 174, 128, 0, 125, 175, - 128, 0, 173, 179, 128, 0, 169, 189, 128, 0, 157, 193, 128, 0, 37, 199, - 128, 0, 221, 200, 128, 0, 101, 202, 128, 0, 225, 203, 128, 0, 221, 206, - 128, 0, 25, 206, 128, 0, 153, 206, 128, 0, 21, 207, 128, 0, 193, 45, - 0, 0, 13, 216, 128, 0, 221, 215, 128, 0, 145, 215, 128, 0, 29, 5, 1, - 0, 177, 44, 0, 0, 105, 216, 128, 0, 125, 207, 128, 0, 69, 217, 128, - 0, 229, 4, 1, 0, 153, 209, 128, 0, 57, 4, 1, 0, 249, 224, 128, 0, 113, - 245, 128, 0, 171, 47, 0, 0, 209, 222, 128, 0, 35, 242, 0, 0, 9, 234, - 128, 0, 161, 228, 128, 0, 225, 242, 0, 0, 225, 236, 128, 0, 17, 227, - 128, 0, 57, 234, 128, 0, 57, 227, 128, 0, 153, 227, 128, 0, 41, 223, - 128, 0, 219, 241, 0, 0, 137, 241, 0, 0, 25, 241, 0, 0, 77, 240, 0, 0, - 23, 240, 0, 0, 189, 235, 128, 0, 185, 46, 0, 0, 49, 47, 0, 0, 53, 241, - 0, 0, 131, 240, 0, 0, 239, 241, 0, 0, 225, 225, 128, 0, 169, 233, 128, - 0, 89, 242, 0, 0, 101, 242, 0, 0, 237, 245, 128, 0, 217, 0, 129, 0, - 157, 246, 128, 0, 197, 247, 128, 0, 133, 255, 128, 0, 69, 1, 129, 0, - 213, 2, 129, 0, 77, 3, 129, 0, 229, 0, 129, 0, 125, 246, 128, 0, 129, - 247, 128, 0, 213, 245, 128, 0, 81, 249, 128, 0, 49, 251, 128, 0, 241, - 246, 128, 0, 249, 245, 128, 0, 65, 255, 128, 0, 217, 249, 128, 0, 221, - 252, 128, 0, 169, 247, 128, 0, 201, 47, 0, 0, 89, 251, 128, 0, 141, - 247, 128, 0, 165, 249, 128, 0, 141, 5, 1, 0, 41, 246, 128, 0, 161, 248, - 128, 0, 93, 247, 128, 0, 101, 246, 128, 0, 149, 253, 128, 0, 9, 49, - 0, 0, 245, 2, 129, 0, 45, 2, 129, 0, 137, 1, 129, 0, 5, 1, 129, 0, 33, - 50, 0, 0, 153, 255, 128, 0, 25, 247, 128, 0, 137, 246, 128, 0, 193, - 246, 128, 0, 105, 5, 1, 0, 133, 245, 128, 0, 5, 247, 128, 0, 221, 246, - 128, 0, 177, 246, 128, 0, 173, 106, 129, 0, 189, 106, 129, 0, 221, 47, - 129, 0, 225, 87, 129, 0, 245, 109, 130, 0, 169, 141, 130, 0, 9, 37, - 130, 0, 25, 110, 130, 0, 1, 170, 129, 0, 93, 96, 130, 0, 165, 55, 130, - 0, 237, 105, 129, 0, 121, 89, 130, 0, 229, 88, 130, 0, 29, 89, 130, - 0, 253, 109, 129, 0, 73, 58, 129, 0, 65, 188, 130, 0, 233, 90, 130, - 0, 205, 96, 129, 0, 213, 150, 129, 0, 29, 97, 129, 0, 41, 97, 129, 0, - 137, 191, 129, 0, 29, 171, 129, 0, 169, 50, 130, 0, 103, 54, 0, 0, 37, - 105, 129, 0, 5, 166, 129, 0, 33, 173, 130, 0, 41, 88, 129, 0, 189, 62, - 129, 0, 165, 64, 129, 0, 53, 149, 129, 0, 89, 155, 129, 0, 61, 54, 130, - 0, 29, 69, 130, 0, 9, 40, 129, 0, 153, 160, 129, 0, 209, 40, 129, 0, - 233, 59, 129, 0, 141, 40, 129, 0, 65, 110, 130, 0, 133, 155, 129, 0, - 41, 93, 129, 0, 109, 57, 130, 0, 253, 57, 130, 0, 37, 58, 130, 0, 149, - 105, 129, 0, 201, 122, 129, 0, 145, 87, 129, 0, 93, 87, 129, 0, 117, - 48, 130, 0, 133, 47, 130, 0, 53, 87, 129, 0, 209, 47, 130, 0, 33, 87, - 129, 0, 73, 87, 129, 0, 245, 40, 129, 0, 149, 168, 130, 0, 45, 162, - 130, 0, 137, 211, 129, 0, 213, 107, 129, 0, 89, 89, 129, 0, 117, 89, - 129, 0, 245, 90, 130, 0, 5, 173, 129, 0, 241, 210, 129, 0, 57, 55, 129, - 0, 237, 113, 129, 0, 197, 150, 129, 0, 137, 87, 130, 0, 145, 97, 130, - 0, 205, 97, 130, 0, 169, 88, 129, 0, 29, 39, 130, 0, 69, 67, 130, 0, - 1, 68, 130, 0, 21, 106, 129, 0, 97, 74, 129, 0, 237, 78, 129, 0, 113, - 34, 130, 0, 5, 90, 129, 0, 77, 138, 129, 0, 117, 73, 129, 0, 113, 36, - 130, 0, 177, 73, 129, 0, 177, 68, 129, 0, 117, 172, 130, 0, 41, 43, - 130, 0, 89, 82, 129, 0, 225, 42, 130, 0, 181, 41, 130, 0, 113, 167, - 129, 0, 53, 167, 129, 0, 1, 212, 129, 0, 245, 190, 129, 0, 85, 180, - 129, 0, 209, 106, 130, 0, 209, 156, 129, 0, 157, 156, 129, 0, 149, 155, - 129, 0, 181, 157, 129, 0, 69, 157, 129, 0, 197, 157, 129, 0, 97, 112, - 130, 0, 9, 53, 129, 0, 161, 171, 130, 0, 141, 171, 130, 0, 117, 171, - 130, 0, 241, 147, 129, 0, 153, 104, 129, 0, 21, 215, 129, 0, 113, 193, - 130, 0, 125, 43, 129, 0, 233, 47, 129, 0, 13, 182, 129, 0, 37, 189, - 130, 0, 141, 79, 129, 0, 13, 80, 129, 0, 133, 67, 130, 0, 49, 215, 129, - 0, 177, 189, 130, 0, 149, 193, 130, 0, 93, 179, 130, 0, 77, 9, 1, 0, - 141, 209, 129, 0, 169, 54, 129, 0, 233, 188, 130, 0, 41, 55, 129, 0, - 233, 54, 129, 0, 161, 214, 129, 0, 165, 59, 129, 0, 109, 171, 129, 0, - 65, 176, 129, 0, 201, 243, 0, 0, 127, 243, 0, 0, 65, 189, 130, 0, 149, - 190, 130, 0, 205, 46, 130, 0, 157, 107, 129, 0, 205, 69, 130, 0, 69, - 57, 129, 0, 53, 59, 129, 0, 189, 58, 129, 0, 241, 213, 129, 0, 65, 159, - 129, 0, 17, 159, 129, 0, 113, 164, 130, 0, 173, 213, 129, 0, 193, 48, - 129, 0, 161, 57, 130, 0, 77, 97, 129, 0, 153, 91, 129, 0, 165, 114, - 129, 0, 137, 218, 129, 0, 97, 191, 129, 0, 97, 87, 130, 0, 129, 33, - 130, 0, 169, 33, 130, 0, 209, 173, 130, 0, 9, 188, 130, 0, 181, 161, - 129, 0, 157, 202, 129, 0, 185, 47, 130, 0, 217, 187, 130, 0, 17, 48, - 130, 0, 125, 173, 130, 0, 205, 164, 129, 0, 153, 164, 129, 0, 205, 171, - 130, 0, 21, 171, 130, 0, 193, 170, 130, 0, 185, 152, 129, 0, 129, 165, - 129, 0, 217, 208, 129, 0, 169, 207, 129, 0, 233, 59, 130, 0, 237, 207, - 129, 0, 101, 209, 129, 0, 121, 209, 129, 0, 81, 208, 129, 0, 101, 208, - 129, 0, 229, 33, 130, 0, 17, 34, 130, 0, 187, 82, 0, 0, 25, 83, 0, 0, - 253, 156, 129, 0, 145, 69, 130, 0, 85, 174, 130, 0, 65, 180, 129, 0, - 149, 189, 129, 0, 241, 138, 130, 0, 9, 139, 130, 0, 121, 217, 129, 0, - 125, 97, 130, 0, 205, 164, 130, 0, 65, 145, 129, 0, 161, 63, 130, 0, - 53, 148, 130, 0, 73, 148, 130, 0, 137, 137, 130, 0, 93, 193, 130, 0, - 241, 193, 130, 0, 209, 59, 130, 0, 213, 149, 130, 0, 229, 96, 129, 0, - 9, 32, 130, 0, 41, 248, 0, 0, 189, 59, 130, 0, 117, 161, 130, 0, 37, - 165, 130, 0, 37, 59, 130, 0, 233, 58, 130, 0, 117, 58, 130, 0, 241, - 48, 130, 0, 177, 48, 130, 0, 113, 215, 129, 0, 69, 153, 130, 0, 145, - 215, 129, 0, 137, 148, 130, 0, 221, 193, 130, 0, 169, 106, 130, 0, 37, - 107, 130, 0, 201, 68, 129, 0, 41, 69, 129, 0, 89, 107, 129, 0, 89, 73, - 129, 0, 237, 170, 129, 0, 105, 97, 130, 0, 173, 36, 130, 0, 5, 54, 129, - 0, 213, 53, 129, 0, 121, 208, 129, 0, 165, 208, 129, 0, 113, 92, 129, - 0, 225, 173, 129, 0, 237, 208, 129, 0, 73, 201, 129, 0, 77, 216, 129, - 0, 137, 61, 130, 0, 73, 32, 130, 0, 101, 150, 130, 0, 249, 37, 130, - 0, 137, 207, 129, 0, 133, 106, 130, 0, 21, 147, 130, 0, 45, 93, 130, - 0, 233, 202, 129, 0, 109, 64, 130, 0, 97, 48, 130, 0, 21, 72, 130, 0, - 49, 60, 129, 0, 97, 214, 129, 0, 17, 78, 129, 0, 145, 51, 0, 0, 65, - 161, 129, 0, 21, 166, 129, 0, 9, 153, 130, 0, 229, 201, 129, 0, 177, - 215, 129, 0, 53, 192, 130, 0, 41, 74, 129, 0, 65, 173, 129, 0, 237, - 190, 130, 0, 45, 190, 130, 0, 5, 190, 130, 0, 121, 190, 130, 0, 85, - 50, 129, 0, 165, 149, 129, 0, 177, 89, 129, 0, 229, 71, 129, 0, 145, - 82, 129, 0, 21, 99, 129, 0, 149, 100, 129, 0, 141, 102, 129, 0, 89, - 44, 129, 0, 57, 44, 129, 0, 33, 46, 129, 0, 101, 53, 130, 0, 213, 87, - 130, 0, 53, 43, 130, 0, 153, 96, 130, 0, 1, 97, 130, 0, 29, 64, 130, - 0, 29, 32, 130, 0, 29, 216, 129, 0, 169, 172, 130, 0, 241, 171, 130, - 0, 245, 43, 130, 0, 65, 174, 130, 0, 233, 3, 1, 0, 53, 106, 129, 0, - 9, 174, 130, 0, 105, 109, 130, 0, 9, 140, 129, 0, 213, 139, 129, 0, - 17, 111, 129, 0, 129, 144, 129, 0, 41, 108, 130, 0, 221, 161, 129, 0, - 233, 43, 129, 0, 85, 47, 130, 0, 57, 140, 129, 0, 165, 90, 130, 0, 53, - 92, 130, 0, 69, 187, 130, 0, 145, 190, 129, 0, 45, 110, 129, 0, 17, - 92, 130, 0, 37, 138, 129, 0, 77, 147, 129, 0, 137, 56, 130, 0, 213, - 55, 130, 0, 85, 90, 129, 0, 1, 56, 130, 0, 141, 3, 129, 0, 233, 32, - 130, 0, 225, 62, 130, 0, 145, 69, 129, 0, 45, 109, 129, 0, 13, 88, 130, - 0, 33, 71, 130, 0, 253, 206, 129, 0, 17, 202, 129, 0, 89, 54, 130, 0, - 159, 75, 0, 0, 37, 203, 129, 0, 145, 46, 129, 0, 45, 47, 129, 0, 185, - 58, 130, 0, 125, 243, 0, 0, 221, 169, 129, 0, 49, 212, 129, 0, 209, - 179, 130, 0, 173, 169, 129, 0, 213, 56, 130, 0, 141, 216, 129, 0, 85, - 94, 130, 0, 113, 154, 129, 0, 21, 65, 130, 0, 53, 218, 129, 0, 25, 37, - 130, 0, 105, 38, 130, 0, 53, 53, 129, 0, 47, 9, 1, 0, 61, 113, 129, - 0, 1, 45, 129, 0, 9, 162, 130, 0, 13, 35, 130, 0, 253, 113, 129, 0, - 217, 96, 130, 0, 81, 114, 129, 0, 65, 97, 130, 0, 69, 40, 129, 0, 193, - 35, 130, 0, 141, 108, 129, 0, 109, 35, 130, 0, 149, 71, 129, 0, 185, - 217, 129, 0, 181, 52, 129, 0, 117, 201, 129, 0, 241, 52, 129, 0, 45, - 191, 129, 0, 89, 175, 130, 0, 217, 60, 129, 0, 73, 79, 129, 0, 229, - 171, 129, 0, 37, 254, 0, 0, 121, 49, 129, 0, 5, 149, 130, 0, 97, 76, - 0, 0, 221, 147, 130, 0, 165, 102, 130, 0, 13, 200, 129, 0, 9, 94, 129, - 0, 125, 117, 129, 0, 21, 98, 129, 0, 145, 89, 129, 0, 81, 79, 0, 0, - 17, 73, 129, 0, 193, 72, 129, 0, 185, 191, 129, 0, 165, 69, 130, 0, - 245, 89, 130, 0, 241, 169, 130, 0, 65, 166, 130, 0, 57, 88, 130, 0, - 189, 66, 130, 0, 189, 167, 130, 0, 77, 34, 130, 0, 113, 167, 130, 0, - 165, 167, 130, 0, 225, 92, 129, 0, 237, 65, 130, 0, 209, 167, 130, 0, - 209, 104, 129, 0, 181, 204, 129, 0, 21, 175, 130, 0, 149, 65, 129, 0, - 225, 200, 129, 0, 137, 170, 129, 0, 233, 150, 129, 0, 125, 47, 129, - 0, 57, 57, 0, 0, 73, 66, 130, 0, 89, 68, 130, 0, 237, 8, 1, 0, 49, 49, - 130, 0, 97, 73, 130, 0, 77, 73, 130, 0, 13, 165, 129, 0, 9, 94, 130, - 0, 37, 62, 130, 0, 205, 205, 129, 0, 41, 179, 130, 0, 33, 81, 129, 0, - 69, 177, 130, 0, 169, 29, 130, 0, 121, 188, 130, 0, 209, 86, 129, 0, - 89, 157, 129, 0, 153, 157, 129, 0, 25, 28, 130, 0, 81, 63, 130, 0, 29, - 48, 129, 0, 201, 189, 129, 0, 21, 56, 129, 0, 121, 74, 129, 0, 221, - 155, 129, 0, 25, 158, 129, 0, 105, 97, 129, 0, 137, 110, 129, 0, 181, - 112, 129, 0, 209, 50, 130, 0, 241, 87, 129, 0, 169, 51, 130, 0, 157, - 90, 129, 0, 61, 53, 130, 0, 137, 51, 130, 0, 217, 110, 129, 0, 69, 112, - 129, 0, 253, 97, 129, 0, 89, 75, 129, 0, 13, 156, 129, 0, 85, 139, 130, - 0, 241, 142, 130, 0, 229, 154, 129, 0, 189, 53, 130, 0, 73, 54, 129, - 0, 41, 31, 130, 0, 101, 92, 130, 0, 129, 255, 0, 0, 81, 111, 129, 0, - 41, 155, 129, 0, 165, 109, 129, 0, 181, 162, 130, 0, 225, 175, 130, - 0, 169, 86, 130, 0, 137, 68, 129, 0, 61, 87, 130, 0, 225, 111, 130, - 0, 1, 111, 130, 0, 221, 114, 130, 0, 229, 62, 129, 0, 149, 81, 129, - 0, 253, 212, 129, 0, 245, 188, 129, 0, 129, 180, 129, 0, 241, 153, 129, - 0, 25, 49, 129, 0, 53, 138, 130, 0, 221, 218, 129, 0, 65, 61, 129, 0, - 45, 62, 129, 0, 233, 137, 130, 0, 193, 212, 129, 0, 253, 141, 130, 0, - 153, 182, 129, 0, 189, 167, 129, 0, 61, 159, 130, 0, 93, 3, 129, 0, - 109, 146, 130, 0, 33, 139, 130, 0, 89, 154, 129, 0, 237, 39, 129, 0, - 237, 148, 130, 0, 253, 138, 129, 0, 157, 138, 129, 0, 65, 107, 129, - 0, 225, 111, 129, 0, 93, 70, 130, 0, 161, 148, 130, 0, 157, 137, 130, - 0, 201, 146, 130, 0, 121, 153, 129, 0, 177, 144, 130, 0, 33, 145, 130, - 0, 29, 52, 129, 0, 153, 178, 130, 0, 221, 106, 130, 0, 141, 201, 129, - 0, 89, 39, 130, 0, 211, 3, 1, 0, 217, 144, 129, 0, 165, 107, 130, 0, - 109, 60, 130, 0, 229, 109, 130, 0, 5, 194, 130, 0, 201, 106, 129, 0, - 237, 69, 130, 0, 129, 107, 129, 0, 53, 63, 130, 0, 253, 144, 130, 0, - 113, 188, 129, 0, 241, 107, 129, 0, 61, 78, 130, 0, 81, 74, 130, 0, - 61, 162, 129, 0, 117, 7, 1, 0, 213, 84, 0, 0, 185, 126, 130, 0, 105, - 136, 130, 0, 105, 90, 130, 0, 221, 46, 129, 0, 21, 19, 130, 0, 17, 115, - 129, 0, 105, 128, 130, 0, 157, 145, 129, 0, 93, 139, 129, 0, 129, 108, - 130, 0, 141, 143, 129, 0, 77, 143, 129, 0, 9, 136, 129, 0, 189, 109, - 130, 0, 1, 142, 129, 0, 29, 94, 130, 0, 145, 113, 129, 0, 193, 39, 129, - 0, 121, 117, 130, 0, 45, 190, 129, 0, 45, 91, 130, 0, 233, 165, 130, - 0, 181, 114, 130, 0, 5, 97, 0, 0, 33, 125, 130, 0, 77, 128, 130, 0, - 141, 127, 130, 0, 1, 160, 129, 0, 237, 127, 130, 0, 45, 65, 129, 0, - 249, 132, 129, 0, 97, 133, 130, 0, 69, 114, 130, 0, 249, 84, 129, 0, - 105, 43, 130, 0, 105, 81, 129, 0, 197, 85, 129, 0, 49, 86, 129, 0, 161, - 166, 129, 0, 113, 80, 129, 0, 57, 42, 130, 0, 97, 83, 129, 0, 197, 115, - 129, 0, 213, 106, 0, 0, 241, 151, 129, 0, 169, 155, 129, 0, 253, 59, - 130, 0, 37, 160, 130, 0, 221, 57, 129, 0, 113, 93, 129, 0, 175, 255, - 0, 0, 73, 149, 129, 0, 9, 204, 129, 0, 33, 163, 130, 0, 69, 170, 129, - 0, 173, 129, 130, 0, 145, 103, 130, 0, 233, 133, 0, 0, 125, 112, 130, - 0, 225, 47, 130, 0, 233, 3, 129, 0, 129, 219, 129, 0, 149, 36, 130, - 0, 105, 137, 130, 0, 137, 195, 130, 0, 197, 196, 130, 0, 173, 247, 0, - 0, 177, 235, 130, 0, 9, 203, 130, 0, 13, 204, 130, 0, 89, 235, 130, - 0, 97, 233, 130, 0, 21, 241, 130, 0, 233, 205, 130, 0, 69, 223, 130, - 0, 9, 241, 130, 0, 141, 247, 130, 0, 141, 202, 130, 0, 137, 243, 130, - 0, 213, 202, 130, 0, 161, 9, 131, 0, 201, 247, 130, 0, 253, 239, 130, - 0, 153, 248, 130, 0, 37, 249, 130, 0, 57, 250, 130, 0, 137, 237, 130, - 0, 245, 136, 0, 0, 173, 229, 130, 0, 101, 218, 130, 0, 125, 197, 130, - 0, 45, 230, 130, 0, 221, 137, 0, 0, 49, 228, 130, 0, 229, 241, 130, - 0, 157, 200, 130, 0, 85, 243, 130, 0, 39, 255, 0, 0, 97, 199, 130, 0, - 205, 225, 130, 0, 109, 225, 130, 0, 165, 226, 130, 0, 89, 223, 130, - 0, 41, 244, 130, 0, 9, 199, 130, 0, 85, 239, 130, 0, 233, 236, 130, - 0, 201, 8, 1, 0, 189, 221, 130, 0, 225, 197, 130, 0, 77, 229, 130, 0, - 5, 224, 130, 0, 165, 249, 130, 0, 13, 197, 130, 0, 125, 143, 0, 0, 5, - 139, 0, 0, 217, 139, 0, 0, 145, 230, 130, 0, 189, 204, 130, 0, 253, - 233, 130, 0, 141, 209, 130, 0, 45, 241, 130, 0, 45, 247, 130, 0, 149, - 251, 130, 0, 105, 206, 130, 0, 161, 240, 130, 0, 213, 240, 130, 0, 245, - 204, 130, 0, 139, 140, 0, 0, 129, 217, 130, 0, 69, 197, 130, 0, 253, - 203, 130, 0, 37, 203, 130, 0, 189, 235, 130, 0, 29, 219, 130, 0, 21, - 205, 130, 0, 29, 141, 0, 0, 205, 230, 130, 0, 77, 207, 130, 0, 157, - 203, 130, 0, 69, 12, 131, 0, 229, 13, 131, 0, 89, 14, 131, 0, 65, 14, - 131, 0, 1, 11, 131, 0, 77, 10, 131, 0, 209, 13, 131, 0, 49, 12, 131, - 0, 89, 12, 131, 0, 113, 10, 131, 0, 101, 14, 131, 0, 241, 13, 131, 0, - 65, 11, 131, 0, 161, 30, 131, 0, 177, 30, 131, 0, 1, 43, 131, 0, 245, - 78, 131, 0, 17, 43, 131, 0, 177, 39, 131, 0, 153, 35, 131, 0, 1, 74, - 131, 0, 237, 73, 131, 0, 253, 71, 131, 0, 205, 76, 131, 0, 189, 76, - 131, 0, 113, 76, 131, 0, 213, 39, 131, 0, 77, 37, 131, 0, 149, 37, 131, - 0, 225, 76, 131, 0, 65, 76, 131, 0, 245, 3, 1, 0, 101, 17, 131, 0, 225, - 68, 131, 0, 33, 40, 131, 0, 189, 40, 131, 0, 121, 41, 131, 0, 101, 40, - 131, 0, 101, 43, 131, 0, 65, 69, 131, 0, 213, 41, 131, 0, 73, 29, 131, - 0, 161, 42, 131, 0, 93, 48, 131, 0, 81, 72, 131, 0, 229, 72, 131, 0, - 41, 72, 131, 0, 245, 35, 131, 0, 17, 74, 131, 0, 121, 52, 131, 0, 145, - 24, 131, 0, 165, 51, 131, 0, 237, 52, 131, 0, 29, 17, 131, 0, 157, 78, - 131, 0, 149, 77, 131, 0, 181, 26, 131, 0, 97, 71, 131, 0, 29, 77, 131, - 0, 237, 16, 131, 0, 13, 69, 131, 0, 193, 30, 131, 0, 1, 32, 131, 0, - 233, 33, 131, 0, 241, 37, 131, 0, 249, 29, 131, 0, 117, 1, 1, 0, 243, - 149, 0, 0, 73, 16, 131, 0, 193, 15, 131, 0, 33, 36, 131, 0, 165, 36, - 131, 0, 185, 74, 131, 0, 181, 47, 131, 0, 193, 69, 131, 0, 253, 28, - 131, 0, 113, 29, 131, 0, 245, 24, 131, 0, 89, 25, 131, 0, 241, 25, 131, - 0, 219, 6, 1, 0, 73, 42, 131, 0, 165, 17, 131, 0, 185, 87, 131, 0, 41, - 87, 131, 0, 101, 79, 131, 0, 1, 96, 131, 0, 229, 89, 131, 0, 57, 81, - 131, 0, 245, 79, 131, 0, 85, 84, 131, 0, 29, 94, 131, 0, 33, 82, 131, - 0, 101, 89, 131, 0, 121, 80, 131, 0, 113, 79, 131, 0, 9, 89, 131, 0, - 61, 99, 131, 0, 197, 87, 131, 0, 129, 92, 131, 0, 177, 91, 131, 0, 221, - 83, 131, 0, 17, 83, 131, 0, 157, 79, 131, 0, 41, 80, 131, 0, 37, 79, - 131, 0, 213, 88, 131, 0, 205, 98, 131, 0, 57, 96, 131, 0, 249, 92, 131, - 0, 77, 97, 131, 0, 93, 95, 131, 0, 45, 84, 131, 0, 221, 80, 131, 0, - 57, 87, 131, 0, 165, 85, 131, 0, 145, 99, 131, 0, 161, 98, 131, 0, 193, - 93, 131, 0, 45, 94, 131, 0, 69, 95, 131, 0, 161, 81, 131, 0, 7, 9, 1, - 0, 25, 91, 131, 0, 109, 90, 131, 0, 169, 86, 131, 0, 165, 80, 131, 0, - 9, 87, 131, 0, 13, 116, 131, 0, 221, 99, 131, 0, 41, 122, 131, 0, 1, - 102, 131, 0, 185, 178, 131, 0, 213, 167, 131, 0, 125, 132, 131, 0, 129, - 147, 131, 0, 93, 179, 131, 0, 161, 147, 131, 0, 233, 147, 131, 0, 53, - 7, 1, 0, 77, 151, 0, 0, 49, 160, 0, 0, 113, 122, 131, 0, 93, 103, 131, - 0, 81, 102, 131, 0, 205, 112, 131, 0, 85, 113, 131, 0, 221, 116, 131, - 0, 141, 170, 131, 0, 81, 168, 131, 0, 169, 177, 131, 0, 157, 145, 131, - 0, 209, 132, 131, 0, 87, 150, 0, 0, 97, 132, 131, 0, 173, 119, 131, - 0, 129, 129, 131, 0, 21, 130, 131, 0, 177, 128, 131, 0, 229, 181, 131, - 0, 109, 126, 131, 0, 181, 121, 131, 0, 141, 151, 0, 0, 145, 110, 131, - 0, 117, 143, 131, 0, 85, 135, 131, 0, 73, 2, 1, 0, 33, 156, 0, 0, 37, - 103, 131, 0, 193, 136, 131, 0, 217, 143, 131, 0, 245, 172, 131, 0, 233, - 119, 131, 0, 157, 109, 131, 0, 161, 167, 131, 0, 103, 9, 1, 0, 201, - 164, 131, 0, 41, 159, 0, 0, 85, 139, 131, 0, 229, 138, 131, 0, 205, - 106, 131, 0, 245, 134, 131, 0, 89, 106, 131, 0, 185, 170, 131, 0, 21, - 102, 131, 0, 81, 178, 131, 0, 157, 179, 131, 0, 217, 182, 131, 0, 89, - 177, 131, 0, 145, 130, 131, 0, 213, 176, 131, 0, 129, 134, 131, 0, 201, - 122, 131, 0, 5, 133, 131, 0, 121, 124, 131, 0, 137, 101, 131, 0, 85, - 165, 131, 0, 201, 175, 131, 0, 197, 254, 0, 0, 121, 153, 131, 0, 145, - 137, 131, 0, 197, 181, 131, 0, 13, 184, 131, 0, 153, 212, 131, 0, 45, - 192, 131, 0, 157, 194, 131, 0, 173, 195, 131, 0, 161, 198, 131, 0, 177, - 198, 131, 0, 197, 194, 131, 0, 169, 208, 131, 0, 85, 191, 131, 0, 249, - 207, 131, 0, 41, 191, 131, 0, 197, 225, 131, 0, 193, 192, 131, 0, 149, - 192, 131, 0, 77, 216, 131, 0, 13, 215, 131, 0, 21, 216, 131, 0, 241, - 215, 131, 0, 121, 189, 131, 0, 161, 225, 131, 0, 53, 194, 131, 0, 197, - 224, 131, 0, 221, 224, 131, 0, 197, 220, 131, 0, 153, 218, 131, 0, 1, - 218, 131, 0, 77, 184, 131, 0, 117, 192, 131, 0, 25, 194, 131, 0, 249, - 201, 131, 0, 61, 214, 131, 0, 21, 190, 131, 0, 201, 214, 131, 0, 93, - 186, 131, 0, 41, 214, 131, 0, 49, 185, 131, 0, 53, 188, 131, 0, 157, - 216, 131, 0, 93, 220, 131, 0, 41, 193, 131, 0, 169, 194, 131, 0, 229, - 192, 131, 0, 37, 219, 131, 0, 117, 194, 131, 0, 29, 208, 131, 0, 93, - 188, 131, 0, 97, 198, 131, 0, 213, 194, 131, 0, 5, 188, 131, 0, 1, 201, - 131, 0, 181, 200, 131, 0, 237, 200, 131, 0, 85, 214, 131, 0, 21, 217, - 131, 0, 165, 209, 131, 0, 241, 213, 131, 0, 1, 217, 131, 0, 129, 184, - 131, 0, 137, 224, 131, 0, 225, 188, 131, 0, 165, 219, 131, 0, 237, 225, - 131, 0, 113, 193, 131, 0, 233, 183, 131, 0, 109, 199, 131, 0, 141, 193, - 131, 0, 29, 200, 131, 0, 181, 209, 131, 0, 113, 220, 131, 0, 225, 193, - 131, 0, 169, 193, 131, 0, 25, 220, 131, 0, 57, 216, 131, 0, 77, 203, - 131, 0, 165, 183, 131, 0, 105, 203, 131, 0, 141, 201, 131, 0, 201, 212, - 131, 0, 61, 169, 0, 0, 153, 214, 131, 0, 229, 220, 131, 0, 77, 212, - 131, 0, 29, 195, 131, 0, 33, 221, 131, 0, 69, 217, 131, 0, 125, 211, - 131, 0, 61, 210, 131, 0, 65, 218, 131, 0, 205, 216, 131, 0, 217, 191, - 131, 0, 149, 189, 131, 0, 237, 189, 131, 0, 81, 192, 131, 0, 45, 184, - 131, 0, 73, 187, 131, 0, 49, 187, 131, 0, 205, 218, 131, 0, 213, 208, - 131, 0, 73, 202, 131, 0, 157, 213, 131, 0, 129, 191, 131, 0, 213, 207, - 131, 0, 61, 201, 131, 0, 221, 209, 131, 0, 185, 215, 131, 0, 37, 199, - 131, 0, 17, 165, 0, 0, 93, 190, 131, 0, 33, 225, 131, 0, 249, 224, 131, - 0, 113, 185, 131, 0, 141, 225, 131, 0, 37, 217, 131, 0, 73, 215, 131, - 0, 221, 219, 131, 0, 169, 185, 131, 0, 129, 161, 0, 0, 129, 8, 1, 0, - 89, 235, 131, 0, 197, 231, 131, 0, 65, 226, 131, 0, 37, 226, 131, 0, - 109, 245, 131, 0, 101, 235, 131, 0, 133, 242, 131, 0, 137, 247, 131, - 0, 177, 242, 131, 0, 169, 245, 131, 0, 173, 0, 132, 0, 225, 0, 132, - 0, 25, 253, 131, 0, 53, 238, 131, 0, 253, 243, 131, 0, 201, 174, 0, - 0, 137, 251, 131, 0, 185, 250, 131, 0, 33, 249, 131, 0, 241, 250, 131, - 0, 217, 248, 131, 0, 217, 249, 131, 0, 49, 0, 132, 0, 197, 254, 131, - 0, 73, 231, 131, 0, 5, 0, 132, 0, 77, 255, 131, 0, 109, 243, 131, 0, - 89, 254, 131, 0, 1, 254, 131, 0, 37, 235, 131, 0, 13, 235, 131, 0, 95, - 174, 0, 0, 53, 253, 131, 0, 129, 235, 131, 0, 89, 253, 131, 0, 17, 248, - 131, 0, 253, 247, 131, 0, 197, 237, 131, 0, 173, 237, 131, 0, 161, 1, - 132, 0, 233, 231, 131, 0, 177, 243, 131, 0, 221, 242, 131, 0, 37, 243, - 131, 0, 249, 230, 131, 0, 229, 226, 131, 0, 65, 3, 1, 0, 165, 233, 131, - 0, 141, 245, 131, 0, 81, 238, 131, 0, 121, 248, 131, 0, 113, 226, 131, - 0, 241, 232, 131, 0, 69, 230, 131, 0, 153, 247, 131, 0, 109, 238, 131, - 0, 65, 244, 131, 0, 185, 235, 131, 0, 117, 231, 131, 0, 177, 232, 131, - 0, 241, 172, 0, 0, 97, 241, 131, 0, 13, 248, 0, 0, 137, 238, 131, 0, - 33, 174, 0, 0, 253, 229, 131, 0, 169, 253, 131, 0, 37, 3, 1, 0, 181, - 251, 131, 0, 241, 241, 131, 0, 45, 16, 132, 0, 225, 21, 132, 0, 177, - 25, 132, 0, 197, 21, 132, 0, 217, 15, 132, 0, 205, 33, 132, 0, 73, 30, - 132, 0, 77, 31, 132, 0, 225, 18, 132, 0, 237, 8, 132, 0, 241, 1, 132, - 0, 45, 15, 132, 0, 237, 35, 132, 0, 245, 30, 132, 0, 229, 32, 132, 0, - 73, 32, 132, 0, 173, 18, 132, 0, 241, 26, 132, 0, 113, 31, 132, 0, 201, - 25, 132, 0, 173, 24, 132, 0, 69, 11, 132, 0, 145, 11, 132, 0, 13, 36, - 132, 0, 141, 35, 132, 0, 13, 24, 132, 0, 33, 6, 132, 0, 141, 22, 132, - 0, 49, 3, 132, 0, 105, 9, 132, 0, 253, 21, 132, 0, 233, 2, 132, 0, 1, - 2, 132, 0, 169, 9, 132, 0, 141, 20, 132, 0, 129, 30, 132, 0, 225, 11, - 132, 0, 117, 28, 132, 0, 173, 10, 132, 0, 73, 16, 132, 0, 113, 32, 132, - 0, 1, 33, 132, 0, 133, 10, 132, 0, 41, 29, 132, 0, 69, 7, 132, 0, 57, - 12, 132, 0, 41, 25, 132, 0, 85, 30, 132, 0, 137, 3, 132, 0, 229, 29, - 132, 0, 33, 37, 132, 0, 73, 19, 132, 0, 41, 26, 132, 0, 85, 3, 1, 0, - 237, 18, 132, 0, 69, 6, 132, 0, 1, 13, 132, 0, 137, 67, 132, 0, 109, - 42, 132, 0, 1, 77, 132, 0, 21, 40, 132, 0, 105, 40, 132, 0, 109, 238, - 0, 0, 9, 64, 132, 0, 17, 44, 132, 0, 249, 39, 132, 0, 145, 45, 132, - 0, 121, 76, 132, 0, 137, 52, 132, 0, 25, 51, 132, 0, 109, 47, 132, 0, - 201, 45, 132, 0, 241, 46, 132, 0, 125, 46, 132, 0, 101, 37, 132, 0, - 221, 52, 132, 0, 253, 37, 132, 0, 25, 41, 132, 0, 181, 64, 132, 0, 217, - 68, 132, 0, 121, 41, 132, 0, 185, 43, 132, 0, 61, 69, 132, 0, 149, 50, - 132, 0, 185, 40, 132, 0, 209, 56, 132, 0, 49, 72, 132, 0, 169, 48, 132, - 0, 109, 44, 132, 0, 153, 67, 132, 0, 209, 50, 132, 0, 109, 51, 132, - 0, 253, 47, 132, 0, 93, 69, 132, 0, 17, 52, 132, 0, 181, 74, 132, 0, - 117, 72, 132, 0, 197, 72, 132, 0, 177, 39, 132, 0, 49, 74, 132, 0, 217, - 73, 132, 0, 89, 50, 132, 0, 1, 76, 132, 0, 57, 56, 132, 0, 49, 77, 132, - 0, 85, 68, 132, 0, 217, 61, 132, 0, 85, 67, 132, 0, 81, 60, 132, 0, - 145, 57, 132, 0, 149, 54, 132, 0, 145, 55, 132, 0, 245, 54, 132, 0, - 225, 71, 132, 0, 21, 71, 132, 0, 205, 76, 132, 0, 245, 43, 132, 0, 37, - 70, 132, 0, 229, 58, 132, 0, 201, 55, 132, 0, 73, 66, 132, 0, 41, 42, - 132, 0, 165, 63, 132, 0, 89, 38, 132, 0, 149, 42, 132, 0, 69, 43, 132, - 0, 201, 93, 132, 0, 197, 9, 1, 0, 161, 86, 132, 0, 149, 86, 132, 0, - 25, 87, 132, 0, 233, 86, 132, 0, 5, 87, 132, 0, 53, 95, 132, 0, 29, - 98, 132, 0, 181, 87, 132, 0, 101, 99, 132, 0, 237, 98, 132, 0, 33, 99, - 132, 0, 189, 98, 132, 0, 25, 78, 132, 0, 185, 83, 132, 0, 177, 93, 132, - 0, 181, 81, 132, 0, 213, 95, 132, 0, 249, 85, 132, 0, 101, 96, 132, - 0, 89, 83, 132, 0, 229, 83, 132, 0, 233, 77, 132, 0, 245, 9, 1, 0, 225, - 95, 132, 0, 201, 9, 1, 0, 153, 9, 1, 0, 181, 91, 132, 0, 49, 86, 132, - 0, 165, 99, 132, 0, 205, 96, 132, 0, 145, 99, 132, 0, 237, 80, 132, - 0, 45, 94, 132, 0, 49, 81, 132, 0, 21, 92, 132, 0, 97, 84, 132, 0, 245, - 94, 132, 0, 241, 93, 132, 0, 209, 10, 1, 0, 113, 82, 132, 0, 89, 88, - 132, 0, 129, 92, 132, 0, 113, 87, 132, 0, 37, 87, 132, 0, 113, 88, 132, - 0, 173, 86, 132, 0, 65, 89, 132, 0, 109, 79, 132, 0, 41, 80, 132, 0, - 225, 84, 132, 0, 189, 97, 132, 0, 109, 97, 132, 0, 5, 89, 132, 0, 165, - 102, 132, 0, 217, 103, 132, 0, 69, 102, 132, 0, 13, 101, 132, 0, 145, - 103, 132, 0, 185, 99, 132, 0, 93, 103, 132, 0, 121, 103, 132, 0, 249, - 102, 132, 0, 33, 101, 132, 0, 33, 103, 132, 0, 197, 102, 132, 0, 141, - 102, 132, 0, 101, 102, 132, 0, 17, 104, 132, 0, 81, 108, 132, 0, 173, - 110, 132, 0, 1, 110, 132, 0, 249, 112, 132, 0, 77, 127, 132, 0, 125, - 108, 132, 0, 45, 116, 132, 0, 69, 106, 132, 0, 13, 123, 132, 0, 249, - 3, 1, 0, 21, 110, 132, 0, 69, 122, 132, 0, 229, 108, 132, 0, 69, 111, - 132, 0, 205, 238, 0, 0, 41, 126, 132, 0, 117, 109, 132, 0, 149, 107, - 132, 0, 181, 109, 132, 0, 125, 125, 132, 0, 93, 107, 132, 0, 213, 106, - 132, 0, 129, 106, 132, 0, 133, 116, 132, 0, 177, 128, 132, 0, 133, 126, - 132, 0, 205, 127, 132, 0, 73, 129, 132, 0, 105, 129, 132, 0, 237, 137, - 132, 0, 109, 138, 132, 0, 253, 137, 132, 0, 141, 137, 132, 0, 157, 137, - 132, 0, 233, 133, 132, 0, 249, 130, 132, 0, 37, 133, 132, 0, 81, 138, - 132, 0, 117, 133, 132, 0, 149, 132, 132, 0, 129, 129, 132, 0, 113, 131, - 132, 0, 193, 137, 132, 0, 93, 137, 132, 0, 213, 137, 132, 0, 109, 137, - 132, 0, 125, 137, 132, 0, 13, 138, 132, 0, 9, 134, 132, 0, 121, 140, - 132, 0, 125, 138, 132, 0, 13, 139, 132, 0, 73, 148, 132, 0, 141, 146, - 132, 0, 233, 141, 132, 0, 157, 139, 132, 0, 253, 140, 132, 0, 121, 144, - 132, 0, 13, 140, 132, 0, 69, 140, 132, 0, 233, 166, 132, 0, 165, 173, - 132, 0, 41, 150, 132, 0, 197, 152, 132, 0, 21, 193, 132, 0, 9, 169, - 132, 0, 153, 194, 132, 0, 69, 183, 132, 0, 49, 193, 132, 0, 209, 184, - 132, 0, 141, 153, 132, 0, 185, 154, 132, 0, 37, 172, 132, 0, 217, 191, - 132, 0, 201, 190, 132, 0, 161, 150, 132, 0, 37, 177, 132, 0, 81, 155, - 132, 0, 145, 152, 132, 0, 77, 151, 132, 0, 29, 151, 132, 0, 125, 166, - 132, 0, 209, 183, 132, 0, 45, 171, 132, 0, 133, 149, 132, 0, 25, 176, - 132, 0, 245, 173, 132, 0, 41, 169, 132, 0, 193, 169, 132, 0, 33, 159, - 132, 0, 37, 162, 132, 0, 177, 174, 132, 0, 193, 175, 132, 0, 213, 163, - 132, 0, 117, 183, 132, 0, 65, 162, 132, 0, 225, 188, 132, 0, 109, 168, - 132, 0, 189, 157, 132, 0, 149, 184, 132, 0, 93, 149, 132, 0, 117, 190, - 132, 0, 81, 185, 132, 0, 169, 149, 132, 0, 197, 193, 132, 0, 89, 154, - 132, 0, 65, 150, 132, 0, 61, 184, 132, 0, 157, 168, 132, 0, 229, 168, - 132, 0, 165, 155, 132, 0, 245, 166, 132, 0, 61, 175, 132, 0, 21, 154, - 132, 0, 249, 152, 132, 0, 237, 169, 132, 0, 109, 177, 132, 0, 253, 240, - 132, 0, 37, 223, 132, 0, 37, 237, 132, 0, 229, 208, 132, 0, 205, 241, - 132, 0, 9, 242, 132, 0, 53, 242, 132, 0, 85, 242, 132, 0, 205, 242, - 132, 0, 177, 211, 132, 0, 245, 211, 132, 0, 45, 212, 132, 0, 193, 212, - 132, 0, 165, 4, 133, 0, 249, 5, 133, 0, 109, 5, 133, 0, 153, 4, 133, - 0, 141, 4, 133, 0, 121, 212, 132, 0, 69, 232, 132, 0, 177, 197, 132, - 0, 149, 223, 132, 0, 49, 223, 132, 0, 117, 228, 132, 0, 29, 224, 132, - 0, 189, 201, 132, 0, 5, 237, 132, 0, 165, 0, 133, 0, 145, 251, 132, - 0, 249, 237, 132, 0, 145, 239, 132, 0, 157, 251, 132, 0, 129, 234, 132, - 0, 121, 226, 132, 0, 89, 198, 132, 0, 97, 235, 132, 0, 161, 235, 132, - 0, 209, 228, 132, 0, 157, 2, 133, 0, 161, 243, 132, 0, 21, 204, 132, - 0, 93, 251, 132, 0, 129, 197, 132, 0, 21, 213, 132, 0, 153, 214, 132, - 0, 53, 231, 132, 0, 185, 223, 132, 0, 69, 244, 132, 0, 185, 199, 132, - 0, 1, 223, 132, 0, 45, 1, 133, 0, 225, 199, 132, 0, 37, 209, 132, 0, - 191, 239, 0, 0, 189, 221, 132, 0, 77, 243, 132, 0, 225, 201, 132, 0, - 65, 224, 132, 0, 45, 202, 132, 0, 157, 212, 132, 0, 5, 235, 132, 0, - 217, 0, 133, 0, 121, 203, 132, 0, 33, 252, 132, 0, 185, 232, 132, 0, - 181, 216, 132, 0, 49, 253, 132, 0, 189, 251, 132, 0, 29, 4, 133, 0, - 93, 4, 133, 0, 49, 237, 132, 0, 69, 6, 133, 0, 93, 236, 132, 0, 37, - 195, 132, 0, 29, 243, 132, 0, 217, 198, 132, 0, 45, 236, 132, 0, 241, - 197, 132, 0, 89, 233, 132, 0, 25, 200, 132, 0, 177, 239, 132, 0, 177, - 0, 133, 0, 73, 211, 132, 0, 1, 201, 132, 0, 225, 210, 132, 0, 141, 203, - 132, 0, 221, 235, 132, 0, 17, 244, 132, 0, 9, 252, 132, 0, 217, 243, - 132, 0, 105, 195, 132, 0, 161, 200, 132, 0, 45, 238, 132, 0, 113, 214, - 132, 0, 121, 1, 133, 0, 189, 238, 132, 0, 37, 216, 132, 0, 221, 249, - 132, 0, 9, 240, 132, 0, 53, 247, 132, 0, 185, 239, 0, 0, 217, 252, 132, - 0, 21, 215, 132, 0, 221, 213, 132, 0, 29, 222, 132, 0, 217, 245, 132, - 0, 25, 241, 132, 0, 153, 241, 132, 0, 73, 241, 132, 0, 241, 244, 132, - 0, 161, 244, 132, 0, 241, 208, 132, 0, 61, 204, 132, 0, 105, 210, 132, - 0, 137, 233, 132, 0, 113, 205, 132, 0, 201, 211, 132, 0, 133, 6, 133, - 0, 137, 7, 133, 0, 233, 6, 133, 0, 77, 7, 133, 0, 17, 7, 133, 0, 37, - 7, 133, 0, 113, 6, 133, 0, 149, 6, 133, 0, 189, 6, 133, 0, 117, 7, 133, - 0, 177, 7, 133, 0, 157, 7, 133, 0, 169, 6, 133, 0, 209, 6, 133, 0, 253, - 6, 133, 0, 57, 7, 133, 0, 97, 7, 133, 0, 93, 6, 133, 0, 21, 9, 133, - 0, 121, 9, 133, 0, 53, 10, 133, 0, 189, 9, 133, 0, 13, 10, 133, 0, 249, - 192, 0, 0, 107, 3, 1, 0, 77, 10, 133, 0, 169, 9, 133, 0, 37, 9, 133, - 0, 221, 10, 133, 0, 109, 10, 133, 0, 129, 8, 133, 0, 197, 7, 133, 0, - 13, 11, 133, 0, 89, 15, 133, 0, 237, 17, 133, 0, 201, 18, 133, 0, 33, - 16, 133, 0, 249, 13, 133, 0, 213, 17, 133, 0, 81, 16, 133, 0, 173, 17, - 133, 0, 1, 17, 133, 0, 109, 16, 133, 0, 17, 181, 1, 0, 133, 15, 133, - 0, 133, 16, 133, 0, 153, 13, 133, 0, 17, 18, 133, 0, 13, 34, 133, 0, - 65, 23, 133, 0, 217, 23, 133, 0, 117, 32, 133, 0, 125, 44, 133, 0, 53, - 47, 133, 0, 185, 34, 133, 0, 45, 37, 133, 0, 157, 35, 133, 0, 97, 47, - 133, 0, 165, 39, 133, 0, 201, 42, 133, 0, 109, 41, 133, 0, 157, 34, - 133, 0, 49, 34, 133, 0, 165, 36, 133, 0, 225, 35, 133, 0, 177, 47, 133, - 0, 189, 44, 133, 0, 89, 20, 133, 0, 201, 19, 133, 0, 161, 28, 133, 0, - 69, 44, 133, 0, 169, 23, 133, 0, 177, 32, 133, 0, 49, 26, 133, 0, 253, - 23, 133, 0, 41, 29, 133, 0, 33, 20, 133, 0, 173, 33, 133, 0, 181, 48, - 133, 0, 69, 49, 133, 0, 53, 39, 133, 0, 209, 49, 133, 0, 197, 20, 133, - 0, 189, 45, 133, 0, 45, 35, 133, 0, 89, 35, 133, 0, 137, 20, 133, 0, - 77, 70, 133, 0, 101, 71, 133, 0, 37, 54, 133, 0, 81, 71, 133, 0, 61, - 70, 133, 0, 141, 60, 133, 0, 81, 74, 133, 0, 153, 74, 133, 0, 117, 71, - 133, 0, 29, 71, 133, 0, 85, 54, 133, 0, 93, 70, 133, 0, 213, 59, 133, - 0, 73, 73, 133, 0, 213, 58, 133, 0, 225, 57, 133, 0, 65, 57, 133, 0, - 229, 56, 133, 0, 9, 55, 133, 0, 69, 53, 133, 0, 201, 60, 133, 0, 117, - 75, 133, 0, 185, 69, 133, 0, 237, 72, 133, 0, 33, 70, 133, 0, 33, 58, - 133, 0, 169, 64, 133, 0, 1, 50, 133, 0, 245, 50, 133, 0, 253, 55, 133, - 0, 137, 78, 133, 0, 221, 80, 133, 0, 237, 80, 133, 0, 93, 87, 133, 0, - 9, 85, 133, 0, 73, 80, 133, 0, 93, 80, 133, 0, 209, 82, 133, 0, 245, - 82, 133, 0, 229, 78, 133, 0, 201, 85, 133, 0, 101, 86, 133, 0, 201, - 80, 133, 0, 9, 79, 133, 0, 199, 181, 1, 0, 157, 85, 133, 0, 13, 83, - 133, 0, 169, 76, 133, 0, 185, 87, 133, 0, 165, 87, 133, 0, 13, 81, 133, - 0, 253, 90, 133, 0, 213, 81, 133, 0, 169, 81, 133, 0, 177, 82, 133, - 0, 157, 83, 133, 0, 57, 85, 133, 0, 157, 78, 133, 0, 201, 87, 133, 0, - 109, 87, 133, 0, 149, 76, 133, 0, 9, 87, 133, 0, 141, 79, 133, 0, 255, - 181, 1, 0, 253, 89, 133, 0, 1, 77, 133, 0, 237, 89, 133, 0, 217, 89, - 133, 0, 25, 76, 133, 0, 117, 108, 133, 0, 129, 110, 133, 0, 81, 108, - 133, 0, 41, 92, 133, 0, 65, 110, 133, 0, 121, 94, 133, 0, 139, 6, 1, - 0, 173, 110, 133, 0, 181, 108, 133, 0, 109, 101, 133, 0, 29, 95, 133, - 0, 25, 107, 133, 0, 133, 121, 133, 0, 113, 115, 133, 0, 181, 142, 133, - 0, 225, 149, 133, 0, 1, 130, 133, 0, 81, 144, 133, 0, 45, 130, 133, - 0, 209, 144, 133, 0, 253, 144, 133, 0, 189, 146, 133, 0, 109, 143, 133, - 0, 205, 146, 133, 0, 85, 150, 133, 0, 197, 142, 133, 0, 133, 114, 133, - 0, 93, 141, 133, 0, 1, 131, 133, 0, 193, 145, 133, 0, 37, 112, 133, - 0, 13, 145, 133, 0, 193, 118, 133, 0, 105, 113, 133, 0, 65, 113, 133, - 0, 249, 127, 133, 0, 121, 112, 133, 0, 241, 147, 133, 0, 157, 149, 133, - 0, 245, 116, 133, 0, 73, 116, 133, 0, 109, 120, 133, 0, 189, 114, 133, - 0, 237, 138, 133, 0, 201, 140, 133, 0, 153, 145, 133, 0, 89, 125, 133, - 0, 189, 113, 133, 0, 117, 129, 133, 0, 13, 129, 133, 0, 169, 121, 133, - 0, 33, 119, 133, 0, 33, 147, 133, 0, 137, 146, 133, 0, 209, 148, 133, - 0, 149, 150, 133, 0, 101, 131, 133, 0, 217, 115, 133, 0, 101, 130, 133, - 0, 205, 182, 1, 0, 89, 117, 133, 0, 33, 118, 133, 0, 85, 111, 133, 0, - 109, 149, 133, 0, 229, 131, 133, 0, 41, 132, 133, 0, 173, 143, 133, - 0, 241, 110, 133, 0, 223, 32, 1, 0, 9, 17, 1, 0, 107, 29, 1, 0, 119, - 29, 1, 0, 125, 27, 1, 0, 165, 21, 1, 0, 109, 22, 1, 0, 21, 22, 1, 0, - 221, 21, 1, 0, 177, 21, 1, 0, 171, 21, 1, 0, 85, 35, 1, 0, 205, 31, - 1, 0, 205, 20, 1, 0, 37, 17, 1, 0, 21, 35, 1, 0, 29, 35, 1, 0, 129, - 20, 1, 0, 87, 17, 1, 0, 17, 30, 1, 0, 85, 17, 1, 0, 155, 37, 1, 0, 13, - 40, 1, 0, 7, 27, 1, 0, 149, 20, 1, 0, 167, 31, 1, 0, 163, 31, 1, 0, - 141, 31, 1, 0, 119, 27, 1, 0, 79, 17, 1, 0, 73, 17, 1, 0, 253, 34, 1, - 0, 93, 43, 1, 0, 199, 31, 1, 0, 245, 34, 1, 0, 13, 21, 1, 0, 45, 35, - 1, 0, 209, 32, 1, 0, 163, 23, 1, 0, 185, 22, 1, 0, 141, 28, 1, 0, 165, - 23, 1, 0, 109, 28, 1, 0, 115, 28, 1, 0, 51, 35, 1, 0, 21, 27, 1, 0, - 155, 25, 1, 0, 69, 23, 1, 0, 1, 27, 1, 0, 207, 31, 1, 0, 5, 194, 0, - 0, 65, 194, 0, 0, 125, 194, 0, 0, 169, 197, 0, 0, 193, 202, 0, 0, 9, - 13, 2, 0, 41, 203, 0, 0, 49, 203, 0, 0, 51, 209, 0, 0, 211, 206, 0, - 0, 207, 207, 0, 0, 71, 207, 0, 0, 137, 50, 0, 0, 209, 48, 0, 0, 161, - 48, 0, 0, 195, 48, 0, 0, 93, 48, 0, 0, 73, 48, 0, 0, 61, 8, 1, 0, 65, - 8, 1, 0, 235, 50, 0, 0, 59, 51, 0, 0, 45, 75, 0, 0, 93, 243, 0, 0, 89, - 58, 0, 0, 91, 243, 0, 0, 65, 86, 0, 0, 213, 115, 0, 0, 185, 125, 0, - 0, 161, 106, 0, 0, 41, 235, 0, 0, 85, 235, 0, 0, 219, 235, 0, 0, 173, - 236, 0, 0, 103, 235, 0, 0, 25, 162, 0, 0, 77, 243, 0, 0, 73, 243, 0, - 0, 61, 243, 0, 0, 67, 243, 0, 0, 107, 238, 0, 0, 85, 243, 0, 0, 83, - 243, 0, 0, 87, 243, 0, 0, 89, 243, 0, 0, 59, 243, 0, 0, 65, 243, 0, - 0, 71, 243, 0, 0, 79, 243, 0, 0, 67, 176, 0, 0, 47, 176, 0, 0, 53, 176, - 0, 0, 57, 176, 0, 0, 77, 176, 0, 0, 93, 8, 1, 0, 99, 8, 1, 0, 117, 8, - 1, 0, 111, 8, 1, 0, 115, 8, 1, 0, 97, 8, 1, 0, 121, 8, 1, 0, 123, 8, - 1, 0, 119, 8, 1, 0, 105, 8, 1, 0, 103, 8, 1, 0, 107, 8, 1, 0, 145, 239, - 0, 0, 67, 8, 1, 0, 71, 8, 1, 0, 73, 8, 1, 0, 77, 8, 1, 0, 79, 8, 1, - 0, 81, 8, 1, 0, 83, 8, 1, 0, 85, 8, 1, 0, 89, 8, 1, 0, 119, 243, 0, - 0, 115, 243, 0, 0, 107, 243, 0, 0, 121, 243, 0, 0, 105, 243, 0, 0, 97, - 243, 0, 0, 111, 243, 0, 0, 95, 243, 0, 0, 99, 243, 0, 0, 117, 243, 0, - 0, 151, 239, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 31, 0, 0, 0, 80, 0, 0, 0, - 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 86, 184, - 1, 0, 10, 7, 8, 0, 165, 19, 2, 0, 81, 251, 128, 0, 195, 48, 0, 0, 201, - 47, 0, 0, 0, 0, 0, 0, 209, 249, 128, 0, 0, 0, 0, 0, 41, 251, 128, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 156, 24, 0, 64, 150, 0, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 170, 170, 3, 0, 64, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 233, 247, 79, - 177, 241, 0, 11, 4, 70, 21, 70, 154, 70, 74, 219, 67, 138, 129, 138, - 90, 68, 75, 67, 154, 66, 68, 218, 128, 104, 8, 240, 75, 219, 0, 33, - 1, 144, 160, 104, 8, 240, 24, 221, 67, 105, 6, 70, 67, 240, 0, 67, 67, - 97, 0, 39, 29, 224, 26, 248, 1, 155, 79, 240, 8, 8, 1, 224, 175, 66, - 24, 208, 25, 240, 1, 15, 13, 208, 32, 70, 49, 70, 7, 235, 11, 2, 254, - 243, 5, 247, 48, 177, 115, 105, 79, 240, 255, 48, 35, 240, 0, 67, 115, - 97, 31, 224, 1, 55, 184, 241, 1, 8, 79, 234, 89, 9, 230, 209, 175, 66, - 223, 219, 115, 105, 160, 104, 35, 240, 0, 67, 115, 97, 0, 33, 8, 240, - 89, 220, 160, 104, 1, 33, 8, 240, 85, 220, 32, 70, 49, 70, 254, 243, - 255, 242, 160, 104, 1, 153, 8, 240, 221, 220, 0, 32, 1, 224, 111, 240, - 28, 0, 189, 232, 254, 143, 45, 233, 240, 65, 30, 70, 5, 70, 136, 70, - 23, 70, 30, 240, 67, 250, 67, 104, 65, 70, 156, 105, 40, 70, 58, 70, - 51, 70, 160, 71, 189, 232, 240, 129, 64, 124, 112, 71, 19, 181, 0, 240, - 153, 216, 120, 177, 0, 36, 9, 224, 0, 34, 1, 169, 255, 243, 82, 247, - 1, 152, 3, 120, 44, 43, 8, 191, 1, 48, 1, 52, 3, 120, 0, 43, 242, 209, - 0, 224, 4, 70, 32, 70, 28, 189, 56, 181, 176, 248, 66, 48, 5, 70, 179, - 177, 64, 242, 233, 52, 2, 224, 10, 32, 3, 240, 62, 223, 43, 107, 26, - 105, 2, 240, 112, 66, 178, 241, 0, 95, 5, 208, 178, 241, 64, 95, 2, - 208, 10, 177, 1, 60, 239, 209, 26, 104, 34, 240, 16, 2, 26, 96, 56, - 189, 112, 181, 144, 248, 120, 49, 4, 70, 255, 43, 28, 208, 14, 77, 64, - 106, 235, 110, 152, 71, 213, 248, 156, 80, 96, 106, 168, 71, 1, 40, - 11, 216, 148, 248, 20, 18, 65, 185, 11, 70, 32, 70, 8, 74, 3, 240, 64, - 222, 1, 35, 132, 248, 20, 50, 112, 189, 96, 106, 148, 248, 5, 97, 168, - 71, 48, 24, 132, 248, 6, 1, 112, 189, 224, 166, 133, 0, 61, 152, 128, - 0, 113, 177, 145, 248, 8, 50, 1, 43, 10, 208, 145, 248, 117, 49, 59, - 177, 75, 105, 26, 106, 3, 75, 19, 64, 19, 177, 8, 70, 12, 240, 124, - 191, 112, 71, 0, 191, 0, 252, 1, 1, 208, 248, 128, 17, 16, 181, 4, 70, - 153, 177, 2, 35, 192, 104, 212, 248, 132, 33, 8, 240, 39, 219, 7, 75, - 27, 104, 83, 185, 212, 248, 128, 17, 212, 248, 132, 33, 224, 104, 74, - 64, 2, 35, 189, 232, 16, 64, 8, 240, 25, 155, 16, 189, 144, 8, 2, 0, - 248, 181, 144, 248, 23, 50, 4, 70, 1, 43, 116, 208, 1, 35, 128, 248, - 23, 50, 0, 39, 66, 224, 160, 104, 49, 70, 0, 240, 165, 219, 212, 248, - 240, 48, 27, 104, 152, 66, 5, 217, 40, 70, 0, 33, 50, 70, 0, 240, 49, - 219, 65, 224, 32, 70, 255, 247, 139, 255, 53, 105, 0, 35, 171, 113, - 148, 248, 120, 49, 49, 70, 43, 114, 148, 248, 6, 49, 132, 248, 7, 49, - 107, 114, 212, 248, 252, 49, 96, 106, 1, 51, 196, 248, 252, 49, 106, - 121, 37, 75, 130, 240, 128, 2, 210, 9, 91, 106, 152, 71, 176, 185, 212, - 248, 248, 32, 107, 121, 122, 177, 24, 7, 13, 208, 105, 120, 43, 120, - 18, 105, 67, 234, 1, 35, 15, 51, 27, 9, 25, 10, 24, 191, 0, 35, 147, - 113, 148, 248, 120, 49, 19, 114, 196, 248, 248, 96, 1, 39, 212, 248, - 240, 48, 27, 104, 1, 43, 8, 217, 4, 241, 40, 5, 40, 70, 0, 33, 0, 240, - 115, 218, 6, 70, 0, 40, 174, 209, 0, 35, 132, 248, 23, 50, 196, 248, - 248, 48, 47, 177, 99, 105, 4, 34, 90, 100, 32, 70, 7, 240, 96, 223, - 227, 141, 212, 248, 200, 33, 147, 66, 4, 217, 32, 105, 189, 232, 248, - 64, 1, 240, 230, 157, 212, 248, 204, 33, 147, 66, 4, 210, 32, 105, 189, - 232, 248, 64, 1, 240, 207, 157, 248, 189, 224, 166, 133, 0, 17, 244, - 124, 79, 45, 233, 240, 65, 4, 70, 13, 70, 86, 78, 102, 208, 17, 244, - 128, 104, 14, 208, 243, 109, 64, 106, 152, 71, 51, 107, 7, 28, 96, 106, - 24, 191, 1, 39, 152, 71, 16, 241, 0, 8, 24, 191, 79, 240, 1, 8, 0, 224, - 71, 70, 42, 5, 12, 213, 243, 109, 96, 106, 152, 71, 51, 107, 0, 40, - 24, 191, 1, 39, 96, 106, 152, 71, 0, 40, 24, 191, 79, 240, 1, 8, 235, - 4, 12, 213, 243, 109, 96, 106, 152, 71, 51, 107, 0, 40, 24, 191, 1, - 39, 96, 106, 152, 71, 0, 40, 24, 191, 79, 240, 1, 8, 168, 4, 4, 213, - 212, 248, 56, 49, 1, 51, 196, 248, 56, 49, 105, 4, 9, 213, 212, 248, - 60, 49, 1, 39, 1, 51, 196, 248, 60, 49, 212, 248, 60, 49, 212, 248, - 56, 49, 42, 4, 16, 213, 212, 248, 64, 49, 212, 248, 244, 16, 1, 51, - 196, 248, 64, 49, 49, 177, 160, 104, 1, 34, 4, 240, 224, 216, 0, 35, - 196, 248, 244, 48, 79, 240, 1, 8, 31, 185, 184, 241, 0, 15, 3, 209, - 10, 224, 184, 241, 0, 15, 4, 208, 32, 70, 0, 33, 7, 240, 189, 221, 23, - 177, 32, 70, 7, 240, 7, 217, 235, 1, 2, 213, 32, 70, 12, 240, 106, 254, - 21, 244, 144, 63, 18, 209, 179, 111, 96, 106, 152, 71, 112, 185, 5, - 70, 45, 224, 32, 70, 7, 240, 8, 218, 212, 248, 216, 49, 1, 53, 157, - 66, 5, 211, 35, 106, 67, 244, 128, 51, 35, 98, 6, 224, 0, 37, 179, 110, - 96, 106, 152, 71, 1, 70, 0, 40, 235, 209, 212, 248, 12, 2, 32, 177, - 3, 120, 19, 177, 0, 33, 0, 240, 31, 216, 32, 70, 255, 247, 142, 254, - 148, 248, 7, 49, 148, 248, 6, 33, 154, 66, 8, 208, 148, 248, 5, 33, - 155, 26, 219, 178, 2, 43, 2, 216, 32, 70, 7, 240, 7, 217, 212, 248, - 216, 1, 133, 66, 52, 191, 0, 32, 1, 32, 189, 232, 240, 129, 0, 191, - 224, 166, 133, 0, 45, 233, 240, 65, 4, 70, 13, 70, 22, 70, 152, 70, - 64, 242, 233, 55, 2, 224, 10, 32, 3, 240, 148, 221, 99, 105, 26, 109, - 0, 42, 4, 218, 1, 63, 246, 209, 56, 70, 189, 232, 240, 129, 6, 154, - 70, 68, 54, 2, 178, 241, 128, 127, 70, 240, 0, 70, 3, 209, 42, 120, - 66, 240, 128, 114, 182, 24, 30, 101, 64, 242, 233, 54, 2, 224, 10, 32, - 3, 240, 120, 221, 99, 105, 27, 109, 0, 43, 3, 219, 43, 112, 1, 32, 189, - 232, 240, 129, 1, 62, 242, 209, 48, 70, 189, 232, 240, 129, 208, 248, - 148, 49, 16, 181, 153, 66, 4, 70, 3, 216, 12, 240, 235, 253, 224, 141, - 16, 189, 0, 32, 16, 189, 0, 35, 194, 107, 10, 177, 1, 58, 194, 99, 1, - 51, 219, 178, 16, 48, 16, 43, 246, 209, 112, 71, 3, 104, 45, 233, 247, - 79, 1, 42, 20, 191, 79, 240, 42, 8, 79, 240, 50, 8, 5, 70, 14, 70, 88, - 104, 65, 70, 145, 70, 4, 240, 88, 216, 7, 70, 72, 185, 43, 104, 79, - 240, 255, 48, 27, 104, 211, 248, 140, 48, 26, 109, 1, 50, 26, 101, 100, - 224, 6, 241, 14, 11, 89, 70, 4, 105, 4, 34, 1, 168, 255, 243, 64, 241, - 1, 154, 74, 246, 254, 19, 18, 186, 179, 235, 18, 79, 12, 191, 44, 73, - 6, 241, 8, 1, 32, 70, 6, 34, 5, 241, 40, 10, 255, 243, 48, 241, 160, - 29, 81, 70, 6, 34, 255, 243, 43, 241, 185, 241, 0, 15, 14, 208, 0, 35, - 35, 115, 132, 248, 13, 128, 4, 241, 14, 0, 33, 73, 6, 34, 255, 243, - 30, 241, 8, 35, 35, 117, 6, 35, 99, 117, 3, 224, 8, 35, 35, 115, 6, - 35, 99, 115, 168, 241, 28, 8, 68, 68, 49, 70, 6, 34, 32, 70, 255, 243, - 13, 241, 0, 35, 163, 113, 2, 35, 227, 113, 81, 70, 6, 34, 4, 241, 8, - 0, 255, 243, 3, 241, 6, 241, 24, 1, 4, 34, 4, 241, 14, 0, 255, 243, - 252, 240, 6, 241, 8, 1, 6, 34, 4, 241, 18, 0, 255, 243, 245, 240, 89, - 70, 4, 34, 4, 241, 24, 0, 255, 243, 239, 240, 213, 248, 92, 49, 40, - 104, 1, 51, 197, 248, 92, 49, 57, 70, 213, 248, 104, 33, 37, 240, 250, - 217, 1, 32, 189, 232, 254, 143, 0, 191, 44, 158, 133, 0, 20, 210, 133, - 0, 16, 181, 3, 104, 211, 248, 0, 72, 27, 104, 147, 248, 171, 48, 107, - 177, 255, 247, 99, 255, 8, 224, 161, 104, 41, 177, 1, 32, 0, 240, 128, - 250, 8, 177, 255, 247, 90, 255, 36, 104, 0, 44, 244, 209, 0, 32, 16, - 189, 248, 181, 6, 104, 5, 70, 15, 70, 112, 104, 79, 244, 188, 113, 3, - 240, 103, 223, 4, 70, 136, 177, 0, 33, 79, 244, 188, 114, 255, 243, - 24, 241, 213, 248, 96, 49, 38, 96, 196, 248, 96, 49, 149, 248, 100, - 49, 196, 248, 104, 113, 132, 248, 100, 49, 107, 104, 99, 96, 32, 70, - 248, 189, 1, 70, 40, 177, 3, 104, 79, 244, 188, 114, 88, 104, 3, 240, - 89, 159, 112, 71, 248, 181, 195, 104, 5, 70, 14, 70, 88, 104, 56, 33, - 23, 70, 3, 240, 63, 223, 4, 70, 0, 40, 43, 208, 0, 33, 56, 34, 255, - 243, 240, 240, 1, 35, 49, 70, 35, 96, 99, 96, 163, 96, 6, 34, 4, 241, - 12, 0, 255, 243, 130, 240, 115, 142, 6, 241, 9, 1, 163, 116, 51, 122, - 4, 241, 20, 0, 227, 116, 50, 122, 255, 243, 119, 240, 118, 141, 40, - 70, 166, 134, 231, 134, 33, 70, 56, 34, 33, 35, 11, 240, 130, 221, 80, - 177, 235, 104, 33, 70, 88, 104, 56, 34, 3, 240, 35, 223, 79, 240, 255, - 48, 248, 189, 111, 240, 26, 0, 248, 189, 0, 0, 112, 181, 13, 70, 3, - 128, 25, 70, 144, 248, 207, 48, 144, 176, 20, 70, 23, 78, 79, 240, 255, - 50, 0, 149, 123, 185, 2, 146, 3, 146, 4, 146, 5, 146, 12, 34, 1, 147, - 6, 147, 7, 147, 8, 147, 9, 147, 10, 150, 11, 144, 12, 146, 13, 147, - 14, 147, 18, 224, 91, 178, 0, 37, 2, 146, 3, 146, 4, 146, 5, 146, 7, - 147, 0, 241, 208, 2, 12, 35, 1, 149, 6, 146, 8, 149, 9, 149, 10, 150, - 11, 144, 12, 147, 13, 149, 14, 149, 4, 74, 35, 70, 192, 104, 35, 240, - 235, 223, 16, 176, 112, 189, 0, 191, 101, 242, 0, 0, 44, 158, 133, 0, - 31, 181, 131, 109, 4, 70, 1, 43, 22, 209, 176, 248, 88, 49, 219, 7, - 18, 212, 195, 104, 147, 248, 112, 50, 115, 185, 2, 170, 3, 169, 1, 171, - 12, 240, 67, 249, 2, 154, 58, 177, 32, 70, 3, 153, 1, 155, 255, 247, - 171, 255, 8, 185, 2, 35, 163, 101, 31, 189, 8, 181, 176, 248, 88, 33, - 105, 177, 66, 240, 1, 2, 160, 248, 88, 33, 130, 109, 2, 42, 18, 209, - 195, 104, 12, 33, 211, 248, 104, 1, 81, 240, 18, 219, 11, 224, 209, - 7, 9, 213, 34, 240, 1, 2, 160, 248, 88, 33, 130, 109, 26, 177, 1, 34, - 130, 101, 255, 247, 197, 255, 0, 32, 8, 189, 112, 71, 16, 181, 12, 70, - 65, 177, 139, 104, 35, 185, 192, 111, 9, 104, 255, 247, 25, 255, 160, - 96, 160, 104, 16, 189, 192, 111, 16, 189, 248, 181, 140, 105, 11, 70, - 33, 105, 139, 66, 3, 208, 221, 106, 21, 177, 47, 104, 1, 224, 0, 37, - 47, 70, 99, 104, 17, 70, 216, 104, 3, 240, 185, 222, 163, 104, 6, 70, - 27, 104, 147, 248, 149, 48, 27, 177, 195, 138, 67, 240, 128, 3, 195, - 130, 99, 104, 147, 248, 171, 48, 139, 177, 32, 70, 41, 70, 255, 247, - 207, 255, 96, 177, 49, 70, 10, 240, 189, 216, 2, 40, 7, 209, 99, 104, - 49, 70, 216, 104, 1, 34, 3, 240, 125, 222, 1, 32, 248, 189, 160, 104, - 49, 70, 58, 70, 37, 240, 184, 216, 0, 48, 24, 191, 1, 32, 248, 189, - 8, 181, 128, 104, 0, 240, 98, 252, 0, 32, 8, 189, 16, 181, 4, 70, 255, - 247, 246, 255, 160, 104, 189, 232, 16, 64, 3, 240, 193, 187, 0, 0, 56, - 181, 5, 70, 107, 104, 128, 104, 27, 126, 179, 185, 2, 240, 109, 249, - 4, 70, 32, 185, 213, 248, 128, 0, 10, 240, 51, 250, 4, 70, 9, 240, 103, - 252, 107, 104, 211, 248, 156, 16, 65, 177, 11, 120, 51, 177, 4, 75, - 0, 34, 24, 104, 255, 243, 202, 245, 0, 224, 0, 36, 32, 70, 56, 189, - 16, 9, 2, 0, 16, 181, 67, 104, 4, 70, 27, 126, 83, 177, 208, 248, 128, - 0, 10, 240, 43, 250, 160, 104, 5, 240, 25, 251, 99, 104, 0, 34, 131, - 248, 32, 32, 16, 189, 8, 181, 128, 105, 255, 247, 235, 255, 0, 32, 8, - 189, 0, 0, 31, 181, 8, 74, 3, 70, 0, 146, 7, 74, 8, 70, 1, 146, 7, 74, - 7, 73, 210, 105, 2, 146, 26, 104, 6, 75, 255, 243, 21, 242, 5, 176, - 0, 189, 0, 191, 231, 187, 1, 0, 172, 187, 1, 0, 236, 8, 2, 0, 184, 187, - 1, 0, 219, 187, 1, 0, 45, 233, 248, 67, 4, 70, 8, 70, 21, 70, 13, 240, - 249, 249, 1, 70, 16, 185, 212, 248, 16, 144, 1, 224, 208, 248, 4, 144, - 162, 104, 217, 248, 36, 112, 18, 104, 43, 105, 146, 248, 149, 32, 26, - 177, 238, 138, 198, 243, 192, 38, 9, 224, 30, 123, 91, 123, 67, 234, - 6, 38, 72, 246, 108, 3, 243, 26, 94, 66, 70, 235, 3, 6, 214, 185, 99, - 104, 147, 248, 171, 48, 203, 177, 32, 70, 255, 247, 38, 255, 168, 177, - 41, 70, 9, 240, 6, 223, 4, 40, 1, 208, 1, 40, 4, 209, 99, 104, 41, 70, - 216, 104, 0, 34, 76, 224, 160, 241, 5, 12, 220, 241, 0, 8, 72, 235, - 12, 8, 3, 224, 79, 240, 0, 8, 0, 224, 176, 70, 99, 104, 147, 248, 149, - 48, 27, 177, 22, 185, 171, 138, 45, 51, 171, 130, 0, 47, 51, 208, 6, - 187, 251, 105, 216, 7, 11, 213, 99, 125, 75, 177, 32, 70, 41, 70, 12, - 240, 242, 219, 32, 185, 99, 104, 41, 70, 216, 104, 50, 70, 39, 224, - 184, 241, 0, 15, 14, 209, 99, 104, 147, 248, 150, 48, 83, 177, 212, - 248, 132, 0, 41, 70, 13, 240, 199, 248, 32, 185, 99, 104, 41, 70, 216, - 104, 66, 70, 21, 224, 99, 104, 41, 70, 216, 104, 3, 240, 241, 221, 59, - 105, 4, 70, 219, 104, 72, 70, 57, 70, 34, 70, 152, 71, 96, 177, 32, - 70, 189, 232, 248, 67, 3, 240, 32, 157, 99, 104, 41, 70, 216, 104, 58, - 70, 189, 232, 248, 67, 3, 240, 130, 157, 189, 232, 248, 131, 74, 106, - 8, 181, 66, 244, 128, 18, 145, 248, 67, 48, 74, 98, 208, 248, 136, 32, - 3, 240, 7, 3, 211, 24, 147, 248, 128, 32, 1, 50, 131, 248, 128, 32, - 208, 248, 136, 48, 1, 34, 131, 248, 134, 32, 208, 248, 136, 48, 147, - 248, 129, 16, 147, 248, 123, 32, 145, 66, 17, 210, 147, 248, 128, 16, - 147, 248, 122, 32, 145, 66, 11, 210, 147, 248, 130, 16, 147, 248, 124, - 32, 145, 66, 5, 210, 147, 248, 131, 32, 147, 248, 125, 48, 154, 66, - 1, 211, 13, 240, 52, 216, 0, 32, 8, 189, 115, 181, 20, 70, 5, 70, 17, - 70, 64, 111, 255, 247, 138, 254, 99, 104, 17, 43, 8, 208, 18, 43, 1, - 208, 16, 43, 28, 209, 163, 120, 3, 240, 1, 3, 43, 117, 23, 224, 2, 170, - 0, 35, 66, 248, 4, 61, 168, 104, 148, 248, 47, 16, 59, 240, 222, 223, - 6, 70, 96, 177, 131, 121, 35, 185, 97, 136, 193, 243, 128, 1, 38, 240, - 151, 223, 179, 121, 27, 177, 168, 104, 49, 70, 11, 240, 150, 253, 124, - 189, 1, 40, 12, 191, 136, 104, 0, 32, 112, 71, 100, 41, 17, 220, 99, - 41, 30, 218, 74, 41, 28, 208, 6, 220, 7, 41, 28, 219, 8, 41, 23, 221, - 60, 41, 24, 209, 20, 224, 80, 41, 18, 208, 20, 219, 92, 57, 3, 41, 13, - 224, 195, 41, 4, 220, 194, 41, 10, 218, 168, 57, 2, 41, 6, 224, 177, - 245, 132, 127, 4, 208, 6, 219, 161, 245, 137, 113, 1, 41, 2, 216, 111, - 240, 22, 0, 112, 71, 0, 32, 112, 71, 200, 136, 16, 240, 8, 0, 24, 191, - 111, 240, 22, 0, 112, 71, 79, 240, 255, 51, 16, 181, 160, 248, 60, 50, - 4, 70, 0, 245, 14, 112, 6, 48, 0, 33, 12, 34, 254, 243, 111, 246, 35, - 104, 91, 107, 35, 185, 79, 240, 255, 51, 164, 248, 64, 50, 11, 224, - 15, 35, 164, 248, 62, 50, 240, 35, 164, 248, 64, 50, 79, 244, 112, 99, - 164, 248, 66, 50, 79, 242, 0, 3, 164, 248, 68, 50, 16, 189, 45, 233, - 240, 79, 135, 176, 23, 70, 3, 147, 210, 248, 16, 128, 105, 75, 82, 104, - 221, 248, 64, 160, 19, 64, 131, 70, 13, 70, 14, 105, 0, 43, 20, 191, - 79, 240, 12, 9, 79, 240, 10, 9, 186, 241, 0, 15, 4, 208, 154, 249, 14, - 48, 153, 68, 31, 250, 137, 249, 171, 138, 201, 235, 6, 4, 75, 68, 171, - 130, 74, 70, 44, 97, 32, 70, 0, 33, 254, 243, 48, 246, 18, 155, 9, 241, - 14, 9, 163, 248, 0, 144, 152, 248, 6, 48, 251, 177, 49, 70, 6, 34, 32, - 29, 254, 243, 191, 245, 4, 241, 10, 0, 8, 241, 188, 1, 6, 34, 254, 243, - 184, 245, 186, 241, 0, 15, 4, 209, 122, 104, 76, 75, 19, 64, 0, 43, - 63, 208, 177, 29, 6, 34, 4, 168, 254, 243, 171, 245, 4, 241, 16, 0, - 4, 169, 6, 34, 254, 243, 165, 245, 51, 224, 152, 248, 18, 48, 32, 29, - 227, 177, 216, 248, 204, 48, 27, 6, 24, 212, 8, 241, 188, 1, 6, 34, - 254, 243, 151, 245, 49, 70, 6, 34, 4, 168, 254, 243, 146, 245, 177, - 29, 6, 34, 4, 241, 10, 0, 254, 243, 140, 245, 4, 241, 16, 0, 4, 169, - 6, 34, 254, 243, 134, 245, 79, 244, 128, 118, 20, 224, 49, 70, 6, 34, - 254, 243, 127, 245, 177, 29, 6, 34, 4, 241, 10, 0, 254, 243, 121, 245, - 4, 241, 16, 0, 8, 241, 188, 1, 6, 34, 254, 243, 114, 245, 0, 38, 1, - 224, 79, 244, 0, 118, 122, 104, 41, 75, 19, 64, 83, 179, 157, 248, 68, - 48, 105, 106, 3, 240, 7, 3, 72, 5, 173, 248, 22, 48, 15, 212, 155, 248, - 248, 33, 1, 42, 5, 209, 65, 244, 128, 33, 105, 98, 67, 240, 32, 3, 3, - 224, 82, 1, 2, 240, 96, 2, 19, 67, 173, 248, 22, 48, 107, 106, 89, 6, - 5, 213, 189, 248, 22, 48, 67, 240, 128, 3, 173, 248, 22, 48, 4, 241, - 24, 0, 13, 241, 22, 1, 2, 34, 254, 243, 65, 245, 70, 240, 128, 6, 186, - 241, 0, 15, 15, 208, 122, 104, 16, 75, 19, 64, 19, 185, 4, 241, 24, - 3, 1, 224, 4, 241, 26, 3, 1, 34, 0, 146, 88, 70, 65, 70, 82, 70, 68, - 240, 242, 218, 3, 155, 70, 240, 8, 6, 19, 177, 70, 244, 128, 102, 182, - 178, 186, 241, 0, 15, 1, 208, 70, 244, 128, 70, 38, 128, 32, 70, 7, - 176, 189, 232, 240, 143, 0, 191, 64, 0, 1, 128, 56, 181, 4, 70, 212, - 248, 116, 21, 128, 104, 12, 240, 131, 216, 212, 248, 248, 22, 208, 241, - 1, 5, 160, 104, 56, 191, 0, 37, 12, 240, 122, 216, 0, 185, 1, 53, 160, - 104, 212, 248, 252, 22, 12, 240, 115, 216, 0, 185, 1, 53, 212, 248, - 224, 54, 160, 104, 25, 106, 12, 240, 107, 216, 0, 185, 1, 53, 212, 248, - 224, 54, 0, 34, 218, 96, 160, 104, 212, 248, 60, 21, 12, 240, 96, 216, - 0, 185, 1, 53, 160, 104, 212, 248, 148, 23, 12, 240, 89, 216, 0, 185, - 1, 53, 40, 70, 56, 189, 208, 248, 64, 53, 112, 181, 92, 142, 5, 70, - 4, 244, 64, 99, 179, 245, 64, 111, 33, 209, 3, 104, 147, 248, 70, 48, - 154, 7, 11, 208, 4, 244, 112, 65, 161, 245, 128, 83, 89, 66, 65, 235, - 3, 1, 208, 248, 92, 1, 66, 240, 103, 222, 128, 185, 32, 70, 255, 243, - 27, 246, 64, 244, 48, 96, 134, 178, 32, 70, 255, 243, 21, 246, 14, 40, - 140, 191, 79, 244, 128, 80, 79, 244, 0, 80, 70, 234, 0, 4, 4, 244, 112, - 66, 43, 107, 162, 245, 128, 92, 220, 241, 0, 2, 91, 104, 66, 235, 12, - 2, 154, 66, 5, 208, 213, 248, 92, 1, 1, 33, 66, 240, 104, 217, 4, 70, - 213, 248, 92, 1, 33, 70, 66, 240, 178, 222, 152, 185, 4, 244, 112, 68, - 164, 245, 128, 94, 222, 241, 0, 4, 68, 235, 14, 4, 14, 52, 85, 248, - 36, 48, 46, 107, 213, 248, 92, 1, 43, 99, 1, 33, 66, 240, 79, 217, 46, - 99, 4, 70, 32, 70, 112, 189, 7, 42, 1, 221, 74, 104, 10, 185, 2, 107, - 18, 104, 3, 42, 6, 208, 81, 30, 1, 41, 13, 216, 1, 107, 9, 104, 138, - 66, 9, 209, 157, 248, 0, 16, 17, 177, 144, 248, 41, 16, 49, 177, 67, - 177, 26, 96, 0, 32, 112, 71, 111, 240, 12, 0, 112, 71, 111, 240, 10, - 0, 112, 71, 24, 70, 112, 71, 45, 233, 240, 79, 137, 176, 0, 35, 15, - 70, 23, 153, 5, 70, 5, 146, 20, 156, 21, 158, 6, 147, 7, 147, 221, 248, - 72, 176, 221, 248, 76, 160, 59, 240, 148, 222, 5, 153, 4, 144, 1, 240, - 1, 8, 40, 104, 57, 70, 34, 70, 51, 70, 205, 248, 0, 128, 31, 240, 242, - 221, 129, 70, 0, 40, 64, 240, 220, 128, 183, 249, 6, 48, 0, 43, 27, - 218, 185, 136, 58, 137, 184, 241, 0, 15, 9, 208, 22, 155, 73, 0, 3, - 147, 0, 150, 1, 148, 2, 150, 40, 105, 1, 49, 35, 70, 8, 224, 22, 155, - 40, 105, 3, 147, 205, 248, 0, 160, 1, 148, 2, 150, 73, 0, 91, 70, 57, - 240, 28, 218, 129, 70, 187, 224, 186, 241, 3, 15, 13, 217, 4, 34, 6, - 168, 89, 70, 254, 243, 30, 244, 186, 241, 7, 15, 5, 217, 7, 168, 11, - 241, 4, 1, 4, 34, 254, 243, 21, 244, 5, 153, 6, 155, 138, 30, 31, 42, - 0, 242, 157, 128, 223, 232, 18, 240, 32, 0, 34, 0, 36, 0, 40, 0, 44, - 0, 46, 0, 54, 0, 56, 0, 74, 0, 76, 0, 81, 0, 83, 0, 85, 0, 87, 0, 89, - 0, 91, 0, 93, 0, 155, 0, 155, 0, 155, 0, 99, 0, 101, 0, 118, 0, 120, - 0, 124, 0, 126, 0, 131, 0, 133, 0, 138, 0, 155, 0, 149, 0, 140, 0, 67, - 75, 2, 224, 66, 74, 99, 224, 66, 75, 27, 104, 35, 96, 122, 224, 0, 43, - 115, 220, 63, 74, 4, 224, 63, 75, 246, 231, 0, 43, 109, 219, 61, 74, - 19, 96, 61, 75, 0, 34, 26, 96, 108, 224, 60, 75, 236, 231, 27, 177, - 59, 74, 18, 104, 0, 42, 96, 208, 56, 74, 19, 96, 57, 74, 0, 35, 19, - 96, 57, 74, 19, 96, 57, 74, 19, 96, 79, 240, 255, 50, 56, 75, 233, 231, - 51, 75, 216, 231, 50, 74, 17, 104, 0, 41, 55, 220, 76, 224, 52, 75, - 209, 231, 51, 74, 50, 224, 51, 75, 205, 231, 50, 74, 46, 224, 44, 75, - 201, 231, 43, 74, 42, 224, 213, 248, 108, 50, 211, 248, 216, 50, 155, - 104, 194, 231, 45, 75, 191, 231, 44, 74, 19, 96, 0, 43, 57, 208, 43, - 74, 0, 35, 43, 73, 19, 96, 79, 240, 255, 50, 10, 96, 42, 73, 10, 96, - 42, 74, 19, 96, 42, 74, 17, 224, 42, 75, 172, 231, 0, 43, 35, 221, 40, - 74, 11, 224, 40, 75, 166, 231, 90, 30, 9, 42, 28, 216, 37, 74, 4, 224, - 37, 75, 159, 231, 0, 43, 22, 221, 35, 74, 19, 96, 24, 224, 35, 75, 152, - 231, 4, 153, 138, 121, 138, 185, 0, 51, 33, 74, 24, 191, 1, 35, 19, - 112, 13, 224, 4, 154, 147, 121, 67, 185, 29, 75, 27, 120, 138, 231, - 111, 240, 22, 9, 4, 224, 111, 240, 28, 9, 1, 224, 111, 240, 6, 9, 72, - 70, 9, 176, 189, 232, 240, 143, 208, 8, 2, 0, 180, 8, 2, 0, 196, 8, - 2, 0, 152, 8, 2, 0, 164, 8, 2, 0, 28, 255, 1, 0, 188, 8, 2, 0, 184, - 8, 2, 0, 176, 8, 2, 0, 156, 8, 2, 0, 8, 255, 1, 0, 32, 255, 1, 0, 160, - 8, 2, 0, 200, 8, 2, 0, 4, 255, 1, 0, 16, 255, 1, 0, 172, 8, 2, 0, 192, - 8, 2, 0, 12, 255, 1, 0, 24, 255, 1, 0, 0, 255, 1, 0, 168, 8, 2, 0, 148, - 8, 2, 0, 56, 181, 0, 37, 4, 70, 128, 248, 232, 81, 38, 240, 19, 216, - 227, 106, 41, 70, 152, 106, 128, 34, 254, 243, 143, 243, 32, 105, 6, - 240, 222, 252, 212, 248, 64, 1, 43, 240, 250, 222, 196, 248, 136, 86, - 56, 189, 0, 0, 45, 233, 248, 67, 152, 70, 83, 106, 14, 70, 153, 5, 4, - 70, 21, 70, 157, 249, 32, 144, 23, 105, 9, 213, 19, 107, 167, 248, 66, - 48, 27, 12, 167, 248, 68, 48, 59, 136, 67, 244, 0, 83, 59, 128, 34, - 104, 107, 107, 146, 248, 68, 32, 154, 177, 226, 106, 2, 235, 70, 2, - 178, 249, 28, 32, 106, 185, 99, 177, 26, 105, 210, 248, 212, 34, 146, - 248, 157, 32, 3, 42, 5, 217, 212, 248, 100, 1, 49, 70, 42, 70, 62, 240, - 247, 220, 4, 46, 29, 209, 35, 104, 183, 248, 76, 112, 147, 248, 56, - 48, 58, 70, 195, 177, 40, 70, 19, 240, 123, 216, 4, 235, 128, 0, 208, - 248, 76, 50, 211, 248, 88, 37, 163, 248, 200, 112, 1, 50, 195, 248, - 88, 37, 211, 248, 96, 53, 217, 105, 138, 66, 136, 191, 218, 97, 26, - 106, 1, 50, 26, 98, 79, 246, 255, 114, 184, 241, 0, 15, 7, 208, 227, - 106, 6, 241, 12, 1, 3, 235, 65, 3, 153, 136, 73, 68, 153, 128, 79, 246, - 255, 115, 154, 66, 3, 208, 32, 105, 168, 33, 58, 240, 42, 217, 35, 105, - 41, 70, 3, 235, 134, 3, 216, 104, 13, 75, 66, 70, 91, 106, 152, 71, - 0, 40, 18, 218, 11, 72, 11, 240, 92, 255, 10, 75, 26, 104, 1, 50, 26, - 96, 184, 241, 0, 15, 8, 208, 227, 106, 12, 54, 3, 235, 70, 6, 179, 136, - 201, 235, 3, 9, 166, 248, 4, 144, 189, 232, 248, 131, 224, 166, 133, - 0, 188, 86, 134, 0, 204, 8, 2, 0, 25, 177, 64, 104, 48, 34, 3, 240, - 77, 153, 112, 71, 45, 233, 240, 79, 14, 70, 4, 70, 17, 105, 210, 248, - 124, 1, 159, 176, 214, 248, 16, 176, 19, 147, 7, 144, 12, 145, 145, - 70, 187, 248, 0, 32, 96, 104, 2, 240, 12, 3, 155, 8, 2, 43, 15, 147, - 12, 191, 194, 243, 192, 19, 0, 35, 219, 178, 49, 70, 44, 159, 221, 248, - 180, 128, 14, 146, 20, 147, 255, 243, 187, 243, 4, 48, 10, 144, 135, - 177, 59, 122, 11, 43, 8, 209, 148, 248, 240, 55, 83, 177, 148, 248, - 241, 55, 59, 177, 187, 121, 7, 43, 4, 216, 10, 152, 151, 249, 15, 48, - 192, 24, 10, 144, 212, 248, 136, 49, 0, 43, 25, 218, 223, 177, 59, 122, - 2, 43, 26, 209, 148, 248, 160, 36, 210, 185, 12, 153, 139, 109, 19, - 240, 8, 3, 22, 209, 186, 121, 41, 42, 21, 216, 3, 42, 19, 217, 11, 42, - 17, 216, 41, 154, 1, 42, 14, 209, 10, 155, 8, 51, 10, 147, 8, 224, 0, - 32, 8, 144, 8, 224, 8, 151, 6, 224, 0, 33, 8, 145, 3, 224, 0, 34, 8, - 146, 0, 224, 8, 147, 53, 105, 0, 33, 171, 31, 21, 147, 179, 138, 165, - 241, 118, 0, 118, 51, 179, 130, 112, 34, 48, 97, 18, 144, 254, 243, - 133, 242, 115, 106, 91, 5, 1, 213, 51, 141, 34, 224, 217, 248, 4, 32, - 148, 75, 19, 64, 187, 177, 14, 153, 1, 240, 252, 3, 136, 43, 18, 209, - 155, 248, 4, 48, 216, 7, 14, 212, 41, 152, 242, 138, 65, 30, 2, 240, - 7, 2, 40, 152, 92, 50, 9, 235, 66, 2, 136, 66, 211, 136, 8, 209, 89, - 28, 209, 128, 5, 224, 15, 153, 1, 41, 8, 209, 79, 240, 0, 10, 16, 224, - 15, 154, 79, 240, 0, 10, 1, 42, 3, 209, 10, 224, 79, 240, 16, 10, 0, - 35, 40, 152, 27, 1, 155, 178, 0, 240, 15, 2, 19, 67, 171, 248, 22, 48, - 42, 153, 4, 41, 7, 209, 32, 70, 12, 153, 18, 154, 14, 240, 36, 222, - 173, 248, 114, 0, 25, 224, 40, 152, 180, 248, 70, 53, 0, 240, 15, 2, - 41, 152, 66, 234, 3, 18, 65, 30, 40, 152, 146, 178, 136, 66, 2, 209, - 1, 51, 164, 248, 70, 53, 42, 153, 82, 1, 71, 246, 224, 115, 19, 64, - 1, 240, 7, 2, 19, 67, 173, 248, 114, 48, 153, 248, 223, 48, 35, 185, - 14, 154, 2, 240, 252, 3, 128, 43, 1, 209, 74, 240, 32, 10, 101, 75, - 8, 234, 3, 3, 35, 177, 205, 248, 108, 128, 205, 248, 104, 128, 14, 224, - 15, 155, 1, 43, 5, 217, 115, 106, 0, 43, 2, 219, 19, 240, 16, 3, 7, - 208, 153, 248, 72, 48, 3, 240, 127, 3, 27, 147, 26, 147, 0, 35, 56, - 224, 32, 107, 87, 73, 130, 108, 17, 64, 25, 177, 155, 248, 4, 16, 201, - 7, 8, 212, 155, 248, 4, 48, 19, 240, 1, 3, 233, 209, 66, 108, 80, 73, - 17, 64, 17, 177, 27, 146, 26, 146, 35, 224, 27, 171, 0, 147, 13, 241, - 118, 3, 1, 147, 13, 241, 119, 3, 2, 147, 29, 171, 3, 147, 73, 70, 13, - 241, 114, 2, 26, 171, 212, 248, 96, 1, 79, 240, 22, 216, 115, 106, 67, - 240, 0, 98, 114, 98, 189, 248, 116, 32, 209, 7, 4, 213, 67, 240, 0, - 99, 67, 244, 0, 83, 115, 98, 40, 152, 208, 241, 1, 3, 56, 191, 0, 35, - 34, 104, 212, 248, 96, 6, 146, 248, 70, 32, 144, 248, 10, 192, 18, 240, - 3, 2, 26, 153, 0, 240, 50, 129, 17, 240, 0, 111, 1, 240, 127, 2, 4, - 208, 7, 42, 8, 217, 32, 42, 43, 209, 5, 224, 223, 248, 196, 224, 30, - 249, 2, 32, 0, 42, 36, 218, 74, 0, 1, 212, 0, 41, 32, 219, 33, 244, - 64, 18, 34, 244, 96, 82, 9, 1, 26, 146, 22, 213, 129, 120, 1, 41, 19, - 217, 33, 107, 145, 249, 77, 16, 1, 41, 9, 208, 217, 248, 4, 224, 30, - 240, 128, 79, 9, 208, 1, 49, 7, 209, 1, 123, 73, 7, 4, 213, 66, 244, - 128, 18, 66, 244, 128, 82, 1, 224, 66, 234, 204, 34, 26, 146, 27, 153, - 17, 240, 0, 111, 1, 240, 127, 2, 4, 208, 7, 42, 6, 217, 32, 42, 51, - 209, 3, 224, 22, 72, 130, 86, 0, 42, 46, 218, 26, 154, 80, 0, 1, 212, - 0, 42, 41, 219, 33, 244, 64, 18, 34, 244, 96, 82, 9, 1, 27, 146, 31, - 213, 212, 248, 96, 22, 136, 120, 1, 40, 26, 217, 32, 107, 144, 249, - 77, 0, 1, 40, 9, 208, 217, 248, 4, 224, 30, 240, 128, 79, 16, 208, 1, - 48, 14, 209, 9, 123, 72, 7, 11, 213, 66, 244, 128, 18, 66, 244, 128, - 82, 8, 224, 0, 191, 64, 0, 1, 128, 127, 0, 0, 8, 64, 27, 134, 0, 66, - 234, 204, 34, 27, 146, 180, 248, 40, 38, 2, 244, 64, 98, 178, 245, 64, - 111, 45, 209, 34, 107, 16, 105, 5, 147, 13, 240, 247, 251, 26, 154, - 0, 244, 64, 112, 176, 245, 0, 127, 20, 191, 2, 32, 3, 32, 18, 240, 0, - 111, 5, 155, 2, 240, 127, 2, 13, 208, 32, 42, 41, 208, 148, 249, 202, - 36, 81, 28, 1, 208, 6, 144, 16, 224, 217, 248, 4, 32, 6, 144, 18, 3, - 33, 212, 36, 224, 158, 73, 6, 144, 138, 86, 0, 42, 180, 191, 148, 249, - 201, 36, 148, 249, 200, 36, 81, 28, 25, 208, 144, 178, 23, 224, 26, - 154, 2, 240, 127, 2, 32, 42, 4, 191, 79, 240, 0, 98, 26, 146, 27, 154, - 2, 240, 127, 2, 32, 42, 8, 209, 79, 240, 0, 98, 27, 146, 4, 224, 6, - 144, 5, 32, 3, 224, 4, 32, 1, 224, 2, 32, 6, 144, 221, 248, 108, 224, - 26, 154, 0, 2, 34, 244, 224, 98, 30, 240, 0, 111, 64, 234, 2, 2, 8, - 191, 6, 152, 46, 244, 224, 97, 20, 191, 1, 67, 65, 234, 0, 33, 18, 240, - 0, 111, 27, 145, 26, 146, 148, 248, 220, 17, 4, 208, 1, 41, 2, 209, - 66, 244, 0, 2, 2, 224, 17, 185, 34, 244, 0, 2, 26, 146, 27, 154, 148, - 248, 220, 17, 18, 240, 0, 111, 4, 208, 1, 41, 2, 209, 66, 244, 0, 2, - 2, 224, 17, 185, 34, 244, 0, 2, 27, 146, 73, 70, 32, 70, 5, 147, 17, - 240, 56, 223, 26, 154, 5, 155, 18, 240, 0, 97, 33, 208, 212, 248, 88, - 22, 145, 249, 5, 16, 2, 41, 13, 209, 2, 244, 224, 104, 79, 234, 24, - 40, 168, 241, 4, 8, 184, 241, 1, 15, 140, 191, 79, 240, 0, 8, 79, 240, - 1, 8, 1, 224, 79, 240, 0, 8, 17, 2, 12, 213, 2, 240, 127, 2, 7, 42, - 10, 217, 32, 42, 20, 191, 2, 70, 4, 34, 9, 146, 6, 224, 9, 145, 136, - 70, 3, 224, 9, 144, 1, 224, 4, 33, 9, 145, 27, 154, 18, 240, 0, 97, - 29, 208, 17, 2, 24, 213, 2, 240, 127, 2, 7, 42, 22, 217, 32, 42, 8, - 191, 4, 32, 16, 224, 27, 152, 33, 244, 224, 97, 32, 244, 224, 96, 64, - 244, 0, 112, 65, 244, 0, 113, 27, 144, 2, 32, 26, 145, 6, 144, 13, 146, - 9, 146, 144, 70, 3, 224, 13, 144, 1, 224, 4, 33, 13, 145, 139, 177, - 12, 154, 26, 153, 210, 248, 16, 51, 41, 152, 2, 235, 195, 2, 194, 248, - 20, 19, 193, 178, 194, 248, 24, 19, 1, 51, 12, 153, 3, 240, 63, 3, 193, - 248, 16, 51, 7, 154, 0, 42, 63, 208, 212, 248, 12, 224, 210, 248, 4, - 52, 7, 153, 222, 248, 128, 33, 3, 241, 64, 0, 1, 235, 192, 0, 222, 248, - 132, 193, 66, 96, 1, 235, 195, 2, 194, 248, 8, 194, 242, 138, 52, 73, - 2, 240, 7, 2, 138, 92, 2, 42, 20, 209, 7, 154, 65, 104, 210, 248, 0, - 224, 41, 152, 2, 235, 206, 2, 194, 248, 4, 17, 26, 153, 14, 241, 1, - 14, 81, 96, 193, 178, 145, 96, 7, 153, 194, 248, 8, 193, 14, 240, 31, - 2, 10, 96, 26, 153, 7, 152, 3, 241, 129, 2, 64, 248, 50, 16, 0, 235, - 195, 2, 41, 152, 1, 51, 193, 178, 194, 248, 12, 20, 7, 153, 3, 240, - 63, 3, 193, 248, 4, 52, 26, 155, 19, 240, 0, 110, 31, 208, 3, 244, 224, - 96, 79, 234, 16, 32, 19, 244, 0, 15, 26, 74, 3, 240, 127, 1, 160, 241, - 4, 0, 8, 208, 1, 40, 79, 240, 20, 0, 0, 251, 1, 34, 148, 191, 210, 104, - 146, 104, 12, 224, 1, 40, 79, 240, 20, 0, 3, 216, 0, 251, 1, 34, 82, - 104, 4, 224, 65, 67, 82, 88, 1, 224, 3, 240, 127, 2, 15, 152, 17, 146, - 2, 40, 0, 208, 168, 185, 180, 248, 56, 38, 10, 153, 145, 66, 3, 220, - 114, 106, 18, 240, 128, 98, 13, 208, 155, 248, 4, 32, 2, 240, 1, 2, - 130, 240, 1, 2, 6, 224, 64, 27, 134, 0, 196, 210, 133, 0, 132, 24, 134, - 0, 0, 34, 16, 146, 34, 107, 82, 125, 98, 177, 212, 248, 88, 22, 9, 120, - 65, 177, 190, 241, 0, 15, 5, 209, 148, 72, 3, 240, 127, 1, 65, 86, 0, - 41, 12, 219, 33, 104, 145, 248, 70, 16, 137, 7, 46, 208, 190, 241, 0, - 15, 43, 208, 212, 248, 88, 22, 145, 249, 5, 16, 49, 179, 41, 152, 1, - 40, 18, 217, 212, 248, 88, 54, 27, 120, 11, 177, 22, 35, 0, 224, 48, - 35, 27, 147, 115, 106, 6, 153, 35, 240, 0, 99, 115, 98, 27, 155, 67, - 234, 1, 35, 27, 147, 26, 147, 16, 224, 122, 177, 212, 248, 88, 38, 18, - 120, 90, 177, 190, 241, 0, 15, 8, 209, 124, 74, 3, 240, 127, 3, 211, - 86, 56, 234, 35, 8, 40, 191, 79, 240, 1, 8, 26, 153, 17, 240, 0, 99, - 21, 209, 1, 240, 127, 2, 22, 42, 17, 216, 116, 72, 144, 64, 14, 213, - 19, 152, 64, 177, 2, 42, 9, 208, 148, 249, 92, 38, 18, 241, 255, 50, - 24, 191, 1, 34, 0, 224, 19, 154, 9, 146, 0, 224, 9, 147, 27, 154, 18, - 240, 0, 110, 22, 209, 2, 240, 127, 2, 22, 42, 18, 216, 103, 72, 144, - 64, 15, 213, 19, 152, 64, 177, 2, 42, 9, 208, 148, 249, 92, 38, 18, - 241, 255, 50, 24, 191, 1, 34, 0, 224, 19, 154, 13, 146, 1, 224, 205, - 248, 52, 224, 15, 152, 217, 248, 4, 32, 2, 40, 8, 191, 201, 248, 96, - 17, 18, 244, 128, 50, 49, 208, 148, 248, 206, 33, 114, 179, 148, 248, - 209, 33, 90, 179, 212, 248, 88, 38, 146, 249, 5, 32, 3, 42, 39, 208, - 75, 185, 1, 240, 127, 2, 2, 42, 39, 208, 4, 42, 37, 208, 11, 42, 35, - 208, 22, 42, 33, 208, 155, 248, 4, 48, 19, 240, 1, 3, 25, 209, 14, 152, - 0, 240, 252, 2, 136, 42, 23, 209, 115, 106, 74, 244, 160, 74, 67, 244, - 128, 83, 115, 98, 187, 248, 24, 48, 1, 34, 35, 240, 96, 3, 27, 4, 27, - 12, 67, 240, 32, 3, 171, 248, 24, 48, 7, 146, 5, 224, 0, 35, 2, 224, - 0, 32, 7, 144, 0, 224, 7, 147, 32, 70, 10, 154, 21, 155, 25, 240, 40, - 218, 22, 171, 32, 70, 27, 153, 10, 154, 25, 240, 34, 218, 6, 34, 165, - 241, 64, 0, 22, 169, 253, 243, 172, 246, 27, 155, 24, 1, 12, 212, 3, - 240, 127, 3, 22, 43, 8, 216, 48, 74, 154, 64, 5, 213, 10, 153, 11, 10, - 5, 248, 60, 28, 5, 248, 59, 60, 115, 106, 89, 5, 16, 213, 26, 154, 18, - 1, 13, 213, 23, 177, 58, 122, 4, 42, 9, 209, 67, 244, 0, 99, 115, 98, - 16, 154, 148, 248, 195, 52, 0, 43, 24, 191, 1, 34, 16, 146, 26, 153, - 11, 1, 10, 212, 31, 74, 1, 240, 127, 3, 211, 86, 0, 43, 4, 218, 21, - 248, 6, 60, 3, 240, 15, 3, 1, 224, 21, 248, 6, 60, 14, 152, 11, 147, - 164, 40, 13, 208, 155, 248, 4, 48, 216, 7, 9, 212, 7, 154, 74, 185, - 9, 154, 43, 155, 32, 70, 15, 240, 123, 220, 171, 248, 2, 0, 19, 224, - 7, 155, 75, 177, 9, 154, 32, 70, 64, 246, 42, 19, 24, 240, 100, 223, - 128, 178, 2, 48, 171, 248, 2, 0, 14, 152, 164, 40, 4, 209, 187, 248, - 2, 48, 37, 248, 58, 60, 23, 224, 155, 248, 4, 48, 217, 7, 1, 212, 7, - 153, 73, 177, 0, 35, 5, 248, 58, 60, 5, 248, 57, 60, 11, 224, 64, 27, - 134, 0, 0, 2, 16, 40, 27, 153, 13, 154, 43, 155, 32, 70, 15, 240, 78, - 220, 37, 248, 58, 12, 115, 106, 154, 5, 7, 213, 50, 107, 74, 244, 0, - 90, 37, 248, 52, 44, 18, 12, 37, 248, 50, 44, 40, 154, 10, 185, 74, - 240, 8, 10, 155, 248, 4, 32, 208, 7, 15, 212, 217, 4, 13, 212, 148, - 248, 208, 33, 10, 177, 90, 6, 8, 212, 88, 5, 4, 212, 20, 152, 16, 177, - 148, 248, 248, 33, 10, 185, 74, 240, 1, 10, 15, 153, 2, 41, 17, 209, - 148, 248, 206, 33, 114, 177, 17, 154, 4, 42, 11, 217, 164, 74, 42, 152, - 18, 92, 4, 235, 66, 2, 178, 248, 254, 33, 10, 177, 89, 5, 1, 213, 74, - 244, 128, 90, 35, 107, 24, 105, 13, 240, 26, 249, 8, 153, 0, 244, 64, - 96, 176, 245, 64, 111, 8, 191, 74, 244, 128, 122, 9, 177, 74, 244, 0, - 74, 37, 248, 118, 172, 239, 177, 148, 248, 160, 52, 3, 187, 12, 152, - 130, 109, 18, 240, 8, 2, 23, 209, 59, 122, 11, 43, 8, 209, 148, 248, - 240, 55, 139, 177, 148, 248, 241, 55, 115, 177, 187, 121, 7, 43, 13, - 216, 187, 121, 41, 43, 12, 216, 151, 248, 12, 160, 10, 240, 7, 10, 74, - 234, 3, 26, 7, 224, 186, 70, 5, 224, 154, 70, 3, 224, 146, 70, 1, 224, - 79, 240, 0, 10, 115, 106, 13, 153, 154, 0, 68, 191, 74, 240, 8, 10, - 31, 250, 138, 250, 75, 30, 219, 178, 1, 43, 156, 191, 74, 244, 0, 90, - 31, 250, 138, 250, 165, 241, 114, 0, 89, 70, 2, 34, 253, 243, 180, 245, - 0, 35, 5, 248, 112, 60, 5, 248, 111, 60, 5, 248, 74, 60, 5, 248, 73, - 60, 0, 47, 67, 208, 148, 248, 160, 52, 0, 43, 63, 209, 12, 154, 147, - 109, 27, 7, 59, 212, 59, 122, 11, 43, 10, 209, 148, 248, 240, 39, 0, - 42, 52, 208, 148, 248, 241, 39, 0, 42, 48, 208, 186, 121, 7, 42, 45, - 216, 186, 121, 41, 42, 42, 216, 14, 152, 0, 244, 64, 114, 178, 245, - 64, 127, 20, 154, 20, 191, 11, 241, 24, 1, 11, 241, 30, 1, 2, 177, 2, - 49, 2, 43, 16, 209, 18, 155, 0, 32, 58, 24, 178, 248, 188, 32, 2, 48, - 154, 117, 194, 243, 7, 34, 218, 117, 2, 51, 10, 40, 244, 209, 165, 241, - 86, 0, 3, 34, 8, 224, 11, 43, 165, 241, 96, 0, 2, 209, 2, 49, 16, 34, - 1, 224, 151, 249, 14, 32, 253, 243, 101, 245, 11, 241, 4, 3, 25, 70, - 165, 241, 80, 0, 6, 34, 15, 147, 253, 243, 92, 245, 189, 248, 114, 48, - 37, 248, 42, 60, 0, 35, 5, 248, 40, 60, 5, 248, 39, 60, 5, 248, 38, - 60, 5, 248, 37, 60, 5, 248, 36, 60, 5, 248, 35, 60, 5, 248, 34, 60, - 5, 248, 33, 60, 5, 248, 32, 60, 5, 248, 31, 60, 16, 152, 24, 185, 184, - 241, 0, 15, 1, 209, 11, 225, 152, 70, 0, 34, 6, 155, 26, 153, 32, 70, - 34, 240, 150, 220, 27, 153, 8, 144, 0, 34, 6, 155, 32, 70, 34, 240, - 143, 220, 8, 153, 6, 144, 17, 240, 0, 97, 17, 145, 7, 209, 8, 154, 2, - 240, 127, 3, 49, 74, 210, 86, 0, 42, 33, 218, 45, 224, 8, 152, 8, 155, - 0, 244, 224, 97, 19, 244, 0, 15, 79, 234, 17, 33, 44, 75, 0, 240, 127, - 2, 161, 241, 4, 1, 8, 208, 1, 41, 79, 240, 20, 1, 1, 251, 2, 51, 148, - 191, 219, 104, 155, 104, 9, 224, 1, 41, 79, 240, 20, 1, 3, 216, 1, 251, - 2, 51, 91, 104, 1, 224, 74, 67, 155, 88, 2, 59, 24, 191, 1, 35, 83, - 177, 148, 249, 92, 54, 1, 43, 8, 208, 74, 244, 128, 74, 31, 250, 138, - 250, 1, 33, 12, 145, 3, 224, 12, 147, 1, 224, 0, 34, 12, 146, 6, 155, - 19, 240, 0, 98, 6, 209, 19, 73, 3, 240, 127, 3, 201, 86, 0, 41, 38, - 218, 57, 224, 6, 152, 16, 75, 0, 244, 224, 97, 79, 234, 17, 33, 16, - 244, 0, 15, 0, 240, 127, 2, 161, 241, 4, 1, 8, 208, 1, 41, 79, 240, - 20, 1, 1, 251, 2, 51, 148, 191, 219, 104, 155, 104, 15, 224, 1, 41, - 79, 240, 20, 1, 9, 216, 1, 251, 2, 51, 91, 104, 7, 224, 152, 224, 133, - 0, 64, 27, 134, 0, 132, 24, 134, 0, 74, 67, 155, 88, 2, 59, 24, 191, - 1, 35, 99, 177, 148, 249, 92, 54, 1, 43, 10, 208, 111, 234, 74, 74, - 111, 234, 90, 74, 1, 33, 31, 250, 138, 250, 14, 145, 3, 224, 14, 147, - 1, 224, 0, 34, 14, 146, 53, 248, 118, 60, 184, 241, 0, 15, 2, 208, 67, - 244, 0, 99, 1, 224, 67, 240, 6, 3, 37, 248, 118, 60, 184, 241, 0, 15, - 12, 191, 20, 39, 14, 39, 58, 70, 32, 70, 8, 153, 165, 241, 30, 3, 24, - 240, 255, 223, 58, 70, 24, 171, 32, 70, 6, 153, 24, 240, 249, 223, 24, - 169, 6, 34, 165, 241, 72, 0, 253, 243, 131, 244, 12, 155, 9, 152, 10, - 153, 0, 34, 0, 147, 1, 144, 26, 155, 2, 145, 3, 146, 65, 70, 8, 154, - 32, 70, 25, 240, 5, 216, 37, 248, 22, 12, 14, 155, 13, 152, 10, 153, - 0, 34, 0, 147, 1, 144, 2, 145, 3, 146, 27, 155, 6, 154, 32, 70, 65, - 70, 24, 240, 245, 223, 165, 241, 24, 7, 37, 248, 66, 12, 165, 241, 20, - 0, 184, 241, 0, 15, 10, 208, 111, 240, 59, 3, 5, 248, 24, 60, 0, 35, - 5, 248, 23, 60, 11, 241, 10, 1, 6, 34, 7, 224, 111, 240, 75, 3, 5, 248, - 24, 60, 5, 248, 23, 140, 15, 153, 12, 34, 253, 243, 71, 244, 11, 152, - 17, 154, 129, 178, 90, 185, 8, 152, 160, 74, 0, 240, 127, 3, 211, 86, - 0, 43, 4, 218, 21, 248, 30, 60, 3, 240, 15, 3, 1, 224, 21, 248, 30, - 60, 27, 2, 25, 67, 11, 145, 30, 224, 65, 70, 6, 34, 165, 241, 30, 0, - 253, 243, 143, 244, 65, 70, 16, 34, 165, 241, 24, 0, 253, 243, 137, - 244, 165, 241, 72, 0, 65, 70, 6, 34, 253, 243, 131, 244, 71, 70, 5, - 248, 66, 140, 5, 248, 65, 140, 205, 248, 24, 128, 205, 248, 32, 128, - 205, 248, 56, 128, 205, 248, 48, 128, 115, 106, 88, 5, 10, 213, 26, - 154, 17, 1, 7, 213, 212, 248, 64, 1, 73, 70, 10, 155, 42, 240, 10, 222, - 5, 248, 67, 12, 37, 248, 116, 172, 11, 153, 37, 248, 100, 28, 27, 155, - 19, 240, 0, 97, 2, 208, 148, 248, 192, 20, 7, 224, 3, 240, 127, 3, 22, - 43, 2, 216, 122, 74, 154, 64, 0, 212, 1, 33, 8, 154, 137, 178, 18, 240, - 0, 106, 4, 208, 148, 248, 192, 164, 79, 234, 138, 10, 13, 224, 8, 152, - 0, 240, 127, 3, 22, 43, 2, 216, 113, 74, 154, 64, 1, 212, 79, 240, 1, - 10, 79, 234, 138, 10, 31, 250, 138, 250, 6, 154, 74, 234, 1, 1, 18, - 240, 0, 106, 4, 208, 148, 248, 192, 164, 79, 234, 10, 26, 13, 224, 6, - 152, 0, 240, 127, 3, 22, 43, 2, 216, 100, 74, 154, 64, 1, 212, 79, 240, - 1, 10, 79, 234, 10, 26, 31, 250, 138, 250, 35, 107, 65, 234, 10, 10, - 24, 105, 12, 240, 213, 254, 192, 178, 74, 234, 0, 42, 37, 248, 98, 172, - 221, 248, 104, 176, 27, 240, 0, 106, 2, 208, 148, 248, 192, 164, 10, - 224, 11, 240, 127, 3, 22, 43, 2, 216, 84, 74, 154, 64, 1, 212, 79, 240, - 1, 10, 31, 250, 138, 250, 9, 153, 75, 30, 219, 178, 1, 43, 7, 216, 35, - 104, 74, 240, 16, 10, 211, 248, 140, 48, 154, 105, 1, 50, 154, 97, 89, - 70, 32, 70, 21, 240, 146, 217, 64, 234, 10, 0, 37, 248, 110, 12, 89, - 70, 32, 70, 31, 240, 190, 220, 37, 248, 108, 12, 27, 153, 32, 70, 31, - 240, 184, 220, 37, 248, 106, 12, 16, 154, 18, 185, 184, 241, 0, 15, - 11, 208, 8, 153, 32, 70, 31, 240, 173, 220, 37, 248, 104, 12, 6, 153, - 32, 70, 31, 240, 167, 220, 37, 248, 102, 12, 26, 153, 11, 1, 8, 213, - 9, 155, 4, 43, 5, 209, 10, 154, 32, 70, 24, 240, 29, 221, 37, 248, 56, - 12, 27, 153, 8, 1, 8, 213, 13, 152, 4, 40, 5, 209, 10, 154, 32, 70, - 24, 240, 17, 221, 37, 248, 54, 12, 217, 248, 4, 48, 90, 6, 64, 241, - 185, 128, 20, 153, 0, 41, 0, 240, 181, 128, 40, 75, 42, 154, 155, 92, - 15, 147, 4, 235, 67, 3, 179, 248, 254, 177, 187, 241, 0, 15, 0, 240, - 169, 128, 115, 106, 16, 147, 91, 5, 126, 212, 40, 152, 0, 40, 123, 209, - 26, 153, 32, 70, 9, 154, 10, 155, 11, 145, 24, 240, 58, 220, 130, 70, - 151, 177, 8, 153, 12, 154, 32, 70, 14, 240, 1, 223, 6, 153, 3, 70, 14, - 154, 32, 70, 5, 147, 14, 240, 250, 222, 183, 248, 2, 128, 5, 155, 53, - 248, 66, 124, 152, 68, 28, 224, 7, 154, 18, 187, 11, 153, 9, 154, 7, - 155, 32, 70, 15, 240, 41, 217, 221, 248, 108, 192, 13, 154, 97, 70, - 10, 155, 0, 235, 10, 8, 32, 70, 205, 248, 20, 192, 24, 240, 17, 220, - 221, 248, 20, 192, 7, 70, 97, 70, 32, 70, 13, 154, 7, 155, 15, 240, - 20, 217, 199, 25, 6, 224, 64, 27, 134, 0, 0, 2, 16, 40, 152, 224, 133, - 0, 128, 70, 202, 235, 8, 3, 155, 69, 37, 248, 112, 140, 37, 248, 74, - 124, 36, 211, 16, 155, 88, 6, 2, 213, 42, 152, 1, 40, 30, 208, 218, - 68, 32, 70, 11, 153, 9, 154, 200, 235, 10, 3, 14, 240, 191, 222, 255, - 40, 5, 217, 180, 248, 42, 54, 152, 66, 40, 191, 24, 70, 1, 224, 79, - 244, 128, 112, 42, 153, 128, 178, 1, 245, 69, 115, 4, 235, 67, 3, 154, - 136, 130, 66, 3, 208, 152, 128, 32, 70, 37, 240, 86, 223, 35, 104, 147, - 248, 68, 48, 0, 43, 45, 208, 42, 154, 3, 42, 42, 216, 212, 248, 100, - 1, 15, 153, 66, 70, 34, 224, 35, 104, 147, 248, 68, 48, 11, 179, 42, - 155, 3, 43, 30, 216, 63, 177, 12, 154, 32, 70, 8, 153, 14, 240, 134, - 222, 122, 136, 130, 24, 15, 224, 221, 248, 104, 128, 9, 154, 65, 70, - 10, 155, 32, 70, 24, 240, 173, 219, 9, 154, 5, 70, 65, 70, 32, 70, 59, - 70, 15, 240, 178, 216, 66, 25, 212, 248, 100, 1, 15, 153, 75, 70, 61, - 240, 191, 219, 115, 106, 189, 248, 114, 0, 67, 240, 132, 3, 115, 98, - 31, 176, 189, 232, 240, 143, 56, 181, 209, 248, 216, 50, 4, 70, 29, - 140, 5, 187, 139, 109, 64, 242, 55, 21, 29, 64, 3, 107, 0, 45, 20, 191, - 17, 37, 1, 37, 25, 104, 2, 41, 7, 209, 144, 248, 92, 22, 1, 49, 201, - 178, 1, 41, 152, 191, 69, 240, 32, 5, 91, 125, 83, 177, 144, 107, 2, - 241, 60, 1, 33, 240, 221, 218, 32, 177, 148, 249, 71, 54, 11, 177, 69, - 244, 128, 101, 40, 70, 56, 189, 75, 120, 48, 181, 1, 43, 53, 221, 200, - 120, 138, 120, 66, 234, 0, 34, 1, 42, 47, 209, 7, 43, 48, 221, 10, 122, - 76, 122, 163, 241, 8, 0, 66, 234, 4, 36, 0, 34, 1, 224, 1, 50, 4, 56, - 162, 66, 1, 218, 4, 40, 249, 220, 18, 27, 0, 235, 130, 2, 1, 42, 29, - 221, 1, 241, 8, 0, 0, 235, 132, 4, 160, 120, 229, 120, 2, 58, 64, 234, - 5, 36, 0, 32, 1, 224, 1, 48, 4, 58, 160, 66, 1, 218, 3, 42, 249, 220, - 0, 27, 2, 235, 128, 2, 1, 42, 9, 221, 144, 30, 8, 208, 24, 26, 72, 112, - 2, 224, 111, 240, 22, 0, 48, 189, 0, 32, 48, 189, 0, 32, 48, 189, 47, - 42, 112, 181, 48, 217, 176, 248, 128, 49, 4, 107, 11, 96, 176, 248, - 130, 49, 165, 137, 75, 96, 227, 137, 27, 7, 67, 234, 5, 51, 5, 104, - 139, 96, 43, 105, 208, 248, 132, 1, 222, 107, 59, 42, 206, 96, 174, - 104, 14, 97, 158, 106, 78, 97, 222, 106, 142, 97, 181, 248, 122, 96, - 72, 98, 213, 248, 176, 0, 206, 97, 8, 98, 88, 104, 136, 98, 152, 107, - 200, 98, 13, 217, 32, 137, 8, 99, 96, 137, 72, 99, 0, 32, 63, 42, 136, - 99, 6, 217, 27, 108, 203, 99, 112, 189, 111, 240, 13, 0, 112, 189, 0, - 32, 112, 189, 45, 233, 240, 79, 133, 176, 3, 145, 1, 104, 145, 70, 145, - 248, 47, 16, 14, 170, 31, 70, 5, 70, 146, 232, 12, 8, 17, 158, 221, - 248, 72, 160, 221, 248, 76, 128, 17, 177, 185, 241, 20, 15, 71, 208, - 213, 248, 124, 2, 2, 146, 1, 147, 65, 240, 67, 221, 2, 154, 4, 70, 1, - 155, 0, 40, 60, 208, 192, 248, 4, 144, 130, 96, 195, 96, 192, 248, 16, - 176, 184, 241, 0, 15, 1, 208, 10, 241, 16, 10, 196, 248, 20, 160, 186, - 241, 0, 15, 31, 208, 246, 177, 104, 104, 81, 70, 2, 240, 99, 216, 224, - 99, 56, 185, 213, 248, 124, 2, 33, 70, 5, 176, 189, 232, 240, 79, 65, - 240, 51, 157, 184, 241, 0, 15, 9, 208, 65, 70, 16, 34, 253, 243, 166, - 241, 224, 107, 98, 105, 16, 48, 49, 70, 16, 58, 1, 224, 98, 105, 49, - 70, 253, 243, 156, 241, 40, 70, 3, 153, 34, 70, 59, 70, 29, 240, 74, - 218, 40, 70, 33, 70, 5, 176, 189, 232, 240, 79, 32, 240, 213, 157, 5, - 176, 189, 232, 240, 143, 45, 233, 240, 79, 135, 176, 138, 70, 17, 153, - 5, 70, 11, 41, 147, 70, 3, 147, 221, 248, 64, 144, 18, 156, 64, 242, - 99, 129, 186, 248, 22, 48, 161, 241, 12, 6, 9, 241, 12, 7, 3, 244, 255, - 99, 219, 8, 56, 70, 49, 70, 3, 34, 2, 147, 253, 243, 17, 245, 176, 177, - 144, 248, 2, 128, 213, 248, 92, 1, 72, 244, 48, 97, 184, 241, 14, 15, - 140, 191, 79, 244, 128, 83, 79, 244, 0, 83, 25, 67, 65, 240, 112, 219, - 56, 185, 213, 248, 104, 49, 155, 136, 153, 5, 2, 212, 59, 225, 221, - 248, 8, 128, 0, 33, 172, 34, 32, 70, 253, 243, 180, 241, 89, 70, 6, - 34, 32, 70, 253, 243, 75, 241, 153, 248, 10, 48, 153, 248, 11, 176, - 3, 153, 67, 234, 11, 43, 11, 240, 3, 3, 1, 43, 8, 191, 132, 248, 52, - 48, 227, 136, 0, 41, 20, 191, 79, 244, 128, 114, 0, 34, 19, 67, 227, - 128, 81, 70, 164, 248, 98, 176, 40, 70, 30, 240, 64, 222, 81, 70, 96, - 133, 40, 70, 18, 240, 207, 222, 2, 155, 160, 133, 67, 69, 3, 209, 227, - 136, 67, 240, 2, 3, 227, 128, 5, 235, 8, 3, 147, 248, 76, 48, 49, 70, - 132, 248, 97, 48, 153, 248, 9, 32, 153, 248, 8, 48, 56, 70, 67, 234, - 2, 35, 227, 133, 0, 34, 253, 243, 179, 244, 1, 70, 72, 177, 66, 120, - 32, 42, 6, 216, 34, 114, 4, 241, 9, 0, 2, 49, 253, 243, 6, 241, 1, 224, - 0, 35, 35, 114, 0, 35, 0, 147, 40, 70, 57, 70, 50, 70, 35, 70, 31, 240, - 197, 217, 0, 40, 64, 240, 221, 128, 56, 70, 49, 70, 1, 34, 253, 243, - 149, 244, 48, 177, 67, 120, 8, 43, 3, 217, 227, 136, 67, 240, 1, 3, - 227, 128, 72, 244, 48, 99, 184, 241, 14, 15, 140, 191, 79, 244, 128, - 88, 79, 244, 0, 88, 67, 234, 8, 8, 27, 240, 2, 15, 164, 248, 50, 128, - 13, 208, 56, 70, 49, 70, 6, 34, 253, 243, 120, 244, 56, 177, 67, 120, - 1, 43, 4, 217, 194, 120, 131, 120, 67, 234, 2, 35, 35, 134, 213, 248, - 104, 1, 131, 121, 91, 177, 17, 153, 34, 70, 1, 145, 83, 70, 3, 153, - 205, 248, 0, 144, 79, 240, 40, 222, 0, 40, 0, 240, 162, 128, 49, 70, - 56, 70, 48, 34, 253, 243, 90, 244, 1, 70, 24, 177, 40, 70, 34, 70, 17, - 240, 60, 219, 49, 70, 56, 70, 68, 34, 253, 243, 79, 244, 1, 70, 24, - 177, 40, 70, 34, 70, 17, 240, 113, 218, 49, 70, 56, 70, 4, 151, 5, 150, - 254, 243, 79, 242, 1, 70, 24, 177, 40, 70, 34, 70, 17, 240, 33, 220, - 43, 104, 91, 107, 211, 177, 4, 151, 5, 150, 6, 224, 40, 70, 65, 70, - 4, 170, 5, 171, 30, 240, 129, 219, 64, 185, 4, 152, 5, 153, 221, 34, - 253, 243, 43, 244, 128, 70, 0, 40, 240, 209, 7, 224, 227, 136, 67, 240, - 4, 3, 227, 128, 152, 248, 8, 48, 132, 248, 106, 48, 0, 35, 56, 70, 49, - 70, 49, 74, 0, 147, 29, 240, 60, 218, 24, 177, 227, 136, 67, 240, 8, - 3, 227, 128, 227, 136, 40, 70, 35, 244, 102, 99, 227, 128, 57, 70, 50, - 70, 33, 240, 72, 217, 129, 70, 0, 40, 75, 208, 3, 120, 144, 248, 1, - 128, 67, 234, 8, 40, 227, 136, 24, 244, 128, 79, 67, 240, 32, 3, 155, - 178, 227, 128, 13, 208, 67, 244, 0, 115, 227, 128, 43, 104, 147, 248, - 47, 48, 51, 177, 213, 248, 252, 52, 27, 120, 19, 177, 40, 70, 47, 240, - 158, 220, 24, 240, 32, 15, 3, 208, 227, 136, 67, 244, 128, 99, 227, - 128, 24, 240, 64, 15, 3, 208, 227, 136, 67, 244, 0, 99, 227, 128, 9, - 241, 3, 1, 16, 34, 4, 241, 77, 0, 253, 243, 53, 240, 50, 70, 40, 70, - 57, 70, 33, 240, 220, 216, 6, 70, 160, 177, 49, 120, 114, 120, 40, 70, - 16, 240, 47, 216, 96, 134, 24, 240, 2, 0, 11, 208, 112, 120, 16, 240, - 4, 0, 7, 208, 227, 136, 0, 32, 67, 240, 64, 3, 227, 128, 1, 224, 79, - 240, 255, 48, 7, 176, 189, 232, 240, 143, 181, 183, 1, 0, 45, 233, 240, - 79, 208, 248, 104, 97, 181, 176, 29, 70, 221, 248, 248, 176, 179, 121, - 7, 145, 4, 70, 63, 159, 187, 248, 10, 160, 19, 177, 48, 70, 79, 240, - 96, 219, 181, 248, 0, 128, 8, 240, 252, 8, 168, 241, 128, 0, 208, 241, - 0, 8, 72, 235, 0, 8, 184, 241, 0, 15, 17, 208, 179, 136, 89, 7, 16, - 212, 7, 154, 212, 248, 92, 1, 209, 138, 1, 244, 255, 97, 201, 8, 64, - 240, 195, 223, 208, 241, 1, 9, 56, 191, 79, 240, 0, 9, 3, 224, 193, - 70, 1, 224, 79, 240, 0, 9, 167, 241, 12, 1, 0, 34, 11, 241, 12, 0, 253, - 243, 122, 243, 179, 104, 1, 70, 2, 43, 10, 208, 19, 185, 26, 240, 1, - 15, 4, 224, 1, 43, 64, 240, 96, 129, 26, 240, 2, 15, 0, 240, 92, 129, - 48, 70, 74, 70, 79, 240, 81, 221, 0, 40, 0, 240, 85, 129, 115, 123, - 218, 7, 9, 212, 6, 241, 13, 0, 5, 241, 16, 1, 6, 34, 252, 243, 156, - 247, 0, 40, 64, 240, 72, 129, 9, 171, 5, 241, 16, 10, 2, 147, 32, 70, - 7, 153, 82, 70, 67, 70, 205, 248, 0, 176, 1, 151, 255, 247, 28, 254, - 0, 40, 64, 240, 56, 129, 157, 248, 44, 48, 189, 248, 86, 32, 0, 147, - 32, 70, 81, 70, 13, 241, 45, 3, 13, 240, 234, 222, 5, 70, 48, 177, 184, - 241, 0, 15, 3, 208, 195, 136, 219, 5, 64, 241, 36, 129, 147, 74, 189, - 248, 78, 48, 18, 104, 25, 178, 209, 66, 68, 191, 211, 24, 173, 248, - 78, 48, 229, 177, 234, 136, 189, 248, 42, 48, 131, 234, 2, 1, 136, 7, - 9, 212, 181, 249, 42, 32, 189, 249, 78, 48, 154, 66, 168, 191, 19, 70, - 173, 248, 78, 48, 20, 224, 145, 7, 18, 213, 154, 7, 16, 212, 106, 141, - 67, 240, 2, 3, 173, 248, 78, 32, 173, 248, 42, 48, 8, 224, 212, 248, - 28, 53, 43, 177, 189, 249, 78, 32, 27, 178, 154, 66, 192, 242, 243, - 128, 148, 248, 244, 55, 216, 7, 93, 213, 0, 35, 173, 248, 140, 48, 179, - 136, 153, 7, 11, 213, 96, 104, 57, 70, 1, 240, 254, 221, 34, 144, 168, - 177, 89, 70, 58, 70, 252, 243, 76, 247, 173, 248, 140, 112, 189, 248, - 140, 16, 96, 104, 140, 49, 1, 240, 240, 221, 189, 248, 140, 48, 5, 70, - 88, 185, 35, 177, 96, 104, 34, 153, 26, 70, 1, 240, 246, 221, 212, 248, - 104, 1, 4, 33, 79, 240, 81, 218, 198, 224, 1, 38, 32, 70, 9, 169, 5, - 241, 12, 2, 128, 51, 0, 150, 14, 240, 149, 216, 7, 70, 200, 185, 109, - 35, 180, 248, 246, 39, 107, 96, 43, 105, 42, 129, 12, 51, 43, 96, 110, - 129, 212, 248, 104, 1, 79, 240, 122, 218, 8, 35, 141, 232, 136, 0, 2, - 151, 3, 149, 43, 104, 1, 70, 4, 147, 32, 70, 69, 34, 59, 70, 23, 240, - 225, 220, 189, 248, 140, 32, 96, 104, 140, 50, 41, 70, 1, 240, 196, - 221, 189, 248, 140, 32, 0, 42, 0, 240, 150, 128, 96, 104, 34, 153, 1, - 240, 187, 221, 144, 224, 212, 248, 24, 8, 10, 240, 242, 217, 40, 177, - 212, 248, 24, 8, 9, 169, 10, 240, 168, 248, 133, 224, 229, 185, 212, - 248, 40, 53, 2, 43, 26, 209, 7, 155, 32, 70, 179, 248, 22, 144, 189, - 248, 86, 48, 9, 244, 255, 105, 35, 240, 255, 3, 67, 234, 217, 9, 157, - 248, 44, 48, 31, 250, 137, 249, 0, 147, 81, 70, 74, 70, 13, 241, 45, - 3, 13, 240, 51, 221, 24, 177, 103, 224, 129, 70, 0, 224, 169, 70, 182, - 248, 4, 128, 24, 240, 2, 8, 6, 208, 96, 104, 57, 70, 1, 240, 117, 221, - 128, 70, 0, 40, 88, 208, 157, 185, 32, 70, 13, 240, 246, 220, 5, 70, - 0, 40, 77, 208, 212, 248, 40, 53, 2, 43, 9, 209, 157, 248, 44, 48, 32, - 70, 0, 147, 81, 70, 74, 70, 13, 241, 45, 3, 13, 240, 175, 220, 105, - 110, 65, 177, 96, 104, 181, 248, 104, 32, 1, 240, 102, 221, 0, 35, 107, - 102, 165, 248, 104, 48, 172, 34, 40, 70, 9, 169, 252, 243, 161, 246, - 179, 136, 154, 7, 8, 213, 197, 248, 100, 128, 64, 70, 89, 70, 58, 70, - 252, 243, 151, 246, 165, 248, 104, 112, 212, 248, 104, 1, 67, 123, 219, - 7, 34, 212, 13, 48, 253, 243, 125, 243, 5, 70, 232, 185, 212, 248, 104, - 1, 79, 240, 237, 217, 1, 40, 23, 209, 212, 248, 104, 1, 41, 70, 12, - 224, 96, 104, 65, 70, 58, 70, 1, 240, 56, 221, 212, 248, 40, 53, 48, - 70, 2, 43, 8, 191, 164, 248, 56, 149, 8, 33, 79, 240, 108, 220, 3, 224, - 184, 241, 0, 15, 236, 209, 240, 231, 53, 176, 189, 232, 240, 143, 208, - 8, 2, 0, 16, 181, 4, 70, 36, 240, 146, 216, 32, 70, 189, 232, 16, 64, - 21, 240, 169, 153, 56, 181, 208, 248, 96, 54, 218, 122, 156, 122, 146, - 177, 157, 137, 79, 246, 255, 114, 149, 66, 13, 208, 153, 123, 65, 185, - 154, 120, 1, 42, 6, 208, 25, 123, 1, 240, 1, 1, 129, 240, 1, 1, 0, 224, - 0, 33, 201, 178, 13, 224, 2, 107, 138, 66, 16, 209, 154, 123, 42, 185, - 157, 120, 1, 45, 4, 208, 145, 248, 76, 16, 2, 224, 0, 33, 0, 224, 17, - 70, 140, 66, 3, 208, 153, 114, 0, 105, 54, 240, 198, 223, 0, 32, 56, - 189, 56, 181, 13, 70, 208, 248, 96, 22, 4, 70, 203, 122, 171, 66, 12, - 208, 37, 177, 12, 49, 176, 248, 40, 38, 20, 240, 104, 220, 212, 248, - 96, 54, 32, 70, 221, 114, 33, 107, 255, 247, 188, 255, 0, 32, 56, 189, - 115, 181, 3, 104, 4, 70, 91, 126, 0, 43, 64, 240, 189, 128, 3, 105, - 147, 248, 234, 32, 74, 177, 219, 110, 211, 248, 32, 33, 64, 242, 4, - 67, 19, 64, 179, 245, 128, 111, 6, 208, 174, 224, 24, 110, 7, 240, 222, - 254, 0, 40, 64, 240, 169, 128, 35, 104, 147, 248, 32, 48, 51, 185, 32, - 105, 5, 240, 47, 248, 35, 104, 1, 34, 131, 248, 32, 32, 35, 104, 27, - 111, 235, 185, 32, 105, 5, 240, 77, 248, 9, 48, 24, 209, 35, 104, 26, - 111, 145, 7, 20, 212, 66, 240, 2, 2, 26, 103, 37, 70, 4, 241, 32, 6, - 213, 248, 76, 18, 65, 177, 139, 121, 51, 185, 75, 121, 35, 177, 139, - 124, 19, 177, 32, 70, 57, 240, 89, 221, 4, 53, 181, 66, 240, 209, 35, - 104, 29, 111, 29, 177, 32, 70, 17, 240, 148, 221, 115, 224, 1, 35, 132, - 248, 41, 48, 32, 70, 32, 240, 31, 220, 35, 104, 32, 70, 89, 107, 3, - 35, 0, 147, 33, 177, 79, 244, 128, 114, 41, 70, 19, 70, 2, 224, 79, - 244, 128, 114, 11, 70, 30, 240, 221, 219, 160, 104, 10, 240, 74, 217, - 35, 104, 1, 34, 26, 118, 148, 248, 157, 49, 115, 177, 32, 70, 10, 240, - 1, 250, 212, 248, 64, 53, 32, 70, 89, 142, 35, 240, 253, 218, 0, 35, - 132, 248, 157, 49, 32, 70, 28, 240, 225, 221, 180, 248, 92, 23, 32, - 70, 33, 240, 106, 219, 32, 105, 4, 240, 106, 254, 35, 104, 147, 248, - 47, 48, 27, 177, 212, 248, 52, 7, 47, 240, 91, 220, 35, 104, 147, 248, - 49, 48, 123, 177, 37, 70, 4, 241, 32, 6, 213, 248, 76, 18, 49, 177, - 139, 121, 35, 185, 75, 121, 19, 177, 32, 70, 53, 240, 24, 219, 4, 53, - 181, 66, 242, 209, 32, 70, 21, 240, 44, 219, 32, 70, 22, 240, 214, 248, - 1, 37, 212, 248, 172, 17, 79, 244, 122, 114, 1, 35, 160, 104, 10, 240, - 148, 216, 32, 70, 132, 248, 241, 81, 37, 240, 239, 217, 32, 70, 20, - 240, 144, 219, 32, 70, 37, 240, 75, 221, 80, 177, 32, 70, 37, 240, 37, - 221, 32, 70, 41, 70, 37, 240, 43, 223, 0, 32, 1, 224, 111, 240, 8, 0, - 124, 189, 45, 233, 240, 79, 144, 248, 117, 50, 151, 176, 219, 6, 4, - 70, 14, 70, 1, 241, 4, 9, 0, 241, 165, 128, 208, 248, 4, 56, 153, 66, - 64, 240, 160, 128, 81, 75, 26, 120, 154, 70, 0, 42, 64, 240, 154, 128, - 1, 35, 138, 248, 0, 48, 176, 248, 60, 82, 129, 224, 17, 240, 209, 218, - 1, 105, 209, 248, 204, 48, 152, 3, 13, 213, 32, 70, 58, 70, 19, 155, - 58, 240, 45, 219, 0, 40, 115, 208, 35, 104, 3, 153, 216, 104, 1, 34, - 1, 240, 245, 219, 108, 224, 123, 106, 90, 5, 7, 213, 212, 248, 64, 1, - 49, 70, 3, 170, 19, 155, 42, 240, 32, 219, 67, 224, 88, 7, 7, 213, 1, - 35, 32, 70, 57, 70, 21, 170, 20, 147, 31, 240, 106, 220, 5, 224, 32, - 70, 3, 169, 20, 170, 21, 171, 11, 240, 3, 249, 0, 40, 49, 209, 35, 104, - 147, 248, 161, 48, 1, 43, 7, 209, 21, 153, 3, 41, 4, 216, 212, 248, - 64, 1, 3, 34, 41, 240, 192, 221, 2, 175, 79, 240, 0, 8, 28, 224, 120, - 104, 3, 105, 179, 248, 76, 48, 31, 250, 131, 251, 27, 178, 0, 43, 9, - 218, 17, 240, 133, 218, 0, 35, 1, 70, 90, 70, 212, 248, 96, 1, 0, 147, - 77, 240, 207, 220, 1, 35, 0, 147, 32, 70, 21, 153, 87, 248, 4, 47, 254, - 247, 183, 249, 8, 241, 1, 8, 20, 155, 152, 69, 223, 219, 29, 224, 16, - 48, 27, 209, 72, 70, 19, 153, 3, 154, 253, 243, 48, 245, 148, 248, 117, - 50, 115, 177, 35, 104, 147, 248, 181, 48, 217, 7, 9, 213, 180, 248, - 60, 50, 1, 34, 29, 64, 19, 155, 18, 250, 3, 243, 37, 234, 3, 5, 4, 224, - 180, 248, 60, 50, 157, 66, 11, 208, 29, 70, 77, 177, 72, 70, 41, 70, - 19, 170, 253, 243, 71, 244, 7, 70, 3, 144, 0, 40, 127, 244, 115, 175, - 32, 70, 49, 70, 20, 240, 64, 217, 0, 35, 138, 248, 0, 48, 23, 176, 189, - 232, 240, 143, 124, 39, 0, 0, 45, 233, 240, 79, 157, 176, 39, 159, 18, - 147, 14, 146, 127, 137, 4, 70, 17, 151, 39, 159, 16, 70, 12, 55, 11, - 151, 40, 159, 13, 70, 12, 63, 12, 151, 178, 248, 22, 144, 25, 70, 9, - 244, 255, 105, 79, 234, 217, 9, 185, 241, 14, 15, 148, 191, 0, 39, 1, - 39, 16, 151, 151, 136, 13, 241, 112, 8, 20, 151, 21, 240, 68, 255, 38, - 159, 21, 144, 10, 55, 57, 70, 16, 154, 32, 70, 19, 151, 80, 240, 139, - 216, 0, 35, 72, 248, 16, 61, 6, 70, 25, 147, 25, 175, 32, 70, 39, 153, - 40, 154, 67, 70, 0, 151, 28, 240, 176, 220, 48, 185, 32, 70, 39, 153, - 40, 154, 67, 70, 0, 151, 30, 240, 168, 220, 22, 177, 115, 104, 219, - 7, 38, 212, 12, 153, 11, 152, 50, 34, 252, 243, 243, 247, 1, 70, 32, - 177, 64, 120, 2, 49, 32, 240, 185, 220, 112, 185, 12, 153, 11, 152, - 1, 34, 252, 243, 231, 247, 1, 70, 80, 177, 2, 49, 64, 120, 32, 240, - 173, 220, 0, 48, 24, 191, 1, 32, 2, 224, 1, 39, 13, 151, 0, 224, 13, - 144, 86, 177, 13, 159, 55, 185, 115, 104, 67, 240, 1, 3, 115, 96, 3, - 224, 0, 39, 0, 224, 1, 39, 13, 151, 11, 152, 12, 153, 3, 34, 252, 243, - 200, 247, 35, 104, 7, 70, 8, 177, 66, 120, 170, 185, 147, 248, 63, 0, - 112, 177, 180, 248, 38, 6, 195, 178, 75, 69, 8, 208, 253, 243, 109, - 245, 201, 235, 0, 14, 222, 241, 0, 0, 64, 235, 14, 0, 0, 224, 1, 32, - 192, 178, 15, 144, 0, 39, 16, 224, 147, 248, 63, 0, 80, 177, 180, 248, - 38, 6, 253, 243, 90, 245, 151, 248, 2, 144, 192, 235, 9, 7, 120, 66, - 64, 235, 7, 0, 192, 178, 15, 144, 7, 70, 15, 153, 41, 177, 21, 241, - 0, 8, 24, 191, 79, 240, 1, 8, 1, 224, 221, 248, 60, 128, 35, 104, 95, - 250, 136, 248, 147, 248, 70, 144, 25, 240, 3, 9, 35, 208, 148, 248, - 114, 50, 75, 185, 184, 241, 0, 15, 6, 208, 213, 248, 212, 50, 179, 248, - 6, 144, 25, 240, 32, 9, 31, 208, 11, 153, 12, 154, 32, 70, 32, 240, - 182, 220, 11, 153, 131, 70, 12, 154, 32, 70, 32, 240, 124, 220, 35, - 104, 7, 144, 147, 249, 76, 48, 83, 177, 32, 70, 11, 153, 12, 154, 29, - 240, 160, 217, 129, 70, 4, 224, 203, 70, 205, 248, 28, 144, 0, 224, - 153, 70, 184, 241, 0, 15, 108, 208, 2, 224, 203, 70, 205, 248, 28, 144, - 35, 104, 147, 248, 70, 160, 26, 240, 3, 10, 108, 208, 7, 154, 0, 42, - 97, 208, 187, 241, 0, 15, 97, 208, 17, 120, 32, 70, 82, 120, 15, 240, - 173, 219, 180, 248, 38, 198, 3, 70, 12, 244, 112, 66, 178, 245, 0, 82, - 24, 191, 1, 34, 14, 50, 84, 248, 34, 128, 12, 244, 64, 108, 216, 248, - 4, 16, 212, 248, 92, 1, 8, 147, 205, 248, 36, 192, 63, 240, 82, 223, - 16, 240, 8, 15, 8, 155, 221, 248, 36, 192, 7, 209, 152, 248, 236, 160, - 26, 241, 0, 10, 24, 191, 79, 240, 1, 10, 1, 224, 79, 240, 0, 10, 155, - 248, 0, 32, 18, 240, 2, 2, 3, 208, 7, 153, 74, 120, 194, 243, 128, 2, - 188, 245, 64, 111, 5, 209, 180, 248, 38, 38, 154, 66, 11, 209, 0, 240, - 19, 188, 186, 241, 0, 15, 37, 208, 10, 179, 3, 244, 64, 98, 178, 245, - 64, 111, 64, 240, 9, 132, 34, 104, 146, 248, 47, 160, 186, 241, 0, 15, - 64, 240, 5, 132, 24, 70, 8, 147, 253, 243, 175, 244, 128, 70, 180, 248, - 38, 6, 253, 243, 170, 244, 128, 69, 8, 155, 64, 240, 250, 131, 8, 224, - 194, 70, 9, 224, 221, 248, 28, 160, 4, 224, 218, 70, 2, 224, 146, 70, - 0, 224, 154, 70, 79, 240, 1, 8, 35, 107, 91, 125, 0, 43, 55, 208, 15, - 154, 0, 42, 52, 208, 148, 248, 114, 50, 51, 185, 148, 248, 116, 50, - 0, 43, 45, 208, 184, 241, 0, 15, 42, 209, 148, 248, 73, 54, 83, 177, - 25, 155, 0, 43, 7, 221, 24, 155, 27, 120, 88, 7, 3, 213, 212, 248, 88, - 54, 4, 34, 26, 97, 148, 248, 73, 54, 75, 177, 13, 155, 75, 185, 17, - 153, 137, 6, 13, 212, 212, 248, 88, 54, 4, 34, 218, 96, 8, 224, 13, - 154, 50, 177, 25, 155, 0, 43, 7, 221, 24, 155, 27, 120, 218, 7, 3, 213, - 212, 248, 88, 54, 4, 34, 26, 98, 32, 70, 37, 240, 55, 219, 35, 104, - 147, 248, 70, 48, 155, 7, 71, 208, 15, 155, 0, 43, 68, 208, 148, 248, - 114, 50, 51, 185, 148, 248, 116, 50, 0, 43, 61, 208, 184, 241, 0, 15, - 58, 209, 180, 248, 38, 54, 7, 153, 3, 244, 64, 99, 163, 245, 64, 96, - 67, 66, 67, 235, 0, 3, 17, 185, 13, 154, 50, 185, 22, 224, 7, 153, 138, - 120, 2, 240, 3, 2, 3, 42, 5, 209, 212, 248, 88, 38, 4, 33, 145, 97, - 7, 154, 82, 177, 7, 153, 138, 120, 2, 240, 3, 2, 2, 42, 4, 209, 27, - 177, 212, 248, 88, 38, 4, 33, 209, 98, 187, 241, 0, 15, 15, 208, 7, - 154, 106, 177, 155, 248, 0, 16, 82, 120, 137, 7, 8, 212, 2, 240, 4, - 2, 210, 178, 34, 177, 27, 177, 212, 248, 88, 54, 4, 34, 218, 98, 32, - 70, 37, 240, 156, 219, 35, 104, 147, 248, 47, 48, 219, 177, 212, 248, - 252, 52, 27, 120, 187, 177, 183, 185, 32, 70, 89, 70, 46, 240, 235, - 222, 136, 177, 32, 70, 57, 70, 46, 240, 232, 223, 32, 70, 46, 240, 219, - 223, 180, 248, 38, 54, 3, 244, 64, 99, 179, 245, 64, 111, 3, 209, 32, - 70, 1, 33, 46, 240, 76, 223, 148, 248, 112, 50, 0, 43, 0, 240, 85, 131, - 29, 177, 213, 248, 220, 114, 10, 151, 0, 224, 10, 149, 184, 241, 0, - 15, 124, 208, 35, 104, 147, 248, 70, 48, 155, 7, 46, 208, 171, 124, - 51, 185, 54, 185, 32, 70, 19, 153, 16, 154, 79, 240, 181, 223, 6, 70, - 38, 179, 187, 241, 0, 15, 14, 208, 7, 155, 32, 70, 49, 70, 90, 70, 205, - 248, 0, 144, 29, 240, 172, 216, 181, 248, 52, 53, 35, 240, 32, 3, 165, - 248, 52, 53, 12, 224, 171, 124, 83, 185, 115, 104, 223, 3, 7, 213, 32, - 70, 49, 70, 90, 70, 91, 70, 205, 248, 0, 176, 29, 240, 152, 216, 32, - 70, 11, 153, 12, 154, 51, 70, 31, 240, 130, 222, 14, 153, 32, 70, 29, - 240, 100, 223, 1, 70, 40, 70, 29, 240, 162, 223, 40, 70, 29, 240, 247, - 222, 14, 153, 32, 70, 17, 240, 237, 223, 1, 70, 40, 70, 16, 240, 79, - 223, 171, 121, 131, 185, 213, 248, 224, 34, 213, 248, 212, 50, 17, 138, - 146, 138, 10, 159, 89, 133, 154, 133, 123, 121, 43, 185, 171, 124, 27, - 177, 40, 70, 1, 33, 53, 240, 64, 220, 10, 159, 0, 35, 187, 113, 251, - 113, 149, 248, 18, 144, 185, 241, 0, 15, 25, 209, 151, 248, 133, 48, - 1, 43, 21, 209, 135, 248, 133, 144, 212, 248, 64, 1, 38, 240, 1, 221, - 32, 70, 41, 70, 15, 34, 75, 70, 205, 248, 0, 144, 205, 248, 4, 144, - 205, 248, 8, 144, 205, 248, 12, 144, 205, 248, 16, 144, 22, 240, 225, - 223, 0, 45, 89, 208, 171, 121, 0, 43, 86, 209, 171, 124, 0, 43, 83, - 208, 39, 159, 187, 120, 122, 120, 27, 4, 67, 234, 2, 35, 58, 120, 19, - 67, 250, 120, 67, 234, 2, 98, 187, 121, 16, 146, 122, 121, 27, 4, 67, - 234, 2, 35, 58, 121, 19, 67, 250, 121, 10, 159, 67, 234, 2, 105, 251, - 105, 19, 185, 58, 106, 18, 185, 50, 224, 153, 69, 6, 211, 153, 69, 46, - 209, 10, 159, 59, 106, 16, 159, 159, 66, 41, 210, 38, 159, 0, 35, 0, - 147, 1, 147, 2, 147, 3, 147, 4, 147, 32, 70, 7, 241, 16, 3, 41, 70, - 22, 34, 22, 240, 166, 223, 40, 70, 14, 153, 18, 154, 39, 155, 36, 240, - 160, 220, 15, 159, 159, 177, 235, 121, 75, 177, 171, 124, 35, 177, 5, - 241, 188, 0, 252, 243, 180, 246, 16, 185, 5, 241, 188, 1, 1, 224, 5, - 241, 214, 1, 0, 34, 32, 70, 19, 70, 0, 146, 34, 240, 44, 218, 10, 153, - 16, 159, 193, 248, 28, 144, 15, 98, 184, 241, 0, 15, 0, 240, 13, 130, - 170, 121, 171, 124, 0, 42, 64, 240, 141, 129, 0, 43, 0, 240, 138, 129, - 26, 171, 0, 147, 40, 154, 40, 70, 39, 153, 13, 241, 111, 3, 22, 240, - 22, 216, 189, 248, 104, 32, 213, 248, 228, 130, 165, 248, 32, 37, 148, - 248, 235, 145, 185, 241, 0, 15, 103, 209, 0, 40, 77, 208, 152, 248, - 0, 48, 2, 43, 26, 209, 40, 70, 73, 70, 184, 248, 38, 176, 10, 240, 180, - 251, 180, 248, 48, 56, 132, 248, 50, 152, 11, 177, 168, 248, 38, 48, - 40, 70, 30, 240, 163, 220, 213, 248, 228, 50, 168, 248, 38, 176, 91, - 139, 0, 43, 74, 208, 40, 70, 16, 240, 95, 223, 70, 224, 35, 104, 91, - 107, 59, 177, 148, 248, 250, 49, 35, 177, 174, 177, 150, 248, 210, 48, - 15, 43, 17, 208, 152, 248, 2, 32, 34, 177, 32, 70, 41, 70, 34, 240, - 212, 221, 51, 224, 79, 240, 255, 51, 0, 147, 32, 70, 5, 241, 188, 1, - 19, 70, 34, 240, 202, 217, 41, 224, 148, 248, 13, 55, 51, 179, 152, - 248, 2, 48, 59, 177, 30, 177, 115, 104, 35, 240, 0, 99, 115, 96, 40, - 70, 22, 240, 157, 216, 40, 70, 35, 240, 186, 218, 23, 224, 152, 248, - 8, 48, 43, 177, 184, 248, 10, 16, 17, 185, 40, 70, 35, 240, 222, 218, - 213, 248, 228, 50, 91, 139, 83, 177, 152, 248, 0, 48, 2, 43, 6, 209, - 216, 248, 32, 48, 1, 43, 2, 209, 40, 70, 30, 240, 61, 220, 152, 248, - 3, 48, 27, 177, 40, 70, 0, 33, 35, 240, 188, 217, 152, 248, 9, 48, 59, - 185, 40, 70, 13, 240, 130, 222, 24, 177, 40, 70, 1, 33, 35, 240, 169, - 219, 152, 248, 9, 48, 91, 177, 20, 159, 40, 70, 199, 243, 192, 17, 21, - 154, 39, 155, 36, 240, 134, 219, 40, 70, 0, 33, 35, 240, 154, 219, 35, - 107, 91, 125, 0, 43, 56, 208, 17, 159, 32, 70, 199, 243, 128, 33, 36, - 240, 154, 218, 24, 154, 0, 42, 47, 208, 25, 155, 0, 43, 44, 221, 212, - 248, 88, 54, 147, 249, 1, 16, 1, 49, 9, 209, 18, 120, 27, 120, 194, - 243, 64, 2, 147, 66, 3, 208, 32, 70, 1, 33, 31, 240, 230, 221, 24, 155, - 27, 120, 195, 243, 128, 3, 132, 248, 70, 54, 59, 185, 212, 248, 88, - 54, 27, 105, 211, 241, 1, 3, 56, 191, 0, 35, 0, 224, 0, 35, 132, 248, - 66, 54, 78, 177, 115, 104, 35, 240, 4, 3, 115, 96, 148, 249, 70, 38, - 18, 185, 67, 240, 4, 3, 115, 96, 35, 104, 147, 248, 70, 48, 152, 7, - 51, 208, 7, 159, 0, 47, 48, 208, 212, 248, 88, 54, 147, 249, 6, 32, - 81, 28, 37, 209, 186, 120, 147, 249, 5, 48, 2, 240, 3, 2, 147, 66, 3, - 208, 32, 70, 11, 33, 31, 240, 176, 221, 7, 159, 212, 248, 88, 54, 186, - 120, 219, 121, 194, 243, 128, 2, 147, 66, 3, 208, 32, 70, 13, 33, 31, - 240, 163, 221, 7, 159, 212, 248, 88, 54, 186, 120, 155, 122, 194, 243, - 0, 18, 147, 66, 9, 208, 32, 70, 16, 33, 31, 240, 150, 221, 4, 224, 1, - 42, 12, 191, 3, 34, 0, 34, 90, 113, 212, 248, 92, 1, 180, 248, 38, 22, - 64, 240, 104, 216, 144, 177, 212, 248, 92, 1, 180, 248, 38, 22, 63, - 240, 161, 220, 35, 107, 24, 105, 11, 240, 159, 251, 180, 248, 38, 54, - 131, 66, 4, 209, 0, 33, 32, 70, 10, 70, 30, 240, 138, 216, 0, 46, 66, - 208, 115, 104, 91, 6, 64, 241, 39, 129, 11, 159, 22, 151, 12, 159, 23, - 151, 6, 224, 32, 70, 57, 70, 22, 170, 23, 171, 29, 240, 91, 219, 64, - 185, 22, 152, 23, 153, 221, 34, 252, 243, 5, 244, 7, 70, 0, 40, 240, - 209, 10, 225, 187, 121, 1, 43, 64, 240, 14, 129, 148, 248, 12, 34, 59, - 122, 83, 64, 24, 7, 0, 240, 7, 129, 4, 245, 0, 121, 9, 241, 6, 8, 64, - 70, 185, 28, 24, 34, 252, 243, 75, 240, 35, 104, 147, 248, 48, 48, 0, - 43, 0, 240, 244, 128, 212, 248, 52, 119, 67, 70, 7, 245, 99, 119, 9, - 241, 30, 9, 24, 104, 89, 104, 58, 70, 3, 194, 8, 51, 75, 69, 23, 70, - 247, 209, 227, 224, 32, 70, 11, 153, 12, 154, 16, 240, 122, 217, 1, - 40, 2, 209, 32, 70, 13, 240, 11, 223, 186, 241, 0, 15, 0, 240, 231, - 128, 148, 248, 109, 53, 0, 43, 64, 240, 226, 128, 32, 70, 81, 70, 23, - 240, 204, 221, 220, 224, 0, 43, 120, 209, 13, 159, 31, 185, 17, 159, - 199, 243, 64, 21, 0, 224, 1, 37, 237, 178, 158, 177, 115, 104, 21, 177, - 67, 240, 4, 3, 1, 224, 35, 240, 4, 3, 115, 96, 12, 153, 0, 35, 101, - 74, 11, 152, 0, 147, 28, 240, 201, 217, 49, 70, 2, 70, 32, 70, 31, 240, - 2, 220, 35, 107, 91, 125, 251, 177, 25, 155, 0, 43, 14, 221, 24, 155, - 26, 120, 81, 7, 3, 213, 212, 248, 88, 38, 4, 33, 17, 97, 27, 120, 154, - 7, 3, 213, 212, 248, 88, 54, 4, 34, 90, 98, 13, 159, 31, 185, 212, 248, - 88, 54, 4, 34, 218, 97, 29, 185, 212, 248, 88, 54, 4, 34, 218, 96, 32, - 70, 37, 240, 11, 216, 35, 104, 147, 248, 70, 48, 155, 7, 0, 240, 149, - 128, 7, 159, 71, 177, 187, 120, 3, 240, 3, 3, 3, 43, 3, 209, 212, 248, - 88, 54, 4, 34, 154, 98, 187, 241, 0, 15, 24, 208, 155, 248, 1, 16, 155, - 248, 0, 48, 180, 248, 38, 38, 67, 234, 1, 35, 223, 6, 3, 212, 212, 248, - 88, 22, 4, 32, 72, 99, 152, 7, 8, 212, 2, 244, 64, 99, 179, 245, 64, - 111, 3, 209, 212, 248, 88, 54, 4, 34, 26, 99, 7, 159, 47, 185, 13, 159, - 31, 177, 212, 248, 88, 54, 4, 34, 90, 97, 32, 70, 37, 240, 133, 216, - 97, 224, 148, 248, 87, 53, 0, 43, 93, 208, 15, 159, 0, 47, 90, 208, - 17, 159, 185, 7, 87, 213, 11, 152, 12, 153, 0, 34, 252, 243, 53, 243, - 3, 70, 0, 40, 79, 208, 32, 70, 153, 28, 90, 120, 57, 240, 129, 217, - 5, 70, 0, 40, 71, 208, 131, 124, 0, 43, 68, 209, 14, 153, 18, 154, 22, - 240, 199, 219, 0, 40, 62, 208, 39, 159, 213, 248, 208, 98, 0, 151, 40, - 159, 32, 70, 1, 151, 38, 159, 14, 153, 7, 241, 16, 2, 1, 35, 2, 150, - 254, 247, 228, 253, 2, 70, 0, 40, 44, 209, 33, 107, 212, 248, 96, 54, - 80, 49, 6, 241, 56, 0, 155, 120, 74, 240, 102, 223, 40, 159, 40, 70, - 14, 153, 18, 154, 39, 155, 0, 151, 52, 240, 70, 218, 26, 224, 79, 240, - 0, 10, 18, 228, 79, 240, 0, 10, 208, 70, 16, 228, 2, 35, 132, 248, 14, - 50, 40, 70, 1, 33, 27, 240, 97, 222, 0, 35, 12, 153, 11, 152, 6, 74, - 0, 147, 28, 240, 12, 217, 49, 70, 2, 70, 32, 70, 31, 240, 69, 219, 10, - 231, 29, 176, 189, 232, 240, 143, 0, 191, 181, 183, 1, 0, 45, 233, 240, - 79, 23, 105, 193, 176, 215, 248, 216, 130, 4, 70, 139, 70, 146, 70, - 216, 248, 44, 0, 216, 248, 48, 16, 0, 34, 15, 147, 252, 243, 203, 242, - 32, 177, 129, 28, 64, 120, 16, 145, 13, 144, 5, 224, 155, 248, 8, 48, - 11, 241, 9, 2, 16, 146, 13, 147, 0, 33, 40, 34, 34, 168, 251, 243, 124, - 247, 0, 33, 40, 34, 44, 168, 251, 243, 119, 247, 216, 248, 48, 16, 1, - 34, 216, 248, 44, 0, 252, 243, 174, 242, 216, 248, 48, 16, 5, 70, 50, - 34, 216, 248, 44, 0, 252, 243, 166, 242, 6, 70, 61, 177, 106, 120, 16, - 42, 4, 216, 35, 168, 169, 28, 34, 146, 251, 243, 250, 246, 62, 177, - 114, 120, 16, 42, 4, 216, 45, 168, 177, 28, 44, 146, 251, 243, 241, - 246, 187, 248, 6, 48, 217, 7, 11, 213, 33, 107, 75, 125, 67, 177, 10, - 109, 35, 168, 84, 49, 34, 146, 251, 243, 228, 246, 0, 35, 44, 147, 8, - 224, 44, 171, 0, 147, 32, 70, 57, 70, 11, 241, 56, 2, 34, 171, 31, 240, - 66, 222, 183, 248, 98, 80, 216, 248, 44, 96, 181, 245, 128, 111, 216, - 248, 48, 144, 94, 208, 181, 245, 0, 111, 91, 208, 48, 70, 73, 70, 253, - 243, 118, 240, 9, 144, 24, 177, 65, 120, 0, 38, 8, 145, 10, 224, 48, - 70, 73, 70, 48, 34, 252, 243, 95, 242, 6, 70, 16, 177, 66, 120, 8, 146, - 0, 224, 8, 144, 128, 45, 10, 208, 3, 216, 16, 45, 7, 208, 64, 45, 4, - 224, 181, 245, 128, 127, 2, 208, 181, 245, 0, 127, 55, 209, 186, 109, - 64, 242, 55, 19, 19, 64, 0, 43, 54, 208, 8, 155, 0, 46, 8, 191, 20, - 35, 64, 45, 8, 147, 28, 208, 0, 33, 7, 145, 58, 224, 22, 38, 6, 251, - 5, 118, 6, 245, 180, 118, 88, 70, 49, 29, 6, 34, 205, 248, 24, 192, - 251, 243, 114, 246, 221, 248, 24, 192, 64, 185, 7, 155, 64, 169, 1, - 235, 131, 2, 10, 54, 1, 51, 66, 248, 184, 108, 7, 147, 1, 53, 5, 224, - 0, 35, 193, 70, 7, 147, 168, 70, 180, 70, 29, 70, 215, 248, 204, 34, - 149, 66, 219, 211, 69, 70, 102, 70, 200, 70, 18, 224, 133, 177, 2, 224, - 0, 38, 9, 150, 8, 150, 186, 109, 64, 242, 55, 19, 19, 64, 8, 154, 0, - 43, 24, 191, 0, 35, 24, 191, 24, 34, 7, 147, 8, 146, 0, 224, 7, 149, - 64, 242, 238, 83, 1, 147, 63, 171, 2, 147, 15, 155, 32, 70, 0, 43, 20, - 191, 32, 33, 0, 33, 90, 70, 7, 241, 194, 3, 205, 248, 0, 176, 28, 240, - 109, 216, 10, 144, 48, 185, 32, 70, 10, 153, 183, 248, 12, 35, 50, 240, - 247, 219, 111, 226, 63, 153, 32, 70, 1, 245, 188, 98, 14, 50, 161, 241, - 24, 3, 11, 145, 12, 146, 57, 70, 90, 70, 17, 147, 254, 247, 166, 251, - 11, 153, 8, 128, 184, 248, 34, 48, 75, 128, 15, 154, 11, 29, 63, 147, - 138, 177, 8, 241, 36, 9, 72, 70, 252, 243, 24, 243, 16, 185, 63, 152, - 73, 70, 2, 224, 63, 152, 7, 241, 214, 1, 6, 34, 251, 243, 30, 246, 63, - 155, 6, 51, 63, 147, 63, 155, 0, 33, 14, 147, 24, 70, 13, 154, 16, 155, - 37, 240, 11, 223, 1, 33, 34, 154, 35, 171, 63, 144, 37, 240, 5, 223, - 8, 153, 129, 70, 63, 144, 0, 41, 0, 240, 132, 128, 134, 177, 7, 154, - 26, 177, 32, 70, 49, 70, 254, 247, 153, 251, 221, 248, 252, 144, 49, - 70, 72, 70, 23, 240, 196, 217, 63, 144, 115, 120, 137, 248, 1, 48, 25, - 224, 128, 45, 10, 208, 3, 216, 16, 45, 7, 208, 64, 45, 4, 224, 181, - 245, 128, 127, 2, 208, 181, 245, 0, 127, 13, 209, 144, 73, 72, 70, 23, - 240, 174, 217, 57, 70, 63, 144, 11, 241, 123, 2, 32, 70, 9, 241, 4, - 3, 19, 240, 19, 216, 78, 70, 128, 45, 10, 208, 3, 216, 16, 45, 7, 208, - 64, 45, 4, 224, 181, 245, 128, 127, 2, 208, 181, 245, 0, 127, 73, 209, - 7, 155, 0, 43, 46, 208, 115, 120, 7, 154, 243, 24, 154, 112, 153, 28, - 19, 10, 75, 112, 115, 120, 13, 241, 68, 12, 2, 51, 115, 112, 63, 155, - 13, 145, 2, 51, 63, 147, 79, 240, 0, 9, 59, 70, 47, 70, 101, 70, 18, - 224, 13, 153, 16, 34, 1, 235, 9, 16, 2, 48, 85, 248, 4, 31, 6, 147, - 251, 243, 170, 245, 114, 120, 9, 241, 1, 9, 16, 50, 114, 112, 63, 154, - 6, 155, 16, 50, 63, 146, 7, 154, 145, 69, 233, 209, 61, 70, 31, 70, - 1, 224, 221, 248, 28, 144, 212, 248, 108, 50, 211, 248, 216, 50, 91, - 104, 2, 43, 14, 209, 185, 241, 0, 15, 11, 208, 0, 34, 0, 146, 1, 146, - 2, 150, 115, 120, 32, 70, 2, 51, 3, 147, 87, 33, 19, 70, 29, 240, 31, - 219, 44, 154, 42, 177, 63, 152, 50, 33, 45, 171, 37, 240, 116, 222, - 63, 144, 67, 70, 216, 248, 44, 96, 184, 70, 31, 70, 26, 224, 114, 120, - 113, 26, 2, 49, 137, 24, 153, 66, 26, 216, 9, 155, 179, 66, 23, 208, - 51, 120, 1, 43, 11, 217, 48, 43, 9, 208, 2, 50, 63, 152, 49, 70, 251, - 243, 98, 245, 115, 120, 63, 154, 2, 51, 211, 24, 63, 147, 115, 120, - 2, 51, 246, 24, 38, 177, 249, 106, 59, 107, 202, 24, 150, 66, 222, 211, - 59, 70, 71, 70, 152, 70, 35, 104, 147, 248, 70, 48, 154, 7, 23, 208, - 218, 248, 4, 48, 219, 3, 19, 213, 34, 107, 56, 70, 19, 104, 101, 50, - 163, 241, 2, 14, 222, 241, 0, 3, 67, 235, 14, 3, 54, 169, 37, 240, 149, - 221, 63, 152, 45, 33, 26, 34, 54, 171, 37, 240, 45, 222, 63, 144, 148, - 248, 101, 54, 51, 177, 4, 245, 204, 97, 63, 152, 4, 49, 23, 240, 245, - 216, 63, 144, 35, 104, 147, 248, 70, 48, 154, 7, 29, 208, 218, 248, - 4, 48, 219, 3, 25, 213, 34, 107, 56, 70, 19, 104, 101, 50, 163, 241, - 2, 14, 222, 241, 0, 3, 67, 235, 14, 3, 54, 169, 37, 240, 110, 221, 12, - 154, 63, 153, 32, 70, 138, 66, 40, 191, 193, 235, 2, 2, 54, 171, 56, - 191, 0, 34, 37, 240, 32, 220, 63, 144, 35, 104, 91, 107, 43, 179, 187, - 248, 6, 48, 91, 7, 33, 213, 3, 34, 61, 168, 28, 73, 251, 243, 251, 244, - 1, 34, 2, 35, 141, 248, 249, 32, 148, 248, 250, 33, 141, 248, 247, 48, - 0, 35, 141, 248, 248, 48, 50, 177, 155, 249, 106, 32, 154, 66, 3, 218, - 148, 248, 10, 55, 0, 224, 19, 70, 141, 248, 250, 48, 63, 152, 221, 33, - 7, 34, 61, 171, 37, 240, 215, 221, 63, 144, 181, 245, 128, 111, 2, 208, - 181, 245, 0, 111, 7, 209, 215, 248, 44, 53, 0, 43, 43, 208, 63, 152, - 215, 248, 40, 21, 4, 224, 8, 155, 43, 179, 9, 153, 73, 177, 63, 152, - 23, 240, 147, 216, 63, 144, 30, 224, 0, 191, 204, 210, 133, 0, 193, - 183, 1, 0, 64, 45, 23, 208, 128, 45, 21, 208, 16, 45, 19, 208, 181, - 245, 128, 127, 16, 208, 181, 245, 0, 127, 13, 208, 63, 158, 114, 73, - 48, 70, 23, 240, 123, 216, 57, 70, 63, 144, 11, 241, 107, 2, 32, 70, - 6, 241, 8, 3, 18, 240, 224, 222, 107, 30, 155, 178, 1, 43, 3, 217, 4, - 45, 1, 208, 8, 45, 10, 209, 219, 248, 100, 0, 0, 40, 51, 208, 187, 248, - 104, 16, 12, 48, 12, 57, 252, 243, 68, 246, 22, 224, 128, 45, 10, 208, - 3, 216, 16, 45, 7, 208, 64, 45, 4, 224, 181, 245, 128, 127, 2, 208, - 181, 245, 0, 127, 31, 209, 219, 248, 100, 0, 224, 177, 187, 248, 104, - 16, 12, 48, 12, 57, 48, 34, 252, 243, 32, 240, 160, 177, 212, 248, 108, - 50, 211, 248, 216, 50, 91, 104, 2, 43, 13, 209, 67, 120, 16, 43, 10, - 217, 2, 51, 0, 34, 2, 144, 3, 147, 32, 70, 87, 33, 1, 35, 0, 146, 1, - 146, 29, 240, 4, 218, 187, 109, 88, 7, 1, 213, 4, 35, 12, 224, 153, - 7, 1, 213, 2, 35, 8, 224, 218, 7, 1, 213, 1, 35, 4, 224, 19, 244, 128, - 115, 24, 191, 79, 244, 128, 115, 202, 248, 64, 48, 35, 104, 147, 248, - 70, 48, 157, 7, 42, 208, 218, 248, 64, 48, 1, 59, 1, 43, 9, 216, 218, - 248, 4, 48, 88, 3, 5, 213, 32, 70, 81, 70, 6, 34, 36, 240, 213, 218, - 27, 224, 218, 248, 4, 48, 89, 3, 23, 213, 81, 70, 6, 34, 32, 70, 36, - 240, 111, 218, 32, 70, 22, 240, 156, 220, 1, 40, 1, 70, 12, 209, 212, - 248, 248, 55, 32, 70, 26, 136, 66, 242, 14, 115, 1, 58, 146, 178, 154, - 66, 152, 191, 0, 33, 40, 240, 206, 220, 12, 154, 63, 155, 56, 70, 154, - 66, 44, 191, 195, 235, 2, 2, 0, 34, 0, 146, 32, 34, 1, 146, 0, 33, 79, - 240, 255, 50, 4, 240, 135, 251, 14, 153, 63, 144, 64, 26, 0, 35, 3, - 145, 4, 144, 57, 70, 85, 34, 32, 70, 0, 147, 1, 147, 2, 147, 22, 240, - 216, 217, 63, 157, 17, 154, 10, 155, 216, 248, 52, 16, 173, 26, 157, - 130, 33, 177, 96, 104, 216, 248, 56, 32, 0, 240, 181, 218, 24, 61, 96, - 104, 41, 70, 0, 240, 160, 218, 200, 248, 52, 0, 64, 177, 15, 153, 200, - 248, 56, 80, 136, 248, 60, 16, 42, 70, 11, 153, 251, 243, 232, 243, - 187, 248, 98, 48, 32, 70, 195, 243, 64, 19, 0, 147, 0, 35, 1, 147, 2, - 147, 212, 248, 4, 40, 10, 153, 83, 70, 31, 240, 175, 217, 10, 154, 0, - 40, 8, 191, 0, 34, 10, 146, 10, 152, 65, 176, 189, 232, 240, 143, 226, - 210, 133, 0, 45, 233, 240, 65, 3, 104, 4, 70, 147, 248, 63, 48, 197, - 104, 19, 177, 176, 248, 38, 102, 2, 224, 252, 247, 222, 254, 6, 70, - 0, 34, 32, 105, 49, 70, 4, 240, 47, 250, 86, 33, 32, 105, 54, 240, 11, - 223, 212, 248, 136, 49, 64, 0, 0, 43, 196, 248, 4, 5, 6, 218, 32, 105, - 178, 33, 54, 240, 0, 223, 64, 0, 196, 248, 8, 5, 162, 33, 32, 105, 54, - 240, 249, 222, 64, 0, 196, 248, 236, 7, 32, 70, 21, 240, 187, 219, 148, - 248, 205, 49, 51, 185, 32, 105, 76, 33, 54, 240, 236, 222, 192, 9, 132, - 248, 205, 1, 32, 70, 32, 240, 20, 217, 32, 70, 64, 240, 229, 221, 0, - 39, 227, 25, 211, 248, 76, 130, 184, 241, 0, 15, 5, 208, 64, 70, 34, - 240, 195, 218, 64, 70, 34, 240, 182, 216, 4, 55, 32, 47, 240, 209, 35, - 104, 147, 248, 63, 48, 147, 177, 0, 35, 226, 24, 210, 248, 76, 2, 80, - 177, 2, 121, 66, 177, 208, 248, 212, 50, 219, 141, 27, 4, 197, 248, - 136, 49, 34, 240, 226, 220, 2, 224, 4, 51, 32, 43, 237, 209, 32, 70, - 49, 70, 12, 240, 48, 220, 32, 70, 116, 33, 180, 248, 122, 37, 37, 240, - 140, 220, 148, 248, 209, 33, 66, 242, 16, 115, 0, 42, 12, 191, 26, 70, - 79, 244, 188, 98, 32, 70, 130, 33, 37, 240, 127, 220, 35, 107, 148, - 248, 209, 17, 24, 105, 11, 240, 37, 253, 1, 34, 19, 70, 180, 248, 120, - 23, 32, 70, 13, 240, 232, 221, 1, 35, 180, 248, 122, 23, 0, 34, 32, - 70, 13, 240, 225, 221, 212, 248, 64, 1, 40, 240, 93, 223, 32, 70, 254, - 247, 206, 252, 35, 104, 91, 107, 91, 177, 181, 248, 136, 54, 212, 248, - 108, 2, 155, 178, 67, 240, 4, 3, 165, 248, 136, 54, 0, 33, 27, 240, - 59, 218, 32, 70, 252, 247, 12, 253, 212, 248, 132, 17, 97, 185, 32, - 70, 31, 240, 18, 220, 5, 4, 196, 248, 132, 81, 32, 70, 2, 33, 31, 240, - 11, 220, 40, 67, 196, 248, 132, 1, 35, 104, 147, 248, 161, 48, 1, 43, - 3, 209, 212, 248, 64, 1, 42, 240, 27, 216, 32, 70, 27, 240, 76, 219, - 32, 70, 11, 240, 59, 223, 180, 248, 92, 23, 32, 70, 32, 240, 210, 216, - 32, 70, 19, 240, 137, 221, 0, 35, 132, 248, 68, 48, 69, 74, 227, 104, - 195, 248, 220, 35, 1, 35, 132, 248, 168, 49, 132, 248, 170, 49, 35, - 104, 147, 248, 56, 48, 27, 185, 37, 70, 38, 70, 0, 39, 17, 224, 255, - 35, 132, 248, 149, 56, 132, 248, 150, 56, 132, 248, 151, 56, 132, 248, - 152, 56, 132, 248, 153, 56, 132, 248, 154, 56, 132, 248, 155, 56, 132, - 248, 156, 56, 233, 231, 7, 245, 64, 113, 32, 70, 31, 240, 198, 219, - 182, 248, 32, 50, 25, 7, 6, 209, 35, 240, 15, 3, 0, 240, 15, 2, 19, - 67, 166, 248, 32, 50, 182, 248, 32, 50, 19, 240, 240, 15, 6, 209, 35, - 240, 240, 3, 0, 240, 240, 2, 19, 67, 166, 248, 32, 50, 182, 248, 32, - 50, 19, 244, 112, 111, 6, 209, 35, 244, 112, 99, 0, 244, 112, 98, 19, - 67, 166, 248, 32, 50, 182, 248, 32, 50, 26, 11, 8, 209, 27, 5, 32, 244, - 126, 96, 27, 13, 32, 240, 31, 0, 24, 67, 166, 248, 32, 2, 2, 55, 2, - 54, 8, 47, 198, 209, 35, 104, 32, 70, 147, 249, 76, 16, 14, 240, 240, - 221, 35, 104, 26, 126, 250, 177, 147, 248, 47, 48, 227, 177, 4, 241, - 32, 7, 213, 248, 76, 98, 110, 177, 179, 121, 91, 177, 35, 104, 147, - 248, 56, 48, 43, 177, 32, 70, 214, 248, 76, 21, 0, 34, 57, 240, 109, - 217, 0, 35, 243, 113, 4, 53, 189, 66, 235, 209, 0, 35, 132, 248, 114, - 50, 212, 248, 52, 7, 46, 240, 67, 217, 212, 248, 104, 1, 4, 33, 189, - 232, 240, 65, 77, 240, 138, 157, 128, 150, 152, 0, 45, 233, 243, 65, - 8, 156, 7, 70, 14, 70, 21, 70, 152, 70, 0, 148, 8, 240, 58, 255, 16, - 241, 23, 15, 9, 209, 56, 70, 49, 70, 42, 70, 67, 70, 8, 148, 2, 176, - 189, 232, 240, 65, 9, 240, 137, 156, 2, 176, 189, 232, 240, 129, 45, - 233, 240, 79, 30, 105, 149, 176, 17, 145, 154, 70, 243, 136, 192, 248, - 120, 40, 157, 178, 6, 149, 5, 240, 12, 8, 149, 136, 147, 70, 5, 240, - 3, 2, 2, 42, 4, 70, 79, 234, 152, 8, 13, 149, 7, 209, 27, 178, 0, 43, - 4, 218, 216, 241, 1, 3, 56, 191, 0, 35, 0, 224, 0, 35, 186, 248, 20, - 144, 219, 178, 12, 147, 169, 241, 10, 9, 155, 0, 184, 241, 0, 15, 3, - 209, 23, 51, 75, 69, 128, 242, 164, 129, 6, 157, 5, 240, 252, 7, 148, - 47, 3, 208, 164, 47, 1, 208, 132, 47, 3, 209, 185, 241, 15, 15, 64, - 243, 151, 129, 179, 122, 19, 240, 1, 3, 10, 147, 9, 209, 32, 70, 6, - 241, 10, 1, 56, 240, 223, 219, 5, 28, 9, 144, 24, 191, 1, 37, 1, 224, - 0, 37, 9, 149, 8, 149, 184, 241, 0, 15, 14, 209, 6, 241, 22, 5, 32, - 70, 41, 70, 56, 240, 170, 219, 7, 144, 80, 185, 41, 70, 32, 70, 56, - 240, 14, 220, 11, 144, 5, 70, 6, 224, 0, 37, 11, 149, 7, 149, 2, 224, - 7, 157, 205, 248, 44, 128, 148, 248, 200, 49, 35, 185, 35, 104, 147, - 248, 44, 32, 50, 185, 38, 224, 32, 70, 89, 70, 82, 70, 0, 35, 15, 240, - 34, 217, 148, 47, 3, 208, 164, 47, 1, 208, 132, 47, 2, 209, 8, 153, - 89, 187, 3, 224, 128, 47, 40, 208, 80, 47, 38, 208, 184, 241, 0, 15, - 64, 240, 236, 131, 8, 154, 2, 187, 6, 241, 10, 0, 251, 243, 167, 246, - 0, 40, 0, 240, 227, 131, 197, 185, 6, 241, 22, 0, 251, 243, 159, 246, - 152, 185, 219, 227, 10, 153, 129, 185, 8, 154, 66, 177, 147, 248, 56, - 32, 90, 177, 184, 241, 0, 15, 8, 209, 61, 185, 9, 153, 41, 185, 211, - 248, 140, 48, 154, 111, 1, 50, 154, 103, 200, 227, 148, 248, 200, 49, - 107, 185, 21, 185, 212, 248, 108, 50, 0, 224, 43, 70, 147, 248, 229, - 32, 42, 177, 32, 70, 89, 70, 82, 70, 155, 104, 15, 240, 221, 216, 184, - 241, 1, 15, 14, 209, 196, 47, 12, 208, 212, 47, 10, 208, 6, 241, 16, - 0, 251, 243, 126, 246, 0, 40, 64, 240, 170, 131, 51, 124, 216, 7, 0, - 241, 166, 131, 218, 248, 16, 48, 178, 29, 6, 51, 202, 248, 16, 48, 35, - 104, 5, 146, 211, 248, 140, 48, 31, 250, 137, 241, 218, 108, 170, 248, - 20, 16, 1, 50, 218, 100, 32, 70, 0, 145, 90, 70, 5, 153, 19, 171, 17, - 240, 43, 220, 48, 177, 35, 104, 211, 248, 140, 48, 218, 111, 1, 50, - 218, 103, 133, 227, 19, 153, 17, 177, 35, 104, 155, 106, 11, 98, 184, - 241, 1, 15, 56, 209, 186, 248, 20, 48, 218, 248, 16, 0, 163, 241, 16, - 5, 170, 248, 20, 80, 12, 157, 0, 241, 16, 2, 202, 248, 16, 32, 53, 177, - 0, 241, 20, 2, 20, 59, 202, 248, 16, 32, 170, 248, 20, 48, 164, 47, - 186, 248, 20, 48, 14, 209, 11, 105, 155, 121, 0, 43, 0, 240, 96, 131, - 145, 248, 223, 48, 0, 43, 0, 240, 91, 131, 32, 70, 6, 154, 47, 240, - 148, 217, 85, 227, 32, 104, 144, 248, 66, 0, 0, 40, 0, 240, 80, 131, - 132, 47, 2, 208, 148, 47, 64, 240, 75, 131, 212, 248, 64, 1, 0, 151, - 40, 240, 123, 219, 68, 227, 187, 248, 22, 48, 10, 154, 3, 244, 255, - 99, 112, 43, 148, 191, 0, 35, 1, 35, 14, 147, 0, 42, 107, 209, 179, - 139, 173, 248, 40, 48, 155, 178, 15, 147, 49, 185, 32, 70, 6, 241, 16, - 1, 14, 154, 78, 240, 42, 221, 19, 144, 6, 155, 19, 244, 0, 99, 16, 147, - 19, 155, 5, 208, 35, 177, 179, 248, 188, 32, 15, 153, 138, 66, 42, 208, - 195, 177, 189, 248, 40, 32, 163, 248, 188, 32, 76, 224, 9, 241, 243, - 8, 4, 235, 200, 8, 64, 70, 251, 243, 228, 245, 128, 185, 6, 241, 16, - 0, 65, 70, 6, 34, 251, 243, 209, 240, 88, 177, 9, 241, 1, 9, 95, 250, - 137, 249, 0, 224, 153, 70, 148, 248, 232, 55, 75, 69, 230, 210, 79, - 240, 0, 8, 16, 155, 131, 177, 184, 241, 0, 15, 16, 208, 184, 248, 6, - 48, 15, 153, 139, 66, 35, 209, 35, 104, 211, 248, 140, 48, 211, 248, - 188, 33, 1, 50, 195, 248, 188, 33, 235, 226, 184, 241, 0, 15, 23, 209, - 148, 248, 232, 55, 6, 241, 16, 1, 3, 241, 243, 8, 4, 235, 200, 8, 1, - 51, 132, 248, 232, 55, 6, 34, 64, 70, 251, 243, 187, 240, 148, 248, - 232, 39, 10, 35, 178, 251, 243, 241, 3, 251, 17, 35, 132, 248, 232, - 55, 189, 248, 40, 48, 168, 248, 6, 48, 8, 153, 89, 177, 7, 154, 74, - 177, 171, 121, 59, 185, 213, 248, 228, 50, 27, 122, 27, 177, 40, 70, - 6, 153, 16, 240, 104, 218, 186, 248, 20, 16, 218, 248, 16, 48, 161, - 241, 24, 2, 170, 248, 20, 32, 12, 154, 3, 241, 24, 9, 202, 248, 16, - 144, 50, 177, 3, 241, 28, 9, 28, 57, 202, 248, 16, 144, 170, 248, 20, - 16, 13, 153, 6, 154, 193, 243, 192, 19, 81, 4, 186, 248, 20, 128, 13, - 213, 184, 241, 7, 15, 6, 220, 35, 104, 211, 248, 140, 48, 90, 110, 1, - 50, 90, 102, 151, 226, 176, 47, 64, 240, 149, 130, 39, 224, 80, 47, - 121, 208, 16, 216, 32, 47, 0, 240, 95, 130, 6, 216, 0, 47, 0, 240, 91, - 130, 16, 47, 64, 240, 135, 130, 65, 224, 48, 47, 63, 208, 64, 47, 64, - 240, 129, 130, 79, 224, 176, 47, 13, 208, 5, 216, 128, 47, 123, 208, - 160, 47, 64, 240, 120, 130, 63, 225, 192, 47, 0, 240, 147, 129, 208, - 47, 64, 240, 113, 130, 95, 226, 184, 241, 5, 15, 64, 243, 102, 130, - 0, 45, 0, 240, 105, 130, 170, 121, 154, 177, 42, 121, 0, 42, 0, 240, - 99, 130, 205, 248, 0, 128, 1, 147, 187, 248, 16, 48, 212, 248, 52, 7, - 3, 240, 8, 3, 2, 147, 41, 70, 5, 154, 75, 70, 2, 240, 114, 251, 82, - 226, 212, 248, 64, 37, 146, 249, 52, 32, 0, 42, 0, 240, 76, 130, 0, - 147, 40, 70, 5, 153, 74, 70, 67, 70, 50, 240, 82, 216, 67, 226, 184, - 241, 5, 15, 64, 243, 58, 130, 0, 45, 0, 240, 61, 130, 171, 121, 0, 43, - 64, 240, 57, 130, 19, 155, 40, 70, 0, 147, 5, 153, 74, 70, 67, 70, 49, - 240, 252, 221, 47, 226, 35, 104, 147, 248, 149, 48, 35, 185, 148, 248, - 114, 50, 0, 43, 0, 240, 39, 130, 8, 241, 24, 2, 5, 157, 0, 35, 3, 146, - 32, 70, 44, 33, 6, 241, 16, 2, 0, 147, 1, 147, 2, 149, 28, 240, 150, - 221, 23, 226, 184, 241, 11, 15, 64, 243, 14, 130, 212, 248, 104, 49, - 155, 121, 0, 43, 0, 240, 14, 130, 8, 157, 0, 45, 0, 240, 10, 130, 32, - 70, 89, 70, 50, 70, 5, 155, 205, 248, 0, 144, 205, 248, 4, 128, 253, - 247, 205, 255, 254, 225, 184, 241, 11, 15, 64, 243, 245, 129, 5, 153, - 51, 70, 141, 232, 2, 2, 32, 70, 7, 153, 90, 70, 205, 248, 8, 128, 254, - 247, 53, 251, 212, 248, 104, 49, 155, 121, 75, 177, 32, 70, 89, 70, - 50, 70, 5, 155, 205, 248, 0, 144, 205, 248, 4, 128, 253, 247, 175, 255, - 148, 248, 114, 50, 91, 187, 185, 248, 10, 48, 218, 7, 39, 213, 32, 70, - 73, 70, 66, 70, 22, 240, 5, 220, 8, 187, 187, 248, 22, 112, 7, 244, - 255, 103, 255, 8, 14, 47, 0, 242, 213, 129, 9, 241, 12, 0, 168, 241, - 12, 1, 3, 34, 251, 243, 73, 243, 136, 177, 67, 120, 123, 177, 131, 120, - 187, 66, 12, 209, 34, 107, 16, 105, 4, 147, 10, 240, 184, 250, 4, 155, - 192, 178, 131, 66, 3, 209, 212, 248, 104, 1, 77, 240, 120, 220, 11, - 154, 58, 185, 32, 70, 6, 241, 22, 1, 56, 240, 165, 217, 7, 70, 8, 185, - 77, 224, 11, 159, 186, 121, 0, 42, 73, 209, 215, 248, 220, 18, 215, - 248, 216, 50, 5, 145, 9, 241, 12, 0, 168, 241, 12, 1, 4, 147, 251, 243, - 28, 243, 4, 155, 6, 144, 155, 104, 11, 43, 8, 209, 56, 70, 89, 70, 50, - 70, 75, 70, 205, 248, 0, 128, 51, 240, 87, 218, 13, 224, 34, 104, 146, - 248, 49, 32, 74, 177, 15, 43, 7, 209, 56, 70, 89, 70, 50, 70, 75, 70, - 205, 248, 0, 128, 51, 240, 24, 222, 187, 124, 251, 177, 5, 154, 146, - 248, 90, 48, 219, 177, 212, 248, 104, 1, 6, 153, 1, 34, 77, 240, 222, - 220, 56, 177, 5, 153, 145, 248, 89, 48, 27, 185, 1, 35, 129, 248, 89, - 48, 12, 224, 212, 248, 104, 1, 6, 153, 1, 34, 77, 240, 207, 220, 40, - 185, 5, 154, 146, 248, 89, 48, 11, 177, 130, 248, 89, 0, 7, 155, 0, - 43, 0, 240, 87, 129, 213, 248, 216, 50, 155, 104, 12, 43, 64, 240, 81, - 129, 75, 70, 40, 70, 89, 70, 50, 70, 35, 240, 254, 217, 40, 70, 0, 33, - 49, 240, 200, 219, 35, 104, 147, 248, 47, 48, 35, 177, 212, 248, 52, - 7, 45, 240, 238, 221, 61, 225, 213, 248, 228, 50, 40, 70, 153, 120, - 9, 240, 70, 249, 54, 225, 184, 241, 1, 15, 64, 243, 45, 129, 0, 45, - 0, 240, 48, 129, 171, 121, 185, 248, 0, 112, 75, 187, 32, 70, 19, 153, - 31, 240, 57, 223, 19, 152, 3, 126, 155, 7, 19, 213, 2, 33, 77, 240, - 102, 223, 19, 155, 26, 126, 18, 240, 8, 2, 11, 209, 32, 70, 41, 70, - 6, 241, 16, 3, 0, 151, 1, 146, 205, 248, 8, 144, 205, 248, 12, 128, - 9, 240, 207, 250, 7, 153, 0, 41, 0, 240, 12, 129, 213, 248, 216, 50, - 155, 104, 19, 177, 40, 70, 49, 240, 208, 218, 40, 70, 3, 33, 180, 224, - 19, 153, 11, 105, 171, 66, 64, 240, 253, 128, 32, 70, 31, 240, 11, 223, - 19, 152, 3, 126, 153, 7, 16, 213, 18, 33, 77, 240, 56, 223, 0, 34, 32, - 70, 41, 70, 6, 241, 16, 3, 0, 151, 1, 146, 205, 248, 8, 144, 205, 248, - 12, 128, 9, 240, 165, 250, 176, 224, 16, 33, 77, 240, 39, 223, 224, - 224, 184, 241, 1, 15, 64, 243, 215, 128, 45, 185, 9, 154, 0, 42, 0, - 240, 216, 128, 23, 70, 0, 224, 47, 70, 79, 240, 0, 11, 204, 70, 169, - 70, 93, 70, 4, 235, 11, 2, 210, 248, 76, 18, 97, 177, 6, 241, 22, 0, - 188, 49, 6, 34, 205, 248, 16, 192, 250, 243, 136, 246, 221, 248, 16, - 192, 0, 40, 8, 191, 1, 37, 11, 241, 4, 11, 187, 241, 32, 15, 232, 209, - 43, 70, 77, 70, 225, 70, 0, 43, 0, 240, 179, 128, 19, 155, 185, 248, - 0, 176, 51, 185, 32, 70, 6, 241, 16, 1, 14, 154, 78, 240, 166, 218, - 19, 144, 19, 153, 17, 177, 32, 70, 31, 240, 180, 222, 187, 121, 19, - 152, 0, 43, 84, 209, 0, 40, 59, 208, 18, 33, 77, 240, 223, 222, 19, - 152, 3, 126, 218, 7, 2, 212, 67, 104, 155, 0, 49, 213, 1, 33, 77, 240, - 213, 222, 171, 241, 13, 3, 155, 178, 9, 43, 7, 216, 35, 104, 211, 248, - 140, 48, 211, 248, 248, 33, 1, 50, 195, 248, 248, 33, 151, 249, 16, - 48, 2, 43, 3, 209, 248, 104, 14, 33, 82, 240, 82, 217, 19, 155, 26, - 126, 18, 240, 4, 2, 15, 209, 205, 248, 0, 176, 91, 104, 32, 70, 195, - 243, 64, 115, 1, 147, 57, 70, 6, 241, 16, 3, 205, 248, 8, 144, 205, - 248, 12, 128, 50, 240, 123, 216, 19, 155, 90, 104, 34, 240, 0, 82, 90, - 96, 7, 155, 0, 43, 93, 208, 171, 124, 0, 43, 90, 208, 213, 248, 216, - 50, 90, 104, 155, 104, 2, 42, 1, 209, 8, 43, 82, 216, 19, 177, 40, 70, - 49, 240, 26, 218, 40, 70, 2, 33, 52, 240, 58, 216, 73, 224, 0, 40, 71, - 208, 3, 105, 187, 66, 68, 209, 3, 126, 216, 7, 65, 213, 0, 34, 32, 70, - 57, 70, 6, 241, 16, 3, 205, 248, 0, 176, 1, 146, 205, 248, 8, 144, 205, - 248, 12, 128, 50, 240, 73, 216, 32, 70, 19, 153, 78, 240, 53, 218, 46, - 224, 184, 241, 3, 15, 37, 221, 85, 179, 42, 121, 66, 179, 170, 121, - 50, 179, 6, 241, 22, 0, 5, 241, 188, 1, 6, 34, 4, 147, 250, 243, 228, - 245, 4, 155, 224, 185, 19, 154, 2, 147, 1, 146, 212, 248, 52, 7, 41, - 70, 5, 154, 75, 70, 205, 248, 0, 128, 8, 240, 240, 254, 15, 224, 32, - 70, 19, 153, 5, 154, 75, 70, 141, 232, 0, 9, 2, 150, 16, 240, 10, 216, - 5, 224, 35, 104, 211, 248, 140, 48, 26, 111, 1, 50, 26, 103, 17, 152, - 81, 70, 0, 34, 255, 243, 176, 244, 21, 176, 189, 232, 240, 143, 35, - 107, 24, 105, 10, 240, 241, 248, 192, 178, 135, 66, 56, 230, 45, 233, - 240, 79, 6, 70, 146, 248, 42, 48, 16, 104, 13, 70, 155, 176, 20, 70, - 145, 139, 5, 144, 214, 248, 4, 160, 47, 105, 19, 177, 146, 248, 34, - 128, 0, 224, 152, 70, 148, 248, 44, 48, 155, 185, 10, 5, 17, 213, 5, - 235, 72, 2, 178, 248, 172, 0, 180, 248, 126, 32, 144, 66, 9, 209, 51, - 104, 211, 248, 140, 48, 211, 248, 188, 33, 1, 50, 195, 248, 188, 33, - 0, 240, 121, 188, 186, 121, 193, 243, 128, 43, 18, 187, 215, 248, 228, - 146, 153, 248, 8, 32, 106, 177, 99, 185, 187, 241, 0, 15, 9, 209, 149, - 248, 210, 32, 99, 106, 82, 250, 3, 243, 216, 7, 2, 212, 56, 70, 15, - 240, 89, 223, 51, 104, 91, 107, 99, 177, 153, 248, 24, 48, 75, 177, - 148, 248, 42, 48, 51, 177, 148, 248, 40, 48, 27, 177, 56, 70, 0, 33, - 33, 240, 143, 218, 35, 140, 90, 7, 0, 241, 78, 132, 163, 139, 3, 244, - 128, 67, 99, 99, 99, 185, 187, 109, 64, 242, 55, 25, 3, 234, 9, 9, 185, - 241, 0, 15, 39, 208, 151, 248, 96, 144, 185, 241, 0, 15, 34, 208, 79, - 240, 0, 9, 196, 248, 56, 144, 48, 70, 81, 70, 42, 70, 35, 70, 205, 248, - 0, 128, 79, 240, 43, 219, 112, 185, 99, 107, 35, 177, 213, 248, 108, - 49, 1, 51, 197, 248, 108, 49, 51, 104, 147, 248, 149, 48, 0, 43, 0, - 240, 34, 132, 79, 240, 1, 9, 99, 107, 35, 177, 213, 248, 104, 49, 1, - 51, 197, 248, 104, 49, 148, 248, 44, 48, 67, 185, 8, 241, 84, 3, 180, - 248, 126, 16, 5, 235, 67, 3, 154, 136, 153, 128, 0, 224, 0, 34, 51, - 104, 2, 147, 147, 248, 149, 48, 27, 177, 185, 241, 0, 15, 64, 240, 3, - 132, 148, 248, 44, 48, 0, 43, 64, 240, 41, 129, 180, 248, 126, 192, - 8, 241, 26, 9, 28, 240, 15, 3, 64, 240, 138, 128, 5, 235, 137, 9, 217, - 248, 4, 16, 121, 177, 26, 70, 80, 70, 3, 147, 255, 243, 239, 243, 3, - 155, 5, 235, 136, 2, 194, 248, 140, 48, 8, 241, 76, 2, 201, 248, 4, - 48, 69, 248, 34, 48, 187, 241, 0, 15, 0, 240, 8, 129, 227, 104, 8, 241, - 26, 9, 4, 147, 99, 105, 5, 235, 137, 9, 201, 248, 4, 48, 24, 105, 154, - 138, 49, 104, 211, 248, 12, 192, 155, 104, 0, 235, 2, 14, 201, 105, - 206, 235, 12, 14, 192, 26, 137, 104, 134, 68, 114, 68, 138, 66, 34, - 218, 80, 70, 255, 243, 243, 243, 201, 248, 4, 0, 0, 40, 0, 240, 187, - 131, 99, 105, 0, 105, 153, 104, 26, 105, 155, 138, 82, 26, 210, 24, - 250, 243, 225, 244, 97, 105, 10, 105, 139, 104, 210, 26, 217, 248, 4, - 48, 24, 105, 128, 24, 24, 97, 152, 138, 130, 26, 154, 130, 136, 138, - 0, 34, 152, 130, 80, 70, 255, 243, 163, 243, 50, 104, 4, 153, 210, 105, - 5, 235, 136, 3, 146, 104, 164, 72, 82, 26, 214, 248, 40, 24, 6, 58, - 82, 26, 195, 248, 140, 32, 97, 104, 8, 34, 250, 243, 161, 244, 80, 177, - 158, 72, 97, 104, 6, 34, 250, 243, 155, 244, 64, 185, 99, 104, 219, - 136, 179, 245, 64, 127, 3, 209, 107, 104, 67, 240, 8, 3, 2, 224, 107, - 104, 35, 240, 8, 3, 107, 96, 150, 72, 97, 104, 8, 34, 250, 243, 136, - 244, 171, 104, 16, 185, 67, 240, 32, 3, 1, 224, 35, 240, 32, 3, 171, - 96, 150, 224, 5, 235, 137, 0, 65, 104, 4, 144, 25, 185, 2, 153, 209, - 248, 140, 48, 31, 224, 130, 234, 12, 12, 60, 240, 15, 12, 4, 209, 2, - 240, 15, 2, 1, 50, 147, 66, 25, 208, 0, 34, 80, 70, 255, 243, 88, 243, - 8, 241, 26, 2, 0, 35, 5, 235, 130, 2, 83, 96, 8, 241, 34, 2, 5, 235, - 130, 2, 8, 241, 76, 8, 83, 96, 69, 248, 40, 48, 51, 104, 211, 248, 140, - 48, 26, 110, 1, 50, 26, 102, 62, 227, 8, 241, 34, 9, 5, 235, 137, 9, - 163, 104, 217, 248, 4, 32, 147, 66, 17, 217, 98, 70, 80, 70, 205, 248, - 12, 192, 255, 243, 51, 243, 221, 248, 12, 192, 4, 154, 8, 241, 76, 8, - 194, 248, 4, 192, 201, 248, 4, 192, 69, 248, 40, 192, 221, 231, 141, - 232, 8, 4, 48, 70, 9, 241, 4, 2, 99, 104, 205, 248, 12, 192, 11, 240, - 125, 220, 221, 248, 12, 192, 80, 70, 97, 105, 98, 70, 255, 243, 22, - 243, 187, 241, 0, 15, 58, 209, 4, 155, 90, 104, 98, 97, 195, 248, 4, - 176, 8, 241, 76, 3, 69, 248, 35, 176, 19, 105, 146, 138, 3, 241, 24, - 1, 201, 248, 4, 176, 97, 96, 162, 241, 24, 1, 161, 96, 148, 248, 41, - 16, 35, 96, 226, 96, 33, 177, 3, 241, 30, 1, 30, 58, 97, 96, 162, 96, - 148, 248, 42, 32, 58, 177, 98, 104, 132, 248, 34, 128, 2, 50, 98, 96, - 162, 104, 2, 58, 162, 96, 26, 120, 91, 120, 66, 234, 3, 35, 163, 131, - 99, 107, 91, 177, 163, 107, 75, 177, 147, 249, 14, 32, 97, 104, 138, - 24, 98, 96, 147, 249, 14, 48, 162, 104, 211, 26, 163, 96, 163, 107, - 115, 177, 27, 122, 4, 43, 3, 209, 48, 70, 33, 70, 79, 240, 117, 218, - 163, 107, 27, 122, 11, 43, 3, 209, 48, 70, 33, 70, 79, 240, 137, 219, - 187, 241, 0, 15, 64, 240, 1, 131, 51, 104, 147, 248, 149, 48, 0, 43, - 82, 208, 187, 104, 155, 121, 219, 7, 0, 241, 213, 130, 76, 224, 0, 244, - 224, 98, 16, 244, 0, 15, 79, 234, 18, 34, 49, 75, 0, 240, 127, 0, 162, - 241, 4, 2, 8, 208, 1, 42, 79, 240, 20, 2, 2, 251, 0, 48, 148, 191, 192, - 104, 128, 104, 9, 224, 1, 42, 79, 240, 20, 2, 3, 216, 2, 251, 0, 48, - 64, 104, 1, 224, 80, 67, 24, 88, 79, 244, 250, 115, 4, 224, 0, 240, - 127, 0, 79, 244, 250, 115, 88, 67, 176, 251, 243, 240, 205, 248, 33, - 0, 79, 240, 1, 11, 13, 241, 39, 0, 33, 104, 24, 34, 141, 248, 38, 176, - 250, 243, 175, 243, 148, 248, 47, 48, 163, 177, 189, 248, 39, 48, 13, - 241, 49, 1, 67, 244, 0, 115, 6, 34, 13, 241, 55, 0, 173, 248, 39, 48, - 250, 243, 159, 243, 214, 248, 108, 18, 13, 241, 49, 0, 188, 49, 6, 34, - 250, 243, 151, 243, 51, 104, 147, 248, 149, 32, 10, 185, 19, 70, 1, - 224, 45, 34, 6, 171, 97, 105, 73, 106, 72, 6, 18, 213, 9, 6, 64, 241, - 89, 130, 0, 146, 214, 248, 60, 1, 41, 70, 34, 70, 41, 240, 237, 217, - 145, 226, 64, 30, 134, 0, 222, 183, 1, 0, 72, 30, 134, 0, 132, 24, 134, - 0, 33, 104, 6, 34, 4, 49, 18, 168, 250, 243, 114, 243, 33, 104, 6, 34, - 10, 49, 20, 168, 250, 243, 108, 243, 33, 104, 22, 168, 16, 49, 6, 34, - 250, 243, 102, 243, 148, 248, 41, 48, 43, 177, 33, 104, 24, 168, 24, - 49, 6, 34, 250, 243, 93, 243, 163, 139, 19, 244, 128, 127, 3, 244, 0, - 115, 4, 209, 18, 170, 98, 103, 35, 177, 22, 171, 5, 224, 22, 170, 98, - 103, 11, 185, 20, 171, 0, 224, 24, 171, 35, 103, 212, 248, 4, 144, 187, - 241, 0, 15, 0, 240, 0, 129, 35, 104, 227, 102, 153, 248, 0, 48, 170, - 43, 48, 209, 153, 248, 1, 48, 170, 43, 44, 209, 153, 248, 2, 48, 3, - 43, 40, 209, 153, 248, 3, 48, 43, 187, 153, 248, 4, 48, 19, 187, 153, - 248, 5, 48, 83, 185, 185, 248, 6, 48, 48, 70, 25, 10, 65, 234, 3, 33, - 137, 178, 10, 240, 205, 223, 96, 177, 20, 224, 248, 43, 18, 209, 185, - 248, 6, 48, 48, 70, 25, 10, 65, 234, 3, 33, 137, 178, 10, 240, 192, - 223, 64, 177, 185, 248, 6, 48, 79, 234, 19, 41, 73, 234, 3, 41, 31, - 250, 137, 249, 1, 224, 180, 248, 8, 144, 51, 104, 147, 248, 149, 48, - 203, 177, 215, 248, 224, 48, 75, 185, 99, 107, 163, 185, 186, 109, 64, - 242, 55, 19, 19, 64, 123, 177, 151, 248, 96, 48, 99, 177, 48, 70, 41, - 70, 58, 70, 35, 70, 205, 248, 0, 144, 205, 248, 4, 128, 12, 240, 249, - 221, 0, 40, 64, 240, 191, 129, 163, 107, 107, 177, 27, 122, 1, 43, 10, - 208, 3, 43, 8, 208, 48, 70, 81, 70, 42, 70, 35, 70, 8, 240, 106, 254, - 0, 40, 0, 240, 175, 129, 99, 111, 27, 120, 216, 7, 7, 213, 51, 104, - 211, 248, 140, 48, 211, 248, 208, 33, 1, 50, 195, 248, 208, 33, 163, - 107, 51, 177, 27, 122, 2, 43, 3, 209, 48, 70, 33, 70, 79, 240, 67, 217, - 99, 107, 27, 185, 148, 248, 42, 32, 26, 185, 33, 224, 163, 107, 147, - 249, 14, 48, 148, 248, 42, 32, 58, 177, 33, 104, 2, 51, 10, 136, 34, - 240, 128, 2, 18, 4, 18, 12, 10, 128, 97, 104, 5, 224, 202, 26, 18, 248, - 1, 44, 1, 248, 1, 44, 113, 70, 98, 105, 1, 241, 255, 62, 16, 105, 112, - 69, 243, 217, 193, 24, 144, 138, 17, 97, 195, 26, 147, 130, 33, 96, - 148, 248, 47, 48, 147, 177, 32, 104, 6, 34, 3, 136, 128, 70, 67, 244, - 0, 115, 40, 248, 10, 59, 65, 70, 16, 48, 250, 243, 146, 242, 214, 248, - 108, 18, 64, 70, 188, 49, 6, 34, 250, 243, 139, 242, 151, 249, 16, 48, - 139, 177, 72, 246, 142, 3, 153, 69, 13, 209, 33, 104, 98, 107, 18, 49, - 0, 50, 24, 191, 1, 34, 248, 104, 7, 241, 24, 3, 81, 240, 143, 218, 0, - 40, 64, 240, 71, 129, 151, 248, 48, 53, 131, 177, 72, 246, 142, 3, 153, - 69, 12, 209, 33, 104, 98, 107, 18, 49, 0, 50, 24, 191, 1, 34, 120, 105, - 43, 70, 7, 240, 234, 248, 0, 40, 64, 240, 51, 129, 99, 105, 154, 138, - 24, 105, 219, 104, 128, 24, 27, 26, 44, 43, 64, 242, 42, 129, 0, 35, - 6, 169, 45, 34, 141, 248, 38, 48, 250, 243, 82, 242, 99, 105, 148, 248, - 34, 16, 218, 138, 1, 240, 7, 1, 34, 240, 7, 2, 10, 67, 218, 130, 148, - 248, 41, 32, 14, 225, 212, 248, 20, 176, 153, 248, 0, 48, 219, 248, - 16, 32, 170, 43, 4, 146, 194, 235, 9, 8, 54, 209, 153, 248, 1, 48, 170, - 43, 50, 209, 153, 248, 2, 48, 3, 43, 46, 209, 153, 248, 3, 48, 91, 187, - 153, 248, 4, 48, 67, 187, 153, 248, 5, 48, 83, 185, 185, 248, 6, 48, - 48, 70, 25, 10, 65, 234, 3, 33, 137, 178, 10, 240, 200, 222, 96, 177, - 26, 224, 248, 43, 24, 209, 185, 248, 6, 48, 48, 70, 25, 10, 65, 234, - 3, 33, 137, 178, 10, 240, 187, 222, 112, 177, 4, 154, 168, 241, 6, 8, - 2, 235, 8, 3, 187, 248, 20, 32, 203, 248, 16, 48, 200, 235, 2, 8, 171, - 248, 20, 128, 227, 102, 38, 224, 187, 109, 153, 6, 18, 213, 72, 70, - 138, 73, 8, 34, 250, 243, 223, 241, 96, 185, 99, 105, 8, 241, 4, 8, - 26, 105, 153, 138, 66, 68, 200, 235, 1, 8, 26, 97, 163, 248, 20, 128, - 226, 102, 16, 224, 99, 105, 168, 241, 14, 8, 153, 138, 26, 105, 66, - 68, 200, 235, 1, 8, 26, 97, 163, 248, 20, 128, 35, 137, 226, 102, 25, - 10, 65, 234, 3, 35, 147, 129, 163, 107, 107, 177, 27, 122, 1, 43, 10, - 208, 3, 43, 8, 208, 48, 70, 81, 70, 42, 70, 35, 70, 8, 240, 88, 253, - 0, 40, 0, 240, 157, 128, 163, 107, 51, 177, 27, 122, 2, 43, 3, 209, - 48, 70, 33, 70, 79, 240, 61, 216, 6, 34, 97, 111, 224, 110, 250, 243, - 190, 241, 224, 110, 6, 34, 6, 48, 33, 111, 250, 243, 184, 241, 99, 105, - 148, 248, 34, 16, 218, 138, 1, 240, 7, 1, 34, 240, 7, 2, 10, 67, 218, - 130, 98, 111, 18, 120, 210, 7, 7, 213, 50, 104, 210, 248, 140, 32, 210, - 248, 208, 17, 1, 49, 194, 248, 208, 17, 151, 248, 97, 32, 114, 177, - 42, 126, 208, 6, 11, 212, 226, 110, 146, 137, 17, 10, 65, 234, 2, 34, - 87, 73, 18, 178, 138, 66, 2, 208, 90, 106, 209, 6, 96, 213, 151, 248, - 101, 32, 154, 177, 42, 126, 210, 6, 16, 212, 226, 110, 146, 137, 17, - 10, 65, 234, 2, 34, 79, 73, 18, 178, 138, 66, 7, 208, 38, 57, 138, 66, - 4, 208, 91, 106, 0, 43, 1, 219, 216, 6, 73, 213, 187, 121, 35, 185, - 215, 248, 228, 50, 1, 34, 131, 248, 42, 32, 150, 248, 50, 56, 1, 51, - 134, 248, 50, 56, 151, 249, 16, 48, 219, 177, 225, 110, 139, 137, 26, - 10, 66, 234, 3, 35, 62, 74, 27, 178, 147, 66, 18, 209, 11, 138, 26, - 10, 66, 234, 3, 35, 162, 104, 155, 178, 12, 58, 147, 66, 40, 216, 98, - 107, 248, 104, 0, 50, 24, 191, 1, 34, 7, 241, 24, 3, 81, 240, 101, 217, - 240, 185, 151, 248, 48, 53, 139, 177, 225, 110, 139, 137, 26, 10, 66, - 234, 3, 35, 46, 74, 27, 178, 147, 66, 8, 209, 98, 107, 120, 105, 0, - 50, 24, 191, 1, 34, 43, 70, 6, 240, 191, 255, 72, 185, 148, 248, 41, - 32, 99, 105, 0, 147, 48, 70, 41, 70, 99, 111, 30, 240, 56, 221, 64, - 224, 51, 104, 90, 107, 170, 177, 97, 105, 35, 72, 202, 138, 211, 248, - 144, 48, 2, 240, 7, 2, 130, 92, 32, 72, 133, 92, 80, 70, 12, 53, 3, - 235, 197, 5, 107, 104, 174, 104, 1, 51, 107, 96, 251, 243, 102, 242, - 128, 25, 168, 96, 80, 70, 97, 105, 0, 34, 254, 243, 229, 247, 33, 224, - 51, 107, 212, 248, 128, 16, 27, 137, 48, 70, 6, 147, 163, 105, 219, - 138, 219, 8, 141, 248, 28, 48, 5, 235, 72, 3, 147, 248, 172, 48, 3, - 240, 15, 3, 1, 51, 141, 248, 37, 48, 27, 240, 10, 222, 5, 155, 205, - 248, 29, 0, 153, 31, 212, 248, 128, 0, 19, 240, 190, 251, 1, 1, 63, - 245, 11, 173, 43, 229, 27, 176, 189, 232, 240, 143, 0, 191, 247, 227, - 133, 0, 142, 136, 255, 255, 180, 136, 255, 255, 196, 210, 133, 0, 152, - 224, 133, 0, 45, 233, 240, 79, 167, 176, 154, 70, 9, 147, 155, 138, - 0, 38, 33, 43, 4, 70, 139, 70, 23, 70, 37, 150, 18, 150, 141, 248, 50, - 96, 13, 150, 141, 248, 59, 96, 141, 248, 56, 96, 141, 248, 112, 96, - 141, 248, 63, 96, 10, 146, 36, 146, 27, 150, 1, 216, 3, 104, 70, 224, - 218, 248, 16, 80, 16, 70, 41, 70, 19, 240, 136, 251, 171, 29, 2, 144, - 4, 147, 234, 136, 147, 178, 3, 244, 64, 113, 173, 248, 44, 32, 161, - 245, 64, 124, 16, 70, 3, 240, 12, 14, 3, 240, 240, 2, 79, 234, 158, - 14, 18, 9, 220, 241, 0, 1, 65, 235, 12, 1, 190, 241, 2, 15, 8, 191, - 214, 8, 246, 178, 173, 248, 46, 224, 173, 248, 48, 32, 141, 248, 57, - 16, 141, 248, 58, 96, 183, 248, 4, 224, 14, 240, 3, 14, 190, 241, 2, - 15, 4, 209, 0, 178, 0, 40, 1, 218, 210, 8, 0, 224, 0, 34, 208, 178, - 141, 248, 59, 0, 0, 41, 20, 191, 40, 34, 34, 34, 6, 177, 2, 50, 0, 177, - 4, 50, 9, 152, 128, 138, 144, 66, 6, 210, 35, 104, 211, 248, 140, 48, - 90, 110, 1, 50, 90, 102, 119, 227, 170, 122, 2, 240, 1, 2, 141, 248, - 60, 32, 33, 177, 79, 240, 0, 8, 141, 248, 64, 128, 19, 224, 216, 5, - 2, 213, 5, 241, 10, 1, 5, 224, 153, 5, 76, 191, 5, 241, 16, 1, 5, 241, - 22, 1, 32, 70, 55, 240, 10, 218, 3, 28, 24, 191, 1, 35, 128, 70, 141, - 248, 64, 48, 157, 248, 60, 48, 67, 185, 4, 153, 32, 70, 4, 49, 55, 240, - 32, 218, 6, 28, 24, 191, 1, 38, 0, 224, 0, 38, 148, 248, 200, 49, 35, - 185, 35, 104, 147, 248, 44, 48, 51, 185, 45, 224, 32, 70, 57, 70, 9, - 154, 0, 35, 13, 240, 127, 223, 35, 104, 147, 248, 63, 32, 10, 185, 141, - 248, 64, 32, 70, 187, 189, 248, 44, 32, 210, 5, 5, 212, 157, 248, 60, - 32, 18, 177, 157, 248, 64, 32, 66, 187, 157, 248, 57, 32, 18, 177, 157, - 248, 60, 32, 10, 187, 147, 248, 44, 48, 0, 43, 0, 240, 34, 131, 157, - 248, 64, 48, 0, 43, 0, 240, 29, 131, 152, 248, 6, 48, 0, 43, 64, 240, - 24, 131, 1, 38, 17, 224, 157, 248, 60, 48, 27, 185, 0, 46, 0, 240, 16, - 131, 0, 224, 78, 177, 157, 248, 57, 96, 46, 185, 157, 248, 64, 48, 0, - 43, 0, 240, 6, 131, 0, 224, 0, 38, 35, 104, 147, 248, 149, 48, 91, 179, - 184, 241, 0, 15, 40, 208, 157, 248, 60, 48, 216, 248, 220, 144, 91, - 185, 25, 240, 1, 15, 0, 240, 244, 130, 4, 152, 8, 241, 194, 1, 4, 48, - 6, 34, 249, 243, 206, 247, 20, 224, 4, 152, 4, 48, 250, 243, 197, 244, - 32, 177, 25, 240, 8, 15, 0, 240, 227, 130, 13, 224, 25, 240, 4, 15, - 10, 209, 25, 240, 2, 15, 0, 240, 219, 130, 32, 70, 4, 153, 13, 240, - 132, 222, 0, 40, 64, 240, 212, 130, 9, 153, 11, 105, 6, 51, 11, 97, - 139, 138, 6, 59, 139, 130, 4, 155, 3, 241, 24, 2, 5, 146, 157, 248, - 57, 32, 10, 177, 30, 51, 5, 147, 0, 35, 141, 248, 61, 48, 157, 248, - 58, 48, 131, 179, 5, 154, 19, 120, 80, 120, 67, 234, 0, 32, 219, 9, - 141, 248, 61, 48, 131, 177, 184, 241, 0, 15, 4, 208, 152, 248, 25, 53, - 0, 43, 64, 240, 173, 130, 148, 248, 207, 49, 0, 43, 0, 240, 168, 130, - 75, 106, 67, 240, 64, 3, 75, 98, 223, 248, 168, 229, 0, 240, 7, 3, 30, - 248, 3, 224, 223, 248, 160, 197, 0, 240, 16, 0, 28, 248, 14, 224, 0, - 17, 2, 50, 141, 248, 50, 48, 205, 248, 52, 224, 141, 248, 56, 0, 5, - 146, 141, 248, 112, 48, 157, 248, 61, 48, 27, 185, 139, 138, 4, 59, - 139, 130, 5, 224, 88, 70, 250, 243, 70, 245, 131, 138, 4, 59, 131, 130, - 9, 154, 5, 153, 147, 138, 18, 105, 7, 147, 194, 235, 1, 8, 200, 235, - 3, 3, 81, 70, 88, 70, 6, 147, 251, 243, 189, 240, 4, 153, 200, 235, - 0, 0, 8, 144, 139, 125, 202, 125, 67, 234, 2, 35, 173, 248, 142, 48, - 62, 187, 7, 155, 32, 70, 0, 147, 58, 70, 37, 171, 16, 240, 25, 218, - 0, 40, 64, 240, 93, 130, 125, 226, 250, 138, 4, 153, 2, 244, 255, 98, - 10, 49, 112, 42, 32, 70, 148, 191, 0, 34, 1, 34, 77, 240, 131, 220, - 37, 144, 48, 185, 35, 104, 211, 248, 140, 48, 218, 110, 1, 50, 218, - 102, 70, 226, 3, 105, 211, 248, 204, 48, 195, 243, 192, 19, 141, 248, - 63, 48, 24, 224, 189, 248, 44, 48, 19, 244, 64, 127, 19, 208, 157, 248, - 57, 48, 131, 185, 37, 155, 115, 185, 250, 138, 10, 49, 2, 244, 255, - 98, 112, 42, 32, 70, 148, 191, 0, 34, 1, 34, 77, 240, 93, 220, 37, 144, - 0, 40, 0, 240, 38, 130, 37, 155, 211, 248, 16, 128, 216, 248, 220, 50, - 3, 147, 30, 187, 157, 248, 57, 48, 3, 187, 157, 248, 60, 48, 27, 177, - 189, 248, 44, 48, 216, 5, 18, 212, 152, 248, 6, 32, 189, 248, 44, 48, - 18, 177, 217, 5, 11, 213, 17, 224, 152, 248, 18, 32, 3, 244, 64, 115, - 0, 42, 20, 191, 79, 244, 0, 114, 0, 34, 147, 66, 6, 208, 35, 104, 211, - 248, 140, 48, 154, 109, 1, 50, 154, 101, 250, 225, 148, 248, 45, 55, - 43, 185, 157, 248, 63, 48, 19, 185, 152, 248, 6, 32, 66, 185, 32, 70, - 57, 70, 27, 240, 251, 219, 129, 70, 24, 177, 138, 248, 45, 0, 0, 224, - 153, 70, 152, 248, 6, 48, 11, 187, 157, 248, 63, 48, 243, 185, 73, 70, - 64, 70, 27, 240, 45, 220, 64, 70, 27, 240, 130, 219, 57, 70, 32, 70, - 15, 240, 120, 220, 1, 70, 64, 70, 14, 240, 218, 219, 157, 248, 64, 48, - 99, 177, 152, 248, 18, 48, 75, 177, 152, 248, 7, 48, 51, 177, 3, 152, - 67, 121, 27, 185, 64, 70, 1, 33, 51, 240, 206, 216, 148, 248, 45, 55, - 51, 185, 157, 248, 63, 48, 27, 185, 37, 155, 211, 248, 252, 48, 131, - 177, 185, 241, 0, 15, 13, 208, 37, 155, 211, 248, 248, 16, 211, 248, - 244, 32, 66, 248, 33, 144, 211, 248, 248, 32, 1, 50, 2, 240, 7, 2, 195, - 248, 248, 32, 157, 248, 57, 48, 35, 177, 184, 248, 98, 32, 173, 248, - 120, 32, 54, 224, 152, 248, 6, 48, 37, 153, 0, 43, 46, 208, 139, 143, - 173, 248, 120, 48, 75, 104, 90, 6, 27, 213, 157, 248, 58, 32, 194, 177, - 4, 154, 210, 138, 16, 7, 20, 209, 145, 248, 223, 32, 138, 177, 138, - 126, 210, 7, 14, 212, 189, 248, 44, 32, 208, 4, 10, 213, 154, 3, 8, - 213, 13, 154, 145, 248, 209, 48, 19, 65, 219, 7, 2, 213, 32, 70, 45, - 240, 32, 219, 189, 248, 44, 48, 19, 244, 128, 95, 37, 155, 90, 104, - 20, 191, 66, 244, 0, 50, 34, 244, 0, 50, 90, 96, 2, 224, 137, 143, 173, - 248, 120, 16, 148, 248, 45, 55, 27, 185, 37, 155, 211, 248, 252, 48, - 131, 177, 185, 241, 0, 15, 13, 208, 37, 155, 211, 248, 248, 16, 211, - 248, 244, 32, 66, 248, 33, 144, 211, 248, 248, 32, 1, 50, 2, 240, 7, - 2, 195, 248, 248, 32, 37, 155, 211, 248, 124, 49, 91, 177, 211, 248, - 8, 38, 2, 152, 3, 235, 130, 1, 1, 50, 2, 240, 63, 2, 193, 248, 12, 6, - 195, 248, 8, 38, 152, 248, 6, 48, 75, 185, 152, 248, 18, 48, 51, 177, - 157, 248, 60, 48, 27, 185, 22, 185, 3, 155, 158, 113, 222, 113, 157, - 248, 60, 48, 11, 179, 152, 248, 6, 48, 0, 43, 64, 240, 44, 129, 152, - 248, 18, 48, 75, 177, 33, 104, 4, 152, 78, 49, 16, 48, 6, 34, 249, 243, - 3, 246, 0, 40, 0, 240, 31, 129, 4, 152, 4, 48, 250, 243, 248, 242, 80, - 185, 35, 104, 147, 248, 62, 48, 51, 185, 32, 70, 4, 153, 13, 240, 191, - 220, 0, 40, 64, 240, 15, 129, 2, 152, 157, 248, 60, 48, 202, 248, 56, - 0, 91, 185, 43, 120, 106, 120, 26, 67, 171, 120, 19, 67, 5, 208, 212, - 248, 96, 1, 2, 153, 122, 138, 74, 240, 18, 222, 218, 248, 56, 32, 18, - 240, 0, 103, 31, 208, 2, 244, 224, 96, 79, 234, 16, 32, 18, 244, 0, - 15, 143, 75, 2, 240, 127, 1, 160, 241, 4, 0, 8, 208, 1, 40, 79, 240, - 20, 0, 0, 251, 1, 51, 148, 191, 219, 104, 155, 104, 12, 224, 1, 40, - 79, 240, 20, 0, 3, 216, 0, 251, 1, 51, 91, 104, 4, 224, 65, 67, 91, - 88, 1, 224, 2, 240, 127, 3, 130, 73, 11, 96, 149, 249, 3, 48, 0, 43, - 7, 218, 35, 104, 211, 248, 140, 48, 211, 248, 216, 18, 1, 49, 195, 248, - 216, 18, 235, 120, 3, 240, 48, 3, 16, 43, 7, 209, 35, 104, 211, 248, - 140, 48, 211, 248, 224, 18, 1, 49, 195, 248, 224, 18, 157, 248, 60, - 48, 0, 43, 64, 240, 140, 128, 35, 104, 211, 248, 140, 48, 255, 177, - 2, 244, 224, 96, 18, 244, 0, 15, 79, 234, 16, 32, 108, 73, 2, 240, 127, - 2, 160, 241, 4, 0, 8, 208, 1, 40, 79, 240, 20, 0, 0, 251, 2, 18, 148, - 191, 210, 104, 146, 104, 12, 224, 1, 40, 79, 240, 20, 0, 3, 216, 0, - 251, 2, 18, 82, 104, 4, 224, 66, 67, 138, 88, 1, 224, 2, 240, 127, 2, - 22, 42, 58, 208, 12, 216, 11, 42, 37, 208, 4, 216, 2, 42, 22, 208, 4, - 42, 91, 209, 25, 224, 12, 42, 35, 208, 18, 42, 86, 209, 38, 224, 48, - 42, 60, 208, 4, 216, 24, 42, 45, 208, 36, 42, 78, 209, 48, 224, 96, - 42, 64, 208, 108, 42, 68, 208, 72, 42, 71, 209, 53, 224, 211, 248, 112, - 34, 1, 50, 195, 248, 112, 34, 64, 224, 211, 248, 116, 34, 1, 50, 195, - 248, 116, 34, 58, 224, 211, 248, 120, 34, 1, 50, 195, 248, 120, 34, - 52, 224, 211, 248, 124, 34, 1, 50, 195, 248, 124, 34, 46, 224, 211, - 248, 128, 34, 1, 50, 195, 248, 128, 34, 40, 224, 211, 248, 132, 34, - 1, 50, 195, 248, 132, 34, 34, 224, 211, 248, 136, 34, 1, 50, 195, 248, - 136, 34, 28, 224, 211, 248, 140, 34, 1, 50, 195, 248, 140, 34, 22, 224, - 211, 248, 144, 34, 1, 50, 195, 248, 144, 34, 16, 224, 211, 248, 148, - 34, 1, 50, 195, 248, 148, 34, 10, 224, 211, 248, 152, 34, 1, 50, 195, - 248, 152, 34, 4, 224, 211, 248, 156, 34, 1, 50, 195, 248, 156, 34, 37, - 153, 75, 104, 88, 3, 9, 213, 157, 248, 60, 48, 51, 185, 46, 185, 212, - 248, 64, 1, 4, 170, 0, 240, 28, 253, 3, 224, 32, 70, 4, 170, 254, 247, - 67, 255, 4, 155, 26, 124, 209, 7, 5, 212, 37, 154, 210, 248, 88, 17, - 1, 49, 194, 248, 88, 17, 27, 124, 19, 240, 1, 15, 37, 155, 4, 208, 211, - 248, 92, 33, 1, 50, 195, 248, 92, 33, 2, 154, 195, 248, 100, 33, 40, - 224, 35, 104, 90, 107, 194, 177, 157, 248, 60, 32, 170, 185, 9, 153, - 20, 72, 202, 138, 211, 248, 144, 48, 2, 240, 7, 2, 130, 92, 18, 72, - 132, 92, 88, 70, 12, 52, 3, 235, 196, 4, 99, 104, 165, 104, 1, 51, 99, - 96, 250, 243, 49, 246, 64, 25, 160, 96, 88, 70, 9, 153, 0, 34, 254, - 243, 176, 243, 6, 224, 189, 248, 44, 48, 19, 244, 64, 127, 127, 244, - 178, 173, 122, 229, 39, 176, 189, 232, 240, 143, 0, 191, 132, 24, 134, - 0, 168, 8, 2, 0, 196, 210, 133, 0, 152, 224, 133, 0, 45, 233, 240, 71, - 208, 248, 40, 56, 14, 105, 12, 70, 242, 24, 208, 248, 4, 128, 10, 97, - 137, 138, 5, 70, 203, 26, 155, 178, 163, 130, 49, 138, 73, 7, 7, 213, - 1, 43, 1, 216, 3, 104, 15, 224, 2, 50, 2, 59, 34, 97, 163, 130, 163, - 138, 212, 248, 16, 144, 7, 43, 43, 104, 5, 217, 147, 248, 47, 48, 185, - 248, 6, 112, 51, 185, 7, 224, 211, 248, 140, 48, 90, 110, 1, 50, 90, - 102, 77, 224, 64, 47, 75, 208, 115, 138, 218, 7, 36, 212, 7, 240, 12, - 7, 191, 16, 2, 47, 0, 208, 191, 185, 9, 241, 16, 0, 250, 243, 125, 241, - 24, 185, 153, 248, 16, 48, 219, 7, 6, 213, 43, 104, 211, 248, 140, 48, - 90, 111, 1, 50, 90, 103, 50, 224, 43, 104, 211, 248, 140, 48, 211, 248, - 204, 33, 1, 50, 195, 248, 204, 33, 213, 248, 60, 1, 40, 240, 157, 219, - 2, 47, 20, 209, 11, 224, 149, 248, 207, 49, 0, 43, 31, 208, 213, 248, - 60, 1, 49, 70, 34, 70, 189, 232, 240, 71, 40, 240, 216, 155, 40, 70, - 65, 70, 50, 70, 35, 70, 189, 232, 240, 71, 255, 247, 126, 187, 1, 47, - 7, 216, 40, 70, 65, 70, 50, 70, 35, 70, 189, 232, 240, 71, 254, 247, - 2, 186, 43, 104, 211, 248, 140, 48, 26, 111, 1, 50, 26, 103, 64, 70, - 33, 70, 0, 34, 189, 232, 240, 71, 254, 243, 27, 179, 45, 233, 240, 71, - 144, 248, 160, 49, 134, 176, 4, 70, 0, 43, 64, 240, 235, 128, 3, 104, - 24, 126, 0, 40, 0, 240, 231, 128, 1, 35, 132, 248, 160, 49, 32, 105, - 1, 240, 25, 254, 35, 105, 5, 70, 147, 248, 234, 32, 82, 177, 219, 110, - 64, 242, 4, 64, 211, 248, 32, 49, 24, 64, 176, 245, 128, 96, 24, 191, - 1, 32, 2, 224, 24, 110, 4, 240, 253, 252, 8, 177, 0, 38, 109, 224, 212, - 248, 104, 1, 4, 33, 75, 240, 52, 223, 32, 70, 30, 240, 39, 218, 0, 185, - 1, 53, 38, 70, 4, 241, 32, 7, 214, 248, 76, 130, 184, 241, 0, 15, 87, - 208, 152, 248, 6, 144, 185, 241, 0, 15, 82, 209, 64, 70, 47, 240, 237, - 223, 152, 248, 5, 48, 45, 24, 0, 43, 74, 208, 35, 104, 32, 70, 147, - 248, 49, 48, 65, 70, 0, 43, 60, 208, 216, 248, 204, 48, 219, 7, 56, - 213, 7, 240, 59, 248, 35, 104, 45, 24, 147, 248, 149, 48, 0, 43, 55, - 208, 212, 248, 108, 18, 32, 70, 188, 49, 76, 240, 247, 223, 130, 70, - 120, 179, 32, 70, 81, 70, 30, 240, 15, 220, 154, 248, 24, 48, 154, 7, - 26, 213, 2, 33, 80, 70, 76, 240, 59, 220, 8, 34, 205, 248, 0, 144, 1, - 146, 152, 248, 18, 32, 212, 248, 108, 50, 210, 241, 1, 2, 56, 191, 0, - 34, 2, 146, 32, 70, 65, 70, 11, 34, 188, 51, 205, 248, 12, 144, 205, - 248, 16, 144, 20, 240, 146, 217, 212, 248, 108, 50, 1, 34, 131, 248, - 240, 32, 6, 224, 54, 240, 60, 219, 45, 24, 79, 244, 122, 96, 253, 243, - 163, 247, 4, 54, 190, 66, 159, 209, 143, 231, 212, 248, 180, 36, 146, - 25, 19, 107, 19, 177, 80, 106, 152, 71, 45, 24, 52, 54, 64, 242, 172, - 67, 158, 66, 242, 209, 148, 248, 241, 49, 75, 177, 160, 104, 212, 248, - 172, 17, 6, 240, 12, 223, 0, 185, 1, 53, 0, 35, 132, 248, 241, 49, 32, - 70, 250, 247, 122, 254, 35, 104, 0, 33, 25, 118, 35, 107, 79, 240, 255, - 50, 69, 25, 24, 105, 8, 240, 22, 254, 32, 70, 17, 240, 17, 222, 212, - 248, 120, 98, 7, 224, 0, 35, 49, 29, 96, 104, 1, 34, 0, 147, 250, 243, - 225, 242, 54, 104, 0, 46, 245, 209, 35, 104, 147, 248, 47, 48, 131, - 177, 38, 70, 4, 241, 32, 7, 214, 248, 76, 18, 57, 177, 139, 121, 43, - 177, 11, 121, 27, 177, 32, 70, 6, 240, 177, 255, 45, 24, 4, 54, 190, - 66, 241, 209, 212, 248, 124, 2, 16, 177, 6, 240, 227, 250, 45, 24, 32, - 105, 1, 240, 217, 253, 0, 35, 64, 25, 132, 248, 41, 48, 132, 248, 160, - 49, 0, 224, 0, 32, 6, 176, 189, 232, 240, 135, 0, 0, 4, 75, 26, 104, - 34, 177, 1, 34, 128, 248, 157, 35, 0, 34, 26, 96, 112, 71, 0, 191, 212, - 8, 2, 0, 248, 181, 20, 70, 29, 70, 210, 248, 240, 48, 210, 120, 180, - 248, 86, 96, 3, 235, 66, 3, 179, 248, 190, 32, 246, 67, 150, 25, 54, - 5, 54, 13, 180, 248, 90, 48, 15, 70, 113, 25, 153, 66, 21, 221, 97, - 120, 153, 66, 84, 216, 161, 120, 0, 41, 81, 209, 1, 58, 18, 5, 18, 13, - 158, 66, 164, 248, 86, 32, 2, 216, 157, 27, 173, 178, 45, 185, 36, 72, - 0, 33, 50, 70, 6, 240, 197, 255, 0, 37, 180, 248, 90, 48, 158, 27, 163, - 120, 118, 27, 235, 24, 164, 248, 90, 96, 163, 112, 53, 224, 225, 120, - 7, 241, 16, 0, 250, 243, 239, 242, 67, 106, 2, 70, 67, 244, 128, 99, - 67, 98, 224, 120, 212, 248, 240, 16, 92, 48, 1, 235, 64, 0, 198, 136, - 79, 240, 1, 14, 51, 5, 27, 13, 1, 54, 198, 128, 3, 240, 63, 6, 4, 235, - 214, 0, 6, 240, 7, 6, 14, 250, 6, 246, 19, 133, 144, 248, 68, 224, 164, - 248, 86, 48, 70, 234, 14, 6, 128, 248, 68, 96, 227, 120, 209, 248, 44, - 1, 223, 248, 32, 224, 3, 240, 7, 3, 134, 108, 30, 248, 3, 48, 192, 108, - 176, 71, 1, 61, 173, 178, 0, 45, 199, 209, 248, 189, 0, 191, 33, 190, - 1, 0, 144, 224, 133, 0, 45, 233, 240, 65, 146, 248, 229, 48, 6, 70, - 20, 70, 208, 248, 64, 81, 171, 177, 42, 70, 0, 35, 210, 248, 80, 18, - 161, 66, 4, 209, 148, 51, 0, 34, 69, 248, 35, 32, 3, 224, 1, 51, 4, - 50, 10, 43, 242, 209, 112, 104, 33, 70, 244, 34, 189, 232, 240, 65, - 254, 243, 107, 177, 130, 248, 228, 48, 139, 7, 63, 213, 178, 248, 84, - 48, 178, 248, 92, 128, 43, 224, 3, 240, 63, 1, 4, 235, 209, 2, 146, - 248, 76, 192, 1, 240, 7, 0, 76, 250, 0, 247, 23, 240, 1, 15, 27, 208, - 79, 240, 1, 14, 14, 250, 0, 254, 146, 248, 68, 112, 111, 234, 14, 14, - 87, 250, 0, 240, 95, 250, 142, 254, 14, 234, 12, 12, 192, 7, 130, 248, - 76, 192, 9, 213, 14, 234, 7, 7, 130, 248, 68, 112, 97, 24, 0, 34, 10, - 113, 162, 120, 1, 58, 162, 112, 1, 51, 27, 5, 27, 13, 67, 69, 209, 209, - 212, 248, 240, 32, 107, 104, 40, 70, 209, 88, 34, 70, 36, 240, 226, - 223, 148, 248, 232, 48, 1, 59, 132, 248, 232, 48, 212, 248, 240, 32, - 107, 104, 48, 70, 209, 88, 34, 70, 37, 240, 185, 221, 214, 248, 64, - 1, 33, 70, 0, 34, 189, 232, 240, 65, 37, 240, 179, 156, 0, 0, 55, 181, - 4, 70, 148, 248, 157, 83, 0, 104, 1, 45, 8, 209, 19, 240, 39, 218, 2, - 40, 4, 221, 0, 35, 132, 248, 157, 51, 5, 75, 29, 96, 33, 125, 148, 249, - 40, 32, 0, 145, 227, 124, 3, 73, 3, 72, 6, 240, 239, 254, 62, 189, 212, - 8, 2, 0, 236, 189, 1, 0, 93, 190, 1, 0, 45, 233, 240, 71, 150, 136, - 5, 70, 23, 70, 4, 104, 178, 248, 10, 160, 6, 240, 7, 6, 79, 240, 0, - 8, 55, 224, 11, 105, 96, 104, 179, 248, 0, 144, 213, 248, 120, 50, 154, - 110, 1, 50, 154, 102, 1, 34, 254, 243, 245, 240, 35, 104, 147, 248, - 161, 48, 1, 43, 4, 208, 9, 244, 192, 105, 185, 245, 192, 111, 23, 224, - 24, 33, 113, 67, 1, 245, 32, 113, 107, 24, 218, 136, 88, 136, 144, 66, - 2, 209, 105, 90, 217, 128, 1, 224, 1, 50, 218, 128, 8, 241, 1, 8, 1, - 34, 32, 70, 49, 70, 31, 250, 136, 248, 33, 240, 56, 223, 208, 69, 10, - 208, 35, 105, 2, 33, 3, 235, 134, 3, 216, 104, 19, 75, 155, 107, 152, - 71, 1, 70, 0, 41, 197, 209, 35, 104, 147, 248, 161, 48, 1, 43, 5, 208, - 32, 70, 49, 70, 149, 249, 44, 32, 33, 240, 32, 223, 251, 136, 154, 7, - 9, 212, 189, 232, 240, 135, 1, 61, 1, 32, 237, 178, 253, 243, 206, 245, - 21, 185, 189, 232, 240, 135, 11, 37, 227, 104, 211, 248, 112, 49, 219, - 7, 241, 213, 189, 232, 240, 135, 0, 191, 224, 166, 133, 0, 45, 233, - 243, 71, 208, 248, 0, 128, 4, 70, 1, 169, 216, 248, 0, 5, 76, 240, 116, - 218, 79, 240, 0, 10, 57, 224, 107, 104, 90, 3, 54, 213, 99, 104, 0, - 38, 85, 248, 3, 144, 79, 70, 215, 248, 248, 48, 75, 179, 154, 120, 25, - 121, 0, 42, 24, 191, 79, 240, 1, 10, 25, 177, 0, 34, 26, 113, 218, 112, - 30, 224, 234, 177, 218, 120, 1, 50, 210, 178, 218, 112, 107, 104, 19, - 244, 128, 127, 20, 191, 97, 142, 161, 142, 79, 240, 100, 3, 177, 251, - 243, 243, 154, 66, 11, 211, 212, 248, 120, 50, 64, 70, 211, 248, 196, - 32, 73, 70, 1, 50, 195, 248, 196, 32, 50, 70, 37, 240, 134, 218, 79, - 240, 1, 10, 1, 54, 246, 178, 4, 55, 8, 46, 205, 209, 1, 168, 76, 240, - 60, 218, 5, 70, 0, 40, 191, 209, 186, 241, 0, 15, 6, 209, 35, 104, 132, - 248, 163, 163, 152, 104, 161, 107, 6, 240, 235, 220, 189, 232, 252, - 135, 67, 104, 247, 181, 205, 88, 6, 70, 47, 70, 0, 36, 48, 70, 41, 70, - 34, 70, 35, 240, 48, 221, 215, 248, 216, 48, 75, 177, 27, 120, 1, 43, - 6, 209, 37, 34, 0, 146, 48, 70, 41, 70, 34, 70, 37, 240, 69, 220, 34, - 70, 1, 52, 1, 35, 48, 70, 41, 70, 228, 178, 35, 240, 135, 220, 4, 55, - 8, 44, 226, 209, 50, 104, 0, 35, 0, 147, 80, 104, 5, 241, 16, 1, 1, - 34, 250, 243, 177, 240, 254, 189, 16, 181, 3, 104, 4, 70, 91, 126, 123, - 185, 8, 73, 8, 72, 6, 240, 239, 253, 32, 70, 255, 247, 247, 252, 4, - 73, 6, 72, 6, 240, 232, 253, 32, 70, 189, 232, 16, 64, 252, 247, 28, - 187, 16, 189, 15, 190, 1, 0, 162, 190, 1, 0, 176, 190, 1, 0, 45, 233, - 240, 79, 208, 248, 0, 128, 135, 176, 5, 70, 5, 169, 216, 248, 0, 5, - 76, 240, 209, 217, 0, 34, 3, 146, 229, 224, 2, 154, 83, 104, 91, 3, - 64, 241, 225, 128, 216, 248, 64, 49, 79, 240, 0, 10, 91, 104, 214, 88, - 177, 70, 217, 248, 248, 48, 10, 241, 140, 1, 95, 250, 138, 247, 6, 235, - 65, 2, 27, 177, 0, 35, 83, 112, 6, 248, 17, 48, 22, 248, 17, 48, 131, - 177, 0, 35, 6, 248, 17, 48, 81, 120, 1, 49, 201, 178, 2, 41, 81, 112, - 7, 217, 83, 112, 38, 34, 0, 146, 40, 70, 49, 70, 58, 70, 37, 240, 217, - 219, 217, 248, 216, 64, 0, 44, 0, 240, 172, 128, 35, 120, 3, 43, 0, - 242, 168, 128, 223, 232, 3, 240, 149, 2, 96, 125, 40, 70, 49, 70, 34, - 70, 1, 35, 37, 240, 246, 219, 148, 248, 231, 176, 187, 241, 0, 15, 28, - 208, 187, 241, 1, 15, 17, 209, 225, 120, 6, 241, 16, 0, 250, 243, 187, - 240, 1, 70, 80, 177, 216, 248, 0, 48, 90, 70, 216, 104, 253, 243, 159, - 247, 213, 248, 120, 50, 218, 107, 1, 50, 218, 99, 0, 34, 132, 248, 231, - 32, 40, 70, 33, 70, 37, 240, 23, 219, 123, 224, 148, 248, 232, 48, 49, - 43, 8, 217, 39, 35, 0, 147, 40, 70, 49, 70, 58, 70, 1, 35, 37, 240, - 152, 219, 110, 224, 148, 248, 230, 48, 35, 177, 132, 248, 230, 176, - 132, 248, 235, 176, 102, 224, 163, 120, 35, 177, 148, 248, 235, 48, - 1, 51, 132, 248, 235, 48, 148, 248, 235, 48, 2, 43, 91, 209, 213, 248, - 120, 50, 40, 70, 90, 110, 49, 70, 1, 50, 90, 102, 39, 35, 0, 147, 58, - 70, 1, 35, 37, 240, 119, 219, 1, 35, 40, 70, 49, 70, 58, 70, 35, 240, - 187, 219, 1, 35, 3, 147, 69, 224, 148, 248, 233, 48, 90, 28, 3, 43, - 132, 248, 233, 32, 4, 217, 48, 70, 33, 70, 35, 240, 123, 219, 57, 224, - 170, 124, 235, 124, 0, 146, 149, 248, 46, 32, 40, 104, 1, 146, 2, 153, - 58, 70, 37, 240, 143, 222, 213, 248, 120, 50, 26, 109, 1, 50, 26, 101, - 40, 224, 148, 248, 234, 48, 90, 28, 1, 43, 132, 248, 234, 32, 9, 217, - 213, 248, 120, 50, 40, 70, 90, 110, 49, 70, 1, 50, 90, 102, 58, 70, - 1, 35, 3, 224, 40, 70, 49, 70, 58, 70, 0, 35, 35, 240, 132, 219, 16, - 224, 148, 248, 236, 48, 90, 28, 59, 43, 132, 248, 236, 32, 9, 217, 40, - 70, 49, 70, 58, 70, 0, 35, 36, 240, 20, 222, 16, 177, 4, 35, 128, 248, - 233, 48, 10, 241, 1, 10, 186, 241, 8, 15, 9, 241, 4, 9, 127, 244, 38, - 175, 5, 168, 76, 240, 237, 216, 2, 144, 0, 40, 127, 244, 19, 175, 3, - 154, 9, 75, 18, 177, 26, 104, 1, 50, 0, 224, 3, 154, 26, 96, 27, 104, - 1, 43, 5, 221, 64, 70, 255, 247, 219, 254, 3, 75, 0, 34, 26, 96, 0, - 32, 7, 176, 189, 232, 240, 143, 216, 8, 2, 0, 248, 181, 5, 70, 23, 70, - 193, 177, 75, 104, 91, 3, 21, 213, 67, 104, 0, 36, 206, 88, 51, 25, - 211, 248, 216, 16, 89, 177, 55, 177, 145, 248, 228, 48, 1, 43, 2, 209, - 0, 35, 129, 248, 228, 48, 40, 70, 0, 34, 37, 240, 90, 218, 4, 52, 32, - 44, 236, 209, 248, 189, 45, 233, 240, 67, 19, 140, 133, 176, 8, 43, - 4, 70, 137, 70, 21, 70, 146, 248, 34, 128, 6, 104, 1, 208, 48, 70, 32, - 224, 67, 104, 207, 88, 8, 241, 62, 3, 17, 104, 87, 248, 35, 32, 218, - 185, 171, 105, 155, 136, 3, 240, 3, 3, 2, 43, 15, 209, 17, 248, 3, 60, - 27, 7, 11, 213, 1, 35, 8, 241, 140, 8, 7, 248, 24, 48, 208, 248, 120, - 50, 211, 248, 180, 32, 1, 50, 195, 248, 180, 32, 48, 70, 73, 70, 42, - 70, 254, 247, 251, 249, 18, 225, 217, 248, 4, 48, 216, 3, 21, 212, 171, - 105, 155, 136, 3, 240, 3, 3, 2, 43, 15, 209, 17, 248, 3, 60, 27, 7, - 11, 213, 8, 241, 140, 3, 1, 32, 7, 248, 19, 0, 212, 248, 120, 50, 211, - 248, 180, 0, 1, 48, 195, 248, 180, 0, 171, 105, 155, 136, 3, 240, 3, - 3, 2, 43, 212, 248, 120, 50, 56, 209, 17, 248, 3, 12, 0, 7, 30, 213, - 211, 248, 156, 0, 1, 48, 195, 248, 156, 0, 211, 248, 160, 0, 1, 48, - 195, 248, 160, 0, 17, 249, 3, 12, 0, 40, 4, 218, 211, 248, 172, 0, 1, - 48, 195, 248, 172, 0, 17, 248, 3, 28, 1, 240, 48, 1, 16, 41, 32, 209, - 211, 248, 176, 16, 1, 49, 195, 248, 176, 16, 26, 224, 17, 248, 5, 204, - 17, 248, 6, 12, 17, 248, 4, 28, 76, 234, 0, 0, 1, 67, 5, 209, 211, 248, - 160, 16, 1, 49, 195, 248, 160, 16, 10, 224, 211, 248, 164, 16, 1, 49, - 195, 248, 164, 16, 4, 224, 211, 248, 168, 16, 1, 49, 195, 248, 168, - 16, 181, 248, 126, 16, 8, 7, 64, 240, 154, 128, 211, 136, 9, 9, 153, - 66, 35, 209, 1, 35, 201, 24, 9, 5, 19, 113, 9, 13, 209, 128, 217, 248, - 40, 64, 9, 241, 26, 1, 6, 34, 2, 168, 248, 243, 85, 247, 48, 70, 73, - 70, 42, 70, 254, 247, 126, 249, 48, 70, 2, 169, 34, 70, 76, 240, 103, - 219, 0, 40, 0, 240, 143, 128, 72, 69, 64, 240, 140, 128, 48, 70, 57, - 70, 66, 70, 37, 240, 210, 216, 133, 224, 1, 240, 15, 9, 201, 26, 9, - 5, 83, 120, 9, 13, 153, 66, 5, 210, 9, 241, 2, 3, 82, 248, 35, 16, 25, - 185, 68, 224, 177, 245, 0, 111, 12, 217, 0, 34, 112, 104, 105, 105, - 253, 243, 253, 245, 212, 248, 120, 50, 211, 248, 192, 32, 1, 50, 195, - 248, 192, 32, 103, 224, 195, 241, 1, 3, 203, 24, 155, 178, 48, 70, 57, - 70, 66, 70, 37, 240, 62, 216, 8, 241, 62, 3, 87, 248, 35, 48, 107, 177, - 105, 105, 9, 241, 2, 2, 67, 248, 34, 16, 213, 248, 128, 32, 9, 241, - 18, 9, 67, 248, 41, 32, 154, 120, 1, 50, 154, 112, 66, 70, 48, 70, 57, - 70, 37, 240, 146, 216, 212, 248, 120, 50, 211, 248, 200, 32, 1, 50, - 195, 248, 200, 32, 148, 248, 163, 51, 0, 43, 59, 209, 1, 35, 132, 248, - 163, 51, 176, 104, 161, 107, 100, 34, 6, 240, 23, 218, 50, 224, 105, - 105, 9, 241, 18, 9, 66, 248, 35, 16, 213, 248, 128, 48, 66, 248, 41, - 48, 147, 120, 1, 51, 147, 112, 148, 248, 163, 51, 59, 185, 1, 35, 132, - 248, 163, 51, 176, 104, 161, 107, 100, 34, 6, 240, 255, 217, 212, 248, - 120, 50, 211, 248, 188, 32, 1, 50, 195, 248, 188, 32, 19, 224, 112, - 104, 105, 105, 0, 34, 253, 243, 156, 245, 212, 248, 120, 50, 32, 70, - 211, 248, 220, 32, 57, 70, 1, 50, 195, 248, 220, 32, 1, 35, 0, 147, - 66, 70, 0, 35, 37, 240, 159, 217, 5, 176, 189, 232, 240, 131, 3, 104, - 27, 104, 25, 177, 1, 34, 131, 248, 170, 32, 112, 71, 131, 248, 170, - 16, 112, 71, 112, 181, 208, 248, 172, 83, 2, 41, 43, 104, 8, 191, 0, - 245, 117, 116, 211, 248, 140, 32, 24, 191, 0, 36, 19, 108, 6, 70, 80, - 104, 34, 105, 195, 24, 154, 26, 35, 97, 163, 105, 154, 66, 35, 120, - 14, 210, 75, 185, 226, 104, 99, 105, 154, 66, 5, 211, 1, 35, 35, 112, - 99, 104, 1, 51, 99, 96, 112, 189, 227, 104, 1, 51, 227, 96, 112, 189, - 0, 34, 226, 96, 19, 179, 1, 41, 4, 209, 40, 70, 3, 33, 32, 240, 207, - 222, 25, 224, 2, 41, 23, 209, 168, 104, 214, 248, 208, 19, 6, 240, 231, - 217, 214, 248, 204, 51, 123, 177, 43, 104, 147, 248, 116, 48, 1, 43, - 7, 208, 40, 105, 1, 33, 52, 240, 13, 217, 43, 104, 1, 34, 131, 248, - 116, 32, 0, 35, 198, 248, 204, 51, 0, 35, 35, 112, 112, 189, 208, 248, - 172, 3, 112, 71, 45, 233, 240, 79, 208, 248, 172, 131, 208, 248, 176, - 3, 207, 176, 7, 144, 216, 248, 104, 1, 29, 70, 131, 121, 15, 70, 146, - 70, 19, 177, 4, 33, 75, 240, 102, 217, 187, 121, 27, 177, 59, 121, 0, - 43, 0, 240, 126, 129, 186, 248, 0, 64, 181, 248, 0, 144, 20, 244, 128, - 68, 181, 248, 2, 176, 64, 240, 97, 129, 187, 241, 1, 15, 64, 240, 49, - 129, 118, 224, 212, 248, 216, 48, 0, 43, 0, 240, 106, 129, 149, 248, - 3, 144, 157, 248, 104, 49, 79, 234, 153, 25, 3, 179, 9, 241, 160, 3, - 88, 248, 35, 96, 222, 177, 51, 105, 203, 177, 51, 122, 187, 177, 41, - 70, 3, 34, 74, 168, 248, 243, 27, 246, 74, 168, 6, 241, 20, 1, 50, 105, - 3, 48, 248, 243, 20, 246, 49, 105, 74, 168, 3, 49, 9, 170, 255, 243, - 252, 240, 88, 155, 40, 29, 25, 31, 9, 170, 255, 243, 38, 241, 7, 235, - 137, 3, 91, 111, 0, 43, 51, 208, 26, 105, 88, 152, 41, 70, 20, 51, 3, - 240, 199, 221, 96, 179, 181, 248, 4, 144, 181, 248, 6, 176, 185, 241, - 1, 15, 29, 209, 187, 241, 3, 15, 26, 209, 171, 122, 16, 43, 23, 209, - 212, 248, 216, 0, 5, 241, 12, 1, 234, 122, 2, 48, 248, 243, 203, 245, - 5, 70, 104, 185, 32, 70, 73, 70, 151, 249, 72, 32, 76, 240, 187, 216, - 132, 248, 222, 144, 32, 70, 73, 70, 42, 70, 76, 240, 180, 216, 12, 224, - 32, 70, 1, 33, 151, 249, 72, 32, 75, 240, 63, 222, 15, 37, 4, 224, 15, - 37, 79, 240, 3, 11, 79, 240, 1, 9, 212, 248, 216, 16, 7, 155, 74, 120, - 216, 104, 2, 50, 253, 243, 126, 244, 0, 35, 196, 248, 216, 48, 185, - 224, 62, 109, 251, 108, 125, 109, 182, 177, 10, 224, 41, 70, 10, 241, - 10, 0, 6, 34, 6, 147, 248, 243, 150, 245, 6, 53, 6, 155, 16, 177, 1, - 52, 156, 66, 242, 219, 1, 46, 2, 209, 156, 66, 40, 219, 3, 224, 2, 46, - 1, 209, 156, 66, 35, 218, 184, 248, 130, 49, 68, 242, 29, 50, 147, 66, - 45, 208, 10, 216, 68, 242, 22, 50, 147, 66, 40, 208, 68, 242, 26, 50, - 147, 66, 36, 208, 68, 242, 19, 50, 13, 224, 68, 242, 42, 50, 147, 66, - 29, 208, 2, 216, 68, 242, 33, 50, 5, 224, 68, 242, 45, 50, 147, 66, - 21, 208, 68, 242, 82, 50, 147, 66, 17, 208, 0, 34, 16, 224, 0, 38, 3, - 35, 141, 232, 72, 0, 64, 70, 23, 33, 10, 241, 10, 2, 51, 70, 2, 150, - 3, 150, 1, 37, 26, 240, 13, 219, 52, 70, 128, 224, 1, 34, 10, 241, 10, - 4, 33, 70, 64, 70, 76, 240, 132, 217, 1, 70, 16, 177, 64, 70, 76, 240, - 135, 217, 33, 70, 64, 70, 76, 240, 139, 218, 4, 70, 0, 40, 0, 240, 140, - 128, 57, 70, 75, 240, 102, 223, 99, 104, 218, 4, 8, 213, 7, 153, 145, - 248, 48, 32, 0, 42, 64, 240, 130, 128, 35, 244, 128, 83, 99, 96, 64, - 70, 33, 70, 29, 240, 120, 221, 185, 241, 0, 15, 3, 208, 185, 241, 1, - 15, 118, 209, 18, 224, 183, 249, 92, 48, 151, 249, 72, 32, 32, 70, 1, - 33, 19, 185, 76, 240, 20, 216, 1, 224, 75, 240, 163, 221, 38, 126, 22, - 240, 1, 6, 102, 208, 0, 38, 53, 70, 46, 224, 212, 248, 216, 16, 65, - 177, 7, 155, 74, 120, 216, 104, 2, 50, 253, 243, 225, 243, 0, 35, 196, - 248, 216, 48, 183, 248, 98, 80, 0, 45, 82, 209, 7, 153, 200, 104, 130, - 33, 253, 243, 197, 243, 6, 70, 0, 40, 77, 208, 16, 35, 3, 112, 128, - 35, 67, 112, 216, 248, 12, 48, 179, 248, 90, 38, 115, 25, 1, 53, 128, - 45, 154, 112, 246, 209, 196, 248, 216, 96, 0, 37, 5, 224, 14, 37, 187, - 241, 3, 15, 58, 216, 0, 38, 133, 185, 124, 177, 35, 126, 219, 7, 12, - 213, 64, 70, 57, 70, 4, 34, 10, 241, 10, 3, 0, 149, 1, 149, 205, 248, - 8, 144, 3, 149, 4, 149, 19, 240, 192, 218, 11, 241, 1, 3, 1, 147, 0, - 35, 3, 147, 157, 248, 100, 49, 56, 70, 5, 147, 10, 241, 10, 1, 7, 241, - 188, 2, 35, 70, 205, 248, 0, 144, 2, 149, 4, 150, 30, 240, 170, 219, - 18, 224, 64, 70, 10, 241, 10, 1, 76, 240, 230, 216, 4, 70, 0, 40, 127, - 244, 155, 174, 8, 224, 6, 70, 4, 224, 0, 38, 2, 224, 0, 38, 13, 37, - 217, 231, 1, 37, 215, 231, 79, 176, 189, 232, 240, 143, 48, 181, 157, - 248, 16, 80, 157, 248, 20, 64, 4, 149, 5, 148, 189, 232, 48, 64, 255, - 247, 92, 190, 208, 248, 192, 3, 112, 71, 192, 248, 192, 19, 112, 71, - 208, 248, 172, 51, 27, 104, 219, 105, 24, 105, 4, 40, 168, 191, 4, 32, - 112, 71, 112, 181, 3, 107, 0, 37, 128, 248, 208, 88, 208, 248, 92, 97, - 4, 70, 24, 105, 7, 240, 186, 255, 1, 70, 48, 70, 60, 240, 116, 220, - 48, 177, 32, 70, 1, 33, 42, 70, 189, 232, 112, 64, 26, 240, 162, 156, - 112, 189, 240, 181, 4, 104, 139, 176, 5, 70, 0, 33, 230, 104, 31, 240, - 71, 221, 40, 70, 19, 240, 140, 217, 212, 248, 228, 54, 107, 177, 160, - 104, 212, 248, 116, 21, 5, 240, 240, 223, 0, 35, 196, 248, 228, 54, - 148, 248, 88, 53, 35, 240, 2, 3, 132, 248, 88, 53, 212, 248, 92, 1, - 60, 240, 43, 220, 35, 105, 147, 248, 234, 32, 98, 177, 219, 110, 64, - 242, 4, 64, 211, 248, 32, 49, 24, 64, 160, 245, 128, 108, 220, 241, - 0, 0, 64, 235, 12, 0, 6, 224, 24, 110, 3, 240, 58, 253, 208, 241, 1, - 0, 56, 191, 0, 32, 0, 40, 62, 208, 32, 70, 6, 240, 172, 248, 35, 107, - 212, 248, 92, 113, 24, 105, 7, 240, 106, 255, 1, 70, 56, 70, 60, 240, - 36, 220, 48, 177, 148, 248, 208, 40, 26, 185, 32, 70, 1, 33, 26, 240, - 82, 220, 40, 70, 19, 240, 223, 222, 79, 240, 0, 67, 198, 248, 136, 49, - 15, 33, 32, 105, 52, 240, 129, 216, 32, 105, 64, 242, 255, 49, 52, 240, - 106, 216, 35, 107, 27, 104, 2, 43, 4, 209, 32, 105, 148, 248, 67, 22, - 52, 240, 207, 216, 32, 70, 24, 240, 158, 222, 32, 70, 24, 240, 103, - 220, 10, 169, 0, 35, 65, 248, 40, 61, 32, 70, 105, 70, 28, 240, 241, - 218, 32, 70, 31, 240, 70, 222, 11, 176, 240, 189, 45, 233, 240, 65, - 7, 104, 4, 70, 134, 176, 56, 70, 14, 70, 21, 70, 152, 70, 29, 240, 69, - 219, 16, 177, 56, 70, 29, 240, 57, 219, 12, 155, 56, 70, 2, 147, 0, - 35, 3, 147, 4, 147, 33, 70, 11, 34, 43, 70, 141, 232, 64, 1, 19, 240, - 204, 217, 6, 176, 189, 232, 240, 129, 0, 0, 45, 233, 240, 79, 4, 104, - 208, 248, 216, 178, 208, 248, 208, 18, 151, 176, 5, 70, 208, 248, 232, - 162, 32, 70, 7, 145, 31, 240, 157, 222, 219, 248, 0, 16, 160, 104, 5, - 240, 84, 223, 40, 70, 2, 33, 47, 240, 126, 216, 219, 225, 212, 248, - 216, 38, 1, 51, 82, 248, 35, 96, 182, 248, 50, 128, 8, 244, 112, 67, - 163, 245, 128, 81, 75, 66, 67, 235, 1, 3, 14, 51, 84, 248, 35, 112, - 8, 244, 64, 99, 179, 245, 64, 111, 36, 209, 35, 104, 147, 248, 70, 48, - 154, 7, 17, 208, 212, 248, 92, 1, 121, 104, 59, 240, 127, 223, 3, 7, - 10, 212, 151, 248, 236, 48, 59, 177, 59, 104, 2, 43, 18, 209, 212, 248, - 252, 52, 155, 120, 152, 7, 13, 213, 64, 70, 249, 243, 3, 245, 64, 244, - 48, 99, 155, 178, 14, 40, 140, 191, 79, 244, 128, 88, 79, 244, 0, 88, - 72, 234, 3, 8, 212, 248, 92, 1, 65, 70, 60, 240, 175, 221, 0, 40, 0, - 240, 148, 129, 112, 142, 249, 243, 237, 244, 64, 244, 48, 96, 31, 250, - 128, 248, 112, 142, 249, 243, 230, 244, 14, 40, 140, 191, 79, 244, 128, - 81, 79, 244, 0, 81, 72, 234, 1, 1, 40, 70, 46, 240, 217, 216, 0, 40, - 0, 240, 124, 129, 213, 248, 232, 50, 0, 43, 116, 208, 211, 248, 220, - 48, 0, 43, 112, 208, 0, 35, 165, 248, 92, 48, 150, 248, 170, 0, 79, - 240, 12, 8, 8, 251, 0, 160, 242, 136, 28, 48, 2, 240, 128, 2, 210, 241, - 1, 2, 56, 191, 0, 34, 20, 169, 249, 243, 34, 246, 189, 248, 80, 16, - 165, 248, 98, 16, 150, 248, 170, 0, 19, 169, 8, 251, 0, 160, 32, 48, - 249, 243, 116, 246, 19, 155, 43, 187, 150, 248, 170, 48, 4, 34, 8, 251, - 3, 168, 21, 168, 8, 241, 36, 1, 248, 243, 78, 243, 21, 168, 146, 73, - 4, 34, 248, 243, 45, 243, 72, 185, 150, 248, 169, 48, 163, 241, 8, 2, - 210, 178, 2, 42, 64, 242, 58, 129, 141, 248, 87, 48, 21, 168, 19, 169, - 249, 243, 84, 246, 48, 185, 12, 35, 0, 144, 1, 147, 150, 248, 50, 48, - 2, 147, 6, 225, 19, 155, 32, 70, 89, 7, 68, 191, 67, 240, 2, 3, 19, - 147, 19, 155, 129, 73, 154, 7, 68, 191, 67, 240, 1, 3, 19, 147, 19, - 171, 0, 147, 4, 35, 1, 147, 1, 35, 2, 147, 171, 104, 0, 34, 3, 147, - 19, 70, 25, 240, 44, 221, 7, 35, 0, 147, 0, 35, 1, 147, 150, 248, 170, - 32, 32, 70, 2, 146, 3, 147, 4, 147, 41, 70, 24, 34, 51, 70, 19, 240, - 219, 216, 182, 248, 98, 48, 216, 6, 10, 213, 170, 109, 64, 242, 55, - 19, 19, 64, 43, 185, 109, 75, 27, 120, 19, 185, 0, 147, 1, 34, 52, 224, - 48, 70, 248, 243, 215, 247, 24, 177, 0, 35, 0, 147, 2, 34, 44, 224, - 43, 109, 0, 43, 46, 208, 35, 104, 147, 248, 48, 48, 99, 177, 41, 224, - 105, 109, 48, 70, 73, 68, 6, 34, 248, 243, 200, 242, 9, 241, 6, 9, 56, - 177, 8, 241, 1, 8, 1, 224, 153, 70, 152, 70, 235, 108, 152, 69, 238, - 211, 43, 109, 1, 43, 3, 209, 235, 108, 152, 69, 6, 211, 17, 224, 2, - 43, 15, 209, 235, 108, 152, 69, 4, 210, 11, 224, 0, 35, 0, 147, 3, 34, - 2, 224, 0, 35, 0, 147, 4, 34, 1, 146, 150, 248, 50, 32, 2, 146, 177, - 224, 35, 104, 147, 248, 149, 48, 131, 177, 212, 248, 76, 53, 1, 43, - 9, 209, 48, 70, 4, 245, 170, 97, 6, 34, 248, 243, 150, 242, 0, 40, 64, - 240, 169, 128, 2, 224, 2, 43, 0, 240, 165, 128, 150, 249, 52, 128, 184, - 241, 0, 15, 17, 209, 212, 248, 92, 1, 113, 142, 60, 240, 71, 219, 88, - 177, 5, 35, 205, 248, 0, 128, 1, 147, 150, 248, 50, 48, 205, 248, 12, - 128, 2, 147, 205, 248, 16, 128, 135, 224, 181, 248, 98, 48, 91, 177, - 170, 109, 64, 242, 55, 19, 19, 64, 51, 177, 32, 70, 41, 70, 50, 70, - 46, 240, 253, 217, 0, 40, 126, 209, 59, 104, 6, 241, 56, 0, 2, 43, 7, - 209, 122, 125, 42, 185, 255, 35, 0, 147, 1, 146, 9, 169, 1, 35, 19, - 224, 35, 104, 147, 248, 70, 48, 19, 240, 3, 3, 7, 208, 213, 248, 204, - 48, 3, 244, 128, 83, 211, 241, 1, 3, 56, 191, 0, 35, 255, 34, 141, 232, - 12, 0, 0, 34, 9, 169, 19, 70, 71, 240, 34, 219, 35, 107, 80, 55, 147, - 248, 236, 16, 57, 177, 113, 142, 1, 244, 64, 97, 177, 245, 64, 111, - 20, 191, 20, 33, 40, 33, 56, 70, 71, 240, 186, 218, 212, 248, 96, 54, - 9, 168, 57, 70, 0, 34, 155, 120, 71, 240, 76, 218, 16, 185, 0, 144, - 9, 35, 24, 224, 157, 248, 56, 32, 148, 248, 56, 55, 154, 66, 57, 209, - 150, 249, 52, 48, 211, 185, 114, 142, 32, 70, 2, 244, 112, 66, 6, 241, - 56, 1, 178, 245, 128, 95, 20, 191, 2, 34, 1, 34, 45, 240, 74, 223, 96, - 185, 0, 144, 10, 35, 1, 147, 2, 144, 3, 144, 4, 144, 27, 224, 36, 184, - 1, 0, 23, 115, 134, 0, 148, 8, 2, 0, 35, 104, 147, 248, 48, 48, 11, - 179, 32, 70, 49, 70, 75, 240, 44, 222, 224, 177, 3, 126, 153, 7, 25, - 213, 67, 104, 19, 244, 128, 83, 21, 209, 13, 34, 0, 147, 1, 146, 2, - 147, 3, 147, 4, 147, 32, 70, 41, 70, 23, 34, 51, 70, 18, 240, 216, 223, - 212, 248, 220, 54, 1, 59, 196, 248, 220, 54, 212, 248, 220, 54, 0, 43, - 127, 244, 31, 174, 212, 248, 220, 102, 246, 177, 0, 34, 139, 248, 30, - 32, 212, 248, 220, 54, 212, 248, 216, 22, 88, 30, 1, 51, 81, 248, 35, - 48, 219, 248, 4, 16, 196, 248, 220, 6, 1, 41, 9, 208, 0, 146, 1, 146, - 2, 146, 3, 146, 4, 146, 32, 70, 41, 70, 32, 34, 18, 240, 176, 223, 40, - 70, 48, 240, 127, 220, 41, 224, 7, 153, 234, 121, 145, 249, 52, 48, - 74, 177, 1, 33, 211, 241, 1, 3, 40, 70, 50, 70, 56, 191, 0, 35, 46, - 240, 84, 219, 9, 224, 1, 33, 211, 241, 1, 3, 40, 70, 56, 191, 0, 35, - 0, 146, 1, 146, 46, 240, 131, 220, 149, 249, 16, 48, 2, 43, 3, 209, - 232, 104, 0, 33, 79, 240, 175, 220, 148, 248, 117, 50, 40, 70, 35, 240, - 4, 3, 132, 248, 117, 50, 46, 240, 32, 220, 23, 176, 189, 232, 240, 143, - 0, 191, 45, 233, 240, 79, 5, 104, 137, 176, 154, 70, 0, 245, 52, 115, - 147, 232, 8, 3, 3, 147, 43, 104, 4, 70, 147, 248, 63, 48, 139, 70, 22, - 70, 0, 43, 0, 240, 104, 129, 195, 121, 0, 43, 0, 240, 100, 129, 131, - 124, 5, 168, 19, 177, 4, 241, 214, 1, 0, 224, 65, 70, 6, 34, 248, 243, - 139, 241, 0, 35, 133, 248, 74, 53, 43, 104, 147, 248, 68, 48, 27, 177, - 213, 248, 100, 1, 56, 240, 228, 217, 43, 105, 147, 248, 234, 32, 66, - 177, 219, 110, 64, 242, 4, 71, 211, 248, 32, 49, 31, 64, 183, 245, 128, - 103, 3, 224, 24, 110, 3, 240, 77, 250, 7, 28, 24, 191, 1, 39, 199, 177, - 0, 33, 32, 70, 49, 240, 154, 220, 32, 70, 255, 247, 212, 252, 163, 124, - 32, 70, 211, 241, 1, 3, 56, 191, 0, 35, 0, 147, 0, 33, 5, 170, 8, 35, - 255, 247, 67, 253, 0, 33, 32, 70, 10, 70, 52, 240, 84, 223, 36, 225, - 163, 124, 0, 43, 0, 240, 140, 128, 212, 248, 220, 50, 211, 248, 144, - 16, 65, 177, 147, 248, 148, 32, 104, 104, 253, 243, 1, 240, 212, 248, - 220, 50, 195, 248, 144, 112, 217, 248, 8, 48, 35, 177, 13, 43, 2, 208, - 32, 70, 46, 240, 35, 221, 213, 248, 104, 1, 4, 33, 74, 240, 80, 220, - 5, 169, 40, 70, 75, 240, 66, 221, 0, 39, 57, 70, 129, 70, 132, 248, - 148, 112, 32, 70, 30, 240, 248, 222, 57, 70, 32, 70, 27, 240, 182, 222, - 32, 70, 57, 70, 18, 240, 168, 216, 187, 241, 0, 15, 65, 208, 4, 241, - 188, 0, 248, 243, 9, 246, 0, 40, 59, 209, 43, 107, 184, 248, 50, 112, - 24, 105, 7, 240, 45, 252, 135, 66, 51, 209, 213, 248, 92, 1, 184, 248, - 50, 16, 60, 240, 51, 217, 48, 185, 213, 248, 92, 1, 184, 248, 50, 16, - 60, 240, 168, 217, 104, 177, 102, 185, 213, 248, 92, 1, 184, 248, 50, - 16, 60, 240, 212, 216, 40, 185, 1, 35, 133, 248, 208, 56, 178, 70, 101, - 79, 0, 224, 55, 70, 8, 35, 5, 169, 1, 147, 40, 70, 4, 241, 194, 3, 10, - 70, 205, 248, 0, 144, 30, 240, 29, 217, 3, 70, 80, 177, 79, 177, 57, - 70, 40, 70, 82, 70, 26, 240, 225, 218, 0, 40, 8, 191, 0, 39, 0, 224, - 55, 70, 185, 241, 0, 15, 48, 208, 72, 70, 14, 33, 75, 240, 55, 217, - 43, 104, 147, 248, 68, 48, 35, 177, 213, 248, 100, 1, 73, 70, 56, 240, - 66, 217, 73, 70, 40, 70, 29, 240, 246, 216, 79, 240, 0, 9, 28, 224, - 43, 104, 147, 248, 149, 48, 131, 177, 213, 248, 0, 5, 7, 169, 75, 240, - 104, 217, 5, 224, 67, 104, 159, 0, 68, 191, 35, 240, 0, 83, 67, 96, - 7, 168, 75, 240, 102, 217, 0, 40, 244, 209, 79, 240, 1, 9, 132, 248, - 18, 144, 32, 70, 25, 240, 63, 217, 55, 70, 32, 70, 0, 33, 49, 240, 212, - 219, 5, 245, 0, 113, 40, 70, 6, 49, 33, 240, 110, 223, 43, 104, 147, - 248, 63, 48, 147, 185, 149, 249, 71, 38, 133, 248, 66, 54, 1, 50, 8, - 191, 133, 248, 67, 54, 40, 70, 27, 240, 63, 221, 43, 104, 147, 248, - 70, 48, 152, 7, 2, 208, 40, 70, 27, 240, 83, 221, 4, 241, 188, 11, 88, - 70, 248, 243, 112, 245, 1, 70, 48, 185, 32, 70, 5, 170, 8, 35, 205, - 248, 0, 144, 255, 247, 97, 252, 149, 248, 114, 50, 32, 70, 51, 185, - 213, 248, 108, 50, 156, 66, 2, 209, 255, 247, 220, 251, 4, 224, 19, - 240, 10, 219, 32, 70, 18, 240, 109, 221, 216, 248, 100, 16, 73, 177, - 104, 104, 184, 248, 104, 32, 252, 243, 27, 247, 0, 35, 200, 248, 100, - 48, 168, 248, 104, 48, 2, 35, 5, 170, 0, 147, 40, 70, 35, 70, 0, 33, - 25, 240, 190, 219, 32, 70, 0, 33, 25, 240, 140, 221, 32, 70, 25, 240, - 245, 220, 40, 70, 6, 240, 76, 248, 31, 177, 40, 70, 0, 33, 82, 70, 184, - 71, 158, 185, 32, 70, 49, 70, 50, 70, 52, 240, 61, 222, 49, 70, 6, 34, - 3, 152, 248, 243, 156, 240, 88, 70, 49, 70, 6, 34, 248, 243, 151, 240, - 48, 70, 3, 224, 79, 240, 255, 48, 0, 224, 0, 32, 9, 176, 189, 232, 240, - 143, 39, 150, 0, 0, 45, 233, 240, 79, 6, 41, 137, 176, 7, 70, 13, 70, - 144, 70, 155, 70, 157, 248, 72, 160, 208, 248, 0, 144, 208, 248, 216, - 98, 73, 208, 0, 41, 44, 209, 186, 241, 0, 15, 3, 209, 72, 70, 57, 70, - 53, 240, 42, 222, 153, 248, 114, 66, 0, 44, 61, 208, 217, 248, 0, 5, - 7, 169, 75, 240, 181, 216, 2, 224, 35, 126, 154, 7, 51, 212, 7, 168, - 75, 240, 182, 216, 4, 70, 0, 40, 246, 209, 80, 224, 217, 248, 48, 48, - 24, 105, 7, 240, 19, 251, 215, 248, 212, 50, 91, 142, 131, 66, 35, 208, - 72, 70, 42, 240, 159, 218, 217, 248, 52, 7, 42, 240, 185, 222, 27, 224, - 179, 104, 9, 59, 1, 43, 22, 216, 72, 70, 17, 70, 75, 240, 244, 219, - 16, 177, 12, 33, 75, 240, 66, 216, 2, 45, 10, 208, 217, 248, 8, 0, 49, - 104, 5, 240, 73, 219, 5, 45, 5, 216, 79, 240, 200, 67, 171, 64, 1, 213, - 1, 36, 0, 224, 0, 36, 141, 232, 32, 8, 19, 155, 72, 70, 2, 147, 51, - 108, 57, 70, 3, 147, 115, 108, 186, 241, 0, 15, 12, 191, 7, 34, 9, 34, - 4, 147, 67, 70, 18, 240, 142, 221, 156, 177, 5, 45, 1, 208, 2, 45, 7, - 209, 178, 127, 51, 127, 154, 66, 3, 210, 56, 70, 48, 240, 84, 218, 7, - 224, 56, 70, 255, 247, 182, 251, 3, 224, 115, 104, 3, 43, 171, 209, - 216, 231, 9, 176, 189, 232, 240, 143, 112, 181, 17, 70, 134, 176, 5, - 70, 22, 70, 75, 240, 175, 219, 4, 70, 0, 40, 36, 208, 144, 248, 223, - 48, 35, 177, 40, 70, 33, 70, 1, 34, 6, 240, 89, 252, 32, 70, 75, 240, - 39, 217, 227, 104, 27, 177, 40, 70, 33, 70, 61, 240, 11, 223, 0, 35, - 3, 34, 0, 147, 1, 146, 2, 147, 3, 147, 4, 147, 40, 70, 33, 105, 5, 34, - 51, 70, 18, 240, 78, 221, 40, 70, 33, 70, 6, 176, 189, 232, 112, 64, - 75, 240, 153, 155, 6, 176, 112, 189, 0, 0, 0, 72, 112, 71, 76, 202, - 1, 0, 0, 72, 112, 71, 108, 203, 1, 0, 16, 181, 6, 73, 4, 70, 64, 110, - 248, 243, 144, 244, 40, 185, 96, 110, 3, 73, 189, 232, 16, 64, 248, - 243, 137, 180, 16, 189, 13, 170, 134, 0, 10, 170, 134, 0, 112, 181, - 12, 70, 5, 105, 22, 70, 8, 70, 10, 34, 0, 33, 247, 243, 179, 247, 99, - 136, 30, 67, 235, 108, 102, 128, 152, 6, 3, 213, 35, 136, 67, 244, 128, - 99, 35, 128, 171, 111, 66, 242, 80, 2, 25, 140, 145, 66, 5, 209, 91, - 140, 5, 43, 156, 191, 70, 240, 4, 6, 102, 128, 112, 189, 208, 248, 236, - 16, 16, 181, 4, 70, 49, 177, 0, 104, 12, 34, 252, 243, 235, 245, 0, - 35, 196, 248, 236, 48, 16, 189, 1, 33, 131, 111, 16, 181, 128, 248, - 144, 16, 4, 70, 88, 106, 7, 240, 22, 248, 32, 70, 2, 33, 49, 240, 206, - 221, 163, 104, 152, 104, 5, 240, 210, 218, 0, 32, 16, 189, 0, 235, 129, - 3, 219, 111, 10, 70, 131, 103, 131, 104, 1, 241, 14, 1, 83, 248, 33, - 16, 25, 99, 144, 248, 235, 48, 91, 177, 144, 248, 232, 48, 67, 185, - 79, 244, 0, 81, 0, 110, 0, 42, 12, 191, 10, 70, 0, 34, 0, 240, 84, 158, - 112, 71, 0, 0, 45, 233, 243, 71, 6, 70, 136, 70, 34, 177, 131, 104, - 27, 104, 219, 105, 95, 107, 1, 224, 79, 240, 255, 55, 0, 37, 170, 70, - 44, 70, 10, 224, 186, 241, 0, 15, 2, 208, 202, 248, 4, 0, 0, 224, 4, - 70, 1, 53, 189, 66, 10, 210, 130, 70, 223, 248, 92, 144, 6, 235, 136, - 2, 217, 248, 104, 48, 208, 104, 152, 71, 0, 40, 234, 209, 48, 70, 106, - 70, 1, 169, 51, 240, 48, 218, 6, 235, 136, 2, 217, 248, 108, 48, 208, - 104, 152, 71, 15, 224, 0, 35, 212, 248, 4, 128, 33, 105, 99, 96, 1, - 155, 139, 97, 179, 111, 88, 106, 8, 240, 178, 252, 33, 70, 176, 104, - 254, 247, 244, 249, 68, 70, 0, 44, 237, 209, 189, 66, 52, 191, 0, 32, - 1, 32, 189, 232, 252, 135, 0, 191, 224, 166, 133, 0, 248, 181, 14, 70, - 1, 49, 4, 70, 3, 209, 131, 111, 94, 106, 6, 177, 158, 105, 148, 248, - 233, 80, 29, 185, 32, 70, 41, 70, 49, 240, 80, 221, 32, 110, 0, 240, - 83, 223, 120, 177, 0, 39, 227, 25, 216, 104, 16, 177, 37, 75, 155, 104, - 152, 71, 4, 55, 24, 47, 246, 209, 227, 104, 27, 177, 32, 70, 0, 33, - 49, 240, 136, 221, 148, 248, 232, 32, 66, 177, 163, 104, 0, 34, 32, - 70, 3, 33, 218, 97, 189, 232, 248, 64, 50, 240, 188, 158, 70, 240, 4, - 1, 132, 248, 234, 32, 32, 110, 0, 240, 223, 221, 163, 111, 1, 33, 132, - 248, 234, 16, 27, 177, 88, 106, 8, 177, 6, 240, 95, 255, 32, 70, 49, - 240, 65, 222, 227, 110, 32, 110, 211, 248, 224, 33, 1, 33, 34, 240, - 32, 2, 195, 248, 224, 33, 251, 243, 114, 246, 0, 33, 32, 70, 49, 240, - 14, 221, 32, 70, 50, 240, 137, 223, 32, 70, 1, 33, 50, 240, 93, 219, - 163, 104, 0, 34, 218, 97, 45, 185, 32, 70, 2, 33, 189, 232, 248, 64, - 49, 240, 253, 156, 248, 189, 224, 166, 133, 0, 131, 104, 16, 181, 26, - 104, 27, 105, 210, 248, 140, 32, 4, 70, 210, 248, 180, 16, 1, 49, 194, - 248, 180, 16, 147, 248, 234, 32, 90, 177, 219, 110, 64, 242, 4, 64, - 211, 248, 32, 49, 24, 64, 160, 245, 128, 97, 72, 66, 64, 235, 1, 0, - 6, 224, 24, 110, 2, 240, 9, 255, 208, 241, 1, 0, 56, 191, 0, 32, 32, - 177, 32, 70, 79, 240, 255, 49, 255, 247, 114, 255, 160, 104, 49, 240, - 105, 221, 160, 104, 189, 232, 16, 64, 28, 240, 194, 155, 56, 181, 4, - 70, 144, 248, 144, 0, 0, 40, 43, 208, 163, 104, 27, 105, 147, 248, 234, - 32, 82, 177, 219, 110, 64, 242, 4, 69, 211, 248, 32, 49, 29, 64, 181, - 245, 128, 101, 24, 191, 1, 37, 3, 224, 24, 110, 2, 240, 222, 254, 5, - 70, 163, 104, 21, 177, 0, 34, 26, 98, 12, 224, 152, 104, 5, 240, 166, - 217, 32, 70, 41, 70, 49, 240, 164, 220, 148, 248, 232, 48, 19, 185, - 32, 70, 49, 240, 188, 223, 163, 111, 88, 106, 189, 232, 56, 64, 6, 240, - 72, 191, 56, 189, 16, 181, 4, 105, 79, 244, 64, 65, 32, 70, 0, 34, 50, - 240, 27, 222, 212, 248, 248, 48, 32, 70, 27, 105, 19, 177, 49, 240, - 234, 217, 1, 224, 49, 240, 163, 223, 225, 108, 32, 110, 17, 240, 2, - 1, 24, 191, 79, 244, 0, 113, 10, 70, 0, 35, 189, 232, 16, 64, 0, 240, - 206, 157, 56, 181, 131, 104, 4, 70, 27, 104, 147, 248, 32, 80, 253, - 185, 1, 33, 51, 240, 112, 220, 32, 110, 2, 240, 124, 253, 32, 70, 41, - 70, 49, 240, 103, 220, 32, 70, 49, 240, 130, 223, 160, 104, 208, 248, - 72, 56, 27, 120, 11, 177, 49, 240, 173, 221, 163, 111, 88, 106, 6, 240, - 141, 254, 0, 35, 132, 248, 94, 48, 163, 104, 1, 34, 27, 104, 131, 248, - 32, 32, 56, 189, 56, 181, 1, 33, 4, 70, 51, 240, 77, 220, 32, 110, 2, - 240, 89, 253, 32, 70, 0, 33, 49, 240, 68, 220, 32, 70, 51, 240, 159, - 216, 5, 70, 48, 177, 32, 70, 0, 33, 51, 240, 61, 220, 111, 240, 8, 0, - 56, 189, 32, 70, 79, 240, 255, 49, 255, 247, 211, 254, 40, 70, 56, 189, - 56, 181, 4, 70, 144, 248, 144, 0, 0, 40, 68, 208, 163, 111, 0, 33, 132, - 248, 144, 16, 88, 106, 6, 240, 104, 254, 163, 104, 27, 105, 147, 248, - 234, 32, 82, 177, 219, 110, 64, 242, 4, 69, 211, 248, 32, 49, 29, 64, - 181, 245, 128, 101, 24, 191, 1, 37, 3, 224, 24, 110, 2, 240, 62, 254, - 5, 70, 109, 177, 0, 37, 163, 111, 132, 248, 235, 80, 132, 248, 234, - 80, 88, 106, 41, 70, 6, 240, 68, 254, 160, 104, 49, 240, 156, 220, 25, - 224, 32, 110, 0, 240, 4, 222, 120, 177, 227, 110, 211, 248, 32, 49, - 216, 7, 2, 213, 32, 70, 51, 240, 39, 218, 163, 104, 152, 104, 248, 247, - 163, 253, 5, 70, 32, 70, 51, 240, 13, 220, 148, 248, 232, 16, 17, 185, - 32, 70, 51, 240, 233, 219, 40, 70, 56, 189, 0, 0, 112, 181, 8, 41, 134, - 176, 4, 70, 14, 70, 0, 243, 244, 128, 131, 104, 125, 73, 27, 104, 88, - 105, 248, 243, 39, 242, 8, 46, 28, 209, 35, 110, 154, 105, 146, 0, 2, - 213, 218, 105, 214, 7, 8, 213, 226, 108, 209, 7, 8, 213, 34, 109, 18, - 6, 5, 212, 219, 105, 219, 7, 2, 213, 99, 109, 158, 0, 3, 212, 38, 109, - 22, 240, 128, 6, 15, 208, 70, 178, 2, 46, 204, 191, 5, 38, 1, 38, 0, - 224, 70, 177, 212, 248, 248, 48, 91, 104, 2, 43, 3, 221, 163, 109, 153, - 0, 64, 241, 200, 128, 10, 34, 3, 168, 0, 33, 247, 243, 93, 245, 212, - 248, 248, 48, 0, 34, 26, 129, 148, 248, 144, 80, 101, 177, 226, 110, - 210, 248, 32, 81, 5, 240, 1, 5, 70, 185, 27, 104, 0, 43, 100, 208, 32, - 70, 49, 240, 180, 222, 96, 224, 0, 46, 93, 208, 189, 248, 12, 32, 89, - 104, 66, 240, 16, 2, 2, 41, 173, 248, 12, 32, 98, 109, 3, 209, 34, 240, - 0, 82, 98, 101, 38, 224, 66, 240, 0, 82, 98, 101, 114, 7, 1, 212, 20, - 34, 26, 129, 34, 110, 144, 105, 128, 0, 2, 213, 208, 105, 192, 7, 8, - 213, 224, 108, 192, 7, 10, 213, 32, 109, 0, 6, 7, 212, 210, 105, 208, - 7, 4, 213, 26, 137, 66, 240, 64, 2, 26, 129, 10, 224, 4, 41, 5, 209, - 189, 248, 16, 32, 66, 244, 0, 82, 173, 248, 16, 32, 0, 34, 26, 97, 218, - 96, 90, 104, 2, 42, 18, 209, 226, 108, 18, 244, 128, 79, 189, 248, 14, - 32, 8, 208, 66, 244, 128, 114, 173, 248, 14, 32, 48, 34, 218, 96, 32, - 34, 26, 97, 3, 224, 34, 244, 128, 114, 173, 248, 14, 32, 26, 137, 22, - 240, 2, 15, 20, 191, 66, 240, 1, 2, 34, 240, 1, 2, 26, 129, 26, 137, - 22, 240, 4, 15, 20, 191, 66, 240, 8, 2, 34, 240, 8, 2, 26, 129, 10, - 224, 53, 70, 189, 248, 12, 48, 35, 240, 16, 3, 173, 248, 12, 48, 99, - 109, 35, 240, 0, 83, 99, 101, 212, 248, 248, 48, 97, 109, 30, 96, 163, - 111, 88, 106, 7, 240, 57, 250, 148, 248, 144, 48, 27, 177, 21, 177, - 32, 70, 51, 240, 77, 217, 2, 38, 189, 248, 12, 48, 32, 70, 0, 33, 16, - 34, 0, 150, 50, 240, 176, 220, 189, 248, 14, 48, 32, 70, 1, 33, 79, - 244, 128, 114, 0, 150, 50, 240, 167, 220, 189, 248, 16, 48, 32, 70, - 49, 70, 79, 244, 0, 82, 0, 150, 50, 240, 158, 220, 32, 70, 49, 240, - 187, 218, 148, 248, 144, 0, 184, 177, 163, 111, 27, 104, 179, 66, 6, - 209, 212, 248, 248, 48, 27, 104, 19, 177, 32, 70, 49, 240, 81, 216, - 85, 177, 32, 70, 50, 240, 119, 217, 0, 32, 6, 224, 111, 240, 1, 0, 3, - 224, 111, 240, 2, 0, 0, 224, 40, 70, 6, 176, 112, 189, 198, 92, 134, - 0, 247, 181, 133, 104, 198, 110, 43, 104, 4, 70, 219, 105, 6, 39, 27, - 106, 105, 70, 197, 248, 172, 56, 48, 75, 58, 70, 24, 104, 0, 144, 155, - 136, 96, 108, 173, 248, 4, 48, 45, 75, 7, 251, 0, 48, 24, 56, 247, 243, - 21, 244, 4, 35, 197, 248, 172, 56, 3, 35, 133, 248, 169, 56, 160, 104, - 32, 240, 118, 219, 32, 177, 213, 248, 172, 120, 191, 0, 1, 55, 191, - 178, 212, 248, 184, 48, 0, 34, 153, 92, 56, 10, 121, 24, 137, 178, 1, - 57, 253, 178, 69, 234, 1, 37, 0, 240, 1, 0, 1, 244, 128, 113, 8, 67, - 111, 234, 66, 97, 111, 234, 81, 65, 166, 248, 64, 21, 166, 248, 32, - 85, 166, 248, 44, 5, 166, 248, 64, 21, 153, 92, 1, 50, 127, 24, 6, 42, - 191, 178, 224, 209, 32, 70, 152, 33, 90, 120, 51, 240, 77, 218, 212, - 248, 184, 48, 32, 70, 154, 33, 154, 120, 51, 240, 70, 218, 212, 248, - 184, 48, 32, 70, 218, 120, 27, 120, 156, 33, 67, 234, 2, 34, 51, 240, - 60, 218, 212, 248, 184, 48, 32, 70, 90, 121, 27, 121, 158, 33, 67, 234, - 2, 34, 51, 240, 50, 218, 254, 189, 0, 191, 80, 184, 1, 0, 36, 255, 1, - 0, 240, 181, 4, 105, 6, 70, 133, 176, 32, 70, 146, 33, 50, 240, 10, - 223, 64, 0, 128, 178, 166, 248, 66, 0, 80, 179, 0, 37, 15, 33, 104, - 70, 20, 74, 43, 70, 247, 243, 82, 244, 96, 110, 105, 70, 248, 243, 210, - 240, 96, 177, 105, 70, 96, 110, 182, 248, 66, 112, 248, 243, 159, 240, - 7, 235, 69, 7, 130, 178, 57, 70, 32, 70, 51, 240, 6, 218, 1, 53, 119, - 45, 228, 209, 96, 110, 8, 73, 248, 243, 189, 240, 72, 177, 96, 110, - 6, 73, 212, 248, 248, 80, 248, 243, 138, 240, 40, 129, 32, 70, 49, 240, - 244, 217, 5, 176, 240, 189, 174, 172, 134, 0, 23, 124, 134, 0, 129, - 111, 16, 181, 8, 49, 4, 70, 49, 240, 244, 220, 255, 247, 6, 252, 1, - 70, 32, 70, 189, 232, 16, 64, 49, 240, 204, 156, 16, 181, 131, 111, - 6, 74, 28, 106, 64, 242, 238, 35, 148, 33, 148, 66, 20, 191, 26, 70, - 79, 244, 22, 98, 189, 232, 16, 64, 51, 240, 208, 153, 80, 32, 8, 0, - 115, 181, 4, 105, 5, 70, 32, 70, 14, 70, 255, 247, 217, 255, 163, 111, - 49, 70, 88, 106, 7, 240, 160, 250, 43, 104, 1, 34, 131, 248, 116, 32, - 32, 70, 49, 240, 255, 219, 163, 111, 32, 70, 153, 138, 50, 240, 146, - 223, 163, 111, 32, 70, 217, 138, 50, 240, 123, 223, 32, 70, 148, 248, - 134, 16, 49, 240, 128, 217, 163, 111, 32, 70, 82, 33, 154, 139, 51, - 240, 166, 217, 163, 111, 80, 33, 218, 139, 32, 70, 51, 240, 160, 217, - 32, 70, 49, 240, 3, 220, 32, 70, 255, 247, 186, 255, 3, 35, 0, 147, - 32, 70, 4, 33, 8, 34, 0, 35, 50, 240, 114, 219, 32, 70, 2, 176, 189, - 232, 112, 64, 48, 240, 48, 159, 45, 233, 240, 65, 23, 70, 4, 70, 13, - 70, 189, 248, 24, 32, 157, 248, 28, 96, 152, 70, 59, 177, 131, 104, - 12, 49, 219, 106, 3, 235, 65, 3, 153, 136, 113, 24, 153, 128, 79, 246, - 255, 115, 154, 66, 3, 208, 32, 70, 168, 33, 51, 240, 113, 217, 4, 235, - 133, 3, 216, 104, 9, 75, 57, 70, 66, 70, 91, 106, 152, 71, 0, 40, 10, - 218, 184, 241, 0, 15, 7, 208, 163, 104, 12, 53, 219, 106, 3, 235, 69, - 5, 171, 136, 158, 27, 174, 128, 189, 232, 240, 129, 224, 166, 133, 0, - 45, 233, 240, 65, 4, 105, 134, 176, 79, 240, 255, 49, 161, 74, 6, 70, - 32, 70, 229, 110, 50, 240, 26, 219, 212, 248, 248, 48, 32, 70, 25, 104, - 255, 247, 164, 253, 163, 109, 43, 177, 3, 35, 165, 248, 180, 54, 255, - 35, 165, 248, 184, 54, 227, 108, 219, 7, 36, 213, 151, 75, 26, 104, - 10, 187, 1, 33, 25, 96, 35, 109, 32, 110, 31, 6, 3, 213, 3, 33, 2, 240, - 236, 250, 23, 224, 2, 240, 233, 250, 35, 109, 154, 0, 18, 212, 32, 70, - 146, 33, 50, 240, 11, 222, 71, 0, 191, 178, 95, 177, 206, 55, 57, 70, - 32, 70, 50, 240, 3, 222, 64, 240, 64, 2, 57, 70, 32, 70, 146, 178, 51, - 240, 22, 217, 79, 240, 255, 49, 197, 248, 40, 17, 32, 70, 131, 74, 50, - 240, 220, 218, 130, 79, 2, 224, 10, 32, 251, 243, 139, 246, 213, 248, - 40, 49, 219, 7, 1, 212, 1, 63, 246, 209, 48, 70, 213, 248, 40, 49, 255, - 247, 169, 252, 212, 248, 244, 48, 43, 185, 35, 110, 154, 106, 64, 242, - 148, 83, 154, 66, 19, 209, 32, 110, 118, 74, 131, 107, 154, 24, 1, 42, - 7, 217, 74, 246, 230, 2, 147, 66, 3, 208, 74, 246, 229, 2, 147, 66, - 5, 209, 8, 35, 0, 33, 40, 34, 0, 147, 0, 240, 253, 217, 0, 33, 10, 70, - 32, 110, 0, 240, 220, 217, 255, 247, 254, 250, 1, 70, 32, 70, 49, 240, - 194, 219, 32, 70, 255, 247, 55, 254, 79, 244, 128, 51, 0, 147, 32, 70, - 6, 35, 152, 33, 3, 170, 49, 240, 246, 222, 51, 104, 147, 248, 56, 48, - 203, 177, 48, 70, 32, 240, 191, 217, 1, 40, 20, 209, 0, 39, 5, 151, - 184, 70, 11, 224, 79, 244, 192, 35, 0, 147, 57, 70, 32, 70, 5, 170, - 4, 35, 49, 240, 6, 223, 8, 241, 1, 8, 36, 55, 51, 104, 219, 105, 27, - 106, 152, 69, 238, 211, 32, 70, 128, 33, 8, 34, 51, 240, 167, 216, 32, - 70, 92, 33, 10, 34, 51, 240, 162, 216, 79, 240, 128, 115, 77, 74, 197, - 248, 0, 49, 32, 70, 76, 73, 50, 240, 103, 218, 79, 240, 0, 67, 197, - 248, 136, 49, 79, 240, 0, 115, 197, 248, 140, 49, 79, 244, 128, 67, - 197, 248, 40, 49, 79, 244, 128, 51, 107, 98, 1, 33, 32, 70, 50, 240, - 66, 218, 32, 110, 2, 240, 215, 249, 22, 33, 48, 131, 180, 248, 68, 32, - 165, 248, 168, 6, 32, 70, 51, 240, 122, 216, 32, 70, 192, 33, 180, 248, - 84, 32, 51, 240, 116, 216, 32, 70, 194, 33, 180, 248, 86, 32, 51, 240, - 110, 216, 54, 75, 32, 70, 197, 248, 96, 49, 213, 248, 96, 49, 180, 248, - 136, 48, 68, 33, 197, 248, 100, 49, 50, 75, 180, 248, 140, 32, 197, - 248, 96, 49, 213, 248, 96, 49, 180, 248, 138, 48, 197, 248, 100, 49, - 51, 240, 86, 216, 32, 70, 70, 33, 180, 248, 142, 32, 51, 240, 80, 216, - 181, 248, 136, 54, 27, 5, 27, 13, 165, 248, 136, 54, 1, 35, 165, 248, - 156, 54, 0, 37, 181, 100, 99, 25, 216, 104, 16, 177, 34, 75, 91, 104, - 152, 71, 4, 53, 24, 45, 246, 209, 31, 77, 224, 104, 43, 109, 152, 71, - 235, 110, 224, 104, 152, 71, 48, 70, 255, 247, 6, 254, 35, 110, 154, - 107, 74, 246, 98, 19, 154, 66, 26, 209, 227, 108, 216, 7, 23, 213, 35, - 109, 25, 6, 20, 212, 154, 0, 18, 212, 32, 70, 146, 33, 50, 240, 6, 221, - 69, 0, 173, 178, 93, 177, 206, 53, 41, 70, 32, 70, 50, 240, 254, 220, - 64, 240, 64, 2, 41, 70, 32, 70, 146, 178, 51, 240, 17, 216, 6, 176, - 189, 232, 240, 129, 4, 4, 0, 4, 220, 8, 2, 0, 2, 4, 2, 4, 161, 134, - 1, 0, 29, 87, 255, 255, 0, 0, 2, 64, 0, 0, 6, 64, 6, 0, 2, 0, 7, 0, - 2, 0, 224, 166, 133, 0, 45, 233, 248, 67, 144, 248, 233, 96, 4, 70, - 15, 70, 145, 70, 133, 104, 22, 185, 49, 70, 49, 240, 48, 216, 168, 104, - 4, 240, 43, 221, 7, 244, 112, 65, 161, 245, 128, 82, 81, 66, 65, 235, - 2, 1, 128, 70, 32, 70, 255, 247, 90, 250, 163, 111, 57, 70, 88, 106, - 6, 240, 134, 252, 163, 111, 88, 106, 6, 240, 98, 250, 40, 70, 255, 247, - 124, 254, 185, 241, 0, 15, 4, 208, 1, 33, 32, 70, 10, 70, 50, 240, 8, - 218, 40, 70, 57, 70, 255, 247, 250, 253, 168, 104, 65, 70, 4, 240, 24, - 221, 212, 248, 212, 48, 67, 240, 4, 3, 196, 248, 212, 48, 1, 35, 196, - 248, 208, 48, 46, 185, 32, 70, 2, 33, 189, 232, 248, 67, 48, 240, 246, - 159, 189, 232, 248, 131, 209, 248, 204, 48, 115, 181, 67, 244, 0, 83, - 193, 248, 204, 48, 5, 70, 12, 70, 52, 240, 63, 220, 6, 70, 0, 40, 64, - 240, 132, 128, 181, 248, 130, 49, 68, 242, 33, 50, 147, 66, 31, 208, - 68, 242, 19, 50, 147, 66, 27, 208, 68, 242, 26, 50, 147, 66, 23, 208, - 68, 242, 42, 50, 147, 66, 19, 208, 68, 242, 22, 50, 147, 66, 15, 208, - 68, 242, 29, 50, 147, 66, 11, 208, 68, 242, 45, 50, 147, 66, 7, 208, - 68, 242, 82, 50, 147, 66, 3, 208, 171, 107, 91, 125, 0, 43, 88, 208, - 43, 107, 147, 248, 236, 48, 67, 177, 181, 248, 38, 54, 3, 244, 64, 99, - 179, 245, 64, 111, 20, 191, 20, 35, 40, 35, 42, 104, 146, 248, 70, 32, - 18, 240, 3, 2, 7, 208, 212, 248, 204, 32, 2, 244, 128, 82, 210, 241, - 1, 2, 56, 191, 0, 34, 0, 146, 40, 70, 33, 70, 2, 34, 51, 240, 134, 221, - 6, 70, 0, 40, 57, 209, 212, 248, 240, 18, 41, 177, 213, 248, 76, 1, - 68, 240, 116, 219, 196, 248, 240, 98, 213, 248, 76, 1, 33, 70, 68, 240, - 63, 219, 196, 248, 240, 2, 0, 40, 37, 208, 163, 121, 187, 177, 148, - 248, 245, 50, 49, 43, 14, 216, 43, 104, 27, 126, 43, 177, 40, 70, 148, - 248, 244, 18, 15, 74, 30, 240, 36, 219, 213, 248, 76, 1, 148, 248, 244, - 18, 68, 240, 106, 218, 148, 248, 245, 50, 132, 248, 244, 50, 13, 224, - 213, 248, 76, 1, 4, 245, 61, 113, 2, 176, 189, 232, 112, 64, 68, 240, - 32, 154, 111, 240, 11, 6, 1, 224, 111, 240, 26, 6, 48, 70, 2, 176, 112, - 189, 50, 158, 133, 0, 45, 233, 240, 65, 5, 70, 52, 240, 171, 220, 46, - 70, 128, 70, 5, 241, 32, 7, 214, 248, 76, 66, 108, 177, 163, 121, 91, - 177, 68, 69, 9, 208, 99, 121, 27, 177, 40, 70, 33, 70, 52, 240, 26, - 216, 40, 70, 33, 70, 52, 240, 242, 218, 4, 54, 190, 66, 235, 209, 189, - 232, 240, 129, 45, 233, 243, 71, 10, 158, 128, 70, 15, 70, 145, 70, - 29, 70, 221, 248, 44, 160, 208, 248, 184, 64, 35, 224, 99, 104, 26, - 234, 3, 15, 30, 208, 219, 5, 7, 213, 4, 241, 10, 1, 34, 122, 99, 122, - 40, 70, 0, 145, 49, 70, 13, 224, 47, 177, 64, 70, 73, 70, 4, 241, 8, - 2, 184, 71, 72, 177, 4, 241, 10, 2, 99, 122, 40, 70, 0, 146, 49, 70, - 221, 34, 33, 240, 109, 217, 0, 224, 40, 70, 45, 26, 118, 25, 5, 70, - 36, 104, 0, 44, 217, 209, 40, 70, 189, 232, 252, 135, 45, 233, 240, - 79, 209, 248, 212, 50, 135, 176, 179, 248, 50, 176, 139, 121, 5, 70, - 14, 70, 208, 248, 12, 128, 208, 248, 76, 145, 0, 43, 0, 240, 159, 128, - 79, 240, 0, 10, 84, 70, 5, 235, 10, 3, 211, 248, 76, 114, 127, 177, - 187, 121, 107, 185, 251, 121, 91, 177, 215, 248, 212, 50, 88, 142, 248, - 243, 140, 241, 4, 70, 88, 70, 248, 243, 136, 241, 132, 66, 60, 70, 6, - 209, 10, 241, 4, 10, 186, 241, 32, 15, 229, 209, 0, 44, 127, 208, 212, - 248, 212, 50, 88, 142, 248, 243, 121, 241, 7, 70, 88, 70, 248, 243, - 117, 241, 135, 66, 5, 208, 212, 248, 212, 34, 214, 248, 212, 50, 210, - 141, 218, 133, 40, 70, 4, 169, 5, 170, 27, 240, 16, 217, 33, 70, 213, - 248, 76, 1, 68, 240, 103, 217, 24, 39, 71, 67, 213, 248, 76, 1, 7, 241, - 58, 1, 68, 240, 73, 222, 56, 185, 5, 154, 4, 155, 72, 70, 33, 70, 141, - 232, 12, 0, 4, 240, 34, 248, 213, 248, 76, 1, 7, 241, 64, 1, 68, 240, - 58, 222, 212, 248, 212, 50, 4, 153, 221, 141, 64, 1, 173, 2, 205, 66, - 2, 144, 3, 211, 168, 66, 10, 211, 0, 224, 16, 70, 33, 240, 127, 67, - 35, 244, 96, 3, 152, 66, 0, 235, 5, 2, 246, 211, 2, 144, 3, 170, 2, - 171, 5, 152, 5, 240, 66, 252, 32, 70, 26, 240, 108, 219, 2, 169, 3, - 70, 0, 34, 3, 168, 31, 240, 116, 223, 214, 248, 212, 50, 109, 8, 220, - 141, 3, 168, 43, 70, 164, 2, 2, 169, 0, 34, 31, 240, 131, 223, 1, 38, - 35, 70, 1, 224, 1, 54, 27, 25, 171, 66, 251, 211, 3, 168, 2, 169, 0, - 34, 31, 240, 119, 223, 2, 155, 5, 168, 4, 169, 3, 154, 31, 240, 113, - 223, 4, 155, 1, 54, 200, 248, 128, 49, 5, 155, 200, 248, 132, 49, 163, - 1, 116, 67, 200, 248, 136, 49, 200, 248, 140, 65, 7, 176, 189, 232, - 240, 143, 0, 32, 16, 96, 112, 71, 5, 240, 112, 189, 8, 181, 5, 240, - 83, 253, 192, 178, 8, 189, 8, 70, 17, 70, 5, 240, 183, 189, 0, 0, 45, - 233, 248, 79, 5, 70, 15, 70, 70, 104, 0, 33, 16, 70, 20, 70, 201, 34, - 246, 243, 239, 247, 40, 70, 57, 70, 59, 240, 153, 217, 112, 185, 150, - 248, 80, 55, 0, 43, 1, 240, 49, 128, 6, 245, 170, 97, 48, 70, 14, 49, - 58, 240, 231, 219, 128, 70, 24, 185, 189, 232, 248, 143, 213, 248, 16, - 128, 253, 178, 7, 244, 112, 71, 167, 245, 128, 94, 222, 241, 0, 7, 152, - 248, 0, 0, 71, 235, 14, 7, 5, 240, 120, 252, 14, 55, 86, 248, 39, 112, - 6, 70, 152, 248, 2, 0, 5, 240, 136, 252, 150, 248, 17, 192, 3, 70, 28, - 240, 1, 12, 151, 248, 4, 17, 2, 208, 79, 250, 129, 252, 4, 224, 73, - 178, 24, 41, 200, 191, 161, 241, 24, 12, 151, 74, 150, 66, 6, 208, 151, - 74, 150, 66, 6, 208, 150, 74, 150, 66, 5, 209, 2, 224, 82, 32, 88, 34, - 3, 224, 88, 32, 0, 224, 127, 32, 2, 70, 57, 104, 2, 41, 105, 209, 1, - 45, 4, 217, 10, 45, 140, 191, 2, 33, 1, 33, 0, 224, 0, 33, 223, 248, - 64, 130, 113, 24, 70, 69, 145, 249, 6, 16, 2, 209, 11, 45, 18, 209, - 71, 224, 223, 248, 48, 130, 70, 69, 3, 209, 14, 45, 8, 191, 54, 33, - 68, 224, 223, 248, 36, 130, 70, 69, 3, 208, 223, 248, 32, 130, 70, 69, - 5, 209, 11, 45, 55, 208, 14, 45, 8, 191, 64, 33, 54, 224, 223, 248, - 16, 130, 70, 69, 3, 209, 14, 45, 8, 191, 42, 33, 46, 224, 223, 248, - 4, 130, 70, 69, 5, 209, 2, 45, 39, 208, 10, 45, 8, 191, 84, 33, 36, - 224, 223, 248, 244, 129, 70, 69, 3, 209, 10, 45, 8, 191, 80, 33, 28, - 224, 223, 248, 232, 129, 70, 69, 3, 209, 14, 45, 8, 191, 40, 33, 20, - 224, 223, 248, 220, 129, 70, 69, 3, 209, 11, 45, 8, 191, 62, 33, 12, - 224, 223, 248, 208, 129, 70, 69, 8, 209, 12, 45, 8, 191, 68, 33, 4, - 224, 76, 33, 2, 224, 64, 33, 0, 224, 88, 33, 204, 235, 1, 1, 33, 234, - 225, 113, 145, 66, 168, 191, 17, 70, 33, 112, 97, 112, 161, 112, 225, - 112, 91, 74, 150, 66, 8, 208, 91, 74, 150, 66, 5, 208, 90, 74, 150, - 66, 2, 208, 90, 74, 150, 66, 8, 209, 151, 249, 4, 193, 188, 241, 24, - 15, 204, 191, 172, 241, 24, 12, 79, 240, 0, 12, 57, 104, 2, 41, 64, - 240, 68, 129, 1, 45, 4, 217, 10, 45, 140, 191, 5, 34, 4, 34, 0, 224, - 3, 34, 223, 248, 60, 129, 178, 24, 70, 69, 146, 249, 6, 32, 3, 209, - 11, 45, 8, 191, 66, 34, 79, 225, 223, 248, 76, 129, 70, 69, 6, 209, - 2, 45, 0, 240, 62, 129, 10, 45, 8, 191, 74, 34, 68, 225, 223, 248, 20, - 129, 70, 69, 3, 209, 11, 45, 8, 191, 70, 34, 60, 225, 223, 248, 8, 129, - 70, 69, 3, 208, 223, 248, 4, 129, 70, 69, 3, 209, 11, 45, 8, 191, 64, - 34, 48, 225, 223, 248, 20, 129, 70, 69, 3, 208, 223, 248, 16, 129, 70, - 69, 3, 209, 13, 45, 8, 191, 46, 34, 36, 225, 223, 248, 4, 129, 70, 69, - 6, 209, 11, 45, 0, 240, 200, 128, 13, 45, 8, 191, 64, 34, 25, 225, 223, - 248, 176, 128, 70, 69, 0, 240, 151, 128, 223, 248, 192, 128, 70, 69, - 3, 209, 11, 45, 8, 191, 62, 34, 12, 225, 223, 248, 180, 128, 70, 69, - 29, 208, 223, 248, 176, 128, 70, 69, 6, 209, 2, 45, 0, 240, 249, 128, - 10, 45, 8, 191, 76, 34, 253, 224, 223, 248, 184, 128, 70, 69, 6, 209, - 2, 45, 0, 240, 240, 128, 10, 45, 8, 191, 72, 34, 242, 224, 223, 248, - 168, 128, 70, 69, 3, 208, 223, 248, 164, 128, 70, 69, 6, 209, 2, 45, - 0, 240, 227, 128, 10, 45, 8, 191, 80, 34, 227, 224, 223, 248, 144, 128, - 70, 69, 12, 209, 2, 45, 0, 240, 220, 128, 10, 45, 0, 240, 217, 128, - 3, 45, 0, 240, 212, 128, 9, 45, 8, 191, 70, 34, 210, 224, 223, 248, - 116, 128, 70, 69, 56, 209, 10, 45, 8, 191, 66, 34, 202, 224, 0, 191, - 188, 16, 134, 0, 240, 16, 134, 0, 36, 17, 134, 0, 52, 13, 134, 0, 92, - 13, 134, 0, 128, 17, 134, 0, 252, 13, 134, 0, 64, 9, 134, 0, 80, 192, - 1, 0, 188, 12, 134, 0, 208, 12, 134, 0, 112, 13, 134, 0, 124, 9, 134, - 0, 144, 9, 134, 0, 132, 13, 134, 0, 236, 192, 1, 0, 196, 194, 1, 0, - 176, 194, 1, 0, 228, 12, 134, 0, 12, 13, 134, 0, 16, 200, 1, 0, 204, - 9, 134, 0, 164, 9, 134, 0, 184, 9, 134, 0, 244, 9, 134, 0, 24, 9, 134, - 0, 223, 248, 184, 132, 70, 69, 5, 209, 165, 241, 12, 6, 1, 46, 152, - 191, 60, 34, 139, 224, 223, 248, 168, 132, 70, 69, 3, 209, 11, 45, 136, - 191, 64, 34, 131, 224, 223, 248, 156, 132, 70, 69, 5, 209, 12, 45, 124, - 208, 13, 45, 8, 191, 56, 34, 121, 224, 223, 248, 140, 132, 70, 69, 5, - 209, 2, 45, 114, 208, 10, 45, 8, 191, 60, 34, 111, 224, 223, 248, 124, - 132, 70, 69, 3, 209, 11, 45, 8, 191, 56, 34, 103, 224, 223, 248, 112, - 132, 70, 69, 3, 209, 11, 45, 8, 191, 50, 34, 95, 224, 223, 248, 100, - 132, 70, 69, 7, 209, 11, 45, 3, 208, 12, 45, 8, 191, 74, 34, 85, 224, - 56, 34, 83, 224, 223, 248, 80, 132, 70, 69, 5, 209, 12, 45, 74, 208, - 13, 45, 8, 191, 58, 34, 73, 224, 223, 248, 64, 132, 70, 69, 5, 209, - 165, 241, 11, 6, 1, 46, 152, 191, 74, 34, 63, 224, 223, 248, 48, 132, - 70, 69, 3, 209, 11, 45, 8, 191, 60, 34, 55, 224, 223, 248, 36, 132, - 70, 69, 5, 209, 12, 45, 40, 208, 13, 45, 8, 191, 68, 34, 45, 224, 223, - 248, 20, 132, 70, 69, 41, 209, 110, 30, 13, 46, 38, 216, 223, 248, 12, - 132, 24, 248, 6, 96, 0, 46, 24, 191, 50, 70, 30, 224, 51, 45, 8, 217, - 61, 45, 8, 217, 99, 45, 8, 217, 148, 45, 140, 191, 4, 34, 3, 34, 4, - 224, 0, 34, 2, 224, 1, 34, 0, 224, 2, 34, 182, 24, 150, 249, 6, 32, - 10, 224, 74, 34, 8, 224, 76, 34, 6, 224, 72, 34, 4, 224, 80, 34, 2, - 224, 70, 34, 0, 224, 64, 34, 204, 235, 2, 2, 34, 234, 226, 114, 130, - 66, 168, 191, 2, 70, 2, 41, 3, 209, 33, 120, 138, 66, 168, 191, 10, - 70, 34, 113, 98, 113, 162, 113, 226, 113, 34, 114, 98, 114, 162, 114, - 226, 114, 164, 70, 33, 70, 0, 32, 0, 38, 1, 48, 129, 248, 52, 96, 10, - 115, 129, 248, 60, 96, 1, 49, 8, 40, 245, 209, 24, 127, 151, 248, 4, - 33, 16, 240, 1, 0, 1, 208, 80, 178, 4, 224, 82, 178, 24, 42, 200, 191, - 162, 241, 24, 0, 58, 104, 2, 42, 1, 209, 110, 30, 15, 224, 51, 45, 8, - 217, 61, 45, 8, 217, 99, 45, 8, 217, 148, 45, 140, 191, 4, 38, 3, 38, - 4, 224, 0, 38, 2, 224, 1, 38, 0, 224, 2, 38, 154, 87, 158, 25, 150, - 249, 14, 16, 150, 78, 179, 66, 5, 209, 165, 241, 100, 6, 2, 46, 152, - 191, 62, 33, 6, 224, 147, 78, 179, 66, 3, 209, 100, 45, 8, 191, 56, - 34, 8, 224, 144, 78, 179, 66, 5, 209, 165, 241, 100, 6, 2, 46, 152, - 191, 62, 33, 2, 224, 141, 78, 179, 66, 14, 208, 140, 78, 179, 66, 11, - 208, 140, 78, 179, 66, 8, 208, 139, 78, 179, 66, 5, 208, 139, 78, 179, - 66, 2, 208, 138, 78, 179, 66, 23, 209, 165, 241, 104, 6, 36, 46, 19, - 216, 132, 74, 147, 66, 14, 208, 131, 74, 147, 66, 11, 208, 132, 74, - 147, 66, 8, 208, 126, 74, 147, 66, 17, 208, 128, 74, 147, 66, 14, 208, - 74, 33, 68, 34, 1, 224, 74, 33, 66, 34, 126, 78, 179, 66, 11, 209, 165, - 241, 104, 6, 32, 46, 5, 217, 140, 45, 32, 209, 15, 224, 68, 33, 10, - 70, 1, 224, 64, 33, 68, 34, 119, 78, 179, 66, 12, 209, 100, 45, 8, 208, - 165, 241, 104, 6, 12, 46, 64, 242, 88, 133, 46, 224, 54, 33, 10, 70, - 1, 224, 52, 33, 64, 34, 112, 78, 179, 66, 7, 209, 165, 241, 100, 6, - 16, 46, 152, 191, 66, 33, 152, 191, 82, 34, 30, 224, 108, 78, 179, 66, - 27, 209, 165, 241, 100, 6, 8, 46, 152, 191, 48, 33, 165, 241, 110, 6, - 152, 191, 52, 34, 22, 46, 152, 191, 70, 33, 165, 241, 134, 6, 2, 46, - 5, 217, 140, 45, 8, 191, 72, 33, 8, 191, 54, 34, 0, 224, 62, 33, 165, - 241, 149, 6, 15, 46, 152, 191, 68, 34, 93, 78, 179, 66, 179, 70, 18, - 209, 165, 241, 110, 6, 22, 46, 165, 241, 134, 6, 152, 191, 68, 33, 152, - 191, 58, 34, 2, 46, 5, 217, 140, 45, 8, 191, 72, 33, 8, 191, 54, 34, - 1, 224, 62, 33, 58, 34, 83, 78, 179, 66, 2, 208, 82, 78, 179, 66, 4, - 209, 165, 241, 132, 6, 8, 46, 152, 191, 44, 34, 79, 78, 179, 66, 2, - 209, 38, 45, 8, 191, 44, 33, 18, 26, 8, 26, 34, 234, 226, 114, 32, 234, - 224, 112, 33, 70, 0, 39, 14, 121, 1, 55, 1, 49, 206, 116, 0, 38, 8, - 47, 129, 248, 67, 96, 246, 209, 33, 70, 1, 54, 10, 119, 129, 248, 76, - 0, 1, 49, 8, 46, 248, 209, 65, 79, 187, 66, 0, 240, 244, 128, 64, 73, - 139, 66, 0, 240, 240, 128, 63, 73, 139, 66, 0, 240, 236, 128, 62, 73, - 139, 66, 0, 240, 232, 128, 61, 73, 139, 66, 0, 240, 228, 128, 60, 73, - 139, 66, 0, 240, 181, 128, 59, 73, 139, 66, 0, 240, 220, 128, 58, 73, - 139, 66, 0, 240, 216, 128, 57, 73, 139, 66, 0, 240, 212, 128, 56, 73, - 139, 66, 0, 240, 208, 128, 55, 73, 139, 66, 0, 240, 204, 128, 54, 73, - 139, 66, 0, 240, 200, 128, 53, 73, 139, 66, 0, 240, 196, 128, 52, 73, - 139, 66, 0, 240, 192, 128, 51, 73, 139, 66, 0, 240, 188, 128, 50, 73, - 139, 66, 0, 240, 184, 128, 49, 73, 139, 66, 0, 240, 180, 128, 48, 73, - 139, 66, 0, 240, 176, 128, 47, 73, 139, 66, 0, 240, 172, 128, 46, 73, - 139, 66, 0, 240, 168, 128, 45, 73, 139, 66, 0, 240, 164, 128, 44, 73, - 139, 66, 0, 240, 160, 128, 43, 73, 139, 66, 0, 240, 156, 128, 42, 73, - 139, 66, 64, 240, 209, 128, 150, 224, 181, 8, 134, 0, 111, 199, 1, 0, - 210, 8, 134, 0, 220, 5, 134, 0, 46, 5, 134, 0, 75, 5, 134, 0, 104, 5, - 134, 0, 133, 5, 134, 0, 51, 6, 134, 0, 249, 5, 134, 0, 109, 6, 134, - 0, 138, 6, 134, 0, 162, 5, 134, 0, 191, 5, 134, 0, 44, 7, 134, 0, 244, - 4, 134, 0, 64, 198, 1, 0, 126, 10, 134, 0, 155, 10, 134, 0, 184, 10, - 134, 0, 242, 10, 134, 0, 189, 11, 134, 0, 152, 14, 134, 0, 100, 192, - 1, 0, 155, 196, 1, 0, 187, 192, 1, 0, 144, 194, 1, 0, 49, 195, 1, 0, - 20, 195, 1, 0, 99, 15, 134, 0, 20, 16, 134, 0, 181, 14, 134, 0, 81, - 193, 1, 0, 110, 193, 1, 0, 28, 194, 1, 0, 57, 194, 1, 0, 226, 193, 1, - 0, 255, 193, 1, 0, 86, 194, 1, 0, 115, 194, 1, 0, 136, 12, 134, 0, 132, - 13, 134, 0, 152, 13, 134, 0, 56, 17, 134, 0, 104, 9, 134, 0, 236, 192, - 1, 0, 216, 192, 1, 0, 32, 193, 1, 0, 196, 194, 1, 0, 40, 197, 1, 0, - 216, 194, 1, 0, 236, 194, 1, 0, 36, 200, 1, 0, 248, 12, 2, 0, 3, 45, - 13, 208, 42, 31, 4, 42, 12, 217, 9, 45, 0, 240, 22, 132, 165, 241, 12, - 2, 1, 42, 148, 191, 44, 34, 64, 34, 0, 32, 29, 224, 60, 32, 0, 224, - 64, 32, 151, 74, 147, 66, 64, 240, 8, 132, 3, 45, 13, 208, 42, 31, 4, - 42, 12, 217, 9, 45, 0, 240, 2, 132, 165, 241, 12, 2, 1, 42, 148, 191, - 44, 34, 64, 34, 0, 32, 17, 224, 54, 32, 245, 227, 64, 32, 2, 70, 140, - 73, 139, 66, 2, 208, 139, 73, 139, 66, 7, 209, 234, 30, 8, 42, 2, 217, - 0, 32, 64, 34, 1, 224, 64, 32, 2, 70, 135, 73, 139, 66, 30, 209, 165, - 241, 36, 1, 12, 41, 15, 217, 165, 241, 52, 1, 8, 41, 14, 217, 165, 241, - 100, 1, 2, 41, 13, 217, 165, 241, 104, 1, 32, 41, 12, 217, 140, 45, - 8, 191, 50, 34, 10, 224, 48, 32, 56, 34, 7, 224, 68, 32, 2, 70, 4, 224, - 62, 32, 52, 34, 1, 224, 74, 32, 68, 34, 33, 70, 0, 38, 1, 54, 10, 117, - 129, 248, 68, 0, 1, 49, 8, 46, 248, 209, 33, 70, 79, 240, 0, 8, 0, 38, - 8, 241, 1, 8, 129, 248, 36, 96, 129, 248, 84, 96, 1, 49, 184, 241, 8, - 15, 244, 209, 33, 70, 1, 54, 129, 248, 44, 32, 129, 248, 92, 0, 1, 49, - 8, 46, 247, 209, 187, 66, 132, 248, 100, 0, 7, 208, 101, 73, 139, 66, - 23, 208, 100, 73, 139, 66, 64, 240, 170, 128, 37, 224, 1, 45, 80, 208, - 2, 45, 73, 208, 3, 45, 85, 208, 41, 31, 4, 41, 60, 217, 9, 45, 62, 208, - 10, 45, 64, 208, 0, 33, 11, 45, 14, 70, 15, 70, 115, 209, 66, 224, 1, - 45, 61, 208, 2, 45, 78, 208, 3, 45, 62, 208, 41, 31, 4, 41, 63, 217, - 9, 45, 66, 208, 10, 45, 69, 208, 0, 33, 11, 45, 14, 70, 15, 70, 96, - 209, 68, 224, 1, 45, 68, 208, 2, 45, 85, 208, 233, 30, 5, 41, 14, 216, - 3, 45, 66, 208, 4, 45, 68, 208, 8, 45, 12, 191, 56, 33, 58, 33, 12, - 191, 54, 38, 56, 38, 12, 191, 50, 39, 52, 39, 60, 224, 9, 45, 60, 208, - 10, 45, 63, 208, 0, 33, 11, 45, 14, 70, 15, 70, 64, 209, 62, 224, 62, - 33, 60, 38, 56, 39, 20, 224, 54, 33, 52, 38, 48, 39, 16, 224, 0, 33, - 14, 70, 15, 70, 64, 34, 50, 224, 0, 33, 14, 70, 15, 70, 56, 34, 45, - 224, 56, 33, 54, 38, 50, 39, 2, 224, 58, 33, 56, 38, 52, 39, 76, 34, - 36, 224, 54, 33, 52, 38, 48, 39, 74, 34, 31, 224, 0, 33, 14, 70, 15, - 70, 62, 34, 26, 224, 54, 34, 24, 224, 0, 33, 14, 70, 15, 70, 44, 34, - 19, 224, 46, 33, 44, 38, 40, 39, 2, 224, 56, 33, 54, 38, 50, 39, 68, - 34, 10, 224, 48, 33, 46, 38, 42, 39, 66, 34, 5, 224, 0, 33, 14, 70, - 15, 70, 60, 34, 0, 224, 42, 34, 161, 70, 79, 240, 0, 8, 184, 241, 4, - 15, 140, 191, 178, 70, 186, 70, 8, 241, 1, 8, 184, 241, 8, 15, 137, - 248, 28, 32, 137, 248, 76, 160, 9, 241, 1, 9, 239, 209, 146, 70, 160, - 70, 0, 39, 3, 47, 140, 191, 137, 70, 177, 70, 1, 55, 8, 47, 136, 248, - 44, 160, 136, 248, 92, 144, 8, 241, 1, 8, 242, 209, 14, 73, 139, 66, - 6, 208, 14, 73, 139, 66, 29, 208, 13, 73, 139, 66, 122, 209, 37, 224, - 3, 45, 50, 208, 9, 45, 48, 208, 41, 31, 4, 41, 49, 217, 40, 224, 239, - 14, 134, 0, 99, 15, 134, 0, 20, 16, 134, 0, 220, 5, 134, 0, 155, 10, - 134, 0, 242, 10, 134, 0, 213, 10, 134, 0, 160, 11, 134, 0, 218, 11, - 134, 0, 3, 45, 30, 208, 4, 45, 36, 208, 105, 31, 2, 41, 29, 217, 8, - 45, 31, 208, 9, 45, 11, 209, 32, 224, 3, 45, 34, 208, 4, 45, 35, 208, - 105, 31, 2, 41, 36, 217, 8, 45, 38, 208, 9, 45, 39, 208, 0, 33, 14, - 70, 15, 70, 38, 224, 46, 33, 44, 38, 40, 39, 34, 224, 54, 33, 27, 224, - 72, 33, 70, 38, 66, 39, 28, 224, 82, 33, 80, 38, 76, 39, 24, 224, 76, - 33, 74, 38, 70, 39, 20, 224, 68, 33, 66, 38, 62, 39, 16, 224, 50, 33, - 48, 38, 12, 224, 52, 33, 50, 38, 48, 39, 9, 224, 58, 33, 54, 38, 50, - 39, 5, 224, 56, 33, 52, 38, 246, 231, 54, 33, 50, 38, 46, 39, 161, 70, - 79, 240, 0, 8, 184, 241, 4, 15, 140, 191, 178, 70, 186, 70, 8, 241, - 1, 8, 184, 241, 8, 15, 137, 248, 76, 160, 9, 241, 1, 9, 241, 209, 160, - 70, 0, 39, 3, 47, 140, 191, 137, 70, 177, 70, 1, 55, 8, 47, 136, 248, - 92, 144, 8, 241, 1, 8, 244, 209, 145, 73, 139, 66, 46, 209, 3, 45, 13, - 208, 41, 31, 4, 41, 5, 217, 9, 45, 8, 208, 0, 33, 14, 70, 136, 70, 8, - 224, 62, 33, 60, 38, 79, 240, 56, 8, 3, 224, 58, 33, 56, 38, 79, 240, - 52, 8, 161, 70, 0, 39, 4, 47, 140, 191, 178, 70, 194, 70, 1, 55, 8, - 47, 137, 248, 76, 160, 9, 241, 1, 9, 244, 209, 160, 70, 0, 39, 3, 47, - 140, 191, 137, 70, 177, 70, 1, 55, 8, 47, 136, 248, 92, 144, 8, 241, - 1, 8, 244, 209, 45, 224, 121, 73, 139, 66, 39, 209, 165, 241, 36, 2, - 12, 42, 14, 217, 165, 241, 52, 2, 12, 42, 13, 217, 165, 241, 100, 2, - 40, 42, 12, 217, 165, 241, 149, 2, 16, 42, 11, 217, 0, 32, 2, 70, 10, - 224, 52, 32, 56, 34, 7, 224, 52, 32, 58, 34, 4, 224, 64, 32, 60, 34, - 1, 224, 72, 32, 70, 34, 33, 70, 0, 38, 1, 54, 10, 117, 129, 248, 68, - 0, 1, 49, 8, 46, 248, 209, 5, 224, 101, 73, 139, 66, 82, 208, 100, 73, - 139, 66, 117, 208, 100, 73, 139, 66, 114, 208, 99, 73, 139, 66, 111, - 208, 99, 73, 139, 66, 108, 208, 98, 73, 139, 66, 105, 208, 98, 73, 139, - 66, 102, 208, 97, 73, 139, 66, 99, 208, 97, 73, 139, 66, 96, 208, 96, - 73, 139, 66, 93, 208, 96, 73, 139, 66, 90, 208, 95, 73, 139, 66, 87, - 208, 95, 73, 139, 66, 84, 208, 94, 73, 139, 66, 81, 208, 94, 73, 139, - 66, 78, 208, 93, 73, 139, 66, 75, 208, 93, 73, 139, 66, 72, 208, 92, - 73, 139, 66, 69, 208, 92, 73, 139, 66, 66, 208, 91, 73, 139, 66, 63, - 208, 91, 73, 139, 66, 60, 208, 90, 73, 139, 66, 57, 208, 90, 73, 139, - 66, 54, 208, 89, 73, 139, 66, 51, 208, 89, 73, 139, 66, 48, 208, 88, - 73, 139, 66, 45, 208, 88, 73, 139, 66, 42, 208, 87, 73, 139, 66, 64, - 240, 184, 128, 29, 224, 165, 241, 36, 2, 8, 42, 89, 217, 165, 241, 46, - 2, 2, 42, 99, 217, 165, 241, 52, 2, 8, 42, 84, 217, 165, 241, 62, 2, - 2, 42, 83, 217, 165, 241, 100, 2, 8, 42, 82, 217, 165, 241, 110, 2, - 30, 42, 80, 217, 165, 241, 149, 2, 16, 42, 79, 217, 0, 32, 64, 224, - 165, 241, 36, 1, 12, 41, 152, 191, 52, 32, 152, 191, 56, 34, 135, 224, - 59, 73, 139, 66, 3, 209, 100, 45, 8, 191, 56, 34, 128, 224, 57, 73, - 139, 66, 3, 209, 36, 45, 8, 191, 56, 34, 121, 224, 55, 73, 139, 66, - 3, 209, 140, 45, 8, 191, 58, 34, 114, 224, 53, 73, 139, 66, 5, 209, - 100, 45, 46, 208, 140, 45, 8, 191, 72, 34, 105, 224, 34, 73, 139, 66, - 5, 209, 165, 241, 149, 1, 16, 41, 152, 191, 60, 34, 96, 224, 31, 73, - 139, 66, 93, 209, 165, 241, 36, 1, 12, 41, 88, 217, 165, 241, 52, 1, - 12, 41, 84, 217, 165, 241, 100, 1, 40, 41, 152, 191, 60, 34, 79, 224, - 56, 32, 2, 70, 76, 224, 64, 32, 56, 34, 73, 224, 56, 32, 52, 34, 70, - 224, 56, 32, 3, 224, 64, 32, 50, 34, 65, 224, 64, 32, 68, 34, 62, 224, - 72, 34, 60, 224, 78, 12, 134, 0, 17, 5, 134, 0, 249, 5, 134, 0, 93, - 198, 1, 0, 122, 198, 1, 0, 189, 199, 1, 0, 53, 199, 1, 0, 126, 196, - 1, 0, 39, 196, 1, 0, 197, 193, 1, 0, 8, 197, 1, 0, 0, 193, 1, 0, 10, - 196, 1, 0, 129, 192, 1, 0, 160, 199, 1, 0, 97, 196, 1, 0, 151, 198, - 1, 0, 68, 196, 1, 0, 51, 192, 1, 0, 208, 195, 1, 0, 111, 199, 1, 0, - 158, 192, 1, 0, 240, 199, 1, 0, 139, 193, 1, 0, 168, 193, 1, 0, 82, - 199, 1, 0, 237, 195, 1, 0, 78, 195, 1, 0, 107, 195, 1, 0, 22, 6, 134, - 0, 60, 34, 33, 70, 0, 38, 1, 54, 10, 117, 129, 248, 68, 0, 1, 49, 8, - 46, 248, 209, 131, 74, 147, 66, 11, 208, 131, 74, 147, 66, 8, 208, 130, - 74, 147, 66, 5, 208, 130, 74, 147, 66, 2, 208, 129, 74, 147, 66, 113, - 209, 165, 241, 36, 2, 8, 42, 10, 216, 126, 74, 147, 66, 3, 208, 52, - 34, 91, 69, 1, 209, 80, 224, 58, 34, 79, 240, 56, 11, 88, 224, 165, - 241, 46, 2, 2, 42, 9, 216, 91, 69, 20, 191, 66, 34, 64, 34, 20, 191, - 79, 240, 56, 11, 79, 240, 52, 11, 74, 224, 165, 241, 52, 2, 8, 42, 60, - 217, 165, 241, 62, 2, 2, 42, 6, 216, 91, 69, 20, 191, 52, 34, 44, 34, - 79, 240, 58, 11, 59, 224, 165, 241, 100, 2, 8, 42, 7, 216, 62, 34, 91, - 69, 20, 191, 79, 240, 68, 11, 79, 240, 58, 11, 47, 224, 165, 241, 110, - 2, 30, 42, 26, 216, 165, 241, 134, 2, 2, 42, 8, 216, 96, 74, 147, 66, - 0, 240, 165, 128, 91, 69, 12, 191, 60, 34, 72, 34, 160, 224, 140, 45, - 20, 209, 90, 74, 147, 66, 79, 240, 72, 2, 17, 208, 91, 69, 12, 191, - 79, 240, 60, 11, 79, 240, 68, 11, 16, 224, 165, 241, 149, 2, 16, 42, - 9, 217, 0, 34, 147, 70, 9, 224, 68, 34, 5, 224, 72, 34, 135, 224, 79, - 240, 60, 11, 2, 224, 74, 34, 79, 240, 70, 11, 33, 70, 0, 32, 1, 48, - 129, 248, 20, 176, 129, 248, 68, 32, 1, 49, 8, 40, 247, 209, 72, 74, - 147, 66, 5, 208, 71, 74, 147, 66, 2, 208, 34, 70, 0, 35, 30, 224, 165, - 241, 36, 3, 12, 43, 13, 217, 165, 241, 52, 3, 12, 43, 11, 217, 165, - 241, 100, 3, 40, 43, 7, 217, 149, 61, 16, 45, 148, 191, 64, 37, 0, 37, - 2, 224, 56, 37, 0, 224, 64, 37, 35, 70, 0, 34, 1, 50, 29, 117, 131, - 248, 68, 80, 1, 51, 8, 42, 248, 209, 221, 231, 225, 24, 145, 248, 60, - 0, 24, 185, 146, 248, 76, 0, 129, 248, 60, 0, 59, 185, 148, 248, 61, - 48, 27, 185, 146, 248, 76, 48, 132, 248, 61, 48, 1, 35, 1, 51, 1, 50, - 7, 43, 234, 217, 35, 70, 0, 34, 147, 248, 68, 16, 25, 185, 147, 248, - 76, 16, 131, 248, 68, 16, 1, 50, 1, 51, 8, 42, 244, 209, 34, 70, 0, - 35, 225, 24, 145, 248, 52, 0, 24, 185, 146, 248, 68, 0, 129, 248, 52, - 0, 59, 185, 148, 248, 53, 48, 27, 185, 146, 248, 68, 48, 132, 248, 53, - 48, 1, 35, 1, 51, 1, 50, 7, 43, 234, 217, 0, 35, 156, 248, 36, 32, 26, - 185, 156, 248, 28, 32, 140, 248, 36, 32, 156, 248, 84, 32, 26, 185, - 156, 248, 76, 32, 140, 248, 84, 32, 1, 51, 8, 43, 12, 241, 1, 12, 236, - 209, 189, 232, 248, 143, 68, 34, 79, 240, 68, 11, 122, 231, 60, 33, - 64, 34, 255, 247, 181, 186, 56, 32, 64, 34, 9, 228, 52, 32, 64, 34, - 9, 228, 189, 232, 248, 143, 75, 5, 134, 0, 104, 5, 134, 0, 133, 5, 134, - 0, 51, 6, 134, 0, 162, 5, 134, 0, 167, 6, 134, 0, 80, 6, 134, 0, 45, - 233, 240, 65, 76, 105, 22, 105, 35, 104, 149, 138, 0, 43, 24, 70, 1, - 218, 232, 24, 48, 212, 98, 104, 131, 24, 171, 66, 44, 216, 139, 104, - 2, 241, 8, 7, 231, 25, 48, 24, 107, 185, 9, 224, 229, 24, 149, 248, - 8, 192, 197, 92, 254, 92, 12, 234, 5, 5, 174, 66, 28, 209, 1, 51, 147, - 66, 243, 219, 17, 224, 1, 43, 22, 209, 173, 26, 118, 25, 15, 224, 229, - 24, 149, 248, 8, 128, 197, 92, 23, 248, 3, 192, 8, 234, 5, 5, 172, 69, - 4, 209, 1, 51, 147, 66, 242, 219, 1, 32, 5, 224, 1, 48, 176, 66, 1, - 216, 0, 35, 246, 231, 0, 32, 11, 123, 11, 177, 128, 240, 1, 0, 189, - 232, 240, 129, 3, 104, 112, 181, 4, 70, 88, 104, 163, 106, 13, 70, 22, - 70, 35, 185, 144, 33, 250, 243, 158, 245, 160, 98, 128, 177, 160, 106, - 1, 35, 3, 96, 171, 138, 128, 34, 41, 105, 194, 96, 131, 96, 70, 96, - 147, 66, 56, 191, 26, 70, 16, 48, 189, 232, 112, 64, 245, 243, 223, - 182, 112, 189, 104, 70, 131, 105, 65, 105, 32, 48, 11, 181, 32, 56, - 3, 105, 90, 70, 81, 70, 14, 180, 74, 70, 65, 70, 6, 180, 195, 104, 130, - 104, 65, 104, 254, 180, 3, 104, 194, 105, 239, 243, 3, 129, 14, 180, - 130, 105, 239, 243, 5, 129, 6, 180, 3, 72, 1, 104, 0, 41, 254, 208, - 104, 70, 136, 71, 20, 176, 0, 189, 164, 194, 0, 0, 10, 73, 8, 66, 2, - 208, 98, 182, 201, 67, 8, 64, 8, 73, 8, 66, 2, 208, 97, 182, 201, 67, - 8, 64, 6, 73, 8, 64, 0, 40, 3, 208, 5, 73, 10, 104, 2, 67, 10, 96, 112, - 71, 0, 0, 0, 0, 0, 128, 0, 0, 0, 64, 255, 255, 0, 0, 0, 225, 0, 224, - 10, 73, 8, 66, 2, 208, 114, 182, 201, 67, 8, 64, 8, 73, 8, 66, 2, 208, - 113, 182, 201, 67, 8, 64, 6, 73, 8, 64, 0, 40, 4, 208, 5, 73, 10, 104, - 192, 67, 2, 64, 10, 96, 112, 71, 0, 0, 0, 128, 0, 0, 0, 64, 255, 255, - 0, 0, 128, 225, 0, 224, 2, 73, 9, 104, 144, 34, 136, 88, 112, 71, 0, - 0, 176, 194, 0, 0, 2, 73, 9, 104, 156, 34, 136, 80, 112, 71, 0, 0, 176, - 194, 0, 0, 221, 186, 173, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 74, 17, - 104, 16, 96, 8, 28, 112, 71, 0, 0, 164, 194, 0, 0, 2, 74, 17, 104, 16, - 96, 8, 28, 112, 71, 0, 0, 168, 194, 0, 0, 3, 73, 8, 96, 3, 72, 1, 104, - 0, 41, 254, 208, 136, 71, 254, 231, 156, 194, 0, 0, 168, 194, 0, 0, - 99, 72, 100, 73, 0, 34, 10, 80, 1, 104, 99, 74, 10, 64, 99, 79, 15, - 64, 63, 66, 50, 209, 0, 35, 152, 70, 154, 70, 96, 74, 10, 64, 24, 33, - 202, 64, 95, 73, 67, 88, 95, 76, 28, 64, 95, 77, 172, 66, 4, 209, 128, - 70, 94, 77, 69, 25, 169, 70, 14, 224, 93, 77, 172, 66, 11, 209, 130, - 70, 90, 77, 69, 25, 171, 70, 15, 36, 29, 28, 35, 64, 89, 76, 37, 64, - 45, 10, 43, 67, 156, 70, 0, 35, 152, 69, 1, 208, 154, 69, 4, 209, 85, - 75, 192, 24, 1, 58, 220, 209, 5, 224, 80, 70, 0, 66, 2, 208, 64, 70, - 0, 66, 41, 209, 254, 231, 252, 33, 65, 88, 10, 104, 15, 35, 19, 64, - 15, 43, 241, 208, 1, 43, 1, 208, 4, 49, 246, 231, 8, 49, 74, 75, 19, - 64, 74, 76, 163, 66, 6, 209, 0, 240, 187, 248, 128, 70, 0, 240, 196, - 248, 129, 70, 233, 231, 70, 76, 163, 66, 230, 209, 11, 31, 27, 104, - 69, 76, 35, 64, 24, 36, 227, 64, 156, 70, 0, 240, 170, 248, 130, 70, - 0, 240, 179, 248, 131, 70, 216, 231, 64, 73, 33, 34, 66, 80, 46, 74, - 63, 73, 137, 88, 255, 35, 25, 66, 25, 208, 81, 104, 61, 75, 25, 66, - 21, 208, 17, 104, 60, 75, 25, 64, 211, 106, 16, 224, 163, 66, 14, 208, - 192, 70, 12, 224, 57, 73, 137, 88, 25, 66, 8, 208, 56, 73, 137, 88, - 25, 64, 153, 66, 250, 209, 43, 75, 17, 105, 25, 66, 252, 208, 73, 70, - 63, 66, 4, 209, 152, 35, 203, 88, 16, 36, 227, 64, 1, 224, 48, 75, 203, - 88, 28, 36, 35, 64, 0, 43, 1, 208, 0, 240, 140, 248, 64, 70, 45, 73, - 8, 96, 72, 70, 44, 73, 8, 96, 80, 70, 44, 73, 8, 96, 96, 70, 43, 73, - 8, 96, 43, 73, 15, 96, 43, 77, 44, 73, 13, 96, 4, 61, 173, 70, 0, 157, - 236, 67, 16, 35, 221, 65, 172, 66, 1, 208, 129, 176, 9, 224, 36, 12, - 164, 0, 38, 77, 44, 96, 107, 70, 27, 27, 37, 77, 43, 96, 4, 59, 157, - 70, 36, 72, 36, 73, 0, 34, 4, 192, 129, 66, 252, 216, 15, 240, 137, - 249, 254, 231, 0, 0, 0, 24, 20, 6, 0, 0, 248, 255, 0, 0, 0, 0, 0, 240, - 0, 0, 0, 15, 252, 15, 0, 0, 240, 143, 0, 0, 160, 130, 0, 0, 0, 15, 0, - 0, 224, 128, 0, 0, 0, 112, 0, 0, 0, 16, 0, 0, 0, 255, 15, 0, 0, 42, - 8, 0, 0, 14, 8, 0, 0, 0, 0, 255, 224, 1, 0, 0, 4, 6, 0, 0, 0, 0, 56, - 0, 255, 255, 0, 0, 24, 6, 0, 0, 12, 6, 0, 0, 8, 4, 0, 0, 176, 194, 0, - 0, 180, 194, 0, 0, 184, 194, 0, 0, 188, 194, 0, 0, 172, 194, 0, 0, 0, - 192, 3, 0, 212, 255, 1, 0, 220, 255, 1, 0, 216, 255, 1, 0, 144, 8, 2, - 0, 6, 13, 2, 0, 8, 104, 15, 34, 4, 49, 2, 64, 5, 42, 249, 209, 1, 74, - 16, 64, 247, 70, 0, 0, 0, 240, 255, 255, 8, 104, 15, 34, 4, 49, 2, 64, - 5, 42, 249, 209, 128, 34, 16, 66, 246, 208, 1, 74, 16, 64, 247, 70, - 0, 240, 255, 255, 254, 231, 0, 0, 16, 181, 0, 33, 40, 34, 4, 70, 245, - 243, 118, 245, 10, 75, 35, 96, 10, 75, 99, 96, 10, 75, 163, 96, 10, - 75, 227, 96, 10, 75, 35, 97, 10, 75, 99, 97, 10, 75, 163, 97, 10, 75, - 227, 97, 10, 75, 35, 98, 10, 75, 99, 98, 16, 189, 0, 191, 0, 0, 0, 0, - 163, 254, 1, 0, 164, 254, 1, 0, 144, 8, 2, 0, 144, 8, 2, 0, 6, 13, 2, - 0, 8, 13, 2, 0, 188, 175, 2, 0, 188, 175, 2, 0, 188, 54, 3, 0, 45, 233, - 240, 65, 150, 176, 10, 168, 255, 247, 202, 255, 10, 155, 11, 159, 13, - 156, 255, 26, 12, 155, 15, 154, 228, 26, 95, 77, 14, 155, 62, 25, 195, - 235, 2, 8, 43, 104, 93, 72, 246, 24, 3, 240, 127, 249, 4, 245, 126, - 115, 7, 51, 155, 10, 70, 68, 141, 232, 8, 1, 8, 245, 126, 120, 8, 241, - 7, 8, 7, 245, 126, 114, 79, 234, 152, 35, 7, 50, 2, 147, 5, 35, 57, - 70, 146, 10, 3, 147, 81, 72, 35, 70, 3, 240, 102, 249, 80, 76, 81, 75, - 39, 104, 25, 104, 40, 104, 203, 27, 3, 245, 126, 117, 7, 53, 173, 10, - 141, 232, 160, 0, 7, 245, 126, 117, 7, 53, 3, 144, 0, 245, 126, 112, - 1, 245, 126, 114, 173, 10, 7, 48, 128, 10, 7, 50, 2, 149, 70, 77, 146, - 10, 4, 144, 69, 72, 3, 240, 71, 249, 35, 104, 41, 104, 68, 72, 201, - 24, 6, 245, 190, 83, 1, 245, 126, 114, 63, 51, 155, 10, 7, 50, 146, - 10, 0, 147, 6, 245, 160, 83, 3, 240, 54, 249, 61, 75, 62, 72, 25, 104, - 3, 240, 49, 249, 61, 75, 38, 70, 25, 104, 60, 75, 10, 104, 47, 70, 154, - 66, 3, 208, 59, 72, 3, 240, 38, 249, 36, 224, 20, 145, 11, 70, 4, 224, - 20, 104, 54, 72, 19, 29, 132, 66, 3, 209, 26, 70, 21, 171, 154, 66, - 246, 211, 52, 72, 20, 171, 0, 104, 193, 235, 3, 12, 197, 26, 132, 26, - 193, 235, 2, 14, 141, 232, 1, 16, 47, 72, 20, 146, 205, 248, 8, 192, - 205, 248, 12, 224, 205, 248, 16, 224, 5, 149, 6, 149, 7, 148, 8, 148, - 3, 240, 0, 249, 41, 76, 32, 104, 112, 179, 176, 248, 6, 128, 246, 243, - 63, 242, 35, 104, 8, 241, 255, 56, 92, 137, 2, 70, 8, 251, 4, 245, 68, - 52, 8, 251, 4, 244, 5, 245, 126, 115, 7, 51, 155, 18, 141, 232, 24, - 0, 4, 245, 126, 115, 7, 51, 155, 18, 2, 147, 65, 70, 43, 70, 27, 72, - 3, 240, 223, 248, 51, 104, 58, 104, 89, 27, 155, 24, 27, 27, 3, 245, - 126, 112, 1, 245, 126, 114, 7, 48, 128, 10, 7, 50, 0, 144, 146, 10, - 20, 72, 3, 240, 206, 248, 22, 176, 189, 232, 240, 129, 0, 191, 204, - 38, 0, 0, 225, 31, 134, 0, 240, 31, 134, 0, 136, 38, 0, 0, 200, 38, - 0, 0, 164, 38, 0, 0, 46, 32, 134, 0, 114, 32, 134, 0, 144, 38, 0, 0, - 172, 32, 134, 0, 228, 8, 2, 0, 75, 65, 84, 83, 198, 32, 134, 0, 232, - 8, 2, 0, 233, 32, 134, 0, 188, 38, 0, 0, 102, 33, 134, 0, 146, 33, 134, - 0, 8, 181, 113, 70, 4, 72, 3, 240, 161, 248, 64, 246, 57, 0, 189, 232, - 8, 64, 255, 247, 161, 189, 0, 191, 142, 31, 134, 0, 45, 233, 240, 71, - 3, 104, 142, 176, 2, 43, 4, 70, 24, 209, 86, 74, 0, 33, 18, 104, 81, - 97, 85, 74, 16, 104, 193, 4, 36, 213, 84, 73, 32, 244, 128, 80, 11, - 96, 209, 105, 82, 75, 64, 244, 0, 80, 25, 96, 156, 104, 4, 36, 156, - 96, 16, 96, 79, 72, 3, 240, 121, 248, 144, 224, 12, 43, 17, 209, 73, - 77, 42, 104, 145, 4, 13, 213, 34, 244, 0, 82, 66, 244, 0, 98, 104, 96, - 42, 96, 72, 72, 225, 108, 3, 240, 104, 248, 43, 104, 26, 5, 125, 213, - 123, 224, 16, 59, 15, 43, 2, 216, 249, 243, 223, 245, 118, 224, 61, - 78, 66, 72, 241, 105, 3, 240, 89, 248, 163, 108, 34, 70, 0, 147, 99, - 108, 63, 72, 1, 147, 163, 104, 0, 39, 2, 147, 227, 104, 185, 70, 3, - 147, 33, 104, 227, 108, 3, 240, 73, 248, 58, 75, 101, 108, 27, 104, - 4, 241, 16, 1, 197, 235, 3, 10, 227, 105, 55, 72, 0, 147, 35, 106, 79, - 234, 154, 10, 1, 147, 99, 106, 184, 70, 2, 147, 163, 106, 3, 147, 14, - 201, 3, 240, 51, 248, 163, 107, 4, 241, 44, 1, 0, 147, 227, 107, 46, - 72, 1, 147, 35, 108, 2, 147, 14, 201, 3, 240, 39, 248, 235, 104, 43, - 72, 0, 147, 149, 232, 14, 0, 3, 240, 32, 248, 235, 105, 5, 241, 16, - 1, 0, 147, 14, 201, 39, 72, 3, 240, 24, 248, 4, 168, 255, 247, 79, 254, - 37, 72, 3, 240, 18, 248, 28, 224, 122, 89, 211, 7, 19, 213, 255, 42, - 17, 217, 5, 155, 147, 66, 8, 210, 32, 75, 27, 13, 27, 5, 154, 66, 9, - 211, 3, 245, 128, 19, 154, 66, 5, 216, 28, 72, 57, 70, 2, 240, 252, - 255, 9, 241, 1, 9, 4, 55, 185, 241, 15, 15, 8, 241, 1, 8, 1, 216, 208, - 69, 224, 209, 51, 104, 64, 242, 3, 48, 67, 244, 128, 99, 134, 232, 24, - 0, 255, 247, 239, 252, 0, 224, 254, 231, 14, 176, 189, 232, 240, 135, - 96, 9, 2, 0, 236, 8, 2, 0, 36, 16, 0, 224, 32, 16, 0, 224, 20, 201, - 1, 0, 24, 201, 1, 0, 36, 201, 1, 0, 49, 201, 1, 0, 212, 255, 1, 0, 101, - 201, 1, 0, 152, 201, 1, 0, 199, 201, 1, 0, 229, 201, 1, 0, 252, 28, - 134, 0, 157, 102, 128, 0, 2, 202, 1, 0, 112, 181, 26, 76, 138, 176, - 104, 70, 255, 247, 248, 253, 33, 120, 201, 185, 6, 152, 7, 157, 45, - 26, 6, 208, 42, 70, 245, 243, 107, 243, 6, 152, 41, 70, 249, 243, 87, - 244, 18, 75, 0, 34, 26, 112, 1, 35, 35, 112, 16, 75, 25, 104, 193, 177, - 11, 120, 179, 177, 15, 75, 24, 104, 246, 243, 77, 241, 17, 224, 13, - 78, 49, 120, 113, 185, 8, 152, 9, 157, 45, 26, 6, 208, 42, 70, 245, - 243, 78, 243, 8, 152, 41, 70, 249, 243, 58, 244, 0, 35, 35, 112, 1, - 35, 51, 112, 10, 176, 112, 189, 40, 9, 2, 0, 42, 9, 2, 0, 188, 38, 0, - 0, 16, 9, 2, 0, 41, 9, 2, 0, 12, 75, 27, 104, 211, 248, 20, 6, 211, - 248, 20, 38, 144, 66, 10, 74, 24, 191, 211, 248, 20, 6, 9, 75, 17, 104, - 27, 104, 64, 26, 152, 66, 5, 211, 176, 251, 243, 240, 3, 251, 0, 19, - 19, 96, 112, 71, 0, 32, 112, 71, 0, 191, 156, 38, 0, 0, 228, 38, 0, - 0, 200, 37, 0, 0, 112, 181, 4, 70, 254, 243, 112, 243, 32, 70, 254, - 243, 173, 242, 5, 70, 32, 70, 254, 243, 45, 242, 0, 34, 6, 70, 64, 246, - 42, 1, 32, 70, 254, 243, 230, 243, 1, 34, 170, 64, 131, 105, 26, 66, - 1, 209, 1, 53, 0, 224, 0, 37, 32, 70, 49, 70, 254, 243, 236, 243, 40, - 70, 112, 189, 45, 233, 240, 65, 4, 70, 14, 70, 254, 243, 78, 243, 32, - 70, 254, 243, 15, 242, 0, 34, 5, 70, 64, 246, 42, 1, 32, 70, 254, 243, - 200, 243, 130, 105, 7, 70, 67, 105, 70, 177, 79, 244, 0, 64, 66, 240, - 0, 72, 67, 240, 0, 70, 255, 247, 192, 251, 7, 224, 79, 244, 0, 64, 34, - 240, 0, 72, 35, 240, 0, 70, 255, 247, 213, 251, 32, 70, 41, 70, 199, - 248, 24, 128, 126, 97, 189, 232, 240, 65, 254, 243, 188, 179, 255, 247, - 176, 191, 16, 181, 4, 70, 254, 243, 32, 243, 1, 70, 32, 70, 189, 232, - 16, 64, 0, 240, 72, 185, 45, 233, 240, 65, 14, 70, 80, 33, 4, 70, 21, - 70, 152, 70, 250, 243, 255, 240, 7, 70, 16, 179, 0, 33, 80, 34, 245, - 243, 177, 242, 64, 242, 60, 115, 123, 99, 79, 244, 122, 115, 251, 99, - 28, 35, 59, 100, 12, 35, 123, 100, 4, 35, 0, 32, 199, 248, 12, 128, - 62, 96, 125, 96, 188, 96, 187, 100, 8, 73, 245, 243, 56, 247, 192, 178, - 135, 248, 76, 0, 1, 56, 192, 178, 1, 40, 2, 217, 2, 35, 135, 248, 76, - 48, 56, 70, 189, 232, 240, 129, 0, 191, 62, 41, 134, 0, 0, 72, 112, - 71, 252, 219, 1, 0, 0, 72, 112, 71, 128, 220, 1, 0, 0, 72, 112, 71, - 0, 166, 14, 0, 56, 181, 210, 248, 0, 86, 4, 70, 5, 240, 124, 5, 173, - 8, 255, 247, 235, 255, 3, 224, 131, 120, 171, 66, 7, 208, 12, 48, 16, - 177, 3, 136, 0, 43, 247, 209, 32, 70, 255, 247, 227, 255, 3, 136, 79, - 244, 122, 112, 88, 67, 56, 189, 16, 181, 20, 70, 255, 247, 222, 255, - 1, 35, 196, 248, 96, 54, 212, 248, 100, 54, 219, 178, 176, 251, 243, - 243, 79, 244, 122, 112, 88, 67, 16, 189, 45, 233, 255, 71, 20, 70, 0, - 34, 2, 146, 3, 146, 2, 106, 196, 248, 32, 54, 12, 42, 6, 70, 137, 70, - 212, 248, 40, 38, 6, 221, 79, 234, 18, 72, 79, 234, 136, 88, 79, 234, - 152, 88, 3, 224, 79, 234, 18, 40, 95, 250, 136, 248, 1, 37, 21, 250, - 3, 243, 0, 39, 48, 70, 73, 70, 34, 70, 0, 151, 249, 243, 128, 240, 5, - 70, 1, 34, 18, 250, 7, 243, 43, 66, 7, 208, 0, 146, 48, 70, 73, 70, - 34, 70, 249, 243, 116, 240, 37, 234, 0, 5, 1, 55, 31, 47, 239, 209, - 48, 70, 2, 169, 3, 170, 249, 243, 148, 240, 2, 155, 0, 39, 37, 234, - 3, 10, 61, 70, 1, 35, 171, 64, 19, 234, 10, 15, 8, 208, 48, 70, 73, - 70, 34, 70, 235, 178, 255, 247, 182, 255, 135, 66, 56, 191, 7, 70, 1, - 53, 31, 45, 238, 209, 8, 241, 2, 0, 192, 25, 4, 176, 189, 232, 240, - 135, 115, 181, 5, 70, 20, 70, 30, 70, 0, 145, 79, 244, 203, 98, 0, 33, - 79, 240, 255, 51, 254, 243, 26, 241, 40, 70, 0, 33, 64, 242, 92, 98, - 35, 70, 0, 150, 254, 243, 18, 241, 124, 189, 0, 34, 56, 181, 12, 70, - 19, 70, 4, 33, 5, 70, 255, 247, 227, 255, 1, 44, 32, 240, 240, 115, - 8, 191, 67, 240, 240, 115, 40, 70, 4, 33, 79, 240, 255, 50, 255, 247, - 215, 255, 1, 44, 5, 209, 73, 246, 64, 64, 189, 232, 56, 64, 249, 243, - 91, 181, 56, 189, 45, 233, 240, 65, 4, 70, 136, 70, 254, 243, 230, 240, - 0, 33, 6, 70, 32, 70, 254, 243, 179, 242, 7, 70, 32, 70, 0, 240, 18, - 249, 65, 70, 5, 70, 58, 70, 24, 35, 32, 70, 255, 247, 98, 255, 11, 35, - 2, 48, 88, 67, 7, 75, 49, 70, 235, 24, 179, 251, 245, 245, 69, 67, 32, - 70, 254, 243, 156, 242, 10, 35, 181, 251, 243, 245, 168, 178, 189, 232, - 240, 129, 63, 66, 15, 0, 112, 181, 4, 70, 14, 70, 254, 243, 189, 240, - 0, 33, 5, 70, 32, 70, 254, 243, 138, 242, 49, 70, 2, 70, 32, 70, 255, - 247, 21, 255, 41, 70, 6, 70, 32, 70, 254, 243, 128, 242, 48, 70, 112, - 189, 112, 181, 4, 70, 14, 70, 254, 243, 167, 240, 0, 33, 5, 70, 32, - 70, 254, 243, 116, 242, 49, 70, 2, 70, 32, 70, 255, 247, 25, 255, 41, - 70, 6, 70, 32, 70, 254, 243, 106, 242, 48, 70, 112, 189, 255, 247, 232, - 191, 45, 233, 240, 65, 22, 76, 5, 70, 39, 104, 47, 187, 254, 243, 140, - 240, 57, 70, 6, 70, 40, 70, 254, 243, 89, 242, 208, 248, 20, 134, 208, - 248, 20, 54, 7, 70, 152, 69, 24, 191, 208, 248, 20, 134, 66, 242, 16, - 112, 249, 243, 232, 244, 215, 248, 20, 54, 215, 248, 20, 38, 40, 70, - 147, 66, 24, 191, 215, 248, 20, 54, 49, 70, 200, 235, 3, 8, 100, 35, - 3, 251, 8, 243, 35, 96, 254, 243, 58, 242, 32, 104, 189, 232, 240, 129, - 0, 191, 112, 9, 2, 0, 248, 181, 31, 70, 4, 70, 21, 70, 254, 243, 92, - 240, 0, 33, 6, 70, 32, 70, 254, 243, 41, 242, 2, 35, 192, 248, 88, 54, - 87, 177, 208, 248, 92, 54, 5, 240, 63, 2, 35, 244, 252, 67, 67, 234, - 66, 35, 192, 248, 92, 54, 4, 224, 208, 248, 92, 86, 109, 10, 5, 240, - 63, 5, 32, 70, 49, 70, 254, 243, 17, 242, 40, 70, 248, 189, 1, 33, 255, - 247, 49, 191, 0, 33, 255, 247, 46, 191, 8, 177, 249, 243, 98, 178, 112, - 71, 0, 0, 248, 181, 8, 76, 5, 70, 39, 104, 8, 224, 40, 70, 62, 104, - 254, 243, 101, 241, 57, 70, 122, 104, 249, 243, 95, 247, 55, 70, 0, - 47, 244, 209, 39, 96, 248, 189, 108, 39, 0, 0, 0, 35, 67, 102, 112, - 71, 247, 181, 0, 34, 1, 33, 19, 70, 5, 70, 248, 243, 246, 247, 0, 36, - 7, 70, 33, 70, 40, 34, 35, 70, 40, 70, 0, 148, 254, 243, 19, 240, 1, - 33, 6, 70, 59, 70, 40, 70, 79, 240, 255, 50, 248, 243, 229, 247, 40, - 70, 33, 70, 40, 34, 79, 240, 255, 51, 0, 150, 254, 243, 3, 240, 254, - 189, 112, 181, 69, 110, 4, 70, 101, 177, 208, 248, 200, 48, 52, 51, - 80, 248, 35, 32, 195, 109, 154, 66, 3, 209, 0, 110, 168, 71, 5, 70, - 0, 224, 0, 37, 32, 70, 97, 109, 255, 247, 57, 255, 163, 110, 6, 70, - 83, 177, 212, 248, 200, 32, 52, 50, 84, 248, 34, 16, 226, 109, 145, - 66, 2, 209, 32, 110, 41, 70, 152, 71, 48, 70, 112, 189, 16, 181, 4, - 70, 254, 243, 13, 241, 1, 70, 32, 70, 189, 232, 16, 64, 255, 247, 9, - 191, 16, 181, 4, 70, 254, 243, 3, 241, 1, 70, 32, 70, 189, 232, 16, - 64, 255, 247, 45, 191, 112, 71, 112, 181, 69, 110, 4, 70, 101, 177, - 208, 248, 200, 48, 52, 51, 80, 248, 35, 32, 195, 109, 154, 66, 3, 209, - 0, 110, 168, 71, 5, 70, 0, 224, 0, 37, 32, 70, 97, 109, 255, 247, 191, - 254, 163, 110, 6, 70, 83, 177, 212, 248, 200, 32, 52, 50, 84, 248, 34, - 16, 226, 109, 145, 66, 2, 209, 32, 110, 41, 70, 152, 71, 48, 70, 112, - 189, 112, 181, 4, 70, 254, 243, 79, 241, 0, 40, 60, 208, 163, 104, 179, - 245, 2, 111, 9, 208, 64, 246, 4, 2, 147, 66, 7, 209, 229, 104, 12, 45, - 148, 191, 0, 37, 1, 37, 2, 224, 1, 37, 0, 224, 0, 37, 237, 178, 77, - 185, 32, 70, 79, 244, 0, 97, 42, 70, 212, 248, 200, 96, 254, 243, 58, - 241, 48, 185, 112, 189, 212, 248, 132, 0, 16, 245, 64, 80, 26, 208, - 0, 38, 208, 248, 48, 49, 35, 240, 4, 3, 192, 248, 48, 49, 67, 240, 1, - 3, 192, 248, 48, 49, 27, 9, 3, 240, 7, 3, 3, 43, 3, 208, 32, 70, 0, - 33, 254, 243, 177, 241, 45, 185, 32, 70, 49, 70, 189, 232, 112, 64, - 254, 243, 42, 177, 112, 189, 67, 105, 45, 233, 247, 67, 34, 43, 5, 70, - 14, 70, 64, 243, 166, 128, 254, 243, 5, 241, 0, 40, 0, 240, 159, 128, - 7, 46, 0, 242, 158, 128, 171, 104, 179, 245, 2, 111, 11, 208, 64, 246, - 4, 2, 147, 66, 10, 209, 235, 104, 12, 43, 148, 191, 79, 240, 0, 8, 79, - 240, 1, 8, 4, 224, 79, 240, 1, 8, 1, 224, 79, 240, 0, 8, 95, 250, 136, - 248, 184, 241, 0, 15, 10, 209, 40, 70, 79, 244, 0, 97, 66, 70, 213, - 248, 200, 144, 254, 243, 229, 240, 4, 70, 56, 185, 121, 224, 213, 248, - 132, 64, 20, 245, 64, 84, 116, 208, 79, 240, 0, 9, 3, 46, 3, 208, 40, - 70, 1, 33, 254, 243, 103, 241, 212, 248, 48, 49, 35, 240, 4, 3, 196, - 248, 48, 49, 1, 35, 158, 66, 196, 248, 48, 49, 4, 217, 4, 46, 12, 191, - 13, 35, 9, 35, 0, 224, 13, 35, 196, 248, 48, 49, 212, 248, 48, 49, 1, - 46, 35, 240, 1, 3, 196, 248, 48, 49, 1, 217, 4, 46, 54, 209, 255, 39, - 0, 33, 79, 244, 226, 114, 59, 70, 40, 70, 0, 151, 253, 243, 247, 246, - 34, 35, 0, 147, 0, 33, 79, 244, 238, 114, 59, 70, 40, 70, 253, 243, - 238, 246, 40, 35, 0, 147, 0, 33, 79, 244, 230, 114, 59, 70, 40, 70, - 253, 243, 229, 246, 129, 35, 0, 147, 0, 33, 79, 244, 232, 114, 59, 70, - 40, 70, 253, 243, 220, 246, 1, 35, 0, 147, 0, 33, 79, 244, 164, 114, - 79, 240, 255, 51, 40, 70, 253, 243, 210, 246, 40, 70, 0, 33, 79, 244, - 166, 114, 79, 246, 255, 115, 0, 151, 253, 243, 201, 246, 212, 248, 48, - 49, 35, 240, 112, 3, 67, 234, 6, 22, 196, 248, 48, 97, 212, 248, 48, - 49, 35, 240, 8, 3, 196, 248, 48, 49, 184, 241, 0, 15, 7, 209, 40, 70, - 73, 70, 254, 243, 126, 240, 2, 224, 4, 70, 0, 224, 0, 36, 32, 70, 189, - 232, 254, 131, 0, 32, 112, 71, 255, 247, 103, 190, 255, 247, 98, 190, - 45, 233, 240, 65, 4, 70, 13, 70, 22, 70, 253, 243, 156, 247, 7, 70, - 24, 185, 32, 70, 1, 33, 253, 243, 212, 247, 32, 70, 19, 240, 213, 253, - 128, 70, 144, 177, 206, 177, 0, 35, 43, 128, 0, 38, 6, 241, 130, 1, - 64, 70, 244, 243, 224, 245, 195, 178, 179, 64, 42, 136, 1, 54, 19, 67, - 5, 46, 43, 128, 242, 209, 0, 37, 1, 224, 111, 240, 29, 5, 55, 185, 32, - 70, 57, 70, 253, 243, 181, 247, 1, 224, 111, 240, 25, 5, 40, 70, 189, - 232, 240, 129, 7, 181, 0, 35, 2, 169, 33, 248, 2, 61, 1, 34, 255, 247, - 198, 255, 189, 248, 6, 0, 14, 189, 208, 248, 108, 50, 153, 66, 5, 209, - 136, 121, 208, 241, 1, 0, 56, 191, 0, 32, 112, 71, 0, 32, 112, 71, 3, - 104, 45, 233, 240, 65, 31, 104, 4, 70, 190, 104, 13, 70, 144, 70, 48, - 70, 33, 105, 2, 240, 58, 218, 184, 241, 0, 15, 10, 208, 59, 104, 27, - 126, 59, 177, 33, 105, 48, 70, 42, 70, 1, 35, 189, 232, 240, 65, 2, - 240, 228, 153, 189, 232, 240, 129, 45, 233, 243, 65, 31, 70, 3, 104, - 4, 70, 1, 145, 0, 146, 8, 157, 211, 248, 0, 128, 9, 177, 13, 41, 62, - 221, 97, 104, 32, 70, 0, 34, 255, 247, 210, 255, 225, 104, 0, 38, 102, - 96, 49, 177, 35, 104, 34, 137, 27, 104, 88, 104, 249, 243, 88, 245, - 230, 96, 0, 155, 19, 177, 179, 245, 150, 127, 38, 219, 64, 70, 41, 70, - 255, 247, 178, 255, 32, 179, 1, 153, 81, 177, 35, 104, 27, 104, 88, - 104, 249, 243, 54, 245, 224, 96, 240, 177, 57, 70, 1, 154, 244, 243, - 132, 246, 1, 169, 4, 34, 101, 97, 4, 241, 8, 0, 244, 243, 125, 246, - 32, 29, 105, 70, 4, 34, 244, 243, 120, 246, 0, 152, 112, 177, 32, 70, - 97, 104, 1, 34, 255, 247, 157, 255, 0, 32, 7, 224, 111, 240, 28, 0, - 4, 224, 111, 240, 1, 0, 1, 224, 111, 240, 26, 0, 189, 232, 252, 129, - 45, 233, 240, 71, 134, 176, 3, 104, 16, 156, 221, 248, 68, 160, 22, - 70, 2, 240, 1, 2, 0, 146, 5, 70, 34, 70, 24, 104, 83, 70, 19, 159, 21, - 240, 251, 223, 128, 70, 0, 40, 64, 240, 157, 128, 2, 46, 76, 208, 3, - 46, 26, 208, 1, 46, 64, 240, 139, 128, 33, 70, 4, 34, 4, 168, 244, 243, - 67, 246, 2, 34, 33, 29, 5, 168, 244, 243, 62, 246, 85, 248, 16, 11, - 57, 70, 189, 248, 20, 128, 4, 158, 50, 240, 116, 216, 65, 70, 0, 144, - 50, 70, 40, 70, 163, 29, 43, 224, 2, 34, 33, 70, 13, 241, 22, 0, 244, - 243, 42, 246, 33, 29, 4, 34, 4, 168, 244, 243, 37, 246, 2, 34, 5, 168, - 4, 241, 8, 1, 244, 243, 31, 246, 189, 248, 22, 48, 1, 43, 96, 209, 163, - 122, 106, 104, 147, 66, 95, 218, 57, 70, 79, 240, 24, 9, 40, 104, 9, - 251, 3, 89, 189, 248, 20, 128, 4, 158, 50, 240, 74, 216, 9, 241, 16, - 9, 0, 144, 65, 70, 72, 70, 50, 70, 4, 241, 11, 3, 255, 247, 74, 255, - 128, 70, 77, 224, 14, 155, 106, 104, 27, 104, 147, 66, 3, 147, 66, 218, - 0, 43, 64, 219, 1, 35, 6, 169, 173, 248, 22, 48, 11, 35, 33, 248, 4, - 61, 160, 28, 50, 70, 244, 243, 237, 245, 13, 241, 24, 9, 13, 241, 22, - 1, 50, 70, 32, 70, 244, 243, 229, 245, 89, 248, 12, 29, 24, 39, 1, 49, - 7, 251, 1, 81, 50, 70, 4, 241, 8, 0, 244, 243, 218, 245, 1, 34, 73, - 70, 4, 241, 10, 0, 244, 243, 212, 245, 3, 153, 4, 34, 7, 251, 1, 81, - 32, 29, 20, 49, 244, 243, 204, 245, 3, 155, 1, 51, 95, 67, 234, 91, - 235, 25, 2, 241, 11, 1, 138, 69, 14, 211, 4, 241, 11, 0, 89, 104, 244, - 243, 190, 245, 10, 224, 111, 240, 22, 8, 7, 224, 111, 240, 36, 8, 4, - 224, 111, 240, 1, 8, 1, 224, 111, 240, 13, 8, 64, 70, 6, 176, 189, 232, - 240, 135, 55, 181, 3, 104, 5, 70, 27, 104, 1, 169, 211, 248, 0, 5, 71, - 240, 83, 222, 8, 224, 35, 105, 154, 121, 42, 185, 34, 126, 146, 7, 2, - 213, 106, 105, 147, 66, 12, 208, 1, 168, 71, 240, 78, 222, 4, 70, 0, - 40, 240, 209, 40, 70, 105, 104, 1, 34, 255, 247, 188, 254, 32, 70, 0, - 224, 1, 32, 62, 189, 247, 181, 3, 104, 7, 70, 29, 104, 149, 248, 112, - 34, 0, 42, 52, 208, 4, 137, 70, 105, 116, 185, 255, 247, 209, 255, 0, - 40, 45, 208, 79, 240, 255, 51, 0, 147, 40, 70, 6, 241, 188, 1, 34, 70, - 35, 70, 26, 240, 231, 221, 34, 224, 153, 137, 104, 104, 97, 24, 249, - 243, 113, 244, 59, 104, 4, 70, 24, 185, 154, 104, 1, 50, 154, 96, 22, - 224, 155, 137, 162, 138, 0, 105, 249, 104, 192, 24, 211, 26, 163, 130, - 58, 137, 32, 97, 244, 243, 91, 245, 227, 141, 178, 104, 67, 240, 64, - 3, 40, 70, 33, 70, 227, 133, 3, 176, 189, 232, 240, 64, 26, 240, 101, - 158, 3, 176, 240, 189, 56, 181, 5, 70, 0, 36, 11, 224, 24, 32, 0, 251, - 4, 80, 16, 48, 65, 104, 33, 177, 3, 105, 19, 177, 1, 34, 255, 247, 106, - 254, 1, 52, 107, 104, 156, 66, 240, 219, 0, 32, 56, 189, 248, 181, 0, - 36, 7, 70, 6, 70, 37, 70, 8, 224, 59, 104, 49, 106, 152, 104, 2, 240, - 159, 216, 0, 185, 1, 53, 1, 52, 24, 54, 123, 104, 156, 66, 243, 219, - 40, 70, 248, 189, 16, 181, 138, 107, 0, 35, 9, 224, 200, 24, 144, 248, - 60, 0, 6, 76, 0, 240, 127, 0, 32, 86, 0, 40, 4, 219, 1, 51, 147, 66, - 243, 209, 0, 32, 16, 189, 1, 32, 16, 189, 64, 27, 134, 0, 2, 41, 45, - 233, 248, 79, 5, 70, 12, 70, 22, 70, 155, 70, 20, 191, 79, 240, 255, - 57, 79, 240, 0, 9, 20, 191, 0, 39, 1, 39, 79, 240, 0, 8, 40, 224, 2, - 44, 20, 191, 79, 240, 255, 51, 0, 35, 153, 69, 17, 208, 2, 44, 201, - 235, 7, 2, 8, 209, 4, 46, 8, 208, 6, 46, 6, 208, 8, 46, 20, 191, 4, - 35, 0, 35, 2, 224, 4, 35, 0, 224, 0, 35, 154, 66, 14, 221, 71, 244, - 44, 90, 31, 250, 138, 250, 213, 248, 92, 1, 81, 70, 56, 240, 236, 222, - 32, 177, 43, 248, 24, 160, 185, 70, 8, 241, 1, 8, 1, 55, 2, 44, 12, - 191, 14, 35, 0, 35, 159, 66, 2, 220, 184, 241, 31, 15, 205, 217, 10, - 155, 195, 248, 0, 128, 189, 232, 248, 143, 45, 233, 247, 79, 29, 70, - 12, 155, 1, 146, 208, 248, 0, 128, 70, 123, 12, 70, 0, 147, 0, 39, 239, - 224, 7, 34, 0, 33, 32, 70, 244, 243, 24, 245, 0, 155, 2, 46, 51, 248, - 2, 43, 95, 250, 130, 249, 0, 147, 132, 248, 0, 144, 8, 209, 4, 45, 8, - 208, 6, 45, 6, 208, 8, 45, 20, 191, 2, 35, 0, 35, 2, 224, 2, 35, 0, - 224, 0, 35, 166, 241, 2, 10, 218, 241, 0, 2, 195, 235, 9, 3, 66, 235, - 10, 2, 147, 66, 16, 219, 2, 46, 8, 209, 4, 45, 8, 208, 6, 45, 6, 208, - 8, 45, 20, 191, 2, 35, 0, 35, 2, 224, 2, 35, 0, 224, 0, 35, 195, 235, - 9, 9, 17, 224, 166, 241, 2, 12, 220, 241, 0, 9, 73, 235, 12, 9, 7, 224, - 216, 248, 92, 1, 73, 70, 56, 240, 71, 222, 32, 185, 9, 241, 1, 9, 35, - 120, 153, 69, 244, 217, 2, 46, 148, 248, 0, 160, 8, 209, 4, 45, 8, 208, - 6, 45, 6, 208, 8, 45, 20, 191, 2, 35, 0, 35, 2, 224, 2, 35, 0, 224, - 0, 35, 83, 68, 2, 46, 12, 191, 14, 34, 0, 34, 147, 66, 15, 220, 2, 46, - 8, 209, 4, 45, 8, 208, 6, 45, 6, 208, 8, 45, 20, 191, 2, 35, 0, 35, - 2, 224, 2, 35, 0, 224, 0, 35, 154, 68, 17, 224, 2, 46, 12, 191, 79, - 240, 14, 10, 79, 240, 0, 10, 7, 224, 216, 248, 92, 1, 81, 70, 56, 240, - 14, 222, 32, 185, 10, 241, 255, 58, 35, 120, 154, 69, 244, 210, 79, - 240, 0, 11, 100, 224, 11, 241, 2, 2, 83, 248, 34, 16, 177, 248, 6, 192, - 72, 142, 28, 240, 32, 12, 195, 178, 13, 208, 0, 244, 64, 114, 178, 245, - 128, 127, 2, 209, 154, 28, 2, 59, 6, 224, 178, 245, 0, 127, 2, 209, - 154, 30, 2, 51, 0, 224, 26, 70, 75, 69, 1, 211, 83, 69, 3, 217, 74, - 69, 66, 211, 82, 69, 64, 216, 188, 241, 0, 15, 22, 208, 75, 69, 20, - 211, 83, 69, 18, 216, 0, 244, 64, 112, 176, 245, 128, 127, 5, 209, 32, - 121, 255, 40, 10, 208, 1, 48, 32, 113, 7, 224, 176, 245, 0, 127, 4, - 209, 96, 121, 255, 40, 1, 208, 1, 48, 96, 113, 200, 136, 128, 6, 11, - 213, 74, 69, 9, 211, 82, 69, 7, 216, 154, 66, 5, 208, 163, 121, 255, - 43, 26, 208, 1, 51, 163, 113, 23, 224, 35, 120, 14, 43, 15, 216, 64, - 70, 255, 247, 192, 254, 40, 177, 227, 120, 255, 43, 13, 208, 1, 51, - 227, 112, 10, 224, 163, 120, 255, 43, 7, 208, 1, 51, 163, 112, 4, 224, - 99, 120, 255, 43, 1, 208, 1, 51, 99, 112, 11, 241, 1, 11, 216, 248, - 24, 53, 26, 104, 147, 69, 149, 211, 1, 55, 7, 52, 13, 155, 159, 66, - 4, 218, 1, 154, 19, 104, 159, 66, 255, 246, 8, 175, 1, 155, 31, 96, - 189, 232, 254, 143, 45, 233, 240, 71, 3, 244, 64, 120, 4, 70, 29, 70, - 216, 178, 168, 245, 0, 115, 211, 241, 0, 8, 72, 235, 3, 8, 160, 241, - 2, 12, 134, 28, 184, 241, 0, 15, 1, 208, 51, 70, 1, 224, 99, 70, 180, - 70, 0, 39, 55, 224, 14, 120, 160, 241, 5, 9, 78, 69, 48, 219, 0, 241, - 5, 9, 78, 69, 44, 220, 145, 248, 2, 144, 185, 241, 0, 15, 19, 209, 145, - 248, 3, 160, 186, 241, 0, 15, 14, 209, 145, 248, 4, 160, 186, 241, 0, - 15, 9, 209, 145, 248, 5, 160, 186, 241, 0, 15, 4, 209, 145, 248, 6, - 160, 186, 241, 0, 15, 19, 208, 158, 66, 6, 209, 142, 121, 62, 187, 184, - 241, 0, 15, 10, 208, 14, 121, 9, 224, 102, 69, 32, 209, 185, 241, 0, - 15, 29, 209, 206, 120, 222, 185, 14, 121, 206, 185, 78, 121, 190, 185, - 1, 55, 7, 49, 151, 66, 197, 219, 212, 248, 252, 52, 27, 120, 99, 177, - 7, 224, 32, 70, 0, 33, 39, 240, 161, 216, 32, 70, 39, 240, 148, 216, - 3, 224, 32, 70, 1, 33, 39, 240, 153, 216, 40, 70, 189, 232, 240, 135, - 67, 244, 48, 101, 173, 178, 14, 43, 204, 191, 79, 244, 128, 83, 79, - 244, 0, 83, 29, 67, 212, 248, 252, 52, 27, 120, 0, 43, 237, 208, 224, - 231, 45, 233, 240, 67, 5, 104, 221, 176, 41, 107, 6, 70, 71, 123, 9, - 137, 90, 147, 0, 36, 0, 224, 4, 33, 79, 240, 0, 12, 90, 155, 96, 70, - 9, 224, 12, 241, 7, 12, 2, 235, 12, 8, 24, 248, 7, 140, 184, 241, 5, - 15, 3, 216, 1, 48, 152, 66, 243, 219, 0, 224, 4, 70, 8, 41, 0, 242, - 173, 128, 1, 160, 80, 248, 33, 240, 0, 191, 103, 217, 0, 0, 139, 218, - 0, 0, 93, 217, 0, 0, 139, 218, 0, 0, 1, 218, 0, 0, 139, 218, 0, 0, 139, - 218, 0, 0, 139, 218, 0, 0, 3, 217, 0, 0, 0, 37, 79, 246, 255, 112, 41, - 70, 20, 224, 79, 246, 255, 112, 0, 33, 13, 70, 51, 224, 14, 25, 150, - 251, 243, 247, 3, 251, 23, 102, 2, 235, 198, 7, 190, 27, 183, 120, 39, - 185, 247, 120, 135, 66, 60, 191, 53, 120, 56, 70, 1, 49, 153, 66, 237, - 219, 0, 45, 232, 208, 69, 244, 48, 96, 14, 45, 140, 191, 79, 244, 128, - 85, 79, 244, 0, 85, 40, 67, 111, 224, 46, 25, 150, 251, 243, 247, 3, - 251, 23, 103, 254, 0, 247, 27, 214, 25, 150, 248, 1, 144, 150, 248, - 2, 128, 150, 248, 3, 192, 9, 235, 8, 6, 102, 68, 134, 66, 188, 191, - 176, 178, 209, 93, 1, 53, 157, 66, 231, 219, 49, 185, 148, 251, 243, - 241, 3, 251, 17, 68, 227, 0, 28, 27, 17, 93, 14, 41, 140, 191, 79, 244, - 128, 80, 79, 244, 0, 80, 1, 67, 65, 244, 48, 96, 69, 224, 2, 47, 66, - 209, 0, 35, 91, 147, 91, 171, 0, 147, 40, 70, 57, 70, 58, 70, 58, 171, - 255, 247, 162, 253, 213, 248, 24, 7, 56, 179, 213, 248, 32, 231, 190, - 241, 0, 15, 34, 208, 91, 153, 0, 35, 19, 224, 0, 34, 13, 245, 148, 124, - 48, 248, 19, 128, 50, 248, 12, 192, 196, 69, 6, 209, 13, 245, 184, 121, - 9, 235, 65, 8, 40, 248, 136, 204, 1, 49, 2, 50, 64, 42, 237, 209, 1, - 51, 115, 69, 233, 219, 32, 35, 13, 72, 90, 147, 91, 145, 1, 240, 55, - 255, 58, 171, 0, 147, 91, 155, 3, 224, 32, 35, 74, 170, 90, 147, 0, - 146, 1, 147, 2, 169, 90, 170, 48, 70, 2, 35, 255, 247, 181, 253, 2, - 170, 2, 33, 60, 231, 0, 32, 93, 176, 189, 232, 240, 131, 0, 191, 4, - 221, 1, 0, 112, 181, 5, 70, 188, 176, 4, 104, 14, 70, 9, 177, 8, 41, - 44, 209, 32, 35, 212, 248, 24, 39, 59, 147, 35, 107, 40, 70, 27, 137, - 0, 146, 212, 248, 32, 39, 3, 169, 1, 146, 59, 170, 255, 247, 148, 253, - 107, 123, 2, 43, 18, 209, 212, 248, 252, 52, 27, 120, 115, 177, 212, - 248, 52, 55, 179, 248, 164, 51, 3, 244, 64, 98, 178, 245, 64, 111, 5, - 209, 32, 70, 3, 169, 59, 154, 255, 247, 135, 254, 5, 224, 40, 70, 0, - 33, 3, 170, 59, 155, 255, 247, 247, 254, 164, 248, 22, 7, 107, 104, - 19, 177, 168, 104, 49, 70, 152, 71, 212, 248, 24, 23, 212, 248, 28, - 39, 96, 104, 249, 243, 235, 240, 0, 35, 196, 248, 24, 55, 96, 104, 41, - 70, 16, 34, 249, 243, 227, 240, 60, 176, 112, 189, 0, 0, 45, 233, 240, - 71, 13, 70, 79, 240, 0, 8, 64, 33, 154, 176, 4, 70, 192, 248, 32, 135, - 192, 248, 28, 23, 64, 104, 31, 70, 34, 158, 249, 243, 191, 240, 3, 70, - 196, 248, 24, 7, 0, 40, 125, 208, 42, 104, 98, 185, 32, 34, 196, 248, - 32, 39, 34, 107, 4, 245, 228, 97, 18, 137, 32, 70, 0, 145, 49, 70, 255, - 247, 242, 252, 37, 224, 32, 42, 111, 216, 169, 70, 30, 224, 89, 248, - 4, 63, 212, 248, 92, 1, 31, 250, 131, 250, 81, 70, 56, 240, 4, 220, - 0, 40, 98, 208, 184, 241, 0, 15, 5, 208, 25, 248, 4, 60, 95, 250, 138, - 242, 154, 66, 89, 217, 212, 248, 32, 55, 212, 248, 24, 39, 8, 241, 1, - 8, 34, 248, 19, 160, 1, 51, 196, 248, 32, 55, 43, 104, 152, 69, 221, - 211, 212, 248, 32, 55, 0, 43, 71, 208, 96, 104, 16, 33, 249, 243, 125, - 240, 5, 70, 0, 40, 67, 208, 37, 155, 79, 240, 0, 8, 131, 96, 157, 248, - 140, 48, 70, 115, 17, 174, 131, 115, 36, 34, 192, 248, 4, 128, 4, 96, - 128, 248, 12, 128, 65, 70, 48, 70, 244, 243, 31, 242, 79, 240, 255, - 51, 2, 147, 3, 147, 4, 147, 5, 147, 212, 248, 24, 55, 200, 235, 7, 2, - 6, 147, 212, 248, 32, 55, 87, 66, 7, 147, 25, 75, 71, 235, 2, 7, 10, - 147, 3, 35, 12, 147, 32, 70, 2, 33, 22, 74, 1, 35, 0, 150, 1, 151, 205, - 248, 32, 128, 205, 248, 36, 128, 11, 149, 205, 248, 52, 128, 205, 248, - 56, 128, 25, 240, 85, 217, 6, 70, 168, 185, 36, 155, 107, 96, 18, 224, - 111, 240, 21, 6, 4, 224, 111, 240, 1, 6, 1, 224, 111, 240, 26, 6, 212, - 248, 24, 23, 57, 177, 96, 104, 212, 248, 28, 39, 249, 243, 60, 240, - 0, 35, 196, 248, 24, 55, 48, 70, 26, 176, 189, 232, 240, 135, 0, 191, - 153, 218, 0, 0, 44, 158, 133, 0, 16, 181, 144, 248, 20, 55, 136, 176, - 4, 70, 0, 43, 62, 208, 208, 248, 104, 49, 155, 121, 0, 43, 100, 209, - 128, 248, 20, 55, 3, 104, 27, 126, 0, 43, 94, 208, 176, 248, 22, 55, - 0, 43, 90, 208, 3, 107, 24, 105, 3, 240, 118, 252, 180, 248, 22, 23, - 136, 66, 82, 208, 32, 70, 27, 240, 103, 216, 32, 70, 1, 240, 168, 253, - 32, 70, 180, 248, 22, 23, 26, 240, 165, 222, 35, 104, 147, 248, 47, - 48, 107, 177, 212, 248, 108, 50, 32, 70, 211, 248, 212, 18, 56, 49, - 21, 240, 81, 221, 1, 70, 196, 248, 172, 6, 32, 70, 14, 240, 233, 221, - 32, 70, 29, 240, 0, 217, 32, 70, 0, 33, 29, 240, 6, 219, 32, 70, 20, - 240, 115, 217, 42, 224, 3, 104, 27, 126, 59, 179, 208, 248, 104, 49, - 155, 121, 27, 187, 208, 248, 0, 5, 7, 169, 71, 240, 208, 217, 2, 224, - 27, 126, 153, 7, 26, 212, 7, 168, 71, 240, 209, 217, 3, 70, 0, 40, 246, - 209, 3, 224, 1, 35, 132, 248, 20, 55, 15, 224, 34, 107, 8, 169, 18, - 104, 65, 248, 12, 13, 0, 146, 3, 34, 1, 146, 2, 144, 3, 144, 1, 34, - 32, 70, 255, 247, 225, 254, 0, 40, 235, 208, 8, 176, 16, 189, 0, 32, - 112, 71, 0, 32, 112, 71, 0, 32, 112, 71, 1, 35, 128, 248, 122, 48, 112, - 71, 112, 181, 144, 232, 24, 0, 13, 70, 88, 104, 12, 33, 248, 243, 155, - 247, 6, 70, 48, 177, 0, 33, 12, 34, 244, 243, 77, 241, 46, 81, 0, 32, - 112, 189, 111, 240, 26, 0, 112, 189, 0, 0, 248, 181, 131, 104, 6, 70, - 92, 104, 3, 104, 15, 89, 13, 70, 88, 104, 79, 244, 132, 113, 248, 243, - 130, 247, 120, 96, 0, 40, 45, 208, 43, 89, 0, 33, 88, 104, 79, 244, - 132, 114, 244, 243, 48, 241, 51, 104, 196, 33, 88, 104, 47, 89, 248, - 243, 114, 247, 184, 96, 240, 177, 43, 89, 0, 33, 152, 104, 196, 34, - 244, 243, 34, 241, 43, 89, 40, 73, 159, 104, 51, 104, 50, 70, 59, 96, - 152, 104, 0, 35, 1, 240, 84, 220, 184, 102, 96, 177, 43, 89, 35, 73, - 159, 104, 51, 104, 50, 70, 152, 104, 0, 35, 1, 240, 73, 220, 199, 248, - 192, 0, 0, 40, 51, 209, 43, 89, 155, 104, 11, 179, 153, 110, 57, 177, - 51, 104, 152, 104, 1, 240, 32, 220, 43, 89, 0, 34, 155, 104, 154, 102, - 43, 89, 155, 104, 211, 248, 192, 16, 65, 177, 51, 104, 152, 104, 1, - 240, 19, 220, 43, 89, 0, 34, 155, 104, 195, 248, 192, 32, 50, 104, 43, - 89, 80, 104, 153, 104, 196, 34, 248, 243, 63, 247, 43, 89, 0, 34, 154, - 96, 43, 89, 89, 104, 105, 177, 51, 104, 79, 244, 132, 114, 88, 104, - 248, 243, 51, 247, 43, 89, 0, 34, 90, 96, 111, 240, 26, 0, 248, 189, - 0, 32, 248, 189, 111, 240, 26, 0, 248, 189, 145, 237, 0, 0, 201, 230, - 0, 0, 1, 70, 56, 181, 81, 248, 222, 91, 4, 70, 16, 34, 40, 70, 20, 240, - 45, 220, 40, 70, 4, 241, 238, 1, 16, 34, 189, 232, 56, 64, 20, 240, - 37, 156, 0, 0, 240, 181, 31, 75, 165, 176, 4, 104, 5, 70, 32, 170, 3, - 241, 8, 7, 24, 104, 89, 104, 22, 70, 3, 198, 8, 51, 187, 66, 50, 70, - 247, 209, 24, 104, 27, 121, 48, 96, 51, 113, 32, 70, 24, 169, 16, 34, - 20, 240, 11, 220, 28, 169, 16, 34, 32, 70, 20, 240, 6, 220, 32, 168, - 244, 243, 41, 241, 106, 104, 32, 36, 194, 50, 0, 146, 6, 34, 3, 70, - 1, 146, 4, 174, 33, 70, 32, 170, 5, 241, 126, 7, 24, 168, 2, 150, 3, - 148, 250, 243, 12, 240, 49, 70, 34, 70, 56, 70, 244, 243, 31, 240, 5, - 241, 158, 0, 57, 70, 34, 70, 244, 243, 25, 240, 37, 176, 240, 189, 0, - 191, 22, 221, 1, 0, 56, 181, 0, 241, 126, 5, 4, 70, 32, 33, 40, 70, - 245, 243, 128, 245, 40, 70, 4, 241, 158, 1, 32, 34, 243, 243, 234, 247, - 32, 185, 32, 70, 189, 232, 56, 64, 255, 247, 152, 191, 56, 189, 0, 0, - 240, 181, 46, 75, 223, 176, 4, 70, 14, 70, 89, 170, 3, 241, 16, 7, 24, - 104, 89, 104, 21, 70, 3, 197, 8, 51, 187, 66, 42, 70, 247, 209, 24, - 104, 40, 96, 179, 109, 217, 7, 70, 212, 154, 7, 6, 212, 3, 240, 4, 3, - 2, 43, 2, 208, 0, 43, 62, 208, 1, 224, 32, 35, 0, 224, 16, 35, 5, 173, - 164, 248, 124, 48, 6, 241, 194, 1, 40, 70, 6, 34, 4, 241, 190, 6, 243, - 243, 210, 247, 4, 241, 126, 1, 32, 34, 48, 70, 243, 243, 204, 247, 32, - 70, 255, 247, 181, 255, 49, 70, 32, 34, 168, 29, 243, 243, 196, 247, - 89, 168, 244, 243, 181, 240, 38, 34, 1, 146, 180, 248, 124, 32, 3, 70, - 0, 149, 3, 146, 69, 173, 32, 33, 89, 170, 4, 241, 222, 0, 2, 149, 249, - 243, 154, 247, 41, 70, 180, 248, 124, 32, 4, 241, 90, 0, 243, 243, 171, - 247, 4, 241, 254, 0, 0, 33, 8, 34, 244, 243, 9, 240, 32, 70, 255, 247, - 167, 254, 95, 176, 240, 189, 35, 221, 1, 0, 127, 181, 67, 104, 4, 172, - 155, 104, 68, 248, 8, 45, 0, 147, 13, 70, 0, 104, 183, 33, 34, 70, 8, - 35, 248, 247, 36, 253, 6, 70, 48, 185, 40, 70, 33, 70, 8, 34, 243, 243, - 137, 247, 48, 70, 1, 224, 79, 240, 255, 48, 4, 176, 112, 189, 0, 0, - 45, 233, 240, 71, 0, 241, 254, 5, 14, 70, 146, 70, 178, 248, 0, 128, - 41, 70, 144, 248, 123, 32, 4, 70, 255, 247, 214, 255, 32, 177, 40, 70, - 0, 33, 8, 34, 243, 243, 210, 247, 6, 241, 18, 7, 8, 241, 88, 0, 56, - 24, 221, 35, 195, 113, 148, 248, 124, 48, 0, 241, 7, 9, 6, 51, 3, 114, - 3, 34, 9, 48, 21, 73, 8, 241, 6, 8, 243, 243, 90, 247, 31, 250, 136, - 248, 1, 35, 137, 248, 5, 48, 8, 241, 88, 3, 255, 24, 148, 248, 122, - 48, 4, 241, 90, 1, 3, 240, 3, 3, 251, 113, 180, 248, 124, 32, 7, 241, - 9, 0, 243, 243, 69, 247, 180, 248, 124, 48, 6, 241, 79, 0, 2, 51, 152, - 68, 41, 70, 8, 34, 243, 243, 59, 247, 170, 248, 0, 128, 180, 248, 124, - 0, 8, 48, 189, 232, 240, 135, 175, 184, 1, 0, 45, 233, 247, 79, 153, - 70, 3, 104, 176, 248, 124, 64, 5, 70, 139, 70, 88, 104, 32, 33, 146, - 70, 248, 243, 209, 245, 7, 70, 0, 40, 116, 208, 43, 104, 79, 244, 128, - 113, 88, 104, 248, 243, 200, 245, 128, 70, 0, 40, 97, 208, 43, 104, - 79, 244, 129, 113, 88, 104, 248, 243, 191, 245, 6, 70, 0, 40, 112, 208, - 186, 241, 1, 15, 3, 208, 186, 241, 2, 15, 102, 209, 35, 224, 5, 241, - 142, 1, 16, 34, 56, 70, 243, 243, 3, 247, 11, 241, 156, 1, 16, 34, 7, - 241, 16, 0, 243, 243, 252, 246, 5, 241, 90, 1, 34, 70, 72, 70, 243, - 243, 246, 246, 56, 70, 32, 33, 50, 70, 250, 243, 223, 241, 64, 70, 50, - 70, 79, 244, 128, 113, 250, 243, 9, 242, 72, 70, 33, 70, 50, 70, 250, - 243, 4, 242, 41, 224, 181, 248, 124, 48, 15, 43, 8, 216, 40, 25, 196, - 241, 16, 2, 90, 48, 0, 33, 243, 243, 62, 247, 16, 36, 15, 224, 20, 240, - 7, 2, 12, 208, 40, 25, 90, 48, 0, 33, 194, 241, 8, 2, 243, 243, 50, - 247, 79, 246, 248, 115, 35, 64, 3, 241, 8, 4, 164, 178, 16, 32, 11, - 241, 156, 1, 34, 70, 5, 241, 90, 3, 205, 248, 0, 144, 241, 243, 162, - 247, 200, 185, 8, 52, 164, 178, 12, 155, 28, 128, 1, 36, 24, 224, 4, - 70, 6, 70, 43, 104, 57, 70, 88, 104, 32, 34, 248, 243, 107, 245, 22, - 185, 10, 224, 4, 70, 8, 224, 43, 104, 49, 70, 88, 104, 79, 244, 129, - 114, 248, 243, 96, 245, 0, 224, 0, 36, 32, 70, 189, 232, 254, 143, 4, - 70, 43, 104, 65, 70, 88, 104, 79, 244, 128, 114, 248, 243, 83, 245, - 224, 231, 45, 233, 240, 79, 159, 176, 5, 70, 14, 70, 6, 146, 208, 248, - 0, 160, 31, 70, 0, 43, 0, 240, 197, 129, 131, 104, 2, 42, 91, 104, 251, - 88, 211, 248, 4, 128, 155, 104, 7, 147, 56, 208, 4, 42, 0, 240, 0, 129, - 0, 42, 64, 240, 179, 129, 7, 241, 26, 2, 80, 70, 105, 104, 113, 35, - 73, 240, 18, 216, 7, 70, 0, 40, 0, 240, 171, 129, 4, 105, 79, 244, 190, - 67, 4, 241, 18, 11, 35, 130, 6, 153, 95, 34, 88, 70, 243, 243, 201, - 246, 70, 240, 136, 3, 26, 10, 226, 116, 35, 117, 184, 248, 24, 48, 8, - 241, 28, 9, 26, 10, 163, 117, 73, 70, 98, 117, 80, 70, 32, 34, 20, 240, - 34, 218, 73, 70, 4, 241, 31, 0, 32, 34, 243, 243, 78, 246, 11, 35, 200, - 248, 0, 48, 221, 248, 24, 144, 135, 225, 184, 248, 2, 49, 179, 245, - 0, 127, 2, 209, 65, 244, 114, 118, 10, 224, 128, 43, 4, 209, 65, 244, - 158, 86, 70, 240, 8, 6, 3, 224, 4, 43, 8, 191, 65, 244, 228, 118, 106, - 104, 184, 248, 4, 176, 146, 109, 173, 248, 118, 176, 2, 240, 2, 9, 185, - 241, 0, 15, 12, 191, 79, 240, 4, 9, 79, 240, 2, 9, 11, 241, 113, 11, - 128, 43, 31, 250, 139, 251, 48, 209, 22, 244, 128, 83, 46, 208, 44, - 138, 20, 240, 1, 4, 27, 209, 40, 70, 255, 247, 174, 253, 40, 70, 105, - 104, 255, 247, 20, 254, 149, 248, 122, 32, 181, 248, 124, 48, 141, 232, - 4, 2, 1, 34, 3, 146, 80, 70, 105, 104, 5, 241, 90, 2, 2, 148, 75, 240, - 59, 216, 43, 138, 133, 248, 123, 0, 67, 240, 1, 3, 43, 130, 189, 248, - 118, 48, 181, 248, 124, 32, 19, 240, 7, 3, 2, 209, 2, 241, 16, 3, 1, - 224, 24, 50, 211, 26, 155, 178, 0, 224, 0, 35, 155, 68, 7, 241, 26, - 2, 80, 70, 105, 104, 31, 250, 139, 243, 72, 240, 131, 223, 7, 70, 0, - 40, 0, 240, 28, 129, 4, 105, 95, 35, 4, 241, 18, 11, 0, 33, 95, 34, - 35, 130, 88, 70, 243, 243, 59, 246, 51, 10, 227, 116, 38, 117, 184, - 248, 24, 48, 8, 241, 28, 1, 26, 10, 163, 117, 98, 117, 4, 241, 31, 0, - 32, 34, 243, 243, 200, 245, 184, 248, 4, 32, 4, 241, 113, 0, 216, 248, - 8, 16, 243, 243, 192, 245, 189, 248, 118, 48, 26, 10, 66, 234, 3, 35, - 164, 248, 111, 48, 184, 248, 2, 49, 128, 43, 39, 209, 243, 4, 37, 213, - 13, 241, 118, 2, 40, 70, 33, 70, 255, 247, 43, 254, 189, 248, 118, 48, - 4, 241, 63, 0, 26, 10, 66, 234, 3, 35, 164, 248, 111, 48, 163, 123, - 2, 43, 4, 209, 0, 33, 16, 34, 243, 243, 1, 246, 4, 224, 5, 241, 142, - 1, 16, 34, 243, 243, 151, 245, 88, 70, 49, 70, 8, 241, 156, 2, 0, 35, - 245, 243, 92, 242, 0, 40, 0, 240, 204, 128, 148, 248, 111, 32, 148, - 248, 112, 48, 67, 234, 2, 35, 34, 138, 155, 24, 155, 178, 26, 10, 66, - 234, 3, 35, 35, 130, 12, 35, 118, 224, 144, 248, 122, 48, 176, 248, - 124, 144, 27, 1, 3, 240, 48, 3, 65, 234, 3, 6, 70, 244, 96, 118, 182, - 178, 0, 35, 176, 7, 84, 191, 9, 241, 113, 9, 9, 241, 121, 9, 31, 250, - 137, 249, 173, 248, 118, 48, 7, 241, 26, 2, 80, 70, 105, 104, 75, 70, - 72, 240, 254, 222, 7, 70, 0, 40, 0, 240, 151, 128, 4, 105, 95, 35, 4, - 241, 18, 11, 0, 33, 169, 241, 18, 2, 35, 130, 88, 70, 243, 243, 181, - 245, 51, 10, 227, 116, 38, 117, 181, 248, 124, 48, 5, 241, 190, 1, 26, - 10, 163, 117, 98, 117, 4, 241, 31, 0, 32, 34, 243, 243, 66, 245, 4, - 241, 63, 9, 5, 241, 142, 12, 97, 70, 16, 34, 72, 70, 205, 248, 20, 192, - 243, 243, 55, 245, 8, 34, 5, 241, 254, 1, 4, 241, 79, 0, 243, 243, 48, - 245, 13, 241, 118, 3, 0, 147, 40, 70, 4, 241, 113, 3, 65, 70, 6, 240, - 3, 2, 255, 247, 243, 253, 163, 123, 72, 70, 2, 43, 221, 248, 20, 192, - 4, 209, 0, 33, 16, 34, 243, 243, 127, 245, 3, 224, 97, 70, 16, 34, 243, - 243, 22, 245, 189, 248, 118, 48, 26, 10, 66, 234, 3, 34, 164, 248, 111, - 32, 34, 138, 155, 24, 155, 178, 26, 10, 66, 234, 3, 35, 35, 130, 15, - 35, 200, 248, 0, 48, 79, 240, 1, 9, 65, 224, 32, 70, 6, 240, 3, 1, 8, - 241, 140, 2, 9, 171, 245, 243, 132, 242, 0, 40, 49, 208, 11, 241, 77, - 0, 9, 169, 16, 34, 243, 243, 242, 244, 184, 248, 2, 49, 179, 245, 0, - 127, 3, 209, 123, 106, 67, 240, 128, 115, 123, 98, 218, 248, 0, 48, - 147, 248, 149, 48, 75, 177, 6, 155, 11, 177, 2, 43, 5, 209, 123, 106, - 35, 244, 64, 51, 67, 244, 128, 51, 123, 98, 107, 104, 57, 70, 154, 104, - 80, 70, 25, 240, 234, 221, 7, 155, 218, 248, 8, 0, 211, 248, 192, 16, - 79, 244, 122, 114, 0, 35, 0, 240, 244, 223, 1, 39, 2, 224, 0, 39, 0, - 224, 7, 70, 56, 70, 31, 176, 189, 232, 240, 143, 129, 70, 3, 35, 227, - 115, 184, 248, 2, 49, 88, 70, 128, 43, 20, 191, 254, 35, 2, 35, 0, 248, - 5, 59, 8, 241, 92, 1, 8, 34, 243, 243, 176, 244, 185, 241, 0, 15, 186, - 208, 169, 231, 208, 248, 72, 49, 112, 181, 92, 104, 6, 70, 225, 66, - 13, 70, 64, 208, 11, 89, 0, 43, 61, 208, 89, 104, 89, 177, 75, 240, - 7, 216, 43, 89, 79, 244, 132, 114, 89, 104, 112, 104, 248, 243, 82, - 243, 43, 89, 0, 34, 90, 96, 43, 89, 155, 104, 0, 43, 43, 208, 153, 110, - 97, 177, 176, 104, 0, 240, 252, 223, 43, 89, 176, 104, 155, 104, 153, - 110, 1, 240, 8, 216, 43, 89, 0, 34, 155, 104, 154, 102, 43, 89, 155, - 104, 211, 248, 192, 16, 113, 177, 176, 104, 0, 240, 234, 223, 43, 89, - 176, 104, 155, 104, 211, 248, 192, 16, 0, 240, 245, 223, 43, 89, 0, - 34, 155, 104, 195, 248, 192, 32, 43, 89, 196, 34, 153, 104, 112, 104, - 248, 243, 34, 243, 43, 89, 0, 34, 154, 96, 112, 189, 193, 104, 16, 181, - 4, 70, 33, 177, 0, 104, 255, 247, 175, 255, 0, 35, 227, 96, 16, 189, - 112, 181, 197, 104, 4, 70, 0, 45, 82, 208, 131, 104, 91, 104, 235, 88, - 91, 104, 0, 43, 76, 208, 30, 138, 26, 104, 4, 46, 20, 191, 1, 38, 2, - 38, 12, 42, 28, 208, 15, 42, 42, 208, 11, 42, 64, 209, 147, 248, 4, - 33, 81, 28, 2, 42, 131, 248, 4, 17, 8, 217, 193, 104, 33, 177, 64, 104, - 26, 49, 15, 34, 74, 240, 65, 223, 32, 70, 31, 224, 3, 241, 92, 0, 8, - 33, 245, 243, 160, 241, 32, 70, 49, 70, 0, 34, 34, 224, 147, 248, 4, - 33, 81, 28, 2, 42, 131, 248, 4, 17, 15, 216, 3, 241, 92, 0, 8, 33, 245, - 243, 144, 241, 32, 70, 49, 70, 2, 34, 18, 224, 147, 248, 4, 33, 81, - 28, 2, 42, 131, 248, 4, 17, 3, 217, 189, 232, 112, 64, 255, 247, 171, - 191, 3, 241, 92, 0, 8, 33, 245, 243, 124, 241, 32, 70, 49, 70, 4, 34, - 43, 70, 189, 232, 112, 64, 255, 247, 106, 189, 112, 189, 112, 181, 6, - 70, 0, 104, 12, 70, 255, 247, 77, 255, 49, 104, 0, 35, 202, 24, 210, - 248, 76, 34, 50, 177, 82, 105, 34, 177, 208, 104, 160, 66, 1, 209, 0, - 32, 208, 96, 4, 51, 32, 43, 241, 209, 117, 104, 99, 25, 67, 177, 97, - 89, 49, 177, 51, 104, 12, 34, 88, 104, 248, 243, 155, 242, 0, 35, 99, - 81, 112, 189, 55, 181, 12, 70, 21, 70, 1, 70, 112, 177, 107, 177, 130, - 104, 82, 104, 155, 88, 10, 139, 152, 104, 82, 177, 195, 136, 83, 185, - 26, 49, 35, 70, 0, 149, 74, 240, 153, 221, 5, 224, 79, 240, 255, 48, - 2, 224, 16, 70, 0, 224, 0, 32, 62, 189, 45, 233, 240, 79, 2, 104, 137, - 176, 5, 70, 136, 70, 6, 146, 153, 70, 0, 43, 0, 240, 50, 129, 131, 104, - 91, 104, 89, 248, 3, 48, 92, 104, 211, 248, 8, 160, 0, 44, 0, 240, 42, - 129, 186, 241, 0, 15, 0, 240, 40, 129, 35, 138, 4, 43, 20, 191, 1, 35, - 2, 35, 7, 147, 180, 248, 2, 49, 128, 43, 5, 208, 179, 245, 0, 127, 2, - 208, 4, 43, 64, 240, 26, 129, 4, 241, 92, 11, 1, 32, 8, 35, 8, 241, - 23, 1, 90, 70, 152, 248, 19, 112, 152, 248, 20, 96, 244, 243, 241, 246, - 131, 69, 0, 240, 12, 129, 35, 104, 70, 234, 7, 38, 12, 43, 99, 208, - 15, 43, 0, 240, 227, 128, 11, 43, 64, 240, 1, 129, 6, 244, 220, 115, - 179, 245, 132, 127, 64, 240, 251, 128, 4, 241, 60, 7, 32, 34, 8, 241, - 31, 1, 56, 70, 243, 243, 111, 243, 9, 241, 26, 3, 6, 147, 10, 241, 72, - 3, 0, 147, 186, 248, 6, 48, 4, 241, 140, 12, 205, 248, 8, 192, 1, 147, - 163, 138, 105, 104, 3, 147, 194, 49, 6, 152, 4, 241, 28, 2, 59, 70, - 205, 248, 20, 192, 244, 243, 34, 247, 22, 244, 128, 127, 221, 248, 20, - 192, 8, 208, 64, 70, 6, 240, 3, 1, 98, 70, 244, 243, 119, 247, 0, 40, - 0, 240, 204, 128, 152, 248, 111, 32, 152, 248, 112, 48, 83, 234, 2, - 35, 8, 208, 226, 136, 154, 66, 5, 209, 8, 241, 113, 0, 225, 104, 243, - 243, 29, 243, 40, 177, 104, 104, 6, 153, 17, 34, 74, 240, 65, 222, 181, - 224, 132, 248, 4, 1, 43, 104, 218, 248, 192, 16, 152, 104, 0, 240, 156, - 222, 88, 70, 8, 33, 245, 243, 154, 240, 40, 70, 7, 153, 2, 34, 75, 70, - 255, 247, 138, 252, 162, 224, 6, 244, 216, 115, 179, 245, 128, 127, - 64, 240, 157, 128, 241, 5, 9, 213, 64, 70, 6, 240, 3, 1, 4, 241, 140, - 2, 244, 243, 60, 247, 0, 40, 0, 240, 145, 128, 0, 35, 132, 248, 4, 49, - 43, 104, 218, 248, 192, 16, 152, 104, 0, 240, 118, 222, 34, 138, 9, - 241, 26, 6, 35, 139, 6, 152, 141, 232, 68, 0, 105, 104, 4, 241, 172, - 2, 74, 240, 160, 221, 180, 248, 2, 49, 128, 43, 2, 209, 16, 35, 35, - 96, 52, 224, 4, 43, 50, 209, 47, 138, 13, 35, 23, 240, 1, 7, 35, 96, - 34, 209, 40, 70, 255, 247, 126, 250, 40, 70, 105, 104, 255, 247, 228, - 250, 149, 248, 122, 32, 181, 248, 124, 48, 1, 42, 20, 191, 1, 34, 2, - 34, 133, 248, 122, 32, 0, 146, 34, 138, 6, 152, 1, 146, 1, 34, 3, 146, - 105, 104, 5, 241, 90, 2, 2, 151, 74, 240, 4, 221, 43, 138, 133, 248, - 123, 0, 67, 240, 1, 3, 43, 130, 88, 70, 8, 33, 245, 243, 54, 240, 40, - 70, 7, 153, 4, 34, 75, 70, 255, 247, 38, 252, 180, 248, 2, 49, 179, - 245, 0, 127, 5, 209, 6, 154, 49, 70, 210, 248, 68, 1, 1, 240, 49, 255, - 180, 248, 2, 49, 128, 43, 1, 208, 4, 43, 8, 209, 107, 104, 6, 152, 155, - 104, 121, 33, 0, 147, 50, 70, 6, 35, 248, 247, 54, 248, 180, 248, 2, - 49, 128, 43, 33, 209, 20, 224, 242, 5, 7, 213, 64, 70, 6, 240, 3, 1, - 4, 241, 140, 2, 244, 243, 192, 246, 176, 177, 0, 35, 132, 248, 4, 49, - 43, 104, 218, 248, 192, 16, 152, 104, 0, 240, 252, 221, 16, 35, 35, - 96, 40, 70, 255, 247, 35, 254, 7, 224, 24, 70, 6, 224, 32, 70, 4, 224, - 80, 70, 2, 224, 0, 32, 0, 224, 1, 32, 9, 176, 189, 232, 240, 143, 45, - 233, 243, 71, 11, 158, 5, 70, 144, 70, 154, 70, 137, 70, 0, 41, 65, - 208, 0, 46, 65, 208, 131, 104, 0, 104, 91, 104, 243, 88, 92, 104, 159, - 104, 33, 70, 74, 240, 206, 221, 9, 35, 35, 96, 153, 248, 0, 48, 40, - 104, 48, 43, 107, 104, 33, 70, 179, 248, 98, 48, 74, 70, 12, 191, 3, - 240, 128, 3, 3, 240, 4, 3, 164, 248, 2, 49, 10, 155, 205, 248, 0, 160, - 1, 147, 67, 70, 74, 240, 213, 221, 248, 177, 107, 105, 1, 43, 1, 209, - 248, 136, 208, 177, 79, 240, 0, 8, 132, 248, 4, 129, 43, 104, 215, 248, - 192, 16, 152, 104, 0, 240, 173, 221, 33, 138, 10, 35, 35, 96, 40, 70, - 4, 41, 20, 191, 1, 33, 2, 33, 66, 70, 51, 70, 255, 247, 153, 251, 1, - 32, 2, 224, 8, 70, 0, 224, 48, 70, 189, 232, 252, 135, 112, 181, 5, - 70, 14, 70, 64, 104, 79, 244, 132, 113, 248, 243, 204, 240, 4, 70, 72, - 177, 0, 33, 79, 244, 132, 114, 243, 243, 125, 242, 213, 248, 72, 49, - 132, 232, 96, 0, 163, 96, 32, 70, 112, 189, 1, 70, 40, 177, 3, 104, - 79, 244, 132, 114, 88, 104, 248, 243, 198, 176, 112, 71, 56, 181, 4, - 70, 0, 40, 52, 208, 97, 104, 0, 104, 57, 240, 85, 217, 35, 138, 0, 37, - 35, 240, 1, 3, 35, 130, 41, 70, 32, 34, 132, 248, 122, 80, 132, 248, - 123, 80, 164, 248, 124, 80, 4, 241, 90, 0, 243, 243, 84, 242, 41, 70, - 32, 34, 4, 241, 126, 0, 243, 243, 78, 242, 41, 70, 32, 34, 4, 241, 158, - 0, 243, 243, 72, 242, 41, 70, 8, 34, 4, 241, 254, 0, 243, 243, 66, 242, - 41, 70, 32, 34, 4, 241, 222, 0, 243, 243, 60, 242, 4, 241, 190, 0, 41, - 70, 32, 34, 189, 232, 56, 64, 243, 243, 52, 178, 56, 189, 112, 181, - 13, 70, 180, 176, 4, 70, 0, 40, 54, 208, 0, 41, 52, 208, 3, 138, 74, - 136, 35, 240, 2, 3, 27, 4, 27, 12, 18, 240, 1, 15, 3, 130, 10, 136, - 26, 208, 162, 241, 8, 3, 155, 178, 56, 43, 36, 216, 64, 42, 24, 209, - 0, 35, 3, 168, 4, 49, 0, 147, 74, 240, 127, 219, 6, 70, 128, 185, 4, - 241, 26, 0, 21, 169, 32, 34, 243, 243, 167, 241, 35, 138, 48, 70, 67, - 240, 2, 3, 35, 130, 16, 224, 32, 42, 12, 209, 67, 240, 2, 3, 3, 130, - 41, 29, 42, 136, 4, 241, 26, 0, 243, 243, 150, 241, 45, 136, 0, 32, - 37, 131, 1, 224, 111, 240, 1, 0, 52, 176, 112, 189, 240, 181, 6, 159, - 20, 70, 7, 158, 26, 70, 5, 155, 80, 177, 1, 41, 7, 209, 65, 97, 33, - 70, 5, 151, 6, 150, 189, 232, 240, 64, 255, 247, 5, 191, 0, 32, 240, - 189, 16, 181, 136, 177, 204, 123, 3, 44, 11, 209, 68, 105, 1, 44, 8, - 209, 140, 124, 2, 44, 1, 208, 254, 44, 5, 209, 255, 247, 171, 253, 1, - 32, 16, 189, 0, 32, 16, 189, 0, 32, 16, 189, 45, 233, 240, 65, 70, 104, - 23, 70, 214, 248, 212, 50, 208, 248, 0, 128, 90, 142, 173, 245, 6, 125, - 2, 244, 112, 66, 162, 245, 128, 85, 106, 66, 66, 235, 5, 2, 4, 70, 64, - 70, 70, 240, 108, 221, 79, 244, 0, 115, 133, 147, 5, 70, 0, 40, 81, - 208, 71, 177, 227, 104, 0, 43, 77, 209, 32, 70, 41, 70, 255, 247, 96, - 248, 0, 40, 71, 209, 163, 104, 32, 70, 91, 104, 235, 88, 159, 104, 255, - 247, 227, 248, 182, 248, 98, 48, 171, 135, 3, 177, 229, 96, 35, 138, - 152, 7, 8, 213, 32, 34, 7, 241, 72, 0, 4, 241, 26, 1, 243, 243, 42, - 241, 32, 34, 250, 128, 251, 136, 32, 43, 27, 209, 133, 171, 0, 147, - 64, 70, 80, 33, 42, 105, 5, 171, 1, 240, 115, 248, 8, 171, 0, 147, 133, - 155, 32, 70, 12, 59, 1, 147, 227, 104, 1, 33, 2, 147, 213, 248, 232, - 32, 213, 248, 236, 48, 255, 247, 128, 255, 160, 185, 32, 70, 255, 247, - 168, 252, 16, 224, 99, 104, 112, 105, 179, 248, 98, 48, 179, 245, 0, - 127, 3, 209, 6, 241, 188, 1, 6, 34, 2, 224, 114, 126, 6, 241, 26, 1, - 43, 70, 255, 247, 28, 253, 13, 245, 6, 125, 189, 232, 240, 129, 45, - 233, 240, 71, 198, 104, 5, 70, 7, 104, 0, 46, 51, 208, 131, 104, 91, - 104, 243, 88, 156, 104, 0, 44, 45, 208, 4, 241, 108, 9, 72, 70, 79, - 244, 128, 113, 248, 243, 232, 247, 128, 70, 0, 40, 27, 209, 4, 241, - 72, 1, 32, 34, 72, 70, 249, 243, 31, 240, 32, 35, 227, 128, 107, 104, - 6, 241, 26, 1, 179, 248, 98, 48, 179, 245, 0, 127, 5, 209, 215, 248, - 68, 1, 189, 232, 240, 71, 1, 240, 70, 189, 40, 70, 66, 70, 189, 232, - 240, 71, 255, 247, 91, 191, 0, 34, 184, 104, 161, 110, 19, 70, 189, - 232, 240, 71, 0, 240, 227, 155, 189, 232, 240, 135, 127, 181, 145, 248, - 148, 48, 5, 70, 12, 70, 67, 179, 208, 248, 0, 5, 3, 169, 70, 240, 90, - 217, 16, 224, 51, 126, 155, 7, 13, 213, 51, 105, 163, 66, 10, 209, 1, - 35, 79, 240, 2, 14, 141, 232, 8, 64, 40, 70, 33, 70, 50, 70, 0, 35, - 70, 240, 96, 218, 3, 168, 70, 240, 77, 217, 6, 70, 0, 40, 232, 209, - 60, 35, 196, 248, 140, 48, 247, 243, 213, 243, 1, 35, 196, 248, 144, - 0, 132, 248, 148, 96, 132, 248, 132, 48, 127, 189, 112, 71, 16, 181, - 195, 248, 160, 16, 8, 32, 25, 70, 28, 70, 51, 240, 242, 220, 132, 248, - 164, 0, 16, 189, 56, 181, 5, 125, 4, 70, 165, 177, 67, 125, 139, 185, - 192, 104, 161, 105, 0, 240, 227, 219, 208, 241, 1, 5, 56, 191, 0, 37, - 1, 35, 99, 117, 227, 105, 11, 177, 160, 104, 152, 71, 0, 35, 99, 117, - 35, 117, 0, 224, 0, 37, 40, 70, 56, 189, 0, 35, 11, 97, 75, 129, 11, - 114, 11, 115, 8, 70, 6, 34, 25, 70, 243, 243, 186, 176, 45, 233, 247, - 67, 157, 248, 40, 144, 6, 70, 12, 70, 21, 70, 152, 70, 185, 241, 0, - 15, 58, 209, 207, 104, 0, 47, 55, 208, 59, 105, 0, 43, 52, 208, 59, - 122, 11, 43, 35, 209, 251, 121, 67, 69, 209, 248, 112, 49, 9, 209, 235, - 177, 9, 105, 154, 121, 56, 240, 26, 216, 196, 248, 112, 145, 196, 248, - 116, 145, 20, 224, 0, 43, 47, 208, 218, 121, 66, 69, 46, 209, 2, 104, - 145, 106, 212, 248, 116, 33, 145, 66, 7, 217, 33, 105, 154, 121, 56, - 240, 6, 216, 196, 248, 112, 145, 196, 248, 116, 145, 212, 248, 112, - 113, 251, 121, 67, 69, 30, 208, 149, 249, 72, 32, 141, 232, 8, 1, 49, - 104, 14, 75, 73, 104, 14, 72, 0, 240, 191, 252, 18, 224, 214, 248, 108, - 50, 157, 66, 3, 208, 171, 121, 11, 185, 79, 234, 88, 8, 184, 241, 3, - 15, 7, 216, 5, 235, 136, 5, 111, 111, 4, 224, 31, 70, 2, 224, 79, 70, - 0, 224, 0, 39, 56, 70, 189, 232, 254, 131, 0, 191, 223, 221, 1, 0, 177, - 221, 1, 0, 0, 104, 249, 247, 170, 187, 16, 181, 4, 104, 180, 176, 81, - 177, 1, 113, 201, 34, 0, 33, 1, 168, 243, 243, 75, 240, 35, 107, 1, - 169, 24, 105, 2, 240, 36, 253, 52, 176, 16, 189, 79, 240, 255, 48, 112, - 71, 79, 240, 255, 48, 112, 71, 45, 233, 247, 67, 10, 159, 11, 158, 12, - 70, 5, 70, 144, 70, 153, 70, 0, 151, 1, 150, 63, 240, 78, 221, 75, 70, - 40, 70, 33, 70, 66, 70, 0, 151, 1, 150, 63, 240, 52, 222, 33, 70, 1, - 34, 40, 70, 63, 240, 23, 222, 180, 248, 52, 53, 217, 6, 6, 213, 40, - 70, 33, 70, 3, 176, 189, 232, 240, 67, 61, 240, 70, 156, 3, 176, 189, - 232, 240, 131, 64, 107, 112, 71, 248, 181, 4, 70, 14, 70, 23, 70, 144, - 248, 86, 81, 254, 243, 143, 245, 96, 177, 15, 224, 115, 106, 219, 6, - 6, 212, 148, 248, 87, 49, 67, 240, 2, 3, 132, 248, 87, 49, 3, 224, 56, - 63, 56, 54, 55, 47, 241, 216, 132, 248, 86, 81, 248, 189, 248, 181, - 4, 70, 14, 70, 23, 70, 144, 248, 86, 81, 254, 243, 216, 245, 96, 177, - 15, 224, 243, 136, 218, 6, 6, 212, 148, 248, 87, 49, 67, 240, 1, 3, - 132, 248, 87, 49, 3, 224, 8, 63, 8, 54, 7, 47, 241, 216, 132, 248, 86, - 81, 248, 189, 45, 233, 240, 65, 162, 176, 4, 70, 136, 70, 144, 248, - 85, 97, 144, 248, 86, 113, 144, 248, 84, 81, 136, 34, 104, 70, 242, - 243, 108, 247, 32, 70, 65, 70, 254, 243, 182, 247, 0, 40, 50, 209, 0, - 155, 132, 248, 86, 113, 157, 66, 132, 248, 84, 81, 41, 208, 27, 185, - 148, 248, 87, 33, 114, 177, 17, 224, 2, 43, 4, 209, 148, 248, 87, 33, - 18, 240, 1, 15, 5, 224, 1, 43, 6, 209, 148, 248, 87, 33, 18, 240, 2, - 15, 1, 209, 254, 34, 18, 224, 133, 185, 11, 224, 1, 45, 2, 209, 18, - 240, 1, 15, 3, 224, 2, 45, 3, 209, 18, 240, 2, 15, 5, 209, 7, 224, 53, - 185, 148, 248, 85, 33, 178, 66, 2, 210, 0, 34, 132, 248, 86, 33, 132, - 248, 84, 49, 34, 176, 189, 232, 240, 129, 16, 181, 4, 70, 255, 243, - 16, 240, 0, 35, 132, 248, 87, 49, 164, 248, 88, 49, 196, 248, 92, 49, - 132, 248, 86, 49, 16, 189, 56, 181, 4, 70, 13, 70, 255, 243, 111, 240, - 0, 187, 163, 109, 221, 177, 235, 185, 212, 248, 84, 33, 14, 75, 19, - 64, 123, 177, 148, 248, 84, 49, 2, 43, 4, 209, 148, 248, 87, 49, 19, - 240, 1, 15, 5, 224, 1, 43, 6, 209, 148, 248, 87, 49, 19, 240, 2, 15, - 1, 209, 254, 35, 0, 224, 0, 35, 132, 248, 86, 49, 56, 189, 11, 177, - 132, 248, 86, 1, 56, 189, 255, 0, 0, 255, 240, 181, 145, 176, 173, 241, - 4, 6, 4, 70, 5, 70, 182, 70, 0, 35, 9, 224, 7, 105, 1, 51, 151, 248, - 7, 192, 78, 248, 4, 207, 215, 248, 52, 192, 135, 248, 7, 192, 180, 249, - 16, 112, 4, 48, 187, 66, 240, 219, 32, 70, 255, 243, 49, 241, 0, 35, - 4, 224, 42, 105, 86, 248, 4, 31, 1, 51, 209, 113, 180, 249, 16, 32, - 4, 53, 147, 66, 245, 219, 17, 176, 240, 189, 56, 181, 21, 70, 4, 70, - 255, 243, 180, 241, 43, 104, 11, 177, 2, 35, 163, 101, 56, 189, 14, - 41, 115, 181, 5, 70, 11, 208, 15, 41, 16, 209, 17, 70, 1, 168, 4, 34, - 242, 243, 186, 246, 40, 70, 1, 153, 243, 247, 175, 254, 8, 224, 176, - 248, 88, 49, 0, 32, 3, 240, 1, 3, 19, 96, 1, 224, 255, 243, 218, 241, - 124, 189, 248, 181, 4, 70, 15, 70, 134, 110, 255, 243, 123, 246, 5, - 70, 128, 185, 4, 34, 7, 241, 20, 1, 4, 245, 174, 112, 242, 243, 156, - 246, 212, 248, 92, 49, 79, 244, 122, 114, 83, 67, 113, 28, 196, 248, - 92, 49, 8, 191, 166, 102, 40, 70, 248, 189, 131, 110, 1, 51, 1, 208, - 254, 243, 51, 181, 112, 71, 248, 181, 12, 41, 4, 70, 13, 70, 23, 70, - 144, 248, 83, 97, 13, 209, 0, 33, 1, 34, 255, 243, 210, 240, 32, 70, - 0, 33, 1, 34, 255, 243, 137, 240, 0, 35, 132, 248, 206, 48, 132, 248, - 205, 48, 163, 110, 41, 70, 88, 28, 8, 191, 132, 248, 86, 49, 32, 70, - 58, 70, 255, 243, 222, 241, 180, 248, 108, 48, 3, 240, 192, 3, 192, - 43, 22, 209, 212, 248, 92, 49, 155, 177, 148, 248, 83, 49, 179, 66, - 15, 217, 227, 104, 161, 104, 152, 104, 0, 240, 202, 217, 227, 104, 161, - 104, 152, 104, 212, 248, 92, 33, 1, 35, 0, 240, 122, 217, 79, 240, 255, - 51, 163, 102, 248, 189, 45, 233, 248, 67, 4, 70, 137, 70, 255, 243, - 166, 246, 247, 243, 138, 241, 148, 248, 84, 49, 128, 70, 1, 43, 29, - 216, 38, 70, 0, 37, 22, 224, 119, 105, 187, 121, 2, 43, 16, 209, 180, - 248, 108, 48, 219, 5, 12, 213, 32, 70, 73, 70, 66, 70, 243, 247, 147, - 253, 48, 185, 4, 35, 187, 113, 148, 248, 205, 48, 1, 59, 132, 248, 205, - 48, 1, 53, 4, 54, 180, 249, 16, 48, 157, 66, 228, 219, 189, 232, 248, - 131, 112, 71, 0, 32, 112, 71, 112, 71, 0, 32, 112, 71, 112, 71, 0, 32, - 112, 71, 112, 71, 0, 32, 112, 71, 112, 71, 112, 71, 112, 71, 112, 71, - 112, 71, 112, 71, 112, 71, 112, 71, 79, 240, 255, 48, 112, 71, 112, - 71, 0, 32, 112, 71, 0, 32, 112, 71, 112, 71, 112, 71, 112, 71, 0, 32, - 112, 71, 112, 71, 45, 233, 255, 65, 11, 158, 12, 70, 182, 248, 98, 80, - 10, 159, 21, 240, 15, 15, 221, 248, 48, 128, 20, 208, 64, 242, 55, 21, - 61, 64, 133, 177, 0, 151, 1, 150, 205, 248, 8, 128, 11, 240, 25, 223, - 152, 249, 52, 48, 51, 177, 99, 120, 2, 43, 3, 217, 2, 59, 99, 112, 132, - 30, 0, 224, 4, 70, 32, 70, 4, 176, 189, 232, 240, 129, 240, 181, 6, - 157, 15, 70, 181, 248, 98, 64, 5, 158, 20, 244, 116, 127, 7, 208, 64, - 242, 55, 20, 52, 64, 28, 177, 189, 232, 240, 64, 11, 240, 45, 157, 56, - 70, 240, 189, 0, 0, 45, 233, 240, 79, 143, 176, 11, 70, 147, 70, 29, - 153, 0, 34, 5, 70, 26, 158, 221, 248, 108, 160, 9, 146, 10, 146, 5, - 147, 221, 248, 96, 144, 25, 159, 47, 240, 239, 223, 5, 155, 11, 240, - 1, 2, 208, 248, 216, 130, 4, 70, 0, 146, 25, 70, 40, 104, 50, 70, 83, - 70, 19, 240, 76, 223, 0, 40, 64, 240, 181, 129, 3, 47, 12, 217, 4, 34, - 9, 168, 73, 70, 242, 243, 154, 245, 7, 47, 5, 217, 10, 168, 9, 241, - 4, 1, 4, 34, 242, 243, 146, 245, 187, 241, 19, 15, 0, 242, 133, 129, - 223, 232, 27, 240, 20, 0, 24, 0, 131, 1, 131, 1, 69, 0, 34, 0, 134, - 0, 145, 0, 162, 0, 168, 0, 182, 0, 131, 1, 131, 1, 185, 0, 122, 1, 127, - 1, 131, 1, 131, 1, 247, 0, 11, 1, 40, 70, 10, 240, 87, 220, 141, 224, - 40, 70, 9, 153, 10, 240, 124, 220, 0, 40, 12, 191, 111, 240, 28, 7, - 0, 39, 124, 225, 164, 121, 0, 44, 64, 240, 96, 129, 216, 248, 44, 16, - 65, 177, 104, 104, 216, 248, 48, 32, 247, 243, 26, 244, 200, 248, 44, - 64, 200, 248, 48, 64, 0, 47, 0, 240, 106, 129, 104, 104, 57, 70, 247, - 243, 255, 243, 200, 248, 44, 0, 0, 40, 0, 240, 75, 129, 200, 248, 48, - 112, 73, 70, 58, 70, 242, 243, 72, 245, 55, 225, 163, 121, 0, 43, 0, - 240, 67, 129, 72, 70, 4, 241, 188, 1, 6, 34, 242, 243, 33, 245, 7, 70, - 192, 185, 162, 109, 180, 248, 98, 48, 141, 232, 20, 0, 212, 248, 212, - 34, 49, 70, 2, 146, 40, 70, 82, 70, 255, 247, 49, 255, 50, 26, 1, 70, - 160, 109, 180, 248, 98, 48, 82, 68, 141, 232, 17, 0, 40, 70, 255, 247, - 75, 255, 52, 225, 40, 70, 73, 70, 70, 240, 48, 217, 0, 40, 0, 240, 30, - 129, 208, 248, 232, 64, 0, 44, 0, 240, 25, 129, 208, 248, 236, 48, 154, - 69, 192, 242, 31, 129, 98, 120, 48, 70, 33, 70, 2, 50, 242, 243, 11, - 245, 99, 120, 0, 39, 246, 24, 247, 112, 24, 225, 180, 249, 94, 48, 43, - 185, 180, 249, 92, 48, 0, 51, 24, 191, 1, 35, 236, 224, 2, 35, 234, - 224, 9, 155, 2, 43, 4, 209, 0, 35, 164, 248, 92, 48, 1, 35, 5, 224, - 0, 51, 24, 191, 1, 35, 164, 248, 92, 48, 0, 35, 164, 248, 94, 48, 218, - 224, 213, 248, 52, 7, 250, 247, 46, 248, 48, 96, 212, 224, 213, 248, - 52, 7, 9, 156, 250, 247, 45, 248, 132, 66, 0, 243, 226, 128, 213, 248, - 52, 7, 9, 153, 250, 247, 34, 248, 198, 224, 181, 248, 190, 56, 194, - 224, 43, 104, 147, 248, 160, 48, 0, 43, 56, 208, 114, 73, 6, 34, 7, - 168, 242, 243, 201, 244, 49, 70, 4, 34, 12, 168, 242, 243, 196, 244, - 49, 29, 4, 34, 13, 168, 242, 243, 191, 244, 7, 168, 6, 241, 8, 1, 6, - 34, 242, 243, 185, 244, 13, 155, 83, 185, 213, 248, 104, 33, 145, 121, - 129, 185, 82, 105, 1, 42, 13, 208, 42, 104, 146, 248, 63, 32, 74, 185, - 7, 170, 0, 146, 16, 54, 40, 70, 33, 70, 12, 154, 1, 150, 23, 240, 81, - 222, 113, 224, 43, 104, 27, 126, 0, 43, 0, 240, 166, 128, 40, 70, 33, - 70, 7, 170, 6, 241, 16, 3, 23, 240, 48, 222, 100, 224, 3, 47, 64, 242, - 160, 128, 9, 153, 0, 41, 4, 219, 40, 70, 11, 170, 47, 240, 13, 222, - 4, 70, 12, 177, 35, 121, 118, 224, 11, 155, 30, 51, 64, 240, 143, 128, - 52, 96, 140, 224, 186, 241, 7, 15, 64, 243, 139, 128, 10, 158, 3, 46, - 5, 208, 166, 241, 2, 1, 78, 66, 70, 235, 1, 6, 0, 224, 0, 38, 9, 153, - 0, 41, 33, 219, 40, 70, 11, 170, 47, 240, 238, 221, 4, 70, 216, 185, - 11, 155, 30, 51, 26, 209, 10, 155, 0, 43, 23, 221, 34, 70, 35, 70, 134, - 240, 1, 6, 40, 70, 9, 153, 0, 150, 47, 240, 119, 218, 4, 70, 112, 177, - 40, 70, 33, 70, 47, 240, 91, 223, 7, 70, 80, 177, 40, 70, 33, 70, 47, - 240, 175, 222, 5, 224, 0, 39, 3, 224, 7, 70, 1, 224, 111, 240, 26, 7, - 10, 155, 3, 43, 87, 208, 0, 47, 85, 209, 0, 43, 39, 221, 2, 43, 2, 208, - 34, 121, 0, 42, 78, 209, 42, 104, 18, 111, 146, 7, 72, 209, 162, 121, - 146, 177, 2, 43, 5, 208, 40, 70, 33, 70, 47, 240, 104, 221, 7, 70, 64, - 224, 99, 121, 27, 177, 40, 70, 33, 70, 47, 240, 172, 219, 40, 70, 33, - 70, 47, 240, 132, 222, 53, 224, 99, 126, 40, 70, 0, 146, 1, 146, 33, - 70, 4, 241, 26, 2, 42, 240, 22, 217, 43, 224, 99, 121, 75, 179, 40, - 70, 33, 70, 47, 240, 151, 219, 36, 224, 149, 248, 195, 52, 51, 96, 0, - 39, 31, 224, 9, 155, 133, 248, 195, 52, 249, 231, 111, 240, 22, 7, 24, - 224, 111, 240, 6, 7, 21, 224, 111, 240, 26, 7, 18, 224, 111, 240, 5, - 7, 15, 224, 111, 240, 29, 7, 12, 224, 111, 240, 28, 7, 9, 224, 111, - 240, 3, 7, 6, 224, 39, 70, 4, 224, 111, 240, 13, 7, 1, 224, 111, 240, - 8, 7, 56, 70, 15, 176, 189, 232, 240, 143, 0, 191, 44, 158, 133, 0, - 112, 181, 5, 70, 14, 70, 28, 240, 113, 221, 4, 70, 192, 177, 49, 70, - 40, 70, 64, 242, 108, 82, 28, 240, 123, 222, 6, 70, 32, 185, 40, 70, - 33, 70, 28, 240, 215, 221, 10, 224, 33, 70, 64, 242, 101, 82, 242, 243, - 205, 243, 40, 70, 33, 70, 64, 242, 101, 82, 247, 243, 131, 242, 52, - 70, 32, 70, 112, 189, 48, 181, 5, 76, 133, 104, 165, 66, 3, 208, 189, - 232, 48, 64, 242, 243, 33, 183, 0, 32, 48, 189, 0, 191, 8, 0, 0, 32, - 139, 121, 16, 181, 4, 76, 11, 177, 1, 35, 35, 112, 47, 240, 178, 219, - 0, 35, 35, 112, 16, 189, 0, 191, 228, 12, 2, 0, 5, 75, 2, 105, 25, 120, - 41, 177, 210, 248, 208, 32, 18, 177, 0, 34, 26, 112, 112, 71, 26, 240, - 48, 157, 228, 12, 2, 0, 56, 181, 5, 70, 243, 247, 27, 250, 1, 40, 1, - 70, 7, 221, 4, 76, 1, 35, 40, 70, 35, 112, 250, 243, 171, 245, 0, 35, - 35, 112, 56, 189, 220, 12, 2, 0, 16, 181, 7, 76, 35, 120, 1, 43, 9, - 208, 6, 75, 27, 120, 1, 43, 5, 208, 1, 35, 35, 112, 250, 243, 11, 247, - 0, 35, 35, 112, 16, 189, 240, 12, 2, 0, 220, 12, 2, 0, 16, 181, 4, 70, - 249, 243, 50, 247, 0, 35, 132, 248, 23, 50, 132, 248, 24, 50, 16, 189, - 16, 181, 144, 248, 22, 50, 4, 70, 91, 177, 8, 75, 27, 104, 67, 177, - 208, 248, 128, 17, 208, 248, 132, 33, 2, 35, 192, 104, 74, 64, 251, - 243, 139, 243, 32, 70, 189, 232, 16, 64, 249, 243, 198, 181, 144, 8, - 2, 0, 15, 180, 48, 181, 17, 74, 173, 245, 3, 125, 150, 69, 21, 208, - 16, 74, 150, 69, 18, 208, 135, 171, 104, 70, 64, 242, 1, 33, 134, 154, - 129, 147, 242, 243, 218, 244, 0, 37, 4, 70, 4, 224, 29, 248, 5, 0, 247, - 243, 29, 241, 1, 53, 165, 66, 248, 219, 0, 224, 0, 36, 32, 70, 13, 245, - 3, 125, 189, 232, 48, 64, 4, 176, 112, 71, 0, 191, 219, 98, 130, 0, - 251, 84, 130, 0, 45, 233, 240, 71, 140, 176, 20, 159, 14, 70, 152, 70, - 57, 70, 0, 35, 4, 70, 21, 70, 8, 147, 47, 240, 89, 221, 129, 70, 208, - 248, 220, 162, 101, 177, 184, 241, 3, 15, 9, 217, 41, 70, 4, 34, 8, - 168, 242, 243, 15, 243, 8, 168, 41, 70, 4, 34, 242, 243, 10, 243, 95, - 46, 32, 220, 94, 46, 128, 242, 197, 129, 53, 46, 121, 208, 14, 220, - 22, 46, 0, 240, 125, 129, 3, 220, 21, 46, 64, 240, 53, 130, 107, 225, - 28, 46, 0, 240, 138, 129, 47, 46, 64, 240, 46, 130, 51, 225, 55, 46, - 0, 240, 205, 128, 192, 242, 172, 128, 56, 46, 0, 240, 239, 128, 57, - 46, 64, 240, 34, 130, 9, 225, 215, 46, 0, 240, 191, 129, 13, 220, 165, - 46, 0, 240, 70, 129, 3, 220, 159, 46, 64, 240, 22, 130, 115, 225, 196, - 46, 22, 208, 197, 46, 64, 240, 16, 130, 48, 224, 182, 245, 159, 127, - 0, 240, 197, 129, 3, 220, 216, 46, 64, 240, 7, 130, 174, 225, 64, 242, - 63, 19, 158, 66, 0, 240, 202, 129, 182, 245, 160, 127, 64, 240, 253, - 129, 207, 225, 163, 72, 255, 247, 109, 255, 1, 35, 184, 241, 7, 15, - 200, 191, 105, 104, 32, 70, 216, 191, 0, 33, 141, 248, 47, 48, 9, 145, - 19, 240, 70, 220, 7, 70, 0, 40, 64, 240, 240, 129, 8, 153, 202, 7, 0, - 241, 213, 129, 32, 70, 137, 178, 22, 240, 154, 219, 40, 96, 229, 225, - 1, 35, 184, 241, 7, 15, 200, 191, 105, 104, 32, 70, 216, 191, 0, 33, - 141, 248, 47, 48, 9, 145, 19, 240, 43, 220, 7, 70, 0, 40, 64, 240, 213, - 129, 8, 154, 211, 7, 0, 241, 186, 129, 145, 178, 32, 70, 18, 12, 28, - 240, 184, 219, 202, 225, 35, 104, 27, 126, 0, 43, 0, 240, 193, 129, - 184, 241, 5, 15, 64, 242, 192, 129, 184, 241, 13, 15, 11, 217, 32, 70, - 5, 241, 8, 1, 168, 241, 8, 2, 3, 240, 196, 218, 7, 70, 0, 40, 64, 240, - 180, 129, 9, 224, 41, 70, 4, 168, 6, 34, 242, 243, 108, 242, 0, 35, - 6, 147, 4, 173, 79, 240, 14, 8, 153, 248, 6, 96, 182, 185, 218, 248, - 144, 16, 49, 177, 96, 104, 154, 248, 148, 32, 247, 243, 24, 241, 202, - 248, 144, 96, 138, 248, 148, 128, 96, 104, 65, 70, 247, 243, 0, 241, - 202, 248, 144, 0, 24, 177, 41, 70, 66, 70, 242, 243, 77, 242, 72, 70, - 41, 70, 43, 240, 243, 218, 218, 248, 144, 112, 0, 47, 12, 191, 7, 70, - 0, 39, 131, 225, 0, 35, 0, 147, 32, 70, 41, 70, 66, 70, 9, 171, 243, - 247, 177, 253, 7, 70, 0, 40, 64, 240, 120, 129, 9, 154, 3, 42, 0, 240, - 99, 129, 35, 107, 25, 104, 138, 66, 7, 208, 91, 104, 211, 241, 1, 3, - 56, 191, 0, 35, 14, 51, 84, 248, 35, 48, 211, 248, 240, 48, 105, 225, - 0, 35, 0, 147, 32, 70, 41, 70, 66, 70, 9, 171, 243, 247, 146, 253, 7, - 70, 0, 40, 64, 240, 89, 129, 8, 154, 2, 241, 100, 3, 103, 43, 0, 242, - 63, 129, 9, 155, 3, 43, 4, 208, 33, 107, 9, 104, 139, 66, 64, 240, 75, - 129, 0, 42, 4, 219, 32, 70, 33, 107, 43, 240, 241, 219, 2, 70, 35, 107, - 195, 248, 252, 32, 195, 248, 240, 32, 61, 225, 0, 35, 0, 147, 32, 70, - 41, 70, 66, 70, 9, 171, 243, 247, 107, 253, 7, 70, 0, 40, 64, 240, 50, - 129, 9, 154, 3, 42, 0, 240, 29, 129, 35, 107, 25, 104, 138, 66, 7, 208, - 91, 104, 211, 241, 1, 3, 56, 191, 0, 35, 14, 51, 84, 248, 35, 48, 211, - 248, 244, 48, 35, 225, 0, 35, 0, 147, 32, 70, 41, 70, 66, 70, 9, 171, - 243, 247, 76, 253, 7, 70, 0, 40, 64, 240, 19, 129, 8, 155, 100, 43, - 0, 242, 254, 128, 9, 154, 3, 42, 4, 208, 33, 107, 9, 104, 138, 66, 64, - 240, 7, 129, 34, 107, 194, 248, 0, 49, 194, 248, 244, 48, 0, 225, 35, - 104, 8, 157, 147, 248, 63, 48, 0, 43, 64, 240, 236, 128, 212, 248, 104, - 1, 131, 121, 19, 177, 4, 33, 68, 240, 205, 220, 0, 53, 148, 248, 114, - 50, 24, 191, 1, 37, 132, 248, 80, 87, 132, 248, 89, 85, 0, 43, 64, 240, - 177, 128, 4, 245, 170, 97, 212, 248, 92, 1, 13, 177, 14, 49, 0, 224, - 10, 49, 54, 240, 145, 218, 154, 224, 1, 35, 0, 34, 2, 147, 32, 70, 14, - 73, 19, 70, 141, 232, 32, 1, 3, 151, 19, 240, 163, 219, 142, 224, 185, - 249, 94, 48, 43, 185, 185, 249, 92, 48, 0, 51, 24, 191, 1, 35, 0, 224, - 2, 35, 43, 96, 141, 224, 8, 155, 2, 43, 8, 209, 0, 35, 169, 248, 92, - 48, 1, 35, 9, 224, 21, 222, 1, 0, 28, 115, 134, 0, 0, 51, 24, 191, 1, - 35, 169, 248, 92, 48, 0, 35, 169, 248, 94, 48, 120, 224, 35, 104, 1, - 33, 24, 105, 251, 243, 2, 243, 114, 224, 168, 241, 4, 8, 6, 35, 184, - 251, 243, 243, 43, 96, 212, 248, 0, 5, 0, 35, 10, 169, 8, 147, 69, 240, - 8, 218, 17, 224, 59, 126, 152, 7, 14, 213, 8, 152, 42, 104, 67, 28, - 154, 66, 8, 147, 192, 240, 143, 128, 6, 34, 2, 251, 0, 80, 7, 241, 26, - 1, 4, 48, 242, 243, 71, 241, 10, 168, 69, 240, 250, 217, 7, 70, 0, 40, - 231, 209, 133, 224, 184, 241, 7, 15, 200, 191, 105, 104, 32, 70, 216, - 191, 0, 33, 19, 240, 203, 218, 7, 70, 0, 40, 117, 209, 62, 73, 63, 72, - 255, 247, 222, 253, 35, 107, 13, 241, 47, 2, 0, 146, 24, 105, 49, 70, - 66, 70, 43, 70, 2, 240, 55, 252, 37, 224, 212, 248, 104, 49, 159, 121, - 0, 47, 86, 209, 148, 248, 22, 55, 99, 224, 212, 248, 104, 49, 155, 121, - 0, 43, 78, 209, 34, 107, 32, 70, 18, 104, 41, 70, 0, 146, 1, 34, 1, - 146, 2, 147, 3, 147, 253, 247, 233, 254, 12, 224, 153, 248, 6, 48, 0, - 43, 65, 209, 153, 248, 17, 48, 0, 43, 61, 208, 217, 248, 12, 0, 41, - 70, 11, 240, 123, 252, 7, 70, 62, 224, 35, 104, 27, 126, 0, 43, 53, - 208, 32, 70, 41, 70, 66, 70, 18, 240, 194, 220, 0, 39, 51, 224, 184, - 241, 67, 15, 46, 217, 30, 76, 41, 70, 3, 34, 32, 70, 242, 243, 233, - 240, 235, 120, 41, 29, 227, 112, 20, 34, 26, 72, 242, 243, 226, 240, - 5, 241, 24, 1, 29, 34, 24, 72, 242, 243, 220, 240, 5, 241, 53, 1, 14, - 34, 22, 72, 242, 243, 214, 240, 224, 231, 111, 240, 20, 7, 19, 224, - 111, 240, 28, 7, 16, 224, 111, 240, 2, 7, 13, 224, 111, 240, 27, 7, - 10, 224, 111, 240, 15, 7, 7, 224, 111, 240, 22, 7, 4, 224, 111, 240, - 3, 7, 1, 224, 111, 240, 13, 7, 56, 70, 12, 176, 189, 232, 240, 135, - 8, 155, 43, 96, 248, 231, 0, 191, 161, 222, 1, 0, 33, 222, 1, 0, 88, - 1, 2, 0, 36, 200, 1, 0, 136, 195, 1, 0, 248, 12, 2, 0, 45, 233, 255, - 71, 12, 156, 5, 70, 210, 248, 212, 98, 23, 70, 152, 70, 212, 248, 0, - 160, 0, 148, 12, 240, 217, 216, 42, 104, 146, 248, 70, 48, 152, 7, 57, - 208, 215, 248, 204, 48, 217, 4, 53, 212, 150, 249, 52, 16, 0, 41, 49, - 209, 82, 107, 122, 179, 19, 240, 2, 9, 44, 209, 2, 168, 22, 73, 3, 34, - 39, 104, 242, 243, 133, 240, 2, 35, 141, 248, 11, 48, 1, 35, 141, 248, - 13, 48, 149, 248, 250, 49, 71, 68, 141, 248, 12, 144, 51, 177, 150, - 249, 106, 48, 0, 43, 3, 218, 149, 248, 10, 151, 0, 224, 153, 70, 208, - 68, 184, 69, 2, 171, 40, 191, 199, 235, 8, 1, 0, 147, 56, 191, 0, 33, - 56, 70, 7, 35, 221, 34, 141, 248, 14, 144, 28, 240, 107, 217, 35, 104, - 9, 51, 35, 96, 189, 232, 255, 135, 179, 184, 1, 0, 45, 233, 240, 65, - 144, 70, 208, 248, 216, 34, 6, 70, 82, 104, 13, 70, 1, 42, 3, 104, 208, - 248, 220, 66, 6, 208, 161, 241, 4, 14, 222, 241, 0, 7, 71, 235, 14, - 7, 0, 224, 0, 39, 26, 104, 97, 106, 210, 105, 18, 109, 145, 66, 56, - 191, 98, 98, 77, 185, 212, 248, 144, 16, 49, 177, 88, 104, 148, 248, - 148, 32, 246, 243, 241, 246, 196, 248, 144, 80, 48, 70, 41, 70, 66, - 70, 38, 240, 90, 220, 15, 177, 0, 35, 99, 98, 189, 232, 240, 129, 112, - 181, 6, 70, 13, 70, 31, 240, 114, 220, 41, 70, 4, 70, 48, 70, 249, 247, - 105, 249, 32, 70, 112, 189, 0, 0, 16, 181, 136, 176, 10, 156, 0, 148, - 11, 156, 1, 148, 12, 156, 2, 148, 13, 156, 3, 148, 14, 156, 4, 148, - 15, 156, 5, 148, 16, 156, 6, 148, 17, 156, 7, 148, 244, 243, 188, 244, - 4, 75, 4, 33, 4, 70, 211, 248, 140, 48, 10, 70, 152, 71, 32, 70, 8, - 176, 16, 189, 224, 166, 133, 0, 56, 181, 144, 248, 161, 49, 4, 70, 99, - 185, 3, 104, 27, 111, 75, 177, 208, 248, 28, 88, 246, 243, 54, 243, - 212, 248, 32, 56, 235, 26, 27, 24, 196, 248, 28, 56, 32, 70, 189, 232, - 56, 64, 21, 240, 125, 158, 45, 233, 240, 65, 4, 70, 27, 240, 102, 218, - 35, 107, 27, 104, 2, 43, 71, 209, 32, 105, 44, 240, 239, 217, 0, 40, - 58, 208, 35, 104, 147, 248, 66, 32, 0, 42, 61, 208, 212, 248, 104, 33, - 145, 121, 0, 41, 56, 209, 147, 248, 63, 48, 0, 43, 52, 208, 212, 248, - 108, 50, 180, 248, 40, 6, 211, 248, 212, 34, 82, 142, 144, 66, 43, 209, - 212, 248, 248, 39, 66, 242, 14, 112, 21, 136, 1, 61, 173, 178, 133, - 66, 26, 216, 210, 120, 32, 70, 42, 177, 211, 248, 224, 50, 27, 105, - 91, 66, 147, 66, 0, 220, 1, 33, 31, 240, 85, 216, 212, 248, 248, 55, - 27, 121, 147, 177, 212, 248, 108, 34, 210, 248, 224, 34, 18, 105, 82, - 66, 154, 66, 10, 221, 32, 70, 0, 33, 5, 224, 32, 70, 1, 33, 31, 240, - 66, 216, 32, 70, 1, 33, 31, 240, 36, 216, 0, 38, 163, 25, 211, 248, - 76, 82, 173, 177, 213, 248, 140, 112, 151, 185, 171, 121, 131, 177, - 171, 109, 155, 7, 13, 213, 149, 248, 132, 48, 83, 177, 246, 243, 200, - 242, 213, 248, 144, 16, 41, 240, 126, 217, 24, 177, 197, 248, 136, 112, - 133, 248, 132, 112, 4, 54, 32, 46, 226, 209, 35, 107, 27, 104, 2, 43, - 109, 209, 32, 105, 44, 240, 133, 217, 0, 40, 104, 208, 212, 248, 104, - 49, 155, 121, 0, 43, 99, 209, 35, 104, 147, 248, 63, 48, 0, 43, 94, - 208, 212, 248, 108, 50, 180, 248, 40, 38, 211, 248, 212, 50, 91, 142, - 154, 66, 85, 209, 32, 70, 146, 33, 22, 240, 74, 216, 64, 0, 133, 178, - 0, 45, 77, 208, 5, 241, 24, 7, 57, 70, 32, 70, 22, 240, 64, 216, 5, - 241, 26, 1, 6, 70, 32, 70, 22, 240, 58, 216, 57, 70, 128, 70, 32, 70, - 22, 240, 53, 216, 134, 66, 236, 209, 212, 248, 248, 55, 70, 234, 8, - 70, 154, 104, 158, 96, 150, 66, 140, 191, 194, 235, 6, 2, 0, 34, 58, - 177, 90, 121, 1, 50, 90, 113, 212, 248, 248, 55, 0, 34, 154, 113, 5, - 224, 153, 121, 1, 49, 153, 113, 212, 248, 248, 55, 90, 113, 212, 248, - 248, 87, 107, 121, 5, 43, 14, 217, 235, 104, 203, 185, 35, 107, 24, - 105, 2, 240, 92, 253, 35, 107, 232, 96, 24, 105, 79, 244, 225, 81, 189, - 232, 240, 65, 2, 240, 86, 189, 171, 121, 1, 43, 9, 217, 233, 104, 57, - 177, 35, 107, 24, 105, 2, 240, 77, 253, 212, 248, 248, 55, 0, 34, 218, - 96, 189, 232, 240, 129, 45, 233, 240, 79, 135, 176, 154, 70, 4, 70, - 15, 70, 22, 70, 221, 248, 64, 128, 17, 157, 157, 248, 72, 144, 249, - 247, 149, 248, 212, 248, 176, 35, 131, 70, 5, 146, 246, 243, 204, 241, - 0, 245, 126, 115, 7, 51, 179, 245, 160, 95, 2, 70, 2, 210, 36, 72, 36, - 73, 23, 224, 88, 70, 11, 240, 183, 222, 212, 248, 192, 51, 152, 66, - 21, 211, 3, 35, 0, 147, 0, 35, 1, 147, 2, 147, 3, 147, 88, 70, 23, 33, - 6, 241, 10, 2, 1, 35, 19, 240, 108, 220, 26, 72, 25, 73, 212, 248, 192, - 35, 7, 176, 189, 232, 240, 79, 255, 247, 117, 187, 5, 154, 146, 248, - 70, 48, 152, 7, 21, 208, 186, 109, 64, 242, 55, 19, 19, 64, 131, 177, - 155, 248, 105, 55, 217, 7, 12, 213, 107, 104, 218, 3, 9, 213, 43, 108, - 1, 43, 6, 209, 0, 34, 88, 70, 41, 70, 19, 70, 0, 146, 18, 240, 230, - 220, 32, 70, 57, 70, 50, 70, 83, 70, 205, 248, 64, 128, 17, 149, 205, - 248, 72, 144, 7, 176, 189, 232, 240, 79, 35, 240, 34, 154, 71, 222, - 1, 0, 240, 221, 1, 0, 101, 222, 1, 0, 12, 42, 112, 181, 4, 70, 13, 70, - 22, 70, 84, 216, 50, 75, 147, 64, 81, 213, 208, 248, 180, 54, 75, 177, - 211, 248, 216, 50, 51, 177, 91, 104, 1, 43, 72, 208, 3, 43, 70, 208, - 2, 43, 68, 208, 32, 70, 22, 240, 185, 221, 0, 40, 63, 209, 212, 248, - 104, 49, 91, 105, 1, 43, 58, 208, 69, 177, 171, 121, 51, 177, 171, 109, - 154, 7, 3, 213, 213, 248, 136, 48, 0, 43, 55, 209, 212, 248, 24, 8, - 255, 243, 98, 241, 40, 177, 212, 248, 104, 1, 9, 33, 68, 240, 128, 217, - 23, 224, 212, 248, 104, 1, 8, 46, 131, 121, 1, 208, 12, 46, 1, 209, - 123, 177, 40, 224, 0, 43, 36, 208, 212, 248, 40, 53, 2, 43, 3, 208, - 148, 248, 244, 55, 219, 7, 30, 213, 9, 33, 68, 240, 105, 217, 0, 32, - 112, 189, 8, 46, 26, 209, 32, 70, 41, 70, 2, 34, 0, 35, 38, 240, 171, - 217, 0, 40, 20, 191, 79, 240, 255, 48, 0, 32, 112, 189, 32, 70, 41, - 70, 50, 70, 189, 232, 112, 64, 42, 240, 82, 157, 111, 240, 25, 0, 112, - 189, 24, 70, 112, 189, 111, 240, 24, 0, 112, 189, 0, 32, 112, 189, 0, - 0, 168, 18, 56, 181, 1, 34, 12, 70, 209, 248, 76, 21, 5, 70, 47, 240, - 14, 221, 40, 70, 33, 70, 189, 232, 56, 64, 46, 240, 220, 152, 16, 181, - 12, 70, 46, 240, 156, 217, 24, 185, 148, 248, 245, 50, 132, 248, 244, - 50, 16, 189, 3, 104, 26, 104, 83, 107, 35, 177, 146, 248, 68, 48, 11, - 177, 49, 240, 115, 159, 24, 70, 112, 71, 3, 106, 48, 181, 0, 43, 43, - 208, 3, 104, 12, 105, 27, 104, 141, 138, 147, 248, 149, 48, 59, 177, - 203, 138, 3, 240, 128, 3, 0, 43, 12, 191, 30, 35, 12, 35, 0, 224, 12, - 35, 3, 241, 11, 2, 149, 66, 23, 211, 226, 24, 227, 92, 84, 120, 27, - 2, 27, 25, 155, 178, 179, 245, 0, 111, 14, 209, 147, 120, 27, 9, 4, - 43, 10, 209, 211, 122, 1, 43, 7, 209, 67, 106, 1, 51, 67, 98, 195, 104, - 1, 51, 195, 96, 0, 32, 48, 189, 189, 232, 48, 64, 64, 240, 191, 156, - 56, 177, 3, 104, 43, 177, 33, 185, 147, 248, 11, 39, 10, 177, 131, 248, - 11, 23, 24, 240, 186, 158, 176, 248, 84, 56, 11, 177, 26, 240, 83, 152, - 112, 71, 248, 247, 20, 191, 254, 247, 94, 189, 56, 181, 5, 70, 208, - 248, 180, 0, 88, 177, 3, 120, 75, 177, 242, 247, 67, 250, 4, 70, 48, - 185, 213, 248, 180, 0, 1, 33, 242, 243, 0, 244, 0, 224, 1, 36, 40, 70, - 244, 243, 193, 246, 52, 185, 213, 248, 180, 0, 33, 70, 189, 232, 56, - 64, 242, 243, 243, 179, 56, 189, 45, 233, 240, 79, 135, 176, 3, 147, - 17, 155, 21, 159, 4, 147, 20, 155, 138, 70, 22, 70, 221, 248, 64, 176, - 18, 157, 221, 248, 76, 128, 5, 147, 39, 177, 185, 104, 17, 177, 1, 32, - 242, 247, 62, 255, 4, 70, 0, 40, 53, 208, 3, 104, 6, 240, 1, 2, 0, 146, - 24, 104, 81, 70, 42, 70, 67, 70, 18, 240, 37, 223, 129, 70, 0, 40, 42, - 209, 17, 46, 2, 208, 19, 46, 17, 209, 9, 224, 40, 70, 242, 243, 98, - 242, 0, 40, 32, 209, 4, 245, 184, 112, 41, 70, 6, 34, 3, 224, 4, 245, - 182, 112, 41, 70, 4, 34, 241, 243, 101, 245, 20, 224, 4, 155, 32, 70, - 17, 147, 5, 155, 81, 70, 20, 147, 3, 155, 50, 70, 205, 248, 64, 176, - 18, 149, 205, 248, 76, 128, 21, 151, 7, 176, 189, 232, 240, 79, 252, - 243, 53, 183, 111, 240, 22, 9, 72, 70, 7, 176, 189, 232, 240, 143, 0, - 0, 56, 181, 208, 248, 104, 65, 12, 177, 165, 104, 0, 224, 37, 70, 4, - 76, 37, 96, 252, 243, 255, 247, 65, 28, 1, 209, 0, 35, 35, 96, 56, 189, - 212, 12, 2, 0, 3, 74, 19, 104, 19, 177, 0, 33, 17, 96, 24, 70, 112, - 71, 0, 191, 212, 12, 2, 0, 45, 233, 240, 65, 22, 70, 2, 104, 12, 70, - 18, 104, 31, 70, 146, 248, 149, 32, 5, 70, 9, 105, 163, 138, 18, 177, - 226, 138, 16, 6, 7, 213, 21, 43, 5, 221, 8, 72, 14, 49, 6, 34, 241, - 243, 251, 244, 56, 177, 40, 70, 33, 70, 50, 70, 59, 70, 189, 232, 240, - 65, 253, 243, 112, 178, 79, 240, 255, 48, 189, 232, 240, 129, 183, 184, - 1, 0, 112, 181, 4, 70, 29, 70, 255, 243, 49, 241, 6, 70, 64, 177, 99, - 104, 147, 248, 171, 48, 35, 177, 224, 111, 41, 70, 242, 247, 53, 252, - 176, 96, 48, 70, 112, 189, 56, 181, 67, 104, 4, 70, 147, 248, 171, 48, - 13, 70, 19, 177, 136, 104, 242, 247, 71, 252, 32, 70, 41, 70, 189, 232, - 56, 64, 255, 243, 240, 177, 45, 233, 243, 71, 7, 70, 14, 70, 146, 70, - 29, 70, 0, 43, 89, 208, 1, 41, 87, 209, 79, 244, 192, 115, 1, 147, 250, - 243, 149, 245, 79, 244, 64, 113, 128, 70, 246, 243, 126, 243, 4, 70, - 0, 40, 82, 208, 0, 33, 79, 244, 64, 114, 241, 243, 46, 245, 56, 70, - 49, 70, 34, 70, 1, 171, 241, 243, 190, 243, 30, 48, 55, 209, 32, 34, - 34, 113, 4, 34, 1, 155, 98, 113, 208, 34, 162, 113, 2, 34, 79, 234, - 67, 9, 226, 113, 74, 35, 98, 34, 35, 112, 34, 114, 11, 35, 169, 34, - 99, 112, 98, 114, 255, 35, 4, 235, 9, 2, 163, 112, 227, 112, 2, 248, - 2, 60, 2, 248, 1, 60, 5, 241, 12, 3, 153, 69, 14, 221, 42, 70, 81, 70, - 4, 241, 10, 0, 241, 243, 156, 244, 56, 70, 49, 70, 34, 70, 79, 234, - 105, 3, 16, 240, 143, 251, 5, 70, 1, 224, 111, 240, 14, 5, 64, 70, 33, - 70, 79, 244, 64, 114, 246, 243, 71, 243, 15, 224, 64, 70, 33, 70, 79, - 244, 64, 114, 246, 243, 64, 243, 43, 70, 56, 70, 49, 70, 82, 70, 240, - 243, 164, 244, 5, 70, 1, 224, 79, 240, 255, 53, 40, 70, 189, 232, 252, - 135, 45, 233, 255, 65, 128, 70, 30, 70, 159, 107, 21, 105, 70, 240, - 19, 216, 4, 70, 200, 185, 59, 122, 2, 43, 22, 209, 171, 121, 163, 177, - 182, 248, 104, 48, 139, 177, 170, 109, 64, 242, 55, 19, 19, 64, 99, - 177, 149, 248, 132, 48, 75, 185, 149, 249, 72, 32, 49, 111, 141, 232, - 129, 0, 2, 144, 17, 35, 64, 70, 69, 240, 207, 219, 32, 70, 4, 176, 189, - 232, 240, 129, 248, 181, 208, 248, 176, 67, 208, 248, 172, 115, 33, - 240, 38, 218, 148, 248, 47, 48, 6, 70, 251, 177, 0, 37, 123, 25, 211, - 248, 76, 66, 188, 177, 163, 121, 171, 177, 35, 121, 155, 177, 163, 109, - 155, 7, 16, 213, 148, 248, 132, 48, 107, 177, 245, 243, 121, 247, 212, - 248, 144, 16, 40, 240, 47, 222, 48, 177, 0, 35, 196, 248, 136, 48, 196, - 248, 140, 48, 132, 248, 132, 48, 4, 53, 32, 45, 224, 209, 48, 70, 248, - 189, 240, 181, 133, 176, 10, 159, 14, 70, 0, 151, 11, 159, 29, 70, 1, - 151, 12, 159, 4, 70, 2, 151, 13, 159, 3, 151, 40, 240, 5, 223, 179, - 121, 91, 177, 41, 70, 32, 70, 69, 240, 57, 217, 1, 70, 40, 177, 32, - 70, 5, 176, 189, 232, 240, 64, 69, 240, 41, 152, 5, 176, 240, 189, 0, - 0, 45, 233, 243, 65, 31, 70, 3, 104, 4, 70, 27, 126, 13, 70, 22, 70, - 0, 43, 74, 208, 144, 248, 117, 50, 0, 43, 70, 209, 209, 248, 0, 128, - 64, 70, 254, 247, 60, 252, 3, 105, 2, 70, 153, 121, 177, 177, 129, 126, - 200, 7, 19, 213, 211, 248, 204, 16, 73, 5, 15, 212, 180, 248, 38, 22, - 1, 244, 112, 65, 161, 245, 128, 80, 65, 66, 65, 235, 0, 1, 16, 49, 83, - 248, 33, 48, 19, 177, 147, 248, 223, 48, 51, 187, 81, 104, 0, 41, 35, - 219, 22, 75, 11, 64, 27, 177, 184, 248, 22, 48, 3, 240, 7, 3, 73, 6, - 26, 213, 18, 73, 32, 70, 203, 92, 2, 169, 65, 248, 4, 61, 59, 96, 10, - 240, 67, 217, 1, 48, 15, 208, 1, 155, 58, 104, 154, 66, 11, 208, 12, - 74, 59, 96, 210, 92, 184, 248, 22, 48, 2, 240, 7, 2, 35, 240, 7, 3, - 19, 67, 168, 248, 22, 48, 32, 70, 41, 70, 50, 70, 59, 70, 20, 240, 191, - 219, 189, 232, 252, 129, 0, 191, 64, 0, 1, 128, 196, 210, 133, 0, 20, - 255, 1, 0, 0, 32, 112, 71, 112, 71, 0, 32, 112, 71, 112, 71, 0, 32, - 112, 71, 112, 71, 112, 71, 112, 71, 112, 71, 0, 32, 112, 71, 0, 32, - 112, 71, 0, 32, 112, 71, 112, 71, 0, 32, 112, 71, 112, 71, 112, 71, - 0, 32, 112, 71, 0, 32, 112, 71, 112, 71, 112, 71, 112, 71, 112, 71, - 0, 32, 112, 71, 0, 0, 194, 105, 56, 181, 18, 5, 4, 70, 13, 70, 3, 105, - 20, 213, 2, 104, 210, 248, 140, 16, 138, 107, 1, 50, 138, 99, 79, 244, - 122, 113, 178, 251, 241, 240, 1, 251, 16, 33, 25, 185, 6, 72, 217, 107, - 255, 247, 18, 248, 227, 105, 35, 244, 0, 99, 227, 97, 32, 70, 41, 70, - 189, 232, 56, 64, 45, 240, 128, 154, 28, 192, 1, 0, 248, 181, 4, 70, - 15, 70, 22, 70, 29, 70, 248, 247, 247, 248, 32, 70, 57, 70, 50, 70, - 43, 70, 29, 240, 131, 217, 32, 70, 189, 232, 248, 64, 247, 247, 248, - 191, 8, 181, 17, 240, 125, 223, 56, 177, 67, 106, 25, 3, 4, 212, 2, - 104, 18, 177, 67, 244, 0, 35, 67, 98, 8, 189, 112, 181, 3, 104, 4, 70, - 147, 248, 66, 48, 14, 70, 21, 70, 35, 177, 208, 248, 64, 1, 1, 34, 248, - 247, 16, 251, 32, 70, 49, 70, 42, 70, 189, 232, 112, 64, 37, 240, 143, - 154, 115, 181, 2, 245, 69, 116, 0, 235, 68, 4, 64, 246, 42, 22, 165, - 136, 166, 128, 6, 158, 0, 150, 3, 240, 228, 222, 165, 128, 124, 189, - 112, 181, 12, 70, 22, 70, 77, 108, 24, 240, 66, 219, 32, 185, 179, 2, - 2, 213, 99, 108, 101, 100, 163, 100, 112, 189, 112, 181, 5, 104, 4, - 70, 43, 104, 14, 70, 147, 248, 48, 48, 75, 177, 43, 107, 24, 105, 0, - 240, 25, 254, 115, 142, 152, 66, 28, 191, 213, 248, 64, 37, 83, 134, - 32, 70, 49, 70, 189, 232, 112, 64, 41, 240, 51, 152, 0, 0, 7, 75, 27, - 120, 59, 177, 7, 75, 27, 104, 152, 66, 3, 210, 6, 75, 83, 248, 32, 48, - 11, 185, 53, 240, 229, 152, 24, 70, 112, 71, 0, 191, 124, 2, 2, 0, 96, - 1, 2, 0, 100, 1, 2, 0, 0, 32, 112, 71, 7, 75, 27, 120, 59, 177, 7, 75, - 27, 104, 152, 66, 3, 210, 6, 75, 83, 248, 32, 48, 11, 185, 52, 240, - 213, 156, 24, 70, 112, 71, 0, 191, 124, 2, 2, 0, 120, 2, 2, 0, 84, 0, - 2, 0, 44, 75, 45, 233, 240, 65, 5, 70, 12, 70, 211, 248, 0, 128, 0, - 38, 11, 224, 41, 79, 40, 70, 7, 235, 198, 7, 57, 70, 241, 243, 132, - 243, 16, 185, 251, 120, 156, 66, 67, 208, 1, 54, 70, 69, 241, 209, 35, - 75, 0, 38, 211, 248, 0, 128, 15, 224, 33, 79, 40, 70, 7, 235, 198, 7, - 57, 70, 241, 243, 113, 243, 48, 185, 251, 120, 156, 66, 3, 209, 29, - 75, 1, 34, 26, 112, 16, 224, 1, 54, 70, 69, 237, 209, 12, 187, 26, 75, - 38, 70, 211, 248, 0, 128, 11, 224, 24, 79, 40, 70, 7, 235, 198, 7, 57, - 70, 241, 243, 89, 243, 16, 185, 56, 29, 189, 232, 240, 129, 1, 54, 70, - 69, 241, 209, 18, 75, 19, 79, 211, 248, 0, 128, 0, 38, 6, 224, 57, 70, - 40, 70, 241, 243, 72, 243, 4, 55, 64, 177, 1, 54, 70, 69, 246, 209, - 40, 70, 33, 70, 189, 232, 240, 65, 52, 240, 157, 155, 10, 72, 189, 232, - 240, 129, 216, 12, 2, 0, 8, 222, 1, 0, 116, 2, 2, 0, 88, 1, 2, 0, 124, - 2, 2, 0, 232, 12, 2, 0, 180, 222, 1, 0, 236, 12, 2, 0, 161, 222, 1, - 0, 202, 2, 134, 0, 16, 181, 3, 76, 33, 96, 52, 240, 171, 223, 0, 35, - 35, 96, 16, 189, 244, 12, 2, 0, 56, 181, 13, 70, 0, 36, 8, 224, 8, 73, - 40, 70, 1, 235, 196, 1, 4, 34, 241, 243, 35, 242, 48, 177, 1, 52, 5, - 75, 27, 104, 156, 66, 242, 211, 0, 32, 56, 189, 1, 32, 56, 189, 0, 191, - 180, 222, 1, 0, 232, 12, 2, 0, 45, 233, 240, 71, 35, 75, 142, 176, 29, - 104, 35, 75, 7, 70, 136, 70, 211, 248, 0, 144, 0, 45, 57, 208, 3, 107, - 169, 104, 24, 105, 106, 70, 0, 36, 0, 240, 107, 253, 38, 70, 44, 224, - 28, 75, 3, 235, 196, 10, 171, 104, 1, 43, 4, 209, 154, 248, 5, 0, 255, - 247, 55, 255, 3, 224, 154, 248, 4, 0, 255, 247, 28, 255, 7, 169, 53, - 240, 65, 217, 0, 35, 7, 170, 153, 92, 29, 248, 3, 32, 17, 66, 15, 208, - 56, 70, 81, 70, 52, 240, 24, 219, 64, 177, 184, 241, 0, 15, 5, 208, - 8, 235, 134, 0, 81, 70, 4, 34, 241, 243, 16, 243, 1, 54, 2, 224, 1, - 51, 28, 43, 230, 209, 1, 52, 76, 69, 208, 209, 48, 70, 0, 224, 40, 70, - 14, 176, 189, 232, 240, 135, 244, 12, 2, 0, 232, 12, 2, 0, 180, 222, - 1, 0, 248, 181, 7, 70, 14, 70, 0, 36, 14, 224, 10, 75, 12, 37, 5, 251, - 4, 53, 56, 70, 41, 70, 241, 243, 165, 242, 32, 185, 43, 121, 158, 66, - 1, 209, 168, 104, 248, 189, 1, 52, 3, 75, 27, 104, 156, 66, 236, 211, - 0, 32, 248, 189, 240, 221, 1, 0, 224, 12, 2, 0, 1, 41, 3, 70, 16, 208, - 208, 248, 188, 32, 8, 42, 208, 248, 176, 32, 8, 191, 65, 244, 0, 113, - 162, 248, 216, 19, 178, 248, 218, 3, 0, 34, 128, 178, 163, 248, 32, - 38, 112, 71, 79, 246, 255, 112, 112, 71, 208, 248, 176, 48, 163, 248, - 216, 19, 163, 248, 218, 35, 112, 71, 208, 248, 176, 48, 0, 33, 48, 181, - 163, 248, 216, 19, 1, 36, 179, 248, 218, 35, 2, 37, 163, 248, 216, 67, - 179, 248, 218, 67, 163, 248, 216, 83, 179, 248, 218, 51, 164, 178, 160, - 248, 32, 22, 155, 178, 194, 243, 3, 17, 65, 234, 2, 114, 68, 234, 3, - 32, 66, 234, 0, 48, 48, 189, 208, 248, 176, 48, 0, 34, 163, 248, 252, - 19, 160, 248, 32, 38, 179, 248, 254, 3, 128, 178, 112, 71, 208, 248, - 176, 48, 65, 234, 2, 66, 195, 248, 252, 35, 112, 71, 0, 35, 128, 248, - 227, 48, 0, 245, 128, 82, 255, 35, 0, 245, 138, 80, 130, 248, 58, 48, - 128, 248, 48, 48, 112, 71, 255, 247, 192, 191, 0, 32, 112, 71, 176, - 248, 218, 48, 3, 244, 112, 67, 179, 245, 128, 95, 9, 209, 3, 42, 23, - 221, 162, 241, 101, 3, 3, 43, 19, 217, 162, 241, 201, 3, 15, 43, 15, - 217, 19, 42, 13, 220, 162, 241, 52, 3, 100, 43, 9, 217, 162, 241, 169, - 3, 31, 43, 7, 217, 209, 58, 7, 42, 148, 191, 0, 32, 1, 32, 112, 71, - 0, 32, 112, 71, 0, 32, 112, 71, 176, 248, 218, 48, 3, 244, 112, 66, - 178, 245, 0, 95, 6, 209, 219, 178, 192, 24, 0, 245, 154, 80, 47, 48, - 0, 121, 0, 224, 0, 32, 64, 178, 112, 71, 11, 120, 16, 181, 128, 248, - 44, 54, 75, 120, 128, 248, 45, 54, 139, 120, 128, 248, 46, 54, 203, - 120, 128, 248, 47, 54, 0, 35, 202, 24, 20, 121, 194, 24, 1, 51, 8, 43, - 130, 248, 48, 70, 247, 209, 16, 189, 34, 177, 0, 245, 128, 83, 0, 34, - 154, 96, 154, 129, 0, 245, 130, 80, 1, 96, 1, 32, 112, 71, 111, 240, - 22, 0, 112, 71, 248, 181, 0, 245, 144, 86, 150, 248, 62, 48, 4, 70, - 139, 66, 13, 70, 23, 70, 3, 208, 208, 248, 136, 48, 3, 177, 152, 71, - 4, 245, 146, 84, 39, 128, 134, 248, 62, 80, 248, 189, 0, 32, 112, 71, - 16, 181, 144, 248, 233, 48, 148, 176, 67, 240, 1, 3, 128, 248, 233, - 48, 4, 70, 0, 33, 48, 34, 1, 168, 241, 243, 71, 241, 0, 33, 16, 34, - 13, 168, 241, 243, 66, 241, 0, 33, 4, 34, 19, 168, 241, 243, 61, 241, - 17, 168, 0, 33, 8, 34, 241, 243, 56, 241, 148, 248, 233, 48, 0, 32, - 35, 240, 1, 3, 132, 248, 233, 48, 20, 176, 16, 189, 0, 33, 9, 240, 59, - 187, 195, 105, 112, 181, 220, 104, 27, 109, 5, 70, 219, 7, 14, 70, 7, - 213, 32, 70, 250, 243, 89, 240, 24, 177, 235, 105, 155, 105, 152, 0, - 15, 212, 235, 105, 26, 109, 209, 7, 57, 213, 90, 109, 18, 6, 54, 212, - 216, 104, 250, 243, 232, 241, 0, 40, 49, 208, 235, 105, 155, 105, 155, - 0, 45, 213, 213, 248, 248, 48, 152, 7, 41, 212, 99, 105, 230, 177, 6, - 244, 112, 66, 178, 245, 0, 95, 23, 209, 34, 43, 17, 73, 204, 191, 12, - 35, 0, 35, 242, 178, 216, 191, 15, 33, 32, 70, 154, 64, 1, 35, 250, - 243, 52, 240, 99, 105, 12, 73, 34, 43, 32, 70, 216, 191, 112, 33, 204, - 191, 79, 244, 0, 114, 16, 34, 5, 224, 6, 73, 32, 70, 34, 43, 216, 191, - 15, 33, 0, 34, 1, 35, 189, 232, 112, 64, 250, 243, 30, 176, 112, 189, - 0, 191, 0, 240, 85, 85, 0, 14, 85, 85, 8, 181, 20, 41, 208, 248, 168, - 32, 2, 208, 21, 41, 14, 209, 9, 224, 146, 249, 26, 32, 2, 169, 65, 248, - 4, 47, 24, 70, 4, 34, 241, 243, 99, 240, 1, 224, 3, 155, 147, 118, 0, - 32, 8, 189, 111, 240, 22, 0, 8, 189, 16, 181, 144, 248, 26, 54, 12, - 70, 43, 177, 2, 49, 34, 70, 9, 240, 28, 255, 163, 120, 99, 112, 16, - 189, 1, 33, 9, 240, 28, 187, 16, 181, 0, 35, 4, 70, 226, 24, 1, 51, - 127, 33, 101, 43, 130, 248, 145, 22, 248, 209, 32, 70, 255, 247, 240, - 255, 32, 70, 189, 232, 16, 64, 255, 247, 111, 191, 4, 75, 27, 120, 1, - 43, 2, 209, 0, 32, 0, 112, 112, 71, 21, 240, 181, 191, 0, 191, 40, 9, - 2, 0, 4, 75, 27, 120, 1, 43, 2, 209, 0, 32, 0, 112, 112, 71, 21, 240, - 209, 191, 0, 191, 40, 9, 2, 0, 16, 181, 20, 70, 255, 247, 240, 255, - 40, 177, 0, 33, 10, 70, 189, 232, 16, 64, 241, 243, 3, 180, 32, 70, - 16, 189, 0, 34, 255, 247, 240, 191, 45, 233, 240, 65, 5, 70, 12, 70, - 23, 70, 30, 70, 255, 247, 220, 255, 56, 177, 40, 70, 33, 70, 58, 70, - 51, 70, 189, 232, 240, 65, 21, 240, 237, 191, 48, 70, 189, 232, 240, - 129, 0, 35, 255, 247, 233, 191, 195, 105, 24, 105, 63, 240, 201, 155, - 195, 105, 24, 105, 63, 240, 187, 155, 112, 181, 5, 70, 12, 70, 22, 70, - 255, 247, 43, 254, 33, 70, 0, 234, 6, 2, 40, 70, 189, 232, 112, 64, - 255, 247, 58, 190, 112, 181, 5, 70, 12, 70, 22, 70, 255, 247, 29, 254, - 64, 234, 6, 2, 33, 70, 40, 70, 146, 178, 189, 232, 112, 64, 255, 247, - 43, 190, 248, 181, 5, 70, 12, 70, 22, 70, 31, 70, 255, 247, 13, 254, - 32, 234, 6, 2, 62, 64, 50, 67, 40, 70, 33, 70, 146, 178, 189, 232, 248, - 64, 255, 247, 25, 190, 248, 181, 31, 70, 6, 155, 21, 70, 25, 128, 7, - 158, 12, 70, 255, 247, 249, 253, 8, 155, 48, 128, 28, 128, 51, 136, - 47, 64, 35, 234, 5, 3, 67, 234, 7, 5, 9, 155, 29, 128, 248, 189, 208, - 248, 176, 48, 163, 248, 252, 19, 179, 248, 254, 19, 10, 64, 163, 248, - 254, 35, 0, 35, 160, 248, 32, 54, 112, 71, 208, 248, 176, 48, 163, 248, - 252, 19, 179, 248, 254, 19, 137, 178, 10, 67, 163, 248, 254, 35, 0, - 35, 160, 248, 32, 54, 112, 71, 16, 181, 208, 248, 176, 64, 19, 64, 164, - 248, 252, 19, 180, 248, 254, 19, 137, 178, 33, 234, 2, 2, 26, 67, 0, - 35, 164, 248, 254, 35, 160, 248, 32, 54, 16, 189, 112, 181, 11, 70, - 5, 70, 45, 224, 28, 70, 86, 30, 52, 248, 2, 43, 145, 4, 2, 244, 64, - 66, 137, 12, 178, 245, 128, 79, 18, 208, 1, 220, 58, 177, 29, 224, 178, - 245, 0, 79, 17, 208, 178, 245, 64, 79, 23, 209, 18, 224, 28, 70, 90, - 136, 40, 70, 52, 248, 4, 63, 255, 247, 206, 255, 1, 62, 13, 224, 40, - 70, 90, 136, 255, 247, 226, 253, 8, 224, 40, 70, 90, 136, 255, 247, - 168, 255, 3, 224, 40, 70, 90, 136, 255, 247, 176, 255, 163, 28, 114, - 30, 0, 42, 207, 220, 112, 189, 248, 181, 31, 70, 6, 155, 21, 70, 25, - 128, 7, 158, 12, 70, 255, 247, 191, 253, 8, 155, 48, 128, 28, 128, 51, - 136, 47, 64, 35, 234, 5, 3, 67, 234, 7, 5, 9, 155, 29, 128, 248, 189, - 41, 177, 64, 242, 59, 65, 79, 246, 248, 114, 255, 247, 130, 191, 2, - 73, 4, 34, 255, 247, 171, 191, 0, 191, 124, 223, 1, 0, 88, 177, 176, - 248, 222, 0, 176, 245, 0, 111, 5, 208, 176, 245, 64, 111, 12, 191, 128, - 32, 0, 32, 112, 71, 64, 32, 112, 71, 1, 35, 128, 248, 225, 48, 112, - 71, 128, 248, 36, 22, 112, 71, 144, 249, 36, 6, 112, 71, 112, 71, 16, - 177, 195, 105, 3, 177, 89, 119, 112, 71, 16, 177, 195, 105, 3, 177, - 25, 119, 112, 71, 144, 248, 227, 48, 16, 181, 4, 70, 0, 43, 95, 209, - 100, 34, 160, 248, 156, 40, 160, 248, 158, 40, 79, 244, 72, 114, 160, - 248, 164, 40, 100, 34, 160, 248, 166, 40, 160, 248, 168, 40, 160, 248, - 170, 40, 160, 248, 172, 40, 160, 248, 174, 40, 160, 248, 176, 40, 160, - 248, 178, 40, 160, 248, 180, 40, 10, 34, 160, 248, 54, 40, 160, 248, - 84, 40, 160, 248, 58, 40, 160, 248, 92, 40, 160, 248, 56, 40, 160, 248, - 86, 40, 160, 248, 60, 40, 160, 248, 94, 40, 160, 248, 42, 40, 160, 248, - 40, 40, 160, 248, 44, 40, 160, 248, 46, 40, 20, 34, 160, 248, 50, 40, - 160, 248, 52, 40, 10, 34, 160, 248, 144, 39, 160, 248, 146, 39, 80, - 34, 160, 248, 148, 39, 10, 34, 192, 248, 160, 56, 160, 248, 48, 56, - 160, 248, 172, 55, 160, 248, 174, 55, 160, 248, 74, 40, 160, 248, 72, - 40, 192, 248, 88, 56, 192, 248, 96, 56, 67, 106, 160, 248, 76, 40, 160, - 248, 78, 40, 20, 34, 160, 248, 80, 40, 160, 248, 82, 40, 3, 177, 152, - 71, 1, 35, 132, 248, 227, 48, 16, 189, 8, 181, 0, 245, 150, 83, 153, - 106, 65, 177, 195, 105, 24, 105, 63, 240, 135, 218, 208, 241, 1, 0, - 56, 191, 0, 32, 8, 189, 8, 70, 8, 189, 45, 233, 248, 79, 12, 70, 209, - 248, 16, 160, 209, 248, 0, 128, 155, 70, 137, 104, 227, 104, 0, 39, - 67, 234, 129, 35, 17, 70, 154, 178, 5, 70, 189, 248, 40, 144, 62, 70, - 255, 247, 1, 253, 27, 224, 186, 241, 32, 15, 11, 209, 88, 248, 7, 32, - 40, 70, 89, 70, 18, 12, 255, 247, 246, 252, 40, 70, 73, 70, 56, 248, - 7, 32, 8, 224, 186, 241, 16, 15, 12, 191, 56, 248, 22, 32, 24, 248, - 6, 32, 40, 70, 73, 70, 255, 247, 230, 252, 1, 54, 4, 55, 99, 104, 158, - 66, 224, 211, 189, 232, 248, 143, 45, 233, 247, 79, 12, 70, 1, 147, - 209, 248, 16, 128, 14, 104, 227, 104, 137, 104, 79, 240, 0, 10, 67, - 234, 129, 35, 17, 70, 154, 178, 5, 70, 189, 248, 48, 112, 209, 70, 255, - 247, 202, 252, 34, 224, 184, 241, 32, 15, 40, 70, 57, 70, 13, 209, 255, - 247, 183, 252, 1, 153, 131, 70, 70, 248, 10, 0, 40, 70, 255, 247, 176, - 252, 75, 234, 0, 64, 70, 248, 10, 0, 11, 224, 184, 241, 16, 15, 4, 209, - 255, 247, 166, 252, 38, 248, 25, 0, 3, 224, 255, 247, 161, 252, 6, 248, - 9, 0, 9, 241, 1, 9, 10, 241, 4, 10, 99, 104, 153, 69, 217, 211, 189, - 232, 254, 143, 127, 181, 2, 147, 8, 155, 3, 145, 5, 147, 9, 155, 1, - 146, 4, 147, 1, 169, 10, 155, 152, 71, 7, 176, 0, 189, 127, 181, 2, - 147, 8, 155, 3, 145, 5, 147, 9, 155, 1, 146, 4, 147, 1, 169, 10, 155, - 152, 71, 7, 176, 0, 189, 0, 0, 240, 181, 63, 75, 139, 176, 208, 248, - 176, 64, 7, 70, 13, 70, 106, 70, 3, 241, 16, 14, 24, 104, 89, 104, 22, - 70, 3, 198, 8, 51, 115, 69, 50, 70, 247, 209, 24, 104, 55, 75, 48, 96, - 5, 170, 3, 241, 16, 14, 24, 104, 89, 104, 22, 70, 3, 198, 8, 51, 115, - 69, 50, 70, 247, 209, 24, 104, 48, 96, 13, 177, 107, 70, 0, 224, 5, - 171, 250, 105, 0, 33, 16, 105, 20, 34, 63, 240, 186, 217, 0, 35, 164, - 248, 104, 53, 0, 45, 79, 244, 128, 115, 164, 248, 192, 55, 12, 191, - 64, 35, 65, 35, 164, 248, 12, 53, 65, 246, 2, 35, 164, 248, 20, 53, - 79, 240, 0, 3, 164, 248, 8, 53, 164, 248, 10, 53, 164, 248, 76, 53, - 79, 240, 20, 3, 164, 248, 106, 53, 64, 246, 38, 3, 164, 248, 104, 53, - 79, 240, 0, 3, 164, 248, 0, 53, 79, 240, 208, 3, 164, 248, 2, 53, 12, - 191, 250, 38, 30, 38, 180, 248, 2, 53, 0, 37, 2, 224, 10, 32, 245, 243, - 145, 241, 181, 66, 9, 218, 180, 248, 14, 53, 1, 53, 27, 6, 245, 212, - 3, 224, 10, 32, 245, 243, 134, 241, 0, 224, 11, 37, 1, 61, 8, 208, 180, - 248, 14, 53, 88, 5, 244, 213, 3, 224, 10, 32, 245, 243, 122, 241, 0, - 224, 11, 37, 1, 61, 3, 208, 180, 248, 144, 54, 217, 5, 244, 212, 11, - 176, 240, 189, 190, 184, 1, 0, 210, 184, 1, 0, 208, 248, 248, 48, 10, - 177, 11, 67, 1, 224, 35, 234, 1, 3, 192, 248, 248, 48, 112, 71, 16, - 181, 208, 248, 248, 48, 33, 177, 67, 240, 16, 3, 192, 248, 248, 48, - 16, 189, 35, 240, 16, 3, 210, 7, 192, 248, 248, 48, 11, 213, 0, 245, - 142, 83, 92, 107, 195, 105, 26, 106, 155, 110, 154, 66, 136, 191, 195, - 235, 2, 1, 196, 248, 144, 16, 16, 189, 195, 105, 16, 181, 88, 33, 4, - 70, 71, 246, 127, 114, 24, 105, 63, 240, 41, 217, 227, 105, 90, 33, - 24, 105, 71, 246, 127, 114, 63, 240, 34, 217, 227, 105, 112, 33, 24, - 105, 71, 246, 127, 114, 63, 240, 27, 217, 227, 105, 114, 33, 24, 105, - 71, 246, 127, 114, 189, 232, 16, 64, 63, 240, 18, 153, 56, 181, 208, - 248, 176, 48, 4, 70, 211, 248, 32, 49, 195, 105, 13, 70, 26, 109, 208, - 7, 7, 213, 216, 104, 249, 243, 196, 244, 24, 177, 227, 105, 155, 105, - 153, 0, 14, 212, 227, 105, 26, 109, 210, 7, 21, 213, 90, 109, 16, 6, - 18, 212, 216, 104, 249, 243, 83, 246, 112, 177, 227, 105, 155, 105, - 153, 0, 10, 213, 32, 70, 29, 185, 41, 70, 255, 247, 71, 252, 20, 224, - 180, 248, 218, 16, 255, 247, 66, 252, 0, 224, 117, 177, 6, 34, 32, 70, - 10, 73, 255, 247, 129, 253, 212, 248, 168, 48, 147, 248, 44, 48, 1, - 43, 10, 209, 32, 70, 6, 73, 4, 34, 2, 224, 6, 73, 32, 70, 14, 34, 189, - 232, 56, 64, 255, 247, 112, 189, 56, 189, 0, 191, 112, 223, 1, 0, 154, - 229, 1, 0, 162, 229, 1, 0, 160, 248, 222, 16, 112, 71, 160, 248, 218, - 16, 112, 71, 176, 248, 218, 0, 112, 71, 64, 246, 195, 19, 152, 66, 10, - 217, 65, 242, 200, 67, 152, 66, 8, 217, 65, 242, 68, 99, 152, 66, 140, - 191, 3, 32, 2, 32, 112, 71, 0, 32, 112, 71, 1, 32, 112, 71, 112, 71, - 0, 0, 16, 181, 0, 35, 6, 74, 153, 0, 50, 248, 35, 64, 132, 66, 2, 209, - 82, 24, 80, 136, 16, 189, 1, 51, 14, 43, 243, 209, 0, 32, 16, 189, 56, - 223, 1, 0, 8, 181, 200, 178, 255, 247, 234, 255, 189, 232, 8, 64, 255, - 247, 209, 191, 112, 181, 6, 70, 13, 70, 16, 70, 20, 70, 0, 33, 28, 34, - 240, 243, 13, 245, 0, 34, 6, 245, 146, 81, 14, 75, 9, 122, 211, 90, - 25, 177, 148, 43, 1, 217, 165, 43, 17, 217, 2, 45, 2, 209, 14, 43, 4, - 217, 12, 224, 1, 45, 10, 209, 14, 43, 8, 217, 217, 8, 1, 32, 3, 240, - 7, 3, 16, 250, 3, 243, 96, 92, 3, 67, 99, 84, 4, 50, 56, 42, 224, 209, - 112, 189, 56, 223, 1, 0, 48, 181, 0, 245, 146, 80, 4, 122, 0, 34, 15, - 75, 211, 90, 67, 244, 48, 96, 14, 43, 140, 191, 79, 244, 128, 85, 79, - 244, 0, 85, 40, 67, 28, 177, 148, 43, 1, 217, 165, 43, 8, 217, 2, 41, - 2, 209, 14, 43, 4, 216, 48, 189, 1, 41, 1, 209, 14, 43, 3, 216, 4, 50, - 56, 42, 227, 209, 255, 32, 48, 189, 0, 191, 56, 223, 1, 0, 16, 181, - 144, 248, 178, 50, 11, 96, 144, 248, 43, 54, 75, 177, 144, 248, 42, - 54, 144, 248, 248, 70, 91, 178, 20, 177, 91, 66, 67, 240, 128, 67, 11, - 96, 18, 177, 144, 248, 247, 54, 19, 112, 0, 32, 16, 189, 48, 181, 0, - 245, 128, 85, 149, 248, 59, 80, 3, 156, 173, 0, 14, 41, 21, 112, 6, - 216, 0, 44, 168, 191, 0, 25, 144, 248, 30, 33, 26, 112, 48, 189, 127, - 34, 26, 112, 161, 241, 34, 2, 52, 234, 36, 4, 40, 191, 4, 36, 30, 42, - 3, 216, 2, 25, 146, 248, 131, 33, 26, 112, 161, 241, 100, 2, 40, 42, - 3, 216, 2, 25, 146, 248, 232, 33, 26, 112, 149, 57, 16, 41, 3, 216, - 0, 25, 144, 248, 77, 34, 26, 112, 48, 189, 45, 233, 255, 71, 0, 36, - 7, 70, 136, 70, 145, 70, 154, 70, 255, 37, 38, 70, 65, 70, 13, 241, - 15, 2, 13, 241, 14, 3, 56, 70, 0, 148, 255, 247, 191, 255, 7, 245, 152, - 83, 155, 121, 157, 248, 14, 32, 89, 178, 138, 66, 198, 191, 195, 235, - 2, 3, 219, 178, 0, 35, 1, 52, 179, 66, 40, 191, 30, 70, 171, 66, 56, - 191, 29, 70, 20, 44, 141, 248, 14, 48, 223, 209, 137, 248, 0, 96, 138, - 248, 0, 80, 189, 232, 255, 135, 112, 71, 144, 248, 41, 6, 112, 71, 45, - 233, 240, 79, 176, 248, 218, 48, 194, 105, 3, 244, 112, 67, 179, 245, - 128, 95, 20, 191, 2, 37, 1, 37, 165, 176, 82, 108, 5, 149, 64, 242, - 57, 81, 208, 248, 168, 80, 138, 66, 4, 70, 7, 149, 3, 208, 64, 242, - 139, 81, 138, 66, 5, 209, 163, 245, 128, 81, 75, 66, 67, 235, 1, 3, - 0, 224, 0, 35, 219, 178, 0, 33, 101, 34, 10, 168, 8, 147, 240, 243, - 34, 244, 180, 248, 218, 80, 5, 244, 64, 115, 179, 245, 64, 127, 4, 149, - 238, 178, 11, 208, 179, 245, 0, 127, 3, 209, 221, 46, 5, 216, 2, 54, - 4, 224, 2, 46, 1, 217, 2, 62, 0, 224, 0, 38, 32, 70, 5, 153, 255, 247, - 89, 251, 32, 70, 255, 247, 101, 250, 0, 37, 176, 70, 9, 144, 163, 70, - 3, 149, 79, 240, 255, 10, 169, 70, 38, 70, 232, 178, 6, 144, 4, 153, - 32, 70, 42, 70, 255, 247, 48, 250, 0, 40, 95, 208, 150, 248, 178, 114, - 148, 248, 172, 48, 13, 241, 40, 12, 5, 248, 12, 112, 99, 177, 32, 70, - 65, 70, 5, 154, 6, 155, 205, 248, 8, 192, 255, 247, 140, 250, 221, 248, - 8, 192, 56, 24, 5, 248, 12, 0, 65, 70, 13, 241, 143, 2, 13, 241, 142, - 3, 32, 70, 0, 149, 255, 247, 40, 255, 157, 248, 142, 48, 150, 248, 44, - 38, 154, 66, 40, 191, 26, 70, 4, 245, 152, 83, 155, 121, 89, 178, 138, - 66, 200, 191, 195, 235, 2, 2, 10, 171, 233, 92, 204, 191, 210, 178, - 0, 34, 141, 248, 142, 32, 138, 66, 40, 191, 10, 70, 148, 248, 224, 16, - 234, 84, 100, 41, 4, 216, 74, 67, 100, 32, 146, 251, 240, 242, 234, - 84, 10, 171, 232, 92, 157, 248, 143, 16, 150, 248, 145, 38, 136, 66, - 40, 191, 1, 70, 9, 152, 138, 66, 148, 191, 192, 235, 2, 0, 192, 235, - 1, 0, 193, 178, 3, 154, 233, 84, 6, 155, 81, 69, 56, 191, 138, 70, 73, - 69, 136, 191, 26, 70, 3, 146, 73, 69, 40, 191, 137, 70, 1, 53, 1, 54, - 20, 45, 146, 209, 101, 34, 4, 245, 162, 96, 0, 33, 240, 243, 138, 243, - 3, 157, 0, 34, 148, 248, 26, 6, 132, 248, 24, 150, 132, 248, 41, 166, - 132, 248, 42, 166, 132, 248, 248, 38, 132, 248, 25, 86, 35, 70, 10, - 169, 81, 92, 131, 248, 117, 21, 8, 177, 8, 157, 21, 177, 193, 235, 9, - 1, 1, 224, 202, 235, 1, 1, 1, 50, 131, 248, 16, 21, 1, 51, 20, 42, 237, - 209, 0, 35, 90, 70, 7, 157, 146, 249, 16, 21, 181, 249, 230, 3, 1, 51, - 65, 24, 219, 178, 130, 248, 16, 21, 1, 50, 4, 43, 242, 209, 227, 106, - 11, 177, 32, 70, 152, 71, 37, 176, 189, 232, 240, 143, 127, 41, 56, - 181, 4, 70, 38, 216, 0, 35, 226, 24, 1, 51, 101, 43, 130, 248, 178, - 18, 249, 209, 0, 35, 226, 105, 132, 248, 247, 54, 16, 127, 240, 177, - 212, 248, 248, 16, 137, 7, 23, 212, 212, 248, 176, 48, 211, 248, 32, - 49, 3, 240, 1, 3, 131, 240, 1, 5, 19, 177, 16, 105, 62, 240, 220, 222, - 32, 70, 255, 247, 228, 254, 77, 185, 227, 105, 24, 105, 62, 240, 192, - 222, 40, 70, 56, 189, 5, 32, 56, 189, 24, 70, 56, 189, 0, 32, 56, 189, - 112, 181, 0, 245, 44, 118, 13, 70, 4, 70, 4, 34, 176, 28, 240, 243, - 181, 242, 41, 29, 8, 34, 176, 29, 240, 243, 176, 242, 4, 245, 46, 112, - 5, 241, 12, 1, 8, 34, 6, 48, 240, 243, 168, 242, 4, 245, 56, 112, 5, - 241, 52, 1, 8, 34, 6, 48, 240, 243, 160, 242, 4, 245, 58, 112, 5, 241, - 60, 1, 8, 34, 6, 48, 240, 243, 152, 242, 4, 245, 48, 112, 5, 241, 20, - 1, 8, 34, 6, 48, 240, 243, 144, 242, 4, 245, 50, 112, 5, 241, 28, 1, - 8, 34, 6, 48, 240, 243, 136, 242, 4, 245, 52, 112, 5, 241, 36, 1, 8, - 34, 6, 48, 240, 243, 128, 242, 4, 245, 54, 112, 5, 241, 44, 1, 8, 34, - 6, 48, 240, 243, 120, 242, 4, 245, 60, 112, 5, 241, 68, 1, 8, 34, 6, - 48, 240, 243, 112, 242, 4, 245, 62, 112, 5, 241, 76, 1, 8, 34, 6, 48, - 240, 243, 104, 242, 4, 245, 64, 112, 5, 241, 84, 1, 8, 34, 6, 48, 240, - 243, 96, 242, 4, 245, 66, 112, 6, 48, 5, 241, 92, 1, 8, 34, 240, 243, - 88, 242, 149, 248, 100, 48, 132, 248, 22, 51, 212, 248, 176, 48, 211, - 248, 32, 81, 21, 240, 1, 5, 9, 209, 32, 70, 255, 247, 99, 254, 93, 177, - 227, 105, 24, 105, 189, 232, 112, 64, 62, 240, 61, 158, 227, 105, 1, - 37, 24, 105, 62, 240, 76, 222, 239, 231, 112, 189, 128, 248, 224, 16, - 112, 71, 195, 105, 153, 97, 112, 71, 128, 248, 213, 16, 65, 118, 112, - 71, 112, 181, 4, 70, 13, 70, 255, 247, 1, 249, 34, 70, 33, 70, 0, 35, - 232, 24, 6, 125, 22, 177, 129, 248, 56, 102, 2, 224, 0, 121, 129, 248, - 56, 6, 1, 51, 1, 49, 8, 43, 242, 209, 0, 35, 233, 24, 145, 248, 68, - 0, 16, 177, 130, 248, 72, 6, 2, 224, 9, 121, 130, 248, 72, 22, 1, 51, - 1, 50, 8, 43, 241, 209, 227, 105, 24, 105, 62, 240, 24, 222, 32, 70, - 255, 247, 32, 254, 227, 105, 24, 105, 189, 232, 112, 64, 62, 240, 251, - 157, 128, 248, 217, 16, 112, 71, 112, 71, 0, 0, 240, 181, 193, 105, - 133, 176, 75, 127, 4, 70, 0, 43, 106, 208, 144, 248, 26, 54, 0, 43, - 74, 208, 8, 105, 63, 34, 40, 33, 62, 240, 200, 221, 227, 105, 36, 33, - 24, 105, 16, 34, 62, 240, 194, 221, 227, 105, 148, 248, 41, 38, 24, - 105, 38, 33, 18, 1, 62, 240, 186, 221, 227, 105, 50, 33, 24, 105, 180, - 248, 252, 38, 62, 240, 179, 221, 38, 70, 0, 37, 38, 74, 2, 171, 16, - 104, 81, 104, 3, 195, 227, 105, 24, 105, 2, 171, 89, 93, 62, 240, 126, - 221, 227, 105, 150, 249, 20, 37, 7, 70, 185, 29, 24, 105, 146, 178, - 62, 240, 157, 221, 150, 249, 20, 37, 227, 105, 2, 235, 210, 114, 82, - 16, 82, 66, 24, 105, 7, 241, 14, 1, 146, 178, 1, 53, 62, 240, 143, 221, - 1, 54, 8, 45, 218, 209, 227, 105, 3, 34, 0, 146, 128, 34, 24, 105, 1, - 33, 19, 70, 62, 240, 79, 221, 27, 224, 3, 70, 4, 34, 147, 249, 20, 5, - 197, 29, 72, 191, 0, 241, 14, 5, 37, 240, 7, 5, 1, 50, 131, 248, 20, - 85, 1, 51, 12, 42, 241, 209, 148, 249, 20, 37, 8, 105, 7, 50, 210, 16, - 78, 33, 146, 178, 5, 176, 189, 232, 240, 64, 62, 240, 102, 157, 5, 176, - 240, 189, 230, 184, 1, 0, 144, 248, 26, 6, 112, 71, 0, 245, 130, 83, - 27, 121, 59, 177, 128, 248, 26, 22, 128, 248, 27, 22, 0, 245, 144, 80, - 128, 248, 60, 16, 112, 71, 1, 35, 45, 233, 240, 67, 11, 115, 11, 104, - 145, 70, 67, 240, 8, 2, 10, 96, 176, 249, 250, 38, 133, 176, 1, 50, - 4, 191, 67, 240, 9, 3, 11, 96, 144, 248, 26, 54, 5, 70, 12, 70, 27, - 177, 11, 104, 67, 240, 2, 3, 11, 96, 47, 70, 38, 70, 79, 240, 0, 8, - 151, 248, 178, 50, 40, 70, 179, 119, 73, 70, 13, 241, 15, 3, 13, 241, - 14, 2, 205, 248, 0, 128, 255, 247, 2, 253, 157, 248, 15, 48, 8, 241, - 1, 8, 134, 248, 176, 49, 151, 248, 117, 53, 1, 55, 134, 248, 121, 50, - 1, 54, 184, 241, 20, 15, 227, 209, 149, 248, 26, 54, 51, 179, 235, 105, - 27, 127, 27, 179, 40, 70, 255, 247, 56, 249, 149, 248, 24, 54, 40, 70, - 163, 117, 149, 248, 24, 54, 227, 117, 149, 248, 25, 54, 163, 118, 149, - 248, 25, 54, 227, 118, 8, 240, 228, 255, 35, 104, 16, 177, 67, 240, - 3, 3, 1, 224, 35, 240, 3, 3, 40, 70, 35, 96, 4, 241, 13, 1, 4, 241, - 21, 2, 8, 240, 223, 255, 40, 70, 255, 247, 27, 249, 5, 176, 189, 232, - 240, 131, 144, 248, 216, 48, 19, 177, 0, 35, 128, 248, 216, 48, 0, 32, - 112, 71, 195, 105, 1, 32, 147, 248, 129, 48, 11, 112, 112, 71, 115, - 181, 195, 105, 79, 240, 3, 2, 131, 248, 129, 16, 195, 105, 1, 41, 0, - 146, 13, 70, 79, 240, 1, 2, 79, 240, 0, 1, 4, 70, 24, 105, 140, 191, - 19, 70, 11, 70, 62, 240, 148, 220, 227, 105, 90, 127, 0, 42, 49, 208, - 212, 248, 176, 32, 210, 248, 32, 33, 2, 240, 1, 2, 130, 240, 1, 6, 18, - 177, 24, 105, 62, 240, 234, 220, 2, 34, 1, 45, 32, 70, 79, 244, 130, - 97, 13, 217, 19, 70, 255, 247, 63, 249, 165, 241, 2, 14, 1, 34, 222, - 241, 0, 3, 32, 70, 79, 244, 130, 97, 67, 235, 14, 3, 7, 224, 0, 35, - 255, 247, 49, 249, 32, 70, 79, 244, 130, 97, 1, 34, 43, 70, 255, 247, - 42, 249, 54, 185, 227, 105, 24, 105, 2, 176, 189, 232, 112, 64, 62, - 240, 176, 156, 2, 176, 112, 189, 56, 181, 144, 248, 226, 48, 4, 70, - 0, 43, 105, 209, 1, 34, 128, 248, 226, 32, 208, 248, 176, 32, 160, 248, - 218, 16, 210, 248, 32, 33, 0, 245, 130, 82, 19, 96, 208, 248, 248, 48, - 154, 7, 6, 212, 144, 248, 160, 46, 26, 185, 67, 240, 32, 3, 192, 248, - 248, 48, 37, 106, 0, 45, 79, 208, 1, 33, 32, 70, 255, 247, 88, 249, - 180, 248, 218, 16, 180, 248, 222, 48, 1, 244, 64, 97, 153, 66, 3, 208, - 227, 105, 24, 105, 62, 240, 14, 220, 1, 33, 4, 245, 150, 83, 131, 248, - 45, 16, 32, 70, 255, 247, 70, 251, 32, 70, 168, 71, 0, 35, 132, 248, - 225, 48, 32, 70, 255, 247, 120, 254, 227, 105, 32, 70, 147, 248, 129, - 16, 255, 247, 109, 255, 227, 105, 147, 248, 128, 32, 1, 42, 180, 248, - 218, 32, 2, 244, 112, 66, 9, 209, 178, 245, 0, 95, 1, 209, 154, 111, - 9, 224, 218, 111, 1, 42, 136, 191, 0, 34, 4, 224, 178, 245, 0, 95, 12, - 191, 26, 111, 90, 111, 218, 102, 217, 110, 32, 70, 0, 34, 254, 247, - 59, 255, 0, 35, 132, 248, 226, 48, 227, 105, 146, 33, 24, 105, 62, 240, - 6, 220, 4, 245, 146, 84, 64, 0, 96, 128, 56, 189, 16, 181, 144, 248, - 233, 48, 0, 43, 42, 208, 219, 7, 25, 213, 208, 248, 240, 48, 139, 66, - 15, 209, 195, 105, 211, 248, 140, 64, 27, 25, 131, 248, 130, 32, 195, - 105, 211, 248, 140, 64, 7, 44, 1, 208, 1, 52, 0, 224, 0, 36, 195, 248, - 140, 64, 144, 248, 233, 48, 35, 240, 1, 3, 128, 248, 233, 48, 144, 248, - 233, 48, 19, 240, 2, 15, 9, 208, 35, 240, 2, 3, 128, 248, 233, 48, 195, - 105, 24, 105, 189, 232, 16, 64, 62, 240, 23, 156, 16, 189, 11, 70, 144, - 248, 233, 16, 177, 185, 1, 43, 2, 208, 2, 43, 4, 209, 1, 224, 192, 248, - 240, 32, 128, 248, 233, 48, 195, 105, 27, 106, 192, 248, 236, 48, 0, - 245, 128, 83, 147, 248, 37, 48, 35, 177, 17, 70, 111, 240, 94, 2, 255, - 247, 180, 191, 112, 71, 16, 181, 4, 70, 255, 247, 14, 251, 2, 33, 194, - 178, 32, 70, 189, 232, 16, 64, 255, 247, 217, 191, 8, 240, 56, 191, - 0, 35, 193, 105, 26, 70, 200, 24, 144, 249, 130, 0, 1, 51, 8, 43, 2, - 68, 248, 209, 0, 42, 184, 191, 7, 50, 210, 8, 80, 178, 112, 71, 1, 33, - 6, 240, 108, 187, 112, 71, 19, 181, 4, 70, 8, 240, 200, 254, 226, 105, - 19, 106, 1, 51, 19, 98, 148, 248, 232, 16, 0, 41, 114, 208, 4, 245, - 156, 80, 65, 136, 25, 177, 164, 248, 134, 24, 164, 248, 136, 24, 193, - 136, 25, 177, 164, 248, 128, 24, 164, 248, 124, 24, 4, 245, 156, 81, - 137, 136, 25, 177, 164, 248, 122, 24, 164, 248, 126, 24, 18, 110, 179, - 251, 242, 241, 2, 251, 17, 51, 35, 185, 32, 70, 180, 248, 218, 16, 254, - 247, 224, 254, 212, 248, 248, 48, 19, 240, 14, 15, 5, 209, 32, 70, 1, - 33, 148, 248, 218, 32, 255, 247, 139, 255, 148, 248, 233, 48, 75, 177, - 227, 105, 26, 106, 212, 248, 236, 48, 211, 26, 5, 43, 2, 217, 0, 35, - 132, 248, 233, 48, 4, 245, 130, 83, 154, 104, 42, 177, 227, 105, 25, - 106, 27, 110, 138, 26, 154, 66, 12, 211, 212, 248, 248, 48, 152, 7, - 8, 212, 32, 70, 254, 247, 27, 254, 32, 177, 226, 105, 4, 245, 130, 83, - 18, 106, 154, 96, 212, 248, 248, 48, 25, 7, 30, 209, 212, 248, 140, - 48, 11, 177, 32, 70, 152, 71, 227, 105, 24, 105, 62, 240, 228, 218, - 104, 177, 227, 105, 1, 169, 24, 105, 13, 241, 7, 2, 62, 240, 230, 218, - 32, 70, 157, 248, 7, 16, 189, 248, 4, 32, 254, 247, 86, 254, 212, 248, - 248, 48, 26, 7, 2, 209, 32, 70, 8, 240, 165, 254, 0, 32, 28, 189, 0, - 245, 152, 83, 27, 125, 11, 177, 4, 240, 218, 191, 112, 71, 0, 35, 193, - 105, 201, 24, 1, 51, 8, 43, 129, 248, 130, 32, 248, 209, 0, 35, 194, - 105, 164, 33, 210, 24, 1, 51, 8, 43, 130, 248, 130, 16, 247, 209, 195, - 105, 0, 34, 195, 248, 140, 32, 218, 110, 3, 42, 7, 209, 0, 245, 128, - 82, 145, 105, 201, 7, 2, 213, 27, 106, 8, 51, 19, 97, 0, 245, 138, 83, - 48, 51, 0, 34, 79, 246, 164, 113, 1, 50, 35, 248, 2, 31, 16, 42, 25, - 132, 247, 209, 0, 245, 142, 80, 0, 35, 128, 248, 50, 48, 112, 71, 0, - 0, 73, 246, 117, 51, 75, 96, 0, 35, 11, 96, 79, 244, 52, 2, 152, 66, - 172, 191, 1, 35, 79, 240, 255, 51, 2, 251, 3, 2, 45, 233, 240, 65, 79, - 240, 180, 116, 146, 251, 244, 240, 4, 251, 16, 34, 33, 72, 0, 251, 3, - 35, 0, 43, 5, 219, 218, 19, 1, 50, 181, 42, 13, 221, 27, 24, 8, 224, - 90, 66, 210, 19, 1, 50, 82, 16, 82, 66, 90, 50, 4, 218, 3, 245, 52, - 3, 79, 240, 255, 52, 0, 224, 1, 36, 0, 32, 2, 70, 5, 70, 78, 104, 171, - 66, 15, 104, 223, 248, 76, 192, 70, 250, 2, 248, 9, 221, 184, 68, 23, - 65, 246, 27, 78, 96, 92, 248, 0, 96, 193, 248, 0, 128, 173, 25, 9, 224, - 200, 235, 7, 8, 23, 65, 246, 25, 78, 96, 92, 248, 0, 96, 193, 248, 0, - 128, 173, 27, 1, 50, 4, 48, 18, 42, 223, 209, 75, 104, 99, 67, 75, 96, - 11, 104, 92, 67, 12, 96, 189, 232, 240, 129, 0, 191, 0, 0, 76, 255, - 132, 223, 1, 0, 56, 181, 0, 245, 142, 83, 5, 70, 153, 107, 8, 224, 11, - 104, 79, 244, 61, 114, 163, 99, 235, 105, 152, 104, 244, 243, 106, 245, - 161, 107, 5, 245, 142, 84, 0, 41, 242, 209, 5, 245, 146, 85, 16, 53, - 79, 246, 206, 115, 161, 99, 101, 99, 165, 248, 148, 48, 197, 248, 144, - 16, 56, 189, 0, 245, 142, 83, 16, 181, 92, 107, 0, 245, 150, 83, 153, - 106, 25, 177, 195, 105, 24, 105, 62, 240, 129, 218, 0, 35, 99, 112, - 163, 112, 16, 189, 8, 181, 51, 185, 0, 245, 144, 80, 144, 248, 39, 16, - 24, 70, 17, 96, 8, 189, 41, 177, 1, 41, 3, 208, 2, 41, 1, 208, 3, 41, - 7, 209, 0, 245, 144, 83, 131, 248, 39, 16, 255, 247, 218, 255, 0, 32, - 8, 189, 111, 240, 28, 0, 8, 189, 128, 234, 224, 115, 163, 235, 224, - 115, 0, 32, 1, 224, 1, 48, 192, 178, 83, 250, 0, 242, 0, 42, 249, 220, - 112, 71, 16, 181, 0, 35, 2, 70, 24, 70, 79, 240, 128, 65, 25, 65, 12, - 24, 148, 66, 79, 234, 80, 0, 156, 191, 196, 235, 2, 2, 8, 67, 2, 51, - 32, 43, 241, 209, 144, 66, 56, 191, 1, 48, 16, 189, 195, 105, 131, 248, - 144, 16, 195, 105, 131, 248, 145, 32, 195, 105, 131, 248, 146, 16, 195, - 105, 131, 248, 147, 32, 112, 71, 195, 105, 131, 248, 146, 16, 112, 71, - 0, 245, 152, 83, 147, 249, 54, 0, 147, 249, 53, 48, 152, 66, 180, 191, - 1, 32, 2, 32, 112, 71, 0, 0, 0, 72, 112, 71, 190, 229, 1, 0, 16, 181, - 12, 70, 0, 33, 8, 240, 156, 248, 32, 112, 1, 32, 16, 189, 112, 71, 8, - 70, 112, 71, 0, 32, 112, 71, 0, 245, 142, 80, 128, 107, 3, 224, 195, - 136, 139, 66, 2, 208, 0, 104, 0, 40, 249, 209, 112, 71, 176, 248, 218, - 16, 255, 247, 241, 191, 112, 181, 4, 70, 13, 70, 255, 247, 236, 255, - 5, 244, 112, 67, 179, 245, 128, 95, 227, 105, 234, 178, 8, 191, 66, - 244, 128, 114, 6, 70, 160, 33, 24, 105, 62, 240, 219, 217, 163, 106, - 4, 245, 142, 81, 22, 177, 6, 245, 23, 114, 2, 224, 4, 245, 146, 82, - 16, 50, 74, 99, 19, 177, 32, 70, 41, 70, 152, 71, 54, 179, 4, 245, 142, - 83, 90, 107, 83, 120, 115, 177, 227, 105, 4, 245, 150, 86, 177, 106, - 24, 105, 62, 240, 211, 217, 227, 105, 0, 34, 24, 105, 177, 106, 19, - 70, 62, 240, 74, 217, 18, 224, 4, 245, 144, 83, 147, 248, 39, 48, 107, - 177, 3, 43, 11, 208, 227, 105, 210, 248, 144, 32, 25, 106, 155, 110, - 138, 26, 154, 66, 3, 211, 32, 70, 2, 33, 255, 247, 178, 255, 32, 70, - 41, 70, 189, 232, 112, 64, 254, 247, 250, 188, 224, 41, 16, 181, 4, - 70, 19, 220, 65, 244, 48, 99, 155, 178, 14, 41, 204, 191, 79, 244, 128, - 81, 79, 244, 0, 81, 25, 67, 255, 247, 160, 255, 1, 35, 32, 70, 132, - 248, 216, 48, 8, 240, 11, 255, 0, 32, 16, 189, 111, 240, 18, 0, 16, - 189, 112, 181, 13, 70, 4, 70, 208, 248, 176, 96, 255, 247, 145, 252, - 29, 187, 4, 245, 150, 86, 10, 33, 32, 70, 242, 142, 254, 247, 30, 252, - 32, 70, 64, 242, 75, 65, 42, 70, 254, 247, 24, 252, 32, 70, 41, 70, - 6, 240, 74, 248, 227, 105, 245, 134, 27, 109, 19, 240, 2, 3, 81, 208, - 50, 143, 212, 248, 176, 48, 79, 244, 122, 112, 163, 248, 156, 36, 178, - 143, 163, 248, 158, 36, 244, 243, 108, 241, 69, 224, 227, 105, 27, 109, - 155, 7, 30, 213, 212, 248, 176, 32, 4, 245, 150, 83, 178, 248, 156, - 20, 178, 248, 158, 36, 137, 178, 146, 178, 153, 99, 218, 99, 182, 248, - 156, 52, 79, 244, 122, 112, 35, 244, 0, 115, 27, 4, 27, 12, 166, 248, - 156, 52, 182, 248, 158, 52, 155, 178, 67, 244, 0, 115, 166, 248, 158, - 52, 244, 243, 72, 241, 41, 70, 32, 70, 1, 34, 255, 247, 145, 255, 5, - 70, 216, 185, 4, 245, 150, 86, 243, 142, 91, 185, 10, 33, 32, 70, 254, - 247, 196, 251, 64, 242, 75, 65, 240, 134, 79, 246, 255, 114, 32, 70, - 254, 247, 199, 251, 32, 70, 1, 33, 5, 240, 249, 255, 32, 70, 10, 33, - 79, 244, 148, 114, 254, 247, 149, 253, 0, 224, 29, 70, 40, 70, 112, - 189, 56, 181, 5, 70, 12, 70, 255, 247, 31, 252, 40, 70, 60, 185, 6, - 240, 208, 253, 40, 70, 79, 244, 64, 65, 4, 240, 155, 254, 15, 224, 33, - 70, 0, 34, 255, 247, 94, 255, 4, 70, 72, 185, 40, 70, 33, 70, 112, 34, - 35, 70, 6, 240, 26, 253, 40, 70, 94, 33, 5, 240, 72, 250, 32, 70, 56, - 189, 248, 181, 5, 70, 12, 70, 255, 247, 254, 251, 40, 70, 33, 70, 52, - 185, 5, 245, 150, 85, 6, 240, 100, 248, 38, 70, 172, 134, 17, 224, 1, - 34, 255, 247, 62, 255, 6, 70, 96, 185, 5, 245, 150, 87, 187, 142, 35, - 185, 40, 70, 10, 33, 254, 247, 113, 251, 184, 134, 40, 70, 33, 70, 6, - 240, 79, 248, 48, 70, 248, 189, 247, 181, 8, 158, 4, 70, 13, 70, 31, - 70, 59, 177, 3, 42, 5, 217, 104, 70, 25, 70, 4, 34, 239, 243, 226, 244, - 1, 224, 0, 35, 0, 147, 168, 45, 0, 240, 5, 129, 23, 220, 92, 45, 0, - 240, 185, 128, 9, 220, 60, 45, 0, 240, 170, 128, 74, 45, 0, 240, 156, - 128, 27, 45, 64, 240, 244, 128, 39, 224, 94, 45, 46, 208, 192, 242, - 179, 128, 95, 45, 59, 208, 135, 45, 64, 240, 234, 128, 24, 224, 195, - 45, 118, 208, 6, 220, 170, 45, 70, 208, 126, 219, 194, 45, 64, 240, - 224, 128, 225, 224, 212, 45, 0, 240, 183, 128, 3, 220, 211, 45, 64, - 240, 216, 128, 164, 224, 165, 245, 154, 117, 3, 61, 1, 45, 0, 242, 209, - 128, 227, 224, 32, 70, 255, 247, 190, 252, 56, 96, 222, 224, 227, 105, - 29, 127, 0, 45, 64, 240, 212, 128, 32, 70, 254, 247, 42, 251, 214, 224, - 1, 35, 51, 112, 227, 105, 91, 127, 0, 43, 0, 240, 193, 128, 32, 70, - 254, 247, 151, 252, 32, 70, 189, 248, 0, 16, 254, 247, 8, 251, 56, 96, - 15, 224, 1, 35, 51, 112, 227, 105, 91, 127, 0, 43, 0, 240, 176, 128, - 32, 70, 254, 247, 134, 252, 0, 154, 32, 70, 145, 178, 18, 12, 254, 247, - 1, 251, 32, 70, 254, 247, 129, 252, 176, 224, 227, 105, 90, 127, 0, - 42, 0, 240, 158, 128, 24, 105, 62, 240, 125, 216, 32, 70, 254, 247, - 113, 252, 0, 35, 59, 96, 212, 248, 188, 32, 8, 42, 19, 209, 13, 241, - 7, 2, 32, 70, 13, 241, 6, 1, 141, 248, 6, 48, 141, 248, 7, 48, 8, 240, - 37, 251, 157, 249, 6, 32, 157, 249, 7, 48, 146, 178, 155, 178, 67, 234, - 2, 35, 59, 96, 32, 70, 254, 247, 88, 252, 227, 105, 24, 105, 62, 240, - 69, 216, 131, 224, 227, 105, 27, 127, 0, 43, 116, 208, 59, 136, 3, 43, - 52, 191, 111, 240, 12, 5, 111, 240, 1, 5, 120, 224, 227, 105, 27, 127, - 0, 43, 20, 191, 111, 240, 12, 5, 111, 240, 3, 5, 111, 224, 227, 105, - 27, 127, 0, 43, 100, 209, 35, 107, 0, 43, 95, 208, 32, 70, 0, 153, 152, - 71, 27, 224, 227, 105, 27, 127, 0, 43, 89, 209, 32, 70, 0, 153, 122, - 104, 187, 104, 255, 247, 121, 254, 16, 224, 227, 105, 27, 127, 0, 43, - 78, 209, 32, 70, 0, 153, 255, 247, 228, 254, 7, 224, 227, 105, 27, 127, - 0, 43, 69, 209, 32, 70, 0, 153, 255, 247, 252, 254, 5, 70, 70, 224, - 227, 105, 4, 245, 128, 84, 218, 110, 58, 96, 165, 105, 21, 240, 1, 5, - 61, 208, 66, 240, 128, 2, 58, 96, 56, 224, 0, 155, 4, 43, 50, 216, 226, - 105, 209, 110, 153, 66, 49, 208, 21, 127, 211, 102, 0, 45, 46, 208, - 16, 105, 61, 240, 255, 223, 0, 155, 35, 177, 32, 70, 0, 33, 1, 34, 254, - 247, 213, 250, 227, 105, 1, 34, 217, 110, 32, 70, 254, 247, 207, 250, - 227, 105, 0, 40, 24, 105, 12, 191, 111, 240, 2, 5, 0, 37, 61, 240, 213, - 223, 20, 224, 111, 240, 22, 5, 17, 224, 111, 240, 12, 5, 14, 224, 111, - 240, 10, 5, 11, 224, 111, 240, 3, 5, 8, 224, 29, 70, 6, 224, 111, 240, - 4, 5, 3, 224, 111, 240, 28, 5, 0, 224, 0, 37, 40, 70, 254, 189, 195, - 105, 155, 105, 155, 0, 7, 213, 208, 248, 176, 48, 3, 34, 163, 248, 180, - 38, 255, 34, 163, 248, 184, 38, 112, 71, 45, 233, 240, 65, 152, 70, - 136, 176, 0, 35, 7, 147, 14, 155, 4, 70, 3, 43, 13, 70, 15, 158, 17, - 159, 4, 217, 7, 168, 65, 70, 4, 34, 239, 243, 164, 243, 7, 153, 64, - 242, 133, 32, 11, 28, 24, 191, 1, 35, 133, 66, 26, 70, 0, 240, 24, 129, - 53, 216, 64, 242, 91, 32, 133, 66, 0, 240, 130, 128, 17, 216, 83, 45, - 9, 216, 82, 45, 128, 240, 70, 129, 80, 45, 0, 240, 67, 129, 81, 45, - 64, 240, 66, 129, 131, 224, 64, 242, 90, 35, 157, 66, 64, 240, 60, 129, - 107, 224, 64, 242, 123, 35, 157, 66, 0, 240, 185, 128, 9, 216, 64, 242, - 106, 35, 157, 66, 86, 208, 64, 242, 122, 35, 157, 66, 64, 240, 44, 129, - 118, 224, 181, 245, 32, 127, 0, 240, 224, 128, 181, 245, 33, 127, 0, - 240, 236, 128, 64, 242, 126, 35, 157, 66, 64, 240, 30, 129, 208, 224, - 64, 242, 214, 35, 157, 66, 0, 240, 22, 129, 30, 216, 64, 242, 147, 35, - 157, 66, 77, 208, 10, 216, 64, 242, 134, 35, 157, 66, 0, 240, 223, 128, - 64, 242, 145, 35, 157, 66, 64, 240, 8, 129, 61, 224, 181, 245, 39, 127, - 0, 240, 219, 128, 64, 242, 157, 35, 157, 66, 0, 240, 218, 128, 64, 242, - 149, 35, 157, 66, 64, 240, 249, 128, 54, 224, 64, 242, 221, 35, 157, - 66, 0, 240, 237, 128, 9, 216, 64, 242, 218, 35, 157, 66, 0, 240, 207, - 128, 181, 245, 55, 127, 64, 240, 233, 128, 214, 224, 181, 245, 61, 127, - 7, 208, 192, 240, 227, 128, 165, 245, 62, 115, 6, 59, 1, 43, 0, 242, - 221, 128, 111, 240, 22, 5, 237, 224, 32, 70, 254, 247, 34, 251, 32, - 70, 49, 70, 254, 247, 190, 250, 32, 70, 254, 247, 31, 251, 204, 224, - 148, 248, 232, 48, 161, 224, 132, 248, 232, 48, 198, 224, 4, 245, 156, - 84, 97, 128, 194, 224, 4, 245, 156, 84, 161, 128, 190, 224, 4, 245, - 156, 84, 225, 128, 186, 224, 1, 35, 14, 147, 32, 70, 51, 70, 8, 176, - 189, 232, 240, 65, 254, 247, 240, 185, 227, 105, 26, 127, 0, 42, 0, - 240, 190, 128, 212, 248, 176, 32, 210, 248, 32, 33, 2, 240, 1, 2, 130, - 240, 1, 7, 18, 177, 24, 105, 61, 240, 247, 222, 32, 70, 255, 247, 35, - 255, 32, 70, 254, 247, 232, 250, 4, 245, 144, 80, 69, 122, 129, 121, - 194, 121, 3, 122, 0, 149, 133, 122, 1, 149, 197, 122, 2, 149, 144, 248, - 33, 0, 0, 37, 3, 144, 32, 70, 4, 149, 254, 247, 223, 249, 48, 96, 32, - 70, 254, 247, 213, 250, 0, 47, 64, 240, 151, 128, 227, 105, 61, 70, - 24, 105, 61, 240, 190, 222, 144, 224, 10, 22, 2, 240, 15, 2, 1, 42, - 0, 242, 137, 128, 13, 21, 5, 240, 3, 5, 1, 45, 0, 242, 131, 128, 136, - 21, 0, 240, 3, 0, 3, 40, 125, 208, 14, 20, 6, 240, 15, 6, 1, 46, 120, - 216, 15, 18, 255, 178, 167, 241, 10, 3, 219, 178, 5, 43, 113, 216, 203, - 178, 1, 43, 1, 217, 3, 43, 108, 209, 4, 245, 144, 84, 14, 47, 40, 191, - 14, 39, 9, 15, 167, 113, 227, 113, 38, 114, 101, 114, 160, 114, 226, - 114, 132, 248, 33, 16, 73, 224, 8, 169, 1, 35, 65, 248, 4, 61, 7, 224, - 180, 248, 218, 16, 32, 70, 254, 247, 206, 253, 8, 169, 65, 248, 4, 13, - 48, 70, 58, 70, 50, 224, 4, 245, 128, 84, 132, 248, 59, 16, 52, 224, - 4, 245, 128, 84, 148, 248, 59, 48, 8, 169, 65, 248, 4, 61, 48, 70, 35, - 224, 212, 248, 248, 48, 195, 243, 0, 19, 51, 96, 37, 224, 32, 70, 50, - 70, 0, 35, 2, 224, 32, 70, 50, 70, 1, 35, 255, 247, 216, 251, 27, 224, - 32, 70, 1, 33, 8, 240, 107, 249, 0, 37, 8, 169, 65, 248, 4, 93, 48, - 70, 4, 34, 239, 243, 88, 242, 36, 224, 32, 70, 0, 33, 7, 170, 8, 240, - 123, 250, 48, 70, 7, 169, 4, 34, 239, 243, 77, 242, 3, 224, 32, 70, - 0, 34, 8, 240, 113, 250, 0, 37, 19, 224, 1, 145, 2, 146, 41, 70, 32, - 70, 66, 70, 51, 70, 0, 151, 254, 247, 201, 249, 16, 241, 23, 15, 12, - 191, 5, 70, 0, 37, 4, 224, 111, 240, 3, 5, 1, 224, 111, 240, 28, 5, - 40, 70, 8, 176, 189, 232, 240, 129, 208, 248, 248, 48, 19, 240, 6, 15, - 12, 191, 0, 32, 1, 32, 112, 71, 248, 181, 13, 70, 176, 248, 218, 16, - 4, 70, 22, 70, 31, 70, 254, 247, 99, 253, 64, 185, 180, 249, 252, 48, - 51, 96, 180, 249, 254, 48, 59, 96, 180, 249, 0, 49, 43, 96, 248, 189, - 208, 248, 168, 0, 112, 71, 0, 0, 45, 233, 240, 65, 195, 105, 5, 70, - 91, 105, 12, 70, 10, 43, 207, 136, 142, 136, 6, 217, 72, 138, 16, 244, - 128, 112, 2, 209, 1, 35, 203, 119, 49, 224, 40, 70, 255, 247, 232, 255, - 180, 248, 8, 128, 27, 75, 255, 178, 79, 234, 152, 40, 127, 47, 19, 249, - 8, 48, 200, 191, 167, 245, 128, 119, 255, 24, 22, 244, 0, 111, 5, 245, - 154, 83, 20, 191, 147, 249, 27, 48, 147, 249, 26, 48, 144, 249, 95, - 16, 255, 24, 226, 138, 121, 24, 127, 41, 2, 244, 255, 98, 200, 191, - 161, 245, 128, 113, 210, 16, 66, 244, 48, 99, 14, 42, 204, 191, 79, - 244, 128, 82, 79, 244, 0, 82, 40, 70, 73, 178, 26, 67, 255, 247, 166, - 251, 1, 70, 178, 11, 32, 119, 73, 178, 40, 70, 2, 240, 1, 2, 189, 232, - 240, 65, 7, 240, 180, 188, 254, 2, 2, 0, 195, 105, 152, 110, 112, 71, - 195, 105, 153, 102, 112, 71, 16, 181, 12, 137, 3, 153, 2, 155, 2, 145, - 4, 153, 3, 145, 5, 153, 4, 145, 6, 153, 5, 145, 0, 105, 17, 70, 34, - 70, 189, 232, 16, 64, 42, 240, 192, 154, 176, 251, 241, 243, 16, 181, - 1, 240, 1, 4, 1, 251, 19, 0, 4, 235, 81, 1, 8, 224, 91, 0, 136, 66, - 4, 211, 64, 26, 1, 51, 4, 235, 64, 0, 0, 224, 64, 0, 1, 58, 210, 178, - 255, 42, 242, 209, 136, 66, 40, 191, 1, 51, 24, 70, 16, 189, 208, 248, - 168, 48, 1, 34, 90, 134, 112, 71, 176, 248, 218, 16, 208, 248, 168, - 32, 203, 178, 1, 244, 112, 65, 177, 245, 0, 95, 3, 209, 211, 24, 147, - 248, 231, 52, 135, 224, 112, 43, 93, 208, 28, 216, 56, 43, 72, 208, - 12, 216, 44, 43, 60, 208, 4, 216, 36, 43, 51, 208, 40, 43, 121, 209, - 51, 224, 48, 43, 55, 208, 52, 43, 116, 209, 55, 224, 100, 43, 65, 208, - 4, 216, 60, 43, 56, 208, 64, 43, 108, 209, 56, 224, 104, 43, 60, 208, - 108, 43, 103, 209, 60, 224, 136, 43, 79, 208, 12, 216, 124, 43, 67, - 208, 4, 216, 116, 43, 58, 208, 120, 43, 92, 209, 58, 224, 128, 43, 62, - 208, 132, 43, 87, 209, 62, 224, 153, 43, 72, 208, 4, 216, 140, 43, 63, - 208, 149, 43, 79, 209, 63, 224, 161, 43, 70, 208, 165, 43, 71, 208, - 157, 43, 72, 209, 62, 224, 146, 248, 246, 52, 69, 224, 146, 248, 247, - 52, 66, 224, 146, 248, 248, 52, 63, 224, 146, 248, 249, 52, 60, 224, - 146, 248, 250, 52, 57, 224, 146, 248, 251, 52, 54, 224, 146, 248, 252, - 52, 51, 224, 146, 248, 253, 52, 48, 224, 146, 248, 254, 52, 45, 224, - 146, 248, 255, 52, 42, 224, 146, 248, 0, 53, 39, 224, 146, 248, 1, 53, - 36, 224, 146, 248, 2, 53, 33, 224, 146, 248, 3, 53, 30, 224, 146, 248, - 4, 53, 27, 224, 146, 248, 5, 53, 24, 224, 146, 248, 6, 53, 21, 224, - 146, 248, 7, 53, 18, 224, 146, 248, 8, 53, 15, 224, 146, 248, 9, 53, - 12, 224, 146, 248, 10, 53, 9, 224, 146, 248, 11, 53, 6, 224, 146, 248, - 12, 53, 3, 224, 146, 248, 13, 53, 0, 224, 0, 35, 210, 248, 228, 20, - 144, 248, 42, 38, 138, 26, 211, 24, 88, 178, 112, 71, 8, 70, 112, 71, - 73, 178, 72, 28, 64, 16, 73, 16, 8, 49, 192, 241, 8, 0, 65, 234, 0, - 16, 128, 178, 112, 71, 176, 248, 218, 32, 208, 248, 168, 48, 2, 244, - 112, 66, 178, 245, 0, 95, 6, 209, 147, 248, 60, 5, 67, 178, 1, 51, 3, - 208, 192, 178, 112, 71, 0, 32, 112, 71, 0, 32, 112, 71, 56, 181, 4, - 70, 208, 248, 168, 80, 255, 247, 230, 255, 16, 185, 149, 248, 70, 5, - 64, 177, 180, 248, 218, 0, 0, 244, 112, 64, 160, 245, 0, 83, 88, 66, - 64, 235, 3, 0, 56, 189, 48, 181, 208, 248, 168, 0, 143, 176, 0, 35, - 0, 37, 1, 172, 29, 85, 1, 51, 50, 43, 249, 209, 83, 28, 144, 248, 233, - 51, 6, 209, 17, 177, 176, 249, 62, 37, 3, 224, 176, 249, 64, 37, 17, - 224, 129, 177, 160, 43, 79, 240, 0, 3, 141, 248, 4, 48, 29, 191, 141, - 248, 5, 48, 141, 248, 6, 48, 141, 248, 7, 48, 141, 248, 6, 48, 141, - 248, 8, 48, 49, 224, 160, 43, 79, 240, 0, 3, 21, 208, 1, 33, 141, 248, - 24, 16, 141, 248, 25, 16, 254, 33, 141, 248, 28, 16, 141, 248, 29, 16, - 255, 33, 141, 248, 26, 48, 141, 248, 27, 48, 141, 248, 30, 48, 141, - 248, 31, 16, 141, 248, 34, 48, 23, 224, 2, 33, 141, 248, 24, 16, 252, - 33, 141, 248, 25, 48, 141, 248, 26, 48, 141, 248, 27, 48, 141, 248, - 28, 16, 141, 248, 34, 48, 254, 33, 4, 35, 141, 248, 29, 16, 141, 248, - 30, 16, 141, 248, 31, 16, 141, 248, 48, 48, 14, 171, 154, 24, 18, 249, - 52, 12, 15, 176, 48, 189, 16, 181, 193, 105, 0, 245, 129, 82, 11, 106, - 18, 104, 208, 248, 168, 64, 147, 66, 1, 211, 155, 26, 1, 224, 210, 67, - 211, 24, 148, 248, 188, 66, 144, 248, 218, 32, 148, 66, 5, 209, 136, - 110, 131, 66, 52, 191, 0, 32, 1, 32, 16, 189, 1, 32, 16, 189, 112, 71, - 208, 248, 168, 48, 147, 248, 6, 4, 0, 40, 8, 191, 16, 32, 112, 71, 0, - 0, 16, 35, 22, 74, 48, 181, 25, 70, 4, 36, 73, 178, 73, 16, 201, 178, - 2, 66, 77, 178, 3, 208, 203, 24, 219, 178, 170, 64, 2, 224, 234, 64, - 91, 26, 219, 178, 1, 60, 240, 209, 2, 66, 1, 209, 1, 59, 219, 178, 3, - 235, 67, 1, 91, 178, 201, 178, 3, 43, 10, 70, 12, 221, 3, 59, 216, 64, - 13, 40, 1, 217, 202, 28, 6, 224, 10, 40, 1, 217, 138, 28, 2, 224, 8, - 40, 136, 191, 74, 28, 80, 178, 48, 189, 0, 0, 255, 255, 208, 248, 168, - 48, 0, 34, 131, 248, 144, 35, 131, 248, 145, 35, 131, 248, 146, 35, - 131, 248, 147, 35, 131, 248, 148, 35, 112, 71, 112, 71, 8, 181, 64, - 242, 164, 65, 253, 247, 99, 254, 0, 244, 64, 64, 8, 189, 112, 181, 12, - 70, 64, 242, 57, 65, 6, 70, 253, 247, 89, 254, 0, 244, 96, 112, 192, - 17, 224, 128, 64, 242, 181, 65, 48, 70, 253, 247, 80, 254, 64, 242, - 251, 65, 5, 70, 48, 70, 253, 247, 74, 254, 235, 178, 192, 178, 45, 10, - 35, 128, 101, 128, 160, 128, 112, 189, 8, 181, 64, 242, 251, 65, 253, - 247, 62, 254, 0, 244, 254, 64, 0, 10, 8, 189, 45, 233, 248, 67, 13, - 70, 64, 242, 183, 97, 4, 70, 145, 70, 253, 247, 49, 254, 64, 242, 182, - 97, 128, 70, 32, 70, 253, 247, 43, 254, 64, 242, 181, 97, 7, 70, 32, - 70, 253, 247, 37, 254, 64, 242, 180, 97, 6, 70, 32, 70, 0, 36, 253, - 247, 30, 254, 33, 70, 35, 70, 80, 250, 4, 242, 18, 240, 1, 2, 2, 209, - 1, 49, 201, 178, 0, 224, 1, 34, 1, 51, 219, 178, 16, 43, 18, 208, 1, - 52, 0, 42, 239, 208, 1, 34, 13, 224, 163, 241, 16, 4, 86, 250, 4, 244, - 228, 7, 2, 212, 1, 49, 201, 178, 0, 224, 1, 34, 1, 51, 219, 178, 31, - 43, 15, 216, 0, 42, 239, 208, 1, 34, 11, 224, 163, 241, 32, 4, 87, 250, - 4, 244, 228, 7, 2, 212, 1, 49, 201, 178, 0, 224, 1, 34, 1, 51, 219, - 178, 47, 43, 15, 216, 0, 42, 239, 208, 1, 34, 11, 224, 163, 241, 48, - 4, 72, 250, 4, 244, 228, 7, 2, 212, 1, 49, 201, 178, 0, 224, 1, 34, - 1, 51, 219, 178, 63, 43, 4, 217, 79, 240, 15, 12, 0, 35, 63, 36, 2, - 224, 0, 42, 234, 208, 247, 231, 72, 250, 12, 242, 18, 240, 1, 2, 2, - 209, 1, 60, 228, 178, 0, 224, 1, 34, 1, 51, 219, 178, 16, 43, 20, 208, - 12, 241, 255, 60, 0, 42, 238, 208, 1, 34, 14, 224, 195, 241, 31, 12, - 71, 250, 12, 252, 28, 240, 1, 15, 2, 209, 1, 60, 228, 178, 0, 224, 1, - 34, 1, 51, 219, 178, 31, 43, 16, 216, 0, 42, 238, 208, 1, 34, 12, 224, - 195, 241, 47, 7, 86, 250, 7, 247, 23, 240, 1, 15, 2, 209, 1, 60, 228, - 178, 0, 224, 1, 34, 1, 51, 219, 178, 47, 43, 16, 216, 0, 42, 238, 208, - 1, 34, 12, 224, 195, 241, 63, 6, 80, 250, 6, 246, 22, 240, 1, 15, 2, - 209, 1, 60, 228, 178, 0, 224, 1, 34, 1, 51, 219, 178, 63, 43, 1, 216, - 0, 42, 238, 208, 44, 112, 137, 248, 0, 16, 189, 232, 248, 131, 56, 181, - 64, 242, 35, 65, 208, 248, 168, 64, 5, 70, 253, 247, 121, 253, 192, - 178, 164, 248, 100, 3, 79, 244, 170, 97, 40, 70, 253, 247, 113, 253, - 128, 5, 128, 13, 164, 248, 104, 3, 64, 242, 52, 65, 40, 70, 253, 247, - 104, 253, 192, 178, 127, 40, 164, 248, 102, 3, 196, 191, 160, 245, 128, - 112, 164, 248, 102, 3, 64, 242, 50, 65, 40, 70, 253, 247, 90, 253, 192, - 178, 127, 40, 196, 191, 160, 245, 128, 112, 128, 178, 132, 248, 188, - 3, 56, 189, 45, 233, 248, 67, 176, 248, 218, 32, 4, 70, 2, 244, 112, - 66, 178, 245, 128, 95, 208, 248, 168, 48, 7, 209, 179, 248, 146, 5, - 3, 178, 1, 51, 85, 208, 128, 178, 189, 232, 248, 131, 179, 248, 144, - 53, 26, 178, 1, 50, 2, 208, 152, 178, 189, 232, 248, 131, 64, 242, 165, - 65, 253, 247, 49, 253, 64, 242, 165, 65, 129, 70, 32, 70, 253, 247, - 43, 253, 64, 242, 13, 65, 128, 70, 32, 70, 253, 247, 37, 253, 64, 242, - 13, 65, 7, 70, 32, 70, 253, 247, 31, 253, 64, 242, 162, 65, 6, 70, 32, - 70, 253, 247, 25, 253, 64, 242, 162, 65, 5, 70, 32, 70, 253, 247, 19, - 253, 8, 244, 224, 72, 1, 35, 79, 234, 40, 56, 3, 250, 8, 248, 6, 244, - 224, 102, 0, 244, 224, 96, 54, 18, 0, 18, 19, 250, 6, 246, 19, 250, - 0, 240, 95, 250, 137, 249, 31, 250, 136, 248, 193, 68, 255, 178, 79, - 68, 182, 178, 237, 178, 128, 178, 191, 25, 40, 24, 7, 235, 64, 0, 40, - 48, 152, 64, 128, 178, 176, 245, 200, 111, 56, 191, 79, 244, 200, 96, - 189, 232, 248, 131, 79, 244, 200, 112, 189, 232, 248, 131, 112, 181, - 13, 70, 64, 242, 57, 65, 4, 70, 253, 247, 223, 252, 64, 246, 127, 67, - 3, 64, 67, 234, 197, 19, 32, 70, 64, 242, 57, 65, 64, 246, 255, 114, - 155, 178, 189, 232, 112, 64, 253, 247, 193, 190, 112, 181, 12, 28, 24, - 191, 1, 36, 5, 70, 128, 34, 227, 1, 79, 244, 150, 97, 253, 247, 182, - 254, 40, 70, 163, 3, 79, 244, 150, 97, 79, 244, 128, 66, 253, 247, 174, - 254, 40, 70, 64, 242, 59, 65, 64, 34, 163, 1, 189, 232, 112, 64, 253, - 247, 165, 190, 112, 181, 12, 70, 5, 70, 255, 247, 108, 254, 98, 136, - 35, 136, 6, 70, 67, 234, 2, 35, 40, 70, 64, 242, 181, 65, 79, 246, 255, - 114, 155, 178, 253, 247, 147, 254, 54, 2, 163, 136, 182, 178, 40, 70, - 51, 67, 64, 242, 251, 65, 71, 246, 255, 114, 253, 247, 136, 254, 98, - 136, 35, 136, 40, 70, 67, 234, 2, 35, 64, 242, 252, 65, 79, 246, 255, - 114, 155, 178, 253, 247, 124, 254, 163, 136, 40, 70, 71, 246, 255, 114, - 51, 67, 64, 242, 253, 65, 253, 247, 115, 254, 40, 70, 225, 136, 255, - 247, 152, 255, 40, 70, 1, 33, 189, 232, 112, 64, 255, 247, 168, 191, - 112, 181, 12, 28, 24, 191, 1, 36, 5, 70, 35, 2, 79, 244, 150, 97, 79, - 244, 128, 114, 253, 247, 93, 254, 1, 34, 40, 70, 64, 242, 76, 65, 35, - 70, 253, 247, 86, 254, 35, 3, 40, 70, 79, 244, 150, 97, 79, 244, 128, - 82, 253, 247, 78, 254, 99, 3, 40, 70, 79, 244, 150, 97, 79, 244, 0, - 82, 253, 247, 70, 254, 32, 34, 99, 1, 40, 70, 79, 244, 150, 97, 253, - 247, 63, 254, 99, 2, 40, 70, 64, 242, 174, 65, 79, 244, 0, 114, 253, - 247, 55, 254, 181, 248, 218, 48, 3, 244, 112, 67, 179, 245, 0, 95, 16, - 209, 40, 70, 163, 2, 79, 244, 150, 97, 79, 244, 128, 98, 253, 247, 40, - 254, 40, 70, 64, 242, 229, 65, 8, 34, 227, 0, 189, 232, 112, 64, 253, - 247, 31, 190, 112, 189, 9, 2, 112, 181, 140, 178, 35, 70, 64, 242, 251, - 65, 79, 244, 254, 66, 5, 70, 253, 247, 19, 254, 40, 70, 64, 242, 253, - 65, 79, 244, 254, 66, 35, 70, 189, 232, 112, 64, 253, 247, 9, 190, 112, - 181, 14, 70, 4, 70, 21, 70, 51, 70, 64, 242, 69, 97, 64, 242, 255, 50, - 253, 247, 254, 253, 32, 70, 43, 70, 64, 242, 70, 97, 64, 242, 255, 50, - 253, 247, 246, 253, 32, 70, 51, 70, 64, 242, 71, 97, 64, 242, 255, 50, - 253, 247, 238, 253, 32, 70, 43, 70, 79, 244, 201, 97, 64, 242, 255, - 50, 253, 247, 230, 253, 32, 70, 51, 70, 64, 242, 73, 97, 64, 242, 255, - 50, 253, 247, 222, 253, 32, 70, 64, 242, 74, 97, 64, 242, 255, 50, 43, - 70, 189, 232, 112, 64, 253, 247, 212, 189, 1, 73, 12, 34, 253, 247, - 226, 189, 220, 234, 1, 0, 45, 233, 240, 71, 31, 70, 189, 248, 44, 80, - 189, 248, 36, 48, 189, 248, 32, 224, 137, 70, 144, 70, 189, 248, 40, - 16, 5, 240, 3, 2, 3, 240, 15, 3, 66, 234, 3, 35, 67, 234, 14, 51, 79, - 234, 129, 30, 95, 250, 142, 254, 67, 234, 14, 3, 1, 240, 3, 1, 67, 234, - 1, 19, 67, 234, 130, 3, 64, 242, 182, 65, 79, 246, 255, 114, 155, 178, - 4, 70, 189, 248, 48, 96, 253, 247, 163, 253, 15, 34, 7, 234, 2, 3, 239, - 2, 32, 70, 64, 242, 183, 65, 191, 178, 253, 247, 153, 253, 54, 3, 59, - 70, 32, 70, 64, 242, 177, 65, 79, 244, 96, 82, 253, 247, 144, 253, 182, - 178, 6, 34, 32, 70, 33, 73, 253, 247, 156, 253, 32, 70, 64, 242, 174, - 65, 79, 244, 112, 66, 51, 70, 253, 247, 130, 253, 79, 234, 72, 35, 32, - 70, 64, 242, 177, 65, 79, 244, 0, 114, 3, 244, 126, 67, 253, 247, 119, - 253, 1, 34, 217, 241, 1, 3, 56, 191, 0, 35, 32, 70, 64, 242, 77, 65, - 253, 247, 109, 253, 180, 248, 218, 48, 3, 244, 112, 67, 179, 245, 0, - 95, 17, 209, 32, 70, 64, 242, 177, 65, 79, 244, 192, 82, 59, 70, 253, - 247, 94, 253, 237, 0, 79, 246, 248, 115, 32, 70, 64, 242, 230, 65, 24, - 34, 43, 64, 253, 247, 84, 253, 32, 70, 64, 242, 174, 65, 79, 244, 112, - 66, 51, 70, 189, 232, 240, 71, 253, 247, 74, 189, 16, 239, 1, 0, 16, - 181, 4, 70, 134, 176, 49, 185, 15, 73, 14, 34, 6, 176, 189, 232, 16, - 64, 253, 247, 79, 189, 9, 34, 12, 73, 253, 247, 75, 253, 0, 33, 3, 34, - 6, 35, 0, 147, 2, 146, 4, 35, 3, 146, 32, 70, 10, 70, 4, 145, 1, 147, - 255, 247, 94, 255, 32, 70, 1, 33, 6, 176, 189, 232, 16, 64, 255, 247, - 188, 190, 0, 191, 8, 232, 1, 0, 2, 233, 1, 0, 208, 248, 168, 48, 211, - 248, 116, 21, 41, 177, 195, 105, 79, 244, 32, 114, 152, 104, 243, 243, - 101, 179, 112, 71, 248, 181, 208, 248, 168, 48, 6, 70, 211, 248, 124, - 85, 211, 248, 120, 117, 0, 36, 13, 224, 20, 35, 99, 67, 233, 24, 10, - 105, 73, 104, 240, 105, 74, 67, 128, 104, 233, 88, 210, 8, 243, 243, - 78, 243, 1, 52, 228, 178, 188, 66, 239, 211, 248, 189, 56, 181, 208, - 248, 168, 64, 5, 70, 212, 248, 124, 53, 115, 177, 1, 33, 255, 247, 219, - 255, 234, 105, 212, 248, 120, 53, 144, 104, 20, 34, 90, 67, 212, 248, - 124, 21, 189, 232, 56, 64, 243, 243, 51, 179, 56, 189, 0, 245, 152, - 83, 25, 105, 16, 181, 4, 70, 41, 177, 195, 105, 66, 246, 8, 82, 152, - 104, 243, 243, 38, 243, 32, 70, 255, 247, 179, 255, 32, 70, 255, 247, - 215, 255, 227, 105, 212, 248, 168, 16, 152, 104, 64, 242, 204, 82, 189, - 232, 16, 64, 243, 243, 22, 179, 16, 181, 79, 244, 128, 82, 4, 70, 0, - 35, 64, 242, 201, 97, 253, 247, 189, 252, 212, 248, 168, 48, 179, 248, - 194, 36, 210, 177, 147, 248, 233, 51, 32, 70, 160, 43, 64, 242, 137, - 97, 1, 209, 35, 34, 0, 224, 48, 34, 253, 247, 198, 250, 212, 248, 168, - 48, 179, 248, 194, 52, 2, 43, 14, 209, 79, 244, 128, 82, 32, 70, 64, - 242, 201, 97, 19, 70, 253, 247, 158, 252, 5, 224, 32, 70, 64, 242, 137, - 97, 35, 34, 253, 247, 177, 250, 32, 70, 4, 34, 39, 73, 253, 247, 164, - 252, 32, 70, 0, 34, 64, 242, 121, 97, 253, 247, 166, 250, 32, 70, 8, - 34, 34, 73, 253, 247, 153, 252, 212, 248, 168, 48, 32, 70, 179, 248, - 194, 36, 79, 244, 217, 97, 253, 247, 152, 250, 32, 70, 6, 34, 28, 73, - 253, 247, 139, 252, 212, 248, 168, 48, 79, 244, 128, 114, 179, 248, - 194, 52, 32, 70, 26, 65, 1, 58, 79, 244, 208, 97, 146, 178, 253, 247, - 133, 250, 212, 248, 168, 48, 79, 244, 160, 114, 179, 248, 194, 52, 32, - 70, 26, 65, 1, 58, 146, 178, 64, 242, 129, 97, 253, 247, 119, 250, 212, - 248, 168, 48, 32, 70, 179, 248, 194, 52, 64, 242, 127, 97, 1, 59, 155, - 178, 1, 43, 154, 191, 8, 74, 210, 92, 52, 34, 253, 247, 103, 250, 7, - 73, 32, 70, 14, 34, 189, 232, 16, 64, 253, 247, 88, 188, 68, 239, 1, - 0, 76, 239, 1, 0, 92, 239, 1, 0, 172, 234, 1, 0, 40, 239, 1, 0, 112, - 181, 64, 242, 60, 65, 4, 70, 253, 247, 69, 250, 64, 242, 59, 65, 6, - 70, 32, 70, 253, 247, 63, 250, 70, 240, 1, 2, 5, 70, 64, 242, 60, 65, - 32, 70, 146, 178, 253, 247, 65, 250, 69, 240, 1, 2, 32, 70, 64, 242, - 59, 65, 146, 178, 253, 247, 57, 250, 79, 246, 254, 114, 32, 70, 50, - 64, 64, 242, 60, 65, 253, 247, 49, 250, 79, 246, 254, 114, 32, 70, 42, - 64, 64, 242, 59, 65, 253, 247, 41, 250, 32, 70, 50, 70, 64, 242, 60, - 65, 253, 247, 35, 250, 32, 70, 64, 242, 59, 65, 42, 70, 189, 232, 112, - 64, 253, 247, 27, 186, 128, 34, 56, 181, 13, 70, 19, 70, 64, 242, 209, - 97, 4, 70, 253, 247, 248, 251, 13, 177, 1, 45, 5, 209, 32, 70, 79, 244, - 218, 97, 15, 34, 253, 247, 9, 250, 32, 70, 189, 232, 56, 64, 255, 247, - 174, 191, 45, 233, 240, 65, 13, 70, 176, 248, 218, 16, 4, 70, 1, 244, - 112, 65, 177, 245, 0, 95, 20, 191, 165, 33, 137, 33, 31, 70, 22, 70, - 253, 247, 171, 249, 180, 248, 218, 16, 0, 240, 15, 8, 1, 244, 112, 65, - 177, 245, 0, 95, 20, 191, 165, 33, 137, 33, 32, 70, 253, 247, 157, 249, - 0, 240, 240, 0, 168, 235, 16, 24, 133, 248, 0, 128, 180, 248, 218, 16, - 32, 70, 1, 244, 112, 65, 177, 245, 0, 95, 20, 191, 166, 33, 138, 33, - 253, 247, 139, 249, 180, 248, 218, 16, 0, 240, 15, 5, 1, 244, 112, 65, - 177, 245, 0, 95, 20, 191, 166, 33, 138, 33, 32, 70, 253, 247, 125, 249, - 0, 240, 240, 0, 165, 235, 16, 21, 53, 112, 180, 248, 218, 16, 32, 70, - 1, 244, 112, 65, 177, 245, 0, 95, 20, 191, 167, 33, 139, 33, 253, 247, - 108, 249, 180, 248, 218, 16, 0, 240, 15, 5, 1, 244, 112, 65, 177, 245, - 0, 95, 20, 191, 167, 33, 139, 33, 32, 70, 253, 247, 94, 249, 0, 240, - 240, 0, 165, 235, 16, 21, 61, 112, 180, 248, 218, 16, 32, 70, 1, 244, - 112, 65, 177, 245, 0, 95, 20, 191, 168, 33, 140, 33, 253, 247, 77, 249, - 180, 248, 218, 16, 0, 240, 15, 5, 1, 244, 112, 65, 32, 70, 177, 245, - 0, 95, 20, 191, 168, 33, 140, 33, 253, 247, 63, 249, 6, 155, 0, 240, - 240, 0, 165, 235, 16, 21, 29, 112, 189, 232, 240, 129, 0, 0, 16, 181, - 208, 248, 168, 48, 4, 70, 147, 248, 233, 51, 160, 43, 3, 209, 17, 73, - 4, 34, 253, 247, 106, 251, 32, 70, 79, 244, 142, 113, 0, 34, 253, 247, - 59, 249, 32, 70, 13, 73, 24, 34, 253, 247, 95, 251, 4, 245, 152, 83, - 219, 137, 11, 177, 155, 178, 0, 224, 12, 35, 32, 70, 255, 34, 64, 242, - 52, 97, 253, 247, 64, 251, 5, 73, 32, 70, 9, 34, 189, 232, 16, 64, 253, - 247, 75, 187, 0, 191, 112, 239, 1, 0, 120, 239, 1, 0, 168, 239, 1, 0, - 176, 248, 218, 16, 16, 181, 1, 244, 112, 65, 4, 70, 177, 245, 0, 95, - 20, 191, 165, 33, 137, 33, 136, 34, 253, 247, 13, 249, 180, 248, 218, - 16, 32, 70, 1, 244, 112, 65, 177, 245, 0, 95, 20, 191, 166, 33, 138, - 33, 136, 34, 253, 247, 0, 249, 180, 248, 218, 16, 32, 70, 1, 244, 112, - 65, 177, 245, 0, 95, 20, 191, 167, 33, 139, 33, 136, 34, 253, 247, 243, - 248, 180, 248, 218, 16, 32, 70, 1, 244, 112, 65, 177, 245, 0, 95, 20, - 191, 168, 33, 140, 33, 136, 34, 189, 232, 16, 64, 253, 247, 228, 184, - 0, 0, 112, 181, 5, 70, 14, 70, 0, 36, 7, 75, 50, 91, 25, 91, 40, 70, - 2, 52, 253, 247, 216, 248, 24, 44, 246, 209, 4, 73, 40, 70, 34, 70, - 189, 232, 112, 64, 253, 247, 248, 186, 86, 238, 1, 0, 58, 234, 1, 0, - 112, 181, 4, 34, 13, 70, 7, 73, 6, 70, 253, 247, 237, 250, 0, 36, 5, - 75, 42, 91, 25, 91, 48, 70, 2, 52, 253, 247, 188, 248, 48, 44, 246, - 209, 112, 189, 250, 232, 1, 0, 216, 235, 1, 0, 45, 233, 240, 65, 4, - 70, 31, 70, 21, 70, 176, 248, 218, 128, 255, 247, 114, 249, 8, 244, - 112, 72, 184, 245, 0, 95, 20, 191, 79, 240, 165, 8, 79, 240, 137, 8, - 2, 70, 65, 70, 32, 70, 157, 248, 24, 96, 253, 247, 156, 248, 41, 70, - 32, 70, 255, 247, 94, 249, 180, 248, 218, 128, 2, 70, 8, 244, 112, 72, - 184, 245, 0, 95, 20, 191, 79, 240, 166, 8, 79, 240, 138, 8, 32, 70, - 65, 70, 253, 247, 136, 248, 57, 70, 32, 70, 255, 247, 74, 249, 180, - 248, 218, 80, 2, 70, 5, 244, 112, 69, 181, 245, 0, 95, 20, 191, 167, - 37, 139, 37, 32, 70, 41, 70, 253, 247, 118, 248, 49, 70, 32, 70, 255, - 247, 56, 249, 180, 248, 218, 80, 2, 70, 5, 244, 112, 69, 181, 245, 0, - 95, 20, 191, 168, 37, 140, 37, 32, 70, 41, 70, 189, 232, 240, 65, 253, - 247, 98, 184, 0, 0, 1, 41, 112, 181, 4, 70, 13, 70, 22, 209, 6, 34, - 41, 73, 253, 247, 129, 250, 32, 70, 58, 33, 42, 70, 43, 70, 253, 247, - 39, 250, 8, 34, 32, 70, 19, 70, 79, 244, 141, 113, 253, 247, 32, 250, - 32, 70, 127, 33, 0, 34, 253, 247, 70, 248, 50, 224, 121, 185, 31, 73, - 6, 34, 253, 247, 105, 250, 32, 70, 58, 33, 1, 34, 43, 70, 253, 247, - 15, 250, 8, 34, 32, 70, 79, 244, 141, 113, 19, 70, 31, 224, 2, 41, 31, - 209, 176, 248, 218, 48, 125, 33, 3, 244, 112, 67, 179, 245, 0, 95, 1, - 209, 3, 34, 0, 224, 42, 70, 253, 247, 37, 248, 32, 70, 40, 33, 15, 34, - 1, 35, 253, 247, 244, 249, 128, 34, 19, 70, 32, 70, 79, 244, 137, 113, - 253, 247, 237, 249, 32, 70, 5, 33, 7, 34, 2, 35, 253, 247, 231, 249, - 32, 70, 64, 242, 55, 97, 79, 244, 64, 66, 0, 35, 189, 232, 112, 64, - 253, 247, 31, 186, 0, 191, 18, 238, 1, 0, 30, 238, 1, 0, 45, 233, 241, - 79, 208, 248, 168, 48, 4, 70, 147, 248, 10, 144, 147, 248, 12, 160, - 221, 122, 222, 124, 73, 244, 0, 121, 26, 125, 73, 234, 5, 25, 147, 248, - 22, 176, 15, 250, 138, 245, 147, 248, 23, 128, 73, 234, 5, 53, 70, 244, - 0, 118, 173, 178, 70, 234, 2, 22, 35, 73, 9, 34, 75, 244, 0, 123, 95, - 125, 75, 234, 8, 27, 147, 248, 24, 128, 253, 247, 4, 250, 32, 70, 43, - 70, 64, 242, 219, 65, 71, 242, 255, 50, 253, 247, 234, 249, 32, 70, - 43, 70, 64, 242, 220, 65, 71, 242, 255, 50, 253, 247, 226, 249, 70, - 234, 7, 54, 32, 70, 43, 70, 64, 242, 10, 65, 71, 242, 255, 50, 253, - 247, 216, 249, 75, 234, 8, 56, 32, 70, 179, 178, 64, 242, 11, 65, 71, - 242, 255, 50, 253, 247, 206, 249, 32, 70, 31, 250, 136, 243, 64, 242, - 12, 65, 71, 242, 255, 50, 253, 247, 197, 249, 32, 34, 32, 70, 130, 33, - 19, 70, 253, 247, 125, 249, 1, 34, 32, 70, 124, 33, 19, 70, 1, 176, - 189, 232, 240, 79, 253, 247, 116, 185, 202, 231, 1, 0, 112, 181, 6, - 34, 13, 70, 69, 73, 4, 70, 253, 247, 191, 249, 0, 38, 67, 75, 32, 70, - 153, 91, 252, 247, 121, 255, 168, 83, 2, 54, 24, 46, 246, 209, 7, 33, - 1, 34, 32, 70, 252, 247, 135, 255, 16, 34, 255, 33, 19, 70, 32, 70, - 253, 247, 86, 249, 4, 34, 19, 70, 32, 70, 64, 242, 31, 17, 253, 247, - 79, 249, 12, 34, 32, 70, 54, 73, 253, 247, 158, 249, 1, 34, 58, 33, - 19, 70, 32, 70, 253, 247, 68, 249, 4, 34, 58, 33, 19, 70, 32, 70, 253, - 247, 62, 249, 8, 34, 19, 70, 32, 70, 79, 244, 141, 113, 253, 247, 55, - 249, 8, 34, 5, 33, 19, 70, 32, 70, 253, 247, 49, 249, 1, 34, 19, 70, - 32, 70, 79, 244, 141, 113, 253, 247, 42, 249, 18, 34, 32, 70, 36, 73, - 253, 247, 121, 249, 32, 34, 130, 33, 19, 70, 32, 70, 253, 247, 31, 249, - 180, 248, 218, 48, 3, 244, 112, 67, 179, 245, 0, 95, 9, 209, 212, 248, - 168, 48, 158, 122, 218, 122, 70, 244, 0, 118, 70, 234, 2, 22, 29, 123, - 1, 224, 0, 37, 46, 70, 1, 34, 32, 70, 19, 70, 79, 244, 155, 97, 253, - 247, 71, 249, 32, 70, 179, 0, 79, 244, 155, 97, 64, 246, 252, 114, 253, - 247, 63, 249, 2, 34, 32, 70, 19, 70, 79, 244, 155, 97, 253, 247, 56, - 249, 43, 3, 32, 70, 79, 244, 155, 97, 79, 244, 224, 66, 3, 244, 112, - 67, 253, 247, 46, 249, 7, 73, 32, 70, 6, 34, 189, 232, 112, 64, 253, - 247, 57, 185, 0, 191, 28, 240, 1, 0, 86, 238, 1, 0, 178, 232, 1, 0, - 202, 232, 1, 0, 238, 232, 1, 0, 56, 181, 208, 248, 168, 80, 4, 70, 255, - 34, 181, 248, 102, 51, 64, 242, 52, 65, 253, 247, 17, 249, 181, 248, - 100, 51, 32, 70, 255, 34, 64, 242, 35, 65, 253, 247, 9, 249, 32, 70, - 181, 248, 104, 35, 79, 244, 170, 97, 252, 247, 28, 255, 32, 70, 4, 73, - 4, 34, 253, 247, 15, 249, 20, 32, 189, 232, 56, 64, 242, 243, 124, 180, - 208, 235, 1, 0, 45, 233, 240, 71, 195, 105, 208, 248, 168, 64, 27, 109, - 15, 70, 64, 242, 35, 65, 3, 244, 128, 88, 5, 70, 148, 248, 68, 163, - 252, 247, 245, 254, 64, 242, 52, 65, 6, 70, 40, 70, 252, 247, 239, 254, - 56, 70, 255, 247, 69, 248, 148, 248, 68, 35, 184, 241, 0, 15, 12, 191, - 79, 240, 9, 8, 79, 240, 6, 8, 148, 248, 72, 51, 180, 248, 100, 115, - 0, 42, 0, 240, 140, 128, 255, 26, 246, 178, 63, 24, 191, 27, 79, 250, - 135, 249, 185, 241, 0, 15, 30, 218, 235, 105, 40, 70, 27, 109, 3, 244, - 128, 83, 0, 43, 20, 191, 3, 34, 8, 34, 201, 241, 0, 3, 12, 191, 11, - 33, 4, 33, 154, 66, 168, 191, 26, 70, 180, 248, 104, 51, 1, 251, 2, - 50, 79, 244, 170, 97, 146, 178, 252, 247, 196, 254, 25, 241, 3, 15, - 6, 218, 242, 28, 5, 224, 185, 241, 3, 15, 1, 221, 242, 30, 0, 224, 50, - 70, 180, 248, 100, 51, 18, 178, 25, 178, 200, 28, 130, 66, 2, 221, 3, - 51, 155, 178, 3, 224, 138, 66, 184, 191, 10, 70, 147, 178, 186, 241, - 0, 15, 18, 208, 26, 178, 178, 66, 15, 208, 40, 70, 64, 242, 35, 65, - 255, 34, 253, 247, 133, 248, 40, 70, 35, 73, 4, 34, 253, 247, 146, 248, - 20, 32, 242, 243, 1, 244, 0, 38, 0, 224, 1, 38, 180, 248, 102, 35, 127, - 178, 17, 178, 200, 235, 1, 0, 127, 66, 135, 66, 187, 178, 188, 191, - 200, 235, 2, 3, 155, 178, 24, 178, 9, 49, 136, 66, 200, 191, 2, 241, - 9, 3, 181, 248, 218, 32, 200, 191, 155, 178, 2, 244, 112, 66, 178, 245, - 0, 95, 12, 191, 148, 249, 75, 131, 148, 249, 76, 131, 67, 68, 155, 178, - 186, 241, 0, 15, 5, 208, 40, 70, 64, 242, 52, 65, 255, 34, 253, 247, - 79, 248, 40, 70, 64, 242, 35, 65, 252, 247, 89, 254, 148, 248, 188, - 51, 132, 248, 189, 3, 132, 248, 190, 3, 132, 248, 191, 51, 0, 224, 1, - 38, 48, 70, 189, 232, 240, 135, 0, 191, 36, 232, 1, 0, 45, 233, 240, - 65, 4, 70, 15, 70, 144, 70, 53, 73, 6, 34, 30, 70, 6, 157, 253, 247, - 65, 248, 32, 70, 64, 242, 130, 65, 79, 246, 255, 114, 59, 70, 253, 247, - 39, 248, 32, 70, 64, 242, 129, 65, 255, 34, 67, 70, 253, 247, 32, 248, - 62, 185, 32, 70, 64, 242, 129, 65, 79, 244, 128, 114, 51, 70, 253, 247, - 23, 248, 32, 70, 38, 73, 3, 34, 253, 247, 36, 248, 189, 248, 28, 48, - 10, 39, 95, 67, 0, 38, 5, 224, 190, 66, 54, 220, 100, 32, 242, 243, - 139, 243, 1, 54, 32, 70, 64, 242, 129, 65, 252, 247, 16, 254, 131, 5, - 242, 212, 64, 242, 131, 65, 32, 70, 252, 247, 9, 254, 64, 242, 132, - 65, 6, 70, 32, 70, 252, 247, 3, 254, 64, 234, 6, 64, 40, 96, 64, 242, - 133, 65, 32, 70, 252, 247, 251, 253, 64, 242, 134, 65, 6, 70, 32, 70, - 252, 247, 245, 253, 64, 234, 6, 64, 104, 96, 64, 242, 135, 65, 32, 70, - 252, 247, 237, 253, 79, 244, 145, 97, 6, 70, 32, 70, 252, 247, 231, - 253, 64, 234, 6, 64, 168, 96, 1, 37, 0, 224, 0, 37, 32, 70, 5, 73, 6, - 34, 252, 247, 223, 255, 40, 70, 189, 232, 240, 129, 8, 236, 1, 0, 110, - 238, 1, 0, 146, 232, 1, 0, 112, 181, 64, 242, 74, 65, 5, 70, 252, 247, - 205, 253, 64, 240, 68, 0, 134, 178, 79, 246, 191, 116, 40, 70, 50, 70, - 52, 64, 64, 242, 74, 65, 252, 247, 204, 253, 34, 70, 40, 70, 64, 242, - 74, 65, 252, 247, 198, 253, 4, 32, 242, 243, 45, 243, 79, 246, 187, - 114, 40, 70, 64, 242, 74, 65, 34, 64, 189, 232, 112, 64, 252, 247, 185, - 189, 56, 181, 5, 70, 65, 242, 137, 52, 4, 224, 100, 32, 242, 243, 27, - 243, 1, 60, 7, 208, 40, 70, 64, 242, 81, 65, 252, 247, 159, 253, 16, - 244, 64, 79, 242, 209, 40, 70, 64, 242, 81, 65, 252, 247, 151, 253, - 16, 244, 64, 79, 20, 191, 0, 32, 1, 32, 56, 189, 64, 242, 76, 65, 79, - 246, 252, 114, 252, 247, 97, 191, 56, 181, 195, 105, 4, 70, 13, 70, - 24, 105, 142, 33, 60, 240, 198, 218, 227, 105, 65, 25, 24, 105, 73, - 0, 189, 232, 56, 64, 60, 240, 190, 154, 45, 233, 240, 65, 12, 70, 39, - 33, 5, 70, 23, 70, 255, 247, 232, 255, 16, 240, 1, 6, 29, 191, 79, 246, - 240, 118, 6, 64, 79, 246, 240, 120, 79, 240, 1, 8, 40, 33, 40, 70, 255, - 247, 218, 255, 0, 234, 8, 0, 176, 66, 10, 208, 1, 60, 99, 28, 0, 43, - 2, 221, 20, 32, 242, 243, 207, 242, 0, 44, 238, 220, 0, 32, 0, 224, - 1, 32, 7, 177, 60, 96, 189, 232, 240, 129, 195, 105, 112, 181, 4, 70, - 13, 70, 24, 105, 142, 33, 22, 70, 60, 240, 139, 218, 227, 105, 65, 25, - 24, 105, 73, 0, 50, 70, 189, 232, 112, 64, 60, 240, 160, 154, 112, 181, - 4, 70, 208, 248, 168, 80, 14, 70, 137, 179, 64, 242, 218, 97, 66, 242, - 8, 2, 252, 247, 22, 255, 32, 70, 64, 242, 166, 81, 5, 34, 252, 247, - 56, 253, 32, 70, 64, 242, 162, 81, 195, 34, 252, 247, 50, 253, 32, 70, - 64, 242, 165, 81, 7, 34, 252, 247, 44, 253, 32, 70, 64, 242, 131, 81, - 79, 244, 72, 114, 252, 247, 37, 253, 32, 70, 64, 242, 132, 81, 0, 34, - 252, 247, 31, 253, 32, 70, 64, 242, 133, 81, 79, 244, 0, 114, 252, 247, - 24, 253, 32, 70, 64, 242, 134, 81, 0, 34, 252, 247, 18, 253, 32, 70, - 39, 33, 255, 247, 120, 255, 30, 177, 64, 240, 1, 6, 182, 178, 2, 224, - 79, 246, 254, 118, 6, 64, 149, 248, 148, 51, 5, 34, 237, 24, 149, 248, - 149, 51, 32, 70, 90, 67, 38, 33, 4, 42, 152, 191, 5, 34, 255, 247, 156, - 255, 16, 54, 182, 178, 32, 70, 39, 33, 50, 70, 189, 232, 112, 64, 255, - 247, 147, 191, 112, 181, 208, 248, 168, 48, 13, 70, 0, 33, 131, 248, - 70, 19, 4, 70, 255, 247, 155, 255, 21, 177, 32, 70, 255, 247, 171, 253, - 3, 34, 32, 70, 19, 70, 64, 246, 122, 1, 252, 247, 192, 254, 32, 70, - 64, 242, 218, 97, 66, 242, 8, 2, 0, 35, 189, 232, 112, 64, 252, 247, - 182, 190, 16, 181, 0, 33, 4, 70, 255, 247, 220, 255, 32, 70, 189, 232, - 16, 64, 254, 247, 68, 190, 112, 181, 1, 34, 4, 70, 64, 246, 5, 1, 208, - 248, 168, 80, 252, 247, 149, 254, 32, 70, 7, 34, 5, 35, 64, 242, 47, - 65, 252, 247, 156, 254, 32, 70, 48, 33, 248, 35, 79, 244, 255, 98, 252, - 247, 149, 254, 6, 35, 32, 70, 48, 33, 7, 34, 252, 247, 143, 254, 32, - 70, 64, 242, 20, 65, 65, 246, 16, 98, 252, 247, 162, 252, 32, 70, 64, - 242, 21, 65, 79, 244, 200, 98, 252, 247, 155, 252, 79, 244, 119, 67, - 32, 70, 64, 242, 223, 65, 79, 244, 127, 66, 252, 247, 120, 254, 32, - 70, 255, 247, 177, 254, 32, 70, 39, 34, 12, 73, 252, 247, 130, 254, - 32, 70, 255, 34, 181, 248, 198, 53, 64, 242, 50, 65, 252, 247, 104, - 254, 181, 248, 200, 53, 79, 244, 127, 66, 27, 2, 32, 70, 64, 242, 50, - 65, 19, 64, 189, 232, 112, 64, 252, 247, 91, 190, 0, 191, 116, 238, - 1, 0, 0, 41, 20, 191, 2, 35, 0, 35, 16, 181, 0, 42, 24, 191, 67, 240, - 1, 3, 64, 242, 77, 65, 3, 34, 4, 70, 252, 247, 73, 254, 32, 70, 64, - 242, 76, 65, 3, 34, 189, 232, 16, 64, 252, 247, 51, 190, 0, 0, 45, 233, - 240, 79, 4, 70, 197, 176, 0, 38, 1, 145, 21, 70, 67, 150, 66, 150, 252, - 247, 206, 253, 227, 105, 79, 240, 128, 81, 24, 105, 10, 70, 60, 240, - 96, 217, 5, 32, 242, 243, 175, 241, 51, 70, 32, 70, 79, 244, 137, 97, - 79, 244, 128, 66, 252, 247, 35, 254, 79, 244, 168, 66, 32, 70, 64, 242, - 85, 65, 252, 247, 54, 252, 64, 242, 86, 65, 32, 70, 252, 247, 38, 252, - 0, 240, 15, 0, 5, 40, 12, 191, 79, 244, 168, 66, 69, 242, 1, 66, 32, - 70, 64, 242, 85, 65, 252, 247, 36, 252, 0, 38, 79, 240, 160, 8, 177, - 70, 178, 70, 55, 70, 64, 242, 86, 65, 32, 70, 252, 247, 14, 252, 0, - 9, 79, 234, 0, 91, 64, 242, 87, 65, 32, 70, 252, 247, 6, 252, 79, 234, - 27, 91, 184, 241, 144, 15, 75, 234, 0, 59, 31, 220, 127, 46, 29, 220, - 79, 234, 139, 67, 155, 12, 179, 245, 0, 95, 200, 191, 163, 245, 128, - 67, 3, 245, 0, 98, 178, 245, 128, 95, 35, 216, 2, 169, 33, 248, 26, - 48, 68, 169, 1, 235, 137, 2, 82, 248, 8, 28, 202, 68, 203, 24, 66, 248, - 8, 60, 138, 240, 64, 10, 137, 240, 1, 9, 1, 54, 79, 234, 27, 59, 11, - 240, 12, 11, 75, 234, 7, 27, 24, 240, 1, 15, 79, 246, 204, 119, 11, - 234, 7, 7, 2, 208, 251, 178, 64, 43, 2, 209, 184, 241, 1, 8, 184, 209, - 227, 105, 0, 34, 24, 105, 79, 240, 128, 81, 60, 240, 232, 216, 32, 70, - 252, 247, 80, 253, 66, 155, 155, 17, 66, 147, 67, 155, 155, 17, 128, - 46, 67, 147, 36, 209, 0, 35, 65, 169, 24, 70, 14, 224, 66, 234, 7, 12, - 2, 172, 52, 249, 28, 192, 1, 50, 198, 235, 12, 4, 64, 42, 4, 251, 4, - 0, 243, 209, 1, 51, 2, 43, 4, 208, 159, 1, 81, 248, 4, 111, 0, 34, 235, - 231, 1, 156, 40, 96, 128, 9, 32, 96, 6, 75, 160, 245, 58, 96, 24, 56, - 152, 66, 140, 191, 0, 32, 1, 32, 0, 224, 0, 32, 69, 176, 189, 232, 240, - 143, 72, 244, 255, 15, 56, 181, 4, 70, 8, 70, 254, 247, 227, 252, 227, - 105, 160, 241, 157, 5, 160, 33, 24, 105, 60, 240, 198, 216, 42, 178, - 111, 240, 97, 3, 154, 66, 184, 191, 26, 70, 193, 178, 82, 178, 32, 70, - 189, 232, 56, 64, 253, 247, 184, 188, 45, 233, 240, 79, 0, 245, 130, - 83, 27, 121, 215, 176, 4, 70, 13, 70, 208, 248, 168, 112, 0, 43, 0, - 240, 118, 130, 195, 105, 106, 33, 24, 105, 60, 240, 167, 216, 64, 0, - 134, 178, 0, 46, 0, 240, 108, 130, 32, 70, 254, 247, 244, 252, 227, - 105, 2, 70, 16, 185, 24, 105, 49, 70, 96, 226, 24, 105, 49, 70, 60, - 240, 149, 216, 1, 40, 0, 240, 92, 130, 6, 241, 110, 3, 155, 178, 4, - 147, 6, 241, 170, 3, 6, 241, 6, 11, 6, 241, 58, 10, 155, 178, 31, 250, - 139, 251, 31, 250, 138, 250, 5, 147, 0, 45, 0, 240, 56, 130, 32, 70, - 64, 242, 249, 65, 252, 247, 55, 251, 2, 7, 0, 241, 65, 130, 6, 173, - 171, 28, 1, 147, 26, 171, 2, 147, 13, 241, 106, 3, 3, 147, 32, 70, 0, - 35, 64, 242, 118, 65, 64, 242, 255, 18, 0, 149, 252, 247, 91, 253, 43, - 29, 0, 147, 171, 29, 1, 147, 27, 171, 2, 147, 13, 241, 110, 3, 3, 147, - 32, 70, 0, 35, 64, 242, 119, 65, 64, 242, 255, 18, 252, 247, 74, 253, - 5, 241, 8, 3, 0, 147, 5, 241, 10, 3, 1, 147, 28, 171, 2, 147, 13, 241, - 114, 3, 3, 147, 32, 70, 64, 242, 170, 65, 72, 242, 255, 18, 72, 242, - 127, 3, 252, 247, 54, 253, 5, 241, 12, 3, 0, 147, 5, 241, 14, 3, 1, - 147, 29, 171, 22, 34, 2, 147, 13, 241, 118, 3, 3, 147, 32, 70, 19, 70, - 64, 242, 59, 65, 252, 247, 36, 253, 5, 241, 16, 3, 0, 147, 5, 241, 18, - 3, 1, 147, 30, 171, 2, 147, 13, 241, 122, 3, 70, 34, 3, 147, 32, 70, - 0, 35, 64, 242, 60, 65, 252, 247, 18, 253, 180, 248, 218, 48, 5, 241, - 20, 2, 3, 244, 112, 67, 179, 245, 0, 95, 5, 241, 22, 3, 141, 232, 12, - 0, 31, 171, 2, 147, 65, 242, 43, 2, 13, 241, 126, 3, 3, 147, 32, 70, - 64, 242, 76, 65, 19, 70, 55, 209, 252, 247, 248, 252, 5, 241, 24, 3, - 0, 147, 5, 241, 26, 3, 1, 147, 32, 171, 2, 147, 13, 241, 130, 3, 3, - 147, 32, 70, 64, 242, 77, 65, 68, 242, 43, 2, 68, 242, 10, 3, 252, 247, - 228, 252, 5, 241, 28, 3, 0, 147, 5, 241, 30, 3, 1, 147, 33, 171, 7, - 34, 2, 147, 13, 241, 134, 3, 3, 147, 32, 70, 19, 70, 64, 242, 249, 65, - 252, 247, 210, 252, 5, 241, 32, 3, 0, 147, 34, 171, 34, 53, 2, 147, - 7, 34, 13, 241, 138, 3, 3, 147, 1, 149, 32, 70, 64, 242, 250, 65, 19, - 70, 54, 224, 252, 247, 192, 252, 5, 241, 24, 3, 0, 147, 5, 241, 26, - 3, 1, 147, 32, 171, 2, 147, 13, 241, 130, 3, 3, 147, 32, 70, 64, 242, - 77, 65, 68, 242, 43, 2, 68, 242, 34, 3, 252, 247, 172, 252, 5, 241, - 28, 3, 0, 147, 5, 241, 30, 3, 1, 147, 33, 171, 7, 34, 2, 147, 13, 241, - 134, 3, 3, 147, 32, 70, 19, 70, 64, 242, 249, 65, 252, 247, 154, 252, - 5, 241, 32, 3, 0, 147, 34, 171, 34, 53, 2, 147, 13, 241, 138, 3, 3, - 147, 1, 149, 32, 70, 64, 242, 250, 65, 7, 34, 0, 35, 252, 247, 137, - 252, 46, 171, 0, 147, 13, 241, 186, 3, 1, 147, 66, 171, 1, 34, 2, 147, - 13, 245, 133, 115, 3, 147, 32, 70, 19, 70, 7, 33, 252, 247, 2, 252, - 47, 171, 0, 147, 13, 241, 190, 3, 1, 147, 67, 171, 16, 34, 2, 147, 13, - 245, 135, 115, 3, 147, 32, 70, 19, 70, 255, 33, 252, 247, 242, 251, - 48, 171, 0, 147, 13, 241, 194, 3, 1, 147, 68, 171, 4, 34, 2, 147, 13, - 245, 137, 115, 3, 147, 32, 70, 19, 70, 64, 242, 31, 17, 252, 247, 225, - 251, 15, 171, 0, 147, 13, 241, 62, 3, 1, 147, 35, 171, 64, 246, 68, - 2, 2, 147, 13, 241, 142, 3, 3, 147, 32, 70, 19, 70, 64, 246, 56, 17, - 252, 247, 70, 252, 16, 171, 0, 147, 13, 241, 66, 3, 1, 147, 36, 171, - 2, 147, 13, 241, 146, 3, 3, 147, 32, 70, 64, 246, 57, 17, 64, 246, 68, - 2, 64, 246, 4, 3, 252, 247, 51, 252, 49, 171, 0, 147, 13, 241, 198, - 3, 1, 147, 69, 171, 1, 34, 2, 147, 13, 245, 139, 115, 3, 147, 32, 70, - 19, 70, 58, 33, 252, 247, 172, 251, 50, 171, 0, 147, 13, 241, 202, 3, - 1, 147, 70, 171, 8, 34, 2, 147, 13, 245, 141, 115, 3, 147, 32, 70, 19, - 70, 79, 244, 141, 113, 252, 247, 155, 251, 51, 171, 0, 147, 13, 241, - 206, 3, 1, 147, 71, 171, 8, 34, 2, 147, 13, 245, 143, 115, 3, 147, 32, - 70, 19, 70, 5, 33, 252, 247, 139, 251, 52, 171, 0, 147, 13, 241, 210, - 3, 1, 147, 72, 171, 4, 34, 2, 147, 13, 245, 145, 115, 3, 147, 32, 70, - 19, 70, 58, 33, 252, 247, 123, 251, 53, 171, 0, 147, 13, 241, 214, 3, - 1, 147, 73, 171, 1, 34, 2, 147, 13, 245, 147, 115, 3, 147, 32, 70, 19, - 70, 79, 244, 141, 113, 252, 247, 106, 251, 17, 171, 0, 147, 13, 241, - 70, 3, 1, 147, 37, 171, 2, 147, 13, 241, 150, 3, 3, 147, 32, 70, 64, - 242, 215, 65, 71, 242, 203, 2, 66, 242, 75, 3, 252, 247, 206, 251, 54, - 171, 0, 147, 13, 241, 218, 3, 1, 147, 74, 171, 32, 34, 2, 147, 13, 245, - 149, 115, 3, 147, 32, 70, 19, 70, 130, 33, 252, 247, 71, 251, 58, 123, - 187, 122, 249, 122, 18, 3, 67, 244, 0, 115, 66, 240, 3, 2, 67, 234, - 1, 19, 66, 234, 131, 3, 18, 170, 0, 146, 13, 241, 74, 2, 1, 146, 38, - 170, 2, 146, 13, 241, 154, 2, 3, 146, 32, 70, 79, 244, 155, 97, 71, - 246, 255, 114, 155, 178, 252, 247, 160, 251, 0, 37, 227, 105, 13, 241, - 24, 9, 24, 105, 5, 235, 11, 1, 57, 248, 5, 32, 59, 240, 190, 222, 227, - 105, 13, 241, 104, 8, 24, 105, 5, 235, 10, 1, 56, 248, 5, 32, 59, 240, - 180, 222, 226, 105, 9, 235, 5, 3, 11, 241, 2, 1, 16, 105, 73, 25, 90, - 136, 59, 240, 170, 222, 226, 105, 8, 235, 5, 3, 10, 241, 2, 1, 16, 105, - 73, 25, 90, 136, 4, 53, 59, 240, 159, 222, 52, 45, 212, 209, 0, 37, - 227, 105, 4, 154, 13, 241, 184, 9, 169, 24, 24, 105, 57, 248, 5, 32, - 59, 240, 146, 222, 227, 105, 13, 245, 132, 120, 24, 105, 5, 155, 56, - 248, 5, 32, 233, 24, 59, 240, 136, 222, 4, 155, 226, 105, 153, 28, 9, - 235, 5, 3, 16, 105, 73, 25, 90, 136, 59, 240, 126, 222, 5, 155, 226, - 105, 153, 28, 8, 235, 5, 3, 16, 105, 73, 25, 90, 136, 4, 53, 59, 240, - 115, 222, 36, 45, 212, 209, 227, 105, 177, 28, 24, 105, 13, 34, 59, - 240, 107, 222, 227, 105, 49, 29, 24, 105, 9, 34, 59, 240, 101, 222, - 227, 105, 6, 241, 230, 1, 26, 106, 24, 105, 199, 248, 56, 36, 183, 248, - 60, 36, 59, 240, 90, 222, 227, 105, 49, 70, 24, 105, 1, 34, 59, 240, - 84, 222, 87, 176, 189, 232, 240, 143, 0, 0, 56, 181, 91, 33, 4, 70, - 253, 34, 252, 247, 123, 250, 32, 70, 4, 33, 64, 34, 252, 247, 132, 250, - 32, 70, 79, 244, 144, 113, 16, 34, 252, 247, 126, 250, 32, 70, 120, - 33, 128, 34, 252, 247, 121, 250, 32, 70, 64, 242, 41, 17, 2, 34, 252, - 247, 115, 250, 32, 70, 87, 33, 1, 34, 252, 247, 110, 250, 32, 70, 91, - 33, 2, 34, 252, 247, 105, 250, 65, 242, 136, 48, 241, 243, 58, 246, - 20, 77, 2, 224, 10, 32, 241, 243, 53, 246, 92, 33, 32, 70, 252, 247, - 127, 248, 128, 6, 1, 212, 1, 61, 244, 209, 92, 33, 32, 70, 252, 247, - 119, 248, 129, 6, 3, 213, 32, 70, 92, 33, 252, 247, 113, 248, 32, 70, - 91, 33, 253, 34, 252, 247, 59, 250, 32, 70, 87, 33, 254, 34, 252, 247, - 54, 250, 32, 70, 64, 242, 41, 17, 253, 34, 189, 232, 56, 64, 252, 247, - 46, 186, 0, 191, 65, 66, 15, 0, 45, 233, 248, 67, 0, 245, 128, 83, 157, - 106, 136, 75, 79, 244, 132, 118, 181, 251, 243, 245, 117, 67, 26, 35, - 87, 33, 181, 251, 243, 245, 4, 70, 252, 247, 74, 248, 23, 33, 95, 250, - 128, 248, 32, 70, 252, 247, 68, 248, 24, 33, 32, 70, 252, 247, 64, 248, - 64, 242, 5, 17, 251, 34, 7, 70, 32, 70, 252, 247, 8, 250, 32, 70, 4, - 33, 64, 34, 252, 247, 17, 250, 32, 70, 79, 244, 144, 113, 16, 34, 252, - 247, 11, 250, 32, 70, 87, 33, 2, 34, 252, 247, 6, 250, 32, 70, 64, 242, - 5, 17, 4, 34, 252, 247, 0, 250, 32, 70, 79, 244, 131, 113, 42, 34, 252, - 247, 52, 248, 173, 178, 32, 70, 64, 242, 7, 17, 110, 34, 252, 247, 45, - 248, 234, 178, 32, 70, 49, 70, 252, 247, 40, 248, 42, 10, 32, 70, 64, - 242, 9, 17, 2, 240, 31, 2, 252, 247, 32, 248, 32, 70, 64, 242, 5, 17, - 253, 34, 252, 247, 210, 249, 32, 70, 79, 244, 131, 113, 1, 34, 252, - 247, 218, 249, 50, 32, 241, 243, 172, 245, 90, 77, 2, 224, 10, 32, 241, - 243, 167, 245, 32, 70, 79, 244, 133, 113, 251, 247, 240, 255, 194, 7, - 1, 212, 1, 61, 243, 209, 32, 70, 79, 244, 133, 113, 251, 247, 231, 255, - 16, 240, 1, 15, 32, 70, 6, 209, 250, 178, 24, 33, 11, 37, 252, 247, - 187, 249, 47, 70, 10, 224, 64, 242, 15, 17, 251, 247, 216, 255, 0, 240, - 31, 5, 29, 45, 1, 216, 175, 28, 0, 224, 11, 39, 25, 33, 32, 70, 251, - 247, 205, 255, 79, 244, 131, 113, 254, 34, 6, 70, 32, 70, 252, 247, - 149, 249, 32, 70, 64, 242, 5, 17, 251, 34, 252, 247, 143, 249, 32, 70, - 64, 242, 5, 17, 4, 34, 252, 247, 151, 249, 32, 70, 64, 242, 5, 17, 2, - 34, 252, 247, 145, 249, 32, 70, 79, 244, 131, 113, 1, 34, 252, 247, - 139, 249, 50, 32, 241, 243, 93, 245, 223, 248, 204, 144, 2, 224, 10, - 32, 241, 243, 87, 245, 32, 70, 79, 244, 133, 113, 251, 247, 160, 255, - 195, 7, 2, 212, 185, 241, 1, 9, 242, 209, 32, 70, 79, 244, 133, 113, - 251, 247, 150, 255, 16, 240, 1, 15, 32, 70, 5, 209, 242, 178, 25, 33, - 251, 247, 165, 255, 9, 38, 5, 224, 79, 244, 136, 113, 251, 247, 136, - 255, 0, 240, 31, 6, 32, 70, 254, 34, 79, 244, 131, 113, 252, 247, 79, - 249, 32, 70, 251, 34, 64, 242, 5, 17, 252, 247, 73, 249, 66, 70, 79, - 234, 70, 24, 72, 234, 134, 40, 72, 234, 6, 8, 32, 70, 87, 33, 251, 247, - 134, 255, 32, 70, 66, 70, 64, 246, 51, 17, 251, 247, 177, 255, 66, 70, - 79, 234, 133, 40, 32, 70, 72, 234, 69, 24, 64, 246, 52, 17, 251, 247, - 167, 255, 32, 70, 70, 234, 8, 2, 64, 246, 53, 17, 251, 247, 160, 255, - 32, 70, 72, 234, 5, 2, 64, 246, 54, 17, 251, 247, 153, 255, 71, 234, - 71, 23, 250, 5, 32, 70, 64, 246, 55, 17, 210, 13, 189, 232, 248, 67, - 251, 247, 142, 191, 64, 66, 15, 0, 65, 66, 15, 0, 112, 181, 4, 70, 14, - 70, 0, 37, 107, 75, 32, 70, 89, 91, 251, 247, 57, 255, 112, 83, 2, 53, - 48, 45, 246, 209, 24, 34, 32, 70, 103, 73, 252, 247, 112, 249, 58, 33, - 251, 34, 32, 70, 252, 247, 250, 248, 1, 34, 32, 70, 79, 244, 141, 113, - 252, 247, 2, 249, 54, 33, 1, 34, 32, 70, 252, 247, 253, 248, 16, 34, - 79, 244, 141, 113, 32, 70, 252, 247, 247, 248, 20, 32, 241, 243, 201, - 244, 58, 33, 1, 34, 32, 70, 252, 247, 239, 248, 20, 32, 241, 243, 193, - 244, 180, 248, 218, 48, 58, 33, 3, 244, 112, 67, 1, 34, 179, 245, 0, - 95, 32, 70, 5, 208, 0, 35, 252, 247, 238, 248, 32, 70, 202, 33, 4, 34, - 19, 70, 252, 247, 232, 248, 8, 34, 32, 70, 79, 244, 141, 113, 252, 247, - 211, 248, 37, 33, 14, 34, 32, 70, 251, 247, 8, 255, 37, 33, 1, 34, 32, - 70, 252, 247, 201, 248, 180, 248, 218, 48, 40, 33, 3, 244, 112, 67, - 30, 34, 179, 245, 128, 95, 32, 70, 1, 209, 8, 35, 0, 224, 12, 35, 252, - 247, 201, 248, 20, 32, 241, 243, 140, 244, 5, 33, 8, 34, 32, 70, 251, - 247, 236, 254, 128, 34, 79, 244, 137, 113, 32, 70, 252, 247, 172, 248, - 20, 32, 241, 243, 126, 244, 255, 33, 16, 34, 32, 70, 252, 247, 164, - 248, 68, 34, 64, 242, 31, 17, 32, 70, 252, 247, 158, 248, 20, 32, 241, - 243, 112, 244, 11, 33, 7, 34, 32, 70, 252, 247, 150, 248, 16, 34, 64, - 242, 19, 17, 32, 70, 252, 247, 144, 248, 20, 32, 241, 243, 98, 244, - 7, 33, 1, 34, 32, 70, 251, 247, 194, 254, 20, 32, 241, 243, 90, 244, - 2, 35, 3, 34, 32, 70, 252, 33, 252, 247, 142, 248, 253, 33, 32, 70, - 166, 34, 251, 247, 180, 254, 68, 34, 64, 242, 31, 17, 32, 70, 252, 247, - 116, 248, 20, 32, 241, 243, 70, 244, 255, 33, 16, 34, 32, 70, 252, 247, - 108, 248, 20, 32, 241, 243, 62, 244, 180, 248, 218, 48, 32, 70, 3, 244, - 112, 67, 179, 245, 128, 95, 2, 209, 16, 73, 8, 34, 1, 224, 16, 73, 6, - 34, 252, 247, 189, 248, 32, 70, 89, 33, 204, 34, 251, 247, 143, 254, - 32, 70, 92, 33, 46, 34, 251, 247, 138, 254, 32, 70, 120, 33, 215, 34, - 251, 247, 133, 254, 32, 70, 146, 33, 21, 34, 189, 232, 112, 64, 251, - 247, 126, 190, 0, 191, 216, 235, 1, 0, 70, 232, 1, 0, 118, 232, 1, 0, - 134, 232, 1, 0, 45, 233, 240, 79, 0, 39, 137, 176, 137, 70, 64, 242, - 69, 97, 6, 70, 5, 151, 6, 151, 7, 151, 208, 248, 168, 128, 251, 247, - 140, 254, 64, 242, 70, 97, 133, 5, 48, 70, 251, 247, 134, 254, 60, 73, - 132, 5, 6, 34, 48, 70, 252, 247, 131, 248, 48, 70, 57, 70, 58, 70, 254, - 247, 99, 250, 5, 171, 0, 147, 79, 244, 250, 115, 1, 147, 73, 70, 48, - 70, 32, 34, 59, 70, 255, 247, 39, 248, 173, 13, 164, 13, 129, 70, 0, - 40, 71, 208, 5, 171, 147, 232, 8, 12, 11, 235, 10, 2, 1, 42, 63, 217, - 24, 70, 3, 147, 253, 247, 115, 249, 4, 70, 88, 70, 253, 247, 111, 249, - 164, 241, 20, 2, 18, 178, 186, 66, 3, 155, 6, 219, 58, 250, 2, 241, - 62, 208, 85, 28, 42, 250, 5, 245, 6, 224, 81, 66, 26, 250, 1, 241, 54, - 208, 213, 67, 10, 250, 5, 245, 36, 178, 196, 241, 30, 4, 163, 64, 160, - 241, 11, 7, 63, 178, 0, 47, 195, 235, 5, 5, 2, 219, 58, 250, 7, 250, - 2, 224, 127, 66, 26, 250, 7, 250, 35, 208, 0, 178, 192, 241, 31, 0, - 11, 250, 0, 251, 149, 251, 241, 245, 155, 251, 250, 250, 5, 251, 21, - 160, 253, 247, 73, 249, 173, 5, 132, 5, 173, 13, 164, 13, 0, 224, 185, - 70, 48, 70, 41, 70, 34, 70, 254, 247, 6, 250, 48, 70, 8, 73, 6, 34, - 252, 247, 28, 248, 168, 248, 184, 82, 168, 248, 186, 66, 2, 224, 137, - 70, 0, 224, 209, 70, 72, 70, 9, 176, 189, 232, 240, 143, 0, 235, 1, - 0, 20, 235, 1, 0, 56, 181, 4, 70, 13, 70, 169, 177, 4, 34, 17, 73, 252, - 247, 4, 248, 212, 248, 168, 48, 32, 70, 147, 248, 233, 51, 64, 246, - 74, 17, 160, 43, 12, 191, 64, 242, 79, 18, 167, 34, 251, 247, 254, 253, - 32, 70, 9, 73, 14, 34, 1, 224, 8, 73, 10, 34, 251, 247, 238, 255, 227, - 105, 41, 28, 24, 105, 24, 191, 1, 33, 189, 232, 56, 64, 59, 240, 127, - 155, 0, 191, 12, 235, 1, 0, 136, 236, 1, 0, 32, 235, 1, 0, 112, 181, - 13, 70, 6, 34, 40, 73, 237, 178, 4, 70, 208, 248, 168, 96, 251, 247, - 212, 255, 12, 45, 7, 217, 4, 245, 138, 83, 147, 249, 48, 80, 0, 53, - 24, 191, 1, 37, 0, 224, 0, 37, 150, 248, 26, 53, 0, 43, 50, 208, 32, - 70, 64, 246, 66, 17, 251, 247, 189, 253, 0, 178, 13, 177, 15, 56, 0, - 224, 0, 48, 212, 248, 248, 48, 24, 191, 1, 32, 19, 240, 6, 15, 33, 209, - 150, 248, 44, 48, 171, 66, 0, 209, 224, 177, 227, 105, 216, 104, 153, - 104, 85, 177, 1, 34, 240, 243, 108, 247, 32, 70, 1, 33, 255, 247, 152, - 255, 1, 35, 134, 248, 44, 48, 8, 224, 42, 70, 240, 243, 97, 247, 32, - 70, 41, 70, 255, 247, 141, 255, 134, 248, 44, 80, 32, 70, 6, 73, 12, - 34, 251, 247, 146, 255, 5, 73, 32, 70, 4, 34, 189, 232, 112, 64, 251, - 247, 139, 191, 0, 191, 206, 236, 1, 0, 248, 238, 1, 0, 232, 238, 1, - 0, 112, 181, 12, 70, 176, 248, 218, 16, 21, 70, 208, 248, 168, 96, 252, - 247, 67, 250, 40, 185, 150, 248, 76, 52, 35, 112, 150, 248, 77, 52, - 1, 224, 0, 35, 35, 112, 43, 112, 112, 189, 7, 181, 64, 242, 86, 67, - 0, 147, 64, 242, 85, 66, 64, 242, 87, 67, 252, 247, 143, 248, 14, 189, - 240, 181, 20, 70, 1, 50, 139, 176, 6, 70, 13, 70, 208, 248, 168, 112, - 2, 209, 253, 247, 167, 254, 68, 178, 151, 249, 102, 117, 235, 178, 1, - 55, 147, 251, 247, 247, 7, 35, 3, 147, 32, 35, 5, 147, 1, 35, 255, 178, - 2, 147, 6, 171, 1, 147, 48, 70, 7, 245, 160, 115, 1, 169, 4, 147, 255, - 247, 211, 255, 6, 155, 192, 55, 27, 13, 219, 178, 6, 147, 48, 70, 7, - 171, 1, 169, 1, 147, 4, 151, 255, 247, 199, 255, 0, 33, 6, 152, 8, 170, - 9, 171, 243, 243, 209, 240, 0, 33, 64, 32, 13, 241, 38, 3, 13, 241, - 34, 2, 243, 243, 201, 240, 189, 249, 36, 16, 189, 249, 38, 48, 153, - 66, 9, 218, 189, 249, 34, 0, 89, 26, 243, 243, 112, 241, 189, 248, 36, - 96, 173, 248, 34, 0, 8, 224, 189, 249, 32, 0, 201, 26, 243, 243, 102, - 241, 189, 248, 38, 96, 173, 248, 32, 0, 189, 249, 32, 0, 189, 249, 34, - 16, 243, 243, 102, 241, 51, 178, 3, 43, 1, 221, 4, 62, 1, 224, 198, - 241, 4, 6, 54, 178, 181, 64, 179, 30, 1, 34, 18, 250, 3, 243, 0, 235, - 128, 0, 40, 24, 192, 24, 1, 62, 80, 250, 6, 246, 116, 67, 224, 8, 128, - 178, 11, 176, 240, 189, 48, 181, 24, 35, 135, 176, 3, 147, 0, 35, 208, - 248, 168, 64, 128, 34, 4, 147, 32, 35, 5, 147, 64, 242, 118, 97, 19, - 70, 5, 70, 2, 146, 251, 247, 205, 254, 4, 241, 156, 3, 6, 169, 65, 248, - 20, 61, 40, 70, 255, 247, 103, 255, 64, 242, 113, 97, 40, 70, 251, 247, - 207, 252, 64, 242, 115, 97, 164, 248, 156, 2, 40, 70, 251, 247, 200, - 252, 64, 242, 116, 97, 164, 248, 158, 2, 40, 70, 251, 247, 193, 252, - 64, 242, 117, 97, 164, 248, 162, 2, 40, 70, 251, 247, 186, 252, 64, - 242, 121, 97, 164, 248, 160, 2, 40, 70, 251, 247, 179, 252, 64, 242, - 118, 97, 164, 248, 164, 2, 40, 70, 251, 247, 172, 252, 64, 242, 218, - 97, 164, 248, 166, 2, 40, 70, 251, 247, 165, 252, 64, 242, 37, 81, 164, - 248, 168, 2, 40, 70, 251, 247, 158, 252, 148, 248, 103, 53, 164, 248, - 170, 2, 132, 248, 172, 50, 79, 244, 143, 97, 40, 70, 251, 247, 147, - 252, 79, 244, 154, 97, 164, 248, 174, 2, 40, 70, 251, 247, 140, 252, - 64, 242, 36, 81, 164, 248, 176, 2, 40, 70, 251, 247, 133, 252, 180, - 248, 104, 53, 192, 11, 164, 248, 180, 50, 148, 248, 7, 52, 164, 248, - 178, 2, 132, 248, 182, 50, 148, 248, 8, 52, 132, 248, 183, 50, 7, 176, - 48, 189, 48, 181, 64, 242, 223, 65, 137, 176, 208, 248, 168, 64, 5, - 70, 251, 247, 107, 252, 128, 178, 195, 178, 127, 43, 164, 248, 76, 48, - 196, 191, 163, 245, 128, 115, 164, 248, 76, 48, 0, 10, 127, 40, 164, - 248, 78, 0, 6, 171, 196, 191, 160, 245, 128, 112, 164, 248, 78, 0, 1, - 147, 2, 35, 2, 147, 17, 35, 3, 147, 59, 35, 4, 147, 40, 70, 32, 35, - 1, 169, 5, 147, 255, 247, 221, 254, 6, 155, 63, 43, 1, 217, 128, 59, - 6, 147, 6, 155, 35, 101, 7, 155, 63, 43, 1, 217, 128, 59, 7, 147, 7, - 155, 64, 242, 52, 65, 99, 101, 40, 70, 251, 247, 55, 252, 192, 178, - 127, 40, 196, 191, 160, 245, 128, 112, 128, 178, 132, 248, 88, 0, 64, - 242, 36, 65, 40, 70, 251, 247, 42, 252, 0, 10, 164, 248, 90, 0, 64, - 242, 37, 65, 40, 70, 251, 247, 34, 252, 6, 171, 1, 147, 2, 35, 2, 147, - 13, 35, 192, 178, 3, 147, 28, 35, 164, 248, 92, 0, 4, 147, 40, 70, 32, - 35, 1, 169, 5, 147, 255, 247, 164, 254, 6, 155, 35, 100, 7, 155, 99, - 100, 9, 176, 48, 189, 127, 181, 0, 35, 2, 147, 16, 35, 4, 147, 13, 241, - 22, 3, 0, 147, 1, 35, 1, 147, 105, 70, 85, 35, 3, 147, 255, 247, 143, - 254, 189, 248, 22, 0, 7, 176, 0, 189, 45, 233, 240, 71, 208, 248, 168, - 144, 4, 70, 153, 248, 70, 53, 75, 185, 255, 247, 227, 255, 64, 243, - 7, 38, 69, 178, 173, 178, 182, 178, 47, 70, 176, 70, 7, 224, 185, 248, - 74, 133, 185, 248, 76, 117, 185, 248, 78, 101, 185, 248, 80, 85, 180, - 248, 218, 48, 32, 70, 3, 244, 112, 67, 179, 245, 0, 95, 12, 191, 185, - 248, 102, 144, 185, 248, 104, 144, 79, 240, 255, 50, 1, 33, 253, 247, - 160, 252, 1, 33, 15, 250, 137, 242, 130, 70, 32, 70, 253, 247, 153, - 252, 0, 33, 31, 250, 128, 249, 79, 240, 255, 50, 32, 70, 253, 247, 145, - 252, 201, 235, 10, 10, 31, 250, 138, 250, 202, 235, 8, 8, 31, 250, 136, - 248, 202, 235, 7, 7, 255, 34, 67, 70, 191, 178, 201, 235, 0, 9, 64, - 246, 82, 17, 32, 70, 251, 247, 155, 253, 32, 70, 255, 34, 59, 70, 64, - 246, 83, 17, 251, 247, 148, 253, 32, 70, 255, 34, 67, 70, 64, 246, 86, - 17, 251, 247, 141, 253, 31, 250, 137, 249, 32, 70, 255, 34, 59, 70, - 64, 246, 87, 17, 251, 247, 132, 253, 201, 235, 6, 3, 32, 70, 255, 34, - 64, 246, 72, 17, 155, 178, 251, 247, 123, 253, 201, 235, 5, 5, 32, 70, - 64, 246, 73, 17, 255, 34, 171, 178, 189, 232, 240, 71, 251, 247, 112, - 189, 45, 233, 240, 71, 146, 70, 62, 74, 146, 176, 208, 248, 168, 80, - 4, 70, 11, 70, 110, 70, 2, 241, 32, 14, 16, 104, 81, 104, 55, 70, 3, - 199, 8, 50, 114, 69, 62, 70, 247, 209, 18, 136, 9, 174, 58, 128, 53, - 74, 2, 241, 32, 14, 16, 104, 81, 104, 55, 70, 3, 199, 8, 50, 114, 69, - 62, 70, 247, 209, 18, 136, 32, 70, 58, 128, 155, 177, 0, 34, 64, 246, - 15, 17, 251, 247, 95, 251, 149, 248, 233, 51, 9, 175, 160, 43, 20, 191, - 79, 240, 16, 8, 79, 240, 17, 8, 20, 191, 5, 33, 3, 33, 38, 75, 38, 74, - 18, 224, 1, 34, 79, 244, 17, 97, 251, 247, 75, 251, 149, 248, 233, 51, - 35, 74, 160, 43, 35, 75, 111, 70, 20, 191, 79, 240, 16, 8, 79, 240, - 17, 8, 20, 191, 14, 33, 10, 33, 8, 191, 26, 70, 0, 35, 5, 224, 22, 70, - 48, 136, 1, 51, 36, 50, 130, 69, 6, 208, 139, 66, 31, 250, 131, 249, - 245, 219, 79, 246, 255, 121, 11, 224, 0, 37, 7, 224, 32, 70, 55, 248, - 2, 27, 54, 248, 2, 47, 251, 247, 35, 251, 1, 53, 69, 69, 245, 219, 32, - 70, 253, 247, 189, 251, 16, 177, 32, 70, 255, 247, 22, 255, 32, 70, - 15, 250, 137, 249, 253, 247, 38, 255, 185, 241, 255, 63, 12, 191, 79, - 240, 255, 48, 0, 32, 18, 176, 189, 232, 240, 135, 0, 191, 240, 184, - 1, 0, 18, 185, 1, 0, 36, 3, 2, 0, 220, 7, 2, 0, 216, 5, 2, 0, 144, 3, - 2, 0, 45, 233, 240, 67, 37, 75, 139, 176, 145, 70, 4, 70, 13, 70, 1, - 170, 3, 241, 32, 7, 24, 104, 89, 104, 22, 70, 3, 198, 8, 51, 187, 66, - 50, 70, 247, 209, 27, 136, 51, 128, 212, 248, 168, 48, 147, 248, 233, - 131, 184, 241, 160, 15, 12, 191, 79, 240, 17, 8, 79, 240, 16, 8, 101, - 185, 46, 70, 47, 70, 23, 224, 1, 171, 153, 91, 32, 70, 251, 247, 203, - 250, 1, 55, 41, 248, 6, 0, 2, 54, 1, 224, 0, 38, 55, 70, 71, 69, 241, - 219, 10, 224, 1, 171, 153, 91, 57, 248, 6, 32, 32, 70, 251, 247, 197, - 250, 1, 55, 2, 54, 71, 69, 244, 219, 32, 70, 253, 247, 94, 251, 16, - 177, 32, 70, 255, 247, 183, 254, 45, 185, 32, 70, 11, 176, 189, 232, - 240, 67, 253, 247, 197, 190, 11, 176, 189, 232, 240, 131, 18, 185, 1, - 0, 48, 181, 135, 176, 5, 171, 0, 147, 2, 35, 1, 147, 0, 35, 2, 147, - 80, 35, 12, 70, 3, 147, 105, 70, 16, 35, 21, 70, 4, 147, 255, 247, 37, - 253, 189, 248, 20, 48, 35, 128, 189, 248, 22, 48, 43, 128, 7, 176, 48, - 189, 7, 181, 64, 242, 86, 67, 0, 147, 64, 242, 85, 66, 64, 242, 87, - 67, 251, 247, 117, 253, 14, 189, 45, 233, 240, 79, 176, 248, 218, 48, - 137, 176, 3, 244, 112, 67, 179, 245, 0, 95, 4, 70, 139, 70, 208, 248, - 168, 80, 2, 209, 181, 248, 196, 51, 4, 224, 179, 245, 128, 95, 6, 209, - 181, 248, 198, 51, 26, 178, 1, 50, 8, 191, 112, 35, 0, 224, 112, 35, - 7, 34, 4, 146, 32, 34, 6, 146, 1, 34, 0, 39, 3, 146, 27, 6, 7, 170, - 2, 146, 1, 147, 184, 70, 62, 70, 11, 235, 7, 10, 241, 7, 154, 248, 3, - 144, 3, 213, 149, 249, 102, 53, 0, 43, 80, 209, 180, 248, 218, 48, 3, - 244, 112, 67, 179, 245, 0, 95, 0, 240, 134, 128, 27, 248, 7, 128, 8, - 224, 31, 250, 136, 248, 181, 248, 62, 52, 26, 178, 178, 241, 255, 63, - 24, 191, 153, 70, 154, 248, 1, 48, 154, 248, 2, 32, 27, 2, 67, 234, - 2, 67, 1, 154, 32, 70, 19, 67, 67, 234, 8, 3, 7, 147, 149, 249, 102, - 53, 2, 169, 1, 51, 182, 251, 243, 243, 192, 51, 5, 147, 255, 247, 151, - 255, 7, 171, 2, 147, 149, 249, 102, 53, 32, 70, 1, 51, 182, 251, 243, - 243, 3, 245, 160, 115, 2, 169, 5, 147, 255, 247, 166, 252, 154, 248, - 4, 32, 7, 155, 18, 5, 35, 240, 127, 67, 66, 234, 9, 114, 35, 244, 112, - 3, 19, 67, 7, 147, 149, 249, 102, 53, 32, 70, 1, 51, 182, 251, 243, - 243, 3, 245, 160, 115, 2, 169, 5, 147, 255, 247, 113, 255, 1, 54, 5, - 55, 128, 46, 160, 209, 149, 249, 102, 53, 0, 43, 62, 208, 79, 234, 9, - 121, 94, 70, 79, 244, 128, 117, 1, 154, 32, 70, 72, 234, 2, 3, 150, - 248, 66, 33, 2, 169, 67, 234, 2, 67, 150, 248, 65, 33, 5, 241, 128, - 7, 67, 234, 2, 35, 7, 147, 5, 149, 255, 247, 81, 255, 7, 171, 32, 70, - 2, 169, 2, 147, 5, 151, 255, 247, 103, 252, 7, 155, 150, 248, 68, 33, - 35, 240, 127, 67, 73, 234, 2, 82, 35, 244, 112, 3, 19, 67, 32, 70, 2, - 169, 1, 53, 7, 147, 5, 151, 5, 54, 255, 247, 56, 255, 181, 245, 160, - 127, 208, 209, 9, 224, 181, 248, 64, 132, 15, 250, 136, 243, 1, 51, - 127, 244, 118, 175, 79, 240, 15, 8, 116, 231, 9, 176, 189, 232, 240, - 143, 176, 248, 218, 48, 208, 248, 168, 32, 3, 244, 112, 67, 179, 245, - 0, 95, 3, 209, 210, 248, 116, 21, 255, 247, 37, 191, 112, 71, 45, 233, - 240, 65, 0, 36, 134, 176, 5, 70, 5, 148, 208, 248, 168, 96, 253, 247, - 233, 250, 7, 35, 2, 147, 32, 35, 4, 147, 1, 35, 128, 70, 1, 147, 150, - 249, 102, 53, 27, 177, 224, 7, 19, 212, 103, 8, 0, 224, 39, 70, 33, - 70, 40, 70, 79, 250, 136, 242, 255, 247, 34, 252, 6, 171, 67, 248, 4, - 13, 7, 245, 16, 119, 40, 70, 105, 70, 0, 147, 3, 151, 255, 247, 239, - 254, 1, 52, 228, 178, 128, 44, 226, 209, 150, 249, 102, 53, 123, 177, - 1, 35, 1, 147, 64, 36, 5, 171, 0, 147, 4, 245, 16, 115, 1, 52, 40, 70, - 105, 70, 228, 178, 3, 147, 255, 247, 218, 254, 128, 44, 242, 209, 6, - 176, 189, 232, 240, 129, 240, 181, 4, 70, 135, 176, 208, 248, 168, 112, - 0, 41, 60, 208, 7, 35, 2, 147, 32, 35, 4, 147, 1, 35, 1, 147, 5, 171, - 151, 248, 194, 98, 0, 147, 0, 37, 43, 224, 6, 241, 192, 3, 32, 70, 105, - 70, 3, 147, 255, 247, 216, 251, 5, 241, 192, 3, 32, 70, 105, 70, 3, - 147, 255, 247, 180, 254, 6, 245, 160, 115, 32, 70, 105, 70, 3, 147, - 255, 247, 202, 251, 5, 245, 160, 115, 32, 70, 105, 70, 3, 147, 255, - 247, 166, 254, 6, 245, 16, 115, 32, 70, 105, 70, 3, 147, 255, 247, 188, - 251, 5, 245, 16, 115, 32, 70, 105, 70, 3, 147, 255, 247, 152, 254, 1, - 53, 237, 178, 151, 248, 194, 50, 171, 66, 207, 210, 12, 224, 176, 248, - 218, 48, 3, 244, 112, 67, 179, 245, 0, 95, 2, 209, 4, 73, 255, 247, - 146, 254, 32, 70, 255, 247, 107, 255, 7, 176, 240, 189, 0, 191, 4, 161, - 2, 0, 127, 181, 9, 2, 6, 171, 35, 248, 2, 29, 0, 147, 1, 35, 1, 147, - 0, 35, 2, 147, 87, 35, 3, 147, 105, 70, 16, 35, 4, 147, 255, 247, 110, - 254, 7, 176, 0, 189, 45, 233, 240, 65, 208, 248, 168, 48, 138, 176, - 131, 248, 52, 16, 131, 248, 193, 18, 147, 249, 102, 53, 5, 70, 12, 70, - 83, 177, 17, 240, 1, 3, 24, 191, 8, 35, 79, 244, 143, 97, 79, 240, 12, - 2, 251, 247, 207, 250, 100, 8, 7, 35, 79, 240, 32, 8, 3, 147, 4, 245, - 160, 115, 10, 174, 4, 147, 13, 235, 8, 3, 70, 248, 36, 61, 1, 39, 40, - 70, 49, 70, 205, 248, 20, 128, 2, 151, 192, 52, 255, 247, 91, 251, 9, - 171, 40, 70, 49, 70, 1, 147, 4, 148, 205, 248, 20, 128, 255, 247, 82, - 251, 9, 155, 40, 70, 218, 178, 173, 248, 24, 32, 26, 10, 27, 12, 219, - 178, 173, 248, 28, 48, 8, 155, 210, 178, 27, 15, 3, 240, 7, 3, 6, 169, - 173, 248, 26, 32, 173, 248, 30, 48, 253, 247, 245, 251, 8, 153, 40, - 70, 9, 13, 201, 178, 255, 247, 154, 255, 40, 70, 57, 70, 253, 247, 207, - 251, 10, 176, 189, 232, 240, 129, 0, 0, 240, 181, 81, 79, 143, 176, - 110, 70, 4, 70, 15, 207, 15, 198, 151, 232, 15, 0, 134, 232, 15, 0, - 32, 70, 76, 73, 4, 34, 189, 248, 88, 80, 251, 247, 140, 250, 157, 248, - 104, 48, 32, 70, 91, 0, 64, 242, 163, 97, 2, 34, 251, 247, 113, 250, - 157, 248, 92, 48, 187, 177, 14, 171, 79, 244, 0, 34, 67, 248, 4, 45, - 8, 147, 1, 35, 9, 147, 24, 35, 10, 147, 32, 35, 12, 147, 0, 35, 11, - 147, 64, 38, 32, 70, 8, 169, 255, 247, 224, 253, 11, 155, 1, 51, 1, - 62, 11, 147, 246, 209, 32, 70, 5, 235, 69, 5, 253, 247, 139, 253, 1, - 53, 32, 70, 64, 242, 161, 97, 189, 248, 108, 32, 251, 247, 99, 248, - 173, 178, 32, 70, 64, 242, 162, 97, 189, 248, 112, 32, 251, 247, 91, - 248, 42, 70, 32, 70, 64, 242, 126, 97, 251, 247, 85, 248, 32, 70, 42, - 73, 4, 34, 251, 247, 72, 250, 1, 53, 20, 34, 106, 67, 1, 58, 32, 70, - 79, 244, 200, 97, 146, 178, 251, 247, 70, 248, 0, 34, 32, 70, 64, 242, - 119, 97, 251, 247, 64, 248, 8, 35, 9, 147, 21, 35, 0, 37, 10, 147, 32, - 35, 14, 169, 12, 147, 13, 235, 5, 3, 65, 248, 24, 61, 32, 70, 11, 149, - 255, 247, 155, 253, 32, 70, 64, 242, 123, 97, 189, 248, 96, 32, 251, - 247, 41, 248, 32, 70, 64, 242, 124, 97, 189, 248, 100, 32, 251, 247, - 34, 248, 42, 70, 32, 70, 64, 242, 125, 97, 251, 247, 28, 248, 41, 70, - 32, 70, 255, 247, 4, 255, 32, 70, 13, 73, 4, 34, 251, 247, 11, 250, - 12, 77, 2, 224, 10, 32, 240, 243, 120, 245, 32, 70, 64, 242, 118, 97, - 250, 247, 254, 255, 195, 7, 1, 213, 1, 61, 243, 209, 15, 176, 240, 189, - 0, 191, 52, 185, 1, 0, 84, 233, 1, 0, 174, 234, 1, 0, 182, 234, 1, 0, - 161, 134, 1, 0, 45, 233, 240, 67, 208, 248, 168, 144, 139, 176, 7, 70, - 136, 70, 3, 38, 5, 36, 15, 44, 168, 191, 15, 36, 0, 37, 163, 178, 1, - 147, 56, 70, 1, 33, 42, 70, 43, 70, 0, 149, 2, 149, 3, 149, 4, 149, - 253, 247, 247, 251, 219, 35, 2, 147, 79, 244, 175, 99, 4, 147, 79, 244, - 130, 67, 5, 147, 128, 35, 1, 34, 7, 147, 56, 70, 41, 70, 43, 70, 0, - 149, 1, 149, 3, 146, 6, 149, 8, 149, 255, 247, 36, 255, 184, 241, 0, - 15, 30, 209, 64, 242, 186, 97, 56, 70, 250, 247, 183, 255, 79, 246, - 192, 117, 128, 1, 5, 64, 64, 242, 187, 97, 56, 70, 250, 247, 174, 255, - 131, 1, 27, 178, 155, 17, 91, 67, 45, 178, 173, 17, 5, 251, 5, 53, 181, - 245, 0, 95, 1, 218, 164, 27, 3, 224, 181, 245, 128, 79, 4, 219, 164, - 25, 1, 62, 246, 178, 255, 46, 180, 209, 9, 44, 212, 191, 36, 234, 228, - 116, 9, 36, 201, 248, 56, 64, 32, 70, 11, 176, 189, 232, 240, 131, 248, - 181, 208, 248, 168, 96, 7, 70, 214, 248, 124, 85, 0, 36, 5, 224, 41, - 70, 56, 70, 255, 247, 248, 252, 1, 52, 20, 53, 214, 248, 120, 53, 156, - 66, 245, 211, 248, 189, 240, 181, 195, 105, 208, 248, 168, 64, 135, - 176, 6, 70, 128, 33, 152, 104, 240, 243, 162, 247, 5, 70, 0, 40, 0, - 240, 141, 128, 180, 248, 28, 52, 0, 34, 3, 244, 128, 126, 3, 244, 0, - 115, 31, 250, 131, 252, 31, 250, 142, 254, 3, 70, 2, 240, 16, 7, 0, - 32, 255, 178, 2, 240, 1, 1, 35, 248, 2, 11, 207, 177, 188, 241, 0, 15, - 3, 208, 212, 248, 28, 20, 193, 243, 128, 33, 18, 240, 8, 15, 212, 248, - 24, 4, 3, 208, 0, 244, 127, 0, 0, 12, 7, 224, 18, 240, 32, 15, 3, 208, - 0, 244, 127, 64, 0, 10, 0, 224, 192, 178, 35, 248, 2, 12, 190, 241, - 0, 15, 1, 208, 0, 47, 66, 209, 18, 240, 4, 15, 2, 240, 2, 7, 23, 208, - 212, 248, 12, 4, 71, 177, 51, 248, 2, 124, 9, 177, 0, 14, 11, 224, 0, - 244, 127, 0, 0, 12, 7, 224, 51, 248, 2, 124, 25, 177, 0, 244, 127, 64, - 0, 10, 0, 224, 192, 178, 56, 67, 35, 248, 2, 12, 37, 224, 144, 6, 16, - 213, 39, 177, 51, 248, 2, 124, 212, 248, 16, 4, 3, 224, 51, 248, 2, - 124, 212, 248, 20, 4, 9, 177, 1, 14, 19, 224, 0, 244, 127, 1, 9, 12, - 15, 224, 39, 177, 51, 248, 2, 124, 212, 248, 16, 4, 3, 224, 51, 248, - 2, 124, 212, 248, 20, 4, 25, 177, 0, 244, 127, 65, 9, 10, 0, 224, 193, - 178, 57, 67, 35, 248, 2, 28, 1, 50, 64, 42, 145, 209, 15, 35, 6, 169, - 3, 147, 0, 35, 4, 147, 65, 248, 20, 93, 16, 35, 48, 70, 2, 146, 5, 147, - 255, 247, 92, 252, 243, 105, 41, 70, 152, 104, 128, 34, 240, 243, 33, - 247, 7, 176, 240, 189, 48, 181, 135, 176, 5, 171, 0, 147, 1, 35, 1, - 147, 24, 35, 2, 147, 32, 35, 4, 147, 0, 35, 3, 147, 79, 244, 0, 35, - 5, 70, 5, 147, 129, 36, 6, 224, 40, 70, 105, 70, 255, 247, 62, 252, - 3, 155, 1, 51, 3, 147, 1, 60, 246, 209, 7, 176, 48, 189, 112, 181, 208, - 248, 168, 48, 134, 176, 147, 248, 154, 85, 4, 70, 69, 177, 46, 224, - 49, 75, 20, 33, 1, 251, 5, 49, 32, 70, 255, 247, 39, 252, 1, 53, 46, - 75, 27, 104, 157, 66, 243, 211, 45, 75, 6, 173, 90, 104, 27, 104, 1, - 146, 16, 34, 2, 146, 0, 38, 8, 34, 69, 248, 24, 61, 32, 70, 105, 70, - 3, 150, 4, 146, 255, 247, 17, 252, 227, 105, 27, 107, 8, 43, 13, 209, - 35, 75, 32, 70, 90, 104, 27, 104, 1, 146, 18, 34, 2, 146, 105, 70, 32, - 34, 3, 150, 4, 146, 0, 147, 255, 247, 255, 251, 16, 35, 4, 147, 13, - 241, 22, 3, 0, 147, 114, 35, 8, 37, 1, 38, 173, 248, 22, 48, 32, 70, - 0, 35, 105, 70, 3, 147, 2, 149, 1, 150, 255, 247, 237, 251, 130, 35, - 32, 70, 105, 70, 173, 248, 22, 48, 3, 150, 255, 247, 229, 251, 6, 35, - 105, 70, 32, 70, 173, 248, 22, 48, 3, 149, 255, 247, 221, 251, 32, 70, - 255, 247, 179, 252, 32, 70, 255, 247, 211, 254, 32, 70, 255, 247, 227, - 254, 32, 70, 255, 247, 184, 252, 32, 70, 255, 247, 122, 255, 6, 176, - 112, 189, 0, 191, 0, 245, 1, 0, 224, 240, 1, 0, 228, 241, 1, 0, 112, - 254, 1, 0, 240, 181, 176, 248, 218, 48, 208, 248, 168, 64, 3, 244, 112, - 67, 179, 245, 0, 95, 12, 191, 148, 248, 64, 51, 148, 248, 65, 51, 135, - 176, 132, 248, 66, 51, 148, 248, 66, 51, 5, 70, 132, 248, 67, 51, 176, - 248, 218, 48, 3, 244, 112, 67, 179, 245, 0, 95, 16, 209, 148, 248, 73, - 51, 90, 178, 0, 42, 6, 220, 195, 105, 27, 109, 218, 4, 1, 213, 52, 35, - 0, 224, 48, 35, 132, 248, 72, 51, 148, 248, 92, 99, 15, 224, 148, 248, - 74, 51, 90, 178, 0, 42, 6, 220, 195, 105, 27, 109, 219, 0, 1, 213, 52, - 35, 0, 224, 48, 35, 148, 248, 93, 99, 132, 248, 72, 51, 118, 178, 0, - 46, 72, 221, 64, 242, 223, 65, 40, 70, 250, 247, 7, 254, 195, 178, 0, - 10, 128, 178, 129, 178, 2, 46, 168, 191, 2, 38, 127, 43, 200, 191, 163, - 245, 128, 115, 10, 178, 6, 235, 70, 6, 200, 191, 155, 178, 246, 178, - 127, 42, 200, 191, 160, 245, 128, 113, 119, 178, 200, 191, 137, 178, - 191, 178, 202, 27, 223, 27, 146, 178, 255, 178, 71, 234, 2, 34, 146, - 178, 40, 70, 64, 242, 223, 65, 250, 247, 237, 253, 5, 171, 0, 147, 2, - 35, 1, 147, 17, 35, 2, 147, 15, 35, 3, 147, 40, 70, 8, 35, 105, 70, - 4, 147, 255, 247, 103, 248, 157, 248, 20, 48, 40, 70, 155, 27, 141, - 248, 20, 48, 157, 248, 21, 48, 105, 70, 158, 27, 141, 248, 21, 96, 255, - 247, 60, 251, 40, 70, 253, 247, 240, 255, 148, 248, 77, 19, 0, 35, 255, - 34, 132, 248, 154, 35, 132, 248, 71, 51, 132, 248, 156, 51, 177, 177, - 132, 248, 66, 51, 132, 248, 67, 51, 40, 70, 64, 242, 35, 65, 180, 248, - 80, 51, 250, 247, 158, 255, 40, 70, 79, 244, 170, 97, 180, 248, 96, - 35, 250, 247, 177, 253, 40, 70, 4, 73, 4, 34, 250, 247, 164, 255, 40, - 70, 253, 247, 29, 248, 7, 176, 240, 189, 0, 191, 224, 238, 1, 0, 56, - 181, 176, 248, 218, 32, 4, 70, 2, 244, 112, 66, 178, 245, 0, 95, 208, - 248, 168, 48, 10, 209, 147, 249, 241, 35, 1, 50, 45, 209, 179, 249, - 248, 35, 1, 50, 41, 209, 179, 249, 44, 37, 36, 224, 178, 245, 128, 95, - 44, 209, 147, 249, 91, 37, 1, 50, 31, 209, 147, 249, 243, 35, 1, 50, - 27, 209, 147, 249, 92, 37, 1, 50, 23, 209, 179, 249, 0, 36, 1, 50, 19, - 209, 179, 249, 48, 37, 1, 50, 15, 209, 179, 249, 2, 36, 1, 50, 11, 209, - 179, 249, 52, 37, 1, 50, 7, 209, 179, 249, 4, 36, 1, 50, 3, 209, 179, - 249, 56, 37, 1, 50, 8, 208, 1, 37, 16, 34, 131, 248, 102, 85, 32, 70, - 79, 244, 154, 97, 19, 70, 7, 224, 0, 37, 131, 248, 102, 85, 32, 70, - 79, 244, 154, 97, 16, 34, 43, 70, 250, 247, 58, 255, 79, 244, 143, 97, - 3, 34, 43, 70, 32, 70, 250, 247, 51, 255, 32, 70, 255, 247, 126, 254, - 32, 70, 253, 247, 201, 251, 32, 70, 254, 247, 126, 248, 32, 70, 189, - 232, 56, 64, 255, 247, 231, 190, 45, 233, 240, 71, 138, 176, 30, 70, - 13, 241, 39, 3, 5, 70, 208, 248, 168, 64, 136, 70, 0, 147, 9, 169, 13, - 241, 38, 3, 23, 70, 13, 241, 37, 2, 253, 247, 40, 251, 40, 70, 8, 169, - 13, 241, 34, 2, 255, 247, 120, 250, 40, 70, 255, 247, 13, 249, 7, 35, - 4, 147, 32, 35, 6, 147, 7, 171, 2, 147, 1, 35, 3, 147, 79, 244, 80, - 115, 129, 70, 5, 147, 79, 240, 0, 10, 53, 224, 19, 177, 24, 240, 1, - 15, 47, 209, 91, 178, 1, 51, 184, 251, 243, 243, 3, 245, 160, 115, 40, - 70, 2, 169, 5, 147, 254, 247, 141, 255, 7, 155, 189, 248, 34, 160, 27, - 13, 79, 234, 138, 90, 27, 5, 79, 234, 154, 90, 74, 234, 3, 10, 189, - 248, 32, 48, 40, 70, 155, 5, 155, 13, 74, 234, 131, 42, 2, 169, 205, - 248, 28, 160, 255, 247, 89, 250, 148, 249, 102, 53, 40, 70, 1, 51, 184, - 251, 243, 243, 3, 245, 224, 115, 2, 169, 205, 248, 28, 144, 5, 147, - 255, 247, 75, 250, 8, 241, 1, 8, 184, 69, 148, 248, 102, 53, 197, 217, - 187, 177, 127, 47, 21, 209, 79, 244, 192, 119, 40, 70, 2, 169, 5, 151, - 205, 248, 28, 160, 255, 247, 57, 250, 7, 241, 128, 3, 40, 70, 2, 169, - 1, 55, 205, 248, 28, 144, 5, 147, 255, 247, 47, 250, 183, 245, 224, - 127, 235, 209, 189, 248, 32, 32, 6, 241, 52, 3, 4, 235, 67, 3, 154, - 128, 189, 248, 34, 32, 4, 235, 70, 6, 90, 129, 166, 248, 120, 144, 157, - 248, 36, 48, 132, 248, 126, 48, 157, 248, 37, 48, 132, 248, 127, 48, - 157, 248, 38, 48, 132, 248, 128, 48, 157, 248, 39, 48, 132, 248, 129, - 48, 10, 176, 189, 232, 240, 135, 45, 233, 240, 65, 208, 248, 168, 64, - 134, 176, 148, 249, 7, 20, 79, 240, 255, 50, 137, 178, 6, 70, 254, 247, - 38, 255, 148, 249, 103, 53, 5, 70, 2, 43, 8, 209, 148, 249, 8, 20, 48, - 70, 137, 178, 79, 240, 255, 50, 254, 247, 25, 255, 0, 224, 0, 32, 7, - 35, 2, 147, 32, 35, 4, 147, 1, 35, 47, 26, 1, 147, 48, 70, 5, 171, 180, - 248, 104, 21, 79, 240, 255, 50, 0, 147, 254, 247, 7, 255, 0, 35, 192, - 25, 164, 248, 106, 53, 72, 191, 164, 248, 106, 5, 0, 37, 148, 248, 102, - 53, 11, 177, 233, 7, 28, 212, 91, 178, 1, 51, 149, 251, 243, 243, 219, - 178, 3, 245, 16, 115, 3, 147, 180, 248, 104, 53, 180, 249, 106, 133, - 171, 66, 41, 70, 48, 70, 79, 240, 255, 50, 56, 191, 199, 235, 8, 8, - 254, 247, 228, 254, 200, 235, 0, 0, 5, 144, 105, 70, 48, 70, 255, 247, - 181, 249, 1, 53, 237, 178, 128, 45, 217, 209, 148, 249, 102, 53, 123, - 177, 1, 35, 1, 147, 5, 171, 0, 147, 64, 36, 4, 245, 16, 115, 1, 52, - 48, 70, 105, 70, 228, 178, 3, 147, 255, 247, 160, 249, 128, 44, 244, - 209, 6, 176, 189, 232, 240, 129, 112, 181, 0, 35, 134, 176, 2, 147, - 16, 35, 4, 147, 5, 171, 0, 147, 2, 35, 4, 70, 173, 248, 20, 16, 1, 147, - 14, 70, 80, 35, 105, 70, 21, 70, 173, 248, 22, 32, 3, 147, 255, 247, - 133, 249, 32, 70, 252, 247, 203, 252, 120, 179, 32, 70, 64, 246, 70, - 17, 64, 242, 255, 50, 51, 70, 250, 247, 244, 253, 32, 70, 64, 246, 71, - 17, 64, 242, 255, 50, 43, 70, 250, 247, 236, 253, 32, 70, 79, 244, 21, - 97, 64, 242, 255, 50, 51, 70, 250, 247, 228, 253, 32, 70, 64, 246, 81, - 17, 64, 242, 255, 50, 43, 70, 250, 247, 220, 253, 32, 70, 64, 246, 84, - 17, 64, 242, 255, 50, 51, 70, 250, 247, 212, 253, 32, 70, 64, 246, 85, - 17, 64, 242, 255, 50, 43, 70, 250, 247, 204, 253, 6, 176, 112, 189, - 240, 181, 41, 75, 139, 176, 4, 70, 5, 173, 14, 70, 15, 203, 133, 232, - 15, 0, 4, 245, 130, 83, 27, 121, 212, 248, 168, 80, 27, 177, 149, 248, - 224, 52, 0, 43, 62, 208, 32, 70, 32, 73, 8, 34, 250, 247, 196, 253, - 7, 35, 2, 147, 32, 35, 4, 147, 4, 35, 1, 147, 1, 39, 5, 171, 0, 147, - 133, 248, 106, 112, 79, 244, 80, 115, 32, 70, 105, 70, 3, 147, 255, - 247, 37, 249, 0, 35, 9, 147, 9, 171, 1, 151, 0, 147, 79, 244, 81, 117, - 32, 70, 105, 70, 3, 149, 255, 247, 25, 249, 1, 53, 64, 242, 94, 51, - 157, 66, 245, 209, 32, 70, 13, 73, 18, 34, 250, 247, 156, 253, 118, - 0, 79, 246, 254, 115, 32, 70, 64, 242, 169, 65, 64, 242, 255, 18, 51, - 64, 250, 247, 127, 253, 32, 70, 64, 242, 163, 97, 16, 34, 0, 35, 250, - 247, 120, 253, 11, 176, 240, 189, 84, 185, 1, 0, 42, 234, 1, 0, 136, - 234, 1, 0, 48, 181, 24, 35, 135, 176, 3, 147, 32, 35, 208, 248, 168, - 64, 5, 147, 128, 35, 2, 147, 0, 35, 6, 169, 4, 147, 4, 241, 156, 3, - 5, 70, 65, 248, 20, 61, 255, 247, 225, 248, 40, 70, 180, 248, 156, 34, - 64, 242, 113, 97, 250, 247, 111, 251, 40, 70, 180, 248, 158, 34, 64, - 242, 115, 97, 250, 247, 104, 251, 40, 70, 180, 248, 162, 34, 64, 242, - 116, 97, 250, 247, 97, 251, 40, 70, 180, 248, 160, 34, 64, 242, 117, - 97, 250, 247, 90, 251, 40, 70, 180, 248, 164, 34, 64, 242, 121, 97, - 250, 247, 83, 251, 40, 70, 180, 248, 166, 34, 64, 242, 118, 97, 250, - 247, 76, 251, 40, 70, 180, 248, 168, 34, 64, 242, 218, 97, 250, 247, - 69, 251, 40, 70, 180, 248, 170, 34, 64, 242, 37, 81, 250, 247, 62, 251, - 40, 70, 180, 248, 174, 34, 79, 244, 143, 97, 250, 247, 55, 251, 40, - 70, 180, 248, 176, 34, 79, 244, 154, 97, 250, 247, 48, 251, 180, 248, - 178, 50, 79, 244, 0, 66, 219, 3, 40, 70, 19, 64, 64, 242, 36, 81, 250, - 247, 11, 253, 148, 248, 172, 50, 40, 70, 132, 248, 103, 53, 180, 248, - 180, 50, 164, 248, 104, 53, 148, 248, 182, 50, 132, 248, 7, 52, 148, - 248, 183, 50, 132, 248, 8, 52, 255, 247, 114, 254, 7, 176, 48, 189, - 45, 233, 240, 79, 195, 105, 14, 70, 79, 240, 128, 81, 187, 176, 4, 70, - 208, 248, 168, 80, 23, 70, 24, 105, 10, 70, 58, 240, 25, 216, 5, 32, - 240, 243, 104, 240, 32, 70, 79, 244, 137, 97, 79, 244, 128, 66, 0, 35, - 250, 247, 220, 252, 1, 34, 32, 70, 64, 242, 10, 81, 19, 70, 250, 247, - 213, 252, 13, 241, 230, 3, 52, 147, 1, 35, 53, 147, 17, 35, 54, 147, - 15, 35, 55, 147, 32, 70, 8, 35, 52, 169, 56, 147, 254, 247, 104, 253, - 0, 46, 64, 240, 74, 129, 180, 248, 218, 48, 3, 244, 112, 67, 179, 245, - 0, 95, 12, 209, 227, 105, 149, 248, 191, 100, 27, 109, 3, 244, 128, - 83, 0, 43, 12, 191, 8, 35, 6, 35, 255, 46, 8, 191, 30, 70, 157, 248, - 230, 48, 111, 240, 2, 2, 2, 251, 6, 50, 58, 171, 3, 248, 1, 45, 52, - 147, 32, 70, 16, 35, 52, 169, 55, 147, 119, 0, 255, 247, 35, 248, 79, - 246, 254, 115, 254, 34, 32, 70, 64, 242, 10, 81, 59, 64, 250, 247, 149, - 252, 149, 248, 192, 84, 255, 45, 0, 240, 236, 128, 0, 45, 0, 240, 203, - 128, 16, 45, 40, 191, 16, 37, 197, 241, 36, 7, 255, 178, 246, 178, 114, - 178, 123, 178, 154, 66, 3, 220, 0, 46, 20, 191, 55, 70, 1, 39, 122, - 178, 170, 66, 5, 241, 1, 6, 204, 191, 95, 250, 134, 251, 187, 70, 203, - 235, 6, 6, 13, 35, 246, 178, 54, 147, 32, 35, 79, 250, 134, 248, 56, - 147, 9, 171, 3, 235, 200, 3, 0, 147, 79, 250, 139, 243, 91, 0, 1, 147, - 115, 0, 1, 51, 3, 240, 255, 3, 2, 147, 107, 0, 1, 51, 3, 147, 5, 241, - 1, 10, 79, 234, 72, 3, 79, 234, 74, 0, 89, 28, 205, 248, 24, 176, 7, - 150, 5, 144, 4, 145, 79, 240, 0, 9, 147, 70, 30, 70, 1, 155, 171, 69, - 53, 147, 202, 191, 123, 178, 205, 248, 220, 160, 55, 147, 55, 155, 0, - 154, 75, 68, 91, 0, 32, 70, 52, 169, 55, 147, 52, 146, 254, 247, 221, - 252, 2, 155, 10, 224, 58, 168, 0, 235, 131, 2, 82, 248, 196, 28, 2, - 51, 65, 240, 128, 1, 66, 248, 196, 28, 219, 178, 3, 154, 147, 66, 241, - 221, 0, 35, 19, 224, 58, 168, 0, 235, 134, 2, 82, 248, 196, 28, 0, 235, - 131, 2, 66, 248, 196, 28, 4, 153, 0, 235, 129, 2, 82, 248, 196, 28, - 0, 235, 131, 2, 2, 51, 66, 248, 192, 28, 219, 178, 179, 66, 233, 219, - 5, 154, 9, 171, 52, 147, 32, 70, 79, 234, 73, 3, 52, 169, 9, 241, 37, - 9, 53, 146, 55, 147, 254, 247, 139, 255, 185, 241, 74, 15, 181, 209, - 14, 35, 90, 70, 43, 168, 221, 248, 24, 176, 54, 147, 16, 35, 56, 147, - 170, 66, 0, 235, 72, 3, 52, 147, 200, 191, 127, 178, 79, 250, 139, 243, - 32, 70, 52, 169, 7, 158, 53, 147, 212, 191, 205, 248, 220, 160, 55, - 151, 254, 247, 139, 252, 10, 224, 58, 169, 1, 235, 70, 3, 51, 248, 60, - 44, 1, 54, 66, 244, 0, 98, 35, 248, 60, 44, 246, 178, 174, 66, 242, - 217, 0, 35, 10, 224, 58, 170, 2, 235, 72, 1, 49, 248, 60, 28, 2, 235, - 67, 2, 1, 51, 34, 248, 60, 28, 219, 178, 67, 69, 242, 219, 43, 171, - 52, 147, 32, 70, 0, 35, 52, 169, 205, 248, 212, 160, 55, 147, 254, 247, - 71, 255, 1, 34, 19, 70, 32, 70, 64, 242, 14, 81, 250, 247, 187, 251, - 79, 244, 126, 66, 107, 2, 19, 64, 32, 70, 64, 242, 14, 81, 250, 247, - 178, 251, 32, 70, 64, 242, 15, 81, 127, 34, 43, 70, 250, 247, 171, 251, - 32, 70, 64, 242, 15, 81, 79, 244, 126, 82, 235, 1, 27, 224, 32, 70, - 64, 242, 14, 81, 1, 34, 0, 35, 250, 247, 157, 251, 32, 70, 64, 242, - 14, 81, 79, 244, 126, 66, 0, 35, 250, 247, 149, 251, 32, 70, 64, 242, - 15, 81, 127, 34, 0, 35, 250, 247, 142, 251, 32, 70, 64, 242, 15, 81, - 79, 244, 126, 82, 0, 35, 250, 247, 134, 251, 227, 105, 79, 240, 128, - 81, 24, 105, 0, 34, 57, 240, 177, 222, 32, 70, 253, 247, 184, 251, 59, - 176, 189, 232, 240, 143, 62, 70, 199, 230, 56, 181, 64, 242, 164, 65, - 5, 70, 208, 248, 168, 64, 250, 247, 126, 249, 128, 11, 128, 178, 3, - 40, 18, 209, 5, 245, 130, 83, 27, 121, 115, 177, 40, 70, 64, 242, 115, - 65, 250, 247, 113, 249, 148, 249, 102, 53, 192, 5, 192, 13, 1, 51, 88, - 67, 0, 235, 208, 112, 64, 16, 1, 224, 148, 248, 193, 2, 64, 178, 56, - 189, 112, 181, 198, 176, 1, 173, 208, 248, 168, 96, 4, 70, 0, 33, 40, - 70, 79, 244, 128, 114, 235, 243, 64, 243, 7, 35, 67, 147, 32, 35, 69, - 147, 150, 248, 106, 48, 65, 149, 67, 185, 30, 35, 66, 147, 32, 70, 79, - 244, 80, 115, 65, 169, 68, 147, 254, 247, 188, 254, 64, 35, 66, 147, - 32, 70, 128, 35, 65, 169, 68, 147, 254, 247, 180, 254, 70, 176, 112, - 189, 0, 0, 48, 181, 7, 35, 137, 176, 3, 147, 32, 35, 5, 147, 6, 171, - 1, 147, 1, 35, 2, 147, 0, 35, 4, 70, 208, 248, 168, 80, 4, 147, 8, 224, - 32, 70, 1, 169, 254, 247, 157, 254, 4, 155, 1, 51, 4, 147, 6, 155, 1, - 51, 6, 147, 6, 155, 127, 43, 242, 217, 79, 244, 48, 115, 4, 147, 0, - 35, 7, 224, 1, 169, 254, 247, 140, 254, 4, 155, 1, 51, 4, 147, 6, 155, - 1, 51, 6, 147, 6, 155, 32, 70, 127, 43, 242, 217, 9, 34, 90, 73, 250, - 247, 11, 251, 1, 33, 32, 70, 253, 247, 125, 248, 36, 34, 32, 70, 87, - 73, 250, 247, 2, 251, 32, 70, 252, 247, 171, 251, 64, 8, 128, 178, 230, - 40, 6, 220, 32, 70, 252, 247, 164, 251, 67, 8, 25, 51, 155, 178, 0, - 224, 255, 35, 255, 34, 32, 70, 64, 242, 165, 65, 250, 247, 219, 250, - 32, 70, 255, 247, 132, 255, 181, 248, 230, 35, 181, 248, 228, 51, 32, - 70, 3, 235, 66, 5, 173, 1, 79, 246, 192, 115, 43, 64, 79, 244, 154, - 97, 71, 246, 192, 114, 250, 247, 199, 250, 32, 70, 9, 34, 65, 73, 250, - 247, 212, 250, 180, 248, 218, 48, 32, 70, 3, 244, 112, 67, 40, 33, 30, - 34, 179, 245, 0, 95, 20, 191, 24, 35, 28, 35, 250, 247, 114, 250, 1, - 34, 32, 70, 58, 33, 19, 70, 250, 247, 108, 250, 8, 34, 19, 70, 32, 70, - 79, 244, 141, 113, 250, 247, 101, 250, 32, 70, 37, 33, 12, 34, 250, - 247, 139, 248, 180, 248, 218, 48, 2, 34, 3, 244, 112, 67, 58, 33, 179, - 245, 0, 95, 8, 191, 19, 70, 32, 70, 24, 191, 0, 35, 250, 247, 81, 250, - 8, 34, 19, 70, 32, 70, 5, 33, 250, 247, 75, 250, 32, 70, 6, 34, 37, - 73, 250, 247, 154, 250, 71, 242, 8, 2, 32, 70, 64, 242, 215, 65, 79, - 244, 0, 83, 250, 247, 127, 250, 32, 70, 252, 247, 58, 251, 16, 35, 5, - 147, 13, 241, 30, 3, 1, 147, 1, 35, 8, 37, 173, 248, 30, 0, 2, 147, - 32, 70, 6, 35, 1, 169, 4, 147, 3, 149, 254, 247, 240, 253, 32, 70, 15, - 34, 21, 73, 250, 247, 120, 250, 32, 70, 53, 33, 255, 34, 0, 35, 250, - 247, 30, 250, 32, 70, 54, 33, 3, 34, 0, 35, 250, 247, 24, 250, 32, 70, - 42, 70, 43, 70, 79, 244, 141, 113, 250, 247, 17, 250, 79, 244, 128, - 98, 32, 70, 64, 242, 164, 65, 19, 70, 250, 247, 75, 250, 32, 70, 253, - 247, 46, 248, 9, 176, 48, 189, 248, 236, 1, 0, 10, 237, 1, 0, 82, 237, - 1, 0, 100, 237, 1, 0, 40, 240, 1, 0, 45, 233, 240, 65, 4, 70, 208, 248, - 168, 80, 252, 247, 220, 249, 176, 245, 64, 79, 72, 209, 227, 105, 224, - 33, 24, 105, 57, 240, 127, 221, 181, 248, 46, 128, 7, 70, 200, 235, - 0, 8, 64, 242, 165, 65, 32, 70, 250, 247, 50, 248, 0, 244, 224, 96, - 6, 10, 1, 35, 179, 64, 31, 250, 136, 248, 152, 69, 48, 221, 149, 248, - 193, 52, 239, 133, 179, 66, 8, 217, 1, 54, 32, 70, 64, 242, 165, 65, - 79, 244, 224, 98, 51, 2, 250, 247, 12, 250, 32, 70, 255, 247, 146, 254, - 180, 248, 218, 48, 128, 178, 3, 244, 112, 67, 179, 245, 0, 95, 12, 191, - 133, 248, 84, 4, 133, 248, 85, 4, 40, 134, 110, 134, 212, 248, 168, - 48, 64, 0, 147, 249, 102, 53, 64, 242, 164, 65, 1, 51, 144, 251, 243, - 243, 64, 242, 255, 18, 32, 70, 155, 178, 189, 232, 240, 65, 250, 247, - 233, 185, 189, 232, 240, 129, 0, 0, 45, 233, 240, 79, 4, 70, 133, 176, - 15, 70, 208, 248, 168, 80, 255, 247, 161, 255, 212, 248, 176, 48, 211, - 248, 32, 49, 3, 240, 1, 3, 131, 240, 1, 2, 1, 146, 27, 177, 227, 105, - 24, 105, 57, 240, 113, 221, 7, 33, 32, 70, 249, 247, 157, 255, 255, - 33, 198, 178, 32, 70, 249, 247, 152, 255, 64, 242, 31, 17, 95, 250, - 128, 248, 32, 70, 249, 247, 145, 255, 64, 242, 59, 65, 95, 250, 128, - 249, 32, 70, 249, 247, 199, 255, 64, 242, 60, 65, 130, 70, 32, 70, 249, - 247, 193, 255, 64, 242, 215, 65, 131, 70, 32, 70, 249, 247, 187, 255, - 79, 244, 155, 97, 2, 144, 32, 70, 249, 247, 181, 255, 15, 34, 3, 144, - 63, 73, 32, 70, 250, 247, 178, 249, 1, 34, 7, 33, 19, 70, 32, 70, 250, - 247, 88, 249, 16, 34, 255, 33, 19, 70, 32, 70, 250, 247, 82, 249, 4, - 34, 19, 70, 64, 242, 31, 17, 32, 70, 250, 247, 75, 249, 10, 32, 239, - 243, 14, 245, 32, 34, 32, 70, 79, 244, 154, 97, 19, 70, 250, 247, 131, - 249, 10, 32, 239, 243, 4, 245, 1, 47, 32, 70, 28, 209, 64, 242, 118, - 65, 249, 247, 136, 255, 64, 242, 119, 65, 199, 5, 32, 70, 249, 247, - 130, 255, 192, 5, 192, 13, 255, 13, 255, 40, 165, 248, 110, 5, 136, - 191, 160, 245, 0, 112, 255, 47, 165, 248, 108, 117, 136, 191, 167, 245, - 0, 119, 128, 178, 191, 178, 197, 27, 9, 224, 64, 242, 117, 65, 249, - 247, 107, 255, 197, 5, 237, 13, 255, 45, 136, 191, 165, 245, 0, 117, - 32, 70, 7, 33, 50, 70, 249, 247, 58, 255, 32, 70, 255, 33, 66, 70, 249, - 247, 53, 255, 32, 70, 64, 242, 31, 17, 74, 70, 249, 247, 47, 255, 32, - 70, 64, 242, 59, 65, 82, 70, 249, 247, 90, 255, 32, 70, 64, 242, 60, - 65, 90, 70, 249, 247, 84, 255, 32, 70, 64, 242, 215, 65, 2, 154, 249, - 247, 78, 255, 32, 70, 79, 244, 155, 97, 3, 154, 249, 247, 72, 255, 1, - 155, 27, 185, 227, 105, 24, 105, 57, 240, 182, 220, 40, 178, 5, 176, - 189, 232, 240, 143, 218, 236, 1, 0, 65, 67, 146, 2, 155, 1, 0, 251, - 3, 32, 1, 245, 0, 65, 1, 235, 64, 0, 73, 0, 144, 251, 241, 240, 112, - 71, 48, 181, 0, 35, 139, 176, 7, 147, 8, 147, 9, 147, 7, 35, 3, 147, - 79, 240, 32, 3, 0, 41, 5, 147, 6, 171, 24, 191, 79, 244, 48, 113, 1, - 147, 79, 240, 1, 3, 5, 70, 4, 145, 2, 147, 5, 209, 7, 169, 8, 170, 9, - 171, 251, 247, 103, 254, 8, 224, 176, 249, 2, 49, 8, 147, 176, 249, - 4, 49, 9, 147, 176, 249, 6, 49, 7, 147, 0, 36, 7, 169, 14, 201, 32, - 70, 255, 247, 199, 255, 1, 169, 6, 144, 40, 70, 254, 247, 105, 252, - 4, 155, 1, 52, 1, 51, 128, 44, 4, 147, 239, 209, 11, 176, 48, 189, 45, - 233, 240, 65, 4, 70, 138, 176, 13, 70, 73, 177, 64, 242, 215, 65, 249, - 247, 225, 254, 1, 169, 6, 70, 32, 70, 252, 247, 25, 255, 0, 224, 14, - 70, 32, 34, 19, 70, 79, 244, 154, 97, 32, 70, 250, 247, 196, 248, 100, - 32, 239, 243, 69, 244, 64, 242, 118, 65, 32, 70, 249, 247, 203, 254, - 64, 242, 166, 65, 7, 70, 32, 70, 249, 247, 197, 254, 128, 70, 255, 5, - 79, 234, 200, 88, 255, 13, 79, 234, 216, 88, 32, 70, 7, 169, 8, 170, - 9, 171, 135, 244, 128, 119, 136, 244, 128, 120, 251, 247, 19, 254, 200, - 235, 7, 0, 0, 245, 254, 112, 3, 48, 7, 169, 128, 16, 14, 201, 255, 247, - 121, 255, 71, 0, 77, 177, 32, 70, 1, 169, 252, 247, 155, 253, 32, 70, - 64, 242, 215, 65, 50, 70, 249, 247, 169, 254, 56, 70, 10, 176, 189, - 232, 240, 129, 45, 233, 248, 79, 157, 248, 40, 80, 139, 70, 146, 70, - 153, 70, 157, 248, 44, 112, 189, 177, 0, 38, 111, 240, 0, 72, 53, 70, - 40, 70, 89, 70, 82, 70, 75, 70, 255, 247, 85, 255, 64, 69, 4, 218, 1, - 54, 246, 178, 190, 66, 27, 208, 128, 70, 1, 53, 128, 45, 239, 209, 111, - 240, 0, 64, 189, 232, 248, 143, 79, 240, 255, 54, 127, 36, 32, 70, 89, - 70, 82, 70, 75, 70, 255, 247, 62, 255, 176, 66, 4, 221, 1, 53, 237, - 178, 189, 66, 4, 208, 6, 70, 20, 241, 255, 52, 239, 210, 32, 70, 189, - 232, 248, 143, 45, 233, 240, 79, 139, 176, 4, 70, 0, 37, 8, 171, 7, - 170, 136, 70, 6, 169, 208, 248, 168, 160, 6, 149, 7, 149, 8, 149, 251, - 247, 177, 253, 32, 70, 13, 241, 38, 1, 13, 241, 39, 2, 254, 247, 202, - 248, 157, 248, 38, 48, 6, 175, 3, 147, 1, 35, 151, 232, 128, 10, 0, - 147, 3, 155, 74, 70, 1, 147, 57, 70, 91, 70, 32, 70, 255, 247, 161, - 255, 157, 248, 39, 48, 74, 70, 4, 147, 1, 147, 6, 70, 91, 70, 0, 149, - 32, 70, 57, 70, 255, 247, 149, 255, 154, 248, 232, 51, 129, 70, 35, - 179, 180, 249, 4, 49, 180, 249, 2, 193, 5, 147, 1, 35, 180, 249, 6, - 177, 0, 147, 3, 155, 98, 70, 1, 147, 89, 70, 5, 155, 32, 70, 205, 248, - 8, 192, 255, 247, 126, 255, 4, 155, 221, 248, 8, 192, 7, 70, 1, 147, - 0, 149, 32, 70, 89, 70, 98, 70, 5, 155, 255, 247, 114, 255, 190, 66, - 184, 191, 62, 70, 129, 69, 168, 191, 129, 70, 184, 241, 1, 15, 2, 208, - 184, 241, 3, 15, 2, 209, 118, 16, 202, 248, 68, 100, 168, 241, 2, 8, - 95, 250, 136, 248, 184, 241, 1, 15, 156, 191, 79, 234, 105, 3, 202, - 248, 72, 52, 11, 176, 189, 232, 240, 143, 240, 181, 208, 248, 168, 64, - 0, 35, 133, 176, 1, 147, 2, 147, 3, 147, 148, 248, 88, 52, 5, 70, 0, - 43, 121, 208, 255, 247, 90, 252, 6, 70, 8, 177, 127, 40, 115, 209, 2, - 170, 3, 171, 40, 70, 1, 169, 251, 247, 53, 253, 64, 242, 62, 97, 40, - 70, 249, 247, 209, 253, 64, 242, 166, 65, 199, 5, 40, 70, 249, 247, - 203, 253, 192, 5, 192, 13, 255, 13, 255, 40, 134, 191, 160, 245, 128, - 112, 128, 178, 0, 245, 128, 112, 255, 47, 136, 191, 167, 245, 128, 119, - 192, 245, 254, 112, 140, 191, 191, 178, 7, 245, 128, 119, 3, 48, 56, - 24, 128, 16, 128, 178, 190, 185, 148, 248, 86, 52, 1, 51, 219, 178, - 4, 43, 132, 248, 86, 52, 65, 217, 1, 169, 14, 201, 132, 248, 86, 100, - 255, 247, 115, 254, 212, 248, 72, 36, 67, 16, 4, 59, 147, 66, 184, 191, - 19, 70, 196, 248, 68, 52, 25, 224, 127, 46, 47, 209, 148, 248, 87, 52, - 1, 51, 219, 178, 4, 43, 132, 248, 87, 52, 39, 217, 0, 35, 1, 169, 132, - 248, 87, 52, 14, 201, 255, 247, 88, 254, 212, 248, 68, 36, 67, 16, 4, - 51, 147, 66, 168, 191, 19, 70, 196, 248, 72, 52, 213, 248, 168, 32, - 155, 178, 210, 248, 72, 20, 210, 248, 68, 36, 147, 66, 180, 191, 24, - 70, 16, 70, 129, 66, 1, 221, 139, 178, 2, 224, 154, 66, 184, 191, 147, - 178, 40, 70, 64, 242, 167, 65, 255, 34, 249, 247, 89, 255, 5, 176, 240, - 189, 48, 181, 208, 248, 168, 80, 155, 176, 4, 70, 2, 70, 0, 35, 146, - 249, 16, 5, 1, 169, 64, 66, 88, 80, 4, 51, 1, 50, 80, 43, 246, 209, - 149, 248, 106, 48, 107, 185, 7, 35, 23, 147, 32, 35, 25, 147, 20, 35, - 22, 147, 21, 145, 79, 244, 80, 115, 32, 70, 21, 169, 24, 147, 254, 247, - 187, 250, 212, 248, 168, 32, 148, 248, 41, 54, 210, 248, 72, 20, 210, - 248, 68, 36, 147, 66, 180, 191, 24, 70, 16, 70, 129, 66, 1, 221, 139, - 178, 2, 224, 154, 66, 184, 191, 147, 178, 32, 70, 64, 242, 167, 65, - 255, 34, 249, 247, 29, 255, 149, 248, 232, 51, 243, 177, 148, 248, 41, - 38, 181, 248, 230, 51, 32, 70, 211, 26, 27, 2, 79, 244, 127, 66, 19, - 64, 64, 242, 209, 65, 249, 247, 12, 255, 148, 248, 41, 38, 149, 248, - 37, 53, 149, 248, 230, 19, 155, 26, 211, 26, 91, 26, 91, 178, 32, 70, - 64, 242, 209, 65, 255, 34, 155, 178, 249, 247, 251, 254, 32, 70, 251, - 247, 2, 253, 27, 176, 48, 189, 45, 233, 240, 65, 4, 70, 13, 70, 251, - 247, 151, 254, 41, 70, 7, 70, 32, 70, 251, 247, 152, 253, 57, 70, 5, - 70, 32, 70, 251, 247, 147, 253, 64, 34, 181, 245, 64, 79, 12, 191, 19, - 70, 0, 35, 7, 70, 64, 242, 218, 97, 32, 70, 212, 248, 168, 96, 249, - 247, 216, 254, 16, 34, 181, 245, 64, 79, 20, 191, 19, 70, 0, 35, 32, - 70, 64, 242, 163, 97, 249, 247, 205, 254, 165, 245, 64, 78, 1, 34, 222, - 241, 0, 3, 67, 235, 14, 3, 32, 70, 64, 242, 110, 65, 249, 247, 193, - 254, 175, 66, 0, 240, 147, 128, 183, 245, 64, 79, 2, 209, 32, 70, 255, - 247, 100, 251, 181, 245, 64, 79, 32, 70, 58, 209, 255, 247, 91, 255, - 212, 248, 168, 48, 50, 142, 147, 249, 102, 53, 82, 0, 1, 51, 146, 251, - 243, 243, 32, 70, 64, 242, 164, 65, 64, 242, 255, 18, 155, 178, 249, - 247, 161, 254, 115, 142, 32, 70, 27, 2, 64, 242, 165, 65, 79, 244, 224, - 98, 3, 244, 127, 67, 249, 247, 150, 254, 4, 34, 32, 70, 0, 35, 64, 242, - 31, 17, 249, 247, 77, 254, 227, 105, 224, 33, 24, 105, 57, 240, 220, - 217, 0, 33, 240, 133, 32, 70, 251, 247, 196, 255, 255, 35, 134, 248, - 52, 48, 32, 70, 64, 242, 169, 65, 79, 244, 0, 66, 0, 35, 249, 247, 122, - 254, 2, 224, 1, 33, 251, 247, 181, 255, 32, 70, 64, 242, 164, 65, 79, - 244, 96, 66, 43, 70, 249, 247, 110, 254, 181, 245, 64, 79, 15, 209, - 32, 70, 251, 247, 54, 253, 64, 242, 164, 65, 0, 40, 12, 191, 79, 244, - 0, 83, 0, 35, 79, 244, 0, 82, 32, 70, 249, 247, 92, 254, 19, 224, 78, - 242, 1, 3, 157, 66, 15, 209, 32, 70, 251, 247, 99, 252, 1, 70, 32, 70, - 255, 247, 134, 248, 32, 70, 64, 242, 169, 65, 249, 247, 90, 252, 192, - 178, 64, 16, 134, 248, 193, 2, 150, 249, 103, 53, 32, 70, 1, 43, 13, - 221, 64, 242, 164, 65, 249, 247, 77, 252, 0, 244, 128, 67, 155, 19, - 32, 70, 64, 242, 37, 81, 79, 244, 0, 66, 219, 3, 4, 224, 64, 242, 37, - 81, 79, 244, 0, 66, 0, 35, 189, 232, 240, 65, 249, 247, 43, 190, 189, - 232, 240, 129, 56, 181, 0, 34, 208, 248, 168, 48, 128, 248, 43, 38, - 147, 248, 224, 36, 4, 70, 146, 177, 144, 249, 42, 38, 211, 248, 72, - 20, 138, 66, 3, 219, 211, 248, 16, 53, 154, 66, 8, 218, 32, 70, 78, - 242, 1, 1, 255, 247, 26, 255, 1, 35, 132, 248, 43, 54, 56, 189, 4, 245, - 130, 83, 27, 121, 131, 177, 32, 70, 251, 247, 172, 253, 0, 33, 5, 70, - 32, 70, 255, 247, 10, 255, 32, 70, 255, 247, 166, 254, 32, 70, 41, 70, - 189, 232, 56, 64, 255, 247, 1, 191, 56, 189, 127, 181, 13, 241, 22, - 3, 0, 147, 1, 35, 1, 147, 0, 35, 2, 147, 87, 35, 3, 147, 105, 70, 16, - 35, 4, 147, 253, 247, 137, 254, 189, 248, 22, 0, 0, 10, 7, 176, 0, 189, - 16, 181, 0, 35, 136, 176, 5, 147, 16, 35, 7, 147, 13, 241, 6, 3, 3, - 147, 1, 35, 4, 70, 173, 248, 6, 16, 4, 147, 3, 169, 85, 35, 6, 147, - 254, 247, 84, 249, 32, 70, 251, 247, 134, 252, 16, 177, 32, 70, 253, - 247, 223, 255, 8, 176, 16, 189, 45, 233, 240, 65, 4, 70, 208, 248, 168, - 80, 0, 38, 22, 224, 180, 248, 218, 32, 2, 244, 112, 66, 178, 245, 128, - 95, 6, 209, 26, 121, 34, 177, 137, 4, 32, 70, 137, 12, 154, 120, 5, - 224, 90, 121, 42, 177, 137, 4, 218, 120, 32, 70, 137, 12, 249, 247, - 146, 251, 1, 54, 6, 34, 114, 67, 193, 73, 139, 24, 137, 90, 79, 246, - 255, 114, 145, 66, 223, 209, 32, 70, 115, 33, 0, 34, 249, 247, 131, - 251, 32, 70, 50, 33, 106, 34, 249, 247, 126, 251, 25, 34, 32, 70, 51, - 33, 249, 247, 121, 251, 149, 248, 236, 35, 26, 177, 32, 70, 51, 33, - 249, 247, 114, 251, 194, 33, 111, 34, 32, 70, 249, 247, 109, 251, 144, - 33, 16, 34, 32, 70, 249, 247, 104, 251, 16, 33, 0, 34, 32, 70, 249, - 247, 99, 251, 155, 33, 7, 34, 32, 70, 249, 247, 94, 251, 29, 33, 2, - 34, 32, 70, 249, 247, 89, 251, 30, 33, 6, 34, 32, 70, 249, 247, 84, - 251, 32, 70, 64, 242, 234, 65, 68, 242, 136, 98, 249, 247, 126, 251, - 180, 248, 218, 48, 3, 244, 112, 67, 179, 245, 0, 95, 64, 240, 76, 129, - 180, 248, 254, 63, 149, 248, 233, 131, 26, 178, 184, 241, 160, 15, 12, - 191, 79, 240, 4, 8, 79, 240, 2, 8, 1, 50, 24, 191, 152, 70, 9, 224, - 4, 245, 128, 83, 179, 248, 0, 128, 15, 250, 136, 243, 1, 51, 8, 191, - 79, 240, 2, 8, 79, 250, 136, 248, 31, 250, 136, 248, 7, 34, 67, 70, - 32, 70, 64, 242, 235, 65, 249, 247, 55, 253, 180, 248, 218, 48, 3, 244, - 112, 67, 179, 245, 0, 95, 8, 208, 179, 245, 128, 95, 7, 209, 149, 248, - 59, 101, 0, 54, 24, 191, 1, 38, 2, 224, 0, 38, 0, 224, 1, 38, 55, 1, - 51, 70, 15, 34, 32, 70, 64, 242, 242, 65, 191, 178, 249, 247, 27, 253, - 240, 34, 32, 70, 64, 242, 242, 65, 59, 70, 249, 247, 20, 253, 51, 70, - 15, 34, 32, 70, 64, 242, 241, 65, 249, 247, 13, 253, 240, 34, 32, 70, - 64, 242, 241, 65, 59, 70, 249, 247, 6, 253, 79, 234, 8, 35, 32, 70, - 64, 242, 242, 65, 79, 244, 224, 98, 3, 244, 127, 67, 249, 247, 251, - 252, 180, 248, 218, 48, 32, 70, 3, 244, 112, 67, 179, 245, 128, 95, - 4, 245, 152, 83, 12, 191, 158, 137, 94, 137, 64, 242, 235, 65, 115, - 2, 3, 244, 126, 67, 79, 244, 0, 114, 249, 247, 230, 252, 180, 248, 218, - 48, 3, 244, 112, 67, 179, 245, 128, 95, 7, 208, 4, 245, 154, 83, 155, - 138, 26, 178, 1, 50, 1, 208, 155, 2, 0, 224, 179, 2, 79, 244, 128, 98, - 3, 244, 124, 67, 32, 70, 64, 242, 235, 65, 249, 247, 205, 252, 64, 242, - 235, 65, 32, 70, 212, 248, 168, 96, 249, 247, 213, 250, 0, 244, 128, - 96, 128, 18, 134, 248, 71, 5, 64, 242, 235, 65, 32, 70, 212, 248, 168, - 96, 249, 247, 201, 250, 0, 244, 0, 112, 64, 18, 134, 248, 72, 5, 212, - 248, 168, 48, 32, 70, 147, 248, 71, 21, 147, 248, 72, 37, 138, 26, 24, - 191, 1, 34, 131, 248, 70, 37, 251, 247, 117, 251, 131, 2, 3, 244, 124, - 67, 32, 70, 64, 246, 70, 17, 79, 244, 128, 98, 249, 247, 157, 252, 32, - 70, 61, 73, 6, 34, 249, 247, 170, 252, 4, 245, 144, 83, 147, 248, 61, - 48, 43, 177, 15, 34, 32, 70, 119, 33, 19, 70, 249, 247, 75, 252, 32, - 70, 0, 33, 255, 247, 167, 254, 149, 248, 154, 53, 43, 185, 32, 70, 253, - 247, 163, 249, 32, 70, 253, 247, 246, 249, 227, 105, 122, 33, 24, 105, - 56, 240, 205, 223, 149, 248, 236, 35, 64, 0, 134, 178, 42, 177, 38, - 177, 227, 105, 177, 28, 24, 105, 56, 240, 224, 223, 149, 248, 237, 35, - 42, 177, 38, 177, 227, 105, 49, 70, 24, 105, 56, 240, 215, 223, 149, - 248, 187, 52, 219, 177, 4, 34, 19, 70, 32, 70, 64, 242, 29, 17, 249, - 247, 27, 252, 32, 70, 159, 33, 63, 34, 149, 248, 188, 52, 249, 247, - 20, 252, 32, 70, 158, 33, 63, 34, 149, 248, 189, 52, 249, 247, 13, 252, - 32, 70, 119, 33, 15, 34, 149, 248, 190, 52, 249, 247, 6, 252, 180, 248, - 218, 48, 3, 244, 112, 67, 179, 245, 128, 95, 55, 209, 149, 249, 88, - 53, 0, 43, 51, 208, 180, 33, 36, 34, 32, 70, 249, 247, 33, 250, 183, - 33, 36, 34, 32, 70, 249, 247, 28, 250, 3, 34, 184, 33, 32, 70, 249, - 247, 23, 250, 149, 249, 88, 37, 2, 42, 11, 209, 32, 70, 184, 33, 249, - 247, 15, 250, 32, 70, 181, 33, 1, 34, 13, 224, 208, 7, 2, 0, 112, 236, - 1, 0, 3, 42, 18, 209, 32, 70, 184, 33, 2, 34, 249, 247, 0, 250, 32, - 70, 181, 33, 0, 34, 189, 232, 240, 65, 249, 247, 249, 185, 179, 245, - 128, 95, 63, 244, 192, 174, 79, 240, 2, 8, 198, 230, 189, 232, 240, - 129, 0, 191, 255, 247, 62, 190, 45, 233, 240, 67, 208, 248, 168, 96, - 141, 176, 150, 249, 102, 53, 4, 70, 13, 70, 15, 70, 171, 177, 95, 75, - 11, 64, 0, 43, 3, 218, 1, 59, 99, 240, 1, 3, 1, 51, 12, 34, 1, 43, 32, - 70, 79, 244, 143, 97, 1, 209, 8, 35, 0, 224, 0, 35, 249, 247, 230, 251, - 5, 235, 213, 117, 109, 16, 7, 35, 79, 240, 32, 9, 3, 147, 5, 245, 160, - 115, 134, 248, 52, 112, 134, 248, 193, 114, 4, 147, 12, 175, 13, 235, - 9, 3, 71, 248, 44, 61, 79, 240, 1, 8, 57, 70, 32, 70, 205, 248, 20, - 144, 205, 248, 8, 128, 253, 247, 107, 252, 5, 241, 192, 3, 57, 70, 4, - 147, 32, 70, 9, 171, 1, 147, 205, 248, 20, 144, 253, 247, 96, 252, 9, - 155, 32, 70, 218, 178, 173, 248, 24, 32, 26, 10, 27, 12, 219, 178, 173, - 248, 28, 48, 8, 155, 210, 178, 27, 15, 3, 240, 7, 3, 6, 169, 173, 248, - 30, 48, 173, 248, 26, 32, 251, 247, 3, 253, 157, 248, 39, 16, 32, 70, - 1, 240, 127, 1, 251, 247, 131, 253, 8, 153, 32, 70, 9, 13, 201, 178, - 254, 247, 161, 248, 32, 70, 65, 70, 251, 247, 214, 252, 8, 154, 32, - 70, 145, 10, 137, 5, 146, 5, 146, 13, 137, 13, 254, 247, 120, 253, 5, - 245, 224, 115, 57, 70, 4, 147, 32, 70, 10, 171, 1, 147, 253, 247, 39, - 252, 32, 70, 189, 248, 40, 16, 255, 247, 158, 253, 5, 245, 16, 115, - 57, 70, 4, 147, 32, 70, 11, 171, 1, 147, 253, 247, 25, 252, 11, 159, - 79, 246, 248, 115, 255, 0, 59, 64, 32, 70, 64, 242, 166, 97, 65, 246, - 255, 114, 249, 247, 107, 251, 150, 249, 103, 53, 67, 69, 41, 221, 64, - 242, 37, 81, 32, 70, 249, 247, 113, 249, 192, 178, 133, 66, 212, 191, - 0, 37, 1, 37, 32, 70, 64, 242, 37, 81, 79, 244, 128, 114, 43, 2, 249, - 247, 85, 251, 32, 70, 64, 242, 37, 81, 79, 244, 0, 114, 107, 2, 249, - 247, 77, 251, 32, 70, 64, 242, 37, 81, 79, 244, 128, 98, 171, 2, 249, - 247, 69, 251, 32, 70, 64, 242, 37, 81, 79, 244, 0, 98, 235, 2, 249, - 247, 61, 251, 13, 176, 189, 232, 240, 131, 1, 0, 0, 128, 56, 181, 12, - 70, 0, 33, 5, 70, 255, 247, 60, 252, 40, 70, 33, 70, 189, 232, 56, 64, - 255, 247, 40, 191, 45, 233, 240, 79, 139, 176, 5, 146, 4, 70, 4, 145, - 251, 247, 203, 250, 64, 242, 59, 65, 2, 144, 32, 70, 249, 247, 45, 249, - 192, 243, 128, 16, 6, 169, 3, 144, 32, 70, 251, 247, 198, 250, 79, 244, - 122, 112, 238, 243, 151, 246, 79, 244, 122, 112, 238, 243, 147, 246, - 4, 245, 152, 83, 26, 105, 0, 35, 152, 70, 209, 24, 145, 248, 32, 16, - 25, 177, 8, 241, 1, 8, 31, 250, 136, 248, 1, 51, 4, 43, 244, 209, 20, - 39, 0, 38, 208, 224, 212, 248, 176, 48, 211, 248, 32, 49, 3, 240, 1, - 3, 131, 240, 1, 9, 27, 177, 227, 105, 24, 105, 56, 240, 145, 222, 32, - 70, 250, 247, 189, 254, 4, 245, 152, 83, 27, 105, 32, 70, 3, 235, 69, - 3, 153, 140, 255, 247, 171, 255, 32, 70, 1, 153, 253, 247, 229, 255, - 185, 241, 0, 15, 3, 209, 227, 105, 24, 105, 56, 240, 102, 222, 79, 244, - 0, 66, 64, 242, 164, 65, 19, 70, 32, 70, 249, 247, 208, 250, 65, 242, - 136, 48, 238, 243, 80, 246, 65, 242, 136, 48, 238, 243, 76, 246, 65, - 242, 136, 48, 238, 243, 72, 246, 32, 70, 64, 242, 166, 65, 249, 247, - 206, 248, 79, 234, 192, 89, 79, 234, 217, 89, 185, 241, 255, 15, 134, - 191, 169, 245, 128, 121, 31, 250, 137, 249, 9, 245, 128, 121, 79, 240, - 16, 11, 79, 240, 0, 10, 32, 70, 64, 242, 62, 97, 249, 247, 184, 248, - 11, 241, 255, 59, 192, 5, 192, 13, 31, 250, 139, 251, 130, 68, 187, - 241, 0, 15, 240, 209, 79, 234, 26, 26, 31, 250, 138, 250, 186, 241, - 255, 15, 140, 191, 170, 245, 128, 122, 10, 245, 128, 122, 56, 70, 0, - 33, 8, 170, 9, 171, 240, 243, 64, 244, 4, 245, 152, 83, 27, 105, 0, - 33, 91, 25, 147, 248, 32, 0, 13, 241, 34, 2, 13, 241, 38, 3, 240, 243, - 51, 244, 189, 249, 36, 16, 189, 249, 38, 48, 31, 250, 138, 250, 153, - 66, 9, 218, 189, 249, 34, 0, 89, 26, 240, 243, 216, 244, 189, 248, 36, - 176, 173, 248, 34, 0, 8, 224, 189, 249, 32, 0, 201, 26, 240, 243, 206, - 244, 189, 248, 38, 176, 173, 248, 32, 0, 189, 249, 32, 0, 189, 249, - 34, 16, 240, 243, 206, 244, 15, 250, 139, 243, 3, 43, 204, 191, 171, - 241, 4, 11, 203, 241, 4, 11, 15, 250, 139, 251, 11, 241, 255, 51, 1, - 34, 18, 250, 3, 243, 0, 235, 128, 0, 195, 24, 67, 250, 11, 251, 11, - 241, 12, 3, 24, 43, 20, 216, 4, 245, 152, 83, 27, 105, 42, 29, 83, 248, - 34, 0, 4, 155, 131, 68, 79, 234, 153, 9, 3, 248, 6, 176, 201, 241, 127, - 9, 5, 155, 9, 235, 154, 10, 3, 248, 6, 160, 1, 54, 182, 178, 1, 53, - 171, 178, 67, 69, 255, 244, 50, 175, 1, 55, 101, 47, 3, 208, 251, 178, - 1, 147, 0, 37, 244, 231, 32, 70, 3, 153, 251, 247, 98, 251, 32, 70, - 6, 169, 251, 247, 122, 251, 32, 70, 2, 153, 255, 247, 37, 251, 48, 70, - 11, 176, 189, 232, 240, 143, 0, 0, 45, 233, 240, 79, 135, 176, 4, 70, - 208, 248, 168, 112, 251, 247, 181, 249, 130, 70, 32, 70, 254, 247, 147, - 254, 79, 244, 137, 113, 95, 250, 128, 249, 32, 70, 248, 247, 213, 255, - 7, 33, 131, 70, 32, 70, 248, 247, 208, 255, 0, 240, 1, 0, 0, 144, 255, - 33, 32, 70, 248, 247, 201, 255, 0, 240, 16, 0, 128, 178, 1, 144, 64, - 242, 31, 17, 32, 70, 248, 247, 192, 255, 0, 240, 4, 0, 128, 178, 2, - 144, 64, 242, 171, 65, 32, 70, 248, 247, 244, 255, 212, 248, 176, 48, - 211, 248, 32, 49, 3, 240, 1, 3, 131, 240, 1, 2, 3, 146, 27, 177, 227, - 105, 24, 105, 56, 240, 121, 221, 0, 33, 32, 70, 255, 247, 221, 250, - 32, 70, 250, 247, 161, 253, 64, 242, 59, 65, 32, 70, 248, 247, 218, - 255, 4, 169, 192, 243, 128, 24, 32, 70, 251, 247, 116, 249, 32, 70, - 1, 33, 251, 247, 0, 251, 32, 70, 127, 33, 255, 247, 133, 254, 1, 34, - 19, 70, 32, 70, 7, 33, 249, 247, 117, 249, 16, 34, 19, 70, 32, 70, 255, - 33, 249, 247, 111, 249, 4, 34, 19, 70, 64, 242, 31, 17, 32, 70, 249, - 247, 104, 249, 32, 70, 254, 247, 123, 254, 6, 34, 71, 73, 32, 70, 249, - 247, 180, 249, 32, 70, 255, 247, 169, 251, 0, 33, 6, 70, 32, 70, 253, - 247, 160, 254, 0, 34, 32, 70, 1, 33, 249, 247, 41, 251, 64, 242, 171, - 65, 32, 70, 248, 247, 159, 255, 64, 242, 62, 97, 32, 70, 248, 247, 154, - 255, 197, 5, 237, 13, 43, 70, 32, 70, 64, 242, 166, 65, 64, 242, 255, - 18, 249, 247, 129, 249, 151, 248, 232, 51, 11, 179, 32, 70, 52, 73, - 9, 34, 249, 247, 139, 249, 0, 34, 32, 70, 1, 33, 249, 247, 8, 251, 64, - 242, 171, 65, 32, 70, 248, 247, 126, 255, 64, 242, 62, 97, 32, 70, 248, - 247, 121, 255, 195, 5, 64, 242, 154, 65, 32, 70, 64, 242, 255, 18, 219, - 13, 249, 247, 97, 249, 32, 70, 38, 73, 9, 34, 249, 247, 110, 249, 32, - 70, 64, 242, 166, 65, 64, 242, 255, 18, 43, 70, 249, 247, 84, 249, 0, - 35, 79, 244, 128, 82, 32, 70, 64, 242, 76, 65, 249, 247, 76, 249, 32, - 70, 49, 70, 253, 247, 78, 254, 32, 70, 65, 70, 251, 247, 131, 250, 32, - 70, 4, 169, 251, 247, 155, 250, 32, 70, 73, 70, 255, 247, 4, 254, 32, - 70, 81, 70, 255, 247, 66, 250, 32, 70, 79, 244, 137, 113, 90, 70, 248, - 247, 27, 255, 32, 70, 7, 33, 1, 34, 0, 155, 249, 247, 234, 248, 32, - 70, 255, 33, 16, 34, 1, 155, 249, 247, 228, 248, 2, 155, 32, 70, 64, - 242, 31, 17, 4, 34, 249, 247, 221, 248, 3, 155, 27, 185, 227, 105, 24, - 105, 56, 240, 167, 220, 7, 176, 189, 232, 240, 143, 158, 233, 1, 0, - 170, 233, 1, 0, 188, 233, 1, 0, 45, 233, 240, 79, 4, 70, 149, 176, 208, - 248, 168, 80, 64, 242, 231, 48, 14, 70, 238, 243, 137, 244, 7, 33, 32, - 70, 248, 247, 211, 254, 255, 33, 95, 250, 128, 248, 32, 70, 248, 247, - 205, 254, 64, 242, 31, 17, 95, 250, 128, 249, 32, 70, 248, 247, 198, - 254, 5, 33, 95, 250, 128, 250, 32, 70, 248, 247, 192, 254, 192, 178, - 0, 144, 37, 33, 32, 70, 248, 247, 186, 254, 192, 178, 1, 144, 79, 244, - 137, 113, 32, 70, 248, 247, 179, 254, 192, 178, 2, 144, 79, 240, 0, - 11, 136, 79, 32, 70, 55, 248, 11, 16, 248, 247, 230, 254, 7, 171, 35, - 248, 11, 0, 11, 241, 2, 11, 187, 241, 28, 15, 241, 209, 212, 248, 176, - 48, 211, 248, 32, 49, 3, 240, 1, 3, 131, 240, 1, 2, 3, 146, 27, 177, - 227, 105, 24, 105, 56, 240, 99, 220, 64, 242, 164, 65, 32, 70, 248, - 247, 142, 254, 0, 33, 4, 144, 32, 70, 255, 247, 193, 249, 149, 248, - 193, 82, 127, 33, 32, 70, 5, 149, 255, 247, 120, 253, 1, 34, 7, 33, - 19, 70, 32, 70, 249, 247, 104, 248, 16, 34, 255, 33, 19, 70, 32, 70, - 249, 247, 98, 248, 4, 34, 19, 70, 32, 70, 64, 242, 31, 17, 249, 247, - 91, 248, 54, 34, 32, 70, 104, 73, 249, 247, 170, 248, 32, 70, 251, 247, - 83, 249, 64, 8, 128, 178, 230, 40, 6, 220, 32, 70, 251, 247, 76, 249, - 67, 8, 25, 51, 155, 178, 0, 224, 255, 35, 255, 34, 32, 70, 64, 242, - 165, 65, 249, 247, 131, 248, 37, 33, 12, 34, 32, 70, 248, 247, 103, - 254, 8, 34, 19, 70, 5, 33, 32, 70, 249, 247, 54, 248, 9, 34, 87, 73, - 32, 70, 249, 247, 133, 248, 32, 70, 251, 247, 46, 249, 16, 35, 18, 147, - 1, 35, 173, 248, 78, 0, 8, 37, 15, 147, 32, 70, 13, 241, 78, 3, 79, - 240, 6, 11, 14, 169, 16, 149, 14, 147, 205, 248, 68, 176, 253, 247, - 226, 251, 1, 46, 32, 70, 11, 209, 73, 73, 90, 70, 249, 247, 104, 248, - 32, 34, 32, 70, 130, 33, 19, 70, 249, 247, 14, 248, 4, 38, 5, 224, 68, - 73, 90, 70, 249, 247, 92, 248, 10, 38, 7, 37, 1, 34, 70, 244, 0, 118, - 19, 70, 32, 70, 79, 244, 155, 97, 70, 234, 5, 21, 249, 247, 61, 248, - 171, 0, 32, 70, 79, 244, 155, 97, 64, 246, 252, 114, 249, 247, 53, 248, - 2, 34, 19, 70, 32, 70, 79, 244, 155, 97, 249, 247, 46, 248, 32, 70, - 79, 244, 155, 97, 79, 244, 224, 66, 79, 244, 0, 83, 249, 247, 37, 248, - 32, 34, 19, 70, 32, 70, 79, 244, 154, 97, 249, 247, 30, 248, 1, 33, - 0, 34, 32, 70, 249, 247, 173, 249, 32, 70, 64, 242, 118, 65, 248, 247, - 35, 254, 3, 4, 2, 212, 10, 32, 238, 243, 147, 243, 32, 70, 7, 33, 66, - 70, 248, 247, 243, 253, 32, 70, 255, 33, 74, 70, 248, 247, 238, 253, - 32, 70, 64, 242, 31, 17, 82, 70, 248, 247, 232, 253, 32, 70, 5, 33, - 0, 154, 248, 247, 227, 253, 32, 70, 37, 33, 1, 154, 248, 247, 222, 253, - 32, 70, 79, 244, 137, 113, 2, 154, 248, 247, 216, 253, 0, 37, 7, 171, - 121, 91, 90, 91, 32, 70, 2, 53, 248, 247, 1, 254, 28, 45, 246, 209, - 5, 155, 32, 70, 89, 178, 255, 247, 168, 252, 4, 154, 32, 70, 64, 242, - 164, 65, 248, 247, 195, 253, 3, 154, 26, 185, 227, 105, 24, 105, 56, - 240, 98, 219, 64, 242, 231, 48, 238, 243, 84, 243, 21, 176, 189, 232, - 240, 143, 0, 191, 20, 236, 1, 0, 112, 237, 1, 0, 220, 237, 1, 0, 238, - 237, 1, 0, 250, 237, 1, 0, 115, 181, 208, 248, 176, 48, 4, 70, 211, - 248, 32, 49, 208, 248, 168, 80, 3, 240, 1, 3, 131, 240, 1, 6, 27, 177, - 195, 105, 24, 105, 56, 240, 83, 219, 4, 245, 130, 83, 27, 121, 35, 187, - 180, 248, 218, 32, 2, 244, 112, 66, 178, 245, 0, 95, 6, 209, 4, 34, - 173, 248, 0, 32, 12, 34, 173, 248, 2, 32, 5, 224, 255, 34, 173, 248, - 0, 32, 173, 248, 2, 32, 240, 34, 32, 70, 105, 70, 173, 248, 4, 32, 173, - 248, 6, 48, 251, 247, 236, 248, 32, 70, 150, 33, 253, 247, 147, 252, - 32, 70, 1, 33, 255, 247, 121, 254, 91, 224, 32, 70, 255, 247, 111, 253, - 32, 70, 254, 247, 46, 252, 32, 70, 0, 33, 254, 247, 105, 254, 32, 70, - 56, 73, 15, 34, 248, 247, 139, 255, 149, 248, 232, 51, 219, 177, 32, - 70, 1, 33, 254, 247, 93, 254, 149, 249, 36, 53, 32, 70, 64, 242, 209, - 65, 255, 34, 155, 178, 248, 247, 105, 255, 149, 248, 37, 53, 32, 70, - 64, 242, 209, 65, 79, 244, 127, 66, 27, 2, 248, 247, 95, 255, 32, 70, - 41, 73, 12, 34, 248, 247, 108, 255, 5, 34, 40, 73, 32, 70, 248, 247, - 103, 255, 212, 248, 168, 48, 211, 248, 72, 36, 211, 248, 68, 52, 60, - 43, 180, 191, 25, 70, 60, 33, 138, 66, 1, 221, 147, 178, 3, 224, 59, - 43, 212, 191, 155, 178, 60, 35, 32, 70, 64, 242, 167, 65, 255, 34, 248, - 247, 61, 255, 180, 248, 218, 48, 32, 70, 3, 244, 112, 67, 179, 245, - 0, 95, 12, 191, 149, 248, 84, 52, 149, 248, 85, 52, 79, 244, 64, 65, - 43, 134, 255, 247, 54, 248, 64, 242, 118, 65, 32, 70, 248, 247, 54, - 253, 192, 5, 192, 13, 165, 248, 108, 5, 64, 242, 119, 65, 32, 70, 248, - 247, 45, 253, 213, 248, 52, 52, 192, 5, 192, 13, 165, 248, 110, 5, 27, - 177, 32, 70, 1, 33, 252, 247, 172, 249, 30, 185, 227, 105, 24, 105, - 56, 240, 156, 218, 124, 189, 0, 191, 48, 236, 1, 0, 78, 236, 1, 0, 102, - 236, 1, 0, 248, 181, 208, 248, 168, 64, 1, 35, 132, 248, 97, 48, 0, - 35, 132, 248, 192, 51, 176, 248, 218, 48, 5, 70, 3, 244, 112, 67, 179, - 245, 0, 95, 2, 209, 148, 248, 193, 51, 4, 224, 179, 245, 128, 95, 6, - 209, 148, 248, 194, 51, 2, 43, 2, 209, 1, 35, 132, 248, 192, 51, 181, - 248, 218, 48, 40, 70, 3, 244, 112, 67, 179, 245, 128, 95, 12, 191, 148, - 248, 235, 51, 148, 248, 234, 51, 0, 38, 132, 248, 233, 51, 99, 139, - 1, 39, 164, 248, 190, 50, 4, 34, 34, 73, 38, 112, 132, 248, 194, 98, - 132, 248, 195, 98, 132, 248, 196, 98, 132, 248, 103, 117, 248, 247, - 218, 254, 40, 70, 57, 70, 251, 247, 195, 250, 4, 34, 27, 73, 40, 70, - 248, 247, 209, 254, 40, 70, 253, 247, 50, 255, 40, 70, 255, 247, 179, - 250, 40, 70, 255, 247, 244, 254, 132, 248, 44, 96, 181, 248, 218, 16, - 40, 70, 250, 247, 49, 248, 40, 70, 253, 247, 71, 248, 79, 244, 128, - 66, 19, 70, 79, 244, 137, 97, 40, 70, 248, 247, 164, 254, 100, 32, 238, - 243, 37, 242, 51, 70, 40, 70, 79, 244, 137, 97, 79, 244, 128, 66, 248, - 247, 153, 254, 40, 70, 79, 244, 64, 65, 254, 247, 158, 255, 65, 242, - 136, 51, 227, 134, 132, 248, 154, 117, 248, 189, 92, 233, 1, 0, 138, - 233, 1, 0, 45, 233, 240, 79, 208, 248, 168, 96, 21, 70, 3, 241, 52, - 2, 6, 235, 66, 2, 178, 248, 4, 128, 6, 235, 67, 3, 178, 248, 10, 144, - 179, 248, 120, 112, 137, 176, 4, 70, 74, 70, 138, 70, 65, 70, 254, 247, - 92, 248, 32, 70, 57, 70, 255, 247, 140, 248, 7, 35, 4, 147, 32, 35, - 6, 147, 79, 234, 136, 88, 1, 35, 3, 147, 79, 234, 152, 88, 7, 171, 2, - 147, 79, 234, 136, 40, 79, 240, 0, 11, 47, 224, 19, 177, 26, 240, 1, - 15, 41, 209, 91, 178, 1, 51, 186, 251, 243, 243, 3, 245, 160, 115, 32, - 70, 2, 169, 5, 147, 252, 247, 240, 254, 7, 154, 79, 234, 137, 83, 79, - 234, 18, 91, 155, 13, 79, 234, 11, 91, 67, 234, 11, 11, 32, 70, 2, 169, - 75, 234, 8, 11, 205, 248, 28, 176, 253, 247, 193, 249, 150, 249, 102, - 53, 32, 70, 1, 51, 186, 251, 243, 243, 3, 245, 224, 115, 2, 169, 5, - 147, 7, 151, 253, 247, 180, 249, 10, 241, 1, 10, 170, 69, 150, 248, - 102, 53, 203, 217, 179, 177, 127, 45, 20, 209, 79, 244, 192, 117, 32, - 70, 2, 169, 5, 149, 205, 248, 28, 176, 253, 247, 162, 249, 5, 241, 128, - 3, 32, 70, 2, 169, 1, 53, 7, 151, 5, 147, 253, 247, 153, 249, 181, 245, - 224, 127, 236, 209, 150, 248, 129, 0, 150, 248, 126, 16, 150, 248, 127, - 32, 150, 248, 128, 48, 0, 144, 32, 70, 251, 247, 57, 251, 9, 176, 189, - 232, 240, 143, 112, 181, 0, 33, 4, 70, 208, 248, 168, 80, 11, 70, 127, - 34, 255, 247, 111, 255, 32, 70, 254, 247, 134, 248, 32, 70, 181, 248, - 184, 18, 181, 248, 186, 34, 250, 247, 230, 255, 32, 70, 64, 242, 209, - 97, 4, 34, 0, 35, 189, 232, 112, 64, 248, 247, 230, 189, 112, 181, 4, - 70, 208, 248, 168, 48, 13, 70, 169, 177, 147, 248, 188, 50, 0, 43, 41, - 208, 255, 247, 216, 255, 32, 70, 4, 34, 0, 35, 64, 242, 209, 97, 248, - 247, 211, 253, 128, 34, 32, 70, 64, 242, 118, 97, 19, 70, 189, 232, - 112, 64, 248, 247, 202, 189, 4, 34, 19, 70, 64, 242, 209, 97, 248, 247, - 196, 253, 128, 34, 32, 70, 43, 70, 64, 242, 118, 97, 248, 247, 189, - 253, 32, 70, 41, 70, 254, 247, 215, 255, 32, 70, 41, 70, 42, 70, 189, - 232, 112, 64, 253, 247, 156, 191, 112, 189, 0, 0, 16, 181, 4, 70, 17, - 185, 16, 73, 19, 34, 24, 224, 18, 34, 15, 73, 248, 247, 184, 253, 1, - 33, 0, 34, 32, 70, 251, 247, 73, 255, 12, 73, 6, 34, 32, 70, 248, 247, - 174, 253, 180, 248, 218, 48, 32, 70, 3, 244, 112, 67, 179, 245, 0, 95, - 12, 191, 6, 73, 7, 73, 30, 34, 189, 232, 16, 64, 248, 247, 159, 189, - 0, 191, 100, 233, 1, 0, 52, 235, 1, 0, 146, 233, 1, 0, 88, 235, 1, 0, - 148, 235, 1, 0, 45, 233, 240, 65, 4, 70, 15, 70, 21, 70, 64, 242, 218, - 97, 72, 242, 128, 2, 30, 70, 157, 248, 24, 128, 248, 247, 102, 253, - 32, 70, 250, 247, 63, 252, 184, 177, 64, 246, 82, 17, 32, 70, 248, 247, - 122, 251, 255, 34, 195, 178, 64, 246, 72, 17, 32, 70, 248, 247, 100, - 253, 64, 246, 83, 17, 32, 70, 248, 247, 110, 251, 64, 246, 73, 17, 195, - 178, 255, 34, 32, 70, 248, 247, 88, 253, 212, 248, 168, 48, 147, 248, - 70, 53, 123, 177, 64, 242, 235, 65, 32, 70, 248, 247, 93, 251, 0, 244, - 0, 115, 91, 18, 32, 70, 64, 242, 235, 65, 79, 244, 128, 98, 155, 2, - 248, 247, 67, 253, 123, 30, 255, 34, 155, 178, 32, 70, 64, 242, 66, - 97, 248, 247, 59, 253, 79, 246, 255, 115, 157, 66, 1, 208, 1, 61, 173, - 178, 32, 70, 79, 244, 200, 97, 79, 246, 255, 114, 43, 70, 248, 247, - 45, 253, 32, 70, 64, 242, 65, 97, 79, 246, 255, 114, 51, 70, 248, 247, - 37, 253, 32, 70, 184, 241, 0, 15, 5, 208, 8, 73, 4, 34, 189, 232, 240, - 65, 248, 247, 45, 189, 64, 242, 63, 97, 1, 34, 248, 247, 48, 251, 32, - 70, 1, 33, 189, 232, 240, 65, 255, 247, 96, 191, 240, 238, 1, 0, 248, - 181, 15, 70, 64, 242, 59, 65, 4, 70, 248, 247, 22, 251, 64, 242, 60, - 65, 6, 70, 32, 70, 248, 247, 16, 251, 5, 70, 32, 70, 119, 177, 14, 34, - 16, 73, 248, 247, 12, 253, 32, 70, 1, 33, 255, 247, 70, 255, 13, 73, - 32, 70, 7, 34, 189, 232, 248, 64, 248, 247, 1, 189, 4, 34, 10, 73, 248, - 247, 253, 252, 32, 70, 50, 70, 64, 242, 59, 65, 248, 247, 255, 250, - 32, 70, 64, 242, 60, 65, 42, 70, 189, 232, 248, 64, 248, 247, 247, 186, - 0, 191, 248, 233, 1, 0, 20, 234, 1, 0, 34, 234, 1, 0, 112, 181, 4, 70, - 13, 70, 248, 247, 106, 252, 32, 34, 107, 1, 32, 70, 79, 244, 150, 97, - 248, 247, 202, 252, 0, 35, 32, 70, 64, 242, 177, 65, 79, 244, 0, 114, - 248, 247, 194, 252, 180, 248, 218, 48, 3, 244, 112, 67, 179, 245, 0, - 95, 4, 209, 213, 241, 1, 3, 56, 191, 0, 35, 0, 224, 0, 35, 0, 45, 12, - 191, 32, 38, 0, 38, 32, 70, 96, 34, 70, 234, 131, 19, 79, 244, 130, - 97, 248, 247, 169, 252, 32, 70, 79, 244, 130, 97, 128, 34, 235, 1, 248, - 247, 162, 252, 32, 70, 189, 232, 112, 64, 248, 247, 58, 188, 0, 0, 45, - 233, 240, 79, 195, 176, 25, 147, 157, 248, 52, 49, 157, 248, 48, 145, - 12, 147, 157, 248, 56, 49, 189, 248, 68, 113, 13, 147, 157, 248, 60, - 49, 208, 248, 168, 176, 14, 147, 157, 248, 64, 49, 21, 70, 15, 147, - 78, 75, 4, 70, 136, 70, 36, 170, 3, 241, 32, 14, 24, 104, 89, 104, 22, - 70, 3, 198, 8, 51, 115, 69, 50, 70, 247, 209, 24, 104, 24, 35, 48, 96, - 52, 147, 62, 171, 1, 38, 50, 147, 32, 70, 32, 35, 54, 147, 141, 248, - 6, 97, 141, 248, 7, 97, 51, 150, 53, 150, 254, 247, 111, 254, 64, 242, - 215, 65, 16, 144, 32, 70, 248, 247, 110, 250, 192, 243, 192, 0, 17, - 144, 64, 242, 215, 65, 32, 70, 248, 247, 102, 250, 0, 244, 224, 64, - 0, 11, 18, 144, 54, 73, 32, 70, 6, 34, 248, 247, 96, 252, 32, 70, 52, - 73, 15, 34, 248, 247, 91, 252, 32, 70, 49, 70, 27, 170, 252, 247, 96, - 255, 32, 70, 49, 70, 0, 34, 252, 247, 207, 254, 185, 241, 0, 15, 23, - 209, 32, 70, 49, 70, 255, 247, 98, 255, 212, 248, 176, 48, 211, 248, - 32, 49, 218, 7, 16, 213, 227, 105, 184, 33, 24, 105, 66, 242, 16, 114, - 55, 240, 155, 223, 227, 105, 24, 105, 55, 240, 201, 223, 205, 248, 40, - 144, 3, 224, 0, 35, 10, 147, 0, 224, 10, 150, 32, 70, 1, 33, 250, 247, - 179, 253, 32, 70, 1, 33, 255, 247, 104, 254, 32, 70, 1, 33, 250, 247, - 204, 254, 64, 242, 234, 65, 32, 70, 248, 247, 30, 250, 64, 242, 235, - 65, 19, 144, 32, 70, 248, 247, 24, 250, 64, 242, 235, 65, 20, 144, 32, - 70, 248, 247, 18, 250, 0, 240, 7, 3, 64, 242, 235, 65, 32, 70, 219, - 0, 56, 34, 248, 247, 250, 251, 155, 248, 193, 50, 32, 70, 60, 169, 11, - 147, 250, 247, 162, 251, 149, 177, 43, 122, 32, 70, 99, 177, 105, 122, - 255, 247, 180, 248, 107, 122, 11, 147, 9, 224, 0, 191, 116, 185, 1, - 0, 44, 232, 1, 0, 106, 234, 1, 0, 41, 70, 250, 247, 58, 253, 64, 242, - 156, 65, 32, 70, 248, 247, 233, 249, 64, 242, 49, 97, 21, 144, 32, 70, - 248, 247, 227, 249, 64, 242, 214, 97, 22, 144, 32, 70, 248, 247, 221, - 249, 64, 242, 218, 97, 23, 144, 32, 70, 248, 247, 215, 249, 0, 33, 24, - 144, 32, 70, 250, 247, 194, 255, 32, 70, 164, 73, 7, 34, 248, 247, 208, - 251, 64, 171, 45, 147, 1, 35, 46, 147, 7, 35, 47, 147, 117, 177, 155, - 249, 102, 53, 106, 122, 1, 51, 146, 251, 243, 243, 3, 245, 16, 115, - 48, 147, 32, 70, 32, 35, 45, 169, 49, 147, 252, 247, 74, 252, 64, 155, - 79, 246, 248, 114, 219, 0, 26, 64, 32, 70, 64, 242, 113, 97, 64, 147, - 248, 247, 183, 249, 32, 70, 146, 73, 12, 34, 248, 247, 170, 251, 13, - 241, 142, 10, 86, 70, 0, 37, 32, 70, 54, 248, 2, 31, 248, 247, 97, 249, - 55, 171, 88, 85, 1, 53, 18, 45, 245, 209, 7, 34, 32, 70, 79, 244, 139, - 113, 248, 247, 109, 249, 180, 248, 218, 48, 3, 244, 112, 67, 179, 245, - 0, 95, 5, 209, 32, 70, 64, 242, 45, 17, 1, 34, 248, 247, 96, 249, 7, - 34, 32, 70, 79, 244, 150, 113, 248, 247, 90, 249, 180, 248, 218, 48, - 3, 244, 112, 67, 179, 245, 0, 95, 20, 209, 32, 70, 106, 33, 194, 34, - 248, 247, 78, 249, 32, 70, 152, 33, 12, 34, 248, 247, 73, 249, 32, 70, - 64, 242, 47, 17, 3, 34, 248, 247, 67, 249, 32, 70, 151, 33, 249, 34, - 248, 247, 62, 249, 11, 33, 7, 34, 32, 70, 248, 247, 57, 249, 16, 34, - 32, 70, 64, 242, 19, 17, 248, 247, 51, 249, 29, 33, 1, 34, 32, 70, 248, - 247, 46, 249, 1, 34, 32, 70, 79, 244, 138, 113, 248, 247, 40, 249, 180, - 248, 218, 48, 3, 244, 112, 67, 179, 245, 0, 95, 4, 209, 32, 70, 46, - 33, 16, 34, 248, 247, 28, 249, 32, 70, 79, 244, 149, 113, 8, 34, 248, - 247, 22, 249, 32, 70, 9, 33, 2, 34, 248, 247, 17, 249, 4, 34, 19, 70, - 32, 70, 64, 242, 31, 17, 248, 247, 223, 250, 32, 70, 255, 33, 16, 34, - 0, 35, 248, 247, 217, 250, 32, 70, 7, 33, 1, 34, 0, 35, 248, 247, 211, - 250, 32, 70, 5, 33, 8, 34, 0, 35, 248, 247, 205, 250, 79, 244, 0, 66, - 19, 70, 32, 70, 64, 242, 218, 97, 248, 247, 7, 251, 65, 70, 25, 154, - 11, 155, 32, 70, 253, 247, 35, 249, 0, 37, 131, 178, 1, 147, 1, 33, - 42, 70, 43, 70, 6, 70, 32, 70, 0, 149, 2, 149, 3, 149, 4, 149, 250, - 247, 37, 253, 12, 155, 175, 66, 8, 191, 79, 244, 130, 71, 0, 147, 13, - 155, 32, 70, 1, 147, 14, 155, 65, 70, 2, 147, 15, 155, 42, 70, 3, 147, - 79, 244, 175, 99, 4, 147, 128, 35, 7, 147, 75, 70, 5, 151, 6, 149, 8, - 149, 253, 247, 77, 248, 155, 249, 9, 52, 0, 43, 47, 208, 44, 224, 32, - 70, 50, 169, 252, 247, 114, 251, 62, 155, 67, 243, 11, 51, 135, 43, - 37, 221, 1, 62, 0, 37, 179, 178, 1, 147, 32, 70, 1, 33, 42, 70, 43, - 70, 0, 149, 2, 149, 3, 149, 4, 149, 250, 247, 239, 252, 12, 155, 32, - 70, 0, 147, 13, 155, 65, 70, 1, 147, 14, 155, 42, 70, 2, 147, 15, 155, - 5, 151, 3, 147, 79, 244, 175, 99, 4, 147, 128, 35, 7, 147, 75, 70, 6, - 149, 8, 149, 253, 247, 27, 248, 0, 46, 208, 209, 65, 170, 3, 50, 32, - 70, 13, 245, 131, 113, 250, 247, 115, 250, 157, 248, 7, 33, 63, 42, - 85, 216, 157, 249, 6, 49, 0, 43, 81, 219, 63, 43, 79, 220, 82, 178, - 154, 66, 76, 220, 184, 241, 0, 15, 40, 209, 24, 35, 66, 173, 47, 147, - 63, 171, 69, 248, 84, 61, 41, 70, 32, 70, 48, 146, 252, 247, 37, 251, - 157, 249, 6, 49, 41, 70, 32, 70, 63, 158, 48, 147, 69, 70, 252, 247, - 28, 251, 14, 224, 0, 191, 56, 232, 1, 0, 164, 236, 1, 0, 66, 169, 63, - 171, 65, 248, 84, 61, 32, 70, 48, 149, 63, 150, 252, 247, 240, 253, - 1, 53, 157, 249, 7, 33, 107, 178, 154, 66, 240, 220, 24, 35, 47, 147, - 62, 35, 66, 173, 48, 147, 63, 171, 69, 248, 84, 61, 32, 70, 41, 70, - 252, 247, 251, 250, 63, 35, 32, 70, 41, 70, 48, 147, 252, 247, 216, - 253, 1, 35, 32, 70, 41, 70, 48, 147, 252, 247, 239, 250, 0, 35, 32, - 70, 41, 70, 48, 147, 252, 247, 204, 253, 32, 70, 252, 247, 101, 251, - 32, 70, 64, 242, 234, 65, 19, 154, 248, 247, 88, 248, 32, 70, 64, 242, - 235, 65, 20, 154, 248, 247, 82, 248, 32, 70, 215, 33, 2, 34, 0, 35, - 248, 247, 240, 249, 8, 34, 19, 70, 32, 70, 215, 33, 248, 247, 234, 249, - 0, 35, 32, 70, 79, 244, 148, 113, 8, 34, 248, 247, 227, 249, 32, 70, - 79, 244, 139, 113, 0, 34, 248, 247, 8, 248, 32, 70, 64, 242, 156, 65, - 21, 154, 248, 247, 51, 248, 32, 70, 64, 242, 49, 97, 22, 154, 248, 247, - 45, 248, 32, 70, 64, 242, 214, 97, 23, 154, 248, 247, 39, 248, 24, 157, - 32, 70, 69, 240, 1, 2, 146, 178, 64, 242, 218, 97, 248, 247, 30, 248, - 32, 70, 1, 33, 250, 247, 255, 253, 17, 157, 32, 70, 235, 0, 64, 242, - 215, 65, 8, 34, 248, 247, 248, 249, 18, 157, 32, 70, 43, 3, 64, 242, - 215, 65, 79, 244, 224, 66, 248, 247, 239, 249, 32, 70, 251, 247, 106, - 250, 0, 37, 86, 70, 55, 171, 90, 93, 32, 70, 54, 248, 2, 31, 1, 53, - 247, 247, 203, 255, 18, 45, 245, 209, 79, 244, 0, 98, 0, 35, 32, 70, - 64, 242, 76, 65, 248, 247, 216, 249, 32, 70, 0, 33, 255, 247, 36, 252, - 32, 70, 0, 33, 250, 247, 103, 251, 32, 70, 64, 242, 59, 65, 1, 34, 0, - 35, 248, 247, 201, 249, 0, 35, 79, 244, 0, 98, 32, 70, 64, 246, 56, - 17, 248, 247, 193, 249, 32, 70, 0, 33, 255, 247, 231, 252, 32, 70, 0, - 33, 27, 170, 252, 247, 212, 252, 32, 70, 8, 73, 15, 34, 248, 247, 197, - 249, 10, 157, 29, 185, 227, 105, 24, 105, 55, 240, 59, 221, 32, 70, - 16, 153, 252, 247, 175, 254, 67, 176, 189, 232, 240, 143, 206, 233, - 1, 0, 45, 233, 240, 79, 141, 176, 221, 248, 88, 144, 155, 70, 1, 35, - 128, 70, 146, 70, 137, 248, 8, 48, 100, 36, 0, 37, 46, 25, 118, 16, - 0, 33, 182, 178, 219, 35, 137, 248, 9, 96, 1, 39, 74, 70, 3, 147, 64, - 70, 11, 70, 0, 145, 1, 145, 2, 145, 4, 151, 5, 145, 255, 247, 232, 252, - 24, 35, 8, 147, 63, 35, 9, 147, 11, 171, 6, 147, 64, 70, 32, 35, 6, - 169, 10, 147, 7, 151, 252, 247, 25, 250, 11, 155, 26, 5, 18, 21, 82, - 67, 67, 243, 11, 51, 3, 251, 3, 35, 15, 74, 24, 70, 217, 23, 130, 69, - 123, 235, 1, 3, 40, 191, 52, 70, 56, 191, 53, 70, 79, 240, 255, 51, - 18, 235, 10, 2, 67, 235, 11, 3, 130, 66, 115, 235, 1, 7, 3, 210, 80, - 69, 113, 235, 11, 3, 2, 211, 99, 27, 1, 43, 188, 220, 48, 70, 13, 176, - 189, 232, 240, 143, 48, 248, 255, 255, 247, 181, 4, 70, 208, 248, 168, - 112, 144, 248, 218, 0, 14, 70, 248, 247, 13, 252, 64, 246, 180, 18, - 144, 66, 5, 70, 180, 248, 218, 48, 8, 208, 219, 178, 1, 43, 7, 208, - 0, 2, 160, 245, 196, 32, 160, 245, 128, 96, 3, 224, 26, 72, 1, 224, - 79, 244, 82, 48, 0, 34, 79, 244, 122, 113, 249, 247, 26, 255, 160, 251, - 0, 35, 32, 70, 0, 150, 255, 247, 130, 255, 160, 241, 40, 2, 146, 178, - 29, 42, 27, 217, 39, 40, 9, 217, 64, 246, 180, 19, 157, 66, 8, 208, - 45, 2, 165, 245, 190, 32, 160, 245, 0, 112, 4, 224, 79, 244, 52, 48, - 1, 224, 79, 244, 112, 48, 0, 34, 79, 244, 122, 113, 249, 247, 249, 254, - 160, 251, 0, 35, 32, 70, 0, 150, 255, 247, 97, 255, 4, 56, 135, 248, - 194, 2, 254, 189, 0, 191, 0, 142, 3, 0, 45, 233, 240, 79, 208, 248, - 168, 48, 143, 176, 22, 70, 24, 34, 147, 248, 244, 115, 10, 146, 13, - 170, 8, 146, 1, 251, 1, 251, 32, 34, 123, 178, 12, 146, 1, 34, 9, 146, - 179, 241, 255, 63, 8, 191, 1, 39, 63, 34, 3, 35, 5, 70, 11, 146, 7, - 147, 79, 240, 5, 8, 6, 35, 0, 36, 3, 147, 71, 246, 255, 115, 50, 70, - 5, 147, 40, 70, 35, 70, 33, 70, 79, 240, 1, 9, 0, 148, 1, 148, 2, 148, - 205, 248, 16, 144, 255, 247, 49, 252, 40, 70, 8, 169, 252, 247, 107, - 249, 13, 155, 26, 5, 18, 21, 82, 67, 67, 243, 11, 51, 3, 251, 3, 35, - 91, 69, 114, 122, 7, 210, 0, 47, 78, 209, 200, 241, 0, 10, 95, 250, - 138, 250, 204, 70, 1, 224, 194, 70, 164, 70, 79, 250, 138, 249, 31, - 250, 137, 249, 9, 235, 2, 4, 6, 151, 164, 178, 103, 70, 201, 235, 4, - 2, 146, 178, 63, 177, 91, 69, 7, 217, 202, 235, 2, 10, 6, 159, 134, - 248, 9, 160, 39, 224, 91, 69, 36, 211, 35, 178, 127, 43, 33, 220, 0, - 43, 31, 219, 6, 35, 3, 147, 1, 35, 0, 33, 4, 147, 71, 246, 255, 115, - 50, 70, 116, 114, 5, 147, 40, 70, 11, 70, 0, 145, 1, 145, 2, 145, 255, - 247, 235, 251, 40, 70, 8, 169, 252, 247, 37, 249, 13, 155, 76, 68, 26, - 5, 18, 21, 82, 67, 67, 243, 11, 51, 3, 251, 3, 35, 164, 178, 204, 231, - 6, 159, 7, 155, 79, 250, 136, 248, 79, 234, 104, 8, 1, 59, 95, 250, - 136, 248, 7, 147, 140, 209, 15, 176, 189, 232, 240, 143, 45, 233, 240, - 79, 141, 176, 3, 147, 195, 105, 208, 248, 168, 128, 4, 70, 14, 70, 152, - 104, 79, 244, 128, 97, 23, 70, 237, 243, 155, 246, 5, 70, 0, 40, 0, - 240, 135, 128, 4, 245, 128, 83, 222, 97, 32, 70, 1, 33, 255, 247, 122, - 251, 152, 248, 44, 48, 67, 177, 32, 70, 63, 73, 6, 34, 248, 247, 90, - 248, 32, 70, 0, 33, 252, 247, 74, 248, 166, 177, 1, 35, 59, 74, 134, - 234, 230, 113, 161, 235, 230, 113, 90, 67, 178, 251, 241, 249, 31, 250, - 137, 249, 1, 251, 9, 241, 1, 51, 145, 66, 155, 178, 239, 209, 185, 245, - 128, 127, 2, 217, 86, 224, 79, 240, 2, 9, 79, 240, 36, 11, 11, 251, - 6, 251, 73, 246, 64, 67, 155, 251, 243, 251, 79, 234, 11, 75, 100, 35, - 79, 240, 0, 8, 155, 251, 243, 251, 170, 70, 70, 70, 38, 224, 64, 70, - 10, 169, 249, 247, 144, 248, 11, 154, 216, 68, 122, 67, 3, 212, 210, - 19, 1, 50, 82, 16, 4, 224, 82, 66, 210, 19, 1, 50, 82, 16, 82, 66, 10, - 155, 146, 5, 146, 13, 123, 67, 3, 212, 219, 19, 1, 51, 91, 16, 4, 224, - 91, 66, 219, 19, 1, 51, 91, 16, 91, 66, 155, 5, 155, 13, 67, 234, 130, - 35, 1, 54, 74, 248, 4, 59, 182, 178, 78, 69, 214, 209, 6, 34, 32, 70, - 19, 73, 247, 247, 254, 255, 21, 35, 7, 147, 0, 39, 32, 35, 32, 70, 5, - 169, 9, 147, 5, 149, 6, 150, 8, 151, 252, 247, 101, 251, 3, 155, 32, - 70, 0, 147, 49, 70, 79, 246, 255, 114, 59, 70, 255, 247, 85, 250, 227, - 105, 41, 70, 152, 104, 79, 244, 128, 98, 237, 243, 32, 246, 13, 176, - 189, 232, 240, 143, 0, 191, 158, 232, 1, 0, 0, 90, 98, 2, 236, 233, - 1, 0, 112, 181, 0, 245, 128, 83, 208, 248, 168, 80, 0, 34, 218, 97, - 149, 248, 44, 48, 4, 70, 59, 177, 43, 73, 6, 34, 247, 247, 201, 255, - 32, 70, 1, 33, 251, 247, 185, 255, 32, 70, 64, 242, 68, 97, 247, 247, - 189, 253, 16, 240, 1, 3, 9, 208, 32, 70, 0, 33, 255, 247, 247, 249, - 2, 34, 32, 70, 64, 242, 63, 97, 19, 70, 6, 224, 129, 7, 6, 213, 32, - 70, 64, 242, 83, 65, 79, 244, 0, 66, 247, 247, 152, 255, 32, 70, 26, - 73, 9, 34, 247, 247, 165, 255, 32, 70, 0, 33, 255, 247, 185, 250, 32, - 70, 249, 247, 90, 254, 48, 177, 32, 70, 252, 247, 140, 249, 1, 70, 32, - 70, 254, 247, 162, 249, 149, 248, 71, 53, 32, 70, 155, 2, 3, 244, 124, - 67, 64, 242, 235, 65, 79, 244, 128, 98, 247, 247, 120, 255, 181, 248, - 78, 53, 123, 177, 32, 70, 255, 34, 64, 246, 72, 17, 247, 247, 111, 255, - 181, 248, 80, 53, 32, 70, 64, 246, 73, 17, 255, 34, 189, 232, 112, 64, - 247, 247, 101, 191, 112, 189, 244, 234, 1, 0, 194, 238, 1, 0, 112, 181, - 5, 70, 136, 176, 12, 70, 248, 247, 223, 253, 40, 70, 52, 185, 255, 247, - 144, 255, 40, 70, 33, 70, 255, 247, 124, 250, 32, 224, 33, 70, 1, 34, - 249, 247, 31, 249, 4, 70, 200, 185, 40, 70, 1, 33, 255, 247, 113, 250, - 13, 75, 64, 38, 3, 147, 21, 35, 5, 147, 40, 70, 16, 35, 3, 169, 7, 147, - 4, 150, 6, 148, 252, 247, 191, 250, 40, 70, 49, 70, 79, 246, 255, 114, - 35, 70, 0, 148, 255, 247, 176, 249, 0, 224, 1, 36, 32, 70, 8, 176, 112, - 189, 0, 191, 126, 2, 2, 0, 45, 233, 248, 67, 15, 1, 4, 70, 208, 248, - 168, 144, 253, 247, 171, 251, 64, 242, 215, 65, 6, 70, 5, 70, 32, 70, - 247, 247, 42, 253, 153, 249, 37, 53, 128, 70, 88, 28, 14, 208, 0, 43, - 184, 191, 3, 51, 64, 34, 183, 235, 163, 15, 32, 70, 64, 242, 215, 65, - 1, 218, 0, 35, 0, 224, 19, 70, 247, 247, 7, 255, 4, 245, 128, 83, 219, - 105, 32, 70, 75, 177, 255, 247, 58, 255, 5, 32, 237, 243, 129, 242, - 32, 70, 27, 73, 112, 34, 0, 35, 1, 224, 25, 73, 112, 34, 255, 247, 138, - 254, 32, 70, 49, 70, 254, 247, 184, 251, 79, 240, 11, 9, 1, 33, 32, - 70, 253, 247, 14, 254, 198, 27, 0, 46, 51, 70, 184, 191, 243, 28, 5, - 235, 163, 5, 1, 61, 127, 45, 168, 191, 127, 37, 37, 234, 229, 117, 32, - 70, 41, 70, 4, 54, 254, 247, 160, 251, 8, 46, 2, 217, 185, 241, 1, 9, - 228, 209, 32, 70, 255, 247, 10, 255, 32, 70, 64, 242, 215, 65, 66, 70, - 247, 247, 228, 252, 32, 70, 253, 247, 80, 251, 189, 232, 248, 131, 0, - 191, 0, 9, 61, 0, 112, 181, 177, 241, 255, 63, 4, 70, 21, 70, 157, 249, - 16, 96, 1, 208, 139, 25, 12, 224, 34, 185, 144, 248, 41, 22, 255, 247, - 137, 255, 1, 224, 1, 50, 4, 208, 32, 70, 41, 70, 255, 247, 130, 255, - 131, 25, 32, 70, 25, 70, 189, 232, 112, 64, 254, 247, 109, 187, 45, - 233, 240, 67, 145, 176, 5, 70, 208, 248, 168, 64, 253, 247, 38, 251, - 28, 35, 141, 248, 57, 48, 1, 35, 141, 248, 56, 48, 181, 248, 218, 48, - 95, 250, 128, 248, 3, 244, 112, 66, 178, 245, 128, 95, 8, 209, 218, - 178, 64, 42, 1, 216, 27, 34, 0, 224, 45, 34, 141, 248, 57, 32, 50, 224, - 178, 245, 0, 95, 47, 209, 180, 248, 42, 21, 11, 178, 1, 51, 4, 208, - 79, 246, 255, 115, 0, 41, 8, 191, 25, 70, 180, 248, 246, 51, 26, 178, - 1, 50, 5, 208, 79, 246, 255, 114, 0, 43, 8, 191, 19, 70, 1, 224, 79, - 244, 145, 115, 180, 248, 44, 117, 148, 248, 240, 35, 56, 178, 1, 48, - 4, 208, 79, 246, 255, 112, 0, 47, 8, 191, 7, 70, 180, 248, 248, 99, - 48, 178, 1, 48, 4, 208, 79, 246, 255, 112, 0, 46, 8, 191, 6, 70, 148, - 248, 241, 147, 147, 224, 219, 178, 64, 43, 47, 216, 180, 248, 46, 21, - 11, 178, 1, 51, 4, 208, 79, 246, 255, 115, 0, 41, 8, 191, 25, 70, 180, - 248, 250, 51, 26, 178, 1, 50, 5, 208, 79, 246, 255, 114, 0, 43, 8, 191, - 19, 70, 1, 224, 79, 244, 145, 115, 180, 248, 48, 117, 148, 248, 89, - 37, 56, 178, 1, 48, 4, 208, 79, 246, 255, 112, 0, 47, 8, 191, 7, 70, - 180, 248, 0, 100, 48, 178, 1, 48, 4, 208, 79, 246, 255, 112, 0, 46, - 8, 191, 6, 70, 148, 248, 91, 149, 96, 224, 140, 43, 47, 216, 180, 248, - 50, 21, 11, 178, 1, 51, 4, 208, 79, 246, 255, 115, 0, 41, 8, 191, 25, - 70, 180, 248, 252, 51, 26, 178, 1, 50, 5, 208, 79, 246, 255, 114, 0, - 43, 8, 191, 19, 70, 1, 224, 79, 244, 145, 115, 180, 248, 52, 117, 148, - 248, 242, 35, 56, 178, 1, 48, 4, 208, 79, 246, 255, 112, 0, 47, 8, 191, - 7, 70, 180, 248, 2, 100, 48, 178, 1, 48, 4, 208, 79, 246, 255, 112, - 0, 46, 8, 191, 6, 70, 148, 248, 243, 147, 46, 224, 180, 248, 54, 21, - 11, 178, 1, 51, 4, 208, 79, 246, 255, 115, 0, 41, 8, 191, 25, 70, 180, - 248, 254, 51, 26, 178, 1, 50, 5, 208, 79, 246, 255, 114, 0, 43, 8, 191, - 19, 70, 1, 224, 79, 244, 145, 115, 180, 248, 56, 117, 148, 248, 90, - 37, 56, 178, 1, 48, 4, 208, 79, 246, 255, 112, 0, 47, 8, 191, 7, 70, - 180, 248, 4, 100, 48, 178, 1, 48, 4, 208, 79, 246, 255, 112, 0, 46, - 8, 191, 6, 70, 148, 248, 92, 149, 9, 178, 72, 28, 5, 208, 40, 70, 255, - 247, 142, 254, 132, 248, 7, 4, 20, 224, 25, 178, 75, 28, 6, 208, 40, - 70, 12, 170, 255, 247, 176, 252, 157, 248, 57, 48, 8, 224, 83, 178, - 1, 51, 2, 208, 132, 248, 7, 36, 4, 224, 157, 248, 57, 48, 11, 177, 132, - 248, 7, 52, 57, 178, 72, 28, 5, 208, 40, 70, 255, 247, 112, 254, 132, - 248, 8, 4, 17, 224, 49, 178, 74, 28, 8, 208, 40, 70, 12, 170, 255, 247, - 146, 252, 157, 248, 57, 48, 132, 248, 8, 52, 5, 224, 79, 250, 137, 243, - 1, 51, 24, 191, 132, 248, 8, 148, 148, 249, 239, 51, 1, 51, 2, 208, - 255, 35, 132, 248, 8, 52, 148, 248, 8, 36, 81, 178, 75, 28, 116, 208, - 148, 248, 7, 52, 88, 178, 129, 66, 216, 191, 132, 248, 8, 52, 148, 248, - 8, 52, 216, 191, 132, 248, 7, 36, 141, 248, 57, 48, 0, 38, 219, 35, - 3, 147, 1, 39, 51, 70, 40, 70, 49, 70, 12, 170, 0, 150, 1, 150, 2, 150, - 4, 151, 5, 150, 255, 247, 192, 248, 24, 35, 9, 147, 32, 35, 11, 147, - 8, 151, 15, 171, 40, 70, 7, 169, 7, 147, 10, 150, 251, 247, 242, 253, - 6, 241, 64, 3, 40, 70, 7, 169, 1, 54, 10, 147, 252, 247, 205, 248, 64, - 46, 238, 209, 148, 249, 7, 36, 148, 249, 8, 52, 211, 24, 3, 235, 211, - 115, 91, 16, 164, 248, 104, 53, 181, 248, 218, 48, 3, 244, 112, 66, - 178, 245, 0, 95, 5, 209, 180, 248, 94, 37, 18, 177, 164, 248, 104, 37, - 16, 224, 219, 178, 64, 43, 3, 216, 180, 248, 96, 53, 19, 177, 7, 224, - 140, 43, 2, 216, 180, 248, 98, 53, 19, 185, 180, 248, 100, 53, 11, 177, - 164, 248, 104, 53, 40, 70, 64, 242, 36, 81, 79, 244, 0, 66, 0, 35, 247, - 247, 22, 253, 148, 249, 102, 53, 180, 248, 104, 37, 1, 51, 146, 251, - 243, 243, 155, 178, 40, 70, 64, 242, 37, 81, 255, 34, 247, 247, 8, 253, - 2, 35, 132, 248, 103, 53, 41, 224, 1, 35, 132, 248, 103, 53, 40, 70, - 64, 242, 37, 81, 255, 34, 127, 35, 247, 247, 250, 252, 40, 70, 64, 242, - 37, 81, 79, 244, 128, 114, 0, 35, 247, 247, 242, 252, 40, 70, 64, 242, - 37, 81, 79, 244, 0, 114, 0, 35, 247, 247, 234, 252, 40, 70, 64, 242, - 37, 81, 79, 244, 128, 98, 0, 35, 247, 247, 226, 252, 40, 70, 64, 242, - 37, 81, 79, 244, 0, 98, 0, 35, 247, 247, 218, 252, 0, 35, 164, 248, - 106, 53, 40, 70, 64, 242, 37, 81, 148, 249, 102, 101, 247, 247, 223, - 250, 1, 54, 182, 178, 192, 178, 70, 67, 148, 249, 102, 53, 164, 248, - 104, 101, 19, 177, 40, 70, 252, 247, 62, 254, 148, 248, 239, 51, 40, - 70, 90, 178, 1, 50, 8, 191, 148, 248, 7, 52, 0, 33, 141, 248, 57, 48, - 219, 35, 3, 147, 1, 35, 12, 170, 4, 147, 11, 70, 0, 145, 1, 145, 2, - 145, 5, 145, 255, 247, 17, 248, 40, 70, 65, 70, 254, 247, 113, 249, - 40, 70, 64, 242, 113, 97, 247, 247, 179, 250, 180, 248, 106, 37, 64, - 242, 113, 97, 160, 235, 194, 2, 146, 178, 40, 70, 247, 247, 180, 250, - 40, 70, 251, 247, 184, 253, 17, 176, 189, 232, 240, 131, 45, 233, 240, - 79, 195, 176, 5, 146, 4, 70, 22, 34, 15, 70, 19, 168, 0, 33, 17, 147, - 232, 243, 128, 244, 101, 75, 31, 170, 3, 241, 8, 6, 24, 104, 89, 104, - 21, 70, 3, 197, 8, 51, 179, 66, 42, 70, 247, 209, 24, 104, 155, 136, - 40, 96, 171, 128, 93, 75, 35, 170, 3, 241, 8, 6, 24, 104, 89, 104, 21, - 70, 3, 197, 8, 51, 179, 66, 42, 70, 247, 209, 24, 104, 155, 136, 40, - 96, 171, 128, 86, 77, 72, 242, 103, 1, 40, 104, 173, 248, 240, 16, 105, - 104, 72, 242, 69, 34, 54, 171, 173, 248, 244, 32, 3, 195, 39, 170, 5, - 241, 8, 3, 16, 53, 24, 104, 89, 104, 22, 70, 3, 198, 8, 51, 171, 66, - 50, 70, 247, 209, 24, 104, 74, 77, 155, 136, 48, 96, 105, 104, 40, 104, - 179, 128, 56, 171, 3, 195, 43, 170, 165, 241, 14, 3, 6, 61, 24, 104, - 89, 104, 22, 70, 3, 198, 8, 51, 171, 66, 50, 70, 247, 209, 24, 104, - 155, 136, 48, 96, 179, 128, 71, 246, 151, 51, 173, 248, 248, 48, 173, - 248, 252, 48, 227, 105, 0, 38, 152, 104, 48, 33, 58, 150, 59, 150, 212, - 248, 168, 80, 237, 243, 102, 242, 6, 144, 0, 40, 0, 240, 125, 130, 64, - 242, 219, 97, 32, 70, 247, 247, 44, 250, 64, 242, 218, 97, 12, 144, - 32, 70, 247, 247, 38, 250, 48, 73, 13, 144, 4, 34, 32, 70, 247, 247, - 35, 252, 5, 153, 7, 41, 89, 216, 223, 232, 1, 240, 11, 4, 88, 88, 88, - 23, 39, 31, 7, 38, 13, 241, 140, 10, 19, 170, 13, 241, 172, 8, 81, 224, - 0, 33, 10, 70, 32, 70, 11, 70, 0, 150, 13, 241, 124, 10, 250, 247, 44, - 249, 7, 38, 19, 170, 67, 224, 5, 241, 130, 2, 1, 38, 13, 241, 240, 10, - 13, 241, 248, 8, 61, 224, 5, 241, 130, 2, 1, 38, 13, 241, 244, 10, 13, - 241, 252, 8, 53, 224, 65, 171, 3, 51, 65, 170, 0, 147, 65, 169, 1, 50, - 13, 245, 131, 115, 32, 70, 249, 247, 240, 255, 157, 248, 4, 33, 157, - 248, 5, 49, 0, 33, 67, 234, 2, 35, 173, 248, 90, 48, 0, 35, 157, 248, - 6, 33, 173, 248, 92, 48, 157, 248, 7, 49, 173, 248, 96, 16, 67, 234, - 2, 35, 173, 248, 94, 48, 4, 38, 13, 241, 216, 10, 19, 170, 13, 241, - 224, 8, 13, 224, 0, 191, 152, 185, 1, 0, 166, 185, 1, 0, 188, 185, 1, - 0, 104, 239, 1, 0, 0, 38, 178, 70, 50, 70, 13, 241, 156, 8, 79, 240, - 64, 14, 16, 35, 223, 248, 32, 178, 141, 232, 8, 64, 0, 33, 11, 35, 32, - 70, 205, 248, 8, 176, 247, 247, 39, 253, 5, 34, 123, 73, 32, 70, 247, - 247, 174, 251, 32, 70, 249, 247, 64, 251, 79, 244, 128, 82, 19, 70, - 14, 144, 64, 242, 164, 65, 32, 70, 247, 247, 144, 251, 0, 33, 32, 70, - 253, 247, 150, 252, 64, 242, 219, 65, 32, 70, 247, 247, 150, 249, 112, - 73, 6, 34, 15, 144, 32, 70, 247, 247, 147, 251, 180, 248, 218, 48, 32, - 70, 3, 244, 112, 67, 179, 245, 0, 95, 12, 191, 106, 73, 106, 73, 18, - 34, 247, 247, 134, 251, 64, 242, 215, 65, 32, 70, 247, 247, 126, 249, - 6, 153, 16, 144, 32, 70, 251, 247, 250, 249, 32, 70, 64, 242, 59, 65, - 247, 247, 116, 249, 192, 243, 128, 16, 7, 144, 24, 177, 32, 70, 58, - 169, 249, 247, 12, 251, 87, 185, 7, 154, 26, 185, 32, 70, 41, 142, 254, - 247, 30, 248, 32, 70, 52, 169, 249, 247, 1, 251, 52, 175, 183, 248, - 2, 144, 59, 136, 79, 234, 9, 25, 73, 234, 3, 41, 187, 136, 56, 104, - 121, 104, 73, 234, 3, 9, 50, 171, 3, 195, 31, 250, 137, 249, 47, 168, - 0, 33, 10, 34, 232, 243, 52, 243, 185, 241, 0, 15, 10, 209, 47, 168, - 75, 73, 10, 34, 173, 248, 200, 144, 173, 248, 202, 144, 173, 248, 204, - 144, 232, 243, 194, 242, 32, 70, 50, 169, 249, 247, 133, 252, 0, 39, - 4, 34, 32, 70, 68, 73, 247, 247, 54, 251, 79, 240, 16, 9, 57, 70, 10, - 35, 32, 70, 65, 74, 1, 151, 205, 248, 0, 144, 205, 248, 8, 176, 247, - 247, 157, 252, 32, 35, 57, 70, 1, 147, 32, 70, 10, 35, 58, 74, 205, - 248, 0, 144, 205, 248, 8, 176, 247, 247, 145, 252, 32, 70, 64, 242, - 83, 65, 64, 242, 164, 114, 247, 247, 30, 249, 181, 248, 200, 115, 64, - 246, 166, 99, 0, 47, 8, 191, 31, 70, 5, 155, 5, 43, 1, 209, 127, 66, - 191, 178, 4, 245, 128, 83, 219, 105, 43, 177, 32, 70, 255, 247, 43, - 251, 5, 32, 236, 243, 114, 246, 63, 178, 79, 244, 122, 113, 1, 35, 121, - 67, 88, 34, 32, 70, 255, 247, 123, 250, 64, 242, 218, 97, 79, 246, 255, - 114, 32, 70, 247, 247, 248, 248, 180, 248, 218, 48, 32, 70, 3, 244, - 112, 67, 179, 245, 0, 95, 11, 191, 149, 248, 149, 21, 149, 248, 150, - 37, 5, 145, 5, 146, 252, 247, 87, 255, 255, 35, 192, 178, 205, 248, - 36, 128, 177, 70, 10, 144, 46, 70, 8, 147, 79, 240, 0, 8, 85, 70, 160, - 224, 0, 33, 173, 248, 0, 17, 53, 248, 2, 123, 5, 154, 7, 244, 112, 103, - 63, 10, 42, 179, 4, 47, 3, 208, 8, 155, 4, 43, 30, 209, 25, 224, 10, - 155, 5, 154, 153, 24, 201, 178, 75, 178, 49, 234, 35, 1, 40, 191, 127, - 33, 16, 224, 70, 240, 1, 0, 154, 231, 1, 0, 166, 231, 1, 0, 42, 238, - 1, 0, 194, 236, 1, 0, 78, 238, 1, 0, 220, 231, 1, 0, 91, 87, 1, 0, 10, - 153, 32, 70, 251, 247, 173, 255, 249, 178, 8, 145, 9, 155, 66, 169, - 51, 248, 2, 43, 9, 147, 1, 235, 71, 3, 51, 248, 76, 60, 27, 177, 210, - 178, 66, 234, 3, 34, 146, 178, 3, 63, 191, 178, 32, 70, 64, 242, 82, - 65, 247, 247, 151, 248, 1, 47, 11, 151, 21, 216, 107, 75, 16, 39, 79, - 240, 69, 10, 2, 147, 32, 70, 0, 33, 13, 241, 254, 2, 1, 35, 141, 232, - 128, 4, 247, 247, 229, 251, 32, 70, 0, 33, 64, 170, 1, 35, 141, 232, - 128, 12, 247, 247, 234, 251, 32, 70, 64, 242, 81, 65, 53, 248, 2, 44, - 247, 247, 119, 248, 32, 70, 250, 247, 187, 250, 0, 40, 123, 208, 96, - 35, 223, 248, 104, 161, 16, 39, 0, 33, 1, 147, 32, 70, 11, 35, 25, 170, - 0, 151, 205, 248, 8, 160, 247, 247, 195, 251, 64, 35, 1, 147, 0, 33, - 25, 170, 11, 35, 32, 70, 0, 151, 205, 248, 8, 176, 247, 247, 197, 251, - 11, 154, 1, 42, 11, 216, 69, 35, 1, 147, 76, 75, 32, 70, 2, 147, 0, - 33, 13, 241, 254, 2, 1, 35, 0, 151, 247, 247, 182, 251, 16, 35, 96, - 39, 141, 232, 136, 0, 32, 70, 0, 33, 6, 241, 130, 2, 11, 35, 205, 248, - 8, 160, 247, 247, 156, 251, 8, 241, 1, 8, 200, 69, 127, 244, 92, 175, - 96, 35, 1, 147, 60, 75, 6, 241, 130, 7, 53, 70, 2, 147, 16, 38, 32, - 70, 0, 33, 58, 70, 11, 35, 0, 150, 247, 247, 136, 251, 1, 35, 165, 248, - 152, 48, 80, 35, 1, 147, 32, 70, 0, 33, 58, 70, 4, 35, 0, 150, 205, - 248, 8, 176, 247, 247, 135, 251, 85, 35, 1, 147, 32, 70, 0, 33, 5, 241, - 140, 2, 2, 35, 0, 150, 205, 248, 8, 176, 247, 247, 123, 251, 32, 70, - 249, 247, 192, 248, 160, 177, 64, 169, 13, 245, 129, 114, 32, 70, 251, - 247, 87, 253, 32, 70, 251, 247, 236, 251, 189, 248, 0, 17, 5, 70, 189, - 248, 2, 33, 32, 70, 252, 247, 202, 251, 32, 70, 41, 70, 253, 247, 250, - 251, 17, 153, 17, 185, 32, 70, 255, 247, 17, 250, 32, 70, 6, 153, 249, - 247, 241, 254, 32, 70, 64, 242, 215, 65, 16, 154, 246, 247, 231, 255, - 227, 105, 6, 153, 152, 104, 48, 34, 237, 243, 23, 240, 32, 70, 64, 242, - 219, 65, 15, 154, 246, 247, 219, 255, 0, 34, 32, 70, 64, 242, 83, 65, - 246, 247, 213, 255, 7, 154, 26, 177, 32, 70, 58, 169, 249, 247, 16, - 251, 32, 70, 14, 153, 253, 247, 187, 250, 32, 70, 64, 242, 218, 97, - 13, 154, 246, 247, 197, 255, 32, 70, 64, 242, 219, 97, 12, 154, 246, - 247, 191, 255, 67, 176, 189, 232, 240, 143, 149, 81, 1, 0, 91, 87, 1, - 0, 45, 233, 240, 79, 135, 176, 4, 70, 249, 247, 63, 249, 4, 169, 6, - 70, 32, 70, 212, 248, 168, 80, 249, 247, 64, 249, 32, 70, 249, 247, - 90, 249, 64, 242, 215, 65, 2, 144, 32, 70, 246, 247, 151, 255, 3, 144, - 32, 70, 253, 247, 142, 251, 131, 70, 38, 185, 32, 70, 252, 247, 8, 254, - 130, 70, 1, 224, 79, 240, 255, 10, 180, 248, 218, 48, 79, 240, 42, 8, - 3, 244, 112, 67, 179, 245, 0, 95, 12, 191, 149, 248, 30, 117, 149, 248, - 31, 117, 32, 70, 127, 178, 57, 70, 15, 34, 60, 35, 205, 248, 0, 128, - 255, 247, 163, 250, 149, 248, 70, 149, 185, 241, 0, 15, 0, 240, 146, - 128, 32, 70, 64, 242, 235, 65, 246, 247, 105, 255, 18, 33, 192, 243, - 64, 35, 1, 34, 32, 70, 247, 247, 17, 249, 106, 120, 0, 33, 82, 26, 24, - 191, 1, 34, 11, 70, 32, 70, 255, 247, 182, 252, 32, 70, 251, 247, 75, - 251, 64, 243, 7, 35, 64, 178, 165, 248, 74, 53, 165, 248, 76, 5, 64, - 242, 235, 65, 32, 70, 246, 247, 74, 255, 0, 244, 128, 99, 155, 18, 32, - 70, 91, 2, 64, 242, 235, 65, 79, 244, 0, 114, 247, 247, 48, 249, 0, - 33, 7, 34, 11, 70, 32, 70, 255, 247, 150, 252, 32, 70, 251, 247, 43, - 251, 64, 243, 7, 35, 64, 178, 165, 248, 78, 53, 165, 248, 80, 5, 255, - 34, 32, 70, 181, 248, 74, 53, 64, 246, 82, 17, 247, 247, 24, 249, 32, - 70, 255, 34, 181, 248, 76, 53, 64, 246, 83, 17, 247, 247, 16, 249, 32, - 70, 255, 34, 181, 248, 74, 53, 64, 246, 86, 17, 247, 247, 8, 249, 32, - 70, 255, 34, 181, 248, 76, 53, 64, 246, 87, 17, 247, 247, 0, 249, 32, - 70, 255, 34, 181, 248, 78, 53, 64, 246, 72, 17, 247, 247, 248, 248, - 255, 34, 32, 70, 181, 248, 80, 53, 64, 246, 73, 17, 247, 247, 240, 248, - 149, 248, 76, 53, 181, 248, 74, 21, 32, 70, 67, 234, 1, 33, 137, 178, - 253, 247, 4, 251, 149, 248, 71, 53, 32, 70, 155, 2, 64, 242, 235, 65, - 79, 244, 128, 98, 3, 244, 124, 67, 247, 247, 218, 248, 149, 248, 72, - 53, 32, 70, 91, 2, 64, 242, 235, 65, 79, 244, 0, 114, 3, 244, 126, 67, - 247, 247, 206, 248, 16, 224, 15, 34, 60, 35, 32, 70, 57, 70, 205, 248, - 0, 128, 255, 247, 3, 250, 106, 120, 32, 70, 0, 50, 73, 70, 24, 191, - 1, 34, 75, 70, 255, 247, 40, 252, 32, 70, 248, 247, 115, 255, 16, 177, - 32, 70, 251, 247, 204, 250, 0, 33, 11, 70, 127, 34, 32, 70, 252, 247, - 138, 249, 32, 70, 89, 70, 251, 247, 177, 253, 32, 70, 2, 153, 249, 247, - 137, 250, 32, 70, 4, 169, 249, 247, 254, 249, 32, 70, 64, 242, 215, - 65, 3, 154, 246, 247, 183, 254, 32, 70, 30, 177, 49, 70, 253, 247, 162, - 249, 2, 224, 81, 70, 253, 247, 92, 253, 7, 176, 189, 232, 240, 143, - 0, 0, 45, 233, 240, 79, 152, 70, 195, 105, 208, 248, 168, 96, 167, 176, - 4, 70, 15, 70, 152, 104, 79, 244, 131, 113, 21, 70, 236, 243, 193, 246, - 130, 70, 0, 40, 0, 240, 232, 129, 184, 241, 2, 15, 22, 209, 14, 224, - 59, 70, 25, 120, 148, 248, 218, 32, 1, 61, 6, 63, 145, 66, 10, 209, - 32, 70, 89, 136, 154, 136, 249, 247, 99, 250, 1, 37, 204, 225, 107, - 30, 6, 34, 2, 251, 3, 119, 0, 45, 234, 209, 197, 225, 184, 241, 1, 15, - 64, 240, 193, 129, 32, 70, 249, 247, 3, 248, 0, 33, 9, 144, 32, 70, - 253, 247, 97, 249, 0, 37, 123, 79, 32, 70, 121, 91, 246, 247, 35, 254, - 24, 171, 88, 83, 2, 53, 24, 45, 245, 209, 64, 242, 49, 97, 32, 70, 246, - 247, 86, 254, 21, 34, 10, 144, 64, 242, 49, 97, 32, 70, 247, 247, 50, - 248, 64, 242, 76, 65, 32, 70, 246, 247, 74, 254, 64, 242, 77, 65, 11, - 144, 32, 70, 246, 247, 68, 254, 79, 244, 150, 97, 12, 144, 32, 70, 246, - 247, 62, 254, 64, 242, 177, 65, 13, 144, 32, 70, 246, 247, 56, 254, - 64, 242, 249, 65, 14, 144, 32, 70, 246, 247, 50, 254, 64, 242, 250, - 65, 15, 144, 32, 70, 246, 247, 44, 254, 64, 246, 56, 17, 16, 144, 32, - 70, 246, 247, 38, 254, 64, 246, 57, 17, 17, 144, 32, 70, 246, 247, 32, - 254, 64, 242, 59, 65, 18, 144, 32, 70, 246, 247, 26, 254, 64, 242, 60, - 65, 19, 144, 32, 70, 246, 247, 20, 254, 64, 242, 218, 97, 20, 144, 32, - 70, 246, 247, 14, 254, 64, 242, 219, 97, 21, 144, 32, 70, 246, 247, - 8, 254, 64, 242, 183, 65, 22, 144, 32, 70, 246, 247, 2, 254, 64, 242, - 59, 65, 23, 144, 32, 70, 246, 247, 252, 253, 192, 243, 128, 25, 185, - 241, 0, 15, 7, 208, 32, 70, 36, 169, 248, 247, 147, 255, 150, 248, 193, - 98, 7, 150, 1, 224, 205, 248, 28, 144, 32, 70, 48, 153, 253, 247, 162, - 252, 6, 34, 32, 70, 61, 73, 246, 247, 231, 255, 180, 248, 218, 48, 3, - 244, 112, 67, 179, 245, 0, 95, 4, 209, 32, 70, 152, 33, 3, 34, 246, - 247, 178, 253, 32, 70, 54, 73, 25, 34, 246, 247, 214, 255, 32, 70, 53, - 73, 24, 34, 246, 247, 209, 255, 180, 248, 218, 48, 79, 240, 3, 8, 3, - 244, 112, 67, 179, 245, 0, 95, 20, 191, 4, 35, 0, 35, 8, 147, 35, 225, - 179, 178, 0, 147, 187, 178, 0, 37, 1, 147, 31, 250, 136, 243, 42, 70, - 2, 147, 32, 70, 8, 155, 41, 70, 3, 149, 4, 149, 249, 247, 212, 249, - 32, 70, 1, 33, 249, 247, 53, 249, 43, 70, 32, 70, 34, 73, 60, 34, 254, - 247, 46, 255, 32, 70, 79, 244, 137, 113, 42, 70, 246, 247, 123, 253, - 33, 171, 0, 147, 79, 244, 250, 123, 43, 70, 32, 70, 79, 244, 128, 97, - 32, 34, 205, 248, 4, 176, 249, 247, 75, 255, 3, 70, 48, 185, 23, 72, - 6, 147, 245, 247, 193, 251, 6, 155, 29, 70, 69, 224, 43, 70, 32, 70, - 17, 73, 120, 34, 254, 247, 12, 255, 32, 70, 79, 244, 137, 113, 42, 70, - 246, 247, 89, 253, 30, 171, 141, 232, 8, 8, 32, 70, 79, 244, 128, 97, - 32, 34, 43, 70, 249, 247, 44, 255, 160, 185, 131, 70, 8, 72, 245, 247, - 163, 251, 93, 70, 40, 224, 0, 191, 240, 231, 1, 0, 28, 239, 1, 0, 186, - 239, 1, 0, 236, 239, 1, 0, 128, 132, 30, 0, 30, 233, 1, 0, 56, 233, - 1, 0, 34, 154, 31, 153, 35, 155, 177, 235, 66, 15, 13, 217, 2, 235, - 130, 2, 145, 66, 9, 210, 32, 154, 178, 235, 67, 15, 5, 217, 3, 235, - 131, 3, 154, 66, 44, 191, 0, 37, 1, 37, 22, 241, 255, 54, 2, 211, 0, - 45, 132, 208, 1, 37, 23, 241, 255, 55, 3, 211, 0, 45, 0, 240, 160, 128, - 1, 37, 24, 241, 255, 56, 2, 211, 0, 45, 0, 240, 155, 128, 32, 70, 64, - 242, 209, 97, 4, 34, 0, 35, 246, 247, 34, 255, 45, 177, 32, 70, 79, - 244, 128, 97, 250, 247, 144, 254, 5, 70, 32, 70, 254, 247, 82, 255, - 32, 70, 64, 242, 49, 97, 10, 154, 246, 247, 44, 253, 32, 70, 64, 242, - 76, 65, 11, 154, 246, 247, 38, 253, 32, 70, 64, 242, 77, 65, 12, 154, - 246, 247, 32, 253, 32, 70, 79, 244, 150, 97, 13, 154, 246, 247, 26, - 253, 32, 70, 64, 242, 177, 65, 14, 154, 246, 247, 20, 253, 32, 70, 64, - 242, 249, 65, 15, 154, 246, 247, 14, 253, 32, 70, 64, 242, 250, 65, - 16, 154, 246, 247, 8, 253, 32, 70, 64, 246, 56, 17, 17, 154, 246, 247, - 2, 253, 32, 70, 64, 246, 57, 17, 18, 154, 246, 247, 252, 252, 32, 70, - 64, 242, 59, 65, 19, 154, 246, 247, 246, 252, 32, 70, 64, 242, 60, 65, - 20, 154, 246, 247, 240, 252, 32, 70, 64, 242, 218, 97, 21, 154, 246, - 247, 234, 252, 32, 70, 64, 242, 219, 97, 22, 154, 246, 247, 228, 252, - 32, 70, 64, 242, 183, 65, 23, 154, 246, 247, 222, 252, 32, 70, 64, 242, - 76, 65, 4, 34, 0, 35, 246, 247, 189, 254, 0, 38, 23, 75, 32, 70, 153, - 91, 24, 171, 154, 91, 2, 54, 246, 247, 157, 252, 24, 46, 245, 209, 32, - 70, 185, 241, 0, 15, 3, 208, 7, 153, 253, 247, 115, 251, 2, 224, 73, - 70, 248, 247, 230, 255, 32, 70, 9, 153, 252, 247, 173, 255, 32, 70, - 0, 33, 249, 247, 54, 248, 0, 224, 0, 37, 227, 105, 81, 70, 152, 104, - 79, 244, 131, 114, 236, 243, 230, 244, 0, 224, 5, 70, 40, 70, 39, 176, - 189, 232, 240, 143, 6, 38, 219, 230, 4, 39, 251, 231, 240, 231, 1, 0, - 247, 181, 4, 70, 248, 247, 45, 254, 226, 105, 4, 245, 129, 83, 18, 106, - 212, 248, 168, 80, 26, 96, 180, 248, 218, 48, 0, 34, 133, 248, 188, - 50, 4, 245, 128, 83, 131, 248, 36, 32, 212, 248, 176, 48, 7, 70, 211, - 248, 32, 49, 3, 240, 1, 3, 131, 240, 1, 6, 83, 177, 227, 105, 184, 33, - 24, 105, 66, 242, 16, 114, 54, 240, 213, 217, 227, 105, 24, 105, 54, - 240, 3, 218, 32, 70, 1, 33, 254, 247, 135, 249, 15, 34, 36, 73, 32, - 70, 246, 247, 106, 254, 32, 70, 249, 247, 35, 251, 32, 70, 0, 33, 253, - 247, 111, 248, 0, 33, 32, 70, 10, 70, 252, 247, 54, 248, 32, 70, 248, - 247, 26, 250, 4, 245, 130, 83, 27, 121, 107, 177, 32, 70, 253, 247, - 44, 252, 32, 70, 0, 33, 252, 247, 41, 253, 149, 248, 232, 51, 27, 177, - 32, 70, 1, 33, 252, 247, 34, 253, 32, 70, 255, 247, 150, 252, 0, 33, - 127, 35, 10, 70, 0, 147, 32, 70, 1, 35, 255, 247, 156, 253, 255, 35, - 133, 248, 7, 52, 133, 248, 8, 52, 32, 70, 254, 247, 127, 255, 32, 70, - 57, 70, 252, 247, 42, 255, 32, 70, 0, 33, 254, 247, 70, 249, 54, 185, - 227, 105, 24, 105, 3, 176, 189, 232, 240, 64, 54, 240, 162, 153, 3, - 176, 240, 189, 190, 234, 1, 0, 1, 41, 208, 248, 168, 48, 1, 209, 252, - 247, 36, 188, 179, 248, 108, 37, 179, 248, 110, 53, 255, 43, 136, 191, - 163, 245, 0, 115, 255, 42, 136, 191, 162, 245, 0, 114, 155, 178, 146, - 178, 154, 26, 16, 178, 112, 71, 112, 181, 208, 248, 168, 48, 211, 248, - 208, 99, 211, 248, 204, 83, 211, 248, 212, 67, 255, 247, 222, 255, 99, - 30, 5, 251, 16, 101, 1, 38, 22, 250, 3, 243, 237, 24, 85, 250, 4, 244, - 96, 178, 112, 189, 45, 233, 240, 65, 176, 248, 218, 48, 6, 70, 3, 244, - 112, 66, 178, 245, 0, 95, 208, 248, 168, 64, 4, 209, 180, 248, 84, 131, - 180, 248, 132, 117, 19, 224, 219, 178, 148, 43, 3, 217, 180, 248, 134, - 117, 2, 35, 8, 224, 99, 43, 3, 217, 180, 248, 136, 117, 1, 35, 2, 224, - 180, 248, 138, 117, 0, 35, 4, 235, 67, 3, 179, 248, 86, 131, 184, 241, - 255, 15, 28, 208, 1, 33, 48, 70, 255, 247, 190, 255, 25, 56, 71, 67, - 63, 178, 0, 47, 204, 191, 7, 245, 250, 117, 167, 245, 250, 117, 79, - 244, 122, 115, 149, 251, 243, 245, 173, 178, 69, 68, 173, 178, 48, 70, - 64, 242, 52, 65, 255, 34, 43, 70, 246, 247, 160, 253, 164, 248, 102, - 83, 189, 232, 240, 129, 112, 181, 208, 248, 168, 48, 1, 41, 211, 248, - 220, 99, 211, 248, 216, 83, 211, 248, 224, 67, 3, 209, 2, 33, 252, 247, - 168, 251, 9, 224, 64, 242, 117, 65, 246, 247, 152, 251, 192, 5, 192, - 13, 255, 40, 136, 191, 160, 245, 0, 112, 0, 251, 21, 96, 99, 31, 1, - 37, 21, 250, 3, 243, 4, 60, 192, 24, 32, 65, 64, 178, 112, 189, 16, - 181, 208, 248, 168, 48, 204, 178, 211, 248, 212, 4, 2, 14, 127, 42, - 68, 234, 0, 32, 200, 191, 162, 245, 128, 114, 195, 248, 212, 4, 211, - 248, 216, 4, 138, 26, 18, 24, 195, 248, 216, 36, 146, 16, 195, 248, - 220, 36, 16, 189, 8, 34, 112, 181, 19, 70, 4, 70, 87, 33, 246, 247, - 22, 253, 86, 33, 32, 70, 246, 247, 38, 251, 0, 240, 248, 5, 86, 33, - 42, 70, 32, 70, 246, 247, 54, 251, 1, 32, 236, 243, 206, 240, 86, 33, - 69, 240, 3, 2, 32, 70, 246, 247, 45, 251, 1, 32, 236, 243, 197, 240, - 86, 33, 69, 240, 7, 2, 32, 70, 246, 247, 36, 251, 79, 244, 150, 112, - 236, 243, 187, 240, 32, 70, 87, 33, 8, 34, 0, 35, 189, 232, 112, 64, - 246, 247, 237, 188, 0, 0, 45, 233, 240, 79, 181, 75, 139, 176, 4, 70, - 13, 70, 6, 170, 3, 241, 8, 7, 24, 104, 89, 104, 22, 70, 3, 198, 8, 51, - 187, 66, 50, 70, 247, 209, 24, 104, 48, 96, 153, 136, 155, 121, 177, - 128, 179, 113, 212, 248, 168, 112, 0, 35, 170, 78, 26, 1, 145, 89, 169, - 66, 3, 208, 1, 51, 14, 43, 247, 209, 87, 227, 32, 70, 145, 33, 182, - 24, 0, 34, 246, 247, 238, 250, 32, 70, 56, 33, 7, 34, 246, 247, 233, - 250, 10, 34, 32, 70, 136, 33, 246, 247, 228, 250, 212, 248, 168, 48, - 147, 248, 130, 37, 26, 177, 32, 70, 136, 33, 246, 247, 219, 250, 42, - 33, 32, 70, 50, 122, 246, 247, 214, 250, 48, 33, 3, 34, 32, 70, 115, - 122, 246, 247, 165, 252, 145, 33, 3, 34, 32, 70, 179, 122, 246, 247, - 159, 252, 243, 122, 56, 33, 15, 34, 32, 70, 246, 247, 153, 252, 145, - 33, 0, 34, 32, 70, 246, 247, 191, 250, 56, 33, 7, 34, 32, 70, 246, 247, - 186, 250, 51, 123, 48, 33, 12, 34, 155, 0, 32, 70, 246, 247, 136, 252, - 94, 33, 15, 34, 32, 70, 115, 123, 246, 247, 130, 252, 179, 123, 94, - 33, 27, 1, 240, 34, 32, 70, 246, 247, 123, 252, 108, 33, 32, 70, 242, - 123, 246, 247, 161, 250, 8, 34, 32, 70, 56, 33, 246, 247, 156, 250, - 145, 33, 32, 70, 3, 34, 246, 247, 151, 250, 10, 170, 85, 25, 32, 70, - 94, 33, 21, 248, 17, 44, 246, 247, 143, 250, 1, 34, 32, 70, 126, 33, - 246, 247, 138, 250, 151, 248, 238, 35, 26, 177, 32, 70, 56, 33, 246, - 247, 131, 250, 7, 34, 19, 70, 32, 70, 42, 33, 246, 247, 82, 252, 32, - 70, 44, 33, 0, 34, 246, 247, 120, 250, 32, 70, 42, 33, 12, 34, 246, - 247, 115, 250, 1, 34, 32, 70, 44, 33, 246, 247, 110, 250, 212, 248, - 168, 48, 147, 248, 82, 37, 42, 179, 147, 248, 83, 37, 32, 70, 94, 33, - 246, 247, 99, 250, 212, 248, 168, 48, 32, 70, 147, 248, 84, 37, 42, - 33, 246, 247, 91, 250, 212, 248, 168, 48, 32, 70, 147, 248, 85, 37, - 43, 33, 246, 247, 83, 250, 212, 248, 168, 48, 32, 70, 147, 248, 86, - 37, 44, 33, 246, 247, 75, 250, 212, 248, 168, 48, 32, 70, 45, 33, 147, - 248, 87, 37, 246, 247, 67, 250, 180, 248, 218, 48, 3, 244, 112, 67, - 179, 245, 128, 95, 4, 209, 32, 70, 191, 33, 238, 34, 246, 247, 55, 250, - 2, 34, 19, 70, 32, 70, 64, 242, 31, 17, 246, 247, 5, 252, 4, 34, 247, - 33, 19, 70, 32, 70, 246, 247, 255, 251, 241, 33, 3, 34, 0, 35, 32, 70, - 246, 247, 249, 251, 242, 33, 248, 34, 144, 35, 32, 70, 246, 247, 243, - 251, 162, 35, 243, 33, 255, 34, 32, 70, 246, 247, 237, 251, 180, 248, - 218, 48, 3, 244, 112, 67, 179, 245, 0, 95, 4, 209, 212, 248, 168, 48, - 147, 248, 24, 53, 6, 224, 179, 245, 128, 95, 6, 209, 212, 248, 168, - 48, 147, 248, 25, 53, 1, 43, 0, 240, 94, 130, 0, 35, 32, 70, 157, 33, - 4, 34, 246, 247, 209, 251, 0, 35, 68, 33, 32, 70, 2, 147, 246, 247, - 223, 249, 192, 178, 3, 144, 64, 242, 43, 17, 32, 70, 246, 247, 216, - 249, 192, 178, 4, 144, 68, 33, 32, 70, 7, 34, 246, 247, 174, 251, 14, - 34, 32, 70, 64, 242, 43, 17, 246, 247, 168, 251, 2, 154, 4, 245, 128, - 83, 157, 106, 10, 177, 104, 0, 0, 224, 40, 70, 26, 75, 157, 66, 5, 217, - 25, 79, 189, 66, 140, 191, 4, 39, 2, 39, 0, 224, 1, 39, 180, 248, 218, - 128, 8, 244, 112, 72, 184, 245, 0, 95, 5, 209, 115, 104, 79, 234, 64, - 9, 3, 235, 67, 10, 2, 224, 79, 240, 0, 9, 202, 70, 16, 34, 14, 73, 248, - 247, 193, 249, 13, 73, 1, 144, 121, 67, 16, 34, 40, 70, 248, 247, 186, - 249, 184, 245, 0, 95, 5, 144, 17, 209, 80, 70, 2, 33, 16, 34, 248, 247, - 177, 249, 6, 70, 11, 224, 0, 191, 196, 185, 1, 0, 248, 4, 2, 0, 128, - 186, 140, 1, 0, 117, 25, 3, 64, 66, 15, 0, 0, 38, 79, 33, 2, 34, 32, - 70, 246, 247, 153, 249, 202, 75, 79, 234, 197, 11, 3, 251, 7, 248, 187, - 251, 248, 248, 8, 241, 1, 8, 79, 234, 88, 8, 8, 241, 255, 56, 95, 250, - 136, 248, 82, 33, 7, 34, 32, 70, 79, 234, 152, 3, 246, 247, 88, 251, - 83, 33, 96, 34, 32, 70, 79, 234, 72, 19, 246, 247, 81, 251, 8, 241, - 1, 3, 95, 67, 187, 74, 187, 251, 247, 251, 187, 79, 90, 68, 178, 251, - 247, 247, 1, 63, 255, 178, 81, 33, 58, 70, 32, 70, 0, 147, 246, 247, - 106, 249, 5, 154, 48, 70, 17, 1, 16, 34, 248, 247, 105, 249, 1, 55, - 71, 67, 0, 155, 123, 67, 4, 212, 223, 19, 1, 55, 127, 16, 1, 63, 7, - 224, 111, 234, 8, 8, 8, 251, 7, 247, 255, 19, 1, 55, 111, 234, 103, - 7, 59, 10, 83, 33, 15, 34, 219, 178, 32, 70, 246, 247, 32, 251, 84, - 33, 250, 178, 32, 70, 246, 247, 70, 249, 10, 35, 3, 251, 10, 250, 162, - 79, 69, 33, 185, 251, 247, 249, 186, 251, 249, 248, 9, 251, 24, 170, - 79, 234, 90, 2, 18, 5, 10, 240, 1, 10, 79, 234, 89, 3, 2, 235, 153, - 2, 79, 234, 10, 90, 178, 251, 243, 242, 83, 68, 179, 251, 249, 249, - 79, 234, 24, 19, 9, 235, 2, 7, 32, 70, 31, 34, 219, 178, 246, 247, 247, - 250, 79, 234, 8, 19, 70, 33, 32, 70, 79, 244, 248, 114, 3, 240, 240, - 3, 246, 247, 237, 250, 59, 12, 219, 178, 70, 33, 15, 34, 32, 70, 246, - 247, 230, 250, 58, 10, 71, 33, 32, 70, 210, 178, 246, 247, 11, 249, - 72, 33, 250, 178, 32, 70, 246, 247, 6, 249, 2, 155, 65, 242, 148, 25, - 0, 43, 8, 191, 79, 244, 250, 89, 169, 245, 216, 121, 79, 244, 245, 115, - 169, 241, 3, 9, 153, 251, 243, 249, 3, 251, 9, 250, 10, 245, 42, 122, - 79, 244, 37, 98, 79, 234, 74, 42, 186, 251, 242, 250, 64, 242, 124, - 103, 7, 251, 10, 247, 167, 245, 88, 55, 167, 245, 192, 103, 183, 251, - 243, 247, 12, 191, 79, 244, 130, 123, 79, 244, 225, 123, 127, 10, 79, - 234, 201, 3, 7, 240, 28, 2, 67, 234, 146, 2, 66, 33, 32, 70, 146, 178, - 246, 247, 210, 248, 7, 240, 31, 2, 67, 33, 32, 70, 66, 240, 32, 2, 246, - 247, 202, 248, 79, 234, 75, 34, 79, 244, 135, 115, 178, 251, 243, 243, - 3, 251, 10, 250, 99, 74, 79, 234, 90, 42, 98, 75, 178, 251, 250, 242, - 211, 24, 79, 244, 18, 65, 179, 251, 241, 243, 3, 240, 15, 1, 94, 75, - 32, 70, 179, 251, 250, 243, 163, 245, 76, 35, 163, 245, 0, 99, 26, 12, - 65, 234, 2, 18, 146, 178, 64, 33, 246, 247, 166, 248, 88, 74, 79, 240, - 37, 83, 179, 251, 250, 243, 163, 245, 70, 51, 178, 251, 250, 250, 79, - 244, 184, 65, 163, 245, 0, 115, 170, 245, 110, 58, 179, 251, 241, 243, - 170, 245, 0, 122, 3, 240, 15, 3, 186, 251, 241, 242, 67, 234, 2, 18, - 65, 33, 32, 70, 146, 178, 246, 247, 136, 248, 6, 241, 116, 67, 79, 244, - 150, 103, 3, 245, 144, 3, 147, 251, 247, 243, 41, 39, 95, 67, 79, 244, - 92, 115, 3, 251, 8, 248, 64, 242, 43, 83, 3, 251, 9, 249, 9, 245, 228, - 97, 11, 251, 8, 240, 12, 49, 16, 34, 248, 247, 115, 248, 7, 245, 216, - 23, 0, 235, 103, 0, 144, 251, 247, 247, 255, 178, 60, 47, 148, 191, - 79, 240, 0, 8, 79, 240, 1, 8, 184, 241, 0, 15, 0, 208, 127, 8, 4, 63, - 255, 178, 60, 33, 63, 34, 32, 70, 59, 70, 246, 247, 42, 250, 60, 33, - 64, 34, 79, 234, 136, 19, 32, 70, 246, 247, 35, 250, 180, 248, 218, - 48, 3, 244, 112, 67, 179, 245, 0, 95, 4, 209, 212, 248, 168, 48, 147, - 248, 39, 53, 6, 224, 179, 245, 128, 95, 26, 209, 212, 248, 168, 48, - 147, 248, 40, 53, 1, 43, 20, 209, 1, 154, 64, 242, 69, 16, 80, 67, 49, - 70, 16, 34, 248, 247, 54, 248, 4, 55, 8, 241, 1, 8, 8, 251, 7, 247, - 158, 33, 71, 67, 192, 34, 32, 70, 64, 35, 246, 247, 250, 249, 12, 224, - 1, 155, 150, 32, 88, 67, 49, 70, 16, 34, 248, 247, 34, 248, 4, 55, 8, - 241, 1, 8, 8, 251, 7, 247, 71, 67, 183, 245, 22, 15, 212, 191, 0, 38, - 1, 38, 115, 28, 3, 235, 67, 3, 151, 251, 243, 247, 183, 245, 0, 63, - 22, 219, 167, 245, 192, 51, 219, 19, 1, 51, 91, 16, 219, 178, 16, 224, - 64, 75, 76, 0, 63, 66, 15, 0, 64, 66, 15, 0, 160, 134, 1, 0, 0, 0, 104, - 96, 0, 33, 246, 255, 0, 0, 132, 163, 0, 0, 48, 42, 0, 35, 61, 33, 63, - 34, 32, 70, 246, 247, 194, 249, 61, 33, 64, 34, 179, 1, 32, 70, 246, - 247, 188, 249, 38, 75, 87, 33, 32, 34, 157, 66, 32, 70, 6, 217, 19, - 70, 246, 247, 179, 249, 35, 75, 157, 66, 4, 216, 8, 224, 0, 35, 246, - 247, 172, 249, 4, 224, 16, 34, 32, 70, 87, 33, 19, 70, 3, 224, 32, 70, - 87, 33, 16, 34, 0, 35, 246, 247, 160, 249, 1, 154, 74, 33, 178, 245, - 52, 31, 32, 70, 3, 221, 2, 34, 246, 247, 136, 249, 2, 224, 253, 34, - 246, 247, 118, 249, 12, 34, 19, 70, 68, 33, 32, 70, 246, 247, 141, 249, - 1, 32, 235, 243, 80, 245, 32, 70, 255, 247, 106, 252, 32, 70, 68, 33, - 3, 154, 245, 247, 173, 255, 4, 154, 32, 70, 64, 242, 43, 17, 11, 176, - 189, 232, 240, 79, 245, 247, 164, 191, 4, 34, 19, 70, 32, 70, 157, 33, - 246, 247, 115, 249, 1, 35, 160, 229, 11, 176, 189, 232, 240, 143, 128, - 186, 140, 1, 0, 117, 25, 3, 8, 181, 248, 247, 80, 249, 160, 245, 64, - 78, 222, 241, 0, 0, 64, 235, 14, 0, 8, 189, 112, 181, 0, 35, 19, 112, - 11, 112, 0, 245, 130, 83, 27, 121, 4, 70, 13, 70, 22, 70, 3, 179, 64, - 242, 171, 65, 245, 247, 162, 255, 16, 244, 0, 79, 32, 70, 2, 208, 64, - 242, 171, 65, 8, 224, 64, 242, 60, 97, 245, 247, 151, 255, 3, 4, 6, - 213, 32, 70, 64, 242, 60, 97, 245, 247, 144, 255, 64, 8, 40, 112, 32, - 70, 255, 247, 208, 255, 8, 177, 148, 248, 16, 5, 43, 120, 192, 24, 48, - 112, 112, 189, 56, 181, 208, 248, 168, 64, 5, 70, 148, 248, 66, 51, - 91, 177, 0, 33, 249, 247, 59, 250, 40, 70, 25, 33, 0, 34, 249, 247, - 250, 249, 16, 185, 1, 35, 132, 248, 69, 51, 56, 189, 56, 181, 208, 248, - 168, 80, 4, 70, 149, 248, 66, 51, 131, 185, 144, 248, 233, 48, 218, - 7, 68, 191, 35, 240, 1, 3, 128, 248, 233, 48, 144, 248, 233, 48, 153, - 7, 47, 213, 35, 240, 2, 3, 128, 248, 233, 48, 56, 189, 149, 248, 71, - 51, 35, 185, 209, 241, 1, 3, 56, 191, 0, 35, 0, 224, 1, 35, 133, 248, - 71, 51, 241, 177, 1, 35, 133, 248, 70, 51, 0, 35, 197, 248, 108, 51, - 133, 248, 69, 51, 32, 70, 255, 247, 189, 255, 149, 248, 67, 51, 0, 51, - 24, 191, 1, 35, 133, 248, 68, 51, 19, 177, 32, 70, 249, 247, 11, 248, - 32, 70, 248, 247, 188, 248, 32, 70, 1, 33, 189, 232, 56, 64, 249, 247, - 238, 185, 56, 189, 247, 181, 208, 248, 168, 64, 0, 35, 1, 147, 0, 147, - 148, 248, 66, 51, 5, 70, 0, 43, 0, 240, 205, 128, 148, 248, 70, 51, - 0, 43, 0, 240, 200, 128, 208, 248, 176, 48, 211, 248, 32, 49, 217, 7, - 64, 241, 193, 128, 148, 248, 69, 99, 0, 46, 64, 240, 160, 128, 49, 70, - 50, 70, 249, 247, 144, 249, 0, 40, 0, 240, 153, 128, 40, 70, 105, 70, - 1, 170, 249, 247, 180, 250, 0, 40, 0, 240, 145, 128, 1, 155, 196, 248, - 108, 51, 148, 248, 70, 51, 1, 43, 64, 240, 137, 128, 148, 248, 145, - 227, 148, 248, 144, 3, 0, 154, 115, 70, 49, 70, 30, 224, 95, 178, 220, - 55, 84, 248, 39, 192, 98, 69, 54, 191, 68, 248, 39, 32, 79, 240, 0, - 12, 98, 70, 84, 248, 39, 112, 56, 191, 79, 240, 1, 12, 1, 51, 219, 178, - 201, 25, 1, 54, 95, 178, 246, 178, 7, 47, 200, 191, 0, 35, 188, 241, - 0, 15, 2, 208, 0, 146, 0, 154, 21, 224, 79, 250, 134, 252, 71, 178, - 188, 69, 219, 219, 246, 231, 95, 178, 220, 55, 1, 51, 84, 248, 39, 192, - 219, 178, 68, 248, 39, 32, 137, 24, 1, 54, 90, 178, 7, 42, 200, 191, - 0, 35, 246, 178, 98, 70, 119, 178, 7, 47, 236, 221, 67, 178, 7, 43, - 0, 146, 5, 220, 0, 35, 1, 48, 132, 248, 146, 51, 132, 248, 144, 3, 148, - 249, 144, 51, 8, 43, 58, 209, 148, 248, 148, 51, 227, 24, 147, 248, - 151, 35, 147, 248, 153, 99, 148, 248, 146, 51, 252, 43, 2, 216, 1, 51, - 132, 248, 146, 51, 148, 248, 146, 51, 147, 66, 40, 209, 14, 241, 1, - 3, 132, 248, 145, 51, 91, 178, 7, 43, 2, 221, 0, 35, 132, 248, 145, - 51, 6, 35, 132, 248, 144, 51, 40, 70, 248, 247, 131, 255, 24, 185, 40, - 70, 248, 247, 13, 248, 16, 224, 148, 248, 147, 51, 252, 43, 2, 216, - 1, 51, 132, 248, 147, 51, 148, 248, 147, 51, 179, 66, 5, 209, 148, 248, - 148, 51, 19, 185, 1, 35, 132, 248, 148, 51, 0, 35, 132, 248, 146, 51, - 148, 248, 70, 19, 0, 35, 1, 41, 132, 248, 69, 51, 40, 70, 2, 209, 249, - 247, 38, 249, 2, 224, 25, 70, 249, 247, 125, 249, 40, 70, 212, 248, - 108, 19, 249, 247, 205, 250, 0, 35, 132, 248, 71, 51, 148, 248, 156, - 51, 19, 185, 1, 35, 132, 248, 156, 51, 254, 189, 56, 181, 21, 70, 208, - 248, 168, 64, 122, 177, 148, 248, 67, 19, 148, 248, 66, 35, 195, 105, - 66, 234, 65, 4, 44, 96, 24, 105, 140, 33, 53, 240, 132, 219, 68, 234, - 0, 64, 40, 96, 56, 189, 203, 8, 13, 209, 1, 240, 1, 3, 193, 243, 64, - 1, 132, 248, 66, 51, 132, 248, 67, 19, 35, 185, 1, 33, 189, 232, 56, - 64, 249, 247, 73, 185, 56, 189, 45, 233, 248, 67, 4, 70, 136, 70, 23, - 70, 208, 248, 168, 96, 79, 240, 0, 9, 247, 247, 227, 251, 32, 70, 1, - 33, 253, 247, 56, 251, 77, 70, 13, 224, 1, 33, 0, 34, 246, 247, 156, - 249, 56, 70, 235, 243, 137, 243, 32, 70, 251, 247, 139, 252, 1, 53, - 31, 250, 128, 249, 237, 178, 69, 69, 32, 70, 238, 211, 0, 33, 253, 247, - 34, 251, 134, 248, 192, 146, 189, 232, 248, 131, 45, 233, 240, 67, 176, - 248, 218, 48, 208, 248, 168, 80, 139, 176, 133, 248, 188, 50, 208, 248, - 176, 48, 4, 70, 211, 248, 32, 49, 3, 240, 1, 3, 131, 240, 1, 9, 83, - 177, 195, 105, 184, 33, 24, 105, 66, 242, 16, 114, 53, 240, 74, 219, - 227, 105, 24, 105, 53, 240, 120, 219, 64, 242, 165, 65, 32, 70, 245, - 247, 224, 253, 0, 244, 224, 96, 7, 10, 32, 70, 247, 247, 114, 255, 0, - 33, 128, 70, 32, 70, 252, 247, 208, 248, 79, 244, 64, 65, 32, 70, 252, - 247, 203, 248, 32, 70, 251, 247, 106, 252, 212, 248, 168, 48, 211, 248, - 72, 36, 211, 248, 68, 52, 64, 43, 180, 191, 25, 70, 64, 33, 138, 66, - 1, 221, 147, 178, 3, 224, 63, 43, 212, 191, 155, 178, 64, 35, 255, 34, - 32, 70, 64, 242, 167, 65, 245, 247, 166, 255, 0, 35, 32, 70, 64, 242, - 165, 65, 79, 244, 224, 98, 245, 247, 158, 255, 79, 244, 122, 114, 50, - 33, 32, 70, 255, 247, 123, 255, 1, 33, 32, 70, 149, 248, 192, 98, 253, - 247, 188, 250, 32, 70, 247, 247, 96, 251, 59, 2, 32, 70, 64, 242, 165, - 65, 79, 244, 224, 98, 245, 247, 135, 255, 0, 33, 32, 70, 252, 247, 141, - 248, 149, 248, 196, 114, 1, 47, 58, 209, 32, 70, 7, 169, 253, 247, 45, - 254, 57, 70, 32, 70, 250, 247, 39, 252, 212, 248, 168, 48, 211, 248, - 72, 36, 211, 248, 68, 52, 62, 43, 180, 191, 25, 70, 62, 33, 138, 66, - 1, 221, 147, 178, 3, 224, 61, 43, 212, 191, 155, 178, 62, 35, 32, 70, - 64, 242, 167, 65, 255, 34, 245, 247, 95, 255, 0, 35, 32, 70, 64, 242, - 165, 65, 79, 244, 224, 98, 245, 247, 87, 255, 32, 70, 50, 33, 79, 244, - 122, 114, 255, 247, 52, 255, 149, 248, 192, 50, 219, 185, 149, 248, - 194, 50, 32, 70, 4, 51, 133, 248, 194, 50, 1, 33, 250, 247, 245, 251, - 17, 224, 0, 33, 1, 35, 219, 34, 141, 248, 36, 48, 3, 146, 4, 147, 32, - 70, 7, 170, 11, 70, 141, 248, 37, 96, 0, 145, 1, 145, 2, 145, 5, 145, - 253, 247, 150, 250, 32, 70, 65, 70, 252, 247, 56, 248, 32, 70, 9, 73, - 4, 34, 245, 247, 59, 255, 185, 241, 0, 15, 3, 209, 227, 105, 24, 105, - 53, 240, 176, 218, 32, 70, 0, 33, 253, 247, 72, 250, 11, 176, 189, 232, - 240, 131, 0, 191, 170, 232, 1, 0, 8, 41, 3, 208, 10, 41, 3, 208, 2, - 41, 3, 209, 255, 247, 134, 184, 255, 247, 26, 191, 112, 71, 16, 181, - 4, 70, 247, 247, 218, 250, 32, 70, 0, 33, 252, 247, 15, 248, 32, 70, - 8, 33, 189, 232, 16, 64, 255, 247, 231, 191, 56, 181, 0, 245, 128, 83, - 147, 248, 36, 48, 4, 70, 208, 248, 168, 80, 19, 185, 247, 247, 54, 254, - 224, 177, 212, 248, 248, 48, 89, 7, 6, 209, 148, 248, 245, 48, 27, 185, - 32, 70, 9, 33, 255, 247, 208, 255, 212, 248, 248, 48, 26, 7, 13, 209, - 4, 245, 128, 82, 146, 249, 44, 32, 66, 185, 27, 6, 6, 212, 148, 248, - 245, 48, 27, 185, 32, 70, 2, 33, 255, 247, 190, 255, 212, 248, 248, - 48, 19, 240, 14, 15, 2, 209, 32, 70, 251, 247, 146, 252, 212, 248, 248, - 48, 19, 240, 6, 15, 62, 209, 213, 248, 52, 36, 74, 179, 227, 105, 213, - 248, 56, 20, 24, 106, 65, 26, 145, 66, 52, 211, 106, 33, 24, 105, 53, - 240, 13, 218, 65, 0, 137, 178, 177, 177, 227, 105, 24, 105, 53, 240, - 6, 218, 136, 185, 64, 242, 118, 65, 32, 70, 245, 247, 189, 252, 192, - 5, 192, 13, 165, 248, 108, 5, 64, 242, 119, 65, 32, 70, 245, 247, 180, - 252, 192, 5, 192, 13, 165, 248, 110, 5, 32, 70, 0, 33, 249, 247, 54, - 249, 17, 224, 64, 242, 118, 65, 32, 70, 245, 247, 166, 252, 192, 5, - 192, 13, 165, 248, 108, 5, 64, 242, 119, 65, 32, 70, 245, 247, 157, - 252, 192, 5, 192, 13, 165, 248, 110, 5, 32, 70, 247, 247, 46, 254, 176, - 245, 64, 79, 11, 208, 32, 70, 251, 247, 10, 251, 32, 177, 0, 35, 127, - 40, 133, 248, 86, 52, 2, 208, 0, 35, 133, 248, 87, 52, 56, 189, 0, 0, - 45, 233, 240, 65, 95, 250, 129, 248, 4, 70, 208, 248, 168, 80, 64, 70, - 14, 70, 246, 247, 51, 249, 49, 70, 7, 70, 32, 70, 246, 247, 19, 249, - 32, 70, 180, 248, 218, 16, 249, 247, 149, 254, 4, 34, 32, 70, 91, 73, - 245, 247, 110, 254, 65, 70, 32, 70, 255, 247, 42, 249, 10, 32, 235, - 243, 217, 241, 79, 244, 0, 66, 19, 70, 79, 244, 137, 97, 32, 70, 245, - 247, 77, 254, 32, 70, 248, 247, 14, 250, 120, 0, 5, 33, 0, 34, 247, - 247, 51, 252, 57, 70, 0, 34, 128, 70, 79, 244, 32, 16, 247, 247, 44, - 252, 64, 242, 87, 97, 7, 70, 31, 250, 136, 242, 32, 70, 245, 247, 80, - 252, 32, 70, 79, 244, 203, 97, 186, 178, 245, 247, 74, 252, 79, 244, - 0, 115, 32, 70, 79, 244, 137, 97, 79, 244, 64, 114, 245, 247, 39, 254, - 148, 248, 218, 48, 14, 43, 7, 208, 181, 248, 98, 32, 19, 178, 179, 241, - 255, 63, 8, 191, 21, 34, 0, 224, 30, 34, 165, 248, 64, 37, 32, 70, 0, - 33, 18, 178, 250, 247, 163, 248, 32, 177, 32, 70, 0, 33, 20, 34, 250, - 247, 157, 248, 148, 248, 218, 48, 56, 34, 14, 43, 12, 191, 24, 35, 0, - 35, 32, 70, 64, 242, 235, 65, 245, 247, 1, 254, 180, 248, 218, 48, 32, - 70, 3, 244, 112, 67, 179, 245, 0, 95, 12, 191, 181, 248, 102, 32, 181, - 248, 104, 32, 1, 33, 19, 178, 179, 241, 255, 63, 8, 191, 2, 34, 165, - 248, 62, 37, 18, 178, 250, 247, 122, 248, 24, 34, 32, 70, 32, 73, 245, - 247, 247, 253, 32, 70, 247, 247, 72, 251, 180, 248, 218, 32, 149, 248, - 188, 50, 210, 178, 128, 177, 14, 43, 2, 217, 14, 42, 5, 217, 1, 224, - 14, 42, 2, 216, 32, 70, 1, 33, 1, 224, 32, 70, 0, 33, 50, 70, 189, 232, - 240, 65, 252, 247, 229, 191, 147, 66, 32, 70, 1, 209, 1, 43, 3, 209, - 8, 33, 255, 247, 171, 254, 1, 224, 252, 247, 190, 255, 0, 33, 10, 70, - 32, 70, 251, 247, 197, 248, 32, 70, 254, 247, 213, 255, 32, 70, 1, 33, - 255, 247, 83, 252, 4, 245, 130, 83, 27, 121, 43, 177, 32, 70, 3, 33, - 189, 232, 240, 65, 251, 247, 87, 189, 189, 232, 240, 129, 98, 231, 1, - 0, 106, 231, 1, 0, 128, 104, 244, 243, 185, 176, 0, 0, 48, 181, 132, - 136, 4, 240, 3, 3, 1, 43, 8, 208, 2, 43, 12, 208, 0, 43, 43, 209, 8, - 120, 5, 35, 176, 251, 243, 240, 48, 189, 11, 120, 20, 74, 3, 240, 7, - 3, 208, 92, 48, 189, 13, 120, 203, 120, 8, 121, 5, 240, 127, 2, 41, - 6, 67, 234, 0, 32, 66, 240, 0, 99, 2, 213, 67, 244, 128, 99, 5, 224, - 161, 6, 68, 191, 66, 240, 0, 99, 67, 244, 64, 115, 1, 6, 72, 191, 67, - 244, 0, 3, 66, 6, 72, 191, 67, 244, 128, 3, 0, 240, 48, 0, 67, 234, - 0, 64, 48, 189, 79, 244, 0, 112, 48, 189, 0, 191, 190, 229, 1, 0, 112, - 181, 134, 104, 4, 70, 212, 248, 248, 17, 176, 104, 244, 243, 98, 240, - 255, 35, 132, 248, 226, 49, 79, 240, 255, 51, 163, 97, 35, 104, 0, 34, - 154, 113, 51, 107, 2, 33, 5, 70, 24, 105, 245, 247, 101, 255, 32, 70, - 56, 240, 100, 219, 213, 241, 1, 0, 56, 191, 0, 32, 112, 189, 56, 181, - 11, 104, 4, 70, 13, 70, 115, 177, 211, 248, 124, 17, 41, 177, 3, 104, - 64, 242, 12, 114, 216, 104, 235, 243, 135, 243, 35, 104, 41, 104, 216, - 104, 98, 105, 235, 243, 129, 243, 35, 104, 41, 70, 216, 104, 16, 34, - 189, 232, 56, 64, 235, 243, 121, 179, 3, 104, 112, 181, 16, 33, 5, 70, - 216, 104, 235, 243, 98, 243, 4, 70, 160, 177, 43, 104, 105, 105, 216, - 104, 235, 243, 91, 243, 6, 70, 32, 96, 40, 185, 33, 70, 40, 70, 255, - 247, 207, 255, 52, 70, 6, 224, 0, 35, 192, 248, 124, 49, 33, 70, 40, - 70, 57, 240, 45, 220, 32, 70, 112, 189, 55, 181, 5, 70, 1, 169, 208, - 248, 0, 5, 57, 240, 68, 221, 9, 224, 40, 70, 33, 70, 57, 240, 159, 223, - 99, 108, 27, 185, 40, 70, 33, 70, 58, 240, 175, 216, 1, 168, 57, 240, - 62, 221, 4, 70, 0, 40, 239, 209, 62, 189, 248, 181, 208, 248, 152, 67, - 15, 70, 227, 136, 251, 177, 11, 136, 7, 43, 28, 217, 162, 136, 154, - 66, 28, 209, 14, 29, 48, 70, 4, 241, 8, 1, 230, 243, 110, 245, 80, 177, - 17, 224, 99, 25, 48, 70, 10, 73, 147, 248, 72, 32, 230, 243, 33, 245, - 1, 53, 54, 24, 0, 224, 5, 70, 227, 136, 157, 66, 241, 219, 64, 35, 59, - 128, 0, 32, 248, 189, 79, 240, 255, 48, 248, 189, 79, 240, 255, 48, - 248, 189, 244, 48, 134, 0, 45, 233, 243, 71, 136, 70, 21, 70, 0, 40, - 88, 208, 0, 41, 86, 208, 10, 136, 208, 248, 4, 160, 208, 248, 152, 115, - 208, 248, 148, 99, 0, 42, 72, 208, 177, 248, 2, 144, 0, 36, 25, 240, - 1, 9, 252, 128, 188, 128, 36, 208, 64, 42, 19, 209, 4, 49, 56, 70, 35, - 70, 0, 148, 61, 240, 5, 222, 160, 66, 56, 219, 182, 248, 2, 33, 18, - 240, 64, 2, 49, 208, 0, 45, 55, 208, 218, 248, 12, 0, 60, 240, 154, - 221, 51, 224, 162, 241, 8, 3, 155, 178, 55, 43, 39, 216, 7, 241, 8, - 0, 4, 49, 230, 243, 29, 244, 184, 248, 0, 128, 167, 248, 4, 128, 36, - 224, 32, 42, 30, 216, 4, 49, 7, 241, 72, 0, 230, 243, 17, 244, 182, - 248, 2, 65, 184, 248, 0, 128, 1, 35, 20, 240, 64, 4, 167, 248, 4, 144, - 167, 248, 6, 128, 198, 248, 204, 48, 15, 208, 109, 177, 218, 248, 12, - 0, 60, 240, 112, 221, 76, 70, 8, 224, 20, 70, 6, 224, 79, 240, 255, - 52, 3, 224, 111, 240, 1, 4, 0, 224, 44, 70, 32, 70, 189, 232, 252, 135, - 16, 181, 13, 240, 121, 250, 4, 70, 241, 247, 212, 248, 32, 70, 189, - 232, 16, 64, 234, 243, 227, 181, 170, 170, 3, 0, 25, 88, 0, 0, 16, 24, - 0, 0, 15, 172, 0, 0, 20, 114, 0, 0, 80, 242, 0, 0, 64, 150, 0, 0, 80, - 242, 1, 0, 0, 80, 242, 2, 0, 0, 0, 80, 242, 2, 1, 0, 0, 144, 76, 0, - 170, 170, 3, 0, 25, 88, 0, 0, 80, 242, 2, 1, 1, 0, 0, 3, 100, 0, 0, - 39, 164, 0, 0, 65, 67, 94, 0, 97, 50, 47, 0, 0, 80, 242, 4, 0, 0, 80, - 242, 0, 0, 15, 172, 0, 0, 20, 114, 0, 0, 1, 175, 129, 1, 0, 0, 16, 24, - 0, 0, 80, 242, 0, 0, 15, 172, 0, 0, 64, 150, 0, 0, 0, 0, 0, 0, 0, 16, - 24, 0, 0, 12, 11, 18, 15, 24, 10, 36, 14, 48, 9, 72, 13, 96, 8, 108, - 12, 12, 18, 24, 36, 48, 72, 96, 108, 94, 0, 96, 0, 98, 0, 120, 0, 212, - 0, 9, 47, 22, 14, 14, 5, 105, 108, 48, 109, 97, 99, 97, 100, 100, 114, - 61, 48, 48, 58, 49, 49, 58, 50, 50, 58, 51, 51, 58, 52, 52, 58, 53, - 53, 0, 98, 111, 97, 114, 100, 116, 121, 112, 101, 61, 48, 120, 102, - 102, 102, 102, 0, 98, 111, 97, 114, 100, 114, 101, 118, 61, 48, 120, - 49, 48, 0, 98, 111, 97, 114, 100, 102, 108, 97, 103, 115, 61, 56, 0, - 97, 97, 48, 61, 51, 0, 115, 114, 111, 109, 114, 101, 118, 61, 50, 0, - 0, 15, 172, 0, 0, 80, 242, 0, 170, 170, 3, 0, 25, 88, 0, 204, 1, 2, - 0, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 110, 132, 11, 0, - 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 18, 24, 36, 48, - 72, 96, 108, 0, 0, 16, 9, 30, 9, 31, 9, 36, 9, 37, 9, 38, 9, 32, 9, - 33, 9, 39, 9, 40, 9, 41, 9, 34, 9, 35, 9, 48, 9, 49, 9, 50, 9, 18, 9, - 15, 9, 0, 9, 1, 9, 6, 9, 7, 9, 8, 9, 2, 9, 3, 9, 9, 9, 10, 9, 11, 9, - 4, 9, 5, 9, 12, 9, 13, 9, 14, 9, 17, 9, 0, 252, 7, 0, 105, 165, 5, 0, - 255, 1, 0, 0, 105, 93, 10, 0, 0, 4, 8, 0, 151, 94, 10, 0, 1, 2, 0, 0, - 151, 166, 5, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 14, - 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 22, 1, 45, 1, 44, 1, - 106, 0, 152, 0, 151, 0, 47, 1, 11, 0, 19, 1, 29, 0, 20, 1, 46, 0, 42, - 1, 9, 0, 31, 1, 7, 0, 255, 0, 5, 0, 33, 132, 35, 132, 52, 131, 132, - 128, 103, 130, 86, 128, 52, 130, 132, 128, 103, 130, 86, 128, 52, 130, - 151, 122, 151, 122, 151, 122, 151, 122, 135, 122, 135, 122, 151, 123, - 151, 122, 135, 122, 135, 122, 151, 123, 255, 238, 221, 204, 187, 153, - 136, 119, 102, 85, 68, 51, 34, 17, 0, 0, 89, 77, 128, 0, 149, 87, 128, - 0, 73, 88, 128, 0, 49, 86, 128, 0, 13, 90, 128, 0, 193, 88, 128, 0, - 41, 90, 128, 0, 69, 90, 128, 0, 121, 87, 128, 0, 77, 86, 128, 0, 117, - 90, 128, 0, 37, 85, 128, 0, 241, 89, 128, 0, 13, 88, 128, 0, 105, 84, - 128, 0, 193, 78, 128, 0, 233, 81, 128, 0, 85, 82, 128, 0, 201, 81, 128, - 0, 221, 88, 128, 0, 81, 81, 128, 0, 209, 85, 128, 0, 165, 85, 128, 0, - 21, 86, 128, 0, 225, 79, 128, 0, 137, 85, 128, 0, 253, 78, 128, 0, 37, - 80, 128, 0, 253, 3, 1, 0, 237, 77, 128, 0, 133, 78, 128, 0, 169, 79, - 128, 0, 217, 77, 128, 0, 9, 78, 128, 0, 81, 76, 128, 0, 101, 76, 128, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 79, 128, 0, 37, 82, 128, - 0, 249, 81, 128, 0, 199, 40, 0, 0, 40, 0, 0, 0, 115, 100, 95, 108, 101, - 118, 101, 108, 95, 116, 114, 105, 103, 103, 101, 114, 0, 115, 112, 105, - 95, 112, 117, 95, 101, 110, 97, 98, 0, 97, 114, 112, 95, 109, 97, 99, - 97, 100, 100, 114, 0, 97, 114, 112, 95, 114, 101, 109, 111, 116, 101, - 105, 112, 0, 0, 0, 248, 59, 134, 0, 0, 0, 0, 0, 7, 0, 0, 0, 255, 59, - 134, 0, 1, 0, 0, 0, 7, 0, 0, 0, 11, 60, 134, 0, 2, 0, 0, 0, 0, 0, 0, - 0, 27, 60, 134, 0, 3, 0, 0, 0, 7, 0, 0, 0, 38, 60, 134, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 55, 60, 134, 0, 5, 0, 0, 0, 8, 0, 48, 0, 65, 60, 134, - 0, 6, 0, 0, 0, 0, 0, 0, 0, 161, 186, 1, 0, 8, 0, 0, 0, 6, 0, 0, 0, 173, - 186, 1, 0, 9, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 112, 102, 110, 95, 115, 117, 115, 112, 101, 110, 100, 0, 88, 64, - 134, 0, 0, 0, 0, 0, 8, 0, 20, 0, 96, 64, 134, 0, 1, 0, 0, 0, 8, 0, 136, - 0, 104, 64, 134, 0, 2, 0, 0, 0, 8, 0, 56, 0, 112, 64, 134, 0, 3, 0, - 0, 0, 8, 0, 8, 0, 126, 64, 134, 0, 4, 0, 0, 0, 1, 0, 0, 0, 130, 64, - 134, 0, 5, 0, 0, 0, 0, 0, 0, 0, 139, 64, 134, 0, 6, 0, 0, 0, 8, 0, 56, - 0, 52, 187, 1, 0, 7, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 53, 46, 57, 48, 46, 50, 51, 48, 46, 49, 53, 0, 119, 108, 37, - 100, 58, 32, 37, 115, 32, 37, 115, 32, 118, 101, 114, 115, 105, 111, - 110, 32, 37, 115, 32, 70, 87, 73, 68, 32, 48, 49, 45, 37, 120, 10, 0, - 79, 99, 116, 32, 50, 50, 32, 50, 48, 49, 53, 0, 49, 53, 58, 48, 53, - 58, 48, 57, 0, 92, 120, 37, 48, 50, 88, 0, 119, 108, 99, 95, 105, 111, - 118, 97, 114, 115, 50, 0, 114, 115, 115, 105, 95, 111, 102, 102, 115, - 101, 116, 0, 80, 90, 68, 58, 32, 37, 100, 62, 37, 100, 32, 111, 114, - 32, 37, 100, 62, 37, 100, 32, 97, 61, 37, 100, 10, 0, 108, 111, 119, - 95, 114, 115, 115, 105, 95, 116, 114, 105, 103, 103, 101, 114, 0, 108, - 111, 119, 95, 114, 115, 115, 105, 95, 100, 117, 114, 97, 116, 105, 111, - 110, 0, 116, 99, 95, 101, 110, 97, 98, 108, 101, 0, 116, 99, 95, 112, - 101, 114, 105, 111, 100, 0, 116, 99, 95, 104, 105, 95, 119, 109, 0, - 116, 99, 95, 108, 111, 95, 119, 109, 0, 116, 99, 95, 115, 116, 97, 116, - 117, 115, 0, 97, 115, 115, 111, 99, 95, 115, 116, 97, 116, 101, 0, 100, - 121, 110, 116, 120, 0, 116, 120, 95, 115, 116, 97, 116, 95, 99, 104, - 107, 0, 116, 120, 95, 115, 116, 97, 116, 95, 99, 104, 107, 95, 112, - 114, 100, 0, 116, 120, 95, 115, 116, 97, 116, 95, 99, 104, 107, 95, - 114, 97, 116, 105, 111, 0, 116, 120, 95, 115, 116, 97, 116, 95, 99, - 104, 107, 95, 110, 117, 109, 0, 114, 120, 95, 114, 97, 116, 101, 0, - 105, 115, 95, 87, 80, 83, 95, 101, 110, 114, 111, 108, 108, 101, 101, - 0, 105, 115, 95, 119, 112, 115, 95, 101, 110, 114, 111, 108, 108, 101, - 101, 0, 3, 188, 1, 0, 1, 0, 0, 0, 6, 0, 0, 0, 41, 188, 1, 0, 2, 0, 0, - 0, 6, 0, 0, 0, 58, 188, 1, 0, 3, 0, 0, 0, 6, 0, 0, 0, 76, 188, 1, 0, - 4, 0, 0, 0, 6, 0, 0, 0, 86, 188, 1, 0, 5, 0, 0, 0, 6, 0, 0, 0, 96, 188, - 1, 0, 6, 0, 0, 0, 6, 0, 0, 0, 105, 188, 1, 0, 7, 0, 0, 0, 6, 0, 0, 0, - 114, 188, 1, 0, 8, 0, 0, 0, 6, 0, 0, 0, 124, 188, 1, 0, 9, 0, 0, 0, - 6, 0, 0, 0, 136, 188, 1, 0, 10, 0, 0, 0, 6, 0, 0, 0, 142, 188, 1, 0, - 11, 0, 0, 0, 6, 0, 0, 0, 154, 188, 1, 0, 12, 0, 0, 0, 6, 0, 0, 0, 170, - 188, 1, 0, 13, 0, 0, 0, 6, 0, 0, 0, 188, 188, 1, 0, 14, 0, 0, 0, 6, - 0, 0, 0, 204, 188, 1, 0, 15, 0, 0, 0, 6, 0, 0, 0, 212, 188, 1, 0, 16, - 0, 0, 0, 1, 0, 0, 0, 228, 188, 1, 0, 16, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 165, 129, 0, 253, 165, 129, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 13, 205, 130, 0, 137, 230, 130, 0, 245, 203, 130, - 0, 237, 204, 130, 0, 119, 108, 99, 95, 97, 109, 112, 100, 117, 95, 114, - 101, 99, 118, 95, 97, 100, 100, 98, 97, 95, 114, 101, 113, 95, 112, - 114, 101, 95, 112, 97, 116, 99, 104, 0, 119, 108, 99, 95, 97, 109, 112, - 100, 117, 95, 114, 101, 115, 116, 97, 114, 116, 0, 115, 116, 114, 97, - 110, 103, 101, 32, 99, 97, 115, 101, 46, 46, 46, 114, 101, 108, 101, - 97, 115, 101, 32, 105, 115, 32, 37, 100, 44, 32, 100, 101, 108, 116, - 97, 32, 37, 100, 44, 32, 105, 110, 105, 45, 62, 114, 101, 109, 95, 119, - 105, 110, 100, 111, 119, 32, 37, 100, 10, 0, 37, 115, 58, 32, 97, 109, - 112, 100, 117, 45, 62, 109, 97, 120, 95, 112, 100, 117, 61, 37, 100, - 44, 32, 97, 109, 112, 100, 117, 45, 62, 98, 97, 95, 116, 120, 95, 119, - 115, 105, 122, 101, 61, 37, 100, 44, 32, 97, 109, 112, 100, 117, 45, - 62, 98, 97, 95, 114, 120, 95, 119, 115, 105, 122, 101, 61, 37, 100, - 10, 0, 37, 115, 58, 32, 119, 108, 32, 100, 111, 119, 110, 33, 10, 0, - 37, 115, 58, 32, 119, 108, 32, 117, 112, 33, 10, 0, 166, 203, 134, 0, - 16, 0, 0, 0, 6, 0, 0, 0, 82, 155, 134, 0, 1, 0, 0, 0, 1, 0, 0, 0, 93, - 155, 134, 0, 2, 0, 32, 0, 7, 0, 0, 0, 111, 155, 134, 0, 3, 0, 64, 0, - 8, 0, 7, 0, 124, 155, 134, 0, 4, 0, 64, 0, 8, 0, 4, 0, 139, 155, 134, - 0, 5, 0, 64, 0, 8, 0, 4, 0, 154, 155, 134, 0, 6, 0, 0, 0, 8, 0, 4, 0, - 171, 155, 134, 0, 13, 0, 16, 0, 7, 0, 0, 0, 167, 155, 134, 0, 14, 0, - 32, 0, 7, 0, 0, 0, 180, 155, 134, 0, 7, 0, 16, 0, 7, 0, 0, 0, 191, 155, - 134, 0, 8, 0, 0, 0, 8, 0, 16, 0, 214, 155, 134, 0, 9, 0, 0, 0, 6, 0, - 0, 0, 201, 155, 134, 0, 36, 0, 0, 0, 6, 0, 0, 0, 254, 199, 134, 0, 10, - 0, 0, 0, 6, 0, 0, 0, 171, 114, 134, 0, 15, 0, 0, 0, 1, 0, 0, 0, 213, - 155, 134, 0, 11, 0, 128, 0, 1, 0, 0, 0, 218, 155, 134, 0, 12, 0, 0, - 0, 5, 0, 0, 0, 229, 155, 134, 0, 29, 0, 0, 0, 3, 0, 0, 0, 250, 155, - 134, 0, 30, 0, 0, 0, 7, 0, 0, 0, 19, 156, 134, 0, 31, 0, 0, 0, 7, 0, - 0, 0, 37, 156, 134, 0, 33, 0, 0, 0, 5, 0, 0, 0, 59, 156, 134, 0, 32, - 0, 0, 0, 3, 0, 0, 0, 73, 156, 134, 0, 17, 0, 128, 0, 1, 0, 0, 0, 79, - 156, 134, 0, 24, 0, 64, 0, 8, 0, 6, 0, 83, 156, 134, 0, 25, 0, 0, 0, - 5, 0, 0, 0, 97, 156, 134, 0, 26, 0, 0, 0, 1, 0, 0, 0, 108, 156, 134, - 0, 27, 0, 64, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213, - 80, 131, 0, 33, 87, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119, 108, 37, 100, - 58, 32, 80, 72, 89, 84, 88, 32, 101, 114, 114, 111, 114, 40, 37, 100, - 41, 10, 0, 84, 84, 84, 84, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, - 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 3, 0, 0, 0, 0, 8, 76, 76, 76, - 76, 76, 76, 20, 20, 20, 0, 0, 1, 0, 0, 100, 100, 100, 100, 100, 100, - 100, 100, 100, 100, 100, 100, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 84, 84, 84, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 64, 64, 64, 64, - 64, 64, 64, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 1, 66, 66, 66, 50, 66, - 66, 20, 20, 20, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 62, 62, 66, 52, 62, - 66, 20, 20, 20, 0, 0, 0, 0, 0, 84, 84, 84, 0, 84, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 3, 0, - 0, 0, 0, 1, 68, 68, 68, 56, 68, 64, 20, 20, 20, 0, 0, 0, 0, 0, 50, 66, - 66, 66, 66, 66, 66, 66, 66, 66, 50, 66, 66, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 8, 72, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 72, 0, 0, 0, 52, 52, 52, 52, 52, 52, 52, 52, 52, 0, 0, 0, 0, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 8, 84, 84, 84, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 80, 80, 80, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 58, 62, 56, 0, - 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 10, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 60, 66, 66, 66, 66, 66, 66, 66, 66, 66, 60, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 74, 78, 78, - 78, 78, 78, 78, 78, 74, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 68, 68, 68, 68, 68, 68, 68, 68, 68, 54, 74, 64, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 46, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 46, 70, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 60, 62, 62, 62, 62, 62, 62, 62, 62, 62, 60, 62, 62, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 52, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 56, 68, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 92, - 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 78, 78, - 78, 52, 76, 56, 30, 30, 30, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 66, 68, - 66, 48, 68, 48, 20, 20, 20, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 62, 62, - 62, 60, 62, 62, 20, 20, 20, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 68, 68, - 68, 54, 76, 56, 20, 20, 20, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 62, 62, - 48, 54, 58, 44, 20, 20, 20, 0, 0, 0, 0, 0, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 0, 0, 0, 46, 52, 52, 52, 52, 52, 52, 52, 52, - 0, 0, 0, 0, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 0, 0, - 0, 46, 52, 52, 52, 52, 52, 52, 52, 52, 0, 0, 0, 0, 62, 62, 62, 74, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 40, 40, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 70, 68, 68, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 10, 56, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 56, 68, 68, 0, 0, 0, 44, 56, 56, 56, 56, 56, 48, 52, 52, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 66, 66, 66, 66, 66, 66, 20, 20, 20, 0, 0, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 62, 62, 62, 62, 62, 62, 20, 20, 20, 0, 0, - 0, 0, 0, 84, 84, 84, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 56, 68, 68, 74, 74, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, - 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 84, 84, 84, 84, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 72, 72, - 72, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 84, 84, 84, 84, 84, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, - 84, 84, 84, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 72, 72, 0, 72, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 35, 92, 92, 92, 0, 80, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 80, 72, 80, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 1, 62, 62, 62, 50, 62, 54, 20, 20, - 20, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 62, 62, 62, 52, 62, 56, 20, 20, - 20, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 66, 66, 66, 60, 66, 60, 30, 30, - 30, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 78, 78, 78, 54, 76, 56, 30, 30, - 30, 0, 0, 0, 0, 0, 84, 84, 84, 84, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, - 72, 72, 72, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 70, 70, 70, 72, 74, 72, 23, 23, 23, 0, 0, 0, 0, 0, 97, 10, 134, - 0, 126, 10, 134, 0, 155, 10, 134, 0, 15, 11, 134, 0, 73, 11, 134, 0, - 102, 11, 134, 0, 99, 15, 134, 0, 36, 14, 134, 0, 65, 14, 134, 0, 20, - 16, 134, 0, 107, 16, 134, 0, 49, 16, 134, 0, 156, 16, 134, 0, 208, 16, - 134, 0, 4, 17, 134, 0, 96, 17, 134, 0, 177, 17, 134, 0, 131, 11, 134, - 0, 160, 11, 134, 0, 12, 15, 134, 0, 247, 11, 134, 0, 206, 17, 134, 0, - 49, 12, 134, 0, 107, 12, 134, 0, 148, 17, 134, 0, 218, 11, 134, 0, 94, - 14, 134, 0, 78, 12, 134, 0, 41, 15, 134, 0, 184, 10, 134, 0, 213, 10, - 134, 0, 242, 10, 134, 0, 123, 14, 134, 0, 78, 16, 134, 0, 189, 11, 134, - 0, 152, 14, 134, 0, 157, 15, 134, 0, 181, 14, 134, 0, 136, 12, 134, - 0, 210, 14, 134, 0, 20, 12, 134, 0, 41, 15, 134, 0, 186, 15, 134, 0, - 44, 11, 134, 0, 68, 10, 134, 0, 128, 15, 134, 0, 70, 15, 134, 0, 239, - 14, 134, 0, 52, 193, 1, 0, 28, 194, 1, 0, 57, 194, 1, 0, 226, 193, 1, - 0, 81, 193, 1, 0, 86, 194, 1, 0, 49, 195, 1, 0, 144, 194, 1, 0, 187, - 192, 1, 0, 155, 196, 1, 0, 100, 192, 1, 0, 255, 193, 1, 0, 110, 193, - 1, 0, 115, 194, 1, 0, 20, 195, 1, 0, 24, 199, 1, 0, 136, 195, 1, 0, - 56, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 52, 52, 52, 52, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 58, 58, 58, 70, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 56, 68, 68, 68, 74, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 42, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 24, 9, 134, 0, 192, 13, 134, 0, 232, 13, 134, - 0, 32, 13, 134, 0, 172, 13, 134, 0, 236, 192, 1, 0, 204, 196, 1, 0, - 220, 199, 1, 0, 188, 195, 1, 0, 184, 196, 1, 0, 168, 195, 1, 0, 216, - 192, 1, 0, 32, 193, 1, 0, 196, 194, 1, 0, 224, 196, 1, 0, 40, 197, 1, - 0, 216, 194, 1, 0, 16, 200, 1, 0, 176, 194, 1, 0, 140, 199, 1, 0, 64, - 200, 1, 0, 244, 196, 1, 0, 236, 194, 1, 0, 0, 195, 1, 0, 36, 200, 1, - 0, 52, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 44, 44, 0, 0, 0, 50, - 60, 60, 60, 60, 60, 0, 0, 0, 0, 0, 0, 0, 84, 84, 84, 0, 84, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 72, 72, 72, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, - 62, 72, 72, 66, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 10, 0, 56, 56, 62, 66, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 3, 0, 0, 0, 0, 0, 68, - 68, 68, 76, 76, 76, 23, 23, 23, 0, 0, 0, 0, 0, 50, 50, 50, 56, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 76, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 80, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 66, 66, 66, 66, 66, - 66, 23, 23, 23, 0, 0, 0, 0, 0, 56, 62, 56, 62, 66, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 3, 0, - 0, 0, 0, 1, 68, 68, 68, 52, 68, 68, 20, 20, 20, 0, 0, 0, 0, 0, 3, 0, - 0, 0, 0, 8, 68, 68, 68, 56, 68, 68, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 21, 0, 3, 0, 0, 0, 0, 0, 100, 100, 100, 100, 100, 100, - 36, 36, 36, 0, 0, 1, 0, 0, 200, 230, 134, 0, 0, 0, 0, 0, 8, 0, 12, 0, - 215, 230, 134, 0, 1, 0, 0, 0, 7, 0, 4, 0, 233, 230, 134, 0, 2, 0, 0, - 0, 8, 0, 8, 0, 251, 230, 134, 0, 3, 0, 0, 0, 7, 0, 4, 0, 11, 231, 134, - 0, 4, 0, 0, 0, 8, 0, 28, 0, 27, 231, 134, 0, 5, 0, 0, 0, 8, 0, 12, 0, - 44, 231, 134, 0, 6, 0, 0, 0, 7, 0, 4, 0, 67, 231, 134, 0, 7, 0, 0, 0, - 7, 0, 4, 0, 228, 200, 1, 0, 8, 0, 0, 0, 7, 0, 4, 0, 244, 200, 1, 0, - 9, 0, 0, 0, 7, 0, 4, 0, 8, 201, 1, 0, 10, 0, 0, 0, 8, 0, 144, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 107, 116, 95, 102, 105, 108, 116, - 101, 114, 95, 105, 99, 109, 112, 0, 112, 107, 116, 95, 102, 105, 108, - 116, 101, 114, 95, 105, 99, 109, 112, 95, 99, 110, 116, 0, 119, 97, - 107, 101, 95, 112, 97, 99, 107, 101, 116, 0, 83, 101, 116, 32, 66, 82, - 80, 84, 32, 97, 116, 32, 37, 120, 10, 0, 10, 70, 87, 73, 68, 32, 48, - 49, 45, 37, 120, 10, 0, 10, 84, 82, 65, 80, 32, 37, 120, 40, 37, 120, - 41, 58, 32, 112, 99, 32, 37, 120, 44, 32, 108, 114, 32, 37, 120, 44, - 32, 115, 112, 32, 37, 120, 44, 32, 112, 115, 114, 32, 37, 120, 44, 32, - 120, 112, 115, 114, 32, 37, 120, 10, 0, 32, 32, 114, 48, 32, 37, 120, - 44, 32, 114, 49, 32, 37, 120, 44, 32, 114, 50, 32, 37, 120, 44, 32, - 114, 51, 32, 37, 120, 44, 32, 114, 52, 32, 37, 120, 44, 32, 114, 53, - 32, 37, 120, 44, 32, 114, 54, 32, 37, 120, 10, 0, 32, 32, 114, 55, 32, - 37, 120, 44, 32, 114, 56, 32, 37, 120, 44, 32, 114, 57, 32, 37, 120, - 44, 32, 114, 49, 48, 32, 37, 120, 44, 32, 114, 49, 49, 32, 37, 120, - 44, 32, 114, 49, 50, 32, 37, 120, 10, 0, 10, 32, 32, 32, 115, 112, 43, - 48, 32, 37, 48, 56, 120, 32, 37, 48, 56, 120, 32, 37, 48, 56, 120, 32, - 37, 48, 56, 120, 10, 0, 32, 32, 115, 112, 43, 49, 48, 32, 37, 48, 56, - 120, 32, 37, 48, 56, 120, 32, 37, 48, 56, 120, 32, 37, 48, 56, 120, - 10, 0, 115, 112, 43, 37, 120, 32, 37, 48, 56, 120, 10, 0, 100, 101, - 97, 100, 109, 97, 110, 95, 116, 111, 0, 114, 97, 109, 115, 116, 98, - 121, 100, 105, 115, 0, 112, 97, 37, 100, 61, 48, 120, 37, 37, 120, 0, - 112, 100, 37, 100, 61, 48, 120, 37, 37, 120, 0, 110, 118, 114, 97, 109, - 95, 111, 118, 101, 114, 114, 105, 100, 101, 0, 0, 0, 0, 134, 6, 2, 0, - 208, 9, 0, 0, 128, 6, 2, 0, 62, 62, 0, 0, 130, 6, 2, 0, 62, 2, 0, 0, - 0, 7, 2, 0, 60, 0, 0, 0, 132, 6, 2, 0, 18, 2, 0, 0, 96, 1, 4, 0, 3, - 0, 1, 0, 100, 1, 2, 0, 192, 0, 0, 0, 96, 1, 4, 0, 3, 0, 1, 0, 102, 1, - 2, 0, 10, 0, 0, 0, 96, 1, 4, 0, 4, 0, 1, 0, 100, 1, 2, 0, 20, 0, 0, - 0, 96, 1, 4, 0, 7, 0, 1, 0, 100, 1, 2, 0, 131, 1, 0, 0, 96, 1, 4, 0, - 37, 0, 1, 0, 100, 1, 2, 0, 244, 1, 0, 0, 96, 1, 4, 0, 150, 5, 1, 0, - 100, 1, 2, 0, 43, 4, 0, 0, 96, 1, 4, 0, 150, 5, 1, 0, 102, 1, 2, 0, - 0, 1, 0, 0, 96, 1, 4, 0, 215, 1, 1, 0, 100, 1, 2, 0, 60, 0, 0, 0, 96, - 1, 4, 0, 220, 1, 1, 0, 102, 1, 2, 0, 52, 0, 0, 0, 96, 1, 4, 0, 226, - 1, 1, 0, 100, 1, 2, 0, 48, 0, 0, 0, 96, 1, 4, 0, 231, 1, 1, 0, 102, - 1, 2, 0, 44, 0, 0, 0, 96, 1, 4, 0, 237, 1, 1, 0, 100, 1, 2, 0, 44, 0, - 0, 0, 96, 1, 4, 0, 242, 1, 1, 0, 102, 1, 2, 0, 40, 0, 0, 0, 96, 1, 4, - 0, 248, 1, 1, 0, 100, 1, 2, 0, 40, 0, 0, 0, 96, 1, 4, 0, 253, 1, 1, - 0, 102, 1, 2, 0, 40, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 96, 1, 4, - 0, 5, 0, 1, 3, 100, 1, 4, 0, 0, 0, 25, 0, 36, 1, 4, 0, 4, 0, 0, 0, 40, - 1, 4, 0, 0, 0, 0, 0, 44, 1, 4, 0, 0, 0, 0, 0, 48, 1, 4, 0, 0, 0, 0, - 0, 52, 1, 4, 0, 10, 4, 112, 0, 52, 1, 4, 0, 239, 190, 212, 0, 52, 1, - 4, 0, 5, 0, 0, 255, 52, 1, 4, 0, 1, 255, 2, 255, 48, 1, 4, 0, 24, 0, - 0, 0, 52, 1, 4, 0, 10, 4, 224, 0, 52, 1, 4, 0, 239, 190, 72, 0, 52, - 1, 4, 0, 5, 0, 0, 255, 52, 1, 4, 0, 1, 255, 2, 255, 52, 1, 4, 0, 0, - 16, 24, 1, 52, 1, 4, 0, 2, 3, 0, 16, 52, 1, 4, 0, 24, 241, 242, 243, - 52, 1, 4, 0, 187, 204, 0, 0, 48, 1, 4, 0, 104, 6, 0, 0, 52, 1, 4, 0, - 20, 4, 112, 0, 52, 1, 4, 0, 239, 190, 88, 1, 52, 1, 4, 0, 0, 0, 0, 255, - 52, 1, 4, 0, 1, 255, 2, 255, 52, 1, 4, 0, 0, 16, 24, 1, 52, 1, 4, 0, - 2, 3, 3, 9, 52, 1, 4, 0, 191, 0, 0, 16, 52, 1, 4, 0, 0, 0, 0, 0, 48, - 1, 4, 0, 56, 0, 0, 0, 52, 1, 4, 0, 0, 0, 0, 0, 48, 1, 4, 0, 136, 6, - 0, 0, 52, 1, 4, 0, 20, 4, 128, 0, 52, 1, 4, 0, 239, 190, 24, 2, 52, - 1, 4, 0, 0, 0, 3, 9, 52, 1, 4, 0, 191, 0, 0, 3, 52, 1, 4, 0, 0, 1, 2, - 3, 52, 1, 4, 0, 4, 5, 0, 1, 52, 1, 4, 0, 2, 3, 4, 5, 52, 1, 4, 0, 0, - 0, 0, 0, 48, 1, 4, 0, 88, 0, 0, 0, 52, 1, 4, 0, 0, 0, 0, 0, 48, 1, 4, - 0, 56, 0, 0, 0, 52, 1, 4, 0, 15, 32, 0, 7, 52, 1, 4, 0, 0, 0, 148, 0, - 52, 1, 4, 0, 0, 0, 0, 144, 52, 1, 4, 0, 116, 117, 118, 119, 52, 1, 4, - 0, 0, 0, 0, 0, 52, 1, 4, 0, 0, 0, 5, 0, 52, 1, 4, 0, 255, 255, 255, - 255, 48, 1, 4, 0, 104, 2, 0, 0, 52, 1, 4, 0, 110, 132, 51, 0, 52, 1, - 4, 0, 220, 186, 80, 0, 52, 1, 4, 0, 212, 0, 0, 171, 52, 1, 4, 0, 186, - 218, 186, 218, 52, 1, 4, 0, 0, 16, 24, 241, 52, 1, 4, 0, 242, 243, 0, - 16, 52, 1, 4, 0, 24, 241, 242, 243, 52, 1, 4, 0, 16, 0, 0, 0, 52, 1, - 4, 0, 0, 0, 0, 0, 52, 1, 4, 0, 0, 0, 10, 0, 52, 1, 4, 0, 1, 0, 0, 14, - 52, 1, 4, 0, 66, 82, 67, 77, 52, 1, 4, 0, 95, 84, 69, 83, 52, 1, 4, - 0, 84, 95, 83, 83, 52, 1, 4, 0, 73, 68, 1, 4, 52, 1, 4, 0, 130, 132, - 139, 150, 52, 1, 4, 0, 3, 1, 1, 6, 52, 1, 4, 0, 2, 0, 0, 0, 48, 1, 4, - 0, 104, 0, 0, 0, 52, 1, 4, 0, 10, 4, 40, 2, 52, 1, 4, 0, 220, 186, 128, - 0, 52, 1, 4, 0, 0, 0, 255, 255, 52, 1, 4, 0, 255, 255, 255, 255, 52, - 1, 4, 0, 0, 16, 24, 241, 52, 1, 4, 0, 242, 243, 0, 16, 52, 1, 4, 0, - 24, 241, 242, 243, 52, 1, 4, 0, 208, 175, 0, 0, 52, 1, 4, 0, 0, 0, 0, - 0, 52, 1, 4, 0, 0, 0, 0, 1, 52, 1, 4, 0, 2, 0, 0, 14, 52, 1, 4, 0, 66, - 82, 67, 77, 52, 1, 4, 0, 95, 84, 69, 83, 52, 1, 4, 0, 84, 95, 83, 83, - 52, 1, 4, 0, 73, 68, 1, 4, 52, 1, 4, 0, 130, 132, 139, 150, 52, 1, 4, - 0, 3, 1, 1, 6, 52, 1, 4, 0, 2, 1, 0, 0, 48, 1, 4, 0, 104, 4, 0, 0, 52, - 1, 4, 0, 10, 4, 40, 2, 52, 1, 4, 0, 220, 186, 128, 0, 52, 1, 4, 0, 0, - 0, 255, 255, 52, 1, 4, 0, 255, 255, 255, 255, 52, 1, 4, 0, 0, 16, 24, - 241, 52, 1, 4, 0, 242, 243, 0, 16, 52, 1, 4, 0, 24, 241, 242, 243, 52, - 1, 4, 0, 208, 175, 0, 0, 52, 1, 4, 0, 0, 0, 0, 0, 52, 1, 4, 0, 0, 0, - 0, 1, 52, 1, 4, 0, 2, 0, 0, 14, 52, 1, 4, 0, 66, 82, 67, 77, 52, 1, - 4, 0, 95, 84, 69, 83, 52, 1, 4, 0, 84, 95, 83, 83, 52, 1, 4, 0, 73, - 68, 1, 4, 52, 1, 4, 0, 130, 132, 139, 150, 52, 1, 4, 0, 3, 1, 1, 6, - 52, 1, 4, 0, 2, 1, 0, 0, 0, 1, 4, 0, 0, 0, 0, 1, 144, 4, 2, 0, 0, 0, - 0, 0, 160, 4, 2, 0, 241, 243, 0, 0, 176, 4, 2, 0, 239, 253, 0, 0, 168, - 4, 2, 0, 255, 255, 0, 0, 168, 4, 2, 0, 0, 0, 0, 0, 170, 4, 2, 0, 0, - 0, 0, 0, 164, 4, 2, 0, 207, 26, 0, 0, 172, 4, 2, 0, 0, 0, 0, 0, 188, - 4, 2, 0, 0, 0, 0, 0, 166, 4, 2, 0, 215, 2, 0, 0, 182, 4, 2, 0, 255, - 253, 0, 0, 174, 4, 2, 0, 255, 255, 0, 0, 6, 4, 2, 0, 1, 0, 0, 0, 6, - 4, 2, 0, 0, 0, 0, 0, 12, 4, 2, 0, 24, 0, 0, 0, 6, 4, 2, 0, 0, 0, 0, - 0, 72, 4, 2, 0, 0, 12, 0, 0, 2, 4, 2, 0, 160, 7, 0, 0, 2, 5, 2, 0, 0, - 0, 0, 0, 0, 5, 2, 0, 0, 64, 0, 0, 2, 5, 2, 0, 4, 0, 0, 0, 0, 5, 2, 0, - 0, 64, 0, 0, 2, 5, 2, 0, 8, 0, 0, 0, 0, 5, 2, 0, 0, 64, 0, 0, 2, 5, - 2, 0, 12, 0, 0, 0, 0, 5, 2, 0, 0, 64, 0, 0, 2, 5, 2, 0, 192, 0, 0, 0, - 128, 5, 2, 0, 255, 255, 0, 0, 130, 5, 2, 0, 255, 255, 0, 0, 132, 5, - 2, 0, 255, 255, 0, 0, 134, 5, 2, 0, 255, 255, 0, 0, 136, 5, 2, 0, 255, - 255, 0, 0, 156, 5, 2, 0, 240, 255, 0, 0, 64, 5, 2, 0, 0, 128, 0, 0, - 32, 5, 2, 0, 6, 15, 0, 0, 64, 5, 2, 0, 0, 128, 0, 0, 64, 5, 2, 0, 0, - 129, 0, 0, 32, 5, 2, 0, 16, 29, 0, 0, 64, 5, 2, 0, 0, 129, 0, 0, 64, - 5, 2, 0, 0, 130, 0, 0, 32, 5, 2, 0, 30, 40, 0, 0, 64, 5, 2, 0, 0, 130, - 0, 0, 64, 5, 2, 0, 0, 131, 0, 0, 32, 5, 2, 0, 41, 49, 0, 0, 64, 5, 2, - 0, 0, 131, 0, 0, 64, 5, 2, 0, 0, 132, 0, 0, 32, 5, 2, 0, 50, 63, 0, - 0, 64, 5, 2, 0, 0, 132, 0, 0, 64, 5, 2, 0, 0, 133, 0, 0, 32, 5, 2, 0, - 64, 65, 0, 0, 64, 5, 2, 0, 0, 133, 0, 0, 18, 6, 2, 0, 1, 0, 0, 0, 46, - 6, 2, 0, 205, 204, 0, 0, 48, 6, 2, 0, 12, 0, 0, 0, 0, 6, 2, 0, 4, 128, - 0, 0, 150, 6, 2, 0, 8, 0, 0, 0, 154, 6, 2, 0, 228, 0, 0, 0, 136, 6, - 2, 0, 0, 0, 0, 0, 156, 6, 2, 0, 2, 0, 0, 0, 136, 6, 2, 0, 0, 16, 0, - 0, 156, 6, 2, 0, 2, 0, 0, 0, 136, 6, 2, 0, 0, 32, 0, 0, 156, 6, 2, 0, - 2, 0, 0, 0, 136, 6, 2, 0, 0, 48, 0, 0, 156, 6, 2, 0, 2, 0, 0, 0, 136, - 6, 2, 0, 11, 15, 0, 0, 158, 6, 2, 0, 7, 0, 0, 0, 16, 5, 2, 0, 11, 0, - 0, 0, 80, 4, 2, 0, 1, 78, 0, 0, 82, 4, 2, 0, 91, 1, 0, 0, 228, 4, 2, - 0, 144, 0, 0, 0, 4, 4, 2, 0, 180, 0, 0, 0, 84, 5, 2, 0, 255, 63, 0, - 0, 96, 1, 4, 0, 4, 0, 1, 3, 100, 1, 4, 0, 0, 0, 0, 0, 100, 1, 4, 0, - 180, 0, 0, 0, 100, 1, 4, 0, 71, 0, 71, 0, 100, 1, 4, 0, 0, 0, 100, 0, - 100, 1, 4, 0, 48, 9, 64, 0, 96, 1, 4, 0, 13, 0, 1, 3, 100, 1, 4, 0, - 2, 0, 2, 0, 100, 1, 4, 0, 1, 0, 128, 0, 100, 1, 4, 0, 5, 0, 0, 0, 100, - 1, 4, 0, 0, 0, 128, 0, 100, 1, 4, 0, 100, 0, 100, 0, 100, 1, 4, 0, 14, - 0, 71, 0, 100, 1, 4, 0, 0, 5, 0, 0, 96, 1, 4, 0, 21, 0, 1, 3, 100, 1, - 4, 0, 0, 0, 66, 8, 100, 1, 4, 0, 222, 11, 7, 0, 100, 1, 4, 0, 10, 0, - 0, 0, 96, 1, 4, 0, 26, 0, 1, 3, 100, 1, 4, 0, 0, 192, 100, 11, 96, 1, - 4, 0, 29, 0, 1, 3, 100, 1, 4, 0, 16, 39, 0, 0, 100, 1, 4, 0, 0, 0, 122, - 3, 96, 1, 4, 0, 32, 0, 1, 3, 100, 1, 4, 0, 6, 0, 16, 39, 96, 1, 4, 0, - 35, 0, 1, 3, 100, 1, 4, 0, 0, 0, 246, 6, 100, 1, 4, 0, 0, 0, 168, 10, - 100, 1, 4, 0, 0, 0, 50, 0, 100, 1, 4, 0, 10, 14, 11, 9, 100, 1, 4, 0, - 14, 2, 0, 0, 100, 1, 4, 0, 0, 0, 82, 10, 100, 1, 4, 0, 0, 0, 63, 1, - 100, 1, 4, 0, 255, 255, 0, 12, 100, 1, 4, 0, 50, 4, 110, 6, 100, 1, - 4, 0, 2, 0, 242, 9, 96, 1, 4, 0, 46, 0, 1, 3, 100, 1, 4, 0, 0, 0, 0, - 128, 96, 1, 4, 0, 50, 0, 1, 3, 100, 1, 4, 0, 0, 0, 50, 11, 96, 1, 4, - 0, 52, 0, 1, 3, 100, 1, 4, 0, 0, 0, 204, 5, 96, 1, 4, 0, 88, 0, 1, 3, - 100, 1, 4, 0, 66, 82, 67, 77, 100, 1, 4, 0, 95, 84, 69, 83, 100, 1, - 4, 0, 84, 95, 83, 83, 100, 1, 4, 0, 73, 68, 0, 0, 96, 1, 4, 0, 96, 0, - 1, 3, 100, 1, 4, 0, 57, 0, 0, 0, 100, 1, 4, 0, 80, 0, 0, 0, 100, 1, - 4, 0, 192, 0, 0, 0, 96, 1, 4, 0, 112, 0, 1, 3, 100, 1, 4, 0, 170, 3, - 170, 3, 100, 1, 4, 0, 170, 3, 170, 3, 100, 1, 4, 0, 170, 3, 170, 3, - 100, 1, 4, 0, 170, 3, 170, 3, 100, 1, 4, 0, 236, 3, 214, 3, 100, 1, - 4, 0, 192, 3, 170, 3, 100, 1, 4, 0, 247, 3, 225, 3, 100, 1, 4, 0, 203, - 3, 181, 3, 100, 1, 4, 0, 170, 3, 170, 3, 100, 1, 4, 0, 170, 3, 170, - 3, 100, 1, 4, 0, 170, 3, 170, 3, 100, 1, 4, 0, 170, 3, 170, 3, 100, - 1, 4, 0, 236, 3, 214, 3, 100, 1, 4, 0, 192, 3, 170, 3, 100, 1, 4, 0, - 247, 3, 225, 3, 100, 1, 4, 0, 203, 3, 181, 3, 100, 1, 4, 0, 2, 4, 2, - 4, 100, 1, 4, 0, 2, 4, 2, 4, 100, 1, 4, 0, 14, 4, 2, 4, 100, 1, 4, 0, - 2, 4, 26, 4, 100, 1, 4, 0, 2, 4, 2, 4, 100, 1, 4, 0, 2, 4, 2, 4, 100, - 1, 4, 0, 2, 4, 2, 4, 100, 1, 4, 0, 38, 4, 2, 4, 100, 1, 4, 0, 2, 4, - 2, 4, 100, 1, 4, 0, 2, 4, 2, 4, 100, 1, 4, 0, 14, 4, 2, 4, 100, 1, 4, - 0, 2, 4, 26, 4, 100, 1, 4, 0, 2, 4, 2, 4, 100, 1, 4, 0, 2, 4, 2, 4, - 100, 1, 4, 0, 2, 4, 2, 4, 100, 1, 4, 0, 38, 4, 2, 4, 100, 1, 4, 0, 0, - 0, 31, 0, 100, 1, 4, 0, 255, 3, 31, 0, 100, 1, 4, 0, 2, 0, 0, 0, 100, - 1, 4, 0, 2, 0, 0, 0, 96, 1, 4, 0, 152, 0, 1, 3, 100, 1, 4, 0, 0, 0, - 31, 0, 100, 1, 4, 0, 255, 3, 31, 0, 100, 1, 4, 0, 1, 0, 0, 0, 100, 1, - 4, 0, 1, 0, 0, 0, 96, 1, 4, 0, 160, 0, 1, 3, 100, 1, 4, 0, 0, 0, 31, - 0, 100, 1, 4, 0, 255, 3, 31, 0, 100, 1, 4, 0, 1, 0, 0, 0, 100, 1, 4, - 0, 1, 0, 0, 0, 96, 1, 4, 0, 168, 0, 1, 3, 100, 1, 4, 0, 0, 0, 31, 0, - 100, 1, 4, 0, 255, 3, 31, 0, 100, 1, 4, 0, 1, 0, 0, 0, 100, 1, 4, 0, - 1, 0, 0, 0, 96, 1, 4, 0, 184, 0, 1, 3, 100, 1, 4, 0, 231, 0, 236, 0, - 100, 1, 4, 0, 0, 0, 123, 0, 100, 1, 4, 0, 126, 0, 0, 0, 100, 1, 4, 0, - 0, 0, 0, 0, 100, 1, 4, 0, 0, 0, 79, 81, 100, 1, 4, 0, 63, 0, 0, 0, 100, - 1, 4, 0, 0, 0, 0, 16, 96, 1, 4, 0, 192, 0, 1, 3, 100, 1, 4, 0, 55, 36, - 55, 36, 100, 1, 4, 0, 55, 36, 55, 36, 96, 1, 4, 0, 147, 1, 1, 3, 100, - 1, 4, 0, 15, 0, 64, 0, 100, 1, 4, 0, 230, 6, 0, 0, 96, 1, 4, 0, 151, - 1, 1, 3, 100, 1, 4, 0, 26, 8, 0, 0, 96, 1, 4, 0, 160, 1, 1, 3, 100, - 1, 4, 0, 255, 255, 255, 255, 100, 1, 4, 0, 255, 255, 255, 255, 100, - 1, 4, 0, 255, 255, 255, 255, 100, 1, 4, 0, 255, 255, 255, 255, 100, - 1, 4, 0, 255, 255, 255, 255, 100, 1, 4, 0, 255, 255, 255, 255, 100, - 1, 4, 0, 255, 255, 255, 255, 100, 1, 4, 0, 255, 255, 255, 255, 96, 1, - 4, 0, 188, 1, 1, 3, 100, 1, 4, 0, 0, 0, 5, 0, 96, 1, 4, 0, 197, 1, 1, - 3, 100, 1, 4, 0, 0, 0, 16, 3, 100, 1, 4, 0, 224, 0, 255, 255, 100, 1, - 4, 0, 3, 9, 191, 0, 100, 1, 4, 0, 0, 0, 3, 9, 100, 1, 4, 0, 191, 0, - 0, 16, 100, 1, 4, 0, 3, 9, 191, 0, 100, 1, 4, 0, 0, 3, 0, 0, 96, 1, - 4, 0, 205, 1, 1, 3, 100, 1, 4, 0, 255, 255, 255, 255, 100, 1, 4, 0, - 255, 255, 255, 255, 100, 1, 4, 0, 255, 255, 255, 255, 100, 1, 4, 0, - 255, 255, 255, 255, 100, 1, 4, 0, 255, 255, 255, 255, 100, 1, 4, 0, - 255, 255, 255, 255, 100, 1, 4, 0, 255, 255, 255, 255, 100, 1, 4, 0, - 255, 255, 255, 255, 100, 1, 4, 0, 32, 0, 203, 1, 100, 1, 4, 0, 0, 0, - 84, 0, 100, 1, 4, 0, 0, 0, 171, 8, 100, 1, 4, 0, 0, 0, 16, 4, 100, 1, - 4, 0, 132, 0, 2, 0, 100, 1, 4, 0, 0, 0, 20, 0, 100, 1, 4, 0, 207, 1, - 2, 0, 100, 1, 4, 0, 68, 0, 0, 0, 100, 1, 4, 0, 175, 8, 2, 0, 100, 1, - 4, 0, 16, 4, 100, 0, 100, 1, 4, 0, 2, 2, 0, 0, 100, 1, 4, 0, 16, 0, - 202, 1, 100, 1, 4, 0, 2, 0, 60, 0, 100, 1, 4, 0, 0, 0, 170, 8, 100, - 1, 4, 0, 2, 0, 16, 4, 100, 1, 4, 0, 84, 0, 2, 8, 100, 1, 4, 0, 0, 0, - 8, 0, 100, 1, 4, 0, 206, 1, 0, 0, 100, 1, 4, 0, 52, 0, 0, 0, 100, 1, - 4, 0, 174, 8, 0, 0, 100, 1, 4, 0, 16, 4, 68, 0, 100, 1, 4, 0, 2, 10, - 0, 0, 100, 1, 4, 0, 8, 0, 201, 1, 100, 1, 4, 0, 2, 0, 48, 0, 100, 1, - 4, 0, 0, 0, 169, 8, 100, 1, 4, 0, 2, 0, 16, 4, 100, 1, 4, 0, 60, 0, - 2, 16, 100, 1, 4, 0, 0, 0, 4, 0, 100, 1, 4, 0, 205, 1, 0, 0, 100, 1, - 4, 0, 44, 0, 0, 0, 100, 1, 4, 0, 173, 8, 0, 0, 100, 1, 4, 0, 16, 4, - 52, 0, 100, 1, 4, 0, 2, 18, 0, 0, 100, 1, 4, 0, 4, 0, 200, 1, 100, 1, - 4, 0, 0, 0, 44, 0, 100, 1, 4, 0, 0, 0, 168, 8, 100, 1, 4, 0, 0, 0, 16, - 4, 100, 1, 4, 0, 48, 0, 2, 25, 100, 1, 4, 0, 0, 0, 0, 0, 100, 1, 4, - 0, 204, 1, 2, 0, 100, 1, 4, 0, 44, 0, 0, 0, 100, 1, 4, 0, 172, 8, 2, - 0, 100, 1, 4, 0, 16, 4, 48, 0, 100, 1, 4, 0, 2, 26, 0, 0, 100, 1, 4, - 0, 192, 0, 10, 4, 100, 1, 4, 0, 112, 0, 0, 0, 100, 1, 4, 0, 58, 1, 10, - 4, 100, 1, 4, 0, 40, 2, 44, 192, 100, 1, 4, 0, 242, 2, 10, 4, 100, 1, - 4, 0, 0, 0, 0, 1, 100, 1, 4, 0, 96, 0, 20, 4, 100, 1, 4, 0, 56, 0, 0, - 0, 100, 1, 4, 0, 2, 1, 20, 4, 100, 1, 4, 0, 20, 1, 44, 192, 100, 1, - 4, 0, 222, 1, 20, 4, 100, 1, 4, 0, 0, 0, 128, 0, 100, 1, 4, 0, 34, 0, - 55, 4, 100, 1, 4, 0, 21, 0, 0, 0, 100, 1, 4, 0, 223, 0, 55, 4, 100, - 1, 4, 0, 101, 0, 44, 192, 100, 1, 4, 0, 46, 1, 55, 4, 100, 1, 4, 0, - 0, 0, 47, 0, 100, 1, 4, 0, 17, 0, 110, 132, 100, 1, 4, 0, 11, 0, 0, - 0, 100, 1, 4, 0, 212, 0, 110, 132, 100, 1, 4, 0, 51, 0, 44, 192, 100, - 1, 4, 0, 252, 0, 110, 132, 100, 1, 4, 0, 0, 0, 24, 0, 100, 1, 4, 0, - 2, 0, 138, 157, 100, 1, 4, 0, 251, 0, 2, 8, 100, 1, 4, 0, 197, 78, 250, - 0, 100, 1, 4, 0, 2, 10, 131, 52, 100, 1, 4, 0, 254, 0, 2, 16, 100, 1, - 4, 0, 98, 39, 249, 0, 100, 1, 4, 0, 2, 18, 66, 26, 100, 1, 4, 0, 253, - 0, 2, 25, 100, 1, 4, 0, 177, 19, 248, 0, 100, 1, 4, 0, 2, 26, 129, 17, - 100, 1, 4, 0, 252, 0, 2, 28, 100, 1, 4, 0, 193, 15, 252, 0, 96, 1, 4, - 0, 123, 3, 1, 3, 100, 1, 4, 0, 7, 0, 20, 0, 100, 1, 4, 0, 30, 0, 0, - 0, 96, 1, 4, 0, 131, 3, 1, 3, 100, 1, 4, 0, 0, 0, 0, 240, 100, 1, 4, - 0, 195, 48, 16, 146, 100, 1, 4, 0, 80, 49, 128, 34, 100, 1, 4, 0, 195, - 48, 0, 0, 96, 1, 4, 0, 136, 3, 1, 3, 100, 1, 4, 0, 0, 0, 16, 4, 96, - 1, 4, 0, 140, 3, 1, 3, 100, 1, 4, 0, 128, 0, 0, 0, 96, 1, 4, 0, 142, - 3, 1, 3, 100, 1, 4, 0, 5, 0, 0, 0, 96, 1, 4, 0, 11, 4, 1, 3, 100, 1, - 4, 0, 7, 2, 0, 0, 96, 1, 4, 0, 19, 4, 1, 3, 100, 1, 4, 0, 0, 0, 1, 0, - 96, 1, 4, 0, 21, 4, 1, 3, 100, 1, 4, 0, 0, 0, 12, 0, 96, 1, 4, 0, 83, - 5, 1, 3, 100, 1, 4, 0, 24, 0, 0, 0, 100, 1, 4, 0, 152, 58, 152, 58, - 100, 1, 4, 0, 166, 14, 100, 0, 100, 1, 4, 0, 0, 0, 244, 1, 100, 1, 4, - 0, 5, 0, 0, 0, 100, 1, 4, 0, 168, 97, 168, 97, 100, 1, 4, 0, 48, 117, - 30, 0, 96, 1, 4, 0, 92, 5, 1, 3, 100, 1, 4, 0, 80, 195, 0, 0, 96, 1, - 4, 0, 94, 5, 1, 3, 100, 1, 4, 0, 0, 0, 20, 5, 100, 1, 4, 0, 80, 195, - 0, 0, 96, 1, 4, 0, 98, 5, 1, 3, 100, 1, 4, 0, 32, 78, 0, 0, 100, 1, - 4, 0, 0, 0, 15, 0, 100, 1, 4, 0, 244, 1, 4, 0, 96, 1, 4, 0, 104, 5, - 1, 3, 100, 1, 4, 0, 0, 0, 49, 0, 100, 1, 4, 0, 0, 0, 3, 0, 100, 1, 4, - 0, 1, 0, 7, 0, 100, 1, 4, 0, 200, 175, 0, 0, 100, 1, 4, 0, 136, 19, - 0, 0, 100, 1, 4, 0, 44, 23, 255, 0, 96, 1, 4, 0, 111, 5, 1, 3, 100, - 1, 4, 0, 0, 0, 44, 1, 100, 1, 4, 0, 0, 0, 160, 15, 96, 1, 4, 0, 114, - 5, 1, 3, 100, 1, 4, 0, 0, 0, 3, 0, 100, 1, 4, 0, 0, 0, 44, 1, 100, 1, - 4, 0, 192, 0, 0, 0, 100, 1, 4, 0, 136, 19, 0, 0, 100, 1, 4, 0, 100, - 0, 0, 0, 100, 1, 4, 0, 220, 5, 64, 31, 96, 1, 4, 0, 121, 5, 1, 3, 100, - 1, 4, 0, 1, 0, 1, 0, 100, 1, 4, 0, 2, 0, 0, 0, 96, 1, 4, 0, 124, 5, - 1, 3, 100, 1, 4, 0, 2, 0, 0, 0, 100, 1, 4, 0, 0, 0, 64, 156, 100, 1, - 4, 0, 32, 78, 0, 0, 100, 1, 4, 0, 184, 11, 0, 0, 96, 1, 4, 0, 129, 5, - 1, 3, 100, 1, 4, 0, 0, 0, 32, 78, 100, 1, 4, 0, 0, 0, 5, 0, 100, 1, - 4, 0, 220, 5, 63, 0, 100, 1, 4, 0, 113, 2, 0, 0, 100, 1, 4, 0, 48, 117, - 0, 0, 96, 1, 4, 0, 137, 5, 1, 3, 100, 1, 4, 0, 196, 9, 160, 15, 96, - 1, 4, 0, 140, 5, 1, 3, 100, 1, 4, 0, 2, 0, 208, 7, 96, 1, 4, 0, 142, - 5, 1, 3, 100, 1, 4, 0, 32, 78, 32, 78, 96, 1, 4, 0, 148, 5, 1, 3, 100, - 1, 4, 0, 0, 0, 190, 0, 96, 1, 4, 0, 176, 5, 1, 3, 100, 1, 4, 0, 0, 0, - 232, 3, 96, 1, 4, 0, 236, 5, 1, 3, 100, 1, 4, 0, 0, 0, 0, 0, 96, 1, - 4, 0, 245, 5, 1, 3, 100, 1, 4, 0, 0, 0, 136, 19, 96, 1, 4, 0, 3, 0, - 2, 0, 100, 1, 4, 0, 31, 0, 0, 0, 96, 1, 4, 0, 4, 0, 2, 0, 100, 1, 4, - 0, 255, 3, 0, 0, 96, 1, 4, 0, 5, 0, 2, 0, 100, 1, 4, 0, 31, 0, 0, 0, - 96, 1, 4, 0, 6, 0, 2, 0, 100, 1, 4, 0, 7, 0, 0, 0, 96, 1, 4, 0, 7, 0, - 2, 0, 100, 1, 4, 0, 4, 0, 0, 0, 96, 1, 4, 0, 8, 0, 2, 0, 100, 1, 4, - 0, 255, 255, 0, 0, 96, 1, 4, 0, 9, 0, 2, 0, 100, 1, 4, 0, 0, 0, 0, 0, - 96, 1, 4, 0, 10, 0, 2, 0, 100, 1, 4, 0, 0, 0, 0, 0, 96, 1, 4, 0, 11, - 0, 2, 0, 100, 1, 4, 0, 0, 0, 0, 0, 96, 1, 4, 0, 12, 0, 2, 0, 100, 1, - 4, 0, 0, 0, 0, 0, 96, 1, 4, 0, 13, 0, 2, 0, 100, 1, 4, 0, 0, 0, 0, 0, - 96, 1, 4, 0, 14, 0, 2, 0, 100, 1, 4, 0, 0, 0, 0, 0, 96, 1, 4, 0, 15, - 0, 2, 0, 100, 1, 4, 0, 0, 0, 0, 0, 96, 1, 4, 0, 16, 0, 2, 0, 100, 1, - 4, 0, 31, 0, 0, 0, 96, 1, 4, 0, 17, 0, 2, 0, 100, 1, 4, 0, 0, 0, 0, - 0, 96, 1, 4, 0, 18, 0, 2, 0, 100, 1, 4, 0, 0, 0, 0, 0, 96, 1, 4, 0, - 19, 0, 2, 0, 100, 1, 4, 0, 0, 0, 0, 0, 96, 1, 4, 0, 21, 0, 2, 0, 100, - 1, 4, 0, 0, 0, 0, 0, 96, 1, 4, 0, 22, 0, 2, 0, 100, 1, 4, 0, 0, 0, 0, - 0, 255, 255, 0, 0, 0, 0, 0, 0, 99, 98, 117, 99, 107, 95, 115, 119, 102, - 114, 101, 113, 0, 0, 0, 0, 224, 46, 1, 1, 1, 80, 0, 0, 0, 0, 0, 0, 200, - 50, 2, 1, 1, 73, 0, 0, 137, 157, 216, 0, 64, 56, 3, 1, 1, 66, 0, 0, - 170, 170, 170, 0, 0, 60, 4, 1, 1, 62, 0, 0, 0, 0, 128, 0, 72, 63, 5, - 1, 1, 57, 0, 0, 208, 94, 66, 0, 160, 65, 6, 1, 1, 57, 0, 0, 73, 146, - 36, 0, 0, 75, 7, 1, 1, 50, 0, 0, 0, 0, 0, 0, 88, 77, 8, 1, 1, 48, 0, - 0, 7, 31, 124, 0, 32, 78, 9, 1, 1, 48, 0, 0, 0, 0, 0, 0, 192, 93, 10, - 1, 1, 40, 0, 0, 0, 0, 0, 0, 168, 97, 11, 1, 1, 38, 0, 0, 102, 102, 102, - 0, 144, 101, 12, 1, 1, 36, 0, 0, 196, 78, 236, 0, 48, 117, 13, 1, 1, - 32, 0, 0, 0, 0, 0, 0, 24, 146, 14, 2, 1, 51, 0, 0, 249, 62, 86, 0, 0, - 150, 15, 2, 1, 50, 0, 0, 0, 0, 0, 0, 64, 156, 16, 2, 1, 48, 0, 0, 0, - 0, 0, 0, 128, 187, 17, 2, 1, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 249, 220, 1, 0, 0, 0, 0, 0, 8, 0, 8, 0, 248, 220, - 1, 0, 1, 0, 0, 0, 8, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, - 107, 101, 101, 112, 95, 97, 108, 105, 118, 101, 0, 91, 87, 76, 65, 78, - 93, 99, 111, 117, 110, 116, 32, 61, 32, 37, 100, 10, 0, 73, 110, 105, - 116, 32, 67, 111, 117, 110, 116, 101, 114, 0, 71, 114, 111, 117, 112, - 32, 107, 101, 121, 32, 101, 120, 112, 97, 110, 115, 105, 111, 110, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 116, 97, 0, 65, 77, 80, 45, - 37, 48, 50, 120, 45, 37, 48, 50, 120, 45, 37, 48, 50, 120, 45, 37, 48, - 50, 120, 45, 37, 48, 50, 120, 45, 37, 48, 50, 120, 0, 98, 116, 97, 109, - 112, 0, 98, 116, 97, 109, 112, 95, 102, 108, 97, 103, 115, 0, 98, 116, - 97, 109, 112, 95, 99, 104, 97, 110, 0, 98, 116, 97, 109, 112, 95, 49, - 49, 110, 95, 115, 117, 112, 112, 111, 114, 116, 0, 98, 116, 97, 109, - 112, 95, 102, 98, 0, 98, 116, 97, 109, 112, 95, 115, 116, 97, 116, 101, - 108, 111, 103, 0, 119, 108, 37, 100, 46, 37, 100, 58, 32, 37, 115, 58, - 32, 115, 99, 98, 32, 107, 101, 121, 32, 105, 100, 32, 37, 100, 32, 100, - 111, 101, 115, 32, 110, 111, 116, 32, 109, 97, 116, 99, 104, 32, 37, - 100, 10, 0, 119, 108, 99, 95, 107, 101, 121, 95, 108, 111, 111, 107, - 117, 112, 0, 0, 0, 119, 108, 99, 95, 97, 112, 95, 112, 114, 111, 99, - 101, 115, 115, 95, 97, 115, 115, 111, 99, 114, 101, 113, 0, 112, 97, - 116, 99, 104, 95, 105, 111, 118, 97, 114, 115, 0, 114, 101, 97, 100, - 32, 115, 104, 109, 101, 109, 10, 0, 37, 115, 58, 32, 68, 111, 32, 87, - 76, 67, 95, 71, 69, 84, 95, 80, 72, 89, 82, 69, 71, 47, 87, 76, 67, - 95, 83, 69, 84, 95, 80, 72, 89, 95, 82, 69, 71, 0, 37, 115, 58, 32, - 114, 101, 106, 101, 99, 116, 32, 100, 117, 101, 32, 116, 111, 32, 110, - 111, 32, 109, 101, 109, 40, 37, 100, 41, 10, 0, 37, 115, 58, 32, 114, - 101, 106, 101, 99, 116, 32, 100, 117, 101, 32, 116, 111, 32, 111, 118, - 101, 114, 32, 109, 97, 120, 97, 115, 115, 111, 99, 40, 37, 100, 41, - 10, 0, 111, 116, 112, 114, 97, 119, 0, 102, 97, 98, 105, 100, 0, 97, - 109, 112, 100, 117, 95, 114, 116, 115, 0, 119, 108, 99, 95, 105, 111, - 99, 116, 108, 95, 112, 97, 116, 99, 104, 109, 111, 100, 0, 32, 121, - 134, 0, 0, 0, 0, 64, 3, 0, 0, 0, 138, 222, 1, 0, 8, 0, 8, 0, 8, 0, 0, - 0, 61, 125, 134, 0, 1, 0, 8, 128, 8, 0, 0, 0, 137, 118, 134, 0, 2, 0, - 0, 64, 8, 0, 0, 0, 204, 187, 134, 0, 3, 0, 0, 64, 6, 0, 0, 0, 171, 155, - 134, 0, 4, 0, 16, 0, 7, 0, 0, 0, 145, 222, 1, 0, 5, 0, 0, 0, 5, 0, 0, - 0, 100, 125, 134, 0, 6, 0, 0, 0, 8, 0, 28, 0, 151, 222, 1, 0, 7, 0, - 0, 0, 1, 0, 0, 0, 214, 155, 134, 0, 9, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 108, 9, 2, 0, 113, 9, 3, 0, 118, 9, - 4, 0, 123, 9, 5, 0, 128, 9, 6, 0, 133, 9, 7, 0, 138, 9, 8, 0, 143, 9, - 9, 0, 148, 9, 10, 0, 153, 9, 11, 0, 158, 9, 12, 0, 163, 9, 13, 0, 168, - 9, 14, 0, 180, 9, 76, 132, 255, 224, 176, 132, 247, 247, 249, 132, 247, - 255, 60, 196, 7, 0, 59, 196, 7, 0, 0, 0, 45, 0, 167, 144, 26, 0, 71, - 9, 14, 0, 1, 32, 7, 0, 139, 147, 3, 0, 56, 202, 1, 0, 42, 229, 0, 0, - 151, 114, 0, 0, 76, 57, 0, 0, 166, 28, 0, 0, 83, 14, 0, 0, 41, 7, 0, - 0, 149, 3, 0, 0, 202, 1, 0, 0, 229, 0, 0, 0, 115, 0, 0, 0, 57, 0, 0, - 0, 29, 0, 0, 0, 46, 102, 97, 98, 46, 0, 37, 115, 46, 102, 97, 98, 46, - 37, 100, 0, 119, 108, 37, 100, 58, 32, 83, 99, 97, 110, 32, 105, 110, - 32, 112, 114, 111, 103, 114, 101, 115, 115, 44, 32, 115, 107, 105, 112, - 112, 105, 110, 103, 32, 116, 120, 112, 111, 119, 101, 114, 32, 99, 111, - 110, 116, 114, 111, 108, 10, 0, 112, 111, 119, 101, 114, 32, 97, 100, - 106, 33, 10, 0, 99, 99, 107, 98, 119, 50, 48, 50, 103, 112, 111, 0, - 99, 99, 107, 98, 119, 50, 48, 117, 108, 50, 103, 112, 111, 0, 108, 101, - 103, 111, 102, 100, 109, 98, 119, 50, 48, 50, 103, 112, 111, 0, 108, - 101, 103, 111, 102, 100, 109, 98, 119, 50, 48, 117, 108, 50, 103, 112, - 111, 0, 109, 99, 115, 98, 119, 50, 48, 50, 103, 112, 111, 0, 109, 99, - 115, 98, 119, 50, 48, 117, 108, 50, 103, 112, 111, 0, 109, 99, 115, - 98, 119, 52, 48, 50, 103, 112, 111, 0, 108, 101, 103, 111, 102, 100, - 109, 98, 119, 50, 48, 53, 103, 108, 112, 111, 0, 108, 101, 103, 111, - 102, 100, 109, 98, 119, 50, 48, 117, 108, 53, 103, 108, 112, 111, 0, - 108, 101, 103, 111, 102, 100, 109, 98, 119, 50, 48, 53, 103, 109, 112, - 111, 0, 108, 101, 103, 111, 102, 100, 109, 98, 119, 50, 48, 117, 108, - 53, 103, 109, 112, 111, 0, 108, 101, 103, 111, 102, 100, 109, 98, 119, - 50, 48, 53, 103, 104, 112, 111, 0, 108, 101, 103, 111, 102, 100, 109, - 98, 119, 50, 48, 117, 108, 53, 103, 104, 112, 111, 0, 109, 99, 115, - 98, 119, 50, 48, 53, 103, 108, 112, 111, 0, 109, 99, 115, 98, 119, 50, - 48, 117, 108, 53, 103, 108, 112, 111, 0, 109, 99, 115, 98, 119, 52, - 48, 53, 103, 108, 112, 111, 0, 109, 99, 115, 98, 119, 50, 48, 53, 103, - 109, 112, 111, 0, 109, 99, 115, 98, 119, 50, 48, 117, 108, 53, 103, - 109, 112, 111, 0, 109, 99, 115, 98, 119, 52, 48, 53, 103, 109, 112, - 111, 0, 109, 99, 115, 98, 119, 50, 48, 53, 103, 104, 112, 111, 0, 109, - 99, 115, 98, 119, 50, 48, 117, 108, 53, 103, 104, 112, 111, 0, 109, - 99, 115, 98, 119, 52, 48, 53, 103, 104, 112, 111, 0, 109, 99, 115, 51, - 50, 112, 111, 0, 108, 101, 103, 111, 102, 100, 109, 52, 48, 100, 117, - 112, 112, 111, 0, 98, 119, 52, 48, 112, 111, 0, 99, 100, 100, 112, 111, - 0, 115, 116, 98, 99, 112, 111, 0, 98, 119, 100, 117, 112, 112, 111, - 0, 116, 120, 112, 105, 100, 50, 103, 97, 48, 0, 116, 120, 112, 105, - 100, 50, 103, 97, 49, 0, 109, 97, 120, 112, 50, 103, 97, 48, 0, 109, - 97, 120, 112, 50, 103, 97, 49, 0, 112, 97, 50, 103, 119, 48, 97, 48, - 0, 112, 97, 50, 103, 119, 48, 97, 49, 0, 112, 97, 50, 103, 119, 49, - 97, 48, 0, 112, 97, 50, 103, 119, 49, 97, 49, 0, 112, 97, 50, 103, 119, - 50, 97, 48, 0, 112, 97, 50, 103, 119, 50, 97, 49, 0, 105, 116, 116, - 50, 103, 97, 48, 0, 105, 116, 116, 50, 103, 97, 49, 0, 99, 99, 107, - 50, 103, 112, 111, 0, 111, 102, 100, 109, 50, 103, 112, 111, 0, 109, - 99, 115, 50, 103, 112, 111, 48, 0, 109, 99, 115, 50, 103, 112, 111, - 49, 0, 109, 99, 115, 50, 103, 112, 111, 50, 0, 109, 99, 115, 50, 103, - 112, 111, 51, 0, 109, 99, 115, 50, 103, 112, 111, 52, 0, 109, 99, 115, - 50, 103, 112, 111, 53, 0, 109, 99, 115, 50, 103, 112, 111, 54, 0, 109, - 99, 115, 50, 103, 112, 111, 55, 0, 116, 120, 112, 105, 100, 53, 103, - 108, 97, 48, 0, 116, 120, 112, 105, 100, 53, 103, 108, 97, 49, 0, 109, - 97, 120, 112, 53, 103, 108, 97, 48, 0, 109, 97, 120, 112, 53, 103, 108, - 97, 49, 0, 112, 97, 53, 103, 108, 119, 48, 97, 48, 0, 112, 97, 53, 103, - 108, 119, 48, 97, 49, 0, 112, 97, 53, 103, 108, 119, 49, 97, 48, 0, - 112, 97, 53, 103, 108, 119, 49, 97, 49, 0, 112, 97, 53, 103, 108, 119, - 50, 97, 48, 0, 112, 97, 53, 103, 108, 119, 50, 97, 49, 0, 111, 102, - 100, 109, 53, 103, 108, 112, 111, 0, 109, 99, 115, 53, 103, 108, 112, - 111, 48, 0, 109, 99, 115, 53, 103, 108, 112, 111, 49, 0, 109, 99, 115, - 53, 103, 108, 112, 111, 50, 0, 109, 99, 115, 53, 103, 108, 112, 111, - 51, 0, 109, 99, 115, 53, 103, 108, 112, 111, 52, 0, 109, 99, 115, 53, - 103, 108, 112, 111, 53, 0, 109, 99, 115, 53, 103, 108, 112, 111, 54, - 0, 109, 99, 115, 53, 103, 108, 112, 111, 55, 0, 116, 120, 112, 105, - 100, 53, 103, 97, 48, 0, 116, 120, 112, 105, 100, 53, 103, 97, 49, 0, - 109, 97, 120, 112, 53, 103, 97, 48, 0, 109, 97, 120, 112, 53, 103, 97, - 49, 0, 112, 97, 53, 103, 119, 48, 97, 48, 0, 112, 97, 53, 103, 119, - 48, 97, 49, 0, 112, 97, 53, 103, 119, 49, 97, 48, 0, 112, 97, 53, 103, - 119, 49, 97, 49, 0, 112, 97, 53, 103, 119, 50, 97, 48, 0, 112, 97, 53, - 103, 119, 50, 97, 49, 0, 105, 116, 116, 53, 103, 97, 48, 0, 105, 116, - 116, 53, 103, 97, 49, 0, 111, 102, 100, 109, 53, 103, 112, 111, 0, 109, - 99, 115, 53, 103, 112, 111, 48, 0, 109, 99, 115, 53, 103, 112, 111, - 49, 0, 109, 99, 115, 53, 103, 112, 111, 50, 0, 109, 99, 115, 53, 103, - 112, 111, 51, 0, 109, 99, 115, 53, 103, 112, 111, 52, 0, 109, 99, 115, - 53, 103, 112, 111, 53, 0, 109, 99, 115, 53, 103, 112, 111, 54, 0, 109, - 99, 115, 53, 103, 112, 111, 55, 0, 116, 120, 112, 105, 100, 53, 103, - 104, 97, 48, 0, 116, 120, 112, 105, 100, 53, 103, 104, 97, 49, 0, 109, - 97, 120, 112, 53, 103, 104, 97, 48, 0, 109, 97, 120, 112, 53, 103, 104, - 97, 49, 0, 112, 97, 53, 103, 104, 119, 48, 97, 48, 0, 112, 97, 53, 103, - 104, 119, 48, 97, 49, 0, 112, 97, 53, 103, 104, 119, 49, 97, 48, 0, - 112, 97, 53, 103, 104, 119, 49, 97, 49, 0, 112, 97, 53, 103, 104, 119, - 50, 97, 48, 0, 112, 97, 53, 103, 104, 119, 50, 97, 49, 0, 111, 102, - 100, 109, 53, 103, 104, 112, 111, 0, 109, 99, 115, 53, 103, 104, 112, - 111, 48, 0, 109, 99, 115, 53, 103, 104, 112, 111, 49, 0, 109, 99, 115, - 53, 103, 104, 112, 111, 50, 0, 109, 99, 115, 53, 103, 104, 112, 111, - 51, 0, 109, 99, 115, 53, 103, 104, 112, 111, 52, 0, 109, 99, 115, 53, - 103, 104, 112, 111, 53, 0, 109, 99, 115, 53, 103, 104, 112, 111, 54, - 0, 109, 99, 115, 53, 103, 104, 112, 111, 55, 0, 97, 110, 116, 115, 119, - 105, 116, 99, 104, 0, 97, 97, 53, 103, 0, 116, 115, 115, 105, 112, 111, - 115, 50, 103, 0, 101, 120, 116, 112, 97, 103, 97, 105, 110, 50, 103, - 0, 112, 100, 101, 116, 114, 97, 110, 103, 101, 50, 103, 0, 116, 114, - 105, 115, 111, 50, 103, 0, 97, 110, 116, 115, 119, 99, 116, 108, 50, - 103, 0, 116, 115, 115, 105, 112, 111, 115, 53, 103, 0, 101, 120, 116, - 112, 97, 103, 97, 105, 110, 53, 103, 0, 112, 100, 101, 116, 114, 97, - 110, 103, 101, 53, 103, 0, 116, 114, 105, 115, 111, 53, 103, 0, 97, - 110, 116, 115, 119, 99, 116, 108, 53, 103, 0, 101, 108, 110, 97, 50, - 103, 0, 101, 108, 110, 97, 53, 103, 0, 116, 101, 109, 112, 111, 102, - 102, 115, 101, 116, 0, 112, 104, 121, 99, 97, 108, 95, 116, 101, 109, - 112, 100, 101, 108, 116, 97, 0, 112, 97, 50, 103, 119, 48, 97, 51, 0, - 112, 97, 50, 103, 119, 49, 97, 51, 0, 109, 97, 120, 112, 53, 103, 97, - 51, 0, 109, 97, 120, 112, 53, 103, 108, 97, 51, 0, 112, 97, 53, 103, - 119, 48, 97, 51, 0, 112, 97, 53, 103, 108, 119, 48, 97, 51, 0, 112, - 97, 53, 103, 119, 49, 97, 51, 0, 112, 97, 53, 103, 108, 119, 49, 97, - 51, 0, 112, 97, 53, 103, 119, 50, 97, 51, 0, 112, 97, 53, 103, 108, - 119, 50, 97, 51, 0, 0, 59, 73, 23, 32, 60, 73, 197, 39, 77, 132, 255, - 131, 76, 196, 0, 31, 183, 132, 255, 128, 177, 132, 255, 223, 176, 196, - 8, 8, 250, 132, 247, 255, 249, 196, 8, 0, 96, 48, 24, 12, 108, 72, 36, - 18, 0, 0, 152, 230, 1, 0, 53, 1, 8, 48, 8, 0, 3, 0, 162, 230, 1, 0, - 67, 1, 0, 0, 1, 0, 0, 0, 172, 230, 1, 0, 45, 1, 8, 0, 1, 0, 0, 0, 185, - 230, 1, 0, 72, 1, 8, 0, 3, 0, 0, 0, 201, 230, 1, 0, 73, 1, 8, 0, 3, - 0, 0, 0, 214, 230, 1, 0, 74, 1, 8, 0, 3, 0, 0, 0, 228, 230, 1, 0, 78, - 1, 8, 0, 3, 0, 0, 0, 239, 230, 1, 0, 61, 1, 64, 0, 7, 0, 7, 0, 251, - 230, 1, 0, 122, 1, 0, 4, 7, 0, 0, 0, 9, 231, 1, 0, 63, 1, 0, 0, 6, 0, - 0, 0, 20, 231, 1, 0, 64, 1, 0, 0, 2, 0, 0, 0, 31, 231, 1, 0, 124, 1, - 0, 0, 2, 0, 0, 0, 44, 231, 1, 0, 66, 1, 0, 0, 7, 0, 0, 0, 56, 231, 1, - 0, 40, 0, 8, 0, 3, 0, 0, 0, 73, 231, 1, 0, 41, 0, 0, 0, 1, 0, 0, 0, - 86, 231, 1, 0, 127, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 112, 104, 121, 0, 116, 120, 105, 110, 115, 116, 112, 119, 114, - 0, 112, 104, 121, 95, 109, 117, 116, 101, 100, 0, 112, 104, 121, 95, - 119, 97, 116, 99, 104, 100, 111, 103, 0, 112, 104, 121, 95, 103, 108, - 105, 116, 99, 104, 116, 104, 114, 115, 104, 0, 112, 104, 121, 95, 110, - 111, 105, 115, 101, 95, 117, 112, 0, 112, 104, 121, 95, 110, 111, 105, - 115, 101, 95, 100, 119, 110, 0, 112, 104, 121, 95, 112, 101, 114, 99, - 97, 108, 0, 112, 104, 121, 95, 114, 120, 105, 113, 101, 115, 116, 0, - 112, 104, 121, 110, 111, 105, 115, 101, 95, 115, 114, 111, 109, 0, 110, - 117, 109, 95, 115, 116, 114, 101, 97, 109, 0, 98, 97, 110, 100, 95, - 114, 97, 110, 103, 101, 0, 115, 117, 98, 98, 97, 110, 100, 53, 103, - 118, 101, 114, 0, 109, 105, 110, 95, 116, 120, 112, 111, 119, 101, 114, - 0, 112, 104, 121, 95, 111, 99, 108, 115, 99, 100, 101, 110, 97, 98, - 108, 101, 0, 112, 104, 121, 95, 114, 120, 97, 110, 116, 115, 101, 108, - 0, 112, 104, 121, 95, 99, 114, 115, 95, 119, 97, 114, 0, 74, 196, 68, - 0, 74, 68, 128, 0, 59, 4, 1, 0, 1, 0, 60, 4, 1, 0, 1, 0, 60, 4, 1, 0, - 0, 0, 59, 4, 1, 0, 0, 0, 59, 4, 2, 0, 2, 0, 60, 4, 2, 0, 2, 0, 60, 4, - 2, 0, 0, 0, 59, 4, 2, 0, 0, 0, 219, 4, 255, 3, 166, 2, 219, 4, 0, 112, - 0, 32, 154, 5, 255, 3, 38, 0, 155, 5, 255, 3, 137, 0, 156, 5, 255, 3, - 138, 0, 156, 5, 0, 252, 0, 32, 157, 5, 0, 60, 0, 44, 157, 5, 255, 3, - 140, 0, 216, 4, 1, 0, 0, 0, 216, 4, 2, 0, 0, 0, 215, 4, 8, 0, 0, 0, - 0, 64, 1, 64, 2, 64, 3, 64, 4, 64, 5, 64, 6, 64, 7, 64, 7, 91, 7, 128, - 152, 0, 22, 1, 44, 1, 106, 0, 11, 0, 27, 0, 19, 1, 29, 0, 20, 1, 46, - 0, 42, 1, 18, 1, 76, 4, 0, 8, 0, 8, 77, 4, 0, 32, 0, 0, 176, 4, 0, 1, - 0, 1, 182, 68, 255, 255, 183, 4, 15, 0, 15, 0, 74, 196, 68, 0, 74, 68, - 128, 0, 215, 4, 8, 0, 8, 0, 215, 4, 0, 112, 0, 32, 49, 198, 21, 0, 214, - 6, 3, 0, 0, 0, 218, 198, 143, 0, 76, 4, 0, 16, 0, 16, 77, 4, 0, 64, - 0, 64, 76, 4, 0, 8, 0, 8, 77, 4, 0, 32, 0, 0, 59, 4, 2, 0, 2, 0, 60, - 4, 2, 0, 0, 0, 59, 4, 1, 0, 1, 0, 60, 4, 1, 0, 0, 0, 215, 68, 0, 0, - 215, 4, 1, 0, 1, 0, 215, 4, 64, 0, 0, 0, 215, 4, 1, 0, 1, 0, 215, 4, - 64, 0, 64, 0, 16, 4, 8, 0, 8, 0, 218, 6, 32, 0, 0, 0, 66, 73, 2, 0, - 59, 73, 0, 0, 60, 73, 0, 0, 74, 196, 68, 0, 74, 68, 128, 0, 56, 9, 64, - 0, 64, 0, 56, 9, 4, 0, 4, 0, 57, 9, 64, 0, 0, 0, 57, 9, 4, 0, 4, 0, - 215, 4, 2, 0, 2, 0, 215, 4, 128, 0, 0, 0, 215, 4, 1, 0, 1, 0, 215, 4, - 64, 0, 64, 0, 215, 4, 8, 0, 8, 0, 215, 4, 0, 112, 0, 32, 218, 6, 64, - 0, 64, 0, 164, 4, 0, 32, 0, 0, 76, 132, 255, 231, 59, 132, 12, 0, 76, - 4, 0, 8, 0, 8, 77, 4, 0, 32, 0, 32, 176, 4, 0, 1, 0, 1, 37, 100, 32, - 9, 32, 37, 100, 32, 10, 0, 69, 114, 114, 111, 114, 32, 103, 101, 116, - 116, 105, 110, 103, 32, 108, 111, 119, 32, 105, 113, 32, 101, 115, 116, - 10, 0, 69, 114, 114, 111, 114, 32, 103, 101, 116, 116, 105, 110, 103, - 32, 104, 105, 103, 104, 32, 105, 113, 32, 101, 115, 116, 10, 0, 0, 163, - 198, 1, 0, 163, 134, 254, 255, 74, 196, 128, 0, 74, 132, 127, 0, 59, - 132, 237, 255, 60, 4, 2, 0, 2, 0, 76, 132, 208, 239, 77, 132, 215, 191, - 77, 4, 4, 0, 4, 0, 77, 4, 3, 0, 1, 0, 249, 132, 248, 255, 250, 132, - 248, 255, 10, 70, 160, 0, 106, 68, 25, 0, 77, 4, 4, 0, 0, 0, 76, 4, - 4, 0, 4, 0, 215, 4, 1, 0, 1, 0, 215, 4, 64, 0, 64, 0, 215, 4, 1, 0, - 1, 0, 215, 4, 64, 0, 0, 0, 55, 6, 0, 192, 0, 128, 215, 4, 1, 0, 0, 0, - 217, 4, 1, 0, 1, 0, 217, 4, 2, 0, 0, 0, 118, 6, 128, 0, 128, 0, 218, - 6, 1, 0, 1, 0, 108, 8, 4, 0, 4, 0, 108, 8, 64, 0, 64, 0, 108, 8, 0, - 4, 0, 4, 214, 6, 3, 0, 0, 0, 218, 6, 8, 0, 8, 0, 59, 4, 2, 0, 2, 0, - 60, 4, 2, 0, 0, 0, 59, 4, 16, 0, 16, 0, 60, 4, 64, 0, 0, 0, 75, 68, - 255, 255, 52, 6, 0, 255, 0, 0, 218, 198, 128, 0, 10, 192, 40, 2, 10, - 128, 215, 253, 218, 134, 127, 255, 164, 4, 0, 64, 0, 64, 164, 4, 0, - 64, 0, 0, 218, 198, 64, 0, 59, 4, 4, 0, 0, 0, 56, 9, 64, 0, 0, 0, 56, - 9, 4, 0, 0, 0, 215, 4, 2, 0, 0, 0, 215, 4, 1, 0, 0, 0, 215, 4, 8, 0, - 0, 0, 216, 4, 1, 0, 0, 0, 216, 4, 2, 0, 0, 0, 118, 6, 128, 0, 0, 0, - 218, 6, 1, 0, 0, 0, 108, 8, 4, 0, 0, 0, 108, 8, 64, 0, 0, 0, 108, 8, - 0, 4, 0, 0, 164, 4, 0, 128, 0, 128, 164, 4, 0, 64, 0, 64, 164, 4, 0, - 32, 0, 32, 176, 4, 128, 0, 0, 0, 59, 4, 64, 0, 0, 0, 169, 4, 0, 128, - 0, 128, 24, 8, 135, 70, 96, 0, 66, 70, 7, 0, 139, 70, 0, 0, 118, 70, - 161, 184, 118, 6, 128, 0, 0, 0, 218, 6, 1, 0, 0, 0, 108, 8, 4, 0, 0, - 0, 108, 8, 64, 0, 0, 0, 108, 8, 0, 4, 0, 0, 218, 6, 0, 128, 0, 128, - 211, 6, 0, 128, 0, 128, 211, 6, 0, 128, 0, 0, 218, 6, 0, 128, 0, 0, - 66, 73, 7, 0, 59, 73, 23, 32, 60, 73, 197, 39, 209, 6, 4, 0, 0, 0, 75, - 6, 64, 0, 64, 0, 59, 73, 23, 32, 60, 73, 197, 39, 75, 6, 1, 0, 1, 0, - 75, 6, 8, 0, 8, 0, 66, 73, 0, 0, 66, 73, 15, 0, 66, 73, 0, 0, 59, 73, - 23, 0, 60, 73, 197, 7, 59, 4, 2, 0, 2, 0, 60, 4, 2, 0, 0, 0, 59, 4, - 16, 0, 16, 0, 60, 4, 64, 0, 0, 0, 76, 4, 0, 16, 0, 16, 77, 4, 0, 64, - 0, 64, 76, 4, 8, 0, 8, 0, 77, 4, 8, 0, 8, 0, 76, 4, 32, 0, 32, 0, 77, - 4, 32, 0, 0, 0, 249, 4, 2, 0, 2, 0, 250, 4, 2, 0, 2, 0, 249, 4, 4, 0, - 4, 0, 250, 4, 4, 0, 4, 0, 249, 4, 1, 0, 1, 0, 250, 4, 1, 0, 1, 0, 76, - 4, 8, 0, 8, 0, 77, 4, 8, 0, 0, 0, 76, 4, 32, 0, 32, 0, 77, 4, 32, 0, - 32, 0, 249, 4, 2, 0, 2, 0, 250, 4, 2, 0, 0, 0, 249, 4, 4, 0, 4, 0, 250, - 4, 4, 0, 0, 0, 249, 4, 1, 0, 1, 0, 250, 4, 1, 0, 0, 0, 74, 196, 68, - 0, 74, 68, 128, 0, 54, 0, 26, 1, 58, 0, 37, 0, 40, 0, 5, 0, 18, 1, 255, - 0, 31, 1, 11, 0, 19, 1, 7, 0, 252, 0, 253, 0, 255, 0, 192, 0, 202, 0, - 197, 0, 18, 0, 87, 0, 89, 0, 92, 0, 120, 0, 146, 0, 218, 6, 32, 0, 32, - 0, 16, 4, 8, 0, 0, 0, 3, 5, 164, 4, 208, 4, 217, 4, 218, 4, 166, 4, - 56, 9, 57, 9, 216, 4, 208, 4, 215, 4, 165, 4, 13, 4, 162, 4, 208, 4, - 1, 0, 0, 0, 211, 4, 255, 0, 0, 0, 211, 4, 0, 255, 0, 0, 208, 4, 16, - 0, 0, 0, 208, 4, 4, 0, 0, 0, 208, 4, 2, 0, 0, 0, 210, 4, 255, 0, 0, - 0, 210, 4, 0, 255, 0, 0, 208, 4, 8, 0, 0, 0, 16, 4, 128, 0, 0, 0, 168, - 68, 10, 0, 235, 4, 192, 1, 0, 0, 106, 4, 255, 255, 25, 0, 16, 4, 2, - 0, 0, 0, 16, 4, 1, 0, 0, 0, 66, 73, 15, 0, 66, 73, 0, 0, 66, 73, 15, - 0, 74, 68, 132, 0, 74, 68, 128, 0, 211, 70, 34, 34, 211, 70, 32, 34, - 59, 4, 1, 0, 1, 0, 60, 4, 1, 0, 0, 0, 56, 9, 0, 8, 0, 8, 57, 9, 0, 8, - 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 7, - 0, 4, 0, 4, 128, 7, 0, 2, 0, 2, 215, 4, 8, 0, 0, 0, 216, 4, 1, 0, 0, - 0, 216, 4, 2, 0, 0, 0, 59, 4, 4, 0, 4, 0, 60, 4, 4, 0, 0, 0, 3, 5, 1, - 0, 0, 0, 3, 5, 4, 0, 0, 0, 3, 5, 16, 0, 16, 0, 164, 4, 0, 64, 0, 0, - 164, 4, 0, 128, 0, 128, 208, 4, 32, 0, 0, 0, 164, 4, 255, 1, 0, 0, 165, - 4, 255, 0, 255, 0, 165, 4, 0, 112, 0, 80, 165, 4, 0, 7, 0, 0, 13, 4, - 255, 0, 64, 0, 13, 4, 0, 7, 0, 4, 162, 4, 255, 0, 64, 0, 162, 4, 0, - 7, 0, 4, 168, 4, 255, 0, 1, 0, 166, 4, 0, 128, 0, 128, 166, 4, 255, - 1, 255, 0, 154, 4, 255, 1, 255, 0, 215, 4, 8, 0, 0, 0, 215, 4, 0, 112, - 0, 32, 3, 5, 1, 0, 0, 0, 3, 5, 4, 0, 0, 0, 164, 4, 0, 64, 0, 0, 164, - 4, 0, 128, 0, 0, 208, 4, 32, 0, 0, 0, 165, 4, 255, 0, 255, 0, 165, 4, - 0, 112, 0, 80, 165, 4, 0, 7, 0, 0, 13, 4, 255, 0, 64, 0, 13, 4, 0, 7, - 0, 6, 162, 4, 255, 0, 64, 0, 162, 4, 0, 7, 0, 6, 217, 4, 112, 0, 32, - 0, 217, 4, 0, 7, 0, 3, 217, 4, 0, 112, 0, 16, 218, 4, 0, 16, 0, 0, 218, - 4, 0, 32, 0, 32, 166, 4, 0, 128, 0, 128, 56, 9, 4, 0, 4, 0, 57, 9, 4, - 0, 4, 0, 164, 4, 0, 16, 0, 16, 215, 4, 8, 0, 8, 0, 215, 4, 0, 112, 0, - 16, 215, 4, 8, 0, 8, 0, 215, 4, 0, 112, 0, 48, 16, 4, 2, 0, 2, 0, 16, - 4, 1, 0, 0, 0, 217, 4, 4, 0, 0, 0, 217, 4, 8, 0, 8, 0, 217, 4, 4, 0, - 4, 0, 217, 4, 8, 0, 0, 0, 154, 5, 255, 3, 38, 0, 155, 5, 255, 3, 165, - 0, 156, 5, 255, 3, 166, 0, 156, 5, 0, 252, 0, 40, 157, 5, 0, 60, 0, - 28, 157, 5, 255, 3, 168, 0, 83, 68, 169, 10, 61, 73, 192, 0, 7, 0, 255, - 0, 31, 1, 58, 0, 26, 1, 5, 0, 130, 0, 134, 0, 46, 1, 19, 1, 125, 0, - 40, 0, 129, 4, 0, 2, 0, 2, 58, 9, 128, 0, 128, 0, 35, 4, 255, 0, 73, - 0, 52, 4, 255, 0, 252, 255, 22, 4, 255, 0, 164, 255, 22, 4, 0, 255, - 0, 159, 36, 4, 0, 255, 0, 42, 35, 4, 0, 255, 0, 45, 37, 4, 255, 0, 15, - 0, 0, 5, 255, 0, 15, 0, 0, 5, 0, 255, 0, 15, 32, 4, 255, 0, 10, 0, 52, - 4, 0, 7, 0, 1, 255, 4, 0, 252, 0, 24, 214, 6, 3, 0, 1, 0, 218, 6, 8, - 0, 0, 0, 218, 6, 128, 0, 0, 0, 16, 4, 2, 0, 0, 0, 16, 4, 1, 0, 1, 0, - 74, 196, 68, 0, 74, 68, 128, 0, 74, 196, 68, 0, 74, 68, 128, 0, 83, - 132, 255, 127, 83, 196, 0, 128, 59, 4, 1, 0, 1, 0, 60, 4, 1, 0, 1, 0, - 60, 4, 1, 0, 0, 0, 59, 4, 1, 0, 0, 0, 177, 4, 0, 4, 0, 0, 177, 4, 0, - 128, 0, 0, 249, 4, 1, 0, 1, 0, 250, 4, 1, 0, 0, 0, 206, 70, 0, 0, 203, - 70, 0, 0, 204, 70, 0, 0, 205, 70, 0, 0, 157, 70, 255, 7, 164, 70, 0, - 0, 165, 70, 0, 0, 122, 70, 3, 0, 115, 70, 112, 23, 116, 70, 68, 4, 117, - 70, 63, 0, 112, 70, 129, 6, 140, 70, 73, 0, 201, 70, 0, 6, 128, 70, - 255, 0, 129, 70, 63, 1, 218, 198, 64, 0, 219, 198, 3, 0, 215, 198, 1, - 0, 49, 198, 0, 24, 59, 68, 0, 0, 60, 68, 0, 0, 76, 68, 0, 0, 230, 68, - 0, 0, 249, 68, 0, 0, 176, 68, 0, 0, 56, 73, 0, 0, 176, 68, 0, 0, 78, - 68, 0, 0, 103, 197, 3, 0, 74, 196, 68, 0, 74, 68, 128, 0, 72, 4, 0, - 3, 0, 1, 8, 6, 255, 0, 23, 0, 4, 6, 255, 7, 234, 3, 76, 4, 0, 24, 0, - 24, 77, 4, 0, 96, 0, 96, 56, 9, 255, 1, 255, 1, 57, 9, 255, 1, 158, - 0, 59, 4, 3, 0, 3, 0, 60, 4, 3, 0, 0, 0, 218, 70, 255, 255, 219, 198, - 3, 0, 209, 6, 4, 0, 4, 0, 183, 4, 0, 127, 0, 108, 177, 4, 0, 32, 0, - 0, 57, 9, 0, 2, 0, 0, 56, 9, 0, 2, 0, 2, 176, 4, 8, 0, 8, 0, 176, 4, - 0, 8, 0, 8, 57, 9, 0, 8, 0, 0, 56, 9, 0, 8, 0, 8, 59, 4, 4, 0, 4, 0, - 60, 4, 4, 0, 0, 0, 56, 9, 4, 0, 4, 0, 57, 9, 4, 0, 4, 0, 164, 4, 0, - 16, 0, 16, 215, 4, 4, 0, 4, 0, 215, 4, 0, 15, 0, 0, 218, 70, 255, 255, - 3, 5, 8, 0, 8, 0, 95, 54, 41, 31, 95, 54, 41, 31, 95, 54, 41, 31, 95, - 54, 41, 31, 10, 0, 9, 0, 6, 0, 5, 0, 10, 0, 9, 0, 6, 0, 5, 0, 10, 0, - 9, 0, 6, 0, 5, 0, 10, 0, 9, 0, 6, 0, 5, 0, 10, 0, 9, 0, 6, 0, 5, 0, - 10, 0, 9, 0, 6, 0, 5, 0, 10, 0, 9, 0, 6, 0, 5, 0, 10, 0, 9, 0, 6, 0, - 5, 0, 10, 0, 9, 0, 6, 0, 5, 0, 10, 0, 9, 0, 6, 0, 5, 0, 10, 0, 9, 0, - 6, 0, 5, 0, 10, 0, 9, 0, 6, 0, 5, 0, 10, 0, 9, 0, 6, 0, 5, 0, 10, 0, - 9, 0, 6, 0, 5, 0, 10, 0, 9, 0, 6, 0, 5, 0, 10, 0, 9, 0, 6, 0, 5, 0, - 14, 0, 0, 0, 0, 2, 0, 3, 0, 4, 0, 6, 0, 8, 0, 11, 0, 16, 1, 16, 2, 16, - 3, 16, 4, 16, 5, 16, 6, 16, 7, 16, 7, 23, 7, 32, 7, 45, 7, 64, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 3, 0, 4, 0, 6, 0, 8, 0, 11, 0, 16, 1, 16, 2, 16, 3, - 16, 4, 16, 5, 16, 6, 16, 7, 16, 7, 23, 7, 32, 7, 45, 7, 64, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, - 65, 1, 0, 248, 33, 0, 0, 251, 33, 0, 0, 251, 65, 0, 0, 219, 254, 1, - 0, 123, 33, 0, 0, 51, 33, 0, 0, 235, 64, 0, 0, 163, 254, 1, 0, 75, 2, - 0, 0, 132, 254, 1, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, - 0, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, - 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, - 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, - 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, - 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, - 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, - 1, 77, 1, 77, 1, 77, 1, 77, 1, 9, 15, 20, 24, 254, 7, 11, 15, 251, 254, - 1, 5, 8, 11, 14, 17, 20, 23, 0, 0, 0, 0, 0, 0, 0, 3, 6, 9, 12, 15, 18, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 0, 0, - 0, 0, 0, 0, 3, 235, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 3, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, - 0, 1, 0, 0, 0, 5, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 77, 0, 0, 0, 141, - 0, 0, 0, 13, 0, 0, 0, 77, 0, 0, 0, 141, 0, 0, 0, 205, 0, 0, 0, 79, 0, - 0, 0, 143, 0, 0, 0, 207, 0, 0, 0, 211, 0, 0, 0, 19, 1, 0, 0, 19, 5, - 0, 0, 19, 9, 0, 0, 83, 9, 0, 0, 83, 13, 0, 0, 83, 17, 0, 0, 147, 17, - 0, 0, 147, 81, 0, 0, 147, 145, 0, 0, 147, 209, 0, 0, 147, 17, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 5, 0, - 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 77, 0, 0, 0, 141, 0, 0, 0, 13, 0, 0, - 0, 77, 0, 0, 0, 141, 0, 0, 0, 205, 0, 0, 0, 79, 0, 0, 0, 143, 0, 0, - 0, 207, 0, 0, 0, 211, 0, 0, 0, 19, 1, 0, 0, 19, 5, 0, 0, 19, 9, 0, 0, - 83, 9, 0, 0, 83, 13, 0, 0, 83, 17, 0, 0, 83, 81, 0, 0, 83, 145, 0, 0, - 83, 209, 0, 0, 83, 17, 1, 0, 83, 81, 1, 0, 83, 145, 1, 0, 83, 209, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 2, - 4, 3, 4, 4, 4, 5, 4, 6, 4, 7, 4, 8, 4, 9, 4, 10, 4, 139, 5, 140, 5, - 141, 5, 142, 5, 143, 5, 144, 0, 145, 0, 146, 0, 147, 1, 148, 1, 149, - 1, 150, 1, 151, 1, 152, 1, 153, 1, 154, 1, 155, 1, 156, 1, 157, 1, 158, - 1, 159, 1, 160, 1, 161, 1, 162, 1, 163, 1, 164, 1, 165, 1, 0, 0, 248, - 241, 1, 0, 64, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 204, 248, - 1, 0, 64, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 188, 241, 1, - 0, 10, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 204, 251, 1, 0, - 20, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 32, 252, 1, 0, 148, - 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 180, 244, 1, 0, 38, 0, - 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 96, 240, 1, 0, 64, 0, 0, - 0, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 80, 240, 1, 0, 16, 0, 0, 0, - 16, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 120, 242, 1, 0, 60, 0, 0, 0, 17, - 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 52, 243, 1, 0, 96, 0, 0, 0, 18, 0, - 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 180, 242, 1, 0, 128, 0, 0, 0, 20, 0, - 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 152, 247, 1, 0, 154, 0, 0, 0, 23, 0, 0, - 0, 0, 0, 0, 0, 16, 0, 0, 0, 228, 240, 1, 0, 108, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 0, 0, 76, 249, 1, 0, 160, 0, 0, 0, 24, 0, 0, 0, 0, - 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 9, 0, 0, 0, 13, 0, - 0, 0, 77, 0, 0, 0, 141, 0, 0, 0, 13, 0, 0, 0, 77, 0, 0, 0, 141, 0, 0, - 0, 205, 0, 0, 0, 82, 0, 0, 0, 146, 0, 0, 0, 210, 0, 0, 0, 214, 0, 0, - 0, 22, 1, 0, 0, 22, 5, 0, 0, 22, 9, 0, 0, 86, 9, 0, 0, 86, 13, 0, 0, - 86, 17, 0, 0, 150, 17, 0, 0, 150, 81, 0, 0, 150, 145, 0, 0, 150, 209, - 0, 0, 150, 17, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, - 0, 1, 0, 0, 0, 5, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 77, 0, 0, 0, 141, - 0, 0, 0, 13, 0, 0, 0, 77, 0, 0, 0, 141, 0, 0, 0, 205, 0, 0, 0, 82, 0, - 0, 0, 146, 0, 0, 0, 210, 0, 0, 0, 214, 0, 0, 0, 22, 1, 0, 0, 22, 5, - 0, 0, 22, 9, 0, 0, 86, 9, 0, 0, 86, 13, 0, 0, 86, 17, 0, 0, 86, 81, - 0, 0, 86, 145, 0, 0, 86, 209, 0, 0, 86, 17, 1, 0, 86, 81, 1, 0, 86, - 145, 1, 0, 86, 209, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 26, 0, 52, 0, 78, 0, 104, 0, 156, 0, 208, 0, 234, 0, - 4, 1, 52, 0, 104, 0, 156, 0, 208, 0, 56, 1, 160, 1, 212, 1, 8, 2, 78, - 0, 156, 0, 234, 0, 56, 1, 212, 1, 112, 2, 190, 2, 12, 3, 104, 0, 208, - 0, 56, 1, 160, 1, 112, 2, 64, 3, 168, 3, 16, 4, 24, 0, 156, 0, 208, - 0, 4, 1, 234, 0, 56, 1, 134, 1, 208, 0, 4, 1, 4, 1, 56, 1, 108, 1, 108, - 1, 160, 1, 56, 1, 134, 1, 134, 1, 212, 1, 34, 2, 34, 2, 112, 2, 4, 1, - 56, 1, 108, 1, 56, 1, 108, 1, 160, 1, 212, 1, 160, 1, 212, 1, 8, 2, - 8, 2, 60, 2, 134, 1, 212, 1, 34, 2, 212, 1, 34, 2, 112, 2, 190, 2, 112, - 2, 190, 2, 12, 3, 12, 3, 90, 3, 54, 0, 108, 0, 162, 0, 216, 0, 68, 1, - 176, 1, 230, 1, 28, 2, 108, 0, 216, 0, 68, 1, 176, 1, 136, 2, 96, 3, - 204, 3, 56, 4, 162, 0, 68, 1, 230, 1, 136, 2, 204, 3, 16, 5, 178, 5, - 84, 6, 216, 0, 176, 1, 136, 2, 96, 3, 16, 5, 192, 6, 152, 7, 112, 8, - 24, 0, 68, 1, 176, 1, 28, 2, 230, 1, 136, 2, 42, 3, 176, 1, 28, 2, 28, - 2, 136, 2, 244, 2, 244, 2, 96, 3, 136, 2, 42, 3, 42, 3, 204, 3, 110, - 4, 110, 4, 16, 5, 28, 2, 136, 2, 244, 2, 136, 2, 244, 2, 96, 3, 204, - 3, 96, 3, 204, 3, 56, 4, 56, 4, 164, 4, 42, 3, 204, 3, 110, 4, 204, - 3, 110, 4, 16, 5, 178, 5, 16, 5, 178, 5, 84, 6, 84, 6, 246, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, - 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, - 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, - 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, - 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, - 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, - 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, - 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, - 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, - 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, - 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, - 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, - 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, - 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, - 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, - 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, - 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, - 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, - 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, - 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, - 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, - 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, - 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, - 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, - 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, - 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, - 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, - 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, - 0, 8, 0, 0, 0, 8, 0, 1, 0, 16, 0, 16, 0, 32, 0, 1, 0, 48, 0, 16, 0, - 64, 0, 34, 0, 80, 0, 34, 1, 96, 0, 34, 2, 112, 0, 34, 3, 128, 0, 34, - 4, 144, 0, 34, 5, 160, 0, 34, 6, 176, 0, 34, 7, 192, 0, 34, 8, 208, - 0, 34, 9, 240, 0, 34, 10, 16, 0, 34, 11, 32, 0, 34, 12, 48, 0, 34, 13, - 64, 0, 34, 14, 80, 0, 34, 15, 96, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 48, 0, - 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, - 96, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, - 0, 0, 0, 144, 8, 0, 0, 0, 0, 0, 0, 160, 8, 0, 0, 0, 0, 0, 0, 176, 8, - 0, 0, 0, 0, 0, 0, 192, 8, 0, 0, 0, 0, 0, 0, 208, 8, 0, 0, 0, 0, 0, 0, - 224, 8, 0, 0, 0, 0, 0, 0, 240, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, - 0, 0, 16, 9, 0, 0, 0, 0, 0, 0, 32, 25, 0, 0, 0, 0, 0, 0, 48, 25, 0, - 0, 0, 0, 0, 0, 64, 25, 0, 0, 0, 0, 0, 0, 80, 25, 0, 0, 0, 0, 0, 0, 96, - 25, 0, 0, 0, 0, 0, 0, 112, 25, 0, 0, 0, 0, 0, 0, 128, 25, 0, 0, 0, 0, - 0, 0, 144, 25, 0, 0, 0, 0, 0, 0, 160, 25, 0, 0, 0, 0, 0, 0, 176, 25, - 0, 0, 0, 0, 0, 0, 192, 25, 0, 0, 0, 0, 0, 0, 208, 25, 0, 0, 0, 0, 0, - 0, 224, 25, 0, 0, 0, 0, 0, 0, 240, 25, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, - 0, 0, 0, 0, 16, 26, 0, 0, 0, 0, 0, 0, 32, 26, 0, 0, 0, 0, 0, 0, 48, - 26, 0, 0, 0, 0, 0, 0, 64, 26, 0, 0, 0, 0, 0, 0, 80, 2, 0, 0, 0, 0, 0, - 0, 96, 2, 0, 0, 0, 0, 0, 0, 112, 2, 0, 0, 0, 0, 0, 0, 128, 2, 0, 0, - 0, 0, 0, 0, 144, 2, 0, 0, 0, 0, 0, 0, 160, 2, 0, 0, 0, 0, 0, 0, 176, - 2, 0, 0, 0, 0, 0, 0, 192, 10, 0, 0, 0, 0, 0, 0, 208, 10, 0, 0, 0, 0, - 0, 0, 224, 10, 0, 0, 0, 0, 0, 0, 240, 10, 0, 0, 0, 0, 0, 0, 0, 11, 0, - 0, 0, 0, 0, 0, 16, 11, 0, 0, 0, 0, 0, 0, 32, 11, 0, 0, 0, 0, 0, 0, 48, - 11, 0, 0, 0, 0, 0, 0, 64, 11, 0, 0, 0, 0, 0, 0, 80, 27, 0, 0, 0, 0, - 0, 0, 96, 27, 0, 0, 0, 0, 0, 0, 112, 27, 0, 0, 0, 0, 0, 0, 128, 27, - 0, 0, 0, 0, 0, 0, 144, 27, 0, 0, 0, 0, 0, 0, 160, 27, 0, 0, 0, 0, 0, - 0, 176, 27, 0, 0, 0, 0, 0, 0, 192, 27, 0, 0, 0, 0, 0, 0, 208, 27, 0, - 0, 0, 0, 0, 0, 224, 27, 0, 0, 0, 0, 0, 0, 240, 27, 0, 0, 0, 0, 0, 0, - 0, 28, 0, 0, 0, 0, 0, 0, 16, 28, 0, 0, 0, 0, 0, 0, 32, 28, 0, 0, 0, - 0, 0, 0, 48, 28, 0, 0, 0, 0, 0, 0, 64, 28, 0, 0, 0, 0, 0, 0, 80, 28, - 0, 0, 0, 0, 0, 0, 96, 28, 0, 0, 0, 0, 0, 0, 112, 28, 0, 0, 0, 0, 0, - 0, 128, 28, 0, 0, 0, 0, 0, 0, 144, 28, 0, 0, 0, 24, 246, 1, 0, 96, 0, - 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 95, 54, 41, 31, 95, 54, - 41, 31, 95, 54, 41, 31, 95, 54, 41, 31, 110, 111, 99, 114, 99, 0, 83, - 68, 73, 79, 0, 67, 68, 67, 0, 0, 13, 22, 128, 0, 141, 19, 128, 0, 37, - 17, 128, 0, 41, 20, 128, 0, 29, 19, 128, 0, 161, 22, 128, 0, 173, 5, - 1, 0, 1, 19, 128, 0, 45, 19, 128, 0, 0, 0, 0, 0, 29, 22, 128, 0, 197, - 39, 0, 0, 119, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 37, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 0, 0, 0, 255, 255, 255, 255, 20, 0, 0, 0, 5, 0, 0, 0, 255, - 255, 255, 255, 1, 0, 5, 6, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 14, 14, - 14, 14, 14, 2, 9, 13, 10, 8, 13, 1, 9, 13, 10, 8, 13, 1, 9, 13, 10, - 8, 13, 1, 9, 13, 10, 8, 13, 1, 9, 14, 10, 9, 14, 6, 10, 14, 11, 9, 14, - 2, 9, 58, 22, 14, 14, 5, 9, 58, 22, 14, 14, 5, 10, 14, 11, 9, 14, 5, - 10, 14, 11, 9, 14, 2, 10, 14, 11, 9, 14, 2, 20, 192, 192, 21, 17, 5, - 20, 192, 192, 21, 17, 5, 20, 192, 192, 21, 17, 5, 20, 192, 192, 21, - 17, 5, 20, 192, 192, 21, 17, 5, 9, 58, 22, 14, 14, 5, 20, 192, 192, - 21, 17, 5, 20, 192, 192, 21, 17, 5, 9, 58, 22, 14, 14, 5, 9, 58, 22, - 14, 14, 5, 9, 58, 22, 14, 14, 5, 20, 192, 192, 21, 17, 5, 9, 58, 22, - 14, 14, 5, 9, 58, 22, 14, 14, 5, 9, 58, 22, 14, 14, 5, 9, 178, 28, 14, - 14, 5, 18, 177, 25, 17, 17, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 115, 100, 112, 99, 109, 100, 101, 118, 0, 0, 0, 0, 0, 0, 0, 0, 48, - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 201, 147, 128, 0, 149, 169, 128, 0, 189, 169, 128, 0, 213, - 147, 128, 0, 181, 147, 128, 0, 117, 147, 128, 0, 209, 145, 128, 0, 0, - 0, 0, 0, 177, 169, 128, 0, 197, 70, 2, 0, 161, 70, 2, 0, 141, 70, 2, - 0, 85, 170, 128, 0, 0, 0, 0, 0, 33, 170, 128, 0, 133, 170, 128, 0, 49, - 170, 128, 0, 109, 170, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 195, 1, 0, 95, 95, 0, 1, - 67, 0, 64, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 36, 200, 1, 0, 1, 0, 0, 0, 65, 0, 0, 0, 1, 0, 249, 24, 1, 13, 228, - 0, 244, 222, 241, 6, 252, 15, 39, 250, 255, 29, 240, 16, 24, 9, 10, - 242, 16, 224, 23, 20, 4, 17, 20, 241, 250, 242, 219, 247, 252, 226, - 251, 225, 238, 19, 13, 255, 28, 233, 26, 23, 24, 3, 0, 218, 232, 3, - 230, 23, 228, 233, 243, 255, 18, 19, 5, 225, 4, 226, 37, 247, 6, 242, - 236, 241, 252, 17, 233, 20, 240, 224, 246, 242, 232, 9, 16, 16, 1, 29, - 217, 250, 4, 15, 15, 6, 12, 222, 28, 0, 255, 13, 7, 24, 26, 246, 14, - 228, 22, 15, 249, 5, 236, 24, 27, 10, 30, 255, 0, 38, 226, 255, 229, - 10, 20, 24, 7, 5, 234, 15, 242, 228, 230, 246, 8, 8, 8, 8, 8, 8, 8, - 9, 10, 8, 8, 7, 7, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 197, 1, 29, 255, 224, 255, 192, - 255, 224, 255, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 107, 3, 130, 254, 231, - 255, 204, 255, 231, 255, 8, 0, 2, 0, 0, 0, 215, 1, 11, 255, 238, 255, - 220, 255, 238, 255, 167, 3, 60, 254, 236, 255, 23, 0, 236, 255, 114, - 3, 133, 254, 174, 254, 248, 1, 174, 254, 7, 0, 4, 0, 0, 0, 152, 1, 96, - 255, 203, 255, 150, 255, 203, 255, 156, 3, 69, 254, 37, 0, 193, 255, - 37, 0, 177, 3, 22, 254, 228, 254, 165, 1, 228, 254, 7, 0, 20, 0, 1, - 0, 191, 1, 49, 255, 242, 0, 73, 254, 242, 0, 135, 3, 97, 254, 51, 255, - 98, 1, 51, 255, 128, 3, 120, 254, 218, 254, 233, 0, 218, 254, 8, 0, - 21, 0, 1, 0, 191, 1, 49, 255, 24, 1, 14, 254, 24, 1, 135, 3, 97, 254, - 22, 255, 124, 1, 22, 255, 128, 3, 120, 254, 143, 255, 147, 0, 143, 255, - 9, 0, 22, 0, 1, 0, 191, 1, 49, 255, 98, 0, 85, 255, 98, 0, 135, 3, 97, - 254, 31, 255, 107, 1, 31, 255, 121, 3, 126, 254, 244, 254, 93, 0, 244, - 254, 8, 0, 23, 0, 1, 0, 188, 1, 49, 255, 116, 0, 66, 255, 116, 0, 135, - 3, 97, 254, 82, 255, 2, 1, 82, 255, 128, 3, 120, 254, 127, 255, 241, - 255, 127, 255, 8, 0, 24, 0, 1, 0, 180, 1, 49, 255, 223, 255, 29, 0, - 223, 255, 136, 3, 97, 254, 135, 255, 144, 255, 135, 255, 127, 3, 120, - 254, 205, 254, 244, 1, 205, 254, 8, 0, 25, 0, 1, 0, 173, 1, 49, 255, - 184, 255, 62, 0, 184, 255, 130, 3, 97, 254, 170, 255, 177, 255, 170, - 255, 127, 3, 120, 254, 199, 254, 254, 1, 199, 254, 8, 0, 26, 0, 1, 0, - 147, 1, 84, 255, 217, 255, 12, 0, 217, 255, 27, 3, 199, 254, 76, 255, - 56, 0, 76, 255, 51, 3, 184, 254, 128, 255, 40, 0, 128, 255, 8, 0, 27, - 0, 1, 0, 137, 1, 84, 255, 207, 255, 19, 0, 207, 255, 23, 3, 199, 254, - 0, 255, 80, 0, 0, 255, 46, 3, 189, 254, 139, 255, 37, 0, 139, 255, 8, - 0, 30, 0, 1, 0, 187, 1, 25, 255, 195, 255, 29, 0, 195, 255, 107, 3, - 97, 254, 102, 255, 72, 0, 102, 255, 124, 3, 120, 254, 86, 255, 79, 0, - 86, 255, 8, 0, 44, 0, 1, 0, 191, 1, 49, 255, 224, 0, 113, 254, 224, - 0, 135, 3, 97, 254, 139, 255, 196, 0, 139, 255, 128, 3, 120, 254, 178, - 254, 192, 0, 178, 254, 8, 0, 1, 0, 0, 0, 108, 9, 0, 0, 11, 10, 0, 7, - 10, 136, 136, 128, 2, 0, 0, 0, 113, 9, 0, 0, 11, 10, 0, 7, 10, 136, - 136, 128, 3, 0, 0, 0, 118, 9, 0, 0, 11, 10, 0, 7, 10, 136, 136, 128, - 4, 0, 0, 0, 123, 9, 0, 0, 11, 10, 0, 7, 10, 136, 136, 128, 5, 0, 0, - 0, 128, 9, 0, 0, 11, 10, 0, 7, 10, 136, 136, 128, 6, 0, 0, 0, 133, 9, - 0, 0, 11, 10, 0, 7, 10, 136, 136, 128, 7, 0, 0, 0, 138, 9, 0, 0, 11, - 10, 0, 7, 10, 136, 136, 128, 8, 0, 0, 0, 143, 9, 0, 0, 11, 10, 0, 7, - 10, 136, 136, 128, 9, 0, 0, 0, 148, 9, 0, 0, 11, 10, 0, 7, 10, 136, - 136, 128, 10, 0, 0, 0, 153, 9, 0, 0, 11, 10, 0, 7, 10, 136, 136, 128, - 11, 0, 0, 0, 158, 9, 0, 0, 11, 10, 0, 7, 10, 136, 136, 128, 12, 0, 0, - 0, 163, 9, 0, 0, 11, 10, 0, 7, 10, 136, 136, 128, 13, 0, 0, 0, 168, - 9, 0, 0, 11, 10, 0, 7, 10, 136, 136, 128, 14, 0, 0, 0, 180, 9, 0, 0, - 11, 10, 0, 7, 10, 136, 136, 128, 0, 0, 1, 0, 159, 1, 82, 7, 64, 0, 128, - 0, 64, 0, 24, 3, 120, 6, 64, 0, 128, 0, 64, 0, 10, 3, 46, 6, 64, 0, - 128, 0, 64, 0, 8, 0, 1, 0, 1, 0, 146, 1, 55, 7, 3, 1, 59, 0, 3, 1, 159, - 2, 2, 7, 68, 0, 54, 0, 68, 0, 96, 2, 71, 7, 93, 0, 167, 0, 93, 0, 8, - 0, 2, 0, 1, 0, 159, 1, 82, 7, 64, 0, 128, 0, 64, 0, 24, 3, 120, 6, 192, - 0, 128, 1, 192, 0, 10, 3, 46, 6, 64, 0, 128, 0, 64, 0, 8, 0, 3, 0, 1, - 0, 46, 1, 49, 7, 129, 0, 2, 1, 129, 0, 146, 2, 184, 6, 205, 0, 154, - 1, 205, 0, 242, 2, 224, 6, 170, 0, 84, 1, 170, 0, 8, 0, 20, 0, 1, 0, - 104, 1, 92, 255, 242, 0, 198, 254, 242, 0, 240, 2, 184, 254, 51, 255, - 203, 0, 51, 255, 255, 2, 224, 254, 3, 255, 73, 255, 3, 255, 8, 0, 21, - 0, 1, 0, 104, 1, 92, 255, 149, 0, 82, 255, 149, 0, 240, 2, 184, 254, - 51, 255, 164, 0, 51, 255, 255, 2, 224, 254, 0, 255, 239, 254, 0, 255, - 8, 0, 22, 0, 1, 0, 104, 1, 92, 255, 98, 0, 156, 255, 98, 0, 240, 2, - 184, 254, 51, 255, 124, 0, 51, 255, 255, 2, 224, 254, 0, 255, 160, 254, - 0, 255, 8, 0, 23, 0, 1, 0, 94, 1, 92, 255, 140, 255, 82, 0, 140, 255, - 240, 2, 184, 254, 51, 255, 40, 0, 51, 255, 255, 2, 224, 254, 127, 255, - 21, 255, 127, 255, 8, 0, 24, 0, 1, 0, 69, 1, 92, 255, 224, 255, 216, - 255, 224, 255, 244, 2, 184, 254, 0, 255, 41, 254, 0, 255, 254, 2, 224, - 254, 250, 254, 170, 0, 250, 254, 8, 0, 25, 0, 1, 0, 43, 1, 92, 255, - 205, 255, 192, 255, 205, 255, 224, 2, 184, 254, 0, 255, 41, 254, 0, - 255, 253, 2, 224, 254, 250, 254, 170, 0, 250, 254, 8, 0, 26, 0, 1, 0, - 21, 1, 151, 255, 217, 255, 139, 255, 168, 255, 125, 2, 46, 255, 192, - 255, 64, 255, 112, 255, 102, 2, 72, 255, 128, 255, 128, 254, 224, 254, - 8, 0, 27, 0, 1, 0, 245, 0, 151, 255, 207, 255, 109, 255, 146, 255, 114, - 2, 46, 255, 94, 255, 27, 254, 149, 254, 101, 2, 72, 255, 194, 255, 70, - 255, 117, 255, 8, 0, 30, 0, 1, 0, 46, 1, 49, 255, 195, 255, 134, 255, - 195, 255, 146, 2, 184, 254, 51, 255, 102, 254, 51, 255, 242, 2, 224, - 254, 86, 255, 172, 254, 86, 255, 8, 0, 40, 0, 1, 0, 104, 1, 92, 255, - 242, 0, 198, 254, 242, 0, 240, 2, 184, 254, 205, 0, 53, 255, 205, 0, - 255, 2, 224, 254, 255, 1, 114, 1, 255, 1, 8, 0, 5, 1, 0, 8, 0, 1, 255, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 162, 0, 0, 0, 0, 255, 0, 255, 0, 0, 0, - 0, 0, 0, 0, 255, 0, 0, 0, 0, 120, 2, 160, 254, 128, 255, 0, 255, 128, - 255, 8, 0, 1, 0, 0, 0, 118, 1, 121, 255, 240, 255, 224, 255, 240, 255, - 31, 3, 116, 254, 206, 255, 224, 255, 206, 255, 238, 2, 43, 254, 44, - 255, 50, 0, 44, 255, 8, 0, 2, 0, 0, 0, 119, 1, 22, 255, 219, 255, 180, - 255, 219, 255, 31, 3, 116, 254, 224, 255, 236, 255, 224, 255, 236, 2, - 242, 254, 128, 255, 30, 0, 128, 255, 8, 0, 3, 0, 0, 0, 119, 1, 22, 255, - 219, 255, 180, 255, 219, 255, 31, 3, 116, 254, 224, 255, 236, 255, 224, - 255, 236, 2, 242, 254, 108, 255, 35, 0, 108, 255, 8, 0, 4, 0, 0, 0, - 51, 1, 174, 255, 203, 255, 150, 255, 203, 255, 11, 3, 133, 254, 203, - 255, 10, 0, 203, 255, 253, 2, 43, 254, 44, 255, 202, 0, 44, 255, 8, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 181, 4, 70, - 224, 243, 40, 241, 0, 33, 68, 34, 5, 70, 225, 243, 147, 241, 99, 105, - 21, 43, 43, 96, 1, 208, 22, 43, 1, 217, 16, 75, 107, 96, 107, 104, 195, - 177, 172, 96, 32, 70, 234, 243, 223, 241, 232, 96, 32, 70, 234, 243, - 163, 241, 6, 70, 24, 185, 32, 70, 1, 33, 234, 243, 219, 241, 107, 104, - 32, 70, 155, 104, 152, 71, 5, 70, 46, 185, 32, 70, 49, 70, 234, 243, - 209, 241, 0, 224, 29, 70, 40, 70, 112, 189, 0, 191, 164, 254, 1, 0, - 45, 233, 240, 71, 4, 70, 15, 70, 145, 70, 152, 70, 234, 243, 132, 241, - 5, 70, 24, 185, 32, 70, 1, 33, 234, 243, 188, 241, 32, 70, 234, 243, - 123, 241, 192, 177, 32, 70, 234, 243, 109, 241, 160, 185, 32, 70, 255, - 247, 181, 255, 130, 70, 144, 177, 32, 70, 236, 247, 201, 249, 218, 248, - 4, 48, 80, 70, 94, 105, 57, 70, 74, 70, 67, 70, 176, 71, 6, 70, 32, - 70, 236, 247, 187, 249, 4, 224, 111, 240, 24, 6, 1, 224, 79, 240, 255, - 54, 29, 185, 32, 70, 41, 70, 234, 243, 149, 241, 48, 70, 189, 232, 240, - 135, 5, 35, 192, 248, 148, 49, 32, 35, 192, 248, 156, 49, 35, 75, 1, - 34, 27, 104, 192, 248, 152, 33, 192, 248, 172, 33, 79, 240, 100, 2, - 192, 248, 176, 33, 79, 240, 6, 2, 0, 43, 192, 248, 192, 33, 64, 242, - 60, 114, 12, 191, 7, 35, 0, 35, 192, 248, 196, 33, 79, 240, 8, 2, 192, - 248, 160, 49, 192, 248, 200, 33, 79, 240, 16, 3, 79, 240, 21, 2, 192, - 248, 164, 49, 192, 248, 184, 49, 192, 248, 188, 49, 192, 248, 204, 33, - 192, 248, 208, 49, 3, 208, 14, 75, 27, 104, 1, 59, 0, 224, 3, 35, 28, - 34, 192, 248, 212, 49, 4, 35, 192, 248, 216, 49, 192, 248, 220, 33, - 192, 248, 232, 49, 12, 34, 6, 35, 192, 248, 224, 33, 192, 248, 236, - 49, 16, 34, 0, 35, 192, 248, 228, 33, 192, 248, 240, 49, 112, 71, 236, - 38, 0, 0, 212, 37, 0, 0, 208, 248, 16, 18, 56, 181, 4, 70, 105, 177, - 128, 104, 225, 243, 140, 246, 212, 248, 16, 18, 5, 70, 232, 34, 160, - 104, 229, 243, 41, 247, 0, 35, 196, 248, 16, 50, 0, 224, 13, 70, 40, - 70, 56, 189, 31, 181, 4, 70, 6, 35, 128, 104, 232, 33, 3, 147, 229, - 243, 10, 247, 196, 248, 16, 2, 104, 177, 0, 33, 232, 34, 225, 243, 187, - 240, 0, 35, 0, 147, 160, 104, 212, 248, 16, 18, 3, 170, 28, 35, 225, - 243, 254, 246, 1, 224, 79, 240, 255, 48, 4, 176, 16, 189, 0, 0, 45, - 233, 240, 65, 138, 176, 29, 70, 221, 248, 64, 128, 148, 75, 8, 70, 195, - 248, 0, 128, 17, 70, 23, 70, 232, 243, 92, 246, 0, 40, 0, 240, 25, 129, - 40, 70, 79, 244, 7, 113, 229, 243, 222, 246, 4, 70, 0, 40, 0, 240, 17, - 129, 0, 33, 79, 244, 7, 114, 225, 243, 141, 240, 165, 96, 196, 248, - 20, 128, 32, 70, 255, 247, 85, 255, 134, 75, 30, 104, 196, 248, 12, - 98, 30, 177, 54, 120, 0, 54, 24, 191, 1, 38, 130, 75, 4, 241, 40, 0, - 26, 104, 1, 33, 0, 42, 20, 191, 49, 34, 17, 34, 225, 243, 145, 247, - 0, 35, 0, 147, 1, 147, 2, 147, 56, 70, 41, 70, 66, 70, 17, 155, 5, 240, - 215, 252, 224, 96, 0, 40, 0, 240, 219, 128, 233, 243, 117, 247, 32, - 96, 224, 104, 233, 243, 143, 247, 103, 105, 115, 74, 123, 104, 115, - 73, 3, 240, 1, 3, 131, 240, 1, 3, 212, 248, 0, 192, 0, 43, 24, 191, - 17, 70, 132, 248, 118, 49, 64, 246, 41, 3, 156, 69, 96, 96, 212, 248, - 8, 224, 226, 104, 7, 245, 0, 115, 3, 209, 16, 177, 7, 245, 8, 119, 1, - 224, 7, 245, 4, 119, 0, 151, 212, 248, 184, 1, 1, 144, 212, 248, 188, - 1, 2, 144, 212, 248, 196, 1, 3, 144, 79, 240, 255, 48, 4, 144, 212, - 248, 192, 1, 5, 144, 8, 32, 6, 144, 0, 32, 7, 144, 112, 70, 238, 247, - 169, 255, 96, 98, 0, 40, 0, 240, 155, 128, 212, 248, 12, 18, 177, 177, - 11, 120, 163, 177, 227, 243, 246, 245, 85, 73, 34, 70, 212, 248, 12, - 2, 225, 243, 184, 245, 212, 248, 12, 2, 82, 73, 34, 70, 225, 243, 236, - 245, 46, 177, 32, 70, 255, 247, 68, 255, 0, 40, 64, 240, 129, 128, 1, - 33, 10, 70, 96, 106, 227, 243, 230, 245, 32, 70, 0, 33, 226, 104, 43, - 70, 3, 240, 158, 251, 32, 97, 0, 40, 114, 208, 0, 33, 11, 70, 32, 70, - 69, 74, 229, 243, 161, 241, 0, 35, 196, 248, 144, 1, 132, 248, 121, - 49, 66, 72, 230, 243, 5, 246, 16, 179, 225, 243, 52, 242, 1, 35, 131, - 64, 63, 72, 196, 248, 128, 49, 230, 243, 251, 245, 16, 177, 225, 243, - 42, 242, 8, 177, 212, 248, 128, 1, 196, 248, 132, 1, 58, 73, 0, 32, - 225, 243, 117, 244, 3, 12, 164, 248, 136, 49, 164, 248, 138, 1, 59, - 177, 0, 33, 32, 70, 53, 74, 11, 70, 229, 243, 119, 241, 196, 248, 140, - 1, 0, 32, 50, 73, 225, 243, 99, 244, 1, 40, 9, 209, 132, 248, 22, 2, - 48, 73, 0, 32, 225, 243, 91, 244, 1, 40, 4, 191, 46, 75, 24, 96, 32, - 70, 232, 243, 214, 243, 24, 179, 0, 32, 196, 248, 160, 1, 42, 73, 225, - 243, 77, 244, 40, 177, 1, 35, 132, 248, 249, 49, 40, 72, 238, 247, 244, - 251, 0, 32, 39, 73, 225, 243, 66, 244, 136, 177, 37, 73, 0, 32, 225, - 243, 61, 244, 79, 240, 128, 115, 0, 240, 15, 0, 10, 169, 1, 248, 1, - 13, 79, 244, 64, 114, 0, 147, 32, 70, 15, 35, 225, 247, 127, 253, 29, - 72, 29, 73, 34, 70, 229, 243, 232, 244, 28, 72, 235, 247, 211, 248, - 8, 224, 160, 104, 33, 70, 79, 244, 7, 114, 229, 243, 220, 245, 0, 36, - 0, 224, 4, 70, 32, 70, 10, 176, 189, 232, 240, 129, 0, 191, 244, 38, - 0, 0, 188, 38, 0, 0, 236, 38, 0, 0, 174, 39, 134, 0, 182, 39, 134, 0, - 221, 155, 128, 0, 81, 41, 0, 0, 101, 166, 128, 0, 5, 40, 134, 0, 14, - 40, 134, 0, 23, 40, 134, 0, 73, 155, 128, 0, 31, 40, 134, 0, 132, 186, - 1, 0, 144, 8, 2, 0, 42, 40, 134, 0, 52, 40, 134, 0, 149, 186, 1, 0, - 77, 40, 134, 0, 229, 154, 128, 0, 213, 150, 128, 0, 56, 181, 0, 37, - 4, 70, 128, 248, 117, 81, 0, 105, 3, 240, 34, 251, 32, 70, 232, 243, - 131, 245, 224, 104, 41, 70, 233, 243, 61, 246, 212, 248, 144, 1, 40, - 177, 229, 243, 124, 240, 212, 248, 144, 1, 229, 243, 194, 240, 212, - 248, 140, 1, 40, 177, 229, 243, 115, 240, 212, 248, 140, 1, 229, 243, - 185, 240, 224, 104, 5, 240, 20, 250, 212, 248, 16, 50, 35, 177, 27, - 120, 19, 177, 32, 70, 255, 247, 70, 254, 160, 104, 33, 70, 79, 244, - 7, 114, 189, 232, 56, 64, 229, 243, 118, 181, 127, 181, 6, 70, 79, 244, - 188, 113, 64, 104, 229, 243, 95, 245, 4, 70, 192, 177, 0, 33, 79, 244, - 188, 114, 224, 243, 16, 247, 11, 75, 38, 96, 0, 147, 11, 75, 0, 37, - 1, 147, 48, 104, 35, 70, 9, 73, 10, 74, 2, 149, 3, 149, 2, 240, 78, - 222, 79, 244, 150, 99, 196, 248, 96, 49, 132, 248, 100, 81, 32, 70, - 4, 176, 112, 189, 0, 191, 57, 4, 1, 0, 193, 45, 0, 0, 188, 186, 1, 0, - 133, 59, 134, 0, 16, 181, 4, 70, 112, 177, 3, 104, 34, 70, 24, 104, - 6, 73, 2, 240, 107, 222, 35, 104, 33, 70, 88, 104, 79, 244, 188, 114, - 189, 232, 16, 64, 229, 243, 54, 181, 16, 189, 0, 191, 133, 59, 134, - 0, 112, 181, 4, 70, 0, 40, 43, 208, 129, 104, 105, 177, 195, 104, 152, - 104, 238, 243, 222, 241, 227, 104, 208, 241, 1, 5, 161, 104, 152, 104, - 56, 191, 0, 37, 238, 243, 231, 241, 0, 224, 13, 70, 97, 111, 0, 38, - 166, 101, 41, 177, 227, 104, 162, 111, 88, 104, 229, 243, 20, 245, 102, - 103, 32, 70, 237, 247, 36, 255, 227, 104, 34, 70, 24, 104, 7, 73, 2, - 240, 54, 222, 227, 104, 33, 70, 88, 104, 79, 244, 176, 114, 229, 243, - 3, 245, 0, 224, 5, 70, 40, 70, 112, 189, 0, 191, 235, 61, 134, 0, 48, - 181, 79, 244, 176, 113, 133, 176, 5, 70, 64, 104, 229, 243, 228, 244, - 4, 70, 224, 177, 0, 33, 79, 244, 176, 114, 224, 243, 149, 246, 229, - 96, 168, 104, 197, 248, 24, 72, 13, 73, 34, 70, 0, 35, 238, 243, 200, - 241, 160, 96, 96, 177, 10, 75, 40, 104, 0, 147, 0, 35, 1, 147, 2, 147, - 3, 147, 8, 73, 8, 74, 35, 70, 2, 240, 202, 221, 24, 177, 32, 70, 255, - 247, 160, 255, 0, 36, 32, 70, 5, 176, 48, 189, 49, 47, 0, 0, 217, 225, - 128, 0, 64, 187, 1, 0, 235, 61, 134, 0, 56, 181, 4, 70, 208, 248, 132, - 0, 13, 70, 8, 177, 2, 240, 56, 253, 212, 248, 128, 0, 8, 177, 5, 240, - 241, 251, 224, 111, 8, 177, 255, 247, 109, 255, 96, 111, 8, 177, 255, - 247, 127, 255, 160, 104, 8, 177, 0, 240, 3, 253, 40, 70, 33, 70, 140, - 34, 189, 232, 56, 64, 229, 243, 166, 180, 45, 233, 240, 79, 7, 70, 137, - 176, 139, 70, 0, 32, 140, 33, 144, 70, 29, 70, 19, 158, 229, 243, 138, - 244, 4, 70, 0, 40, 123, 208, 0, 33, 140, 34, 224, 243, 59, 246, 38, - 96, 56, 70, 5, 240, 131, 248, 7, 171, 1, 144, 5, 147, 42, 70, 130, 70, - 79, 240, 0, 9, 32, 70, 65, 242, 228, 65, 51, 70, 205, 248, 0, 144, 205, - 248, 8, 176, 205, 248, 12, 128, 4, 148, 0, 240, 117, 253, 5, 70, 0, - 40, 87, 208, 160, 96, 4, 240, 109, 219, 43, 105, 96, 96, 227, 96, 45, - 75, 16, 33, 163, 100, 45, 74, 51, 70, 39, 97, 100, 100, 56, 70, 224, - 243, 84, 246, 43, 105, 49, 70, 27, 110, 41, 72, 154, 107, 41, 75, 238, - 247, 82, 250, 50, 70, 72, 70, 18, 153, 39, 75, 141, 232, 128, 1, 2, - 240, 40, 254, 6, 70, 0, 40, 52, 209, 99, 104, 1, 39, 131, 248, 120, - 112, 223, 248, 148, 128, 54, 33, 58, 70, 213, 248, 124, 2, 37, 240, - 149, 217, 196, 248, 60, 128, 40, 70, 255, 247, 72, 255, 96, 103, 8, - 179, 99, 104, 40, 70, 131, 248, 164, 112, 196, 248, 120, 128, 255, 247, - 196, 254, 224, 103, 184, 177, 40, 70, 5, 240, 17, 251, 196, 248, 128, - 0, 136, 177, 40, 70, 2, 240, 127, 252, 196, 248, 132, 0, 88, 177, 15, - 75, 2, 150, 141, 232, 72, 0, 3, 150, 40, 104, 13, 73, 14, 74, 35, 70, - 2, 240, 21, 221, 32, 177, 32, 70, 81, 70, 255, 247, 86, 255, 0, 36, - 32, 70, 9, 176, 189, 232, 240, 143, 0, 191, 85, 247, 128, 0, 251, 65, - 134, 0, 132, 142, 2, 0, 172, 187, 1, 0, 41, 251, 128, 0, 153, 248, 128, - 0, 124, 210, 133, 0, 197, 66, 134, 0, 239, 190, 173, 13, 2, 75, 1, 34, - 26, 112, 235, 247, 45, 186, 0, 191, 40, 9, 2, 0, 208, 248, 172, 17, - 16, 181, 4, 70, 41, 177, 128, 104, 238, 243, 188, 240, 0, 35, 196, 248, - 172, 49, 212, 248, 196, 17, 41, 177, 160, 104, 238, 243, 179, 240, 0, - 35, 196, 248, 196, 49, 212, 248, 116, 21, 41, 177, 160, 104, 238, 243, - 170, 240, 0, 35, 196, 248, 116, 53, 212, 248, 248, 22, 41, 177, 160, - 104, 238, 243, 161, 240, 0, 35, 196, 248, 248, 54, 212, 248, 252, 22, - 41, 177, 160, 104, 238, 243, 152, 240, 0, 35, 196, 248, 252, 54, 212, - 248, 224, 54, 25, 106, 49, 177, 160, 104, 238, 243, 142, 240, 212, 248, - 224, 54, 0, 34, 26, 98, 212, 248, 60, 21, 41, 177, 160, 104, 238, 243, - 132, 240, 0, 35, 196, 248, 60, 53, 212, 248, 148, 23, 41, 177, 160, - 104, 238, 243, 123, 240, 0, 35, 196, 248, 148, 55, 212, 248, 176, 24, - 41, 177, 160, 104, 238, 243, 114, 240, 0, 35, 196, 248, 176, 56, 16, - 189, 16, 181, 4, 70, 0, 104, 5, 240, 221, 255, 212, 248, 72, 1, 32, - 177, 5, 240, 102, 251, 0, 35, 196, 248, 72, 49, 212, 248, 88, 49, 19, - 177, 0, 35, 196, 248, 88, 49, 212, 248, 60, 1, 32, 177, 5, 240, 246, - 250, 0, 35, 196, 248, 60, 49, 212, 248, 64, 1, 32, 177, 1, 240, 166, - 250, 0, 35, 196, 248, 64, 49, 212, 248, 76, 1, 32, 177, 5, 240, 28, - 252, 0, 35, 196, 248, 76, 49, 212, 248, 84, 1, 32, 177, 5, 240, 146, - 251, 0, 35, 196, 248, 84, 49, 212, 248, 96, 1, 32, 177, 7, 240, 132, - 249, 0, 35, 196, 248, 96, 49, 212, 248, 56, 49, 19, 177, 0, 35, 196, - 248, 56, 49, 212, 248, 100, 1, 32, 177, 2, 240, 64, 250, 0, 35, 196, - 248, 100, 49, 212, 248, 0, 5, 32, 177, 7, 240, 98, 250, 0, 35, 196, - 248, 0, 53, 16, 189, 56, 181, 3, 104, 4, 70, 208, 248, 96, 86, 26, 73, - 88, 105, 225, 243, 143, 241, 40, 112, 35, 104, 24, 73, 88, 105, 212, - 248, 96, 86, 225, 243, 135, 241, 232, 112, 212, 248, 96, 54, 26, 120, - 10, 177, 15, 42, 1, 209, 1, 34, 26, 112, 212, 248, 96, 54, 1, 33, 26, - 120, 90, 112, 212, 248, 96, 86, 40, 70, 224, 243, 48, 247, 168, 112, - 212, 248, 96, 54, 218, 120, 10, 177, 15, 42, 1, 209, 1, 34, 218, 112, - 212, 248, 96, 54, 1, 33, 218, 120, 26, 113, 212, 248, 96, 70, 224, 28, - 224, 243, 29, 247, 96, 113, 56, 189, 0, 191, 61, 121, 134, 0, 82, 121, - 134, 0, 3, 104, 112, 181, 93, 105, 4, 70, 20, 73, 40, 70, 225, 243, - 82, 241, 64, 178, 32, 185, 40, 70, 18, 73, 225, 243, 76, 241, 64, 178, - 67, 30, 14, 43, 14, 216, 1, 40, 3, 209, 212, 248, 96, 38, 0, 35, 4, - 224, 2, 40, 6, 209, 212, 248, 96, 38, 1, 35, 147, 113, 212, 248, 96, - 38, 211, 113, 8, 73, 40, 70, 38, 107, 225, 243, 52, 241, 134, 248, 4, - 1, 32, 70, 241, 243, 207, 244, 1, 32, 112, 189, 0, 191, 198, 92, 134, - 0, 203, 92, 134, 0, 14, 93, 134, 0, 112, 181, 4, 70, 33, 70, 0, 104, - 7, 240, 188, 249, 196, 248, 0, 5, 0, 40, 82, 208, 32, 104, 5, 240, 247, - 254, 32, 104, 33, 70, 1, 240, 99, 251, 196, 248, 52, 7, 0, 40, 73, 208, - 44, 75, 32, 70, 196, 248, 88, 49, 5, 240, 75, 250, 196, 248, 60, 1, - 0, 40, 65, 208, 32, 70, 1, 240, 44, 250, 196, 248, 64, 1, 0, 40, 60, - 208, 32, 70, 7, 240, 125, 248, 196, 248, 96, 1, 0, 40, 55, 208, 32, - 104, 33, 70, 162, 104, 31, 75, 5, 240, 7, 251, 196, 248, 124, 2, 0, - 40, 47, 208, 32, 70, 2, 240, 214, 249, 196, 248, 100, 1, 0, 40, 42, - 208, 25, 75, 0, 37, 1, 38, 196, 248, 56, 49, 164, 248, 48, 88, 132, - 248, 136, 88, 132, 248, 138, 88, 132, 248, 137, 104, 32, 70, 5, 240, - 114, 250, 196, 248, 72, 1, 0, 40, 24, 208, 35, 104, 40, 70, 131, 248, - 163, 96, 35, 104, 131, 248, 169, 96, 35, 104, 131, 248, 160, 96, 112, - 189, 41, 32, 112, 189, 42, 32, 112, 189, 49, 32, 112, 189, 50, 32, 112, - 189, 53, 32, 112, 189, 57, 32, 112, 189, 60, 32, 112, 189, 67, 32, 112, - 189, 0, 191, 239, 190, 173, 222, 157, 109, 129, 0, 239, 190, 173, 13, - 240, 181, 208, 248, 64, 85, 0, 33, 172, 34, 135, 176, 4, 70, 40, 70, - 224, 243, 12, 244, 100, 35, 235, 133, 3, 35, 133, 248, 96, 48, 0, 34, - 1, 35, 212, 248, 92, 1, 79, 244, 44, 81, 36, 240, 241, 218, 255, 40, - 4, 209, 35, 107, 24, 105, 25, 104, 239, 247, 14, 255, 33, 104, 104, - 134, 35, 107, 164, 248, 38, 6, 145, 248, 70, 96, 255, 39, 0, 33, 0, - 244, 64, 96, 26, 137, 176, 245, 64, 111, 20, 191, 20, 32, 40, 32, 27, - 104, 141, 232, 130, 0, 3, 144, 6, 240, 3, 6, 212, 248, 96, 6, 2, 150, - 128, 120, 4, 144, 5, 241, 56, 0, 47, 240, 246, 219, 35, 104, 147, 248, - 70, 48, 152, 7, 3, 208, 235, 136, 67, 240, 32, 3, 235, 128, 7, 176, - 240, 189, 0, 0, 56, 181, 4, 70, 44, 73, 128, 104, 34, 70, 0, 35, 237, - 243, 0, 247, 196, 248, 172, 1, 0, 40, 77, 208, 160, 104, 40, 73, 34, - 70, 0, 35, 237, 243, 246, 246, 196, 248, 196, 1, 0, 40, 67, 208, 160, - 104, 36, 73, 34, 70, 0, 35, 237, 243, 236, 246, 196, 248, 116, 5, 0, - 40, 57, 208, 160, 104, 32, 73, 34, 70, 0, 35, 237, 243, 226, 246, 196, - 248, 248, 6, 0, 40, 47, 208, 160, 104, 28, 73, 34, 70, 0, 35, 237, 243, - 216, 246, 196, 248, 252, 6, 48, 179, 160, 104, 24, 73, 34, 70, 0, 35, - 212, 248, 224, 86, 237, 243, 205, 246, 40, 98, 224, 177, 160, 104, 20, - 73, 34, 70, 0, 35, 237, 243, 197, 246, 196, 248, 60, 5, 152, 177, 160, - 104, 17, 73, 34, 70, 0, 35, 237, 243, 188, 246, 196, 248, 148, 7, 80, - 177, 0, 35, 160, 104, 13, 73, 34, 70, 237, 243, 179, 246, 196, 248, - 176, 8, 0, 48, 24, 191, 1, 32, 56, 189, 0, 191, 61, 170, 129, 0, 61, - 112, 129, 0, 37, 62, 129, 0, 149, 145, 129, 0, 133, 143, 129, 0, 37, - 110, 129, 0, 137, 89, 129, 0, 57, 107, 129, 0, 73, 111, 129, 0, 248, - 181, 66, 246, 1, 49, 0, 37, 255, 35, 1, 38, 100, 39, 4, 70, 128, 248, - 71, 54, 128, 248, 196, 52, 160, 248, 40, 22, 128, 248, 40, 96, 128, - 248, 104, 119, 128, 248, 66, 86, 128, 248, 76, 102, 128, 248, 67, 86, - 128, 248, 73, 102, 128, 248, 70, 86, 2, 33, 79, 240, 255, 50, 3, 240, - 213, 223, 32, 70, 49, 70, 42, 70, 3, 240, 208, 223, 32, 70, 12, 33, - 79, 240, 255, 50, 3, 240, 202, 223, 32, 70, 11, 33, 42, 70, 3, 240, - 197, 223, 32, 70, 14, 33, 79, 240, 255, 50, 3, 240, 191, 223, 32, 70, - 13, 33, 42, 70, 3, 240, 186, 223, 32, 70, 15, 33, 79, 240, 255, 50, - 3, 240, 180, 223, 4, 33, 2, 34, 32, 70, 3, 240, 175, 223, 212, 248, - 96, 54, 3, 34, 132, 248, 72, 102, 154, 113, 212, 248, 96, 54, 64, 246, - 42, 17, 218, 113, 164, 248, 42, 22, 164, 248, 44, 22, 164, 248, 46, - 22, 164, 248, 48, 22, 164, 248, 50, 22, 164, 248, 52, 22, 164, 248, - 54, 22, 64, 246, 43, 17, 164, 248, 56, 22, 33, 104, 164, 248, 122, 85, - 129, 248, 149, 80, 164, 248, 62, 38, 2, 34, 164, 248, 64, 38, 4, 34, - 7, 33, 164, 248, 60, 38, 15, 34, 164, 248, 58, 22, 164, 248, 124, 88, - 164, 248, 126, 120, 132, 248, 234, 81, 132, 248, 235, 81, 132, 248, - 30, 82, 132, 248, 238, 81, 132, 248, 236, 81, 132, 248, 250, 97, 132, - 248, 11, 87, 132, 248, 12, 39, 132, 248, 160, 84, 35, 70, 211, 248, - 144, 36, 195, 248, 128, 34, 149, 113, 1, 53, 4, 51, 4, 45, 246, 209, - 35, 104, 0, 37, 1, 38, 132, 248, 80, 87, 79, 240, 255, 50, 131, 248, - 77, 96, 90, 99, 35, 104, 4, 245, 204, 103, 131, 248, 66, 96, 35, 104, - 11, 34, 131, 248, 67, 80, 35, 104, 132, 248, 207, 81, 131, 248, 57, - 80, 35, 104, 56, 29, 131, 248, 170, 96, 35, 104, 132, 248, 223, 81, - 132, 248, 224, 97, 196, 248, 228, 81, 132, 248, 225, 81, 41, 70, 221, - 102, 224, 243, 160, 242, 221, 35, 132, 248, 100, 54, 9, 35, 3, 34, 132, - 248, 101, 54, 184, 29, 26, 73, 224, 243, 49, 242, 2, 35, 132, 248, 105, - 54, 35, 104, 132, 248, 86, 101, 132, 248, 87, 101, 131, 248, 76, 80, - 100, 35, 164, 248, 140, 56, 35, 104, 132, 248, 146, 87, 164, 248, 144, - 87, 147, 248, 70, 32, 146, 7, 12, 208, 147, 249, 76, 48, 75, 177, 212, - 248, 252, 4, 36, 48, 243, 243, 127, 243, 212, 248, 252, 4, 50, 48, 243, - 243, 122, 243, 34, 104, 1, 35, 79, 244, 72, 113, 132, 248, 37, 56, 164, - 248, 92, 23, 130, 248, 162, 48, 35, 104, 255, 34, 131, 248, 181, 32, - 248, 189, 0, 191, 181, 183, 1, 0, 65, 242, 228, 67, 152, 66, 64, 240, - 200, 128, 68, 242, 32, 51, 153, 66, 0, 240, 197, 128, 68, 242, 37, 51, - 153, 66, 0, 240, 192, 128, 68, 242, 3, 51, 153, 66, 0, 240, 187, 128, - 68, 242, 33, 51, 153, 66, 0, 240, 182, 128, 68, 242, 36, 51, 153, 66, - 0, 240, 177, 128, 68, 242, 24, 51, 153, 66, 0, 240, 172, 128, 68, 242, - 25, 51, 153, 66, 0, 240, 167, 128, 68, 242, 26, 51, 153, 66, 0, 240, - 162, 128, 68, 242, 17, 51, 153, 66, 0, 240, 157, 128, 68, 242, 19, 51, - 153, 66, 0, 240, 152, 128, 68, 242, 18, 51, 153, 66, 0, 240, 147, 128, - 68, 242, 20, 51, 153, 66, 0, 240, 142, 128, 68, 242, 21, 51, 153, 66, - 0, 240, 137, 128, 68, 242, 22, 51, 153, 66, 0, 240, 132, 128, 68, 242, - 27, 51, 153, 66, 127, 208, 68, 242, 28, 51, 153, 66, 123, 208, 68, 242, - 29, 51, 153, 66, 119, 208, 161, 245, 134, 67, 163, 241, 40, 2, 146, - 178, 2, 42, 112, 217, 43, 59, 155, 178, 2, 43, 108, 217, 68, 242, 65, - 51, 153, 66, 104, 208, 68, 242, 64, 51, 153, 66, 100, 208, 161, 245, - 134, 67, 80, 59, 155, 178, 2, 43, 94, 217, 68, 242, 83, 51, 153, 66, - 90, 208, 68, 242, 87, 51, 153, 66, 86, 208, 74, 246, 157, 19, 153, 66, - 82, 208, 68, 242, 84, 51, 153, 66, 78, 208, 68, 242, 47, 51, 153, 66, - 74, 208, 68, 242, 46, 51, 153, 66, 70, 208, 68, 242, 52, 51, 153, 66, - 66, 208, 68, 242, 53, 51, 153, 66, 62, 208, 68, 242, 54, 51, 153, 66, - 58, 208, 161, 245, 134, 67, 163, 241, 55, 2, 146, 178, 2, 42, 51, 217, - 68, 242, 22, 114, 145, 66, 47, 208, 68, 242, 39, 114, 145, 66, 43, 208, - 68, 242, 67, 50, 145, 66, 39, 208, 163, 241, 96, 2, 146, 178, 1, 42, - 34, 217, 163, 241, 70, 2, 146, 178, 2, 42, 29, 217, 163, 241, 49, 2, - 146, 178, 1, 42, 24, 217, 85, 59, 155, 178, 1, 43, 20, 217, 161, 245, - 134, 67, 88, 59, 155, 178, 1, 43, 14, 217, 68, 242, 99, 51, 153, 66, - 12, 208, 68, 242, 112, 48, 192, 235, 1, 12, 220, 241, 0, 0, 64, 235, - 12, 0, 112, 71, 0, 32, 112, 71, 1, 32, 112, 71, 1, 32, 112, 71, 131, - 107, 112, 181, 0, 37, 131, 248, 76, 80, 195, 107, 1, 38, 131, 248, 76, - 96, 4, 70, 129, 107, 227, 247, 189, 250, 225, 107, 32, 70, 227, 247, - 185, 250, 41, 70, 32, 70, 248, 243, 0, 240, 163, 107, 32, 70, 131, 248, - 77, 80, 227, 107, 49, 70, 131, 248, 77, 80, 212, 248, 96, 54, 79, 240, - 255, 53, 222, 114, 212, 248, 96, 54, 157, 129, 247, 243, 238, 247, 212, - 248, 96, 54, 155, 120, 179, 66, 12, 217, 163, 107, 255, 34, 131, 248, - 77, 80, 227, 107, 131, 248, 77, 32, 180, 248, 203, 52, 67, 240, 128, - 3, 164, 248, 203, 52, 112, 189, 0, 0, 248, 181, 4, 70, 0, 40, 0, 240, - 154, 128, 1, 240, 191, 251, 6, 70, 32, 70, 3, 240, 61, 223, 0, 185, - 1, 54, 212, 248, 240, 22, 73, 177, 96, 104, 212, 248, 244, 38, 228, - 243, 149, 247, 0, 35, 196, 248, 244, 54, 196, 248, 240, 54, 32, 70, - 212, 248, 24, 21, 250, 243, 93, 246, 32, 70, 212, 248, 216, 22, 250, - 243, 88, 246, 212, 248, 32, 21, 32, 70, 250, 243, 83, 246, 212, 248, - 44, 21, 33, 177, 96, 104, 79, 244, 150, 98, 228, 243, 121, 247, 212, - 248, 124, 2, 32, 177, 4, 240, 246, 255, 0, 35, 196, 248, 124, 50, 37, - 70, 4, 241, 32, 7, 6, 224, 213, 248, 76, 18, 17, 177, 32, 70, 29, 240, - 11, 219, 4, 53, 189, 66, 246, 209, 1, 33, 32, 70, 51, 240, 154, 220, - 32, 70, 1, 240, 15, 254, 39, 107, 185, 105, 17, 177, 32, 70, 50, 240, - 37, 223, 0, 37, 189, 97, 212, 248, 92, 1, 1, 240, 245, 254, 32, 70, - 255, 247, 82, 251, 32, 70, 255, 247, 165, 251, 32, 70, 212, 248, 44, - 24, 225, 247, 244, 253, 196, 248, 44, 88, 212, 248, 184, 84, 6, 224, - 41, 70, 96, 104, 16, 34, 239, 104, 228, 243, 59, 247, 61, 70, 0, 45, - 246, 209, 196, 248, 184, 84, 32, 104, 22, 73, 34, 70, 2, 240, 93, 216, - 212, 248, 52, 7, 24, 177, 0, 240, 152, 255, 196, 248, 52, 87, 212, 248, - 104, 1, 32, 177, 6, 240, 227, 253, 0, 35, 196, 248, 104, 49, 212, 248, - 24, 23, 81, 177, 96, 104, 212, 248, 28, 39, 228, 243, 26, 247, 0, 35, - 196, 248, 24, 55, 1, 224, 8, 240, 128, 223, 212, 248, 120, 34, 32, 70, - 97, 104, 0, 42, 247, 209, 0, 240, 2, 252, 0, 224, 6, 70, 48, 70, 248, - 189, 187, 92, 134, 0, 45, 233, 240, 79, 141, 176, 6, 146, 221, 248, - 92, 128, 26, 154, 153, 70, 0, 35, 7, 145, 10, 147, 0, 146, 7, 70, 65, - 70, 6, 152, 24, 154, 25, 155, 157, 248, 88, 176, 221, 248, 108, 160, - 9, 240, 85, 248, 6, 70, 16, 177, 30, 35, 10, 147, 32, 227, 255, 247, - 228, 250, 64, 70, 73, 70, 10, 170, 0, 240, 199, 252, 4, 70, 0, 40, 0, - 240, 22, 131, 208, 248, 96, 54, 255, 34, 192, 248, 4, 128, 5, 104, 131, - 248, 28, 33, 131, 107, 135, 96, 3, 99, 67, 107, 73, 70, 195, 98, 174, - 75, 197, 248, 4, 144, 197, 248, 176, 48, 26, 155, 197, 248, 12, 128, - 192, 248, 120, 49, 3, 35, 133, 248, 33, 176, 128, 248, 105, 55, 79, - 240, 255, 51, 192, 248, 204, 56, 128, 248, 157, 97, 255, 247, 4, 253, - 32, 70, 249, 243, 31, 247, 32, 70, 4, 240, 100, 255, 6, 70, 0, 40, 64, - 240, 244, 130, 32, 70, 57, 70, 66, 70, 75, 70, 6, 240, 212, 252, 196, - 248, 104, 1, 8, 185, 31, 35, 176, 226, 153, 75, 2, 150, 141, 232, 72, - 0, 3, 150, 151, 73, 152, 74, 35, 70, 32, 104, 1, 240, 142, 223, 150, - 75, 2, 150, 141, 232, 72, 0, 3, 150, 149, 73, 149, 74, 35, 70, 32, 104, - 1, 240, 131, 223, 24, 154, 25, 155, 2, 146, 26, 154, 3, 147, 4, 146, - 32, 70, 7, 153, 6, 154, 75, 70, 205, 248, 0, 176, 205, 248, 4, 128, - 1, 240, 17, 251, 6, 70, 10, 144, 0, 40, 64, 240, 190, 130, 35, 105, - 24, 110, 235, 247, 207, 248, 164, 248, 190, 8, 32, 70, 247, 243, 137, - 245, 8, 185, 20, 35, 121, 226, 49, 70, 11, 170, 32, 70, 249, 243, 13, - 242, 49, 70, 32, 70, 189, 248, 44, 32, 1, 54, 249, 243, 16, 242, 6, - 46, 241, 209, 1, 39, 133, 248, 154, 112, 4, 245, 190, 114, 32, 105, - 5, 241, 20, 1, 26, 240, 80, 220, 119, 73, 104, 105, 224, 243, 150, 244, - 118, 73, 6, 70, 104, 105, 224, 243, 145, 244, 117, 73, 164, 248, 98, - 8, 104, 105, 224, 243, 139, 244, 180, 248, 98, 56, 164, 248, 100, 8, - 164, 248, 120, 55, 164, 248, 122, 7, 111, 73, 104, 105, 224, 243, 127, - 244, 110, 73, 164, 248, 84, 8, 104, 105, 224, 243, 121, 244, 132, 248, - 86, 8, 107, 73, 104, 105, 224, 243, 115, 244, 132, 248, 88, 8, 105, - 73, 104, 105, 224, 243, 109, 244, 132, 248, 90, 8, 103, 73, 104, 105, - 224, 243, 103, 244, 132, 248, 87, 8, 101, 73, 104, 105, 224, 243, 97, - 244, 132, 248, 89, 8, 99, 73, 104, 105, 224, 243, 91, 244, 132, 248, - 91, 8, 97, 73, 104, 105, 224, 243, 85, 244, 132, 248, 92, 8, 95, 73, - 104, 105, 224, 243, 79, 244, 132, 248, 94, 8, 93, 73, 104, 105, 224, - 243, 73, 244, 132, 248, 96, 8, 91, 73, 104, 105, 224, 243, 67, 244, - 132, 248, 93, 8, 89, 73, 104, 105, 224, 243, 61, 244, 132, 248, 95, - 8, 87, 73, 104, 105, 224, 243, 55, 244, 132, 248, 97, 8, 32, 70, 255, - 247, 154, 250, 212, 248, 96, 54, 34, 107, 132, 248, 240, 119, 132, 248, - 241, 119, 16, 105, 25, 120, 218, 120, 240, 247, 215, 248, 226, 106, - 32, 105, 0, 35, 193, 24, 209, 248, 160, 112, 209, 24, 4, 51, 24, 43, - 79, 96, 247, 209, 4, 245, 203, 119, 57, 70, 26, 240, 252, 220, 6, 34, - 5, 241, 78, 0, 57, 70, 223, 243, 16, 247, 180, 248, 130, 49, 68, 242, - 29, 50, 147, 66, 29, 208, 10, 216, 68, 242, 22, 50, 147, 66, 24, 208, - 68, 242, 26, 50, 147, 66, 20, 208, 68, 242, 19, 50, 13, 224, 68, 242, - 42, 50, 147, 66, 13, 208, 2, 216, 68, 242, 33, 50, 5, 224, 68, 242, - 45, 50, 147, 66, 5, 208, 68, 242, 82, 50, 147, 66, 1, 208, 0, 35, 0, - 224, 1, 35, 14, 51, 84, 248, 35, 48, 32, 70, 35, 99, 255, 247, 138, - 250, 8, 185, 24, 35, 168, 225, 33, 107, 15, 34, 64, 242, 255, 51, 161, - 248, 6, 33, 161, 248, 8, 49, 1, 241, 252, 2, 1, 245, 128, 115, 32, 70, - 0, 240, 136, 255, 35, 107, 211, 248, 252, 32, 195, 248, 248, 32, 195, - 248, 240, 32, 211, 248, 0, 33, 195, 248, 244, 32, 26, 104, 2, 42, 7, - 209, 1, 34, 90, 117, 35, 107, 32, 70, 3, 33, 90, 125, 3, 240, 184, 219, - 242, 7, 47, 213, 0, 34, 46, 224, 15, 230, 90, 5, 121, 219, 129, 0, 120, - 212, 133, 0, 187, 92, 134, 0, 169, 54, 0, 0, 244, 188, 1, 0, 247, 187, - 1, 0, 214, 104, 134, 0, 226, 104, 134, 0, 245, 104, 134, 0, 7, 105, - 134, 0, 28, 105, 134, 0, 43, 105, 134, 0, 58, 105, 134, 0, 73, 105, - 134, 0, 90, 105, 134, 0, 107, 105, 134, 0, 124, 105, 134, 0, 138, 105, - 134, 0, 152, 105, 134, 0, 166, 105, 134, 0, 182, 105, 134, 0, 198, 105, - 134, 0, 1, 34, 133, 248, 70, 32, 32, 70, 10, 33, 3, 240, 127, 219, 33, - 107, 32, 70, 28, 49, 251, 243, 216, 243, 127, 35, 33, 107, 0, 147, 35, - 104, 0, 34, 147, 248, 70, 48, 1, 241, 28, 0, 3, 240, 3, 3, 80, 49, 1, - 147, 19, 70, 46, 240, 46, 223, 32, 70, 247, 243, 153, 244, 79, 244, - 209, 99, 196, 248, 116, 56, 32, 70, 255, 247, 62, 250, 7, 70, 10, 144, - 0, 40, 64, 240, 95, 129, 32, 70, 73, 70, 255, 247, 243, 250, 8, 185, - 32, 35, 31, 225, 32, 70, 1, 240, 189, 252, 196, 248, 92, 1, 8, 185, - 33, 35, 23, 225, 32, 70, 255, 247, 155, 250, 57, 70, 167, 74, 168, 75, - 32, 70, 0, 151, 1, 148, 6, 240, 23, 252, 166, 75, 26, 29, 7, 202, 27, - 104, 141, 232, 7, 0, 7, 33, 32, 70, 34, 70, 8, 240, 180, 220, 4, 33, - 32, 70, 160, 74, 161, 75, 0, 151, 1, 148, 6, 240, 4, 252, 0, 40, 196, - 248, 140, 7, 1, 218, 34, 35, 243, 224, 32, 70, 65, 70, 8, 240, 38, 221, - 8, 185, 100, 35, 236, 224, 79, 240, 255, 51, 196, 248, 4, 8, 151, 73, - 0, 147, 32, 70, 150, 74, 151, 75, 0, 240, 98, 222, 196, 248, 44, 8, - 0, 40, 0, 240, 21, 129, 32, 70, 1, 240, 139, 251, 8, 177, 35, 35, 214, - 224, 35, 104, 6, 34, 147, 248, 161, 48, 165, 248, 100, 32, 1, 43, 2, - 209, 64, 35, 165, 248, 100, 48, 213, 248, 140, 48, 6, 34, 26, 128, 79, - 244, 57, 114, 90, 128, 213, 248, 144, 48, 196, 34, 1, 39, 4, 245, 0, - 113, 32, 70, 31, 128, 90, 128, 6, 49, 9, 240, 195, 220, 212, 248, 60, - 1, 14, 240, 77, 221, 8, 177, 132, 248, 207, 113, 2, 35, 132, 248, 192, - 52, 30, 35, 132, 248, 203, 52, 16, 35, 132, 248, 204, 52, 35, 107, 91, - 137, 2, 43, 2, 216, 28, 35, 132, 248, 203, 52, 255, 35, 0, 33, 132, - 248, 202, 52, 132, 248, 201, 52, 132, 248, 200, 52, 32, 70, 248, 243, - 95, 241, 35, 104, 0, 39, 131, 248, 180, 112, 79, 240, 255, 51, 196, - 248, 212, 49, 32, 70, 57, 70, 243, 243, 107, 241, 32, 70, 132, 248, - 220, 113, 255, 247, 149, 252, 51, 7, 72, 191, 132, 248, 220, 113, 240, - 6, 3, 213, 32, 70, 0, 33, 243, 243, 92, 241, 177, 7, 14, 213, 162, 107, - 0, 35, 130, 248, 77, 48, 226, 107, 130, 248, 77, 48, 180, 248, 203, - 52, 35, 240, 128, 3, 27, 4, 27, 12, 164, 248, 203, 52, 114, 7, 3, 213, - 32, 70, 0, 33, 247, 243, 169, 244, 51, 6, 7, 213, 180, 248, 203, 52, - 35, 240, 16, 3, 27, 4, 27, 12, 164, 248, 203, 52, 35, 104, 147, 248, - 66, 48, 155, 177, 22, 240, 96, 15, 16, 208, 6, 240, 32, 1, 6, 240, 64, - 2, 32, 70, 0, 41, 20, 191, 0, 33, 111, 240, 0, 1, 0, 42, 20, 191, 0, - 34, 111, 240, 0, 2, 0, 240, 147, 251, 2, 35, 141, 248, 32, 48, 0, 35, - 141, 248, 33, 48, 141, 248, 34, 48, 141, 248, 35, 48, 141, 248, 36, - 48, 141, 248, 37, 48, 180, 248, 130, 49, 68, 242, 29, 50, 147, 66, 29, - 208, 10, 216, 68, 242, 22, 50, 147, 66, 24, 208, 68, 242, 26, 50, 147, - 66, 20, 208, 68, 242, 19, 50, 13, 224, 68, 242, 42, 50, 147, 66, 13, - 208, 2, 216, 68, 242, 33, 50, 5, 224, 68, 242, 45, 50, 147, 66, 5, 208, - 68, 242, 82, 50, 147, 66, 1, 208, 0, 38, 0, 224, 1, 38, 6, 241, 14, - 7, 84, 248, 39, 144, 8, 169, 32, 70, 74, 70, 50, 240, 139, 219, 201, - 248, 24, 0, 84, 248, 39, 16, 136, 105, 16, 185, 55, 35, 10, 147, 53, - 224, 68, 48, 80, 49, 40, 34, 223, 243, 49, 245, 84, 248, 39, 48, 32, - 70, 155, 105, 158, 98, 235, 109, 67, 240, 4, 3, 235, 101, 29, 75, 200, - 248, 12, 64, 200, 248, 8, 48, 237, 247, 37, 253, 186, 241, 0, 15, 2, - 208, 0, 35, 202, 248, 0, 48, 35, 104, 23, 73, 88, 105, 224, 243, 66, - 242, 128, 177, 0, 33, 10, 70, 224, 243, 253, 240, 20, 75, 192, 178, - 24, 96, 8, 224, 186, 241, 0, 15, 4, 208, 10, 155, 0, 36, 202, 248, 0, - 48, 0, 224, 84, 70, 32, 70, 13, 176, 189, 232, 240, 143, 32, 70, 255, - 247, 15, 252, 238, 231, 57, 174, 130, 0, 1, 174, 130, 0, 204, 189, 1, - 0, 213, 161, 129, 0, 173, 161, 129, 0, 45, 87, 129, 0, 65, 87, 129, - 0, 25, 87, 129, 0, 181, 66, 130, 0, 3, 188, 1, 0, 208, 8, 2, 0, 9, 33, - 32, 35, 8, 34, 16, 181, 1, 97, 16, 36, 129, 97, 1, 33, 3, 96, 67, 96, - 66, 97, 64, 242, 60, 115, 193, 97, 4, 98, 130, 99, 64, 36, 0, 34, 65, - 100, 64, 242, 158, 49, 131, 96, 132, 98, 4, 35, 15, 36, 2, 100, 193, - 100, 66, 102, 3, 33, 2, 34, 195, 96, 67, 98, 195, 98, 4, 99, 67, 99, - 1, 101, 66, 101, 131, 101, 193, 101, 2, 102, 16, 189, 56, 181, 5, 70, - 12, 70, 0, 41, 40, 208, 73, 109, 17, 177, 192, 34, 228, 243, 111, 243, - 212, 248, 140, 16, 57, 177, 40, 70, 79, 244, 57, 114, 228, 243, 103, - 243, 0, 35, 196, 248, 140, 48, 212, 248, 144, 16, 49, 177, 40, 70, 196, - 34, 228, 243, 93, 243, 0, 35, 196, 248, 144, 48, 225, 105, 41, 177, - 40, 70, 104, 34, 228, 243, 84, 243, 0, 35, 227, 97, 40, 70, 33, 70, - 184, 34, 189, 232, 56, 64, 228, 243, 75, 179, 56, 189, 248, 181, 22, - 70, 184, 34, 5, 70, 15, 70, 9, 240, 41, 223, 4, 70, 16, 185, 64, 242, - 233, 51, 43, 224, 40, 70, 57, 70, 104, 34, 9, 240, 31, 223, 224, 97, - 16, 185, 64, 242, 4, 67, 33, 224, 255, 247, 144, 255, 40, 70, 57, 70, - 192, 34, 9, 240, 19, 223, 96, 101, 16, 185, 64, 242, 235, 51, 21, 224, - 40, 70, 57, 70, 79, 244, 57, 114, 9, 240, 8, 223, 196, 248, 140, 0, - 16, 185, 79, 244, 123, 115, 9, 224, 40, 70, 57, 70, 196, 34, 9, 240, - 253, 222, 196, 248, 144, 0, 56, 185, 64, 242, 237, 51, 33, 70, 51, 96, - 40, 70, 255, 247, 148, 255, 0, 36, 32, 70, 248, 189, 56, 181, 13, 70, - 4, 70, 0, 40, 0, 240, 231, 128, 208, 248, 24, 21, 57, 177, 40, 70, 79, - 244, 132, 114, 228, 243, 252, 242, 0, 35, 196, 248, 24, 53, 212, 248, - 32, 21, 57, 177, 40, 70, 79, 244, 132, 114, 228, 243, 241, 242, 0, 35, - 196, 248, 32, 53, 212, 248, 180, 20, 57, 177, 40, 70, 64, 242, 172, - 66, 228, 243, 230, 242, 0, 35, 196, 248, 180, 52, 212, 248, 64, 21, - 49, 177, 40, 70, 172, 34, 228, 243, 220, 242, 0, 35, 196, 248, 64, 53, - 212, 248, 108, 18, 41, 177, 40, 70, 9, 240, 27, 222, 0, 35, 196, 248, - 108, 50, 212, 248, 252, 20, 49, 177, 40, 70, 64, 34, 228, 243, 201, - 242, 0, 35, 196, 248, 252, 52, 212, 248, 132, 22, 105, 177, 35, 104, - 91, 177, 219, 105, 75, 177, 155, 105, 12, 34, 1, 51, 90, 67, 40, 70, - 228, 243, 184, 242, 0, 35, 196, 248, 132, 54, 212, 248, 188, 20, 25, - 177, 40, 70, 180, 34, 228, 243, 174, 242, 212, 248, 144, 20, 33, 177, - 40, 70, 79, 244, 174, 98, 228, 243, 166, 242, 212, 248, 88, 22, 49, - 177, 40, 70, 56, 34, 228, 243, 159, 242, 0, 35, 196, 248, 88, 54, 212, - 248, 96, 22, 57, 177, 40, 70, 79, 244, 144, 114, 228, 243, 148, 242, - 0, 35, 196, 248, 96, 54, 212, 248, 248, 23, 49, 177, 40, 70, 16, 34, - 228, 243, 138, 242, 0, 35, 196, 248, 248, 55, 212, 248, 216, 22, 57, - 177, 40, 70, 79, 244, 132, 114, 228, 243, 127, 242, 0, 35, 196, 248, - 216, 54, 212, 248, 224, 22, 49, 177, 40, 70, 36, 34, 228, 243, 117, - 242, 0, 35, 196, 248, 224, 54, 212, 248, 236, 22, 49, 177, 40, 70, 104, - 34, 228, 243, 107, 242, 0, 35, 196, 248, 236, 54, 212, 248, 68, 23, - 49, 177, 40, 70, 236, 34, 228, 243, 97, 242, 0, 35, 196, 248, 68, 55, - 161, 107, 33, 177, 40, 70, 79, 244, 6, 114, 228, 243, 87, 242, 99, 107, - 123, 177, 153, 106, 49, 177, 128, 34, 40, 70, 228, 243, 79, 242, 99, - 107, 0, 34, 154, 98, 40, 70, 97, 107, 44, 34, 228, 243, 71, 242, 0, - 35, 99, 99, 33, 104, 33, 177, 40, 70, 255, 247, 199, 254, 0, 35, 35, - 96, 35, 105, 179, 177, 211, 248, 248, 16, 24, 34, 40, 70, 228, 243, - 54, 242, 35, 105, 0, 34, 217, 111, 195, 248, 248, 32, 25, 177, 40, 70, - 88, 34, 228, 243, 44, 242, 40, 70, 33, 105, 252, 34, 228, 243, 39, 242, - 0, 35, 35, 97, 40, 70, 33, 70, 64, 246, 212, 2, 189, 232, 56, 64, 228, - 243, 29, 178, 56, 189, 45, 233, 240, 65, 22, 70, 64, 246, 212, 2, 5, - 70, 15, 70, 9, 240, 249, 221, 4, 70, 0, 40, 61, 208, 38, 35, 192, 248, - 40, 56, 57, 70, 40, 70, 50, 70, 255, 247, 190, 254, 32, 96, 0, 40, 0, - 240, 26, 129, 144, 75, 4, 96, 27, 104, 57, 70, 192, 248, 156, 48, 252, - 34, 40, 70, 9, 240, 224, 221, 128, 70, 32, 97, 16, 185, 64, 242, 237, - 51, 8, 225, 132, 96, 57, 70, 40, 70, 24, 34, 9, 240, 212, 221, 200, - 248, 248, 0, 192, 177, 40, 70, 57, 70, 88, 34, 212, 248, 16, 128, 9, - 240, 202, 221, 200, 248, 124, 0, 112, 177, 35, 105, 40, 70, 218, 111, - 57, 70, 44, 50, 195, 248, 128, 32, 79, 244, 132, 114, 9, 240, 188, 221, - 196, 248, 24, 5, 48, 185, 2, 224, 64, 242, 238, 51, 227, 224, 64, 242, - 239, 51, 224, 224, 40, 70, 57, 70, 79, 244, 132, 114, 9, 240, 172, 221, - 196, 248, 32, 5, 16, 185, 79, 244, 124, 115, 212, 224, 40, 70, 57, 70, - 64, 242, 172, 66, 9, 240, 160, 221, 196, 248, 180, 4, 16, 185, 64, 242, - 241, 51, 200, 224, 40, 70, 57, 70, 172, 34, 9, 240, 149, 221, 196, 248, - 64, 5, 16, 185, 64, 242, 242, 51, 189, 224, 57, 70, 40, 70, 236, 247, - 3, 255, 1, 70, 196, 248, 108, 2, 16, 185, 64, 242, 243, 51, 178, 224, - 32, 70, 28, 240, 209, 216, 40, 70, 57, 70, 64, 34, 9, 240, 124, 221, - 196, 248, 252, 4, 16, 185, 79, 244, 125, 115, 164, 224, 35, 104, 12, - 34, 219, 105, 40, 70, 155, 105, 57, 70, 1, 51, 90, 67, 9, 240, 108, - 221, 196, 248, 132, 6, 16, 185, 64, 242, 245, 51, 148, 224, 40, 70, - 57, 70, 180, 34, 9, 240, 97, 221, 196, 248, 188, 4, 16, 185, 64, 242, - 246, 51, 137, 224, 40, 70, 57, 70, 79, 244, 174, 98, 9, 240, 85, 221, - 196, 248, 144, 4, 168, 177, 0, 245, 174, 115, 196, 248, 148, 52, 0, - 245, 46, 115, 0, 245, 130, 96, 4, 48, 196, 248, 156, 4, 196, 248, 152, - 52, 40, 70, 57, 70, 56, 34, 9, 240, 64, 221, 196, 248, 88, 6, 48, 185, - 2, 224, 64, 242, 247, 51, 103, 224, 79, 244, 126, 115, 100, 224, 40, - 70, 57, 70, 79, 244, 144, 114, 9, 240, 48, 221, 196, 248, 96, 6, 56, - 177, 40, 70, 57, 70, 16, 34, 9, 240, 40, 221, 196, 248, 248, 7, 16, - 185, 64, 242, 249, 51, 80, 224, 40, 70, 57, 70, 79, 244, 132, 114, 9, - 240, 28, 221, 196, 248, 216, 6, 16, 185, 64, 242, 250, 51, 68, 224, - 40, 70, 57, 70, 36, 34, 9, 240, 17, 221, 196, 248, 224, 6, 16, 185, - 64, 242, 253, 51, 57, 224, 40, 70, 57, 70, 104, 34, 9, 240, 6, 221, - 196, 248, 236, 6, 16, 185, 64, 242, 254, 51, 46, 224, 40, 70, 57, 70, - 236, 34, 9, 240, 251, 220, 196, 248, 68, 7, 16, 185, 64, 242, 255, 51, - 35, 224, 40, 70, 57, 70, 79, 244, 6, 114, 9, 240, 239, 220, 160, 99, - 88, 177, 0, 245, 134, 112, 224, 99, 57, 70, 40, 70, 44, 34, 9, 240, - 229, 220, 128, 70, 96, 99, 48, 185, 2, 224, 64, 242, 1, 67, 12, 224, - 64, 242, 2, 67, 9, 224, 40, 70, 57, 70, 128, 34, 9, 240, 214, 220, 200, - 248, 40, 0, 56, 185, 64, 242, 3, 67, 51, 96, 32, 70, 41, 70, 255, 247, - 220, 253, 0, 36, 32, 70, 189, 232, 240, 129, 188, 38, 0, 0, 112, 181, - 4, 70, 0, 40, 52, 208, 5, 70, 0, 241, 40, 6, 213, 248, 80, 18, 33, 177, - 35, 104, 244, 34, 88, 104, 228, 243, 209, 240, 4, 53, 181, 66, 244, - 209, 161, 107, 105, 177, 148, 248, 163, 51, 27, 177, 35, 104, 152, 104, - 236, 243, 123, 245, 35, 104, 161, 107, 152, 104, 236, 243, 136, 245, - 0, 35, 163, 99, 212, 248, 120, 18, 33, 177, 35, 104, 232, 34, 88, 104, - 228, 243, 182, 240, 35, 104, 34, 70, 24, 104, 6, 73, 1, 240, 220, 217, - 35, 104, 33, 70, 88, 104, 79, 244, 106, 114, 189, 232, 112, 64, 228, - 243, 167, 176, 112, 189, 103, 137, 134, 0, 208, 248, 64, 49, 72, 28, - 24, 191, 131, 248, 156, 19, 80, 28, 131, 248, 158, 19, 131, 248, 159, - 35, 24, 191, 131, 248, 157, 35, 112, 71, 0, 0, 240, 181, 79, 244, 106, - 113, 133, 176, 5, 70, 64, 104, 228, 243, 124, 240, 4, 70, 0, 40, 0, - 240, 198, 128, 0, 33, 79, 244, 106, 114, 223, 243, 43, 242, 37, 96, - 104, 104, 232, 33, 228, 243, 110, 240, 196, 248, 120, 2, 0, 40, 0, 240, - 169, 128, 0, 33, 232, 34, 223, 243, 29, 242, 32, 32, 132, 248, 162, - 3, 8, 33, 79, 244, 122, 112, 225, 116, 33, 117, 96, 134, 6, 33, 200, - 32, 1, 35, 0, 34, 132, 248, 39, 16, 160, 134, 255, 33, 5, 38, 2, 32, - 39, 104, 163, 114, 99, 115, 163, 115, 227, 115, 132, 248, 148, 51, 132, - 248, 149, 51, 132, 248, 150, 51, 132, 248, 151, 51, 132, 248, 152, 51, - 132, 248, 153, 51, 132, 248, 154, 51, 132, 248, 155, 51, 163, 116, 132, - 248, 40, 16, 34, 116, 98, 116, 34, 115, 226, 114, 132, 248, 41, 96, - 132, 248, 42, 32, 132, 248, 43, 0, 63, 104, 151, 248, 161, 112, 132, - 248, 158, 19, 159, 66, 12, 191, 31, 70, 3, 39, 132, 248, 159, 19, 79, - 244, 0, 97, 132, 248, 44, 112, 225, 99, 132, 248, 45, 48, 102, 117, - 160, 117, 35, 70, 5, 33, 2, 32, 1, 50, 217, 117, 216, 119, 1, 51, 8, - 42, 247, 209, 0, 39, 1, 38, 32, 70, 132, 248, 46, 112, 132, 248, 47, - 96, 9, 240, 228, 222, 32, 70, 133, 248, 195, 100, 11, 240, 255, 220, - 4, 33, 40, 70, 42, 74, 42, 75, 0, 151, 1, 148, 5, 240, 35, 255, 184, - 66, 96, 96, 57, 219, 39, 75, 40, 104, 0, 147, 39, 75, 39, 73, 1, 147, - 39, 75, 40, 74, 3, 147, 35, 70, 2, 151, 1, 240, 241, 216, 7, 70, 80, - 187, 168, 104, 36, 73, 34, 70, 59, 70, 236, 243, 217, 244, 160, 99, - 16, 179, 34, 75, 132, 248, 124, 98, 26, 29, 7, 202, 27, 104, 141, 232, - 7, 0, 34, 70, 40, 70, 6, 33, 7, 240, 164, 223, 255, 35, 132, 248, 161, - 51, 43, 104, 32, 70, 147, 248, 66, 16, 12, 240, 39, 221, 200, 35, 196, - 248, 224, 50, 32, 70, 11, 240, 7, 223, 32, 70, 49, 70, 237, 247, 238, - 248, 132, 248, 163, 115, 13, 224, 212, 248, 120, 18, 25, 177, 104, 104, - 232, 34, 227, 243, 201, 247, 33, 70, 104, 104, 79, 244, 106, 114, 227, - 243, 195, 247, 0, 36, 32, 70, 5, 176, 240, 189, 0, 191, 149, 203, 130, - 0, 29, 203, 130, 0, 69, 207, 130, 0, 29, 141, 0, 0, 160, 224, 133, 0, - 121, 217, 130, 0, 103, 137, 134, 0, 217, 139, 0, 0, 220, 189, 1, 0, - 112, 181, 10, 75, 134, 176, 13, 70, 108, 70, 3, 241, 24, 6, 24, 104, - 89, 104, 34, 70, 3, 194, 8, 51, 179, 66, 20, 70, 247, 209, 40, 70, 105, - 70, 24, 34, 223, 243, 220, 240, 6, 176, 112, 189, 229, 183, 1, 0, 112, - 181, 208, 248, 172, 99, 4, 70, 208, 248, 176, 83, 48, 70, 0, 240, 123, - 248, 212, 248, 208, 19, 176, 104, 236, 243, 60, 244, 176, 104, 212, - 248, 208, 19, 236, 243, 73, 244, 0, 35, 34, 70, 196, 248, 208, 51, 40, - 70, 5, 73, 1, 240, 165, 216, 232, 104, 33, 70, 79, 244, 126, 114, 189, - 232, 112, 64, 227, 243, 113, 183, 0, 191, 171, 153, 134, 0, 45, 233, - 255, 65, 60, 35, 193, 248, 36, 55, 5, 35, 193, 248, 40, 55, 5, 70, 15, - 70, 192, 104, 79, 244, 126, 113, 227, 243, 79, 247, 4, 70, 0, 40, 61, - 208, 0, 33, 79, 244, 126, 114, 79, 240, 0, 8, 223, 243, 253, 240, 196, - 248, 172, 115, 196, 248, 176, 83, 132, 248, 1, 128, 32, 70, 230, 247, - 222, 251, 196, 248, 192, 3, 56, 70, 0, 240, 77, 248, 6, 70, 56, 177, - 33, 70, 232, 104, 79, 244, 126, 114, 227, 243, 63, 247, 68, 70, 30, - 224, 32, 70, 4, 245, 99, 113, 255, 247, 140, 255, 184, 104, 14, 73, - 34, 70, 51, 70, 236, 243, 22, 244, 196, 248, 208, 3, 120, 177, 32, 70, - 15, 240, 154, 220, 9, 75, 40, 70, 0, 147, 9, 75, 9, 73, 1, 147, 9, 74, - 35, 70, 2, 150, 3, 150, 1, 240, 20, 216, 0, 224, 4, 70, 32, 70, 4, 176, - 189, 232, 240, 129, 141, 37, 131, 0, 157, 17, 131, 0, 219, 6, 1, 0, - 188, 190, 1, 0, 171, 153, 134, 0, 56, 181, 208, 248, 48, 87, 4, 70, - 109, 177, 7, 73, 34, 70, 0, 104, 1, 240, 50, 216, 96, 104, 41, 70, 79, - 244, 10, 98, 227, 243, 0, 247, 0, 35, 196, 248, 48, 55, 56, 189, 82, - 158, 134, 0, 240, 181, 79, 244, 10, 97, 133, 176, 4, 70, 64, 104, 227, - 243, 226, 246, 5, 70, 32, 185, 196, 248, 48, 7, 79, 240, 255, 48, 212, - 224, 0, 33, 79, 244, 10, 98, 223, 243, 142, 240, 34, 104, 5, 241, 32, - 3, 43, 96, 0, 38, 8, 35, 107, 97, 46, 97, 220, 33, 19, 102, 32, 70, - 99, 74, 99, 75, 0, 150, 1, 148, 5, 240, 235, 253, 176, 66, 168, 97, - 5, 218, 32, 70, 255, 247, 191, 255, 111, 240, 1, 0, 181, 224, 93, 75, - 0, 34, 67, 248, 4, 43, 242, 7, 31, 213, 91, 73, 1, 39, 10, 120, 13, - 42, 7, 250, 2, 254, 3, 220, 210, 25, 23, 250, 2, 240, 1, 224, 79, 244, - 0, 64, 202, 120, 1, 33, 17, 250, 2, 247, 13, 42, 71, 234, 14, 7, 71, - 234, 0, 0, 3, 220, 82, 24, 17, 250, 2, 242, 1, 224, 79, 244, 0, 66, - 2, 67, 67, 248, 4, 44, 176, 7, 35, 213, 74, 73, 1, 39, 74, 120, 83, - 248, 4, 236, 13, 42, 7, 250, 2, 252, 3, 220, 210, 25, 23, 250, 2, 240, - 1, 224, 79, 244, 0, 64, 138, 120, 1, 33, 17, 250, 2, 247, 13, 42, 71, - 234, 12, 7, 71, 234, 0, 0, 3, 220, 82, 24, 17, 250, 2, 242, 1, 224, - 79, 244, 0, 66, 2, 67, 66, 234, 14, 2, 67, 248, 4, 44, 113, 7, 35, 213, - 55, 73, 1, 39, 10, 121, 83, 248, 4, 236, 13, 42, 7, 250, 2, 252, 3, - 220, 210, 25, 23, 250, 2, 240, 1, 224, 79, 244, 0, 64, 74, 121, 1, 33, - 17, 250, 2, 247, 13, 42, 71, 234, 12, 7, 71, 234, 0, 0, 3, 220, 82, - 24, 17, 250, 2, 242, 1, 224, 79, 244, 0, 66, 2, 67, 66, 234, 14, 2, - 67, 248, 4, 44, 50, 7, 35, 213, 36, 73, 1, 39, 138, 121, 83, 248, 4, - 236, 13, 42, 7, 250, 2, 252, 3, 220, 210, 25, 23, 250, 2, 240, 1, 224, - 79, 244, 0, 64, 202, 121, 1, 33, 17, 250, 2, 247, 13, 42, 71, 234, 12, - 7, 71, 234, 0, 0, 3, 220, 82, 24, 17, 250, 2, 242, 1, 224, 79, 244, - 0, 66, 2, 67, 66, 234, 14, 2, 67, 248, 4, 44, 1, 54, 16, 46, 127, 244, - 101, 175, 17, 75, 0, 38, 3, 147, 49, 70, 16, 74, 35, 70, 32, 104, 0, - 150, 1, 150, 2, 150, 0, 240, 24, 223, 13, 75, 26, 29, 7, 202, 27, 104, - 141, 232, 7, 0, 32, 70, 3, 33, 34, 70, 7, 240, 215, 221, 196, 248, 48, - 87, 48, 70, 5, 176, 240, 189, 1, 87, 131, 0, 161, 86, 131, 0, 132, 39, - 0, 0, 144, 224, 133, 0, 157, 80, 131, 0, 82, 158, 134, 0, 12, 192, 1, - 0, 48, 181, 140, 137, 66, 242, 86, 5, 172, 66, 8, 216, 66, 242, 85, - 5, 172, 66, 35, 210, 66, 242, 80, 5, 172, 66, 47, 209, 8, 224, 66, 242, - 96, 1, 140, 66, 31, 208, 78, 242, 245, 65, 140, 66, 38, 209, 31, 224, - 201, 137, 1, 41, 4, 209, 111, 240, 59, 1, 17, 96, 15, 33, 3, 224, 111, - 240, 69, 1, 17, 96, 20, 33, 25, 96, 3, 104, 211, 248, 128, 48, 219, - 4, 24, 213, 19, 104, 2, 59, 19, 96, 48, 189, 111, 240, 74, 1, 17, 96, - 20, 34, 8, 224, 111, 240, 74, 1, 17, 96, 15, 34, 3, 224, 111, 240, 149, - 1, 17, 96, 150, 34, 26, 96, 48, 189, 111, 240, 74, 1, 17, 96, 20, 34, - 26, 96, 48, 189, 56, 181, 4, 70, 6, 37, 224, 104, 32, 177, 4, 75, 27, - 104, 152, 71, 0, 35, 227, 96, 4, 52, 1, 61, 245, 209, 56, 189, 224, - 166, 133, 0, 67, 108, 31, 43, 5, 216, 79, 240, 0, 112, 24, 65, 0, 240, - 1, 0, 112, 71, 0, 32, 112, 71, 1, 110, 176, 248, 74, 48, 16, 181, 138, - 106, 179, 177, 255, 43, 22, 217, 24, 11, 1, 56, 1, 40, 20, 216, 3, 244, - 112, 96, 0, 10, 9, 40, 15, 216, 120, 177, 3, 240, 240, 0, 144, 40, 10, - 216, 3, 240, 15, 0, 9, 40, 140, 191, 0, 32, 1, 32, 4, 224, 24, 70, 2, - 224, 1, 32, 0, 224, 0, 32, 204, 106, 65, 242, 228, 65, 140, 66, 21, - 209, 162, 245, 130, 97, 7, 57, 1, 41, 3, 216, 63, 43, 152, 191, 0, 32, - 16, 189, 64, 242, 12, 65, 138, 66, 7, 208, 64, 242, 33, 65, 138, 66, - 4, 209, 80, 43, 152, 191, 0, 32, 16, 189, 0, 32, 16, 189, 195, 110, - 79, 240, 64, 112, 48, 181, 195, 248, 96, 1, 0, 32, 28, 224, 17, 248, - 3, 76, 17, 248, 4, 92, 36, 4, 68, 234, 5, 100, 17, 248, 1, 92, 7, 48, - 44, 67, 17, 248, 2, 92, 68, 234, 5, 36, 195, 248, 100, 65, 17, 248, - 6, 76, 17, 248, 7, 92, 36, 2, 68, 234, 5, 68, 17, 248, 5, 92, 44, 67, - 195, 248, 100, 65, 7, 49, 144, 66, 223, 211, 48, 189, 144, 248, 94, - 48, 16, 181, 4, 70, 59, 185, 4, 75, 4, 73, 26, 104, 255, 247, 205, 255, - 1, 35, 132, 248, 94, 48, 16, 189, 60, 176, 2, 0, 64, 176, 2, 0, 208, - 248, 80, 24, 16, 181, 4, 70, 65, 177, 208, 248, 76, 40, 64, 104, 146, - 0, 227, 243, 35, 245, 0, 35, 196, 248, 80, 56, 212, 248, 72, 24, 89, - 177, 96, 104, 223, 243, 118, 244, 96, 104, 212, 248, 72, 24, 232, 34, - 227, 243, 20, 245, 0, 35, 196, 248, 72, 56, 16, 189, 45, 233, 240, 79, - 3, 104, 4, 105, 139, 176, 222, 105, 130, 70, 227, 107, 23, 70, 8, 168, - 8, 33, 104, 74, 222, 243, 238, 246, 227, 104, 0, 43, 64, 240, 190, 128, - 225, 110, 32, 110, 1, 245, 0, 113, 212, 248, 0, 144, 225, 243, 210, - 242, 163, 104, 1, 70, 152, 104, 236, 243, 107, 241, 0, 40, 0, 240, 183, - 128, 34, 110, 225, 110, 23, 177, 1, 245, 0, 115, 0, 224, 59, 70, 1, - 245, 8, 113, 7, 177, 55, 104, 141, 232, 130, 0, 113, 104, 79, 240, 255, - 55, 2, 145, 177, 104, 4, 151, 3, 145, 241, 104, 223, 248, 84, 129, 5, - 145, 161, 104, 72, 70, 209, 248, 40, 24, 205, 248, 28, 128, 6, 145, - 8, 169, 236, 247, 244, 253, 0, 37, 224, 96, 227, 110, 0, 149, 50, 104, - 2, 149, 1, 146, 3, 149, 4, 151, 5, 149, 6, 149, 205, 248, 28, 128, 131, - 70, 8, 169, 34, 110, 3, 245, 16, 115, 72, 70, 236, 247, 223, 253, 227, - 110, 32, 97, 0, 149, 50, 104, 197, 235, 11, 14, 222, 241, 0, 11, 75, - 235, 14, 11, 1, 146, 2, 149, 3, 149, 4, 151, 5, 149, 6, 149, 205, 248, - 28, 128, 168, 66, 8, 191, 75, 240, 1, 11, 8, 169, 34, 110, 3, 245, 32, - 115, 72, 70, 236, 247, 194, 253, 227, 110, 96, 97, 0, 149, 50, 104, - 2, 149, 1, 146, 3, 149, 4, 151, 5, 149, 6, 149, 205, 248, 28, 128, 168, - 66, 8, 191, 75, 240, 1, 11, 8, 169, 34, 110, 3, 245, 48, 115, 72, 70, - 236, 247, 171, 253, 227, 110, 160, 97, 0, 149, 50, 104, 2, 149, 1, 146, - 3, 149, 4, 151, 5, 149, 6, 149, 205, 248, 28, 128, 168, 66, 8, 191, - 75, 240, 1, 11, 8, 169, 34, 110, 3, 245, 64, 115, 72, 70, 236, 247, - 148, 253, 227, 110, 224, 97, 0, 149, 50, 104, 2, 149, 1, 146, 3, 149, - 4, 151, 5, 149, 6, 149, 205, 248, 28, 128, 168, 66, 8, 191, 75, 240, - 1, 11, 8, 169, 72, 70, 34, 110, 3, 245, 80, 115, 236, 247, 125, 253, - 32, 98, 168, 66, 20, 191, 88, 70, 75, 240, 1, 0, 168, 185, 37, 70, 6, - 38, 232, 104, 48, 177, 11, 75, 12, 73, 211, 248, 132, 48, 152, 71, 197, - 248, 160, 0, 4, 53, 1, 62, 243, 209, 161, 111, 80, 70, 8, 49, 0, 34, - 230, 247, 38, 254, 1, 32, 0, 224, 40, 70, 11, 176, 189, 232, 240, 143, - 251, 65, 134, 0, 224, 166, 133, 0, 195, 38, 134, 0, 20, 38, 0, 0, 31, - 181, 2, 35, 3, 147, 14, 35, 4, 70, 192, 248, 76, 56, 56, 33, 64, 104, - 227, 243, 17, 244, 196, 248, 80, 8, 208, 177, 212, 248, 76, 40, 0, 33, - 146, 0, 222, 243, 192, 245, 96, 104, 232, 33, 227, 243, 4, 244, 196, - 248, 72, 8, 104, 177, 0, 33, 232, 34, 222, 243, 181, 245, 1, 35, 0, - 147, 96, 104, 212, 248, 72, 24, 3, 170, 180, 35, 223, 243, 248, 243, - 1, 224, 79, 240, 255, 48, 4, 176, 16, 189, 0, 0, 131, 104, 11, 74, 90, - 98, 0, 35, 128, 248, 134, 48, 3, 35, 160, 248, 140, 48, 2, 35, 160, - 248, 142, 48, 7, 35, 160, 248, 136, 48, 4, 35, 160, 248, 138, 48, 66, - 246, 1, 51, 160, 248, 156, 48, 112, 71, 0, 191, 100, 168, 231, 190, - 112, 181, 4, 105, 5, 70, 32, 110, 8, 177, 233, 247, 133, 252, 32, 70, - 255, 247, 24, 254, 166, 111, 112, 106, 24, 177, 3, 240, 191, 255, 0, - 35, 115, 98, 96, 111, 3, 240, 224, 253, 32, 111, 5, 240, 136, 249, 97, - 110, 41, 177, 32, 104, 162, 110, 227, 243, 199, 243, 0, 35, 99, 102, - 32, 110, 24, 177, 3, 240, 79, 248, 0, 35, 35, 102, 32, 70, 230, 247, - 200, 253, 40, 70, 255, 247, 139, 254, 0, 32, 112, 189, 0, 0, 195, 110, - 79, 244, 128, 50, 16, 181, 195, 248, 96, 33, 211, 248, 96, 17, 211, - 248, 100, 65, 195, 248, 96, 33, 211, 248, 96, 17, 25, 73, 195, 248, - 100, 17, 195, 248, 96, 33, 211, 248, 96, 1, 211, 248, 100, 1, 136, 66, - 35, 209, 195, 248, 96, 33, 211, 248, 96, 17, 19, 73, 195, 248, 100, - 17, 195, 248, 96, 33, 211, 248, 96, 1, 211, 248, 100, 1, 136, 66, 79, - 240, 0, 0, 21, 209, 195, 248, 96, 33, 211, 248, 96, 33, 195, 248, 100, - 65, 195, 248, 140, 1, 211, 248, 32, 49, 179, 241, 4, 47, 7, 208, 7, - 72, 27, 26, 88, 66, 64, 235, 3, 0, 16, 189, 0, 32, 16, 189, 1, 32, 16, - 189, 0, 191, 170, 85, 85, 170, 85, 170, 170, 85, 0, 4, 0, 132, 45, 233, - 240, 79, 4, 105, 155, 70, 227, 99, 227, 111, 151, 176, 221, 248, 132, - 160, 163, 103, 157, 248, 128, 48, 160, 96, 35, 113, 5, 70, 196, 248, - 0, 160, 32, 70, 22, 70, 15, 70, 255, 247, 90, 255, 36, 155, 48, 70, - 0, 147, 4, 241, 100, 3, 1, 147, 4, 241, 104, 3, 2, 147, 81, 70, 34, - 154, 35, 155, 3, 240, 96, 249, 32, 102, 0, 40, 0, 240, 207, 129, 212, - 248, 100, 128, 129, 73, 64, 70, 223, 243, 176, 241, 32, 177, 0, 33, - 10, 70, 223, 243, 107, 240, 135, 178, 64, 70, 125, 73, 223, 243, 166, - 241, 72, 177, 0, 33, 10, 70, 223, 243, 97, 240, 79, 246, 255, 115, 128, - 178, 152, 66, 24, 191, 6, 70, 56, 70, 49, 70, 254, 247, 111, 250, 0, - 40, 0, 240, 175, 129, 64, 246, 18, 1, 0, 34, 164, 248, 64, 112, 164, - 248, 66, 96, 32, 110, 231, 243, 160, 245, 224, 102, 32, 110, 231, 243, - 238, 243, 212, 248, 108, 144, 96, 100, 197, 248, 12, 144, 32, 70, 255, - 247, 92, 253, 0, 40, 0, 240, 152, 129, 32, 110, 233, 247, 13, 252, 32, - 70, 0, 33, 24, 240, 248, 218, 32, 70, 79, 240, 255, 49, 230, 247, 147, - 253, 32, 70, 255, 247, 70, 255, 0, 40, 0, 240, 136, 129, 64, 70, 93, - 73, 223, 243, 57, 241, 255, 40, 8, 191, 1, 32, 164, 248, 74, 0, 32, - 70, 255, 247, 70, 253, 0, 40, 0, 240, 123, 129, 87, 73, 64, 70, 223, - 243, 42, 241, 86, 73, 132, 248, 72, 0, 64, 70, 223, 243, 36, 241, 84, - 73, 224, 100, 64, 70, 223, 243, 31, 241, 35, 110, 65, 242, 107, 2, 217, - 106, 32, 101, 145, 66, 10, 209, 155, 106, 78, 43, 7, 209, 180, 248, - 74, 48, 64, 43, 3, 217, 227, 108, 67, 240, 2, 3, 227, 100, 227, 108, - 153, 6, 4, 213, 1, 33, 32, 70, 10, 70, 25, 240, 107, 222, 180, 248, - 66, 32, 1, 35, 196, 248, 152, 48, 180, 248, 64, 0, 43, 104, 165, 248, - 130, 33, 34, 110, 165, 248, 128, 1, 26, 97, 98, 108, 154, 96, 148, 248, - 72, 32, 131, 248, 124, 32, 43, 104, 226, 108, 180, 248, 74, 0, 195, - 248, 128, 32, 34, 109, 163, 248, 122, 0, 195, 248, 132, 32, 212, 248, - 152, 32, 32, 70, 90, 98, 169, 104, 42, 70, 5, 240, 66, 248, 32, 103, - 0, 40, 0, 240, 41, 129, 98, 108, 35, 110, 8, 146, 180, 248, 64, 32, - 6, 144, 173, 248, 48, 32, 154, 107, 180, 248, 66, 0, 13, 146, 218, 107, - 5, 147, 14, 146, 26, 108, 173, 248, 50, 0, 15, 146, 148, 248, 72, 32, - 4, 168, 16, 146, 154, 106, 205, 248, 16, 160, 17, 146, 180, 248, 74, - 32, 205, 248, 28, 176, 18, 146, 218, 106, 205, 248, 44, 128, 19, 146, - 226, 108, 20, 146, 34, 109, 21, 146, 90, 104, 219, 104, 9, 146, 10, - 147, 3, 240, 58, 252, 96, 103, 0, 40, 0, 240, 249, 128, 180, 248, 66, - 48, 68, 242, 29, 50, 147, 66, 41, 208, 10, 216, 68, 242, 22, 50, 147, - 66, 36, 208, 68, 242, 26, 50, 147, 66, 32, 208, 68, 242, 19, 50, 13, - 224, 68, 242, 42, 50, 147, 66, 25, 208, 2, 216, 68, 242, 33, 50, 5, - 224, 68, 242, 45, 50, 147, 66, 17, 208, 68, 242, 82, 50, 147, 66, 13, - 208, 0, 38, 12, 224, 209, 173, 134, 0, 72, 55, 134, 0, 132, 174, 134, - 0, 229, 174, 134, 0, 134, 55, 134, 0, 158, 121, 134, 0, 1, 38, 49, 70, - 32, 70, 230, 247, 91, 252, 163, 111, 0, 46, 12, 191, 2, 34, 1, 34, 26, - 96, 94, 96, 43, 107, 32, 110, 131, 232, 68, 0, 239, 106, 231, 243, 231, - 242, 217, 248, 92, 49, 56, 96, 98, 74, 99, 101, 163, 101, 99, 108, 6, - 33, 1, 251, 3, 35, 167, 111, 24, 59, 196, 248, 184, 48, 96, 111, 73, - 70, 58, 104, 67, 70, 3, 240, 101, 252, 120, 98, 0, 40, 0, 240, 160, - 128, 163, 111, 97, 109, 88, 106, 238, 247, 15, 249, 163, 111, 3, 241, - 34, 2, 0, 146, 3, 241, 28, 1, 3, 241, 30, 2, 88, 106, 32, 51, 3, 240, - 15, 252, 167, 111, 120, 106, 3, 240, 27, 252, 135, 248, 40, 0, 163, - 111, 47, 107, 88, 106, 3, 240, 20, 252, 56, 117, 167, 111, 120, 106, - 3, 240, 18, 252, 163, 111, 184, 97, 218, 139, 3, 42, 123, 209, 41, 107, - 88, 106, 8, 97, 152, 139, 74, 129, 8, 129, 26, 140, 88, 140, 138, 129, - 200, 129, 15, 34, 64, 242, 255, 48, 154, 130, 216, 130, 49, 70, 40, - 70, 1, 34, 255, 247, 191, 252, 0, 40, 103, 208, 162, 111, 43, 104, 80, - 106, 147, 248, 153, 16, 238, 247, 212, 248, 0, 33, 32, 70, 24, 240, - 158, 222, 8, 33, 32, 70, 230, 247, 206, 253, 32, 70, 26, 240, 207, 217, - 0, 149, 32, 110, 49, 73, 49, 74, 0, 35, 231, 243, 246, 243, 32, 70, - 0, 33, 26, 240, 166, 217, 32, 70, 230, 247, 135, 251, 0, 40, 71, 208, - 4, 241, 220, 5, 41, 70, 222, 243, 10, 246, 40, 70, 222, 243, 199, 247, - 0, 40, 63, 209, 40, 70, 222, 243, 210, 247, 5, 70, 0, 40, 57, 209, 32, - 70, 23, 240, 212, 223, 163, 104, 27, 104, 211, 248, 156, 0, 0, 40, 52, - 208, 3, 120, 0, 43, 47, 208, 30, 73, 34, 70, 223, 243, 211, 240, 163, - 104, 28, 73, 27, 104, 34, 70, 211, 248, 156, 0, 223, 243, 5, 241, 160, - 104, 255, 247, 84, 253, 224, 104, 0, 179, 163, 104, 27, 104, 211, 248, - 156, 16, 225, 243, 248, 240, 26, 224, 11, 37, 24, 224, 12, 37, 22, 224, - 13, 37, 20, 224, 14, 37, 18, 224, 15, 37, 16, 224, 25, 37, 14, 224, - 16, 37, 12, 224, 17, 37, 10, 224, 18, 37, 8, 224, 19, 37, 6, 224, 21, - 37, 4, 224, 22, 37, 2, 224, 29, 70, 0, 224, 5, 70, 40, 70, 23, 176, - 189, 232, 240, 143, 36, 255, 1, 0, 105, 193, 131, 0, 133, 193, 131, - 0, 37, 192, 131, 0, 73, 192, 131, 0, 16, 181, 4, 70, 27, 240, 146, 222, - 1, 34, 1, 70, 32, 70, 189, 232, 16, 64, 27, 240, 3, 159, 55, 181, 5, - 70, 27, 240, 135, 222, 0, 35, 197, 248, 76, 2, 128, 248, 72, 48, 42, - 104, 4, 70, 146, 248, 47, 16, 40, 70, 0, 145, 78, 50, 33, 70, 26, 240, - 38, 220, 56, 177, 40, 70, 33, 70, 27, 240, 207, 220, 79, 240, 255, 48, - 3, 176, 48, 189, 40, 70, 33, 70, 3, 176, 189, 232, 48, 64, 27, 240, - 106, 157, 55, 181, 4, 70, 0, 40, 69, 208, 208, 248, 32, 17, 49, 177, - 3, 104, 152, 104, 235, 243, 221, 245, 0, 35, 196, 248, 32, 49, 35, 104, - 26, 104, 146, 248, 47, 32, 42, 179, 211, 248, 0, 5, 1, 169, 49, 240, - 250, 218, 18, 224, 67, 104, 90, 6, 15, 213, 212, 248, 44, 81, 69, 25, - 7, 224, 11, 104, 72, 34, 197, 248, 16, 49, 35, 104, 88, 104, 227, 243, - 248, 240, 213, 248, 16, 17, 0, 41, 243, 209, 1, 168, 49, 240, 235, 218, - 0, 40, 231, 209, 6, 224, 10, 104, 88, 104, 196, 248, 64, 33, 72, 34, - 227, 243, 231, 240, 212, 248, 64, 17, 35, 104, 0, 41, 243, 209, 24, - 104, 6, 73, 34, 70, 0, 240, 9, 218, 35, 104, 33, 70, 88, 104, 79, 244, - 164, 114, 227, 243, 214, 240, 62, 189, 0, 191, 145, 186, 134, 0, 127, - 181, 5, 70, 79, 244, 164, 113, 64, 104, 227, 243, 187, 240, 4, 70, 0, - 40, 85, 208, 0, 33, 79, 244, 164, 114, 222, 243, 107, 242, 42, 75, 37, - 96, 0, 147, 41, 75, 0, 38, 1, 147, 41, 75, 40, 104, 3, 147, 40, 73, - 41, 74, 35, 70, 2, 150, 0, 240, 168, 217, 43, 107, 26, 104, 2, 42, 5, - 209, 91, 125, 0, 43, 12, 191, 22, 35, 48, 35, 0, 224, 48, 35, 162, 25, - 68, 54, 182, 245, 136, 127, 19, 116, 238, 209, 168, 104, 30, 73, 42, - 70, 0, 35, 235, 243, 129, 245, 6, 70, 196, 248, 32, 1, 48, 185, 104, - 104, 33, 70, 79, 244, 164, 114, 227, 243, 147, 240, 30, 224, 79, 244, - 150, 115, 196, 248, 28, 49, 69, 242, 115, 83, 164, 248, 56, 49, 70, - 35, 164, 248, 58, 49, 18, 75, 0, 38, 196, 248, 64, 97, 40, 70, 141, - 232, 40, 0, 79, 244, 138, 113, 14, 74, 15, 75, 4, 240, 144, 255, 176, - 66, 196, 248, 44, 1, 3, 218, 32, 70, 255, 247, 83, 255, 52, 70, 32, - 70, 4, 176, 112, 189, 0, 191, 249, 12, 132, 0, 85, 3, 1, 0, 125, 10, - 132, 0, 112, 227, 133, 0, 145, 186, 134, 0, 61, 6, 132, 0, 217, 18, - 132, 0, 229, 18, 132, 0, 165, 18, 132, 0, 1, 70, 32, 177, 3, 104, 176, - 34, 216, 104, 227, 243, 85, 176, 112, 71, 247, 181, 6, 104, 5, 70, 176, - 33, 240, 104, 227, 243, 61, 240, 4, 70, 0, 40, 0, 240, 135, 128, 0, - 33, 176, 34, 222, 243, 237, 241, 4, 34, 38, 96, 101, 96, 0, 33, 197, - 248, 92, 65, 1, 168, 222, 243, 228, 241, 43, 104, 147, 248, 124, 32, - 88, 105, 1, 42, 6, 217, 58, 73, 222, 243, 163, 246, 1, 70, 136, 177, - 1, 168, 9, 224, 56, 73, 222, 243, 112, 246, 9, 40, 3, 70, 9, 216, 54, - 73, 1, 168, 1, 235, 131, 1, 3, 34, 222, 243, 130, 242, 0, 35, 141, 248, - 7, 48, 3, 34, 1, 169, 4, 241, 8, 0, 222, 243, 121, 242, 0, 35, 227, - 114, 43, 104, 45, 73, 88, 105, 222, 243, 86, 246, 51, 105, 65, 242, - 107, 2, 217, 106, 224, 96, 145, 66, 12, 209, 155, 106, 139, 43, 9, 209, - 2, 40, 7, 209, 1, 168, 38, 73, 4, 34, 222, 243, 65, 242, 8, 185, 3, - 35, 227, 96, 51, 105, 65, 242, 107, 2, 217, 106, 145, 66, 13, 209, 155, - 106, 147, 43, 10, 209, 1, 168, 30, 73, 4, 34, 222, 243, 48, 242, 32, - 185, 227, 104, 4, 43, 1, 209, 6, 35, 227, 96, 40, 70, 1, 169, 33, 240, - 150, 221, 6, 70, 80, 185, 23, 73, 1, 168, 3, 34, 222, 243, 63, 242, - 40, 70, 1, 169, 141, 248, 7, 96, 33, 240, 137, 221, 5, 245, 170, 103, - 1, 169, 3, 34, 0, 38, 7, 241, 10, 0, 222, 243, 48, 242, 14, 73, 133, - 248, 93, 101, 7, 241, 14, 0, 3, 34, 222, 243, 40, 242, 133, 248, 97, - 101, 32, 70, 1, 169, 34, 240, 252, 217, 32, 70, 254, 189, 179, 196, - 134, 0, 185, 196, 134, 0, 206, 2, 134, 0, 188, 196, 134, 0, 195, 196, - 134, 0, 113, 194, 134, 0, 198, 196, 134, 0, 202, 196, 134, 0, 48, 181, - 44, 33, 133, 176, 5, 70, 64, 104, 226, 243, 153, 247, 4, 70, 184, 177, - 0, 33, 44, 34, 222, 243, 75, 241, 8, 35, 163, 97, 10, 75, 37, 96, 0, - 147, 0, 35, 1, 147, 2, 147, 3, 147, 7, 74, 35, 70, 40, 104, 7, 73, 0, - 240, 136, 216, 42, 104, 1, 35, 130, 248, 150, 48, 35, 113, 32, 70, 5, - 176, 48, 189, 5, 11, 133, 0, 145, 230, 134, 0, 84, 200, 1, 0, 56, 181, - 4, 70, 0, 40, 40, 208, 3, 104, 20, 73, 24, 104, 34, 70, 0, 240, 168, - 216, 99, 105, 5, 224, 29, 104, 89, 104, 32, 70, 44, 240, 139, 221, 43, - 70, 0, 43, 247, 209, 35, 105, 5, 224, 29, 104, 89, 104, 32, 70, 44, - 240, 129, 221, 43, 70, 0, 43, 247, 209, 161, 106, 33, 177, 35, 104, - 144, 34, 88, 104, 226, 243, 97, 247, 35, 104, 33, 70, 88, 104, 44, 34, - 189, 232, 56, 64, 226, 243, 89, 183, 56, 189, 145, 230, 134, 0, 45, - 233, 248, 67, 5, 70, 136, 70, 231, 243, 82, 241, 0, 33, 40, 70, 231, - 243, 228, 241, 4, 70, 40, 70, 110, 105, 175, 105, 232, 247, 34, 254, - 10, 46, 129, 70, 22, 217, 15, 46, 22, 208, 40, 70, 233, 247, 47, 248, - 20, 46, 5, 70, 3, 217, 163, 104, 35, 240, 8, 3, 163, 96, 163, 104, 20, - 46, 67, 240, 1, 3, 163, 96, 20, 217, 163, 104, 67, 240, 8, 3, 163, 96, - 15, 224, 2, 46, 15, 217, 40, 70, 232, 247, 243, 255, 212, 248, 164, - 48, 5, 70, 35, 240, 255, 3, 67, 240, 2, 3, 196, 248, 164, 48, 2, 35, - 3, 224, 1, 35, 1, 224, 16, 77, 48, 35, 162, 104, 210, 7, 7, 212, 7, - 240, 24, 2, 8, 42, 12, 191, 181, 251, 243, 245, 79, 244, 225, 21, 7, - 240, 3, 7, 0, 38, 11, 224, 4, 245, 64, 115, 184, 241, 0, 15, 5, 208, - 48, 2, 24, 24, 73, 70, 42, 70, 0, 35, 192, 71, 1, 54, 190, 66, 241, - 219, 189, 232, 248, 131, 0, 191, 0, 198, 62, 5, 45, 233, 240, 65, 22, - 70, 152, 70, 4, 70, 13, 70, 230, 243, 180, 247, 0, 33, 7, 70, 32, 70, - 231, 243, 129, 241, 0, 34, 19, 70, 17, 73, 1, 235, 2, 14, 222, 248, - 4, 224, 190, 241, 0, 15, 13, 209, 12, 34, 83, 67, 202, 24, 206, 80, - 67, 106, 85, 96, 30, 67, 10, 75, 194, 248, 8, 128, 30, 96, 70, 98, 1, - 37, 4, 224, 1, 51, 12, 50, 5, 43, 229, 209, 0, 37, 32, 70, 57, 70, 231, - 243, 96, 241, 40, 70, 189, 232, 240, 129, 0, 191, 60, 38, 0, 0, 120, - 38, 0, 0, 67, 105, 20, 43, 1, 221, 2, 240, 31, 189, 112, 71, 19, 75, - 19, 181, 19, 96, 19, 70, 1, 224, 17, 76, 28, 96, 4, 51, 173, 241, 124, - 4, 163, 66, 248, 211, 3, 48, 32, 240, 3, 0, 13, 75, 9, 26, 13, 76, 25, - 96, 0, 35, 35, 96, 12, 76, 8, 57, 35, 96, 11, 76, 128, 232, 10, 0, 35, - 96, 10, 76, 34, 96, 10, 76, 2, 245, 160, 82, 34, 96, 9, 74, 19, 96, - 9, 75, 88, 96, 28, 189, 0, 191, 75, 65, 84, 83, 200, 38, 0, 0, 136, - 38, 0, 0, 164, 38, 0, 0, 204, 38, 0, 0, 228, 8, 2, 0, 232, 8, 2, 0, - 144, 38, 0, 0, 192, 38, 0, 0, 31, 181, 232, 32, 0, 33, 226, 243, 9, - 242, 12, 76, 32, 96, 160, 177, 0, 33, 232, 34, 222, 243, 28, 240, 4, - 170, 1, 35, 66, 248, 4, 61, 0, 35, 0, 147, 6, 75, 33, 104, 24, 104, - 64, 242, 60, 115, 222, 243, 91, 246, 32, 104, 14, 33, 222, 243, 161, - 246, 31, 189, 188, 38, 0, 0, 16, 9, 2, 0, 177, 245, 224, 111, 115, 181, - 4, 70, 14, 70, 21, 70, 6, 209, 3, 105, 0, 145, 0, 33, 1, 145, 30, 104, - 10, 70, 12, 224, 13, 75, 0, 34, 24, 104, 231, 243, 209, 240, 1, 70, - 128, 177, 35, 105, 0, 34, 0, 150, 1, 146, 30, 104, 32, 70, 43, 70, 176, - 71, 56, 177, 6, 75, 160, 97, 26, 104, 101, 97, 34, 98, 28, 96, 0, 32, - 1, 224, 79, 240, 255, 48, 124, 189, 0, 191, 140, 38, 0, 0, 12, 9, 2, - 0, 45, 233, 248, 67, 16, 32, 12, 70, 0, 33, 145, 70, 152, 70, 226, 243, - 181, 241, 5, 70, 0, 179, 18, 78, 48, 104, 230, 243, 231, 246, 9, 155, - 7, 70, 35, 185, 48, 104, 33, 70, 74, 70, 231, 243, 159, 240, 48, 104, - 230, 243, 88, 247, 1, 35, 131, 64, 235, 96, 8, 155, 197, 248, 4, 128, - 171, 96, 8, 75, 48, 104, 26, 104, 57, 70, 42, 96, 29, 96, 231, 243, - 159, 240, 0, 32, 189, 232, 248, 131, 111, 240, 26, 0, 189, 232, 248, - 131, 140, 38, 0, 0, 152, 38, 0, 0, 7, 181, 0, 33, 231, 243, 144, 240, - 7, 75, 79, 244, 0, 97, 24, 96, 6, 75, 0, 245, 112, 96, 24, 96, 0, 32, - 2, 70, 4, 75, 0, 144, 1, 144, 255, 247, 185, 255, 14, 189, 156, 38, - 0, 0, 224, 8, 2, 0, 109, 96, 128, 0, 19, 181, 34, 76, 34, 75, 0, 33, - 28, 34, 32, 70, 1, 147, 221, 243, 129, 247, 1, 35, 35, 96, 31, 75, 27, - 104, 67, 248, 4, 76, 0, 240, 131, 249, 173, 245, 158, 81, 60, 57, 10, - 70, 27, 72, 255, 247, 16, 255, 226, 243, 18, 243, 0, 240, 126, 248, - 0, 32, 2, 240, 183, 249, 23, 75, 23, 76, 24, 96, 2, 240, 172, 251, 32, - 96, 255, 247, 191, 255, 32, 104, 0, 240, 250, 248, 232, 247, 36, 252, - 32, 104, 0, 240, 225, 248, 0, 34, 16, 72, 17, 73, 226, 243, 176, 244, - 0, 34, 16, 72, 16, 73, 226, 243, 171, 244, 16, 73, 0, 34, 16, 72, 226, - 243, 166, 244, 32, 104, 255, 247, 225, 254, 255, 247, 31, 255, 32, 104, - 28, 189, 0, 191, 236, 8, 2, 0, 173, 222, 173, 222, 212, 255, 1, 0, 188, - 54, 3, 0, 16, 9, 2, 0, 140, 38, 0, 0, 216, 31, 134, 0, 169, 197, 0, - 0, 219, 31, 134, 0, 101, 101, 128, 0, 141, 96, 128, 0, 222, 31, 134, - 0, 112, 181, 28, 76, 166, 104, 0, 46, 51, 209, 18, 9, 34, 96, 163, 129, - 2, 245, 97, 66, 79, 244, 225, 51, 146, 251, 243, 245, 160, 96, 97, 96, - 32, 70, 3, 33, 128, 34, 226, 243, 83, 244, 32, 70, 49, 70, 234, 178, - 226, 243, 78, 244, 32, 70, 1, 33, 42, 18, 226, 243, 73, 244, 3, 33, - 32, 70, 10, 70, 226, 243, 68, 244, 1, 33, 32, 70, 10, 70, 226, 243, - 63, 244, 32, 70, 4, 33, 8, 34, 226, 243, 58, 244, 32, 70, 2, 33, 1, - 34, 226, 243, 53, 244, 79, 244, 122, 112, 189, 232, 112, 64, 226, 243, - 127, 178, 112, 189, 20, 9, 2, 0, 56, 181, 164, 32, 0, 33, 226, 243, - 209, 240, 19, 76, 32, 96, 0, 179, 0, 33, 164, 34, 221, 243, 228, 246, - 79, 244, 128, 96, 0, 33, 37, 104, 226, 243, 196, 240, 168, 96, 32, 104, - 133, 104, 45, 185, 226, 243, 36, 240, 37, 96, 79, 240, 255, 48, 56, - 189, 79, 244, 128, 98, 194, 96, 69, 97, 0, 33, 40, 70, 221, 243, 204, - 246, 34, 104, 4, 75, 0, 32, 26, 96, 56, 189, 79, 240, 255, 48, 56, 189, - 36, 9, 2, 0, 212, 38, 0, 0, 112, 181, 27, 77, 4, 70, 43, 104, 51, 185, - 26, 78, 51, 104, 11, 185, 255, 247, 198, 255, 51, 104, 43, 96, 40, 104, - 23, 75, 88, 97, 48, 179, 0, 35, 3, 96, 192, 248, 156, 48, 67, 96, 35, - 108, 14, 59, 1, 43, 3, 217, 32, 70, 17, 73, 255, 247, 165, 253, 17, - 75, 154, 104, 18, 177, 42, 104, 194, 248, 156, 48, 0, 36, 7, 224, 210, - 248, 156, 0, 24, 177, 147, 104, 25, 93, 226, 243, 218, 243, 1, 52, 42, - 104, 19, 105, 156, 66, 243, 211, 8, 72, 8, 73, 226, 243, 229, 243, 1, - 75, 24, 104, 112, 189, 212, 38, 0, 0, 36, 9, 2, 0, 236, 8, 2, 0, 233, - 65, 2, 0, 20, 9, 2, 0, 189, 33, 134, 0, 165, 104, 128, 0, 16, 181, 64, - 34, 0, 35, 6, 73, 4, 70, 255, 247, 213, 253, 5, 75, 0, 34, 32, 70, 154, - 96, 189, 232, 16, 64, 255, 247, 171, 191, 0, 191, 169, 105, 128, 0, - 20, 9, 2, 0, 45, 233, 240, 65, 4, 70, 0, 240, 213, 248, 42, 72, 231, - 247, 158, 255, 32, 70, 232, 247, 145, 251, 40, 75, 40, 74, 195, 24, - 179, 251, 242, 243, 39, 74, 32, 70, 19, 96, 232, 247, 164, 253, 0, 245, - 120, 112, 7, 48, 36, 75, 79, 244, 122, 117, 176, 251, 245, 240, 24, - 96, 35, 106, 34, 73, 0, 43, 64, 242, 255, 51, 200, 191, 111, 240, 127, - 67, 179, 251, 240, 240, 30, 75, 32, 34, 24, 96, 0, 35, 32, 70, 255, - 247, 153, 253, 0, 32, 27, 73, 222, 243, 207, 242, 27, 79, 6, 70, 56, - 96, 248, 177, 32, 70, 232, 247, 98, 251, 182, 251, 240, 248, 168, 241, - 2, 8, 184, 241, 0, 15, 21, 221, 21, 78, 0, 33, 52, 34, 48, 70, 221, - 243, 31, 246, 19, 75, 116, 96, 179, 96, 48, 70, 5, 251, 8, 241, 1, 34, - 225, 243, 240, 246, 40, 177, 57, 104, 32, 70, 189, 232, 240, 65, 224, - 243, 249, 177, 189, 232, 240, 129, 0, 191, 165, 199, 0, 0, 63, 66, 15, - 0, 64, 66, 15, 0, 208, 37, 0, 0, 200, 37, 0, 0, 1, 103, 128, 0, 204, - 37, 0, 0, 14, 202, 1, 0, 232, 38, 0, 0, 44, 9, 2, 0, 229, 102, 128, - 0, 13, 75, 0, 33, 26, 104, 66, 240, 16, 2, 26, 96, 26, 104, 34, 244, - 0, 114, 26, 96, 9, 74, 19, 104, 67, 240, 128, 115, 67, 244, 128, 51, - 19, 96, 7, 75, 7, 34, 26, 96, 67, 248, 4, 28, 89, 104, 90, 96, 4, 75, - 32, 34, 26, 96, 112, 71, 20, 237, 0, 224, 252, 237, 0, 224, 36, 16, - 0, 224, 0, 228, 0, 224, 45, 233, 248, 67, 4, 70, 30, 70, 144, 70, 13, - 70, 230, 243, 36, 246, 32, 70, 230, 243, 229, 244, 65, 70, 50, 70, 7, - 70, 32, 70, 230, 243, 159, 246, 32, 70, 230, 243, 88, 245, 64, 246, - 42, 1, 6, 70, 0, 34, 32, 70, 230, 243, 149, 246, 79, 240, 1, 8, 129, - 70, 133, 177, 8, 250, 6, 245, 131, 105, 51, 234, 5, 5, 2, 209, 64, 70, - 231, 247, 170, 254, 1, 54, 1, 32, 176, 64, 231, 247, 135, 254, 201, - 248, 24, 80, 14, 224, 112, 28, 8, 250, 6, 246, 8, 250, 0, 240, 231, - 247, 155, 254, 64, 70, 231, 247, 122, 254, 217, 248, 24, 48, 30, 67, - 201, 248, 24, 96, 32, 70, 57, 70, 189, 232, 248, 67, 230, 243, 125, - 182, 0, 0, 45, 233, 248, 67, 4, 70, 230, 243, 225, 245, 32, 70, 64, - 246, 14, 1, 0, 34, 230, 243, 95, 246, 5, 70, 0, 40, 47, 208, 7, 104, - 208, 248, 0, 128, 32, 70, 230, 243, 168, 244, 4, 40, 6, 70, 5, 216, - 37, 209, 8, 244, 224, 40, 184, 245, 64, 63, 32, 209, 0, 32, 68, 73, - 222, 243, 7, 242, 216, 185, 7, 240, 240, 7, 63, 9, 15, 224, 1, 63, 7, - 46, 47, 97, 8, 217, 12, 46, 6, 208, 43, 108, 3, 244, 64, 99, 179, 245, - 64, 111, 0, 208, 16, 177, 59, 75, 1, 32, 107, 97, 0, 47, 237, 209, 213, - 248, 232, 49, 35, 240, 16, 3, 197, 248, 232, 49, 0, 34, 64, 246, 42, - 1, 32, 70, 230, 243, 38, 246, 51, 77, 64, 242, 221, 86, 40, 96, 32, - 70, 230, 243, 113, 244, 49, 75, 24, 96, 43, 104, 26, 104, 66, 240, 128, - 114, 26, 96, 26, 104, 66, 240, 2, 2, 26, 96, 0, 34, 195, 248, 224, 33, - 2, 224, 10, 32, 226, 243, 187, 240, 43, 104, 211, 248, 224, 49, 155, - 3, 1, 212, 1, 62, 245, 209, 0, 33, 11, 70, 32, 70, 79, 244, 0, 98, 255, - 247, 79, 255, 0, 33, 11, 70, 32, 70, 64, 246, 18, 2, 255, 247, 72, 255, - 0, 33, 11, 70, 32, 70, 64, 246, 41, 2, 255, 247, 65, 255, 32, 70, 1, - 33, 232, 247, 21, 250, 0, 32, 24, 73, 222, 243, 167, 241, 240, 177, - 32, 70, 230, 243, 37, 244, 64, 246, 42, 1, 6, 70, 0, 34, 32, 70, 230, - 243, 222, 245, 208, 248, 20, 144, 7, 70, 208, 248, 152, 128, 32, 70, - 230, 243, 22, 244, 1, 35, 131, 64, 67, 234, 9, 3, 123, 97, 72, 240, - 1, 3, 199, 248, 152, 48, 32, 70, 49, 70, 230, 243, 219, 245, 43, 104, - 26, 106, 66, 240, 3, 2, 26, 98, 189, 232, 248, 131, 25, 202, 1, 0, 255, - 127, 1, 33, 96, 9, 2, 0, 100, 9, 2, 0, 14, 202, 1, 0, 16, 181, 132, - 105, 160, 104, 252, 247, 131, 253, 224, 104, 232, 247, 185, 251, 0, - 32, 16, 189, 16, 181, 132, 105, 0, 33, 52, 34, 4, 241, 28, 0, 221, 243, - 200, 244, 3, 75, 160, 104, 99, 98, 36, 98, 235, 247, 234, 248, 0, 32, - 16, 189, 5, 170, 128, 0, 45, 233, 243, 71, 37, 77, 153, 70, 43, 104, - 6, 70, 7, 43, 15, 70, 146, 70, 61, 220, 1, 240, 254, 254, 80, 33, 128, - 70, 226, 243, 246, 242, 4, 70, 0, 40, 55, 208, 0, 33, 80, 34, 221, 243, - 167, 244, 43, 104, 164, 248, 20, 144, 132, 232, 72, 0, 39, 97, 196, - 248, 12, 128, 32, 70, 65, 242, 228, 65, 74, 70, 67, 70, 141, 232, 128, - 4, 252, 247, 234, 251, 160, 96, 248, 177, 0, 32, 10, 153, 11, 154, 17, - 75, 141, 232, 64, 4, 255, 247, 180, 252, 24, 177, 160, 104, 252, 247, - 54, 253, 16, 224, 160, 104, 228, 243, 136, 246, 11, 73, 160, 97, 42, - 104, 48, 70, 221, 243, 210, 244, 9, 72, 49, 70, 235, 247, 196, 248, - 43, 104, 1, 51, 43, 96, 2, 224, 0, 36, 0, 224, 4, 70, 32, 70, 189, 232, - 252, 135, 104, 9, 2, 0, 49, 170, 128, 0, 216, 142, 2, 0, 184, 142, 2, - 0, 1, 70, 128, 104, 80, 34, 226, 243, 187, 178, 0, 0, 45, 233, 240, - 65, 223, 248, 104, 128, 31, 70, 152, 248, 0, 48, 5, 70, 7, 43, 20, 70, - 33, 216, 56, 70, 76, 33, 226, 243, 155, 242, 6, 70, 224, 177, 0, 33, - 76, 34, 221, 243, 77, 244, 152, 248, 0, 48, 180, 96, 134, 248, 68, 48, - 1, 51, 136, 248, 0, 48, 2, 35, 134, 232, 160, 0, 179, 100, 56, 70, 8, - 33, 226, 243, 133, 242, 4, 70, 48, 100, 64, 177, 0, 33, 8, 34, 221, - 243, 54, 244, 0, 224, 0, 38, 48, 70, 189, 232, 240, 129, 49, 70, 76, - 34, 226, 243, 133, 242, 38, 70, 246, 231, 0, 191, 108, 9, 2, 0, 194, - 107, 26, 177, 0, 35, 83, 98, 130, 107, 83, 98, 192, 104, 255, 247, 183, - 191, 0, 0, 45, 233, 240, 79, 209, 248, 252, 48, 145, 176, 11, 147, 3, - 245, 96, 99, 4, 70, 9, 147, 60, 225, 14, 34, 0, 35, 32, 70, 11, 169, - 219, 243, 81, 246, 15, 40, 6, 70, 0, 240, 59, 129, 0, 34, 32, 70, 11, - 169, 19, 70, 219, 243, 71, 246, 16, 240, 14, 15, 64, 240, 46, 129, 154, - 75, 0, 244, 248, 119, 51, 64, 64, 242, 59, 66, 27, 10, 63, 9, 178, 235, - 22, 95, 4, 209, 64, 246, 255, 114, 147, 66, 0, 240, 25, 129, 0, 244, - 120, 82, 81, 10, 8, 145, 0, 42, 0, 240, 18, 129, 0, 244, 248, 43, 0, - 244, 120, 2, 210, 12, 79, 234, 155, 59, 7, 146, 18, 235, 11, 2, 25, - 209, 64, 242, 103, 49, 139, 66, 64, 240, 2, 129, 12, 171, 1, 147, 13, - 171, 2, 147, 14, 171, 3, 147, 15, 171, 4, 147, 32, 70, 11, 169, 19, - 70, 0, 146, 219, 243, 172, 245, 0, 40, 0, 240, 241, 128, 12, 155, 196, - 248, 84, 51, 236, 224, 212, 248, 204, 80, 4, 235, 133, 2, 194, 248, - 212, 98, 194, 248, 20, 3, 5, 241, 52, 2, 68, 248, 34, 48, 0, 38, 11, - 224, 1, 34, 32, 70, 11, 169, 19, 70, 219, 243, 243, 245, 0, 240, 14, - 0, 2, 40, 64, 240, 217, 128, 1, 54, 190, 66, 241, 209, 0, 39, 58, 70, - 12, 174, 13, 241, 52, 8, 13, 241, 56, 9, 13, 241, 60, 10, 32, 70, 11, - 169, 59, 70, 0, 151, 1, 150, 205, 248, 8, 128, 205, 248, 12, 144, 205, - 248, 16, 160, 219, 243, 115, 245, 2, 70, 192, 185, 64, 35, 141, 232, - 72, 3, 32, 70, 11, 169, 19, 70, 205, 248, 16, 160, 219, 243, 103, 245, - 96, 185, 13, 155, 0, 43, 64, 240, 175, 128, 15, 159, 0, 47, 64, 240, - 171, 128, 14, 155, 179, 245, 128, 95, 1, 208, 165, 224, 1, 39, 12, 154, - 5, 241, 68, 3, 68, 248, 35, 32, 14, 154, 5, 241, 116, 3, 68, 248, 35, - 32, 1, 38, 12, 171, 1, 147, 13, 171, 2, 147, 14, 171, 3, 147, 15, 171, - 0, 34, 4, 147, 32, 70, 11, 169, 51, 70, 0, 146, 219, 243, 62, 245, 112, - 177, 1, 46, 12, 209, 14, 155, 179, 245, 128, 95, 8, 209, 12, 153, 5, - 241, 100, 2, 68, 248, 34, 16, 5, 241, 132, 2, 68, 248, 34, 48, 1, 54, - 0, 40, 221, 209, 1, 38, 25, 224, 67, 70, 0, 224, 0, 35, 0, 34, 0, 146, - 12, 170, 1, 146, 13, 170, 2, 146, 14, 170, 3, 146, 15, 170, 4, 146, - 32, 70, 11, 169, 50, 70, 3, 241, 1, 8, 219, 243, 21, 245, 0, 40, 233, - 209, 184, 241, 0, 15, 92, 208, 1, 54, 8, 154, 150, 66, 228, 209, 0, - 38, 31, 224, 192, 35, 0, 147, 12, 171, 1, 147, 13, 171, 2, 147, 14, - 171, 3, 147, 15, 171, 4, 147, 32, 70, 11, 169, 50, 70, 0, 35, 219, 243, - 250, 244, 0, 40, 68, 208, 15, 155, 0, 43, 65, 209, 14, 155, 179, 245, - 128, 95, 61, 209, 38, 185, 12, 154, 4, 235, 133, 3, 195, 248, 148, 34, - 1, 54, 94, 69, 221, 209, 0, 38, 36, 224, 128, 35, 0, 147, 12, 171, 1, - 147, 13, 171, 2, 147, 14, 171, 3, 147, 15, 171, 4, 147, 8, 155, 32, - 70, 1, 43, 12, 191, 50, 70, 114, 28, 11, 169, 0, 35, 219, 243, 210, - 244, 232, 177, 15, 155, 219, 185, 14, 155, 179, 245, 128, 95, 23, 209, - 187, 241, 0, 15, 5, 209, 38, 185, 12, 154, 4, 235, 133, 3, 195, 248, - 148, 34, 1, 54, 7, 153, 142, 66, 215, 209, 39, 185, 212, 248, 204, 48, - 1, 51, 196, 248, 204, 48, 11, 155, 9, 154, 147, 66, 255, 244, 190, 174, - 0, 35, 196, 248, 204, 48, 17, 176, 189, 232, 240, 143, 0, 191, 0, 255, - 15, 0, 130, 96, 65, 96, 1, 96, 112, 71, 14, 180, 243, 181, 129, 104, - 4, 70, 1, 41, 69, 217, 8, 171, 64, 104, 7, 154, 1, 147, 221, 243, 238, - 243, 67, 28, 6, 70, 3, 208, 163, 104, 2, 59, 152, 66, 2, 221, 0, 32, - 160, 96, 54, 224, 96, 104, 61, 33, 221, 243, 14, 243, 64, 179, 103, - 104, 37, 104, 199, 27, 33, 224, 40, 70, 58, 70, 221, 243, 33, 242, 176, - 185, 235, 93, 61, 43, 19, 209, 40, 70, 221, 243, 42, 243, 98, 104, 71, - 28, 115, 28, 219, 27, 82, 27, 233, 25, 210, 24, 40, 70, 221, 243, 98, - 242, 99, 104, 219, 27, 99, 96, 163, 104, 223, 25, 167, 96, 8, 224, 43, - 70, 19, 248, 1, 43, 29, 70, 0, 42, 250, 209, 97, 104, 141, 66, 218, - 211, 163, 104, 112, 28, 27, 26, 163, 96, 99, 104, 27, 24, 99, 96, 0, - 224, 0, 32, 189, 232, 252, 64, 3, 176, 112, 71, 45, 233, 240, 65, 85, - 26, 1, 45, 12, 70, 31, 70, 6, 158, 14, 221, 41, 70, 226, 243, 176, 240, - 128, 70, 112, 177, 33, 70, 42, 70, 221, 243, 254, 241, 199, 248, 0, - 128, 0, 32, 53, 96, 189, 232, 240, 129, 0, 32, 24, 96, 48, 96, 189, - 232, 240, 129, 111, 240, 26, 0, 189, 232, 240, 129, 0, 0, 45, 233, 240, - 79, 167, 176, 14, 145, 79, 244, 128, 81, 13, 144, 15, 146, 16, 147, - 226, 243, 143, 240, 9, 144, 0, 40, 1, 240, 223, 128, 35, 168, 9, 153, - 79, 244, 128, 82, 255, 247, 117, 255, 79, 244, 128, 82, 9, 152, 0, 33, - 221, 243, 55, 242, 0, 35, 79, 240, 255, 50, 141, 248, 76, 48, 7, 146, - 11, 147, 8, 147, 1, 240, 148, 184, 14, 155, 1, 34, 83, 248, 4, 91, 12, - 146, 14, 147, 0, 35, 10, 147, 12, 154, 21, 248, 3, 176, 66, 177, 11, - 241, 255, 50, 210, 178, 95, 28, 253, 42, 13, 216, 238, 93, 159, 28, - 11, 224, 11, 241, 255, 50, 210, 178, 253, 42, 150, 191, 94, 70, 12, - 158, 79, 240, 128, 11, 95, 28, 0, 224, 0, 38, 187, 25, 179, 245, 96, - 127, 129, 242, 107, 128, 187, 241, 32, 15, 40, 208, 7, 216, 187, 241, - 21, 15, 13, 208, 187, 241, 27, 15, 65, 240, 90, 128, 95, 224, 187, 241, - 34, 15, 51, 208, 46, 211, 187, 241, 128, 15, 65, 240, 81, 128, 92, 224, - 235, 25, 90, 120, 235, 93, 18, 2, 211, 24, 7, 43, 15, 221, 188, 28, - 44, 25, 131, 73, 34, 70, 35, 168, 255, 247, 32, 255, 32, 70, 221, 243, - 113, 242, 250, 28, 18, 24, 127, 73, 35, 168, 170, 24, 14, 224, 236, - 25, 98, 120, 235, 93, 18, 2, 210, 24, 123, 73, 35, 168, 255, 247, 14, - 255, 227, 120, 162, 120, 121, 73, 27, 2, 35, 168, 154, 24, 255, 247, - 6, 255, 1, 240, 38, 184, 235, 93, 10, 147, 1, 240, 34, 184, 10, 154, - 12, 42, 0, 240, 239, 135, 157, 248, 76, 48, 0, 43, 65, 240, 25, 128, - 235, 93, 4, 43, 65, 240, 21, 128, 7, 241, 2, 8, 5, 235, 8, 4, 32, 70, - 221, 243, 60, 246, 0, 40, 65, 240, 11, 128, 21, 248, 8, 48, 216, 7, - 1, 241, 6, 128, 32, 70, 19, 169, 221, 243, 120, 244, 7, 155, 1, 51, - 64, 240, 254, 135, 235, 25, 154, 121, 219, 121, 18, 2, 191, 227, 235, - 25, 218, 121, 35, 168, 155, 121, 94, 73, 175, 224, 235, 93, 236, 25, - 130, 43, 0, 242, 238, 135, 223, 232, 19, 240, 155, 0, 186, 0, 48, 1, - 235, 1, 171, 2, 231, 1, 172, 1, 183, 1, 60, 1, 191, 2, 211, 2, 228, - 2, 233, 2, 236, 7, 80, 2, 220, 1, 236, 7, 0, 3, 27, 3, 159, 0, 56, 3, - 60, 3, 74, 3, 78, 3, 245, 0, 152, 3, 236, 7, 99, 1, 183, 3, 105, 1, - 236, 7, 236, 7, 236, 7, 191, 3, 208, 3, 211, 3, 36, 4, 6, 5, 236, 7, - 236, 7, 214, 5, 147, 0, 139, 0, 131, 0, 144, 6, 151, 6, 158, 6, 165, - 6, 236, 7, 244, 2, 95, 1, 236, 7, 236, 7, 252, 0, 184, 7, 172, 6, 236, - 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 111, 1, 213, - 6, 231, 6, 5, 7, 35, 7, 65, 7, 95, 7, 125, 7, 154, 7, 161, 7, 236, 7, - 116, 1, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, - 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, - 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, - 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, - 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, - 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, 7, 236, - 7, 236, 7, 168, 7, 79, 234, 150, 10, 95, 250, 138, 250, 79, 240, 0, - 8, 0, 240, 199, 189, 79, 234, 86, 9, 95, 250, 137, 249, 79, 240, 0, - 8, 0, 240, 147, 189, 79, 234, 86, 9, 95, 250, 137, 249, 79, 240, 0, - 8, 0, 240, 122, 189, 35, 168, 12, 73, 0, 240, 27, 191, 227, 120, 34, - 121, 27, 4, 67, 234, 2, 99, 98, 120, 9, 73, 19, 67, 162, 120, 35, 168, - 67, 234, 2, 34, 21, 231, 188, 143, 2, 0, 38, 146, 2, 0, 122, 143, 2, - 0, 29, 147, 2, 0, 222, 149, 2, 0, 85, 145, 2, 0, 241, 142, 2, 0, 162, - 120, 99, 120, 18, 2, 210, 24, 159, 73, 35, 168, 255, 247, 8, 254, 34, - 121, 227, 120, 18, 2, 35, 168, 156, 73, 210, 24, 255, 247, 0, 254, 6, - 46, 64, 242, 31, 135, 162, 121, 99, 121, 18, 2, 35, 168, 152, 73, 210, - 24, 255, 247, 245, 253, 8, 46, 64, 242, 20, 135, 35, 122, 226, 121, - 27, 2, 35, 168, 147, 73, 154, 24, 255, 247, 234, 253, 10, 46, 64, 242, - 9, 135, 7, 241, 10, 8, 7, 241, 9, 4, 21, 248, 8, 32, 43, 93, 18, 2, - 210, 24, 35, 168, 140, 73, 255, 247, 218, 253, 21, 248, 8, 48, 42, 93, - 27, 2, 112, 224, 163, 120, 98, 120, 27, 2, 154, 24, 7, 146, 0, 240, - 240, 190, 133, 75, 6, 34, 182, 251, 242, 242, 26, 112, 79, 240, 0, 8, - 153, 70, 36, 224, 67, 70, 16, 33, 129, 74, 27, 168, 221, 243, 199, 240, - 67, 70, 16, 33, 127, 74, 31, 168, 221, 243, 193, 240, 99, 120, 162, - 120, 27, 169, 67, 234, 2, 34, 35, 168, 255, 247, 177, 253, 99, 121, - 162, 121, 27, 4, 67, 234, 2, 99, 226, 120, 35, 168, 19, 67, 34, 121, - 31, 169, 67, 234, 2, 34, 255, 247, 163, 253, 8, 241, 1, 8, 6, 52, 153, - 248, 0, 48, 152, 69, 214, 219, 0, 240, 188, 190, 2, 46, 3, 209, 35, - 168, 109, 73, 0, 240, 132, 190, 163, 120, 98, 120, 27, 2, 35, 168, 105, - 73, 132, 230, 162, 120, 99, 120, 18, 2, 4, 46, 26, 68, 5, 217, 35, 121, - 225, 120, 27, 6, 9, 4, 91, 24, 26, 67, 35, 168, 99, 73, 255, 247, 126, - 253, 6, 46, 64, 242, 157, 134, 235, 25, 154, 121, 89, 121, 18, 2, 8, - 46, 10, 68, 5, 217, 25, 122, 219, 121, 9, 6, 27, 4, 201, 24, 10, 67, - 35, 168, 90, 73, 98, 230, 35, 168, 89, 73, 0, 240, 87, 190, 163, 120, - 98, 120, 27, 2, 35, 168, 87, 73, 87, 230, 1, 54, 0, 35, 246, 178, 12, - 147, 0, 240, 125, 190, 163, 120, 98, 120, 35, 168, 82, 73, 71, 226, - 73, 75, 242, 8, 26, 112, 79, 240, 0, 8, 153, 70, 42, 224, 67, 70, 16, - 33, 70, 74, 31, 168, 221, 243, 81, 240, 67, 70, 16, 33, 68, 74, 27, - 168, 221, 243, 75, 240, 227, 120, 34, 121, 27, 4, 67, 234, 2, 99, 98, - 120, 31, 169, 19, 67, 162, 120, 35, 168, 67, 234, 2, 34, 255, 247, 53, - 253, 227, 121, 34, 122, 27, 4, 67, 234, 2, 99, 98, 121, 35, 168, 19, - 67, 162, 121, 27, 169, 67, 234, 2, 34, 255, 247, 39, 253, 8, 241, 1, - 8, 8, 52, 153, 248, 0, 48, 152, 69, 208, 219, 0, 240, 64, 190, 35, 168, - 54, 73, 98, 120, 255, 247, 25, 253, 2, 46, 64, 242, 56, 134, 35, 168, - 51, 73, 70, 225, 0, 34, 35, 168, 50, 73, 99, 120, 255, 247, 13, 253, - 2, 46, 64, 242, 42, 134, 1, 34, 35, 168, 45, 73, 163, 120, 255, 247, - 4, 253, 3, 46, 0, 240, 33, 134, 2, 34, 35, 168, 41, 73, 227, 120, 255, - 247, 251, 252, 4, 46, 0, 240, 24, 134, 3, 34, 35, 168, 36, 73, 35, 121, - 255, 247, 242, 252, 1, 34, 8, 146, 0, 240, 16, 190, 31, 73, 98, 120, - 35, 168, 255, 247, 233, 252, 35, 168, 29, 73, 1, 34, 163, 120, 0, 240, - 206, 189, 35, 168, 27, 73, 0, 240, 207, 189, 179, 30, 8, 43, 0, 242, - 253, 133, 223, 232, 19, 240, 9, 0, 251, 5, 251, 5, 251, 5, 251, 5, 76, - 0, 62, 0, 56, 0, 51, 0, 35, 168, 19, 73, 0, 240, 188, 189, 62, 148, - 2, 0, 255, 148, 2, 0, 72, 147, 2, 0, 134, 143, 2, 0, 157, 144, 2, 0, - 109, 9, 2, 0, 36, 202, 1, 0, 47, 202, 1, 0, 210, 144, 2, 0, 193, 148, - 2, 0, 254, 143, 2, 0, 222, 145, 2, 0, 157, 143, 2, 0, 120, 144, 2, 0, - 253, 142, 2, 0, 54, 149, 2, 0, 11, 146, 2, 0, 193, 149, 2, 0, 118, 148, - 2, 0, 35, 168, 150, 73, 98, 122, 255, 247, 161, 252, 235, 25, 35, 168, - 148, 73, 26, 122, 255, 247, 155, 252, 7, 241, 7, 8, 146, 73, 21, 248, - 8, 32, 35, 168, 255, 247, 147, 252, 35, 168, 143, 73, 21, 248, 8, 32, - 255, 247, 141, 252, 79, 240, 0, 8, 162, 120, 99, 120, 140, 73, 18, 2, - 65, 68, 35, 168, 210, 24, 8, 241, 9, 8, 255, 247, 128, 252, 2, 52, 184, - 241, 27, 15, 240, 209, 0, 240, 156, 189, 20, 46, 25, 208, 23, 46, 3, - 208, 19, 46, 64, 240, 149, 133, 25, 224, 5, 235, 7, 8, 128, 73, 152, - 248, 22, 32, 35, 168, 255, 247, 106, 252, 126, 73, 152, 248, 21, 32, - 35, 168, 255, 247, 100, 252, 35, 168, 124, 73, 152, 248, 20, 32, 255, - 247, 94, 252, 235, 25, 35, 168, 121, 73, 218, 124, 255, 247, 88, 252, - 177, 70, 162, 70, 79, 240, 0, 8, 38, 70, 178, 120, 115, 120, 117, 73, - 18, 2, 65, 68, 35, 168, 210, 24, 8, 241, 9, 8, 255, 247, 72, 252, 2, - 54, 184, 241, 27, 15, 240, 209, 78, 70, 79, 240, 0, 8, 34, 122, 227, - 121, 109, 73, 18, 2, 65, 68, 35, 168, 210, 24, 8, 241, 11, 8, 255, 247, - 54, 252, 2, 52, 184, 241, 33, 15, 240, 209, 0, 36, 154, 248, 14, 32, - 154, 248, 13, 48, 101, 73, 18, 2, 9, 25, 35, 168, 210, 24, 11, 52, 255, - 247, 37, 252, 33, 44, 10, 241, 2, 10, 239, 209, 0, 240, 65, 189, 225, - 120, 98, 120, 163, 120, 0, 145, 33, 121, 35, 168, 1, 145, 97, 121, 2, - 145, 161, 121, 3, 145, 225, 121, 4, 145, 33, 122, 5, 145, 87, 73, 255, - 247, 13, 252, 0, 240, 45, 189, 160, 70, 67, 70, 0, 36, 176, 70, 30, - 70, 22, 248, 1, 63, 255, 43, 4, 208, 35, 168, 81, 73, 34, 70, 255, 247, - 253, 251, 1, 52, 4, 44, 243, 209, 70, 70, 0, 240, 25, 189, 98, 120, - 35, 168, 10, 177, 163, 120, 27, 185, 74, 73, 255, 247, 239, 251, 2, - 224, 73, 73, 255, 247, 235, 251, 235, 25, 35, 168, 72, 73, 218, 120, - 221, 228, 163, 120, 98, 120, 35, 168, 70, 73, 210, 224, 227, 120, 34, - 121, 27, 4, 67, 234, 2, 99, 98, 120, 35, 168, 19, 67, 66, 73, 162, 120, - 180, 229, 35, 168, 65, 73, 98, 120, 255, 247, 209, 251, 2, 46, 64, 242, - 240, 132, 62, 73, 35, 168, 162, 120, 193, 228, 124, 28, 42, 93, 60, - 73, 2, 240, 15, 2, 35, 168, 255, 247, 194, 251, 42, 93, 58, 73, 18, - 9, 188, 28, 35, 168, 255, 247, 187, 251, 42, 93, 55, 73, 2, 240, 7, - 2, 35, 168, 255, 247, 180, 251, 42, 93, 35, 168, 210, 8, 52, 73, 25, - 224, 124, 28, 42, 93, 51, 73, 2, 240, 15, 2, 35, 168, 255, 247, 167, - 251, 42, 93, 48, 73, 18, 9, 188, 28, 35, 168, 255, 247, 160, 251, 42, - 93, 46, 73, 2, 240, 7, 2, 35, 168, 255, 247, 153, 251, 42, 93, 43, 73, - 210, 8, 35, 168, 2, 240, 3, 2, 137, 228, 35, 168, 41, 73, 0, 240, 126, - 188, 40, 73, 98, 120, 35, 168, 255, 247, 137, 251, 39, 73, 162, 120, - 35, 168, 255, 247, 132, 251, 35, 168, 37, 73, 226, 120, 119, 228, 35, - 168, 36, 73, 0, 240, 108, 188, 35, 168, 35, 73, 0, 240, 104, 188, 55, - 148, 2, 0, 118, 148, 2, 0, 41, 147, 2, 0, 95, 143, 2, 0, 172, 145, 2, - 0, 80, 143, 2, 0, 105, 144, 2, 0, 197, 144, 2, 0, 109, 143, 2, 0, 140, - 147, 2, 0, 106, 145, 2, 0, 131, 148, 2, 0, 218, 148, 2, 0, 19, 143, - 2, 0, 161, 149, 2, 0, 182, 149, 2, 0, 212, 149, 2, 0, 231, 145, 2, 0, - 128, 149, 2, 0, 64, 149, 2, 0, 96, 145, 2, 0, 228, 142, 2, 0, 199, 145, - 2, 0, 47, 143, 2, 0, 209, 148, 2, 0, 27, 149, 2, 0, 241, 143, 2, 0, - 115, 149, 2, 0, 75, 149, 2, 0, 140, 149, 2, 0, 242, 145, 2, 0, 46, 148, - 2, 0, 212, 145, 2, 0, 208, 146, 2, 0, 134, 144, 2, 0, 7, 241, 1, 8, - 5, 235, 8, 4, 32, 70, 221, 243, 123, 242, 0, 40, 64, 240, 74, 132, 21, - 248, 8, 48, 217, 7, 0, 241, 69, 132, 32, 70, 19, 169, 221, 243, 183, - 240, 7, 155, 1, 51, 64, 240, 61, 132, 235, 25, 90, 121, 155, 121, 18, - 2, 211, 24, 7, 147, 0, 240, 53, 188, 162, 120, 99, 120, 143, 73, 18, - 6, 35, 168, 66, 234, 3, 34, 2, 228, 141, 73, 98, 120, 35, 168, 255, - 247, 6, 251, 139, 73, 162, 120, 35, 168, 255, 247, 1, 251, 35, 121, - 226, 120, 27, 2, 35, 168, 136, 73, 255, 247, 241, 187, 35, 168, 135, - 73, 230, 227, 148, 248, 2, 128, 99, 120, 79, 234, 8, 40, 152, 68, 31, - 250, 136, 248, 131, 73, 79, 234, 216, 34, 35, 168, 255, 247, 233, 250, - 8, 244, 224, 98, 18, 10, 127, 73, 35, 168, 255, 247, 226, 250, 8, 240, - 248, 2, 210, 8, 125, 73, 35, 168, 255, 247, 219, 250, 8, 240, 6, 2, - 82, 8, 122, 73, 35, 168, 255, 247, 212, 250, 35, 168, 121, 73, 8, 240, - 1, 2, 255, 247, 206, 250, 4, 46, 64, 242, 237, 131, 35, 121, 228, 120, - 27, 2, 28, 25, 164, 178, 115, 73, 226, 10, 35, 168, 255, 247, 193, 250, - 4, 244, 224, 98, 113, 73, 18, 10, 35, 168, 255, 247, 186, 250, 4, 240, - 248, 2, 110, 73, 210, 8, 35, 168, 255, 247, 179, 250, 4, 240, 6, 2, - 108, 73, 82, 8, 35, 168, 255, 247, 172, 250, 35, 168, 106, 73, 4, 240, - 1, 2, 255, 247, 158, 187, 104, 73, 98, 120, 35, 168, 255, 247, 161, - 250, 79, 240, 0, 8, 102, 73, 162, 120, 35, 168, 255, 247, 154, 250, - 205, 248, 0, 128, 34, 121, 227, 120, 18, 2, 211, 24, 1, 147, 2, 34, - 96, 73, 67, 70, 35, 168, 255, 247, 141, 250, 205, 248, 0, 128, 162, - 121, 99, 121, 18, 2, 211, 24, 1, 147, 2, 34, 1, 35, 89, 73, 35, 168, - 255, 247, 128, 250, 205, 248, 0, 128, 34, 122, 227, 121, 18, 2, 211, - 24, 2, 34, 1, 147, 35, 168, 83, 73, 19, 70, 255, 247, 115, 250, 30, - 46, 64, 242, 146, 131, 80, 73, 98, 122, 35, 168, 255, 247, 107, 250, - 79, 73, 162, 122, 35, 168, 255, 247, 102, 250, 77, 73, 226, 122, 35, - 168, 255, 247, 97, 250, 76, 73, 34, 123, 35, 168, 255, 247, 92, 250, - 205, 248, 0, 128, 162, 123, 99, 123, 18, 2, 211, 24, 1, 147, 66, 73, - 5, 34, 67, 70, 35, 168, 255, 247, 79, 250, 205, 248, 0, 128, 34, 124, - 227, 123, 18, 2, 211, 24, 1, 147, 59, 73, 5, 34, 1, 35, 35, 168, 255, - 247, 66, 250, 205, 248, 0, 128, 162, 124, 99, 124, 18, 2, 211, 24, 1, - 147, 53, 73, 5, 34, 2, 35, 35, 168, 255, 247, 53, 250, 205, 248, 0, - 128, 205, 248, 4, 128, 34, 125, 227, 124, 18, 2, 211, 24, 2, 147, 50, - 73, 5, 34, 108, 35, 79, 240, 1, 9, 35, 168, 255, 247, 36, 250, 205, - 248, 0, 144, 205, 248, 4, 128, 162, 125, 99, 125, 18, 2, 211, 24, 2, - 147, 42, 73, 5, 34, 108, 35, 35, 168, 79, 240, 2, 10, 255, 247, 19, - 250, 205, 248, 0, 160, 205, 248, 4, 128, 34, 126, 227, 125, 18, 2, 211, - 24, 2, 147, 33, 73, 5, 34, 108, 35, 35, 168, 255, 247, 4, 250, 205, - 248, 0, 128, 205, 248, 4, 128, 162, 126, 99, 126, 18, 2, 211, 24, 2, - 147, 35, 168, 25, 73, 5, 34, 104, 35, 255, 247, 245, 249, 205, 248, - 0, 144, 224, 224, 97, 147, 2, 0, 16, 147, 2, 0, 218, 146, 2, 0, 1, 147, - 2, 0, 181, 148, 2, 0, 99, 149, 2, 0, 15, 144, 2, 0, 28, 144, 2, 0, 237, - 149, 2, 0, 32, 143, 2, 0, 208, 147, 2, 0, 10, 150, 2, 0, 61, 150, 2, - 0, 21, 146, 2, 0, 84, 149, 2, 0, 95, 143, 2, 0, 231, 146, 2, 0, 10, - 149, 2, 0, 180, 147, 2, 0, 171, 144, 2, 0, 110, 147, 2, 0, 196, 143, - 2, 0, 139, 145, 2, 0, 152, 73, 98, 120, 35, 168, 255, 247, 191, 249, - 79, 240, 1, 8, 150, 73, 162, 120, 35, 168, 255, 247, 184, 249, 205, - 248, 0, 128, 34, 121, 227, 120, 18, 2, 211, 24, 1, 147, 2, 34, 0, 35, - 144, 73, 35, 168, 255, 247, 171, 249, 205, 248, 0, 128, 162, 121, 99, - 121, 18, 2, 211, 24, 1, 147, 2, 34, 138, 73, 67, 70, 35, 168, 255, 247, - 158, 249, 205, 248, 0, 128, 34, 122, 227, 121, 18, 2, 211, 24, 2, 34, - 1, 147, 35, 168, 131, 73, 19, 70, 255, 247, 145, 249, 30, 46, 64, 242, - 176, 130, 128, 73, 98, 122, 35, 168, 255, 247, 137, 249, 127, 73, 162, - 122, 35, 168, 255, 247, 132, 249, 125, 73, 226, 122, 35, 168, 255, 247, - 127, 249, 124, 73, 34, 123, 35, 168, 255, 247, 122, 249, 205, 248, 0, - 128, 162, 123, 99, 123, 18, 2, 211, 24, 1, 147, 114, 73, 5, 34, 0, 35, - 35, 168, 255, 247, 109, 249, 205, 248, 0, 128, 34, 124, 227, 123, 18, - 2, 211, 24, 1, 147, 107, 73, 5, 34, 67, 70, 35, 168, 255, 247, 96, 249, - 205, 248, 0, 128, 162, 124, 99, 124, 18, 2, 211, 24, 1, 147, 101, 73, - 5, 34, 2, 35, 79, 240, 0, 9, 35, 168, 255, 247, 81, 249, 205, 248, 0, - 144, 205, 248, 4, 128, 34, 125, 227, 124, 18, 2, 211, 24, 2, 147, 97, - 73, 5, 34, 108, 35, 35, 168, 255, 247, 66, 249, 205, 248, 0, 128, 205, - 248, 4, 128, 162, 125, 99, 125, 18, 2, 211, 24, 2, 147, 90, 73, 5, 34, - 108, 35, 35, 168, 79, 240, 2, 10, 255, 247, 49, 249, 205, 248, 0, 160, - 205, 248, 4, 128, 34, 126, 227, 125, 18, 2, 211, 24, 2, 147, 81, 73, - 5, 34, 108, 35, 35, 168, 255, 247, 34, 249, 205, 248, 0, 144, 205, 248, - 4, 128, 162, 126, 99, 126, 18, 2, 211, 24, 2, 147, 35, 168, 73, 73, - 5, 34, 104, 35, 255, 247, 19, 249, 205, 248, 0, 128, 205, 248, 4, 128, - 34, 127, 227, 126, 18, 2, 211, 24, 2, 147, 5, 34, 104, 35, 35, 168, - 65, 73, 255, 247, 4, 249, 205, 248, 0, 160, 205, 248, 4, 128, 163, 127, - 98, 127, 27, 2, 155, 24, 2, 147, 35, 168, 58, 73, 5, 34, 104, 35, 255, - 247, 245, 248, 21, 226, 162, 120, 99, 120, 18, 2, 210, 24, 54, 73, 35, - 168, 255, 247, 236, 248, 162, 121, 99, 121, 18, 6, 27, 4, 210, 24, 35, - 121, 35, 168, 27, 2, 210, 24, 227, 120, 48, 73, 210, 24, 255, 247, 222, - 248, 18, 46, 64, 242, 253, 129, 162, 122, 99, 122, 18, 6, 27, 4, 210, - 24, 35, 122, 43, 73, 27, 2, 210, 24, 227, 121, 35, 168, 210, 24, 255, - 247, 205, 248, 162, 123, 99, 123, 18, 6, 27, 4, 210, 24, 35, 123, 35, - 168, 27, 2, 210, 24, 227, 122, 35, 73, 210, 24, 255, 247, 191, 248, - 162, 124, 99, 124, 18, 6, 27, 4, 211, 24, 34, 124, 18, 2, 155, 24, 226, - 123, 187, 224, 162, 120, 99, 120, 18, 2, 211, 24, 0, 147, 2, 34, 67, - 70, 35, 168, 25, 73, 8, 241, 1, 8, 255, 247, 168, 248, 2, 52, 200, 69, - 239, 221, 197, 225, 162, 120, 99, 120, 18, 2, 211, 24, 0, 147, 5, 34, - 67, 70, 35, 168, 16, 73, 8, 241, 1, 8, 255, 247, 151, 248, 2, 52, 200, - 69, 239, 221, 180, 225, 0, 191, 158, 145, 2, 0, 244, 146, 2, 0, 10, - 149, 2, 0, 194, 147, 2, 0, 184, 144, 2, 0, 125, 147, 2, 0, 211, 143, - 2, 0, 139, 145, 2, 0, 199, 149, 2, 0, 40, 149, 2, 0, 83, 147, 2, 0, - 226, 143, 2, 0, 172, 143, 2, 0, 205, 248, 0, 128, 162, 120, 99, 120, - 18, 2, 211, 24, 1, 147, 5, 34, 108, 35, 35, 168, 177, 73, 8, 241, 1, - 8, 255, 247, 105, 248, 2, 52, 208, 69, 237, 221, 79, 234, 86, 9, 95, - 250, 137, 249, 9, 241, 1, 12, 9, 241, 2, 9, 188, 68, 185, 68, 5, 235, - 9, 4, 205, 248, 68, 176, 79, 240, 0, 8, 179, 70, 46, 70, 101, 70, 205, - 248, 0, 128, 34, 120, 201, 235, 4, 3, 91, 93, 18, 2, 211, 24, 1, 147, - 5, 34, 104, 35, 35, 168, 158, 73, 8, 241, 1, 8, 255, 247, 66, 248, 2, - 52, 208, 69, 235, 221, 53, 70, 94, 70, 221, 248, 68, 176, 91, 225, 163, - 120, 98, 120, 27, 2, 35, 168, 150, 73, 255, 247, 42, 185, 163, 120, - 98, 120, 27, 2, 35, 168, 148, 73, 255, 247, 35, 185, 163, 120, 98, 120, - 27, 2, 35, 168, 145, 73, 255, 247, 28, 185, 163, 120, 98, 120, 27, 2, - 35, 168, 143, 73, 255, 247, 21, 185, 34, 121, 227, 120, 18, 6, 27, 4, - 210, 24, 163, 120, 139, 73, 27, 2, 210, 24, 99, 120, 35, 168, 210, 24, - 255, 247, 16, 248, 34, 122, 227, 121, 18, 6, 27, 4, 210, 24, 163, 121, - 35, 168, 27, 2, 210, 24, 99, 121, 131, 73, 210, 24, 255, 247, 2, 248, - 34, 123, 227, 122, 18, 6, 27, 4, 211, 24, 162, 122, 18, 2, 155, 24, - 98, 122, 35, 168, 125, 73, 255, 247, 236, 184, 162, 120, 99, 120, 18, - 2, 35, 168, 123, 73, 210, 24, 254, 247, 237, 255, 4, 46, 64, 242, 12, - 129, 35, 121, 226, 120, 27, 2, 35, 168, 118, 73, 255, 247, 218, 184, - 34, 121, 227, 120, 18, 6, 27, 4, 210, 24, 163, 120, 35, 168, 27, 2, - 210, 24, 99, 120, 113, 73, 210, 24, 254, 247, 213, 255, 6, 46, 64, 242, - 244, 128, 34, 122, 227, 121, 18, 6, 27, 4, 211, 24, 162, 121, 35, 168, - 18, 2, 155, 24, 106, 73, 98, 121, 255, 247, 188, 184, 223, 248, 180, - 145, 79, 240, 1, 8, 176, 69, 128, 242, 224, 128, 34, 121, 227, 120, - 18, 6, 27, 4, 210, 24, 163, 120, 73, 70, 27, 2, 210, 24, 99, 120, 35, - 168, 210, 24, 8, 241, 4, 8, 254, 247, 174, 255, 4, 52, 184, 241, 25, - 15, 9, 241, 24, 9, 230, 209, 200, 224, 223, 248, 124, 145, 79, 240, - 1, 8, 176, 69, 128, 242, 194, 128, 34, 121, 227, 120, 18, 6, 27, 4, - 210, 24, 163, 120, 73, 70, 27, 2, 210, 24, 99, 120, 35, 168, 210, 24, - 8, 241, 4, 8, 254, 247, 144, 255, 4, 52, 184, 241, 13, 15, 9, 241, 19, - 9, 230, 209, 170, 224, 223, 248, 68, 145, 79, 240, 1, 8, 176, 69, 128, - 242, 164, 128, 34, 121, 227, 120, 18, 6, 27, 4, 210, 24, 163, 120, 73, - 70, 27, 2, 210, 24, 99, 120, 35, 168, 210, 24, 8, 241, 4, 8, 254, 247, - 114, 255, 4, 52, 184, 241, 13, 15, 9, 241, 20, 9, 230, 209, 140, 224, - 223, 248, 12, 145, 79, 240, 1, 8, 176, 69, 128, 242, 134, 128, 34, 121, - 227, 120, 18, 6, 27, 4, 210, 24, 163, 120, 73, 70, 27, 2, 210, 24, 99, - 120, 35, 168, 210, 24, 8, 241, 4, 8, 254, 247, 84, 255, 4, 52, 184, - 241, 13, 15, 9, 241, 20, 9, 230, 209, 110, 224, 223, 248, 212, 144, - 79, 240, 1, 8, 176, 69, 104, 218, 34, 121, 227, 120, 18, 6, 27, 4, 210, - 24, 163, 120, 73, 70, 27, 2, 210, 24, 99, 120, 35, 168, 210, 24, 8, - 241, 4, 8, 254, 247, 55, 255, 4, 52, 184, 241, 13, 15, 9, 241, 20, 9, - 231, 209, 81, 224, 163, 120, 98, 120, 27, 2, 35, 168, 28, 73, 255, 247, - 32, 184, 163, 120, 98, 120, 27, 2, 35, 168, 26, 73, 255, 247, 25, 184, - 34, 121, 227, 120, 18, 6, 27, 4, 211, 24, 162, 120, 100, 120, 18, 2, - 155, 24, 21, 73, 35, 168, 1, 34, 27, 25, 254, 247, 19, 255, 51, 224, - 18, 73, 35, 168, 98, 120, 255, 247, 5, 184, 0, 34, 10, 146, 43, 224, - 224, 147, 2, 0, 53, 146, 2, 0, 149, 149, 2, 0, 7, 143, 2, 0, 167, 147, - 2, 0, 83, 147, 2, 0, 226, 143, 2, 0, 252, 145, 2, 0, 23, 150, 2, 0, - 42, 150, 2, 0, 74, 148, 2, 0, 96, 148, 2, 0, 144, 144, 2, 0, 60, 143, - 2, 0, 164, 148, 2, 0, 54, 147, 2, 0, 64, 146, 2, 0, 224, 144, 2, 0, - 45, 144, 2, 0, 25, 145, 2, 0, 242, 147, 2, 0, 1, 35, 8, 147, 187, 241, - 255, 15, 7, 235, 6, 3, 126, 244, 119, 175, 11, 154, 1, 50, 11, 146, - 11, 155, 15, 154, 147, 66, 126, 244, 103, 175, 7, 155, 90, 28, 4, 208, - 35, 168, 24, 73, 26, 70, 254, 247, 200, 254, 157, 248, 76, 48, 35, 177, - 35, 168, 21, 73, 19, 170, 254, 247, 192, 254, 0, 32, 20, 73, 220, 243, - 72, 246, 48, 185, 8, 154, 34, 185, 35, 168, 17, 73, 255, 35, 254, 247, - 180, 254, 36, 154, 0, 35, 2, 248, 1, 59, 48, 155, 9, 153, 0, 147, 13, - 152, 16, 155, 36, 146, 254, 247, 249, 254, 9, 153, 4, 70, 79, 244, 128, - 82, 13, 152, 224, 243, 189, 247, 1, 224, 111, 240, 1, 4, 32, 70, 39, - 176, 189, 232, 240, 143, 254, 149, 2, 0, 171, 149, 2, 0, 14, 93, 134, - 0, 11, 146, 2, 0, 45, 233, 240, 79, 141, 176, 5, 146, 5, 70, 14, 70, - 6, 168, 0, 33, 20, 34, 154, 70, 11, 145, 220, 243, 73, 241, 99, 75, - 28, 120, 0, 44, 64, 240, 182, 128, 107, 105, 35, 43, 14, 221, 28, 34, - 40, 70, 33, 70, 35, 70, 0, 148, 229, 243, 96, 240, 0, 40, 9, 218, 79, - 240, 1, 9, 2, 39, 205, 248, 16, 144, 7, 224, 4, 39, 79, 240, 1, 9, 2, - 224, 12, 39, 79, 240, 3, 9, 4, 148, 40, 70, 229, 243, 1, 240, 1, 40, - 131, 70, 2, 208, 2, 40, 19, 209, 5, 224, 40, 70, 49, 70, 220, 243, 81, - 240, 64, 0, 11, 224, 40, 70, 250, 247, 124, 255, 4, 70, 56, 177, 219, - 243, 246, 247, 195, 5, 3, 213, 32, 70, 219, 243, 231, 247, 11, 144, - 11, 153, 0, 41, 81, 208, 48, 70, 224, 243, 80, 247, 4, 70, 0, 40, 124, - 208, 187, 241, 1, 15, 221, 248, 44, 128, 3, 208, 187, 241, 2, 15, 26, - 209, 10, 224, 0, 33, 2, 144, 141, 232, 2, 1, 3, 145, 40, 70, 5, 154, - 51, 70, 220, 243, 32, 240, 12, 224, 12, 171, 79, 234, 88, 2, 67, 248, - 4, 45, 40, 70, 1, 33, 34, 70, 219, 243, 125, 247, 11, 155, 91, 0, 11, - 147, 0, 40, 75, 209, 34, 136, 79, 246, 253, 115, 1, 58, 146, 178, 154, - 66, 5, 217, 48, 70, 33, 70, 66, 70, 224, 243, 46, 247, 28, 224, 4, 154, - 26, 177, 4, 235, 71, 7, 6, 151, 27, 224, 227, 25, 98, 136, 6, 147, 163, - 136, 167, 245, 128, 87, 7, 235, 18, 34, 27, 6, 2, 235, 19, 67, 227, - 24, 7, 147, 227, 136, 219, 25, 227, 24, 8, 147, 35, 137, 223, 25, 231, - 25, 9, 151, 5, 224, 136, 70, 27, 75, 0, 36, 6, 147, 79, 240, 1, 9, 22, - 155, 48, 70, 0, 147, 6, 169, 74, 70, 83, 70, 254, 247, 89, 254, 144, - 185, 21, 73, 220, 243, 67, 245, 56, 177, 22, 155, 40, 70, 218, 248, - 0, 16, 26, 104, 0, 240, 37, 251, 6, 224, 22, 155, 40, 70, 218, 248, - 0, 16, 26, 104, 0, 240, 63, 251, 36, 177, 48, 70, 33, 70, 66, 70, 224, - 243, 233, 246, 7, 74, 1, 35, 19, 112, 22, 155, 0, 32, 202, 248, 0, 0, - 24, 96, 1, 224, 111, 240, 26, 0, 13, 176, 189, 232, 240, 143, 0, 191, - 64, 39, 0, 0, 149, 143, 2, 0, 58, 202, 1, 0, 48, 181, 25, 70, 3, 155, - 4, 156, 67, 177, 76, 177, 0, 37, 29, 96, 37, 96, 3, 148, 189, 232, 48, - 64, 255, 247, 24, 191, 24, 70, 48, 189, 32, 70, 48, 189, 8, 75, 26, - 136, 138, 66, 4, 208, 154, 136, 138, 66, 6, 209, 1, 34, 0, 224, 0, 34, - 3, 235, 130, 3, 152, 120, 0, 224, 255, 32, 64, 178, 112, 71, 0, 191, - 152, 150, 2, 0, 248, 181, 4, 70, 21, 70, 31, 70, 0, 43, 123, 208, 230, - 247, 194, 253, 6, 70, 11, 224, 187, 66, 8, 209, 213, 248, 0, 38, 179, - 120, 2, 240, 124, 2, 179, 235, 146, 15, 7, 209, 248, 189, 12, 54, 0, - 46, 105, 208, 51, 136, 0, 43, 238, 209, 248, 189, 213, 248, 24, 54, - 100, 32, 35, 240, 192, 115, 197, 248, 24, 54, 213, 248, 28, 54, 64, - 242, 221, 87, 35, 240, 192, 115, 197, 248, 28, 54, 224, 243, 181, 243, - 2, 224, 10, 32, 224, 243, 177, 243, 213, 248, 224, 49, 155, 3, 1, 213, - 1, 63, 246, 209, 0, 35, 197, 248, 96, 54, 49, 121, 243, 120, 213, 248, - 100, 38, 9, 6, 27, 5, 1, 240, 112, 97, 3, 244, 112, 3, 34, 240, 127, - 98, 11, 67, 19, 67, 197, 248, 100, 54, 2, 35, 197, 248, 96, 54, 213, - 248, 100, 54, 114, 121, 35, 240, 254, 83, 35, 244, 120, 19, 67, 234, - 2, 83, 67, 244, 128, 35, 197, 248, 100, 54, 3, 35, 197, 248, 96, 54, - 213, 248, 100, 38, 179, 104, 2, 240, 127, 66, 35, 240, 127, 67, 19, - 67, 197, 248, 100, 54, 35, 106, 1, 43, 5, 221, 213, 248, 0, 54, 67, - 244, 128, 99, 197, 248, 0, 54, 178, 120, 213, 248, 0, 22, 146, 0, 79, - 246, 131, 115, 2, 240, 124, 2, 11, 64, 19, 67, 50, 136, 127, 50, 210, - 17, 1, 58, 67, 234, 2, 67, 197, 248, 0, 54, 248, 189, 0, 0, 45, 233, - 255, 65, 3, 106, 4, 70, 4, 43, 71, 106, 3, 221, 7, 240, 248, 103, 191, - 13, 2, 224, 7, 240, 240, 119, 127, 13, 32, 70, 228, 243, 223, 246, 0, - 33, 128, 70, 32, 70, 229, 243, 172, 240, 0, 37, 6, 70, 19, 224, 16, - 33, 104, 70, 13, 74, 43, 70, 219, 243, 247, 247, 0, 32, 105, 70, 220, - 243, 119, 244, 56, 177, 0, 33, 10, 70, 220, 243, 50, 243, 198, 248, - 88, 86, 198, 248, 92, 6, 1, 53, 235, 178, 187, 66, 232, 211, 32, 70, - 65, 70, 229, 243, 142, 240, 189, 232, 255, 129, 99, 54, 134, 0, 45, - 233, 255, 65, 5, 70, 228, 243, 179, 246, 0, 33, 128, 70, 40, 70, 229, - 243, 128, 240, 43, 106, 7, 70, 4, 43, 110, 106, 1, 221, 246, 14, 2, - 224, 6, 240, 240, 86, 118, 14, 0, 36, 19, 224, 16, 33, 104, 70, 12, - 74, 35, 70, 219, 243, 194, 247, 0, 32, 105, 70, 220, 243, 66, 244, 56, - 177, 0, 33, 10, 70, 220, 243, 253, 242, 199, 248, 80, 70, 199, 248, - 84, 6, 1, 52, 180, 66, 233, 209, 40, 70, 65, 70, 229, 243, 90, 240, - 189, 232, 255, 129, 91, 54, 134, 0, 247, 181, 5, 58, 6, 70, 31, 70, - 6, 42, 46, 216, 223, 232, 2, 240, 4, 22, 11, 15, 8, 45, 18, 0, 4, 35, - 15, 37, 1, 36, 16, 224, 4, 35, 15, 37, 8, 224, 3, 35, 31, 37, 0, 36, - 9, 224, 3, 35, 31, 37, 5, 224, 2, 35, 3, 37, 17, 36, 2, 224, 4, 35, - 15, 37, 5, 36, 47, 64, 167, 64, 0, 147, 0, 33, 79, 244, 203, 98, 79, - 240, 255, 51, 48, 70, 228, 243, 96, 246, 48, 70, 0, 33, 64, 242, 92, - 98, 21, 250, 4, 243, 0, 151, 228, 243, 87, 246, 254, 189, 45, 233, 240, - 67, 0, 36, 133, 176, 5, 70, 2, 148, 3, 148, 228, 243, 69, 246, 33, 70, - 128, 70, 40, 70, 229, 243, 18, 240, 111, 106, 4, 70, 7, 244, 248, 87, - 63, 10, 3, 38, 75, 75, 1, 62, 3, 235, 198, 2, 19, 248, 54, 48, 196, - 248, 32, 54, 83, 104, 196, 248, 40, 54, 0, 46, 242, 209, 29, 224, 8, - 33, 104, 70, 68, 74, 51, 70, 219, 243, 76, 247, 0, 32, 105, 70, 220, - 243, 204, 243, 136, 177, 0, 33, 10, 70, 220, 243, 135, 242, 43, 106, - 12, 43, 6, 221, 176, 245, 128, 63, 3, 210, 195, 178, 0, 10, 67, 234, - 0, 64, 196, 248, 32, 102, 196, 248, 40, 6, 1, 54, 190, 66, 223, 209, - 79, 240, 3, 9, 53, 78, 9, 241, 255, 57, 6, 235, 9, 22, 243, 104, 11, - 185, 0, 35, 33, 224, 40, 70, 152, 71, 0, 179, 249, 231, 1, 33, 153, - 64, 50, 104, 17, 66, 23, 208, 196, 248, 32, 54, 150, 249, 4, 32, 34, - 177, 1, 42, 4, 208, 1, 50, 14, 209, 6, 224, 178, 104, 9, 224, 212, 248, - 36, 22, 178, 104, 10, 67, 4, 224, 212, 248, 36, 38, 177, 104, 34, 234, - 1, 2, 196, 248, 36, 38, 1, 51, 187, 66, 223, 209, 185, 241, 0, 15, 207, - 209, 78, 70, 19, 224, 8, 33, 104, 70, 28, 74, 51, 70, 219, 243, 248, - 246, 0, 32, 105, 70, 220, 243, 120, 243, 56, 177, 0, 33, 196, 248, 32, - 102, 10, 70, 220, 243, 49, 242, 196, 248, 36, 6, 1, 54, 190, 66, 233, - 209, 2, 169, 3, 170, 40, 70, 223, 243, 23, 245, 3, 155, 2, 154, 212, - 248, 28, 22, 19, 67, 25, 67, 3, 147, 196, 248, 28, 22, 35, 177, 196, - 248, 28, 54, 10, 177, 196, 248, 24, 38, 79, 244, 250, 96, 224, 243, - 24, 242, 40, 70, 65, 70, 228, 243, 120, 247, 5, 176, 189, 232, 240, - 131, 0, 191, 128, 150, 2, 0, 81, 54, 134, 0, 80, 150, 2, 0, 86, 54, - 134, 0, 248, 181, 4, 70, 22, 70, 15, 70, 228, 243, 148, 245, 0, 33, - 5, 70, 32, 70, 228, 243, 97, 247, 57, 70, 2, 70, 51, 70, 32, 70, 255, - 247, 21, 254, 32, 70, 41, 70, 189, 232, 248, 64, 228, 243, 85, 183, - 56, 181, 4, 70, 228, 243, 127, 245, 0, 33, 5, 70, 32, 70, 228, 243, - 76, 247, 35, 106, 1, 43, 4, 209, 208, 248, 0, 54, 35, 244, 0, 115, 4, - 224, 5, 221, 208, 248, 0, 54, 67, 244, 0, 115, 192, 248, 0, 54, 32, - 70, 41, 70, 189, 232, 56, 64, 228, 243, 55, 183, 0, 0, 56, 181, 4, 70, - 13, 70, 255, 247, 167, 254, 0, 34, 41, 70, 32, 70, 223, 243, 8, 246, - 32, 70, 228, 243, 87, 245, 11, 73, 5, 70, 0, 32, 220, 243, 208, 242, - 79, 244, 0, 34, 16, 240, 1, 3, 79, 240, 0, 1, 32, 70, 24, 191, 19, 70, - 223, 243, 41, 245, 32, 70, 41, 70, 189, 232, 56, 64, 228, 243, 19, 183, - 0, 191, 120, 54, 134, 0, 248, 181, 3, 106, 5, 70, 9, 43, 42, 221, 228, - 243, 55, 245, 0, 33, 6, 70, 40, 70, 228, 243, 4, 247, 208, 248, 8, 70, - 7, 70, 20, 244, 128, 116, 24, 208, 79, 240, 0, 67, 192, 248, 108, 54, - 79, 244, 122, 112, 224, 243, 146, 241, 215, 248, 108, 70, 0, 35, 228, - 4, 228, 12, 100, 3, 199, 248, 108, 54, 4, 245, 66, 68, 7, 75, 4, 245, - 168, 116, 180, 251, 243, 244, 100, 35, 92, 67, 40, 70, 49, 70, 228, - 243, 225, 246, 0, 224, 0, 36, 32, 70, 248, 189, 0, 191, 160, 134, 1, - 0, 248, 181, 4, 70, 13, 70, 0, 32, 22, 73, 220, 243, 127, 242, 22, 73, - 135, 178, 0, 32, 220, 243, 122, 242, 64, 242, 220, 81, 0, 47, 24, 191, - 57, 70, 198, 178, 32, 70, 255, 247, 107, 253, 0, 40, 12, 219, 199, 178, - 41, 70, 32, 70, 7, 34, 59, 70, 255, 247, 102, 254, 32, 70, 41, 70, 8, - 34, 59, 70, 255, 247, 96, 254, 46, 177, 32, 70, 41, 70, 50, 70, 1, 35, - 230, 247, 123, 252, 32, 70, 41, 70, 189, 232, 248, 64, 255, 247, 231, - 189, 0, 191, 111, 54, 134, 0, 236, 219, 1, 0, 56, 181, 0, 33, 5, 70, - 16, 32, 223, 243, 148, 247, 0, 33, 4, 70, 16, 34, 219, 243, 169, 245, - 101, 96, 32, 70, 56, 189, 56, 181, 12, 70, 21, 70, 228, 243, 251, 245, - 16, 33, 224, 243, 230, 243, 72, 177, 16, 35, 67, 96, 5, 75, 196, 96, - 26, 104, 133, 96, 2, 96, 24, 96, 0, 32, 56, 189, 111, 240, 26, 0, 56, - 189, 108, 39, 0, 0, 8, 181, 6, 75, 27, 104, 59, 185, 5, 75, 25, 104, - 33, 177, 5, 75, 26, 104, 10, 177, 255, 247, 220, 255, 0, 32, 8, 189, - 108, 39, 0, 0, 216, 255, 1, 0, 220, 255, 1, 0, 56, 181, 12, 70, 21, - 70, 228, 243, 207, 245, 16, 33, 224, 243, 186, 243, 144, 177, 16, 35, - 10, 74, 67, 96, 0, 35, 3, 96, 19, 104, 196, 96, 133, 96, 27, 185, 16, - 96, 24, 70, 56, 189, 19, 70, 26, 104, 0, 42, 251, 209, 24, 96, 16, 70, - 56, 189, 111, 240, 26, 0, 56, 189, 0, 191, 108, 39, 0, 0, 56, 181, 12, - 70, 21, 70, 228, 243, 173, 245, 16, 33, 224, 243, 152, 243, 72, 177, - 16, 35, 67, 96, 5, 75, 196, 96, 26, 104, 133, 96, 2, 96, 24, 96, 0, - 32, 56, 189, 111, 240, 26, 0, 56, 189, 108, 39, 0, 0, 1, 32, 112, 71, - 0, 32, 112, 71, 56, 181, 65, 242, 228, 67, 4, 70, 195, 98, 13, 70, 41, - 177, 8, 70, 9, 73, 220, 243, 205, 241, 160, 98, 64, 185, 0, 32, 7, 73, - 220, 243, 199, 241, 160, 98, 16, 185, 79, 246, 255, 115, 163, 98, 40, - 70, 4, 73, 220, 243, 190, 241, 32, 99, 56, 189, 84, 55, 134, 0, 91, - 55, 134, 0, 134, 55, 134, 0, 48, 181, 133, 176, 1, 144, 0, 36, 4, 168, - 64, 248, 4, 77, 1, 169, 4, 34, 219, 243, 171, 244, 1, 157, 205, 177, - 43, 70, 211, 248, 136, 32, 18, 177, 0, 34, 195, 248, 136, 32, 1, 52, - 4, 51, 16, 44, 245, 209, 3, 152, 219, 243, 57, 244, 3, 152, 230, 247, - 232, 251, 5, 75, 157, 66, 5, 208, 104, 109, 41, 70, 79, 244, 86, 114, - 224, 243, 75, 243, 5, 176, 48, 189, 0, 191, 120, 9, 2, 0, 45, 233, 248, - 67, 0, 33, 4, 70, 152, 70, 8, 159, 221, 248, 36, 144, 228, 243, 212, - 245, 5, 70, 32, 70, 228, 243, 16, 244, 10, 40, 200, 191, 235, 106, 96, - 97, 200, 191, 99, 100, 34, 40, 107, 104, 200, 191, 213, 248, 172, 32, - 163, 97, 200, 191, 226, 97, 219, 0, 4, 213, 213, 248, 4, 54, 99, 98, - 219, 178, 35, 98, 79, 244, 224, 99, 163, 96, 79, 240, 255, 51, 227, - 96, 17, 35, 35, 97, 38, 70, 0, 37, 19, 224, 41, 70, 228, 243, 173, 245, - 32, 70, 228, 243, 234, 243, 184, 241, 0, 15, 3, 208, 214, 248, 16, 49, - 152, 69, 3, 208, 214, 248, 136, 48, 153, 69, 0, 209, 61, 96, 1, 53, - 4, 54, 212, 248, 204, 48, 32, 70, 157, 66, 230, 211, 57, 104, 228, 243, - 148, 245, 1, 32, 189, 232, 248, 131, 0, 0, 45, 233, 255, 71, 12, 157, - 146, 70, 221, 248, 52, 144, 136, 70, 79, 244, 86, 114, 0, 33, 4, 70, - 31, 70, 14, 158, 1, 45, 8, 191, 0, 37, 219, 243, 142, 244, 17, 35, 35, - 97, 196, 248, 132, 112, 196, 248, 88, 144, 196, 248, 84, 160, 101, 96, - 0, 45, 64, 240, 179, 128, 32, 70, 41, 70, 66, 70, 75, 70, 255, 247, - 60, 255, 0, 40, 0, 240, 174, 128, 79, 240, 192, 89, 217, 248, 0, 48, - 32, 70, 26, 15, 34, 96, 154, 178, 162, 99, 3, 244, 112, 34, 3, 244, - 112, 3, 27, 13, 35, 100, 14, 59, 18, 12, 1, 43, 140, 191, 0, 35, 1, - 35, 226, 99, 132, 248, 72, 48, 73, 70, 66, 70, 254, 247, 63, 248, 212, - 248, 204, 48, 0, 43, 0, 240, 139, 128, 4, 171, 67, 248, 4, 93, 141, - 232, 136, 0, 32, 70, 73, 70, 42, 70, 43, 70, 255, 247, 95, 255, 0, 40, - 127, 208, 32, 70, 255, 247, 186, 254, 15, 155, 0, 150, 1, 147, 32, 70, - 41, 70, 58, 70, 99, 109, 255, 247, 195, 251, 0, 40, 115, 209, 6, 177, - 54, 104, 59, 79, 32, 70, 49, 70, 255, 247, 250, 254, 61, 120, 0, 45, - 47, 209, 99, 105, 19, 43, 11, 221, 79, 244, 0, 97, 32, 70, 42, 70, 228, - 243, 8, 245, 3, 153, 133, 101, 197, 101, 32, 70, 228, 243, 20, 245, - 32, 70, 97, 109, 255, 247, 187, 253, 32, 70, 97, 109, 255, 247, 214, - 253, 48, 70, 44, 73, 220, 243, 180, 240, 2, 70, 32, 185, 32, 70, 97, - 109, 255, 247, 242, 253, 2, 70, 32, 70, 97, 109, 255, 247, 145, 253, - 32, 70, 97, 109, 255, 247, 217, 252, 32, 70, 97, 109, 255, 247, 27, - 254, 1, 35, 59, 112, 99, 105, 15, 43, 15, 221, 31, 73, 48, 70, 220, - 243, 152, 240, 30, 75, 0, 33, 0, 40, 8, 191, 24, 70, 0, 144, 136, 34, - 32, 70, 79, 240, 255, 51, 228, 243, 22, 243, 48, 70, 25, 73, 220, 243, - 180, 240, 56, 177, 23, 73, 48, 70, 220, 243, 131, 240, 1, 70, 32, 70, - 230, 247, 230, 250, 99, 105, 20, 43, 23, 221, 0, 37, 41, 70, 8, 34, - 43, 70, 32, 70, 0, 149, 228, 243, 254, 242, 41, 70, 64, 240, 4, 3, 8, - 34, 32, 70, 0, 147, 228, 243, 246, 242, 6, 224, 0, 36, 4, 224, 28, 70, - 2, 224, 4, 70, 0, 224, 44, 70, 32, 70, 4, 176, 189, 232, 240, 135, 208, - 12, 2, 0, 226, 56, 134, 0, 235, 56, 134, 0, 90, 0, 10, 0, 241, 56, 134, - 0, 31, 181, 15, 76, 2, 70, 35, 120, 187, 185, 16, 185, 3, 70, 1, 70, - 1, 224, 12, 75, 25, 29, 0, 32, 0, 144, 1, 144, 2, 147, 3, 145, 9, 72, - 68, 242, 16, 113, 79, 240, 192, 83, 255, 247, 3, 255, 40, 177, 6, 75, - 32, 34, 26, 96, 1, 35, 35, 112, 3, 72, 4, 176, 16, 189, 116, 9, 2, 0, - 244, 9, 2, 0, 120, 9, 2, 0, 116, 39, 0, 0, 45, 233, 255, 71, 128, 70, - 15, 70, 8, 70, 79, 244, 86, 113, 145, 70, 154, 70, 13, 158, 14, 157, - 224, 243, 205, 241, 4, 70, 216, 177, 12, 155, 65, 70, 1, 147, 58, 70, - 75, 70, 205, 248, 0, 160, 2, 150, 3, 149, 255, 247, 216, 254, 128, 70, - 56, 185, 33, 70, 56, 70, 79, 244, 86, 114, 224, 243, 200, 241, 68, 70, - 6, 224, 6, 177, 54, 104, 230, 103, 5, 177, 45, 104, 196, 248, 128, 80, - 32, 70, 4, 176, 189, 232, 240, 135, 0, 32, 219, 243, 252, 183, 16, 181, - 11, 73, 4, 70, 255, 247, 248, 255, 128, 178, 120, 185, 224, 111, 7, - 73, 219, 243, 241, 247, 128, 178, 72, 185, 224, 111, 5, 73, 219, 243, - 235, 247, 79, 246, 255, 115, 128, 178, 0, 40, 8, 191, 24, 70, 16, 189, - 72, 55, 134, 0, 78, 55, 134, 0, 115, 181, 0, 35, 173, 248, 6, 48, 131, - 105, 4, 70, 153, 0, 101, 213, 131, 104, 179, 245, 2, 111, 9, 208, 64, - 246, 4, 2, 147, 66, 7, 209, 197, 104, 12, 45, 148, 191, 0, 37, 1, 37, - 2, 224, 1, 37, 0, 224, 0, 37, 237, 178, 77, 185, 32, 70, 79, 244, 0, - 97, 42, 70, 212, 248, 200, 96, 228, 243, 255, 243, 48, 185, 72, 224, - 212, 248, 132, 0, 16, 245, 64, 80, 67, 208, 0, 38, 99, 105, 34, 43, - 79, 240, 0, 3, 216, 191, 192, 248, 104, 49, 192, 248, 100, 49, 192, - 248, 96, 49, 99, 105, 34, 43, 3, 220, 29, 75, 192, 248, 68, 49, 5, 224, - 1, 35, 192, 248, 72, 49, 255, 35, 192, 248, 76, 49, 99, 105, 34, 43, - 79, 240, 0, 3, 6, 220, 192, 248, 128, 49, 192, 248, 124, 49, 192, 248, - 120, 49, 3, 224, 192, 248, 116, 49, 192, 248, 112, 49, 29, 185, 32, - 70, 49, 70, 228, 243, 220, 243, 32, 70, 13, 241, 6, 1, 255, 247, 169, - 253, 144, 185, 189, 248, 6, 0, 128, 177, 99, 105, 32, 70, 34, 43, 217, - 191, 79, 244, 128, 33, 10, 70, 6, 73, 64, 34, 0, 35, 228, 243, 23, 242, - 2, 224, 79, 240, 255, 48, 0, 224, 0, 32, 124, 189, 0, 191, 0, 0, 251, - 191, 64, 0, 85, 85, 45, 233, 255, 65, 3, 104, 5, 70, 112, 33, 216, 104, - 224, 243, 12, 241, 4, 70, 0, 40, 67, 208, 0, 33, 112, 34, 219, 243, - 189, 242, 4, 35, 99, 96, 180, 35, 37, 96, 163, 129, 160, 70, 39, 70, - 0, 38, 13, 224, 24, 34, 2, 251, 6, 66, 60, 97, 168, 104, 27, 73, 16, - 50, 0, 35, 232, 243, 230, 245, 56, 98, 24, 55, 240, 177, 1, 54, 99, - 104, 158, 66, 238, 219, 22, 75, 22, 73, 0, 147, 0, 35, 1, 147, 2, 147, - 3, 147, 40, 104, 20, 74, 35, 70, 253, 243, 227, 241, 24, 224, 216, 248, - 32, 16, 49, 177, 35, 104, 152, 104, 232, 243, 175, 245, 0, 35, 200, - 248, 32, 48, 1, 53, 8, 241, 24, 8, 0, 224, 5, 70, 99, 104, 157, 66, - 237, 219, 35, 104, 33, 70, 88, 104, 112, 34, 224, 243, 214, 240, 0, - 36, 32, 70, 4, 176, 189, 232, 240, 129, 0, 191, 97, 212, 0, 0, 175, - 210, 0, 0, 212, 220, 1, 0, 249, 220, 1, 0, 112, 181, 4, 70, 0, 40, 38, - 208, 3, 104, 19, 73, 24, 104, 34, 70, 253, 243, 234, 241, 37, 70, 0, - 38, 16, 224, 41, 106, 41, 177, 35, 104, 152, 104, 232, 243, 125, 245, - 0, 35, 43, 98, 233, 105, 33, 177, 35, 104, 42, 139, 88, 104, 224, 243, - 172, 240, 1, 54, 24, 53, 99, 104, 158, 66, 235, 219, 24, 34, 90, 67, - 33, 104, 16, 50, 72, 104, 33, 70, 189, 232, 112, 64, 224, 243, 157, - 176, 112, 189, 248, 220, 1, 0, 0, 32, 112, 71, 16, 181, 4, 70, 168, - 177, 9, 240, 61, 223, 10, 73, 96, 104, 34, 70, 253, 243, 186, 241, 225, - 110, 33, 177, 99, 104, 60, 34, 216, 104, 224, 243, 135, 240, 99, 104, - 33, 70, 216, 104, 112, 34, 189, 232, 16, 64, 224, 243, 127, 176, 16, - 189, 213, 141, 134, 0, 48, 181, 112, 33, 133, 176, 5, 70, 64, 104, 224, - 243, 101, 240, 4, 70, 0, 40, 47, 208, 0, 33, 112, 34, 219, 243, 22, - 242, 43, 104, 37, 96, 99, 96, 104, 104, 60, 33, 224, 243, 87, 240, 224, - 102, 240, 177, 0, 33, 60, 34, 219, 243, 9, 242, 17, 75, 17, 73, 0, 147, - 0, 35, 1, 147, 2, 147, 16, 75, 16, 74, 3, 147, 96, 104, 35, 70, 253, - 243, 72, 241, 96, 185, 1, 35, 99, 130, 163, 130, 32, 70, 41, 70, 255, - 247, 178, 255, 0, 40, 3, 219, 32, 70, 9, 240, 237, 223, 3, 224, 32, - 70, 255, 247, 171, 255, 0, 36, 32, 70, 5, 176, 48, 189, 0, 191, 57, - 11, 131, 0, 64, 225, 133, 0, 41, 12, 131, 0, 213, 141, 134, 0, 16, 181, - 4, 70, 104, 177, 3, 104, 34, 70, 24, 104, 5, 73, 253, 243, 89, 241, - 35, 104, 33, 70, 88, 104, 8, 34, 189, 232, 16, 64, 224, 243, 37, 176, - 16, 189, 204, 187, 134, 0, 127, 181, 5, 70, 8, 33, 64, 104, 224, 243, - 12, 240, 4, 70, 24, 179, 0, 33, 8, 34, 219, 243, 190, 241, 0, 38, 4, - 33, 40, 70, 16, 74, 16, 75, 0, 150, 1, 148, 1, 240, 35, 255, 176, 66, - 96, 96, 15, 219, 13, 75, 40, 104, 0, 147, 13, 75, 13, 73, 1, 147, 13, - 75, 14, 74, 3, 147, 35, 70, 2, 150, 253, 243, 241, 240, 8, 185, 37, - 96, 3, 224, 32, 70, 255, 247, 193, 255, 0, 36, 32, 70, 4, 176, 112, - 189, 0, 191, 139, 221, 0, 0, 123, 231, 0, 0, 127, 221, 0, 0, 123, 221, - 0, 0, 56, 221, 1, 0, 119, 221, 0, 0, 204, 187, 134, 0, 248, 181, 5, - 104, 4, 70, 27, 73, 40, 104, 34, 70, 253, 243, 8, 241, 0, 38, 179, 1, - 3, 245, 132, 115, 225, 88, 231, 24, 25, 177, 104, 104, 58, 137, 223, - 243, 209, 247, 121, 104, 25, 177, 104, 104, 122, 137, 223, 243, 203, - 247, 1, 54, 4, 46, 236, 209, 212, 248, 12, 18, 33, 177, 104, 104, 180, - 248, 16, 34, 223, 243, 192, 247, 212, 248, 28, 18, 17, 177, 168, 104, - 232, 243, 130, 244, 212, 248, 32, 18, 25, 177, 104, 104, 4, 34, 223, - 243, 179, 247, 104, 104, 33, 70, 79, 244, 35, 114, 189, 232, 248, 64, - 223, 243, 171, 183, 0, 191, 68, 221, 1, 0, 45, 233, 240, 65, 6, 70, - 15, 70, 192, 104, 44, 33, 21, 70, 152, 70, 223, 243, 142, 247, 4, 70, - 192, 177, 0, 33, 44, 34, 219, 243, 64, 241, 229, 96, 40, 70, 196, 248, - 28, 128, 167, 96, 38, 97, 8, 73, 34, 70, 0, 35, 232, 243, 113, 244, - 5, 70, 160, 97, 48, 185, 35, 105, 33, 70, 216, 104, 44, 34, 223, 243, - 132, 247, 44, 70, 32, 70, 189, 232, 240, 129, 61, 102, 132, 0, 16, 181, - 4, 70, 232, 247, 67, 248, 161, 105, 97, 177, 35, 125, 35, 177, 224, - 104, 232, 243, 41, 244, 0, 35, 35, 117, 224, 104, 161, 105, 232, 243, - 53, 244, 0, 35, 163, 97, 35, 105, 33, 70, 216, 104, 44, 34, 223, 243, - 101, 247, 0, 32, 16, 189, 0, 0, 56, 181, 5, 104, 4, 70, 34, 70, 40, - 104, 5, 73, 253, 243, 134, 240, 104, 104, 33, 70, 80, 34, 189, 232, - 56, 64, 223, 243, 83, 183, 0, 191, 60, 228, 134, 0, 31, 181, 8, 74, - 3, 70, 0, 146, 0, 34, 1, 146, 2, 146, 3, 146, 5, 73, 6, 74, 0, 104, - 253, 243, 55, 240, 0, 48, 24, 191, 1, 32, 5, 176, 0, 189, 241, 243, - 0, 0, 180, 222, 1, 0, 8, 222, 1, 0, 112, 181, 208, 248, 184, 64, 14, - 70, 8, 70, 0, 41, 31, 208, 219, 243, 103, 241, 5, 70, 144, 185, 26, - 224, 32, 70, 49, 70, 42, 70, 219, 243, 79, 240, 40, 185, 99, 93, 61, - 43, 2, 209, 1, 53, 96, 25, 112, 189, 35, 70, 19, 248, 1, 43, 28, 70, - 0, 42, 250, 209, 20, 177, 35, 120, 0, 43, 233, 209, 48, 70, 189, 232, - 112, 64, 224, 243, 207, 182, 112, 189, 45, 233, 243, 65, 0, 245, 154, - 88, 184, 248, 24, 48, 4, 70, 14, 70, 51, 179, 8, 70, 219, 243, 60, 241, - 7, 70, 23, 72, 219, 243, 56, 241, 63, 24, 227, 105, 16, 55, 191, 178, - 152, 104, 57, 70, 223, 243, 232, 246, 5, 70, 224, 177, 184, 248, 24, - 48, 16, 74, 0, 147, 57, 70, 51, 70, 219, 243, 218, 240, 41, 70, 32, - 70, 233, 247, 244, 255, 227, 105, 128, 70, 41, 70, 152, 104, 58, 70, - 223, 243, 227, 246, 184, 241, 0, 15, 7, 209, 32, 70, 49, 70, 2, 176, - 189, 232, 240, 65, 233, 247, 227, 191, 128, 70, 64, 70, 2, 176, 189, - 232, 240, 129, 204, 223, 1, 0, 210, 223, 1, 0, 45, 233, 240, 79, 0, - 245, 154, 89, 28, 70, 185, 248, 24, 48, 133, 176, 6, 70, 136, 70, 146, - 70, 208, 248, 184, 112, 0, 43, 56, 208, 8, 70, 219, 243, 246, 240, 131, - 70, 37, 72, 219, 243, 242, 240, 131, 68, 243, 105, 11, 241, 16, 11, - 31, 250, 139, 251, 152, 104, 89, 70, 223, 243, 160, 246, 5, 70, 0, 40, - 51, 208, 185, 248, 24, 48, 89, 70, 0, 147, 28, 74, 67, 70, 219, 243, - 145, 240, 48, 70, 41, 70, 233, 247, 183, 255, 3, 144, 104, 177, 56, - 70, 41, 70, 219, 247, 111, 252, 64, 177, 80, 69, 6, 221, 56, 70, 41, - 70, 82, 70, 219, 243, 229, 244, 129, 70, 0, 224, 161, 70, 243, 105, - 41, 70, 152, 104, 90, 70, 223, 243, 138, 246, 3, 155, 139, 185, 56, - 70, 65, 70, 219, 247, 88, 252, 88, 177, 80, 69, 9, 221, 56, 70, 65, - 70, 82, 70, 5, 176, 189, 232, 240, 79, 219, 243, 203, 180, 129, 70, - 0, 224, 161, 70, 72, 70, 5, 176, 189, 232, 240, 143, 204, 223, 1, 0, - 210, 223, 1, 0, 112, 181, 144, 248, 196, 48, 1, 38, 27, 73, 158, 64, - 5, 70, 233, 247, 148, 255, 5, 245, 128, 84, 192, 178, 132, 248, 50, - 0, 1, 56, 192, 178, 1, 62, 253, 40, 246, 178, 2, 217, 115, 35, 132, - 248, 50, 48, 148, 248, 50, 48, 40, 70, 132, 248, 51, 48, 16, 73, 233, - 247, 126, 255, 192, 178, 132, 248, 52, 0, 5, 245, 128, 85, 8, 177, 15, - 40, 2, 209, 5, 35, 133, 248, 52, 48, 149, 248, 50, 32, 149, 248, 52, - 48, 70, 234, 6, 22, 211, 26, 133, 248, 53, 48, 0, 35, 133, 248, 54, - 48, 133, 248, 56, 48, 133, 248, 55, 96, 112, 189, 0, 191, 241, 150, - 2, 0, 203, 150, 2, 0, 56, 181, 152, 33, 5, 70, 0, 104, 223, 243, 24, - 246, 4, 70, 0, 40, 50, 208, 0, 33, 152, 34, 218, 243, 201, 247, 43, - 104, 163, 96, 107, 104, 227, 96, 171, 104, 35, 97, 235, 104, 99, 96, - 43, 105, 99, 97, 43, 140, 163, 132, 107, 140, 227, 132, 107, 106, 163, - 98, 171, 106, 227, 98, 235, 106, 35, 99, 43, 107, 99, 99, 107, 107, - 99, 100, 171, 107, 163, 100, 235, 107, 227, 100, 43, 108, 35, 101, 107, - 108, 99, 101, 107, 105, 163, 101, 171, 105, 227, 101, 15, 35, 35, 102, - 60, 35, 99, 102, 120, 35, 163, 102, 3, 35, 227, 102, 0, 35, 132, 248, - 148, 48, 32, 70, 56, 189, 1, 70, 24, 177, 128, 104, 152, 34, 223, 243, - 234, 181, 112, 71, 16, 181, 176, 248, 188, 64, 12, 128, 176, 248, 192, - 16, 17, 128, 176, 248, 198, 32, 26, 128, 144, 248, 200, 32, 2, 155, - 1, 32, 26, 128, 16, 189, 144, 248, 212, 0, 112, 71, 208, 248, 204, 0, - 112, 71, 0, 0, 56, 181, 1, 33, 4, 70, 233, 247, 217, 255, 32, 70, 233, - 247, 168, 253, 15, 77, 3, 15, 5, 64, 45, 11, 132, 248, 200, 48, 66, - 242, 100, 3, 0, 240, 15, 0, 157, 66, 164, 248, 198, 80, 132, 248, 201, - 0, 7, 208, 66, 242, 102, 3, 157, 66, 20, 191, 79, 240, 255, 53, 0, 37, - 0, 224, 0, 37, 32, 70, 0, 33, 234, 247, 187, 249, 40, 70, 56, 189, 0, - 191, 0, 240, 255, 15, 45, 233, 240, 71, 138, 70, 0, 33, 208, 248, 8, - 144, 4, 70, 21, 70, 192, 104, 10, 70, 152, 70, 227, 243, 77, 246, 3, - 7, 7, 70, 20, 213, 38, 104, 150, 177, 48, 70, 41, 70, 0, 240, 170, 250, - 0, 40, 0, 240, 95, 129, 243, 105, 214, 248, 204, 16, 24, 105, 41, 240, - 97, 218, 214, 248, 228, 48, 1, 51, 198, 248, 228, 48, 89, 225, 72, 70, - 65, 242, 136, 49, 223, 243, 110, 245, 6, 70, 0, 40, 0, 240, 81, 129, - 0, 33, 65, 242, 136, 50, 218, 243, 29, 247, 6, 245, 146, 83, 16, 51, - 6, 245, 142, 82, 83, 99, 1, 35, 134, 248, 225, 48, 226, 108, 65, 242, - 107, 3, 154, 66, 198, 248, 176, 160, 244, 97, 5, 209, 99, 108, 147, - 43, 12, 191, 1, 35, 24, 35, 0, 224, 24, 35, 166, 248, 34, 54, 100, 35, - 0, 33, 4, 34, 134, 248, 224, 48, 2, 45, 6, 245, 144, 83, 198, 248, 184, - 128, 131, 248, 56, 16, 131, 248, 57, 32, 131, 248, 58, 16, 131, 248, - 59, 32, 5, 209, 255, 7, 68, 191, 79, 244, 0, 83, 198, 248, 204, 48, - 214, 248, 204, 16, 32, 105, 41, 240, 21, 218, 214, 248, 176, 48, 179, - 248, 224, 115, 243, 105, 191, 178, 216, 104, 229, 247, 141, 255, 6, - 245, 154, 83, 24, 131, 240, 105, 7, 240, 15, 3, 198, 248, 192, 48, 130, - 74, 131, 106, 7, 244, 112, 97, 154, 24, 9, 10, 1, 42, 198, 248, 188, - 16, 7, 217, 74, 246, 230, 2, 147, 66, 3, 208, 74, 246, 226, 2, 147, - 66, 6, 209, 195, 106, 2, 59, 1, 43, 2, 216, 9, 35, 198, 248, 192, 48, - 9, 41, 7, 209, 4, 35, 198, 248, 188, 48, 214, 248, 192, 48, 16, 51, - 198, 248, 192, 48, 1, 35, 134, 248, 196, 48, 214, 248, 188, 48, 63, - 11, 2, 43, 198, 248, 208, 112, 7, 217, 10, 43, 0, 242, 204, 128, 79, - 240, 122, 98, 154, 64, 64, 241, 199, 128, 6, 245, 128, 83, 60, 34, 90, - 97, 0, 34, 154, 97, 79, 244, 0, 98, 166, 248, 222, 32, 66, 246, 1, 51, - 65, 246, 36, 50, 2, 45, 24, 191, 19, 70, 166, 248, 218, 48, 134, 248, - 0, 55, 48, 70, 94, 73, 233, 247, 244, 253, 136, 177, 92, 73, 48, 70, - 247, 105, 233, 247, 7, 254, 89, 73, 56, 103, 48, 70, 247, 105, 233, - 247, 1, 254, 243, 105, 120, 103, 2, 45, 12, 191, 26, 111, 90, 111, 218, - 102, 6, 245, 144, 82, 10, 35, 147, 113, 3, 35, 211, 113, 1, 34, 0, 39, - 134, 248, 232, 32, 6, 245, 145, 82, 23, 112, 6, 245, 128, 88, 9, 34, - 136, 248, 59, 32, 242, 105, 134, 248, 233, 117, 134, 248, 238, 117, - 134, 248, 243, 117, 134, 248, 248, 117, 134, 248, 253, 117, 48, 70, - 130, 248, 147, 48, 255, 247, 59, 254, 6, 245, 150, 83, 79, 246, 206, - 114, 154, 132, 136, 248, 57, 112, 134, 248, 244, 112, 51, 70, 127, 34, - 1, 55, 131, 248, 44, 38, 131, 248, 145, 38, 131, 248, 178, 34, 1, 51, - 101, 47, 244, 209, 79, 240, 255, 51, 166, 248, 250, 54, 0, 35, 134, - 248, 172, 48, 48, 70, 41, 70, 1, 240, 161, 249, 0, 40, 86, 208, 48, - 70, 233, 247, 85, 252, 48, 70, 255, 247, 175, 254, 5, 70, 0, 40, 77, - 209, 45, 73, 6, 34, 48, 70, 233, 247, 155, 253, 6, 245, 152, 87, 184, - 113, 42, 73, 1, 34, 48, 70, 233, 247, 147, 253, 41, 73, 56, 117, 42, - 70, 48, 70, 233, 247, 141, 253, 6, 245, 154, 87, 184, 118, 37, 73, 48, - 70, 7, 34, 233, 247, 133, 253, 248, 118, 42, 70, 48, 70, 34, 73, 233, - 247, 163, 253, 115, 25, 1, 53, 3, 245, 154, 83, 24, 45, 24, 119, 243, - 209, 0, 37, 42, 70, 48, 70, 29, 73, 233, 247, 150, 253, 115, 25, 1, - 53, 3, 245, 154, 83, 14, 45, 131, 248, 52, 0, 242, 209, 214, 248, 228, - 48, 1, 51, 198, 248, 228, 48, 243, 105, 26, 104, 216, 104, 198, 248, - 180, 32, 38, 96, 255, 247, 159, 250, 6, 241, 184, 3, 198, 248, 184, - 48, 48, 70, 6, 241, 188, 1, 28, 34, 218, 243, 117, 245, 6, 224, 49, - 70, 160, 104, 65, 242, 136, 50, 223, 243, 42, 244, 0, 38, 48, 70, 189, - 232, 240, 135, 29, 87, 255, 255, 252, 150, 2, 0, 160, 150, 2, 0, 191, - 150, 2, 0, 178, 150, 2, 0, 220, 150, 2, 0, 234, 150, 2, 0, 171, 150, - 2, 0, 112, 181, 4, 70, 0, 40, 50, 208, 208, 248, 228, 80, 1, 61, 192, - 248, 228, 80, 0, 45, 43, 209, 0, 245, 150, 86, 177, 106, 33, 177, 195, - 105, 24, 105, 244, 247, 15, 248, 181, 98, 4, 245, 142, 83, 0, 37, 131, - 248, 61, 80, 32, 70, 234, 247, 130, 254, 226, 105, 19, 104, 163, 66, - 3, 209, 212, 248, 180, 48, 19, 96, 5, 224, 211, 248, 180, 32, 162, 66, - 8, 191, 195, 248, 180, 80, 227, 110, 11, 177, 32, 70, 152, 71, 227, - 105, 33, 70, 152, 104, 65, 242, 136, 50, 189, 232, 112, 64, 223, 243, - 223, 179, 112, 189, 31, 181, 9, 75, 9, 73, 0, 147, 0, 35, 1, 147, 2, - 147, 3, 147, 7, 74, 3, 104, 252, 243, 198, 244, 0, 40, 20, 191, 79, - 240, 255, 48, 0, 32, 5, 176, 0, 189, 0, 191, 9, 44, 1, 0, 200, 229, - 1, 0, 148, 230, 1, 0, 1, 73, 2, 104, 252, 243, 236, 180, 148, 230, 1, - 0, 0, 35, 240, 181, 28, 70, 7, 224, 205, 24, 47, 104, 198, 24, 199, - 80, 45, 121, 1, 52, 53, 113, 5, 51, 148, 66, 245, 209, 240, 189, 0, - 0, 2, 41, 56, 181, 5, 70, 12, 70, 10, 208, 3, 41, 17, 208, 1, 41, 22, - 209, 6, 34, 11, 73, 233, 247, 99, 253, 235, 105, 0, 34, 5, 224, 6, 34, - 9, 73, 233, 247, 92, 253, 235, 105, 1, 34, 131, 248, 129, 32, 56, 189, - 6, 73, 6, 34, 233, 247, 83, 253, 235, 105, 131, 248, 129, 64, 56, 189, - 0, 191, 124, 236, 1, 0, 212, 238, 1, 0, 6, 238, 1, 0, 56, 181, 208, - 248, 168, 64, 0, 35, 196, 248, 116, 53, 148, 248, 193, 83, 16, 75, 17, - 74, 79, 244, 32, 113, 2, 45, 20, 191, 21, 70, 29, 70, 195, 105, 152, - 104, 223, 243, 98, 243, 196, 248, 116, 5, 136, 177, 128, 34, 41, 70, - 255, 247, 173, 255, 148, 248, 58, 53, 2, 43, 8, 209, 212, 248, 116, - 5, 6, 73, 160, 48, 21, 34, 255, 247, 162, 255, 1, 32, 56, 189, 1, 32, - 56, 189, 104, 165, 2, 0, 4, 161, 2, 0, 104, 169, 2, 0, 45, 233, 240, - 71, 208, 248, 168, 48, 6, 70, 211, 248, 124, 85, 211, 248, 120, 117, - 0, 36, 27, 224, 79, 240, 20, 8, 8, 251, 4, 248, 5, 235, 8, 3, 26, 105, - 91, 104, 85, 248, 8, 160, 3, 251, 2, 249, 243, 105, 79, 234, 217, 9, - 152, 104, 73, 70, 223, 243, 40, 243, 69, 248, 8, 0, 64, 177, 81, 70, - 74, 70, 218, 243, 117, 244, 1, 52, 228, 178, 188, 66, 225, 211, 1, 32, - 189, 232, 240, 135, 45, 233, 240, 65, 28, 75, 208, 248, 168, 96, 27, - 104, 194, 105, 0, 39, 20, 33, 5, 70, 198, 248, 124, 117, 198, 248, 120, - 53, 144, 104, 89, 67, 223, 243, 8, 243, 4, 70, 198, 248, 124, 5, 16, - 179, 188, 70, 184, 70, 20, 224, 235, 105, 4, 235, 12, 7, 27, 109, 8, - 241, 1, 8, 19, 244, 128, 95, 20, 191, 13, 75, 14, 75, 3, 235, 12, 14, - 190, 232, 15, 0, 15, 199, 222, 248, 0, 48, 12, 241, 20, 12, 59, 96, - 214, 248, 120, 53, 152, 69, 230, 211, 1, 33, 40, 70, 255, 247, 158, - 255, 0, 48, 24, 191, 1, 32, 189, 232, 240, 129, 0, 191, 28, 252, 1, - 0, 160, 160, 2, 0, 4, 165, 2, 0, 45, 233, 240, 65, 15, 70, 134, 176, - 121, 73, 4, 70, 208, 248, 168, 80, 233, 247, 13, 252, 119, 73, 40, 114, - 32, 70, 233, 247, 8, 252, 118, 73, 104, 114, 32, 70, 233, 247, 3, 252, - 116, 73, 164, 248, 252, 0, 32, 70, 233, 247, 253, 251, 114, 73, 164, - 248, 254, 0, 32, 70, 233, 247, 247, 251, 112, 73, 164, 248, 0, 1, 32, - 70, 233, 247, 216, 251, 56, 177, 32, 70, 108, 73, 233, 247, 236, 251, - 16, 177, 1, 35, 133, 248, 232, 51, 149, 248, 232, 51, 19, 179, 103, - 73, 32, 70, 233, 247, 225, 251, 102, 73, 164, 248, 2, 1, 32, 70, 233, - 247, 219, 251, 100, 73, 164, 248, 4, 1, 32, 70, 233, 247, 213, 251, - 98, 73, 164, 248, 6, 1, 32, 70, 233, 247, 207, 251, 96, 73, 133, 248, - 36, 5, 32, 70, 233, 247, 201, 251, 4, 245, 128, 83, 0, 34, 133, 248, - 37, 5, 131, 248, 59, 32, 91, 73, 32, 70, 233, 247, 190, 251, 90, 73, - 197, 248, 52, 4, 20, 34, 32, 70, 233, 247, 170, 251, 87, 73, 165, 248, - 60, 4, 90, 34, 32, 70, 233, 247, 163, 251, 85, 73, 133, 248, 84, 4, - 8, 34, 32, 70, 233, 247, 156, 251, 82, 73, 133, 248, 76, 4, 3, 34, 32, - 70, 233, 247, 149, 251, 80, 73, 133, 248, 77, 4, 8, 34, 32, 70, 233, - 247, 142, 251, 77, 73, 133, 248, 78, 4, 3, 34, 32, 70, 233, 247, 135, - 251, 75, 73, 133, 248, 79, 4, 8, 34, 32, 70, 233, 247, 128, 251, 72, - 73, 133, 248, 80, 4, 3, 34, 32, 70, 233, 247, 121, 251, 70, 73, 133, - 248, 81, 4, 8, 34, 32, 70, 233, 247, 114, 251, 3, 34, 133, 248, 82, - 4, 66, 73, 32, 70, 233, 247, 107, 251, 65, 73, 133, 248, 83, 4, 32, - 70, 233, 247, 114, 251, 63, 73, 133, 248, 88, 4, 2, 34, 32, 70, 233, - 247, 94, 251, 60, 73, 133, 248, 193, 4, 32, 70, 233, 247, 76, 251, 24, - 177, 32, 70, 56, 73, 233, 247, 96, 251, 232, 116, 55, 73, 32, 70, 233, - 247, 66, 251, 40, 177, 32, 70, 52, 73, 233, 247, 86, 251, 40, 117, 1, - 224, 8, 35, 43, 117, 32, 70, 49, 73, 233, 247, 53, 251, 40, 177, 32, - 70, 47, 73, 233, 247, 73, 251, 104, 117, 1, 224, 2, 35, 107, 117, 32, - 70, 44, 73, 233, 247, 40, 251, 40, 177, 32, 70, 41, 73, 233, 247, 60, - 251, 168, 117, 1, 224, 4, 35, 171, 117, 32, 70, 38, 73, 233, 247, 27, - 251, 40, 177, 32, 70, 36, 73, 233, 247, 47, 251, 232, 117, 1, 224, 8, - 35, 235, 117, 32, 70, 33, 73, 233, 247, 14, 251, 0, 40, 63, 208, 32, - 70, 30, 73, 233, 247, 33, 251, 40, 118, 59, 224, 127, 158, 2, 0, 48, - 158, 2, 0, 104, 155, 2, 0, 110, 155, 2, 0, 116, 155, 2, 0, 76, 156, - 2, 0, 37, 155, 2, 0, 15, 154, 2, 0, 41, 152, 2, 0, 240, 151, 2, 0, 49, - 160, 2, 0, 200, 154, 2, 0, 9, 159, 2, 0, 135, 159, 2, 0, 169, 156, 2, - 0, 85, 159, 2, 0, 35, 151, 2, 0, 102, 159, 2, 0, 52, 151, 2, 0, 61, - 159, 2, 0, 74, 160, 2, 0, 231, 153, 2, 0, 106, 152, 2, 0, 105, 153, - 2, 0, 86, 153, 2, 0, 192, 157, 2, 0, 127, 159, 2, 0, 119, 159, 2, 0, - 243, 153, 2, 0, 2, 35, 43, 118, 183, 73, 32, 70, 233, 247, 223, 250, - 182, 73, 168, 114, 32, 70, 233, 247, 218, 250, 181, 73, 232, 114, 32, - 70, 233, 247, 213, 250, 170, 122, 235, 122, 40, 115, 106, 115, 171, - 115, 232, 115, 42, 116, 107, 116, 168, 116, 175, 73, 32, 70, 233, 247, - 200, 250, 180, 248, 252, 16, 4, 245, 152, 82, 4, 245, 154, 83, 81, 135, - 25, 128, 180, 248, 254, 16, 95, 250, 128, 248, 145, 135, 89, 128, 180, - 248, 0, 17, 132, 248, 26, 129, 209, 135, 153, 128, 32, 70, 163, 73, - 233, 247, 176, 250, 0, 38, 128, 178, 163, 25, 0, 240, 15, 2, 1, 54, - 168, 235, 66, 2, 0, 9, 4, 46, 131, 248, 30, 33, 244, 209, 32, 70, 156, - 73, 233, 247, 159, 250, 0, 240, 15, 2, 163, 25, 82, 0, 1, 54, 194, 235, - 8, 2, 0, 9, 12, 46, 131, 248, 30, 33, 243, 209, 149, 73, 32, 70, 233, - 247, 143, 250, 148, 73, 6, 70, 32, 70, 233, 247, 138, 250, 128, 178, - 64, 234, 6, 70, 110, 96, 20, 35, 6, 240, 15, 1, 226, 24, 73, 0, 1, 51, - 193, 235, 8, 1, 54, 9, 28, 43, 130, 248, 22, 17, 243, 209, 138, 73, - 32, 70, 233, 247, 117, 250, 137, 73, 104, 131, 32, 70, 233, 247, 112, - 250, 136, 73, 40, 119, 32, 70, 233, 247, 107, 250, 134, 73, 104, 119, - 32, 70, 233, 247, 102, 250, 133, 73, 168, 119, 32, 70, 233, 247, 97, - 250, 131, 73, 232, 119, 32, 70, 233, 247, 92, 250, 130, 73, 133, 248, - 34, 0, 32, 70, 233, 247, 86, 250, 128, 73, 133, 248, 33, 0, 32, 70, - 233, 247, 80, 250, 126, 73, 133, 248, 224, 4, 32, 70, 233, 247, 74, - 250, 1, 38, 197, 248, 228, 4, 122, 73, 1, 168, 50, 70, 218, 243, 15, - 243, 212, 248, 184, 0, 1, 169, 218, 243, 126, 247, 48, 177, 0, 33, 10, - 70, 218, 243, 57, 246, 171, 25, 131, 248, 231, 4, 1, 54, 15, 46, 234, - 209, 113, 73, 32, 70, 233, 247, 46, 250, 112, 73, 133, 248, 246, 4, - 32, 70, 233, 247, 40, 250, 110, 73, 133, 248, 247, 4, 32, 70, 233, 247, - 34, 250, 108, 73, 133, 248, 248, 4, 32, 70, 233, 247, 28, 250, 106, - 73, 133, 248, 249, 4, 32, 70, 233, 247, 22, 250, 104, 73, 133, 248, - 250, 4, 32, 70, 233, 247, 16, 250, 102, 73, 133, 248, 251, 4, 32, 70, - 233, 247, 10, 250, 100, 73, 133, 248, 252, 4, 32, 70, 233, 247, 4, 250, - 98, 73, 133, 248, 253, 4, 32, 70, 233, 247, 254, 249, 96, 73, 133, 248, - 254, 4, 32, 70, 233, 247, 248, 249, 94, 73, 133, 248, 255, 4, 32, 70, - 233, 247, 242, 249, 92, 73, 133, 248, 0, 5, 32, 70, 233, 247, 236, 249, - 90, 73, 133, 248, 1, 5, 32, 70, 233, 247, 230, 249, 88, 73, 133, 248, - 2, 5, 32, 70, 233, 247, 224, 249, 86, 73, 133, 248, 3, 5, 32, 70, 233, - 247, 218, 249, 84, 73, 133, 248, 4, 5, 32, 70, 233, 247, 212, 249, 82, - 73, 133, 248, 5, 5, 32, 70, 233, 247, 206, 249, 80, 73, 133, 248, 6, - 5, 32, 70, 233, 247, 200, 249, 78, 73, 133, 248, 7, 5, 32, 70, 233, - 247, 194, 249, 76, 73, 133, 248, 8, 5, 32, 70, 233, 247, 188, 249, 74, - 73, 133, 248, 9, 5, 32, 70, 233, 247, 182, 249, 72, 73, 133, 248, 10, - 5, 32, 70, 233, 247, 176, 249, 70, 73, 133, 248, 11, 5, 32, 70, 233, - 247, 170, 249, 68, 73, 133, 248, 12, 5, 32, 70, 233, 247, 164, 249, - 66, 73, 133, 248, 13, 5, 32, 70, 233, 247, 158, 249, 64, 73, 165, 248, - 20, 5, 32, 70, 233, 247, 152, 249, 79, 240, 0, 66, 165, 248, 22, 5, - 60, 73, 32, 70, 233, 247, 131, 249, 59, 73, 197, 248, 16, 5, 32, 70, - 233, 247, 138, 249, 57, 73, 133, 248, 36, 0, 32, 70, 233, 247, 132, - 249, 55, 73, 133, 248, 35, 0, 32, 70, 233, 247, 126, 249, 53, 73, 133, - 248, 32, 0, 32, 70, 233, 247, 120, 249, 51, 73, 132, 248, 38, 6, 32, - 70, 99, 224, 95, 151, 2, 0, 122, 157, 2, 0, 27, 155, 2, 0, 46, 155, - 2, 0, 212, 154, 2, 0, 183, 157, 2, 0, 9, 151, 2, 0, 72, 152, 2, 0, 214, - 155, 2, 0, 85, 151, 2, 0, 72, 157, 2, 0, 83, 157, 2, 0, 69, 151, 2, - 0, 251, 153, 2, 0, 37, 154, 2, 0, 2, 156, 2, 0, 63, 156, 2, 0, 18, 151, - 2, 0, 122, 155, 2, 0, 223, 156, 2, 0, 251, 156, 2, 0, 224, 158, 2, 0, - 75, 158, 2, 0, 92, 158, 2, 0, 160, 159, 2, 0, 193, 159, 2, 0, 196, 155, - 2, 0, 227, 155, 2, 0, 16, 156, 2, 0, 109, 158, 2, 0, 94, 157, 2, 0, - 144, 158, 2, 0, 162, 158, 2, 0, 180, 158, 2, 0, 244, 159, 2, 0, 6, 160, - 2, 0, 151, 151, 2, 0, 193, 151, 2, 0, 182, 152, 2, 0, 213, 152, 2, 0, - 202, 153, 2, 0, 245, 151, 2, 0, 91, 152, 2, 0, 133, 154, 2, 0, 146, - 152, 2, 0, 20, 159, 2, 0, 32, 159, 2, 0, 210, 159, 2, 0, 168, 157, 2, - 0, 181, 151, 2, 0, 233, 247, 13, 249, 191, 73, 133, 248, 193, 3, 32, - 70, 233, 247, 7, 249, 189, 73, 133, 248, 194, 3, 32, 70, 233, 247, 1, - 249, 133, 248, 195, 3, 148, 248, 38, 22, 17, 177, 32, 70, 255, 247, - 28, 252, 183, 73, 32, 70, 79, 240, 255, 50, 233, 247, 230, 248, 128, - 178, 165, 248, 98, 0, 0, 4, 72, 191, 79, 240, 255, 48, 79, 240, 255, - 51, 72, 191, 165, 248, 98, 0, 165, 248, 102, 48, 165, 248, 104, 48, - 32, 70, 173, 73, 233, 247, 198, 248, 80, 177, 171, 73, 32, 70, 233, - 247, 218, 248, 128, 178, 1, 4, 92, 191, 165, 248, 102, 0, 165, 248, - 104, 0, 32, 70, 166, 73, 233, 247, 182, 248, 64, 177, 32, 70, 163, 73, - 233, 247, 202, 248, 128, 178, 2, 4, 88, 191, 165, 248, 102, 0, 32, 70, - 160, 73, 233, 247, 168, 248, 64, 177, 32, 70, 157, 73, 233, 247, 188, - 248, 128, 178, 3, 4, 88, 191, 165, 248, 104, 0, 154, 73, 79, 240, 255, - 50, 32, 70, 233, 247, 164, 248, 79, 240, 255, 50, 165, 248, 196, 3, - 150, 73, 32, 70, 233, 247, 156, 248, 149, 73, 165, 248, 198, 3, 32, - 70, 233, 247, 163, 248, 147, 73, 165, 248, 200, 3, 79, 244, 207, 114, - 32, 70, 233, 247, 142, 248, 144, 73, 197, 248, 204, 3, 71, 246, 154, - 98, 32, 70, 233, 247, 134, 248, 141, 73, 197, 248, 208, 3, 10, 34, 32, - 70, 233, 247, 127, 248, 139, 73, 197, 248, 212, 3, 8, 34, 32, 70, 233, - 247, 120, 248, 136, 73, 197, 248, 216, 3, 65, 242, 110, 2, 32, 70, 233, - 247, 112, 248, 10, 34, 197, 248, 220, 3, 132, 73, 32, 70, 233, 247, - 105, 248, 131, 73, 197, 248, 224, 3, 32, 70, 233, 247, 112, 248, 129, - 73, 165, 248, 228, 3, 32, 70, 233, 247, 106, 248, 149, 248, 232, 51, - 165, 248, 230, 3, 43, 177, 0, 178, 0, 40, 2, 221, 0, 32, 165, 248, 230, - 3, 80, 34, 121, 73, 32, 70, 233, 247, 77, 248, 120, 73, 133, 248, 234, - 3, 32, 70, 233, 247, 84, 248, 118, 73, 133, 248, 236, 3, 32, 70, 233, - 247, 78, 248, 116, 73, 133, 248, 237, 3, 32, 70, 233, 247, 72, 248, - 114, 73, 133, 248, 238, 3, 79, 240, 255, 50, 32, 70, 233, 247, 51, 248, - 111, 73, 133, 248, 240, 3, 79, 240, 255, 50, 32, 70, 233, 247, 43, 248, - 255, 35, 133, 248, 239, 51, 133, 248, 241, 3, 105, 73, 79, 240, 255, - 50, 32, 70, 233, 247, 32, 248, 103, 73, 133, 248, 242, 3, 79, 240, 255, - 50, 32, 70, 233, 247, 24, 248, 100, 73, 133, 248, 89, 5, 79, 240, 255, - 50, 32, 70, 233, 247, 16, 248, 97, 73, 133, 248, 90, 5, 79, 240, 255, - 50, 32, 70, 233, 247, 8, 248, 94, 73, 133, 248, 243, 3, 79, 240, 255, - 50, 32, 70, 233, 247, 0, 248, 91, 73, 133, 248, 91, 5, 79, 240, 255, - 50, 32, 70, 232, 247, 248, 255, 88, 73, 133, 248, 92, 5, 79, 240, 255, - 50, 32, 70, 232, 247, 240, 255, 0, 34, 133, 248, 244, 3, 84, 73, 32, - 70, 232, 247, 233, 255, 83, 73, 133, 248, 9, 4, 79, 240, 255, 50, 32, - 70, 232, 247, 225, 255, 80, 73, 132, 248, 218, 5, 79, 240, 255, 50, - 32, 70, 232, 247, 217, 255, 77, 73, 165, 248, 246, 3, 79, 240, 255, - 50, 32, 70, 232, 247, 209, 255, 74, 73, 165, 248, 248, 3, 79, 240, 255, - 50, 32, 70, 232, 247, 201, 255, 71, 73, 165, 248, 250, 3, 79, 240, 255, - 50, 32, 70, 232, 247, 193, 255, 68, 73, 165, 248, 252, 3, 79, 240, 255, - 50, 32, 70, 232, 247, 185, 255, 65, 73, 165, 248, 254, 3, 79, 240, 255, - 50, 32, 70, 232, 247, 177, 255, 62, 73, 165, 248, 0, 4, 79, 240, 255, - 50, 32, 70, 232, 247, 169, 255, 59, 73, 165, 248, 2, 4, 79, 240, 255, - 50, 32, 70, 232, 247, 161, 255, 0, 34, 165, 248, 4, 4, 54, 73, 32, 70, - 232, 247, 154, 255, 0, 34, 165, 248, 94, 5, 52, 73, 32, 70, 232, 247, - 147, 255, 0, 34, 165, 248, 96, 5, 49, 73, 32, 70, 232, 247, 140, 255, - 48, 73, 165, 248, 98, 5, 0, 34, 32, 70, 232, 247, 133, 255, 46, 73, - 165, 248, 100, 5, 32, 70, 89, 224, 169, 151, 2, 0, 240, 157, 2, 0, 234, - 154, 2, 0, 24, 160, 2, 0, 206, 158, 2, 0, 226, 159, 2, 0, 248, 152, - 2, 0, 133, 156, 2, 0, 137, 152, 2, 0, 173, 157, 2, 0, 241, 158, 2, 0, - 78, 159, 2, 0, 62, 152, 2, 0, 135, 158, 2, 0, 165, 153, 2, 0, 227, 157, - 2, 0, 220, 154, 2, 0, 5, 154, 2, 0, 34, 156, 2, 0, 138, 151, 2, 0, 32, - 157, 2, 0, 104, 154, 2, 0, 80, 154, 2, 0, 149, 159, 2, 0, 12, 158, 2, - 0, 200, 152, 2, 0, 148, 154, 2, 0, 58, 157, 2, 0, 7, 152, 2, 0, 12, - 153, 2, 0, 139, 155, 2, 0, 43, 156, 2, 0, 73, 155, 2, 0, 21, 152, 2, - 0, 200, 157, 2, 0, 16, 155, 2, 0, 59, 153, 2, 0, 66, 154, 2, 0, 54, - 154, 2, 0, 72, 153, 2, 0, 213, 157, 2, 0, 140, 156, 2, 0, 119, 156, - 2, 0, 32, 158, 2, 0, 123, 151, 2, 0, 232, 247, 49, 255, 2, 47, 133, - 248, 6, 4, 20, 209, 32, 70, 173, 73, 232, 247, 16, 255, 0, 40, 0, 240, - 197, 130, 47, 70, 0, 38, 50, 70, 32, 70, 168, 73, 232, 247, 54, 255, - 1, 54, 199, 248, 12, 4, 4, 55, 5, 46, 244, 209, 21, 224, 1, 47, 19, - 209, 32, 70, 162, 73, 232, 247, 249, 254, 0, 40, 0, 240, 174, 130, 47, - 70, 0, 38, 50, 70, 32, 70, 157, 73, 232, 247, 31, 255, 1, 54, 199, 248, - 32, 4, 4, 55, 5, 46, 244, 209, 154, 73, 79, 240, 255, 50, 32, 70, 232, - 247, 239, 254, 152, 73, 165, 248, 62, 4, 79, 240, 255, 50, 32, 70, 232, - 247, 231, 254, 149, 73, 165, 248, 64, 4, 79, 240, 255, 50, 32, 70, 232, - 247, 223, 254, 146, 73, 164, 248, 254, 15, 32, 70, 232, 247, 205, 254, - 48, 177, 32, 70, 142, 73, 232, 247, 225, 254, 4, 245, 152, 83, 88, 129, - 140, 73, 32, 70, 79, 240, 255, 50, 232, 247, 203, 254, 4, 245, 154, - 83, 152, 130, 136, 73, 32, 70, 232, 247, 184, 254, 48, 177, 32, 70, - 133, 73, 232, 247, 204, 254, 4, 245, 152, 83, 216, 129, 32, 70, 131, - 73, 0, 34, 232, 247, 183, 254, 192, 178, 133, 248, 77, 3, 88, 177, 128, - 73, 32, 70, 232, 247, 188, 254, 127, 73, 197, 248, 80, 3, 32, 70, 232, - 247, 182, 254, 197, 248, 96, 3, 32, 70, 123, 73, 232, 247, 151, 254, - 0, 40, 55, 208, 212, 248, 184, 0, 120, 73, 218, 247, 78, 251, 6, 40, - 48, 209, 117, 73, 0, 34, 212, 248, 184, 0, 218, 243, 196, 243, 133, - 248, 149, 3, 113, 73, 1, 34, 212, 248, 184, 0, 218, 243, 188, 243, 133, - 248, 151, 3, 109, 73, 2, 34, 212, 248, 184, 0, 218, 243, 180, 243, 133, - 248, 153, 3, 105, 73, 3, 34, 212, 248, 184, 0, 218, 243, 172, 243, 133, - 248, 150, 3, 101, 73, 4, 34, 212, 248, 184, 0, 218, 243, 164, 243, 133, - 248, 152, 3, 212, 248, 184, 0, 96, 73, 5, 34, 218, 243, 156, 243, 133, - 248, 154, 3, 16, 224, 1, 35, 133, 248, 149, 51, 50, 35, 133, 248, 150, - 51, 64, 35, 133, 248, 151, 51, 133, 248, 152, 51, 4, 35, 133, 248, 153, - 51, 255, 35, 133, 248, 154, 51, 85, 73, 32, 70, 255, 34, 232, 247, 83, - 254, 255, 35, 165, 248, 84, 3, 165, 248, 86, 51, 165, 248, 88, 51, 165, - 248, 90, 51, 32, 70, 79, 73, 232, 247, 58, 254, 56, 179, 212, 248, 184, - 0, 76, 73, 218, 247, 242, 250, 47, 70, 3, 40, 180, 191, 128, 70, 79, - 240, 3, 8, 0, 38, 7, 224, 50, 70, 32, 70, 69, 73, 232, 247, 87, 254, - 1, 54, 167, 248, 84, 3, 2, 55, 70, 69, 244, 219, 40, 234, 232, 120, - 66, 70, 0, 35, 8, 224, 5, 235, 72, 1, 181, 248, 86, 3, 201, 24, 161, - 248, 86, 3, 1, 50, 2, 51, 2, 42, 244, 221, 1, 34, 57, 73, 32, 70, 232, - 247, 24, 254, 56, 73, 133, 248, 64, 3, 32, 70, 232, 247, 31, 254, 1, - 34, 133, 248, 75, 3, 53, 73, 32, 70, 232, 247, 11, 254, 52, 73, 133, - 248, 65, 3, 32, 70, 232, 247, 18, 254, 50, 73, 133, 248, 76, 3, 79, - 240, 255, 50, 32, 70, 232, 247, 253, 253, 47, 73, 133, 248, 73, 3, 79, - 240, 255, 50, 32, 70, 232, 247, 245, 253, 44, 73, 133, 248, 74, 3, 79, - 240, 255, 50, 32, 70, 232, 247, 237, 253, 41, 73, 133, 248, 92, 3, 79, - 240, 255, 50, 32, 70, 232, 247, 229, 253, 38, 73, 133, 248, 93, 3, 32, - 70, 232, 247, 211, 253, 0, 40, 70, 208, 1, 38, 33, 73, 0, 34, 133, 248, - 187, 100, 32, 70, 232, 247, 249, 253, 30, 73, 133, 248, 188, 4, 50, - 70, 32, 70, 232, 247, 242, 253, 26, 73, 133, 248, 189, 4, 2, 34, 32, - 70, 232, 247, 235, 253, 133, 248, 190, 4, 47, 224, 255, 152, 2, 0, 156, - 156, 2, 0, 33, 152, 2, 0, 25, 158, 2, 0, 149, 157, 2, 0, 92, 154, 2, - 0, 177, 159, 2, 0, 112, 157, 2, 0, 168, 152, 2, 0, 12, 157, 2, 0, 173, - 154, 2, 0, 231, 152, 2, 0, 85, 156, 2, 0, 58, 160, 2, 0, 55, 158, 2, - 0, 172, 153, 2, 0, 117, 152, 2, 0, 202, 156, 2, 0, 148, 153, 2, 0, 223, - 151, 2, 0, 41, 157, 2, 0, 149, 155, 2, 0, 40, 160, 2, 0, 133, 248, 187, - 4, 255, 34, 161, 73, 32, 70, 232, 247, 143, 253, 255, 34, 133, 248, - 191, 4, 158, 73, 32, 70, 232, 247, 136, 253, 157, 73, 133, 248, 192, - 4, 32, 70, 232, 247, 143, 253, 0, 34, 165, 248, 194, 4, 154, 73, 32, - 70, 232, 247, 123, 253, 0, 34, 133, 248, 24, 5, 151, 73, 32, 70, 232, - 247, 116, 253, 192, 178, 133, 248, 26, 5, 227, 105, 219, 104, 91, 108, - 3, 240, 7, 3, 5, 43, 3, 217, 16, 177, 0, 35, 133, 248, 26, 53, 143, - 73, 0, 34, 32, 70, 232, 247, 97, 253, 142, 73, 133, 248, 28, 5, 0, 34, - 32, 70, 232, 247, 90, 253, 139, 73, 133, 248, 29, 5, 79, 240, 255, 50, - 32, 70, 232, 247, 82, 253, 136, 73, 133, 248, 30, 5, 0, 34, 32, 70, - 232, 247, 75, 253, 134, 73, 133, 248, 149, 5, 79, 240, 255, 50, 32, - 70, 232, 247, 67, 253, 131, 73, 165, 248, 32, 5, 1, 34, 32, 70, 232, - 247, 60, 253, 128, 73, 133, 248, 39, 5, 79, 240, 255, 50, 32, 70, 232, - 247, 52, 253, 125, 73, 165, 248, 42, 5, 79, 240, 255, 50, 32, 70, 232, - 247, 44, 253, 122, 73, 165, 248, 44, 5, 0, 34, 32, 70, 232, 247, 37, - 253, 120, 73, 133, 248, 58, 5, 0, 34, 32, 70, 232, 247, 30, 253, 117, - 73, 133, 248, 59, 5, 79, 240, 255, 50, 32, 70, 232, 247, 22, 253, 114, - 73, 133, 248, 60, 5, 32, 70, 232, 247, 4, 253, 48, 177, 32, 70, 110, - 73, 232, 247, 24, 253, 133, 248, 66, 5, 2, 224, 255, 35, 133, 248, 66, - 53, 32, 70, 106, 73, 232, 247, 245, 252, 48, 177, 32, 70, 104, 73, 232, - 247, 9, 253, 165, 248, 68, 5, 3, 224, 79, 240, 255, 51, 165, 248, 68, - 53, 100, 73, 32, 70, 79, 240, 255, 50, 232, 247, 239, 252, 98, 73, 165, - 248, 144, 5, 32, 70, 232, 247, 221, 252, 48, 179, 1, 38, 94, 73, 0, - 34, 133, 248, 82, 101, 32, 70, 232, 247, 4, 253, 90, 73, 133, 248, 83, - 5, 50, 70, 32, 70, 232, 247, 253, 252, 87, 73, 133, 248, 84, 5, 2, 34, - 32, 70, 232, 247, 246, 252, 83, 73, 133, 248, 85, 5, 3, 34, 32, 70, - 232, 247, 239, 252, 80, 73, 133, 248, 86, 5, 4, 34, 32, 70, 232, 247, - 232, 252, 133, 248, 87, 5, 1, 224, 133, 248, 82, 5, 75, 73, 79, 240, - 255, 50, 32, 70, 232, 247, 185, 252, 73, 73, 133, 248, 88, 5, 79, 240, - 255, 50, 32, 70, 232, 247, 177, 252, 70, 73, 133, 248, 89, 5, 79, 240, - 255, 50, 32, 70, 232, 247, 169, 252, 67, 73, 133, 248, 90, 5, 0, 34, - 32, 70, 232, 247, 162, 252, 64, 73, 133, 248, 112, 5, 0, 34, 32, 70, - 232, 247, 155, 252, 3, 34, 133, 248, 128, 5, 60, 73, 32, 70, 232, 247, - 148, 252, 59, 73, 133, 248, 129, 5, 32, 70, 232, 247, 155, 252, 57, - 73, 133, 248, 130, 5, 32, 70, 232, 247, 149, 252, 55, 73, 165, 248, - 132, 5, 32, 70, 232, 247, 143, 252, 53, 73, 165, 248, 134, 5, 32, 70, - 232, 247, 137, 252, 51, 73, 165, 248, 136, 5, 32, 70, 232, 247, 131, - 252, 49, 73, 165, 248, 138, 5, 32, 70, 232, 247, 125, 252, 47, 73, 197, - 248, 140, 5, 0, 34, 32, 70, 232, 247, 105, 252, 45, 73, 133, 248, 148, - 5, 79, 240, 255, 50, 32, 70, 232, 247, 97, 252, 192, 178, 165, 248, - 198, 5, 40, 73, 32, 70, 111, 240, 7, 2, 232, 247, 88, 252, 192, 178, - 165, 248, 200, 5, 1, 32, 6, 176, 189, 232, 240, 129, 0, 191, 127, 158, - 2, 0, 198, 158, 2, 0, 46, 152, 2, 0, 84, 155, 2, 0, 183, 156, 2, 0, - 166, 155, 2, 0, 251, 157, 2, 0, 245, 155, 2, 0, 183, 155, 2, 0, 22, - 153, 2, 0, 105, 151, 2, 0, 220, 153, 2, 0, 35, 153, 2, 0, 81, 152, 2, - 0, 47, 153, 2, 0, 249, 154, 2, 0, 24, 154, 2, 0, 211, 151, 2, 0, 94, - 153, 2, 0, 240, 156, 2, 0, 3, 155, 2, 0, 12, 158, 2, 0, 200, 152, 2, - 0, 160, 154, 2, 0, 250, 158, 2, 0, 113, 153, 2, 0, 193, 153, 2, 0, 132, - 157, 2, 0, 130, 153, 2, 0, 55, 155, 2, 0, 101, 156, 2, 0, 115, 154, - 2, 0, 46, 159, 2, 0, 130, 151, 2, 0, 159, 152, 2, 0, 195, 105, 112, - 181, 4, 70, 13, 70, 152, 104, 64, 242, 204, 81, 222, 243, 207, 242, - 196, 248, 168, 0, 0, 40, 89, 208, 0, 33, 64, 242, 204, 82, 217, 243, - 126, 244, 227, 105, 212, 248, 168, 96, 26, 109, 210, 3, 5, 212, 1, 34, - 4, 245, 130, 81, 132, 248, 26, 38, 10, 113, 216, 104, 228, 247, 184, - 251, 4, 245, 128, 83, 152, 98, 0, 35, 243, 99, 32, 75, 32, 70, 35, 98, - 32, 75, 41, 70, 99, 98, 31, 75, 163, 98, 31, 75, 227, 98, 31, 75, 163, - 103, 31, 75, 227, 103, 31, 75, 196, 248, 144, 48, 31, 75, 196, 248, - 132, 48, 30, 75, 35, 99, 30, 75, 99, 99, 30, 75, 227, 99, 30, 75, 99, - 100, 30, 75, 99, 101, 30, 75, 163, 101, 30, 75, 196, 248, 140, 48, 30, - 75, 196, 248, 136, 48, 29, 75, 227, 102, 29, 75, 196, 248, 156, 48, - 29, 75, 196, 248, 160, 48, 28, 75, 196, 248, 164, 48, 254, 247, 167, - 255, 96, 177, 32, 70, 235, 247, 133, 253, 32, 70, 254, 247, 2, 255, - 40, 177, 32, 70, 254, 247, 90, 255, 0, 48, 24, 191, 1, 32, 112, 189, - 69, 130, 1, 0, 13, 47, 1, 0, 101, 179, 1, 0, 255, 115, 1, 0, 101, 114, - 1, 0, 159, 47, 1, 0, 249, 121, 1, 0, 225, 121, 1, 0, 145, 145, 1, 0, - 41, 87, 1, 0, 37, 100, 1, 0, 89, 84, 1, 0, 125, 56, 1, 0, 185, 58, 1, - 0, 83, 178, 1, 0, 157, 47, 1, 0, 141, 54, 1, 0, 91, 87, 1, 0, 149, 81, - 1, 0, 33, 178, 1, 0, 248, 181, 5, 70, 14, 70, 0, 104, 12, 33, 23, 70, - 222, 243, 64, 242, 4, 70, 48, 177, 0, 33, 12, 34, 217, 243, 242, 243, - 132, 232, 160, 0, 166, 96, 32, 70, 248, 189, 1, 70, 32, 177, 3, 104, - 12, 34, 24, 104, 222, 243, 62, 178, 112, 71, 0, 0, 127, 181, 5, 70, - 136, 33, 64, 104, 222, 243, 38, 242, 4, 70, 0, 40, 58, 208, 0, 33, 136, - 34, 217, 243, 215, 243, 43, 104, 37, 96, 99, 96, 0, 38, 4, 33, 40, 70, - 26, 74, 26, 75, 0, 150, 1, 148, 0, 240, 57, 249, 176, 66, 160, 96, 33, - 219, 23, 75, 2, 150, 141, 232, 72, 0, 3, 150, 96, 104, 21, 73, 22, 74, - 35, 70, 251, 243, 9, 243, 168, 185, 30, 34, 98, 97, 4, 34, 226, 115, - 2, 34, 34, 116, 10, 34, 1, 35, 98, 116, 79, 246, 175, 114, 132, 248, - 32, 0, 227, 119, 35, 115, 163, 97, 160, 116, 96, 115, 160, 115, 162, - 131, 163, 119, 5, 224, 33, 70, 104, 104, 136, 34, 222, 243, 249, 241, - 0, 36, 32, 70, 4, 176, 112, 189, 0, 191, 81, 35, 133, 0, 37, 35, 133, - 0, 129, 20, 133, 0, 188, 29, 134, 0, 3, 232, 134, 0, 16, 181, 4, 70, - 96, 177, 34, 70, 6, 73, 64, 104, 251, 243, 14, 243, 99, 104, 33, 70, - 216, 104, 136, 34, 189, 232, 16, 64, 222, 243, 218, 177, 16, 189, 0, - 191, 3, 232, 134, 0, 45, 233, 240, 67, 7, 70, 133, 176, 136, 70, 16, - 70, 64, 242, 196, 81, 21, 70, 153, 70, 222, 243, 186, 241, 4, 70, 0, - 40, 118, 208, 0, 33, 64, 242, 196, 82, 217, 243, 106, 243, 40, 70, 28, - 33, 222, 243, 174, 241, 6, 70, 32, 96, 56, 185, 40, 70, 33, 70, 64, - 242, 196, 82, 222, 243, 181, 241, 48, 70, 98, 224, 0, 33, 28, 34, 217, - 243, 87, 243, 35, 104, 64, 242, 196, 82, 28, 96, 0, 38, 98, 97, 79, - 240, 255, 50, 162, 97, 167, 96, 229, 96, 196, 248, 4, 144, 158, 113, - 20, 35, 164, 248, 8, 50, 40, 35, 164, 248, 6, 50, 45, 35, 164, 248, - 4, 50, 250, 35, 164, 248, 10, 50, 2, 35, 132, 248, 12, 50, 100, 35, - 164, 248, 62, 50, 132, 248, 13, 98, 64, 70, 31, 73, 34, 70, 51, 70, - 230, 243, 107, 246, 196, 248, 248, 1, 0, 179, 4, 245, 16, 115, 196, - 248, 24, 50, 196, 248, 20, 50, 4, 245, 61, 115, 196, 248, 36, 50, 196, - 248, 32, 50, 5, 34, 22, 75, 196, 248, 28, 34, 60, 34, 196, 248, 40, - 34, 141, 232, 72, 0, 19, 75, 2, 150, 3, 147, 56, 104, 18, 73, 18, 74, - 35, 70, 251, 243, 90, 242, 8, 185, 32, 104, 18, 224, 212, 248, 248, - 17, 17, 177, 64, 70, 230, 243, 37, 246, 33, 104, 25, 177, 40, 70, 28, - 34, 222, 243, 87, 241, 40, 70, 33, 70, 64, 242, 196, 82, 222, 243, 81, - 241, 0, 32, 5, 176, 189, 232, 240, 131, 0, 191, 193, 60, 133, 0, 245, - 55, 133, 0, 137, 181, 1, 0, 212, 29, 134, 0, 230, 232, 134, 0, 56, 181, - 4, 104, 220, 177, 212, 248, 248, 17, 165, 104, 41, 177, 168, 104, 230, - 243, 0, 246, 0, 35, 196, 248, 248, 49, 9, 73, 40, 104, 34, 70, 251, - 243, 92, 242, 33, 104, 25, 177, 104, 104, 28, 34, 222, 243, 42, 241, - 104, 104, 98, 105, 33, 70, 189, 232, 56, 64, 222, 243, 35, 177, 56, - 189, 230, 232, 134, 0, 248, 181, 195, 105, 6, 70, 27, 105, 192, 104, - 221, 29, 72, 191, 3, 241, 14, 5, 237, 16, 237, 178, 239, 0, 7, 245, - 146, 119, 57, 70, 222, 243, 255, 240, 4, 70, 160, 177, 58, 70, 0, 33, - 217, 243, 177, 242, 35, 70, 67, 248, 36, 107, 227, 97, 3, 235, 133, - 3, 3, 245, 128, 115, 4, 245, 146, 114, 35, 97, 79, 244, 3, 115, 132, - 248, 32, 80, 226, 96, 99, 97, 32, 70, 248, 189, 1, 70, 64, 177, 144, - 248, 32, 32, 3, 104, 210, 0, 216, 104, 2, 245, 146, 114, 222, 243, 235, - 176, 112, 71, 240, 181, 208, 248, 0, 69, 165, 105, 15, 45, 17, 216, - 231, 105, 46, 1, 184, 25, 1, 53, 165, 97, 67, 96, 5, 155, 186, 81, 131, - 96, 6, 155, 195, 96, 96, 105, 195, 28, 89, 24, 33, 240, 3, 1, 97, 97, - 240, 189, 79, 240, 255, 48, 240, 189, 0, 0, 45, 233, 240, 79, 59, 77, - 141, 176, 40, 104, 59, 73, 217, 243, 10, 247, 1, 40, 97, 208, 43, 104, - 223, 248, 12, 145, 2, 147, 223, 248, 8, 129, 217, 248, 0, 48, 0, 36, - 3, 147, 216, 248, 0, 48, 51, 79, 4, 147, 35, 104, 51, 78, 5, 147, 59, - 104, 223, 248, 240, 160, 6, 147, 51, 104, 223, 248, 236, 176, 7, 147, - 218, 248, 0, 48, 223, 248, 232, 192, 8, 147, 219, 248, 0, 48, 43, 72, - 9, 147, 43, 75, 44, 73, 26, 104, 60, 96, 10, 146, 220, 248, 0, 32, 28, - 96, 11, 146, 41, 74, 204, 248, 0, 64, 50, 96, 9, 26, 79, 240, 255, 50, - 1, 147, 205, 248, 0, 192, 44, 96, 200, 248, 0, 64, 201, 248, 0, 64, - 203, 248, 0, 64, 202, 248, 0, 64, 217, 243, 28, 247, 31, 74, 1, 155, - 144, 66, 221, 248, 0, 192, 40, 209, 2, 154, 42, 96, 3, 154, 201, 248, - 0, 32, 4, 154, 200, 248, 0, 32, 33, 104, 25, 74, 17, 96, 5, 154, 34, - 96, 6, 154, 58, 96, 7, 154, 50, 96, 8, 154, 202, 248, 0, 32, 9, 154, - 203, 248, 0, 32, 10, 154, 26, 96, 11, 155, 204, 248, 0, 48, 16, 74, - 17, 75, 209, 126, 25, 119, 17, 127, 89, 119, 81, 127, 153, 119, 146, - 127, 218, 119, 13, 176, 189, 232, 240, 143, 254, 231, 216, 255, 1, 0, - 148, 254, 1, 0, 176, 194, 0, 0, 156, 194, 0, 0, 0, 0, 0, 0, 184, 194, - 0, 0, 192, 54, 3, 0, 221, 186, 173, 187, 227, 32, 187, 222, 160, 194, - 0, 0, 188, 54, 3, 0, 236, 8, 2, 0, 220, 255, 1, 0, 212, 255, 1, 0, 172, - 194, 0, 0, 180, 194, 0, 0, 188, 194, 0, 0, 112, 71, 0, 0, 45, 233, 240, - 79, 145, 176, 255, 247, 93, 255, 109, 75, 27, 104, 4, 59, 1, 43, 3, - 216, 107, 75, 24, 104, 255, 247, 240, 255, 251, 247, 62, 250, 0, 33, - 4, 70, 226, 243, 250, 242, 32, 70, 0, 33, 226, 243, 176, 242, 40, 177, - 3, 106, 0, 43, 188, 191, 79, 240, 0, 67, 3, 98, 14, 169, 8, 34, 160, - 107, 217, 243, 66, 244, 2, 70, 32, 70, 212, 248, 60, 176, 11, 146, 228, - 247, 246, 248, 130, 70, 32, 70, 228, 247, 242, 248, 129, 70, 32, 70, - 228, 247, 238, 248, 128, 70, 32, 70, 228, 247, 197, 248, 7, 70, 32, - 70, 228, 247, 193, 248, 6, 70, 32, 70, 228, 247, 189, 248, 5, 70, 32, - 70, 227, 247, 203, 254, 1, 70, 32, 70, 12, 145, 227, 247, 198, 254, - 132, 70, 32, 70, 205, 248, 52, 192, 227, 247, 192, 254, 11, 154, 12, - 153, 221, 248, 52, 192, 2, 146, 8, 245, 66, 72, 71, 74, 5, 245, 66, - 69, 0, 245, 66, 64, 10, 245, 66, 74, 9, 245, 66, 73, 8, 245, 168, 120, - 7, 245, 66, 71, 6, 245, 66, 70, 5, 245, 168, 117, 1, 245, 66, 65, 12, - 245, 66, 76, 0, 245, 168, 112, 184, 251, 242, 248, 181, 251, 242, 245, - 12, 245, 168, 124, 176, 251, 242, 240, 10, 245, 168, 122, 9, 245, 168, - 121, 7, 245, 168, 119, 6, 245, 168, 118, 1, 245, 168, 113, 177, 251, - 242, 241, 223, 248, 232, 224, 186, 251, 242, 250, 2, 251, 24, 153, 183, - 251, 242, 247, 2, 251, 21, 102, 2, 251, 16, 194, 205, 248, 4, 224, 223, - 248, 208, 224, 42, 75, 178, 251, 254, 242, 185, 251, 254, 249, 182, - 251, 254, 246, 8, 145, 9, 146, 39, 73, 39, 74, 40, 72, 0, 147, 205, - 248, 12, 176, 205, 248, 16, 160, 205, 248, 20, 144, 6, 151, 7, 150, - 230, 247, 123, 253, 35, 72, 64, 246, 13, 1, 68, 242, 244, 50, 251, 247, - 36, 249, 56, 177, 31, 72, 64, 246, 41, 1, 68, 242, 244, 50, 251, 247, - 28, 249, 32, 185, 28, 74, 28, 75, 26, 77, 26, 96, 0, 224, 0, 37, 32, - 70, 253, 247, 184, 253, 68, 242, 24, 51, 79, 246, 255, 114, 144, 66, - 20, 191, 2, 70, 26, 70, 64, 246, 18, 1, 20, 72, 251, 247, 5, 249, 19, - 73, 0, 40, 24, 191, 0, 33, 77, 177, 65, 177, 15, 75, 40, 70, 27, 104, - 91, 104, 152, 71, 43, 105, 40, 70, 91, 104, 152, 71, 32, 70, 17, 176, - 189, 232, 240, 143, 188, 194, 0, 0, 184, 194, 0, 0, 64, 66, 15, 0, 171, - 255, 134, 0, 154, 254, 1, 0, 159, 254, 1, 0, 128, 175, 2, 0, 224, 255, - 1, 0, 12, 0, 2, 0, 248, 38, 0, 0, 212, 254, 1, 0, 172, 187, 1, 0, 160, - 134, 1, 0, 119, 108, 37, 100, 58, 32, 66, 114, 111, 97, 100, 99, 111, - 109, 32, 66, 67, 77, 37, 100, 32, 56, 48, 50, 46, 49, 49, 32, 87, 105, - 114, 101, 108, 101, 115, 115, 32, 67, 111, 110, 116, 114, 111, 108, - 108, 101, 114, 32, 37, 115, 10, 0, 37, 115, 58, 32, 66, 114, 111, 97, - 100, 99, 111, 109, 32, 83, 68, 80, 67, 77, 68, 32, 67, 68, 67, 32, 100, - 114, 105, 118, 101, 114, 10, 0, 115, 100, 112, 99, 109, 100, 99, 100, - 99, 37, 100, 0, 114, 115, 115, 105, 115, 109, 102, 50, 103, 61, 37, - 100, 0, 120, 116, 97, 108, 102, 114, 101, 113, 61, 37, 100, 0, 97, 97, - 50, 103, 61, 48, 120, 37, 120, 0, 98, 119, 52, 48, 112, 111, 61, 48, - 120, 37, 120, 0, 108, 101, 100, 98, 104, 37, 100, 61, 48, 120, 37, 120, - 0, 116, 115, 115, 105, 112, 111, 115, 50, 103, 61, 48, 120, 37, 120, - 0, 114, 115, 115, 105, 115, 97, 118, 50, 103, 61, 37, 100, 0, 108, 101, - 103, 111, 102, 100, 109, 52, 48, 100, 117, 112, 112, 111, 61, 48, 120, - 37, 120, 0, 112, 97, 49, 104, 105, 109, 97, 120, 112, 119, 114, 61, - 37, 100, 0, 109, 97, 120, 112, 50, 103, 97, 48, 61, 48, 120, 37, 120, - 0, 112, 97, 49, 105, 116, 115, 115, 105, 116, 61, 37, 100, 0, 109, 97, - 110, 102, 105, 100, 61, 48, 120, 37, 120, 0, 115, 117, 98, 118, 101, - 110, 100, 105, 100, 61, 48, 120, 37, 120, 0, 32, 4, 208, 2, 54, 67, - 255, 255, 98, 111, 97, 114, 100, 116, 121, 112, 101, 61, 48, 120, 37, - 120, 0, 109, 99, 115, 37, 100, 103, 112, 111, 37, 100, 61, 48, 120, - 37, 120, 0, 109, 97, 110, 102, 61, 37, 115, 0, 109, 97, 120, 112, 53, - 103, 108, 97, 48, 61, 48, 120, 37, 120, 0, 109, 97, 120, 112, 53, 103, - 108, 97, 49, 61, 48, 120, 37, 120, 0, 111, 102, 100, 109, 53, 103, 108, - 112, 111, 61, 48, 120, 37, 120, 0, 114, 115, 115, 105, 115, 109, 99, - 53, 103, 61, 37, 100, 0, 98, 111, 97, 114, 100, 102, 108, 97, 103, 115, - 50, 61, 48, 120, 37, 120, 0, 116, 114, 105, 115, 111, 50, 103, 61, 48, - 120, 37, 120, 0, 112, 100, 101, 116, 114, 97, 110, 103, 101, 50, 103, - 61, 48, 120, 37, 120, 0, 109, 99, 115, 98, 119, 50, 48, 53, 103, 108, - 112, 111, 61, 48, 120, 37, 120, 0, 0, 0, 109, 99, 115, 98, 119, 50, - 48, 117, 108, 53, 103, 108, 112, 111, 61, 48, 120, 37, 120, 0, 109, - 99, 115, 98, 119, 52, 48, 53, 103, 108, 112, 111, 61, 48, 120, 37, 120, - 0, 0, 0, 112, 97, 49, 108, 111, 109, 97, 120, 112, 119, 114, 61, 37, - 100, 0, 117, 115, 98, 101, 112, 110, 117, 109, 61, 48, 120, 37, 120, - 0, 114, 120, 112, 111, 53, 103, 61, 37, 100, 0, 109, 99, 115, 51, 50, - 112, 111, 61, 48, 120, 37, 120, 0, 115, 117, 98, 100, 101, 118, 105, - 100, 61, 48, 120, 37, 120, 0, 105, 116, 116, 53, 103, 97, 48, 61, 48, - 120, 37, 120, 0, 105, 116, 116, 53, 103, 97, 49, 61, 48, 120, 37, 120, - 0, 112, 97, 49, 109, 97, 120, 112, 119, 114, 61, 37, 100, 0, 98, 111, - 97, 114, 100, 114, 101, 118, 61, 48, 120, 37, 120, 0, 109, 99, 115, - 98, 119, 50, 48, 50, 103, 112, 111, 61, 48, 120, 37, 120, 0, 0, 0, 109, - 99, 115, 98, 119, 50, 48, 117, 108, 50, 103, 112, 111, 61, 48, 120, - 37, 120, 0, 109, 99, 115, 98, 119, 52, 48, 50, 103, 112, 111, 61, 48, - 120, 37, 120, 0, 0, 0, 109, 99, 115, 98, 119, 50, 48, 53, 103, 109, - 112, 111, 61, 48, 120, 37, 120, 0, 0, 0, 109, 99, 115, 98, 119, 50, - 48, 117, 108, 53, 103, 109, 112, 111, 61, 48, 120, 37, 120, 0, 109, - 99, 115, 98, 119, 52, 48, 53, 103, 109, 112, 111, 61, 48, 120, 37, 120, - 0, 0, 0, 115, 114, 111, 109, 114, 101, 118, 61, 37, 100, 0, 119, 112, - 115, 108, 101, 100, 61, 37, 100, 0, 112, 97, 49, 108, 111, 98, 48, 61, - 37, 100, 0, 112, 97, 49, 108, 111, 98, 49, 61, 37, 100, 0, 112, 97, - 49, 108, 111, 98, 50, 61, 37, 100, 0, 112, 97, 37, 100, 103, 37, 99, - 119, 37, 100, 97, 37, 100, 61, 48, 120, 37, 120, 0, 109, 97, 120, 112, - 50, 103, 97, 49, 61, 48, 120, 37, 120, 0, 112, 97, 48, 98, 48, 61, 37, - 100, 0, 112, 97, 48, 98, 49, 61, 37, 100, 0, 112, 97, 48, 98, 50, 61, - 37, 100, 0, 114, 115, 115, 105, 115, 109, 99, 50, 103, 61, 37, 100, - 0, 116, 114, 105, 53, 103, 104, 61, 37, 100, 0, 117, 115, 98, 102, 115, - 61, 37, 100, 0, 99, 99, 107, 112, 111, 61, 48, 120, 37, 120, 0, 116, - 114, 105, 53, 103, 108, 61, 37, 100, 0, 111, 102, 100, 109, 53, 103, - 104, 112, 111, 61, 48, 120, 37, 120, 0, 97, 103, 37, 100, 61, 48, 120, - 37, 120, 0, 101, 120, 116, 112, 97, 103, 97, 105, 110, 53, 103, 61, - 48, 120, 37, 120, 0, 112, 114, 111, 100, 117, 99, 116, 110, 97, 109, - 101, 61, 37, 115, 0, 99, 100, 100, 112, 111, 61, 48, 120, 37, 120, 0, - 108, 101, 103, 111, 102, 100, 109, 98, 119, 50, 48, 53, 103, 108, 112, - 111, 61, 48, 120, 37, 120, 0, 0, 0, 108, 101, 103, 111, 102, 100, 109, - 98, 119, 50, 48, 117, 108, 53, 103, 108, 112, 111, 61, 48, 120, 37, - 120, 0, 108, 101, 103, 111, 102, 100, 109, 98, 119, 50, 48, 53, 103, - 109, 112, 111, 61, 48, 120, 37, 120, 0, 0, 0, 108, 101, 103, 111, 102, - 100, 109, 98, 119, 50, 48, 117, 108, 53, 103, 109, 112, 111, 61, 48, - 120, 37, 120, 0, 108, 101, 103, 111, 102, 100, 109, 98, 119, 50, 48, - 53, 103, 104, 112, 111, 61, 48, 120, 37, 120, 0, 0, 0, 108, 101, 103, - 111, 102, 100, 109, 98, 119, 50, 48, 117, 108, 53, 103, 104, 112, 111, - 61, 48, 120, 37, 120, 0, 114, 120, 112, 111, 50, 103, 61, 37, 100, 0, - 114, 120, 99, 104, 97, 105, 110, 61, 48, 120, 37, 120, 0, 105, 116, - 116, 50, 103, 97, 48, 61, 48, 120, 37, 120, 0, 105, 116, 116, 50, 103, - 97, 49, 61, 48, 120, 37, 120, 0, 97, 110, 116, 115, 119, 105, 116, 99, - 104, 61, 48, 120, 37, 120, 0, 116, 120, 99, 104, 97, 105, 110, 61, 48, - 120, 37, 120, 0, 112, 114, 111, 100, 105, 100, 61, 48, 120, 37, 120, - 0, 112, 97, 48, 105, 116, 115, 115, 105, 116, 61, 37, 100, 0, 99, 99, - 107, 100, 105, 103, 102, 105, 108, 116, 116, 121, 112, 101, 61, 37, - 100, 0, 99, 104, 105, 112, 114, 101, 118, 61, 37, 100, 0, 111, 102, - 100, 109, 53, 103, 112, 111, 61, 48, 120, 37, 120, 0, 108, 101, 100, - 100, 99, 61, 48, 120, 37, 48, 52, 120, 0, 109, 97, 120, 112, 53, 103, - 104, 97, 48, 61, 48, 120, 37, 120, 0, 109, 97, 120, 112, 53, 103, 104, - 97, 49, 61, 48, 120, 37, 120, 0, 112, 97, 49, 98, 48, 61, 37, 100, 0, - 112, 97, 49, 98, 49, 61, 37, 100, 0, 112, 97, 49, 98, 50, 61, 37, 100, - 0, 98, 119, 100, 117, 112, 112, 111, 61, 48, 120, 37, 120, 0, 109, 97, - 120, 112, 53, 103, 97, 48, 61, 48, 120, 37, 120, 0, 109, 97, 120, 112, - 53, 103, 97, 49, 61, 48, 120, 37, 120, 0, 97, 110, 116, 115, 119, 99, - 116, 108, 53, 103, 61, 48, 120, 37, 120, 0, 109, 99, 115, 37, 100, 103, - 37, 99, 112, 111, 37, 100, 61, 48, 120, 37, 120, 0, 109, 99, 115, 98, - 119, 50, 48, 53, 103, 104, 112, 111, 61, 48, 120, 37, 120, 0, 0, 0, - 109, 99, 115, 98, 119, 50, 48, 117, 108, 53, 103, 104, 112, 111, 61, - 48, 120, 37, 120, 0, 109, 99, 115, 98, 119, 52, 48, 53, 103, 104, 112, - 111, 61, 48, 120, 37, 120, 0, 0, 0, 116, 114, 105, 53, 103, 61, 37, - 100, 0, 111, 112, 111, 61, 37, 100, 0, 118, 101, 110, 100, 105, 100, - 61, 48, 120, 37, 120, 0, 108, 101, 103, 111, 102, 100, 109, 98, 119, - 50, 48, 50, 103, 112, 111, 61, 48, 120, 37, 120, 0, 0, 108, 101, 103, - 111, 102, 100, 109, 98, 119, 50, 48, 117, 108, 50, 103, 112, 111, 61, - 48, 120, 37, 120, 112, 97, 48, 109, 97, 120, 112, 119, 114, 61, 37, - 100, 0, 112, 97, 49, 104, 105, 98, 48, 61, 37, 100, 0, 112, 97, 49, - 104, 105, 98, 49, 61, 37, 100, 0, 112, 97, 49, 104, 105, 98, 50, 61, - 37, 100, 0, 99, 117, 115, 116, 111, 109, 118, 97, 114, 37, 100, 61, - 48, 120, 37, 120, 0, 114, 101, 103, 114, 101, 118, 61, 48, 120, 37, - 120, 0, 98, 111, 97, 114, 100, 102, 108, 97, 103, 115, 61, 48, 120, - 37, 120, 0, 98, 120, 97, 50, 103, 61, 37, 100, 0, 111, 101, 109, 61, - 37, 48, 50, 120, 37, 48, 50, 120, 37, 48, 50, 120, 37, 48, 50, 120, - 37, 48, 50, 120, 37, 48, 50, 120, 37, 48, 50, 120, 37, 48, 50, 120, - 0, 100, 101, 118, 105, 100, 61, 48, 120, 37, 120, 0, 112, 97, 37, 100, - 103, 119, 37, 100, 97, 37, 100, 61, 48, 120, 37, 120, 0, 114, 115, 115, - 105, 115, 109, 102, 53, 103, 61, 37, 100, 0, 111, 102, 100, 109, 50, - 103, 112, 111, 61, 48, 120, 37, 120, 0, 97, 97, 53, 103, 61, 48, 120, - 37, 120, 0, 119, 112, 115, 103, 112, 105, 111, 61, 37, 100, 0, 98, 120, - 97, 53, 103, 61, 37, 100, 0, 116, 115, 115, 105, 112, 111, 115, 53, - 103, 61, 48, 120, 37, 120, 0, 97, 110, 116, 115, 119, 99, 116, 108, - 50, 103, 61, 48, 120, 37, 120, 0, 114, 115, 115, 105, 115, 97, 118, - 53, 103, 61, 37, 100, 0, 111, 102, 100, 109, 112, 111, 61, 48, 120, - 37, 120, 0, 116, 114, 105, 50, 103, 61, 37, 100, 0, 115, 116, 98, 99, - 112, 111, 61, 48, 120, 37, 120, 0, 99, 99, 111, 100, 101, 61, 48, 120, - 48, 0, 109, 97, 99, 97, 100, 100, 114, 61, 37, 115, 0, 99, 99, 111, - 100, 101, 61, 37, 99, 37, 99, 0, 99, 99, 61, 37, 100, 0, 99, 99, 107, - 50, 103, 112, 111, 61, 48, 120, 37, 120, 0, 99, 99, 116, 108, 61, 48, - 120, 37, 120, 0, 114, 101, 103, 119, 105, 110, 100, 111, 119, 115, 122, - 61, 37, 100, 0, 101, 120, 116, 112, 97, 103, 97, 105, 110, 50, 103, - 61, 48, 120, 37, 120, 0, 98, 111, 97, 114, 100, 110, 117, 109, 61, 37, - 100, 0, 116, 114, 105, 115, 111, 53, 103, 61, 48, 120, 37, 120, 0, 99, - 99, 107, 98, 119, 50, 48, 50, 103, 112, 111, 61, 48, 120, 37, 120, 0, - 0, 0, 99, 99, 107, 98, 119, 50, 48, 117, 108, 50, 103, 112, 111, 61, - 48, 120, 37, 120, 0, 112, 100, 101, 116, 114, 97, 110, 103, 101, 53, - 103, 61, 48, 120, 37, 120, 0, 0, 0, 128, 0, 0, 0, 255, 0, 0, 0, 12, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 255, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 0, 255, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, - 0, 4, 0, 3, 0, 0, 0, 1, 0, 2, 0, 10, 0, 0, 0, 2, 0, 96, 0, 220, 5, 0, - 0, 8, 7, 23, 0, 116, 120, 112, 119, 114, 98, 99, 107, 111, 102, 0, 50, - 103, 95, 99, 103, 97, 0, 114, 115, 115, 105, 99, 111, 114, 114, 110, - 111, 114, 109, 0, 116, 115, 115, 105, 108, 105, 109, 117, 99, 111, 100, - 0, 116, 101, 109, 112, 115, 95, 104, 121, 115, 116, 101, 114, 101, 115, - 105, 115, 0, 114, 115, 115, 105, 99, 111, 114, 114, 97, 116, 116, 101, - 110, 0, 53, 103, 95, 99, 103, 97, 0, 116, 101, 109, 112, 116, 104, 114, - 101, 115, 104, 0, 105, 110, 116, 101, 114, 102, 101, 114, 101, 110, - 99, 101, 0, 109, 99, 115, 50, 103, 112, 111, 49, 0, 111, 112, 101, 110, - 108, 112, 103, 97, 105, 110, 105, 100, 120, 98, 37, 100, 0, 116, 115, - 115, 105, 111, 102, 102, 115, 101, 116, 109, 105, 110, 53, 103, 108, - 0, 116, 115, 115, 105, 111, 102, 102, 115, 101, 116, 109, 105, 110, - 53, 103, 109, 0, 116, 101, 109, 112, 115, 101, 110, 115, 101, 95, 115, - 108, 111, 112, 101, 0, 109, 101, 97, 115, 112, 111, 119, 101, 114, 0, - 114, 115, 115, 105, 115, 109, 102, 50, 103, 0, 112, 108, 108, 100, 111, - 117, 98, 108, 101, 114, 95, 109, 111, 100, 101, 50, 103, 0, 112, 97, - 114, 102, 112, 115, 0, 101, 100, 111, 110, 116, 104, 100, 0, 114, 102, - 114, 101, 103, 48, 51, 51, 95, 99, 99, 107, 0, 111, 112, 101, 110, 108, - 112, 103, 97, 105, 110, 105, 100, 120, 97, 49, 52, 48, 0, 101, 120, - 116, 112, 97, 103, 97, 105, 110, 53, 103, 0, 101, 120, 116, 112, 97, - 103, 97, 105, 110, 50, 103, 0, 111, 112, 101, 110, 108, 112, 103, 97, - 105, 110, 105, 100, 120, 97, 49, 52, 57, 0, 116, 120, 105, 113, 108, - 111, 112, 97, 103, 50, 103, 0, 110, 111, 105, 115, 101, 95, 99, 97, - 108, 95, 114, 101, 102, 95, 53, 103, 0, 112, 109, 97, 120, 0, 111, 112, - 101, 110, 108, 112, 103, 97, 105, 110, 105, 100, 120, 97, 49, 54, 53, - 0, 112, 97, 99, 97, 108, 105, 100, 120, 53, 103, 104, 105, 49, 0, 112, - 97, 99, 97, 108, 97, 116, 104, 50, 103, 49, 0, 100, 97, 99, 103, 99, - 50, 103, 0, 112, 109, 105, 110, 0, 112, 97, 99, 97, 108, 112, 117, 108, - 115, 101, 119, 105, 100, 116, 104, 0, 118, 98, 97, 116, 95, 109, 117, - 108, 116, 0, 109, 99, 115, 50, 103, 112, 111, 48, 0, 116, 120, 103, - 97, 105, 110, 116, 98, 108, 0, 111, 112, 101, 110, 108, 112, 116, 101, - 109, 112, 99, 111, 114, 114, 0, 116, 115, 115, 105, 109, 97, 120, 110, - 112, 116, 0, 110, 111, 105, 115, 101, 95, 99, 97, 108, 95, 101, 110, - 97, 98, 108, 101, 95, 53, 103, 0, 116, 120, 105, 113, 108, 111, 116, - 102, 0, 111, 112, 101, 110, 108, 112, 112, 119, 114, 108, 105, 109, - 0, 101, 100, 111, 102, 102, 116, 104, 100, 0, 110, 111, 105, 115, 101, - 95, 99, 97, 108, 95, 100, 98, 103, 0, 111, 112, 101, 110, 108, 112, - 103, 97, 105, 110, 105, 100, 120, 97, 49, 53, 51, 0, 112, 97, 99, 97, - 108, 105, 100, 120, 53, 103, 104, 105, 0, 111, 112, 101, 110, 108, 112, - 103, 97, 105, 110, 105, 100, 120, 97, 49, 53, 55, 0, 110, 111, 105, - 115, 101, 95, 99, 97, 108, 95, 117, 112, 100, 97, 116, 101, 0, 112, - 97, 103, 99, 50, 103, 0, 115, 119, 99, 116, 114, 108, 109, 97, 112, - 95, 50, 103, 0, 112, 97, 99, 97, 108, 97, 108, 105, 109, 0, 105, 113, - 108, 111, 99, 97, 108, 112, 119, 114, 50, 103, 0, 112, 97, 99, 97, 108, - 112, 119, 114, 50, 103, 49, 0, 116, 120, 103, 97, 105, 110, 116, 98, - 108, 53, 103, 0, 112, 97, 99, 97, 108, 97, 116, 104, 53, 103, 104, 105, - 0, 112, 97, 99, 97, 108, 97, 116, 104, 53, 103, 104, 105, 49, 0, 118, - 98, 97, 116, 115, 109, 99, 0, 97, 100, 99, 114, 102, 115, 101, 113, - 50, 103, 0, 118, 98, 97, 116, 115, 109, 102, 0, 114, 120, 103, 97, 105, - 110, 98, 97, 99, 107, 111, 102, 102, 118, 97, 108, 0, 114, 120, 103, - 97, 105, 110, 116, 101, 109, 112, 99, 111, 114, 114, 53, 103, 104, 0, - 110, 111, 105, 115, 101, 95, 99, 97, 108, 95, 114, 101, 102, 95, 50, - 103, 0, 118, 98, 97, 116, 95, 113, 0, 110, 111, 105, 115, 101, 95, 99, - 97, 108, 95, 112, 111, 95, 98, 105, 97, 115, 95, 50, 103, 0, 114, 102, - 114, 101, 103, 48, 56, 56, 0, 111, 112, 101, 110, 108, 112, 103, 97, - 105, 110, 105, 100, 120, 97, 49, 54, 49, 0, 112, 97, 99, 97, 108, 112, - 119, 114, 50, 103, 0, 100, 121, 110, 112, 119, 114, 108, 105, 109, 101, - 110, 0, 116, 101, 109, 112, 115, 97, 118, 0, 116, 101, 109, 112, 99, - 111, 114, 114, 120, 0, 100, 97, 99, 114, 97, 116, 101, 50, 103, 0, 112, - 97, 48, 98, 50, 95, 108, 111, 0, 116, 120, 105, 113, 108, 111, 112, - 97, 112, 117, 50, 103, 0, 116, 101, 109, 112, 115, 101, 110, 115, 101, - 95, 111, 112, 116, 105, 111, 110, 0, 112, 97, 99, 97, 108, 97, 116, - 104, 53, 103, 49, 0, 112, 97, 99, 97, 108, 97, 116, 104, 53, 103, 108, - 111, 49, 0, 112, 97, 99, 97, 108, 105, 100, 120, 50, 103, 49, 0, 116, - 120, 97, 108, 112, 102, 98, 121, 112, 50, 103, 0, 112, 97, 99, 97, 108, - 105, 100, 120, 50, 103, 0, 117, 110, 109, 111, 100, 95, 114, 115, 115, - 105, 95, 111, 102, 102, 115, 101, 116, 0, 111, 112, 101, 110, 108, 112, - 118, 111, 108, 116, 99, 111, 114, 114, 0, 112, 97, 99, 97, 108, 105, - 100, 120, 53, 103, 49, 0, 114, 120, 103, 97, 105, 110, 116, 98, 108, - 49, 48, 48, 0, 110, 111, 105, 115, 101, 95, 99, 97, 108, 95, 110, 102, - 95, 115, 117, 98, 115, 116, 114, 97, 99, 116, 95, 118, 97, 108, 0, 116, - 115, 115, 105, 116, 120, 100, 101, 108, 97, 121, 0, 99, 99, 107, 50, - 103, 112, 111, 0, 99, 99, 107, 80, 119, 114, 73, 100, 120, 67, 111, - 114, 114, 0, 99, 99, 107, 100, 105, 103, 102, 105, 108, 116, 116, 121, - 112, 101, 0, 108, 111, 99, 99, 109, 111, 100, 101, 49, 0, 108, 111, - 105, 100, 97, 99, 109, 111, 100, 101, 53, 103, 0, 112, 97, 99, 97, 108, - 97, 116, 104, 53, 103, 0, 114, 115, 115, 105, 115, 97, 118, 50, 103, - 0, 112, 97, 48, 98, 49, 95, 108, 111, 0, 109, 97, 120, 112, 50, 103, - 97, 48, 0, 114, 120, 103, 97, 105, 110, 116, 101, 109, 112, 99, 111, - 114, 114, 53, 103, 109, 0, 112, 97, 99, 97, 108, 97, 116, 104, 50, 103, - 0, 112, 108, 108, 100, 111, 117, 98, 108, 101, 114, 95, 101, 110, 97, - 98, 108, 101, 50, 103, 0, 112, 97, 48, 98, 48, 0, 112, 97, 48, 98, 49, - 0, 112, 97, 48, 98, 50, 0, 111, 112, 101, 110, 108, 112, 103, 97, 105, - 110, 105, 100, 120, 97, 51, 54, 0, 112, 97, 99, 97, 108, 102, 99, 100, - 49, 0, 110, 111, 105, 115, 101, 95, 99, 97, 108, 95, 97, 100, 106, 95, - 53, 103, 0, 105, 113, 108, 111, 99, 97, 108, 105, 100, 120, 50, 103, - 111, 102, 102, 115, 0, 105, 113, 108, 111, 115, 116, 49, 111, 102, 102, - 50, 103, 0, 111, 112, 101, 110, 108, 112, 103, 97, 105, 110, 105, 100, - 120, 97, 49, 48, 48, 0, 114, 97, 119, 116, 101, 109, 112, 115, 101, - 110, 115, 101, 0, 111, 112, 101, 110, 108, 112, 103, 97, 105, 110, 105, - 100, 120, 97, 49, 48, 52, 0, 105, 113, 108, 111, 99, 97, 108, 105, 100, - 120, 50, 103, 0, 111, 112, 101, 110, 108, 112, 112, 119, 114, 99, 116, - 114, 108, 0, 111, 112, 101, 110, 108, 112, 103, 97, 105, 110, 105, 100, - 120, 97, 49, 48, 56, 0, 114, 102, 114, 101, 103, 48, 51, 51, 0, 116, - 120, 95, 116, 111, 110, 101, 95, 112, 111, 119, 101, 114, 95, 105, 110, - 100, 101, 120, 0, 111, 112, 101, 110, 108, 112, 114, 101, 102, 112, - 119, 114, 0, 112, 97, 48, 98, 48, 95, 108, 111, 0, 110, 111, 105, 115, - 101, 95, 99, 97, 108, 95, 112, 111, 95, 50, 103, 0, 114, 120, 103, 97, - 105, 110, 116, 101, 109, 112, 99, 111, 114, 114, 53, 103, 108, 0, 112, - 97, 99, 97, 108, 105, 100, 120, 53, 103, 49, 116, 104, 0, 112, 97, 103, - 99, 53, 103, 0, 112, 97, 99, 97, 108, 105, 100, 120, 53, 103, 108, 111, - 49, 116, 104, 0, 115, 119, 99, 116, 114, 108, 109, 97, 112, 95, 53, - 103, 0, 116, 115, 115, 105, 111, 102, 102, 115, 101, 116, 109, 105, - 110, 0, 115, 112, 117, 114, 97, 118, 111, 105, 100, 95, 101, 110, 97, - 98, 108, 101, 50, 103, 0, 110, 111, 105, 115, 101, 95, 99, 97, 108, - 95, 112, 111, 95, 98, 105, 97, 115, 95, 53, 103, 0, 111, 112, 101, 110, - 108, 112, 103, 97, 105, 110, 105, 100, 120, 97, 52, 48, 0, 108, 111, - 103, 101, 110, 95, 109, 111, 100, 101, 0, 111, 112, 101, 110, 108, 112, - 103, 97, 105, 110, 105, 100, 120, 97, 52, 52, 0, 110, 111, 105, 115, - 101, 95, 99, 97, 108, 95, 104, 105, 103, 104, 95, 103, 97, 105, 110, - 0, 114, 102, 114, 101, 103, 48, 51, 56, 0, 110, 111, 105, 115, 101, - 95, 99, 97, 108, 95, 97, 100, 106, 95, 50, 103, 0, 112, 97, 99, 97, - 108, 105, 100, 120, 53, 103, 108, 111, 49, 0, 109, 101, 97, 115, 112, - 111, 119, 101, 114, 49, 0, 109, 101, 97, 115, 112, 111, 119, 101, 114, - 50, 0, 111, 112, 101, 110, 108, 112, 103, 97, 105, 110, 105, 100, 120, - 97, 49, 49, 54, 0, 98, 112, 104, 121, 115, 99, 97, 108, 101, 0, 114, - 115, 115, 105, 115, 109, 99, 50, 103, 0, 114, 120, 103, 97, 105, 110, - 116, 101, 109, 112, 99, 111, 114, 114, 50, 103, 0, 111, 102, 100, 109, - 97, 110, 97, 108, 111, 103, 102, 105, 108, 116, 98, 119, 50, 103, 0, - 97, 97, 50, 103, 0, 116, 101, 109, 112, 95, 109, 117, 108, 116, 0, 111, - 102, 100, 109, 50, 103, 112, 111, 0, 118, 98, 97, 116, 115, 97, 118, - 0, 112, 97, 99, 97, 108, 97, 116, 104, 53, 103, 108, 111, 0, 112, 97, - 99, 97, 108, 105, 100, 120, 50, 103, 49, 116, 104, 0, 99, 99, 107, 80, - 119, 114, 79, 102, 102, 115, 101, 116, 0, 116, 120, 112, 119, 114, 105, - 110, 100, 101, 120, 0, 105, 113, 108, 111, 99, 97, 108, 105, 100, 120, - 53, 103, 111, 102, 102, 115, 0, 112, 97, 99, 97, 108, 105, 100, 120, - 53, 103, 108, 111, 0, 103, 109, 103, 99, 50, 103, 0, 112, 97, 99, 97, - 108, 105, 100, 120, 53, 103, 104, 105, 49, 116, 104, 0, 114, 120, 112, - 111, 50, 103, 0, 110, 111, 105, 115, 101, 95, 99, 97, 108, 95, 101, - 110, 97, 98, 108, 101, 95, 50, 103, 0, 111, 112, 101, 110, 108, 112, - 103, 97, 105, 110, 105, 100, 120, 97, 53, 50, 0, 111, 112, 101, 110, - 108, 112, 103, 97, 105, 110, 105, 100, 120, 97, 53, 54, 0, 111, 112, - 101, 110, 108, 112, 103, 97, 105, 110, 105, 100, 120, 97, 49, 49, 50, - 0, 116, 114, 105, 115, 111, 50, 103, 0, 118, 98, 97, 116, 95, 97, 100, - 100, 0, 111, 112, 101, 110, 108, 112, 103, 97, 105, 110, 105, 100, 120, - 97, 49, 50, 48, 0, 111, 112, 101, 110, 108, 112, 103, 97, 105, 110, - 105, 100, 120, 97, 49, 50, 52, 0, 111, 112, 101, 110, 108, 112, 103, - 97, 105, 110, 105, 100, 120, 97, 49, 50, 56, 0, 116, 114, 105, 100, - 120, 50, 103, 0, 111, 102, 100, 109, 100, 105, 103, 102, 105, 108, 116, - 116, 121, 112, 101, 50, 103, 0, 111, 112, 101, 110, 108, 112, 103, 97, - 105, 110, 105, 100, 120, 97, 52, 56, 0, 116, 101, 109, 112, 95, 97, - 100, 100, 0, 114, 120, 103, 97, 105, 110, 116, 98, 108, 119, 108, 98, - 103, 97, 0, 105, 110, 105, 116, 120, 105, 100, 120, 50, 103, 0, 104, - 119, 95, 105, 113, 99, 97, 108, 95, 101, 110, 0, 105, 113, 99, 97, 108, - 95, 115, 119, 112, 95, 100, 105, 115, 0, 109, 117, 120, 95, 103, 97, - 105, 110, 95, 116, 97, 98, 108, 101, 0, 116, 115, 115, 105, 111, 102, - 102, 115, 101, 116, 109, 97, 120, 53, 103, 104, 0, 116, 101, 109, 112, - 95, 113, 0, 116, 115, 115, 105, 111, 102, 102, 115, 101, 116, 109, 97, - 120, 53, 103, 108, 0, 116, 115, 115, 105, 111, 102, 102, 115, 101, 116, - 109, 97, 120, 53, 103, 109, 0, 116, 101, 109, 112, 115, 109, 99, 0, - 116, 101, 109, 112, 115, 109, 102, 0, 116, 115, 115, 105, 111, 102, - 102, 115, 101, 116, 109, 97, 120, 0, 112, 97, 99, 97, 108, 105, 100, - 120, 53, 103, 0, 111, 112, 101, 110, 108, 112, 103, 97, 105, 110, 105, - 100, 120, 97, 54, 48, 0, 116, 120, 97, 108, 112, 102, 98, 121, 112, - 50, 103, 95, 99, 99, 107, 0, 111, 112, 101, 110, 108, 112, 103, 97, - 105, 110, 105, 100, 120, 97, 54, 52, 0, 102, 114, 101, 113, 111, 102, - 102, 115, 101, 116, 95, 99, 111, 114, 114, 0, 111, 102, 100, 109, 100, - 105, 103, 102, 105, 108, 116, 116, 121, 112, 101, 53, 103, 0, 111, 112, - 101, 110, 108, 112, 103, 97, 105, 110, 105, 100, 120, 97, 49, 51, 50, - 0, 111, 112, 101, 110, 108, 112, 103, 97, 105, 110, 105, 100, 120, 97, - 49, 51, 54, 0, 111, 102, 100, 109, 100, 105, 103, 102, 105, 108, 116, - 116, 121, 112, 101, 0, 120, 116, 97, 108, 109, 111, 100, 101, 0, 116, - 115, 115, 105, 116, 105, 109, 101, 0, 110, 111, 105, 115, 101, 95, 99, - 97, 108, 95, 112, 111, 95, 53, 103, 0, 116, 115, 115, 105, 111, 102, - 102, 115, 101, 116, 109, 105, 110, 53, 103, 104, 0, 9, 12, 18, 24, 24, - 24, 9, 12, 18, 24, 24, 24, 0, 0, 12, 7, 111, 122, 6, 12, 15, 123, 126, - 1, 5, 8, 11, 14, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 9, 12, 15, 18, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 9, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 232, 167, 2, 0, 96, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, - 0, 30, 170, 2, 0, 38, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, - 176, 170, 2, 0, 152, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, - 91, 160, 2, 0, 68, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 112, - 175, 2, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 7, 0, 31, - 0, 72, 7, 0, 31, 0, 70, 7, 0, 31, 0, 68, 7, 0, 30, 0, 67, 7, 0, 29, - 0, 68, 7, 0, 28, 0, 68, 7, 0, 27, 0, 69, 7, 0, 26, 0, 70, 7, 0, 25, - 0, 70, 7, 0, 24, 0, 71, 7, 0, 23, 0, 72, 7, 0, 23, 0, 70, 7, 0, 22, - 0, 71, 7, 0, 21, 0, 72, 7, 0, 21, 0, 70, 7, 0, 21, 0, 68, 7, 0, 21, - 0, 66, 7, 0, 21, 0, 64, 7, 0, 21, 0, 63, 7, 0, 20, 0, 64, 7, 0, 19, - 0, 65, 7, 0, 19, 0, 64, 7, 0, 18, 0, 65, 7, 0, 18, 0, 64, 7, 0, 17, - 0, 65, 7, 0, 17, 0, 64, 7, 0, 16, 0, 65, 7, 0, 16, 0, 64, 7, 0, 16, - 0, 62, 7, 0, 16, 0, 60, 7, 0, 16, 0, 58, 7, 0, 15, 0, 61, 7, 0, 15, - 0, 59, 7, 0, 14, 0, 61, 7, 0, 14, 0, 60, 7, 0, 14, 0, 58, 7, 0, 13, - 0, 60, 7, 0, 13, 0, 59, 7, 0, 12, 0, 62, 7, 0, 12, 0, 60, 7, 0, 12, - 0, 58, 7, 0, 11, 0, 62, 7, 0, 11, 0, 60, 7, 0, 11, 0, 59, 7, 0, 11, - 0, 57, 7, 0, 10, 0, 61, 7, 0, 10, 0, 59, 7, 0, 10, 0, 57, 7, 0, 9, 0, - 62, 7, 0, 9, 0, 60, 7, 0, 9, 0, 58, 7, 0, 9, 0, 57, 7, 0, 8, 0, 62, - 7, 0, 8, 0, 60, 7, 0, 8, 0, 58, 7, 0, 8, 0, 57, 7, 0, 8, 0, 55, 7, 0, - 7, 0, 61, 7, 0, 7, 0, 60, 7, 0, 7, 0, 58, 7, 0, 7, 0, 56, 7, 0, 7, 0, - 55, 7, 0, 6, 0, 62, 7, 0, 6, 0, 60, 7, 0, 6, 0, 58, 7, 0, 6, 0, 57, - 7, 0, 6, 0, 55, 7, 0, 6, 0, 54, 7, 0, 6, 0, 52, 7, 0, 5, 0, 61, 7, 0, - 5, 0, 59, 7, 0, 5, 0, 57, 7, 0, 5, 0, 56, 7, 0, 5, 0, 54, 7, 0, 5, 0, - 53, 7, 0, 5, 0, 51, 7, 0, 4, 0, 62, 7, 0, 4, 0, 60, 7, 0, 4, 0, 58, - 7, 0, 4, 0, 57, 7, 0, 4, 0, 55, 7, 0, 4, 0, 54, 7, 0, 4, 0, 52, 7, 0, - 4, 0, 51, 7, 0, 4, 0, 49, 7, 0, 4, 0, 48, 7, 0, 4, 0, 46, 7, 0, 3, 0, - 60, 7, 0, 3, 0, 58, 7, 0, 3, 0, 57, 7, 0, 3, 0, 55, 7, 0, 3, 0, 54, - 7, 0, 3, 0, 52, 7, 0, 3, 0, 51, 7, 0, 3, 0, 49, 7, 0, 3, 0, 48, 7, 0, - 3, 0, 46, 7, 0, 3, 0, 45, 7, 0, 3, 0, 44, 7, 0, 3, 0, 43, 7, 0, 3, 0, - 41, 7, 0, 2, 0, 61, 7, 0, 2, 0, 59, 7, 0, 2, 0, 57, 7, 0, 2, 0, 56, - 7, 0, 2, 0, 54, 7, 0, 2, 0, 53, 7, 0, 2, 0, 51, 7, 0, 2, 0, 50, 7, 0, - 2, 0, 48, 7, 0, 2, 0, 47, 7, 0, 2, 0, 46, 7, 0, 2, 0, 44, 7, 0, 2, 0, - 43, 7, 0, 2, 0, 42, 7, 0, 2, 0, 41, 7, 0, 2, 0, 39, 7, 0, 2, 0, 38, - 7, 0, 2, 0, 37, 7, 0, 2, 0, 36, 7, 0, 2, 0, 35, 7, 0, 2, 0, 34, 7, 0, - 2, 0, 33, 7, 0, 2, 0, 32, 7, 0, 1, 0, 63, 7, 0, 1, 0, 61, 7, 0, 1, 0, - 59, 7, 0, 1, 0, 57, 0, 0, 0, 0, 64, 0, 0, 0, 128, 0, 0, 0, 192, 0, 0, - 0, 1, 0, 0, 0, 5, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 74, - 0, 0, 0, 138, 0, 0, 0, 202, 0, 0, 0, 10, 1, 0, 0, 74, 1, 0, 0, 138, - 1, 0, 0, 138, 5, 0, 0, 138, 9, 0, 0, 138, 13, 0, 0, 138, 17, 0, 0, 138, - 81, 0, 0, 138, 145, 0, 0, 138, 209, 0, 0, 138, 17, 1, 0, 138, 81, 1, - 0, 138, 145, 1, 0, 137, 0, 0, 0, 138, 209, 1, 0, 138, 17, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 163, 2, 0, 96, - 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 210, 169, 2, 0, 38, 0, - 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 173, 2, 0, 152, 0, 0, - 0, 13, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 106, 170, 2, 0, 68, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 112, 175, 2, 0, 16, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 3, 0, 19, 0, 65, 3, 0, 19, 0, 64, 3, - 0, 18, 0, 65, 3, 0, 18, 0, 64, 3, 0, 17, 0, 65, 3, 0, 17, 0, 64, 3, - 0, 16, 0, 65, 3, 0, 16, 0, 64, 3, 0, 16, 0, 62, 3, 0, 16, 0, 60, 3, - 0, 16, 0, 58, 3, 0, 15, 0, 61, 3, 0, 15, 0, 59, 3, 0, 14, 0, 61, 3, - 0, 14, 0, 60, 3, 0, 14, 0, 58, 3, 0, 13, 0, 60, 3, 0, 13, 0, 59, 3, - 0, 12, 0, 62, 3, 0, 12, 0, 60, 3, 0, 12, 0, 58, 3, 0, 11, 0, 62, 3, - 0, 11, 0, 60, 3, 0, 11, 0, 59, 3, 0, 11, 0, 57, 3, 0, 10, 0, 61, 3, - 0, 10, 0, 59, 3, 0, 10, 0, 57, 3, 0, 9, 0, 62, 3, 0, 9, 0, 60, 3, 0, - 9, 0, 58, 3, 0, 9, 0, 57, 3, 0, 8, 0, 62, 3, 0, 8, 0, 60, 3, 0, 8, 0, - 58, 3, 0, 8, 0, 57, 3, 0, 8, 0, 55, 3, 0, 7, 0, 61, 3, 0, 7, 0, 60, - 3, 0, 7, 0, 58, 3, 0, 7, 0, 56, 3, 0, 7, 0, 55, 3, 0, 6, 0, 62, 3, 0, - 6, 0, 60, 3, 0, 6, 0, 58, 3, 0, 6, 0, 57, 3, 0, 6, 0, 55, 3, 0, 6, 0, - 54, 3, 0, 6, 0, 52, 3, 0, 5, 0, 61, 3, 0, 5, 0, 59, 3, 0, 5, 0, 57, - 3, 0, 5, 0, 56, 3, 0, 5, 0, 54, 3, 0, 5, 0, 53, 3, 0, 5, 0, 51, 3, 0, - 4, 0, 62, 3, 0, 4, 0, 60, 3, 0, 4, 0, 58, 3, 0, 4, 0, 57, 3, 0, 4, 0, - 55, 3, 0, 4, 0, 54, 3, 0, 4, 0, 52, 3, 0, 4, 0, 51, 3, 0, 4, 0, 49, - 3, 0, 4, 0, 48, 3, 0, 4, 0, 46, 3, 0, 3, 0, 60, 3, 0, 3, 0, 58, 3, 0, - 3, 0, 57, 3, 0, 3, 0, 55, 3, 0, 3, 0, 54, 3, 0, 3, 0, 52, 3, 0, 3, 0, - 51, 3, 0, 3, 0, 49, 3, 0, 3, 0, 48, 3, 0, 3, 0, 46, 3, 0, 3, 0, 45, - 3, 0, 3, 0, 44, 3, 0, 3, 0, 43, 3, 0, 3, 0, 41, 3, 0, 2, 0, 61, 3, 0, - 2, 0, 59, 3, 0, 2, 0, 57, 3, 0, 2, 0, 56, 3, 0, 2, 0, 54, 3, 0, 2, 0, - 53, 3, 0, 2, 0, 51, 3, 0, 2, 0, 50, 3, 0, 2, 0, 48, 3, 0, 2, 0, 47, - 3, 0, 2, 0, 46, 3, 0, 2, 0, 44, 3, 0, 2, 0, 43, 3, 0, 2, 0, 42, 3, 0, - 2, 0, 41, 3, 0, 2, 0, 39, 3, 0, 2, 0, 38, 3, 0, 2, 0, 37, 3, 0, 2, 0, - 36, 3, 0, 2, 0, 35, 3, 0, 2, 0, 34, 3, 0, 2, 0, 33, 3, 0, 2, 0, 32, - 3, 0, 1, 0, 63, 3, 0, 1, 0, 61, 3, 0, 1, 0, 59, 3, 0, 1, 0, 57, 3, 0, - 1, 0, 56, 3, 0, 1, 0, 54, 3, 0, 1, 0, 53, 3, 0, 1, 0, 51, 3, 0, 1, 0, - 50, 3, 0, 1, 0, 48, 3, 0, 1, 0, 47, 3, 0, 1, 0, 46, 3, 0, 1, 0, 44, - 3, 0, 1, 0, 43, 3, 0, 1, 0, 42, 3, 0, 1, 0, 41, 3, 0, 1, 0, 39, 3, 0, - 1, 0, 38, 3, 0, 1, 0, 37, 3, 0, 1, 0, 36, 3, 0, 1, 0, 35, 3, 0, 1, 0, - 34, 3, 0, 1, 0, 33, 3, 0, 1, 0, 32, 0, 0, 0, 0, 4, 0, 0, 0, 64, 0, 0, - 0, 128, 0, 0, 0, 192, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 69, 0, 0, 0, - 133, 0, 0, 0, 197, 0, 0, 0, 5, 1, 0, 0, 69, 1, 0, 0, 133, 1, 0, 0, 133, - 5, 0, 0, 133, 9, 0, 0, 133, 13, 0, 0, 137, 9, 0, 0, 137, 13, 0, 0, 137, - 17, 0, 0, 137, 81, 0, 0, 137, 145, 0, 0, 137, 209, 0, 0, 137, 17, 1, - 0, 133, 77, 0, 0, 133, 141, 0, 0, 133, 205, 0, 0, 137, 81, 1, 0, 137, - 145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 0, 16, 0, 57, 7, 0, 16, 0, 56, 7, 0, 16, 0, 54, 7, 0, 16, 0, 52, - 7, 0, 16, 0, 51, 7, 0, 16, 0, 49, 7, 0, 16, 0, 48, 7, 0, 16, 0, 47, - 7, 0, 16, 0, 45, 7, 0, 16, 0, 44, 7, 0, 16, 0, 43, 7, 0, 16, 0, 42, - 7, 0, 16, 0, 40, 7, 0, 16, 0, 39, 7, 0, 16, 0, 38, 7, 0, 16, 0, 37, - 7, 0, 16, 0, 36, 7, 0, 16, 0, 35, 7, 0, 16, 0, 34, 7, 0, 16, 0, 33, - 7, 0, 16, 0, 32, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, - 128, 0, 128, 0, 128, 0, 129, 0, 130, 0, 131, 0, 132, 0, 133, 0, 4, 1, - 5, 1, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 129, 0, - 130, 0, 131, 0, 132, 0, 133, 0, 4, 1, 5, 1, 6, 1, 7, 1, 25, 1, 135, - 1, 136, 1, 137, 1, 138, 1, 139, 1, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, - 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 1, 4, 128, 4, 130, 4, 131, 4, 132, - 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 1, 4, 128, - 4, 130, 4, 131, 4, 132, 4, 133, 4, 134, 4, 5, 5, 6, 5, 7, 5, 8, 5, 9, - 5, 10, 5, 9, 12, 18, 24, 24, 24, 9, 12, 18, 24, 24, 24, 0, 0, 12, 7, - 111, 122, 6, 12, 15, 123, 126, 1, 5, 8, 11, 14, 17, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 6, 9, 12, 15, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 9, - 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, - 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, - 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 64, - 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, - 0, 64, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 16, 64, 0, 0, 0, 0, - 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 32, 72, 0, 0, 0, 0, 0, 0, 48, 72, 0, - 0, 0, 0, 0, 0, 64, 72, 0, 0, 0, 0, 0, 0, 80, 72, 0, 0, 0, 0, 0, 0, 96, - 72, 0, 0, 0, 0, 0, 0, 80, 80, 0, 0, 0, 0, 0, 0, 96, 80, 0, 0, 0, 0, - 0, 0, 112, 80, 0, 0, 0, 0, 0, 0, 128, 80, 0, 0, 0, 0, 0, 0, 144, 80, - 0, 0, 0, 0, 0, 0, 160, 80, 0, 0, 0, 0, 0, 0, 176, 80, 0, 0, 0, 0, 0, - 0, 192, 80, 0, 0, 0, 0, 0, 0, 208, 80, 0, 0, 0, 0, 0, 0, 224, 80, 0, - 0, 0, 0, 0, 0, 240, 80, 0, 0, 0, 0, 0, 0, 224, 88, 0, 0, 0, 0, 0, 0, - 0, 89, 0, 0, 0, 0, 0, 0, 16, 89, 0, 0, 0, 0, 0, 0, 32, 89, 0, 0, 0, - 0, 0, 0, 48, 89, 0, 0, 0, 0, 0, 0, 64, 89, 0, 0, 0, 0, 0, 0, 80, 89, - 0, 0, 0, 0, 0, 0, 96, 89, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, - 0, 64, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, - 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, - 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 16, 64, - 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 32, 72, 0, 0, 0, 0, 0, 0, - 48, 72, 0, 0, 0, 0, 0, 0, 64, 72, 0, 0, 0, 0, 0, 0, 80, 72, 0, 0, 0, - 0, 0, 0, 96, 72, 0, 0, 0, 0, 0, 0, 80, 80, 0, 0, 0, 0, 0, 0, 96, 80, - 0, 0, 0, 0, 0, 0, 112, 80, 0, 0, 0, 0, 0, 0, 128, 80, 0, 0, 0, 0, 0, - 0, 144, 80, 0, 0, 0, 0, 0, 0, 160, 80, 0, 0, 0, 0, 0, 0, 176, 80, 0, - 0, 0, 0, 0, 0, 192, 80, 0, 0, 0, 0, 0, 0, 208, 80, 0, 0, 0, 0, 0, 0, - 224, 80, 0, 0, 0, 0, 0, 0, 240, 80, 0, 0, 0, 0, 0, 0, 112, 81, 0, 0, - 0, 0, 0, 0, 128, 81, 0, 0, 0, 0, 0, 0, 144, 81, 0, 0, 0, 0, 0, 0, 32, - 89, 0, 0, 0, 0, 0, 0, 48, 89, 0, 0, 0, 0, 0, 0, 64, 89, 0, 0, 0, 0, - 0, 0, 80, 89, 0, 0, 0, 0, 0, 0, 96, 89, 0, 0, 0, 0, 0, 0, 160, 89, 0, - 0, 0, 0, 0, 0, 176, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, - 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0, 32, 8, 0, 0, - 0, 0, 0, 0, 48, 8, 0, 0, 0, 0, 0, 0, 64, 8, 0, 0, 0, 0, 0, 0, 80, 8, - 0, 0, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 0, 0, 80, 16, 0, 0, 0, 0, 0, 0, - 96, 16, 0, 0, 0, 0, 0, 0, 112, 16, 0, 0, 0, 0, 0, 0, 128, 16, 0, 0, - 0, 0, 0, 0, 112, 24, 0, 0, 0, 0, 0, 0, 128, 24, 0, 0, 0, 0, 0, 0, 144, - 24, 0, 0, 0, 0, 0, 0, 160, 24, 0, 0, 0, 0, 0, 0, 176, 24, 0, 0, 0, 0, - 0, 0, 192, 24, 0, 0, 0, 0, 0, 0, 208, 24, 0, 0, 0, 0, 0, 0, 224, 24, - 0, 0, 0, 0, 0, 0, 240, 24, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, - 16, 25, 0, 0, 0, 0, 0, 0, 32, 25, 0, 0, 0, 0, 0, 0, 48, 25, 0, 0, 0, - 0, 0, 0, 64, 25, 0, 0, 0, 0, 0, 0, 80, 25, 0, 0, 0, 0, 0, 0, 96, 25, - 0, 0, 0, 0, 0, 0, 112, 25, 0, 0, 0, 0, 0, 0, 128, 25, 0, 0, 0, 0, 0, - 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0, 32, 8, 0, - 0, 0, 0, 0, 0, 48, 8, 0, 0, 0, 0, 0, 0, 64, 8, 0, 0, 0, 0, 0, 0, 80, - 8, 0, 0, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 0, 0, 80, 16, 0, 0, 0, 0, 0, - 0, 96, 16, 0, 0, 0, 0, 0, 0, 112, 16, 0, 0, 0, 0, 0, 0, 144, 17, 0, - 0, 0, 0, 0, 0, 112, 24, 0, 0, 0, 0, 0, 0, 128, 24, 0, 0, 0, 0, 0, 0, - 144, 24, 0, 0, 0, 0, 0, 0, 160, 24, 0, 0, 0, 0, 0, 0, 176, 24, 0, 0, - 0, 0, 0, 0, 192, 24, 0, 0, 0, 0, 0, 0, 208, 24, 0, 0, 0, 0, 0, 0, 224, - 24, 0, 0, 0, 0, 0, 0, 240, 24, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, - 0, 0, 16, 25, 0, 0, 0, 0, 0, 0, 32, 25, 0, 0, 0, 0, 0, 0, 48, 25, 0, - 0, 0, 0, 0, 0, 64, 25, 0, 0, 0, 0, 0, 0, 80, 25, 0, 0, 0, 0, 0, 0, 96, - 25, 0, 0, 0, 0, 0, 0, 112, 25, 0, 0, 0, 0, 0, 0, 128, 25, 0, 0, 0, 0, - 0, 0, 160, 25, 0, 0, 0, 0, 0, 0, 176, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 54, 41, 31, 95, 54, 41, 31, 95, 54, - 41, 31, 95, 54, 41, 31, 10, 82, 84, 69, 32, 40, 37, 115, 45, 37, 115, - 37, 115, 37, 115, 41, 32, 37, 115, 32, 111, 110, 32, 66, 67, 77, 37, - 115, 32, 114, 37, 100, 32, 64, 32, 37, 100, 46, 37, 100, 47, 37, 100, - 46, 37, 100, 47, 37, 100, 46, 37, 100, 77, 72, 122, 10, 0, 0, 0, 0, - 45, 233, 255, 65, 7, 70, 13, 70, 8, 70, 252, 33, 22, 70, 152, 70, 219, - 243, 128, 246, 4, 70, 96, 179, 0, 33, 252, 34, 215, 243, 50, 240, 10, - 155, 56, 70, 0, 147, 4, 241, 100, 3, 1, 147, 4, 241, 104, 3, 2, 147, - 41, 70, 50, 70, 67, 70, 251, 247, 146, 252, 32, 102, 208, 177, 64, 246, - 18, 1, 0, 34, 224, 243, 251, 240, 0, 33, 10, 70, 224, 102, 37, 96, 32, - 110, 223, 243, 24, 247, 32, 70, 248, 247, 43, 249, 32, 110, 251, 247, - 246, 250, 40, 70, 33, 70, 252, 34, 219, 243, 99, 246, 0, 32, 2, 224, - 30, 32, 0, 224, 11, 32, 4, 176, 189, 232, 240, 129, 0, 0, 122, 134, - 0, 0, 1, 188, 96, 3, 0, 16, 78, 3, 191, 222, 2, 240, 12, 38, 3, 168, - 94, 2, 240, 0, 19, 3, 166, 94, 2, 240, 0, 19, 2, 130, 94, 83, 0, 0, - 19, 2, 133, 94, 175, 0, 0, 19, 3, 163, 94, 2, 240, 0, 19, 2, 131, 194, - 31, 0, 0, 19, 2, 134, 192, 55, 0, 0, 19, 2, 2, 0, 191, 0, 0, 16, 3, - 168, 94, 2, 240, 0, 19, 2, 130, 222, 187, 0, 0, 19, 2, 130, 222, 179, - 0, 0, 19, 2, 131, 94, 183, 0, 0, 19, 2, 132, 94, 179, 0, 0, 19, 2, 134, - 0, 199, 0, 0, 19, 2, 132, 128, 195, 0, 0, 19, 1, 188, 99, 255, 31, 240, - 64, 0, 0, 222, 2, 240, 0, 0, 3, 91, 94, 2, 240, 0, 21, 1, 188, 96, 19, - 0, 16, 67, 0, 1, 94, 2, 240, 0, 0, 0, 2, 94, 2, 240, 17, 139, 0, 2, - 94, 2, 240, 17, 160, 2, 2, 0, 191, 0, 0, 146, 2, 4, 94, 255, 0, 0, 29, - 0, 107, 68, 101, 87, 64, 29, 1, 132, 96, 2, 247, 247, 191, 1, 188, 96, - 3, 0, 10, 172, 0, 2, 94, 2, 240, 15, 52, 2, 2, 222, 255, 0, 0, 34, 0, - 107, 68, 101, 85, 224, 34, 1, 130, 224, 2, 247, 247, 191, 3, 191, 222, - 2, 240, 5, 200, 0, 104, 43, 103, 0, 0, 39, 2, 128, 222, 255, 0, 0, 146, - 0, 107, 68, 101, 91, 32, 146, 1, 132, 224, 6, 245, 119, 171, 0, 2, 94, - 2, 240, 17, 50, 2, 4, 128, 199, 0, 0, 41, 2, 129, 128, 199, 0, 0, 43, - 1, 128, 96, 2, 247, 247, 191, 1, 188, 96, 3, 0, 10, 224, 0, 144, 43, - 251, 0, 215, 162, 0, 224, 43, 246, 244, 87, 163, 0, 109, 68, 106, 244, - 96, 47, 0, 176, 43, 239, 0, 10, 246, 1, 135, 96, 2, 247, 247, 191, 0, - 104, 43, 215, 0, 0, 54, 0, 233, 68, 101, 94, 183, 163, 0, 232, 196, - 105, 95, 55, 162, 0, 104, 222, 139, 0, 0, 54, 0, 109, 222, 141, 94, - 192, 54, 1, 135, 96, 6, 247, 247, 191, 2, 7, 222, 255, 0, 0, 59, 0, - 232, 68, 101, 90, 247, 162, 0, 109, 94, 137, 90, 192, 59, 1, 135, 224, - 2, 247, 247, 191, 1, 188, 96, 3, 0, 10, 215, 0, 104, 42, 255, 0, 0, - 70, 0, 232, 68, 101, 87, 247, 161, 0, 109, 222, 133, 87, 0, 66, 0, 104, - 43, 59, 0, 0, 70, 0, 232, 68, 101, 89, 215, 161, 0, 109, 222, 133, 87, - 0, 68, 3, 191, 222, 2, 240, 0, 70, 1, 188, 96, 3, 0, 10, 192, 1, 188, - 96, 3, 0, 10, 191, 1, 188, 96, 3, 0, 10, 206, 1, 188, 96, 3, 0, 10, - 198, 2, 2, 222, 179, 0, 0, 73, 2, 0, 66, 3, 0, 0, 73, 0, 2, 94, 2, 240, - 11, 29, 2, 132, 94, 179, 0, 0, 146, 0, 104, 171, 7, 0, 0, 146, 2, 131, - 222, 183, 0, 0, 77, 2, 1, 128, 199, 0, 0, 104, 0, 176, 42, 195, 0, 23, - 162, 2, 128, 43, 235, 0, 0, 84, 0, 176, 43, 27, 0, 23, 161, 0, 109, - 222, 133, 92, 160, 134, 0, 104, 94, 135, 0, 0, 84, 0, 104, 43, 255, - 0, 0, 84, 0, 176, 43, 255, 0, 23, 162, 0, 104, 43, 3, 0, 0, 89, 0, 232, - 68, 101, 88, 23, 161, 0, 109, 222, 134, 244, 64, 134, 0, 224, 94, 133, - 85, 183, 161, 0, 109, 222, 134, 244, 64, 134, 2, 2, 222, 187, 0, 0, - 104, 0, 104, 42, 179, 0, 0, 104, 0, 232, 68, 101, 86, 151, 161, 0, 224, - 42, 179, 1, 87, 162, 0, 110, 222, 134, 244, 64, 98, 1, 130, 224, 2, - 245, 215, 174, 1, 188, 96, 3, 0, 10, 240, 1, 188, 96, 3, 0, 10, 172, - 3, 191, 222, 2, 240, 0, 104, 0, 232, 42, 178, 244, 55, 161, 0, 144, - 42, 179, 0, 55, 162, 0, 110, 42, 182, 244, 64, 102, 0, 176, 42, 183, - 0, 23, 162, 0, 105, 222, 134, 244, 64, 104, 3, 191, 222, 2, 240, 0, - 134, 2, 131, 222, 183, 0, 0, 126, 2, 136, 129, 171, 0, 0, 124, 2, 3, - 94, 183, 0, 0, 146, 2, 4, 128, 199, 0, 0, 109, 2, 0, 94, 255, 0, 0, - 124, 2, 128, 128, 191, 0, 0, 124, 0, 104, 43, 59, 0, 0, 115, 2, 128, - 43, 235, 0, 0, 115, 0, 176, 43, 67, 0, 23, 187, 0, 110, 43, 26, 247, - 96, 146, 3, 191, 222, 2, 240, 0, 124, 2, 4, 222, 183, 0, 0, 117, 3, - 191, 222, 2, 240, 0, 124, 2, 132, 0, 199, 0, 0, 119, 2, 134, 0, 199, - 0, 0, 120, 0, 104, 43, 3, 0, 0, 124, 0, 232, 68, 101, 86, 247, 161, - 0, 109, 222, 133, 87, 192, 124, 0, 108, 196, 101, 87, 32, 146, 2, 132, - 94, 183, 0, 0, 146, 0, 2, 94, 2, 240, 17, 77, 3, 191, 222, 2, 240, 0, - 146, 1, 188, 99, 255, 31, 247, 161, 0, 104, 69, 134, 244, 32, 124, 2, - 3, 197, 115, 0, 0, 134, 2, 132, 94, 183, 0, 0, 134, 2, 1, 0, 199, 0, - 0, 146, 0, 107, 68, 101, 87, 64, 146, 0, 32, 227, 254, 20, 96, 146, - 2, 130, 222, 187, 0, 0, 146, 2, 136, 129, 171, 0, 0, 146, 2, 130, 222, - 179, 0, 0, 146, 2, 128, 128, 191, 0, 0, 146, 2, 132, 222, 175, 0, 0, - 146, 2, 130, 94, 187, 0, 0, 146, 3, 160, 222, 2, 240, 0, 142, 2, 0, - 66, 3, 0, 0, 142, 0, 2, 94, 2, 240, 11, 29, 1, 131, 96, 2, 245, 183, - 173, 1, 132, 224, 6, 245, 119, 171, 1, 188, 96, 3, 0, 10, 193, 0, 176, - 68, 103, 0, 10, 194, 1, 128, 96, 2, 13, 144, 108, 3, 89, 94, 2, 240, - 0, 148, 3, 216, 94, 2, 240, 0, 149, 3, 216, 222, 2, 240, 0, 150, 1, - 188, 97, 131, 0, 17, 41, 0, 176, 0, 123, 0, 17, 43, 1, 188, 99, 3, 0, - 17, 35, 3, 18, 94, 2, 240, 10, 150, 3, 151, 94, 2, 240, 11, 46, 2, 1, - 129, 179, 0, 0, 169, 2, 133, 197, 35, 0, 0, 169, 2, 135, 129, 179, 0, - 0, 162, 3, 163, 222, 2, 240, 0, 169, 3, 160, 222, 2, 240, 0, 169, 0, - 2, 94, 2, 240, 11, 29, 1, 135, 224, 4, 13, 128, 108, 0, 224, 68, 100, - 13, 183, 189, 0, 107, 68, 102, 247, 160, 163, 1, 188, 96, 3, 1, 151, - 128, 1, 188, 96, 3, 0, 55, 129, 1, 188, 96, 107, 0, 80, 138, 1, 188, - 96, 3, 6, 55, 146, 3, 191, 222, 2, 240, 2, 218, 3, 208, 94, 2, 240, - 3, 20, 3, 208, 222, 2, 240, 5, 38, 3, 213, 222, 2, 240, 10, 80, 3, 145, - 94, 2, 240, 5, 156, 3, 150, 222, 2, 240, 10, 75, 2, 136, 193, 115, 0, - 0, 202, 3, 196, 94, 2, 240, 7, 22, 3, 199, 94, 2, 240, 7, 60, 3, 220, - 222, 2, 240, 17, 224, 3, 170, 94, 2, 240, 7, 127, 3, 134, 222, 2, 240, - 10, 142, 2, 135, 192, 55, 0, 10, 142, 3, 131, 94, 2, 240, 8, 192, 3, - 145, 222, 2, 240, 6, 30, 3, 194, 222, 2, 240, 10, 243, 0, 2, 94, 2, - 240, 15, 51, 0, 2, 94, 2, 240, 17, 139, 3, 212, 222, 2, 240, 6, 175, - 3, 163, 222, 2, 240, 0, 2, 0, 2, 94, 2, 240, 14, 100, 3, 162, 94, 2, - 240, 0, 199, 3, 86, 94, 2, 240, 0, 196, 1, 134, 96, 6, 9, 16, 72, 3, - 31, 94, 2, 240, 0, 196, 0, 106, 94, 35, 0, 0, 195, 0, 176, 0, 39, 0, - 23, 136, 0, 232, 94, 35, 0, 55, 136, 3, 166, 94, 2, 240, 1, 40, 0, 2, - 94, 2, 240, 14, 251, 0, 40, 96, 14, 8, 225, 73, 3, 196, 222, 2, 240, - 11, 101, 0, 32, 194, 3, 0, 33, 91, 3, 191, 222, 2, 240, 1, 166, 3, 129, - 94, 2, 240, 0, 204, 3, 0, 222, 2, 240, 0, 175, 1, 136, 224, 2, 11, 144, - 92, 3, 191, 222, 2, 240, 3, 17, 2, 135, 64, 99, 0, 0, 206, 2, 130, 193, - 7, 0, 0, 207, 1, 134, 96, 6, 244, 48, 24, 2, 134, 64, 99, 0, 0, 209, - 0, 176, 94, 135, 0, 23, 161, 0, 2, 222, 2, 240, 0, 0, 2, 135, 64, 99, - 0, 0, 212, 0, 176, 94, 139, 0, 16, 25, 1, 134, 224, 6, 244, 48, 24, - 2, 129, 222, 175, 0, 0, 217, 2, 134, 192, 99, 0, 0, 216, 0, 176, 94, - 135, 0, 23, 161, 0, 2, 222, 2, 240, 0, 0, 1, 188, 96, 3, 2, 128, 6, - 2, 128, 222, 7, 0, 0, 229, 1, 218, 96, 2, 240, 23, 128, 2, 8, 94, 7, - 0, 0, 245, 1, 188, 96, 3, 30, 23, 161, 0, 224, 94, 2, 244, 48, 101, - 1, 188, 96, 3, 28, 23, 161, 0, 224, 94, 2, 244, 48, 100, 1, 188, 96, - 3, 0, 40, 23, 3, 191, 222, 2, 240, 0, 251, 1, 16, 94, 3, 0, 23, 161, - 0, 136, 94, 135, 0, 55, 162, 0, 224, 94, 134, 244, 87, 161, 0, 224, - 1, 90, 244, 48, 99, 2, 134, 0, 195, 0, 0, 238, 0, 176, 86, 11, 0, 16, - 98, 0, 176, 84, 3, 0, 16, 98, 1, 188, 96, 3, 0, 40, 23, 3, 191, 222, - 2, 240, 0, 253, 0, 176, 65, 143, 0, 16, 98, 1, 9, 222, 3, 0, 23, 161, - 0, 136, 94, 135, 0, 87, 161, 0, 224, 94, 133, 5, 119, 161, 0, 224, 94, - 135, 3, 192, 6, 1, 188, 96, 3, 0, 72, 23, 3, 191, 222, 2, 240, 0, 253, - 1, 188, 96, 7, 2, 23, 161, 0, 224, 94, 2, 244, 48, 101, 1, 188, 96, - 7, 0, 23, 161, 0, 224, 94, 2, 244, 48, 100, 1, 188, 96, 3, 24, 0, 6, - 1, 188, 96, 3, 0, 8, 23, 0, 176, 90, 3, 0, 16, 98, 0, 176, 88, 3, 0, - 16, 99, 1, 5, 1, 67, 0, 23, 161, 0, 136, 0, 26, 244, 32, 6, 0, 2, 222, - 2, 240, 0, 0, 1, 188, 96, 3, 6, 55, 146, 1, 188, 99, 255, 31, 240, 195, - 1, 188, 96, 3, 24, 144, 227, 1, 188, 99, 255, 31, 240, 197, 1, 188, - 99, 255, 31, 240, 198, 1, 188, 99, 255, 31, 240, 199, 1, 188, 96, 251, - 28, 16, 229, 1, 188, 96, 3, 0, 80, 16, 0, 176, 64, 67, 0, 24, 0, 0, - 176, 64, 71, 0, 16, 231, 1, 188, 99, 255, 31, 240, 196, 0, 2, 222, 2, - 240, 0, 0, 0, 232, 64, 51, 0, 151, 161, 0, 176, 64, 11, 0, 23, 163, - 0, 109, 94, 134, 244, 97, 17, 0, 144, 94, 143, 0, 55, 163, 3, 191, 222, - 2, 240, 1, 18, 0, 144, 94, 135, 0, 55, 163, 1, 188, 96, 31, 20, 23, - 161, 0, 224, 94, 142, 244, 55, 163, 1, 240, 65, 151, 0, 23, 161, 0, - 109, 222, 134, 244, 97, 38, 2, 135, 193, 151, 0, 1, 26, 1, 56, 90, 3, - 0, 23, 161, 1, 60, 90, 3, 0, 23, 162, 3, 191, 222, 2, 240, 1, 28, 1, - 60, 90, 3, 0, 23, 161, 1, 56, 90, 7, 0, 23, 162, 0, 104, 94, 134, 244, - 129, 33, 0, 216, 94, 139, 0, 55, 162, 0, 225, 65, 150, 244, 80, 101, - 0, 225, 193, 151, 0, 48, 101, 3, 191, 222, 2, 240, 1, 20, 0, 216, 94, - 139, 0, 55, 162, 0, 225, 65, 150, 244, 87, 161, 0, 225, 222, 135, 0, - 55, 161, 1, 240, 94, 135, 0, 23, 161, 0, 110, 222, 134, 244, 97, 39, - 1, 188, 99, 255, 31, 247, 164, 0, 2, 222, 2, 240, 0, 0, 0, 32, 227, - 142, 9, 0, 2, 3, 30, 222, 2, 240, 1, 45, 3, 159, 94, 2, 240, 1, 45, - 0, 2, 94, 2, 240, 1, 80, 3, 191, 222, 2, 240, 0, 2, 2, 8, 65, 31, 0, - 1, 43, 1, 129, 96, 5, 97, 203, 14, 0, 2, 94, 2, 240, 11, 29, 0, 176, - 0, 171, 0, 16, 134, 0, 176, 1, 99, 0, 16, 138, 0, 2, 94, 2, 240, 13, - 54, 1, 188, 96, 3, 4, 23, 146, 0, 176, 0, 59, 0, 17, 29, 1, 144, 96, - 6, 9, 16, 72, 3, 161, 222, 2, 240, 1, 67, 1, 129, 224, 6, 9, 16, 72, - 1, 188, 96, 3, 0, 144, 66, 1, 188, 96, 3, 0, 17, 45, 3, 158, 222, 2, - 240, 1, 70, 1, 132, 96, 2, 242, 151, 148, 0, 176, 69, 23, 0, 23, 143, - 0, 176, 94, 23, 0, 23, 144, 2, 0, 68, 31, 0, 1, 65, 1, 133, 96, 2, 9, - 16, 72, 1, 129, 96, 7, 0, 16, 71, 1, 240, 222, 15, 0, 55, 161, 0, 160, - 68, 182, 244, 49, 69, 3, 158, 222, 2, 240, 1, 70, 1, 188, 97, 55, 18, - 176, 128, 3, 191, 222, 2, 240, 0, 2, 0, 160, 68, 180, 42, 49, 69, 1, - 188, 97, 39, 18, 112, 128, 3, 191, 222, 2, 240, 0, 2, 0, 32, 224, 130, - 9, 0, 2, 1, 12, 222, 83, 0, 23, 161, 1, 136, 94, 135, 0, 16, 71, 1, - 188, 96, 3, 0, 80, 66, 1, 8, 65, 31, 0, 23, 161, 1, 140, 222, 134, 242, - 151, 148, 3, 191, 222, 2, 240, 0, 2, 1, 188, 96, 3, 0, 144, 66, 0, 224, - 47, 195, 0, 43, 240, 0, 232, 94, 35, 0, 55, 136, 0, 105, 222, 35, 0, - 1, 85, 0, 232, 0, 39, 0, 55, 136, 1, 134, 96, 2, 9, 16, 72, 1, 133, - 96, 6, 245, 183, 173, 0, 136, 0, 155, 0, 209, 38, 0, 144, 0, 155, 1, - 81, 40, 1, 188, 99, 3, 0, 17, 36, 0, 2, 222, 2, 240, 0, 0, 0, 32, 224, - 126, 9, 0, 2, 0, 2, 94, 2, 240, 15, 5, 2, 131, 194, 31, 0, 0, 2, 2, - 2, 128, 243, 0, 1, 101, 0, 176, 68, 103, 0, 23, 161, 1, 124, 94, 134, - 35, 87, 163, 2, 131, 94, 255, 0, 1, 100, 0, 224, 0, 250, 244, 104, 47, - 1, 131, 96, 6, 247, 247, 191, 0, 107, 222, 141, 5, 225, 105, 2, 6, 208, - 3, 0, 1, 109, 0, 233, 80, 134, 35, 55, 161, 0, 232, 208, 138, 35, 87, - 162, 0, 105, 222, 139, 0, 1, 109, 0, 2, 94, 2, 240, 11, 29, 1, 145, - 96, 22, 132, 244, 39, 0, 224, 32, 191, 0, 136, 47, 3, 191, 222, 2, 240, - 2, 247, 2, 4, 0, 191, 0, 1, 115, 3, 148, 94, 2, 240, 0, 2, 0, 160, 66, - 143, 1, 247, 128, 0, 104, 94, 0, 45, 192, 2, 0, 2, 94, 2, 240, 11, 29, - 3, 191, 222, 2, 240, 0, 19, 2, 1, 194, 143, 0, 0, 2, 1, 20, 0, 99, 0, - 23, 161, 0, 104, 94, 135, 0, 96, 2, 0, 2, 94, 2, 240, 11, 29, 1, 148, - 96, 15, 0, 0, 24, 0, 2, 94, 2, 240, 1, 122, 3, 191, 222, 2, 240, 0, - 19, 1, 20, 0, 99, 0, 23, 161, 0, 176, 94, 135, 0, 16, 165, 1, 188, 96, - 19, 17, 16, 96, 0, 104, 94, 135, 0, 1, 129, 0, 224, 65, 131, 6, 208, - 96, 0, 232, 94, 135, 0, 55, 161, 3, 191, 222, 2, 240, 1, 125, 2, 128, - 80, 195, 0, 1, 139, 1, 135, 96, 4, 3, 16, 160, 0, 176, 0, 99, 0, 16, - 180, 0, 176, 66, 211, 0, 24, 0, 0, 136, 65, 131, 0, 48, 182, 1, 188, - 96, 3, 11, 16, 181, 0, 176, 0, 99, 0, 176, 180, 3, 23, 222, 2, 240, - 1, 136, 3, 151, 222, 2, 240, 1, 137, 1, 128, 96, 6, 134, 20, 48, 0, - 2, 222, 2, 240, 0, 0, 0, 32, 224, 18, 128, 65, 165, 1, 135, 96, 4, 3, - 16, 160, 0, 176, 0, 99, 0, 16, 180, 1, 188, 96, 3, 14, 16, 181, 0, 176, - 0, 99, 0, 240, 180, 1, 188, 96, 87, 4, 144, 182, 0, 176, 0, 99, 0, 16, - 180, 1, 188, 96, 3, 2, 208, 181, 2, 7, 80, 11, 0, 1, 162, 1, 188, 96, - 3, 3, 208, 181, 1, 142, 96, 2, 242, 151, 148, 2, 4, 80, 11, 0, 1, 155, - 2, 4, 208, 11, 0, 1, 155, 1, 134, 96, 6, 242, 151, 148, 0, 224, 66, - 215, 0, 208, 181, 0, 160, 80, 11, 17, 23, 161, 0, 104, 222, 135, 17, - 1, 161, 1, 134, 224, 6, 242, 151, 148, 0, 224, 66, 215, 0, 80, 181, - 2, 7, 208, 11, 0, 1, 161, 0, 224, 66, 215, 0, 144, 181, 0, 176, 66, - 215, 0, 17, 225, 0, 176, 0, 99, 0, 176, 180, 3, 23, 222, 2, 240, 1, - 163, 3, 151, 222, 2, 240, 1, 164, 0, 2, 222, 2, 240, 0, 0, 0, 104, 32, - 219, 0, 1, 169, 0, 108, 196, 101, 6, 192, 19, 1, 188, 96, 3, 0, 8, 54, - 0, 104, 32, 211, 0, 1, 172, 0, 108, 196, 101, 6, 160, 19, 1, 188, 96, - 3, 0, 8, 52, 0, 32, 224, 190, 9, 0, 2, 3, 144, 94, 2, 240, 0, 19, 3, - 162, 94, 2, 240, 1, 231, 2, 2, 0, 191, 0, 1, 177, 2, 3, 197, 115, 0, - 1, 218, 0, 104, 47, 99, 0, 1, 181, 0, 232, 68, 101, 123, 23, 161, 0, - 109, 94, 133, 122, 225, 218, 1, 188, 96, 3, 0, 11, 216, 0, 104, 45, - 147, 0, 1, 218, 2, 130, 193, 7, 0, 1, 218, 2, 128, 66, 3, 0, 1, 218, - 2, 133, 197, 35, 0, 1, 218, 2, 134, 64, 55, 0, 1, 218, 1, 129, 224, - 6, 245, 119, 171, 0, 176, 45, 151, 0, 23, 161, 1, 188, 96, 47, 16, 55, - 162, 1, 188, 96, 3, 0, 23, 163, 0, 2, 94, 2, 240, 19, 23, 0, 176, 45, - 155, 0, 23, 161, 1, 188, 96, 47, 23, 55, 162, 1, 188, 96, 3, 0, 23, - 163, 0, 2, 94, 2, 240, 19, 37, 1, 188, 96, 19, 26, 23, 161, 0, 2, 94, - 2, 240, 0, 206, 0, 176, 64, 103, 4, 23, 162, 0, 2, 94, 2, 240, 0, 212, - 0, 224, 68, 103, 0, 215, 161, 0, 108, 196, 102, 244, 33, 200, 1, 188, - 96, 19, 14, 215, 161, 0, 2, 94, 2, 240, 0, 206, 0, 160, 64, 103, 63, - 247, 162, 1, 188, 96, 19, 20, 215, 161, 1, 188, 98, 3, 0, 23, 163, 0, - 176, 94, 138, 244, 119, 162, 0, 2, 94, 2, 240, 0, 212, 0, 176, 45, 151, - 0, 23, 161, 1, 188, 96, 47, 12, 247, 162, 1, 188, 96, 3, 0, 23, 163, - 0, 2, 94, 2, 240, 19, 23, 0, 176, 45, 155, 0, 23, 161, 1, 188, 96, 47, - 19, 119, 162, 1, 188, 96, 3, 0, 23, 163, 0, 2, 94, 2, 240, 19, 37, 1, - 129, 224, 2, 245, 119, 171, 1, 188, 96, 3, 0, 11, 100, 0, 2, 94, 2, - 240, 14, 20, 2, 2, 0, 191, 0, 1, 230, 2, 132, 222, 175, 0, 1, 225, 2, - 3, 94, 183, 0, 1, 230, 0, 2, 94, 2, 240, 16, 254, 2, 3, 94, 183, 0, - 1, 230, 3, 191, 222, 2, 240, 0, 2, 2, 3, 94, 183, 0, 1, 228, 2, 4, 128, - 199, 0, 1, 230, 2, 128, 94, 255, 0, 1, 230, 0, 2, 94, 2, 240, 16, 190, - 3, 191, 222, 2, 240, 0, 2, 0, 2, 94, 2, 240, 15, 5, 2, 0, 66, 31, 0, - 1, 254, 0, 104, 66, 243, 0, 1, 234, 0, 109, 66, 243, 0, 65, 254, 1, - 20, 0, 99, 0, 23, 161, 0, 176, 94, 135, 0, 23, 162, 3, 162, 94, 2, 240, - 1, 243, 1, 131, 224, 2, 13, 144, 108, 3, 20, 94, 2, 240, 2, 0, 0, 110, - 196, 86, 128, 98, 0, 2, 129, 69, 35, 0, 2, 0, 0, 110, 94, 135, 0, 97, - 254, 1, 188, 96, 3, 0, 119, 162, 0, 136, 96, 6, 244, 87, 163, 0, 136, - 94, 139, 1, 0, 24, 0, 232, 94, 139, 0, 55, 162, 0, 32, 194, 142, 244, - 97, 249, 0, 106, 222, 134, 244, 65, 243, 3, 191, 222, 2, 240, 1, 254, - 0, 144, 0, 99, 1, 1, 101, 0, 128, 133, 151, 2, 23, 161, 0, 224, 100, - 130, 13, 161, 102, 0, 2, 94, 2, 240, 14, 188, 3, 191, 222, 2, 240, 2, - 42, 1, 130, 96, 2, 9, 16, 72, 3, 191, 222, 2, 240, 0, 2, 1, 188, 96, - 3, 0, 17, 21, 0, 176, 1, 127, 0, 23, 166, 3, 31, 94, 2, 240, 2, 15, - 2, 3, 0, 195, 0, 2, 5, 0, 32, 194, 143, 2, 2, 9, 3, 37, 94, 2, 240, - 2, 15, 0, 32, 194, 143, 2, 2, 9, 0, 104, 129, 83, 255, 224, 19, 3, 191, - 222, 2, 240, 2, 11, 1, 148, 96, 19, 0, 0, 24, 3, 191, 222, 2, 240, 2, - 42, 3, 158, 222, 2, 240, 2, 14, 0, 104, 222, 152, 11, 194, 14, 2, 1, - 65, 31, 0, 12, 129, 1, 133, 96, 2, 9, 16, 72, 0, 104, 94, 152, 11, 194, - 19, 0, 105, 94, 159, 0, 98, 47, 2, 152, 66, 143, 0, 2, 19, 3, 191, 222, - 2, 240, 2, 47, 2, 1, 65, 31, 0, 12, 129, 2, 4, 0, 191, 0, 2, 26, 2, - 24, 66, 143, 0, 12, 129, 0, 2, 94, 2, 240, 14, 158, 0, 2, 94, 2, 240, - 14, 188, 1, 148, 5, 135, 0, 0, 24, 3, 191, 222, 2, 240, 2, 42, 2, 0, - 19, 187, 0, 2, 35, 2, 0, 21, 107, 0, 2, 38, 0, 176, 19, 71, 0, 23, 161, - 0, 104, 222, 132, 167, 162, 35, 0, 176, 19, 75, 0, 23, 161, 0, 104, - 222, 132, 167, 194, 35, 0, 176, 19, 79, 0, 23, 161, 0, 104, 222, 132, - 167, 226, 35, 2, 158, 19, 151, 0, 2, 38, 2, 1, 194, 143, 0, 2, 40, 1, - 148, 96, 15, 0, 0, 24, 3, 191, 222, 2, 240, 2, 42, 2, 1, 194, 143, 0, - 2, 40, 1, 128, 96, 6, 13, 144, 108, 2, 0, 194, 143, 0, 12, 129, 1, 148, - 96, 7, 0, 0, 24, 0, 2, 94, 2, 240, 1, 122, 2, 4, 0, 191, 0, 2, 95, 2, - 133, 0, 99, 0, 2, 95, 1, 131, 224, 6, 13, 144, 108, 3, 191, 222, 2, - 240, 2, 95, 1, 188, 96, 3, 24, 16, 96, 1, 41, 80, 11, 0, 23, 146, 0, - 176, 1, 123, 0, 16, 101, 0, 104, 0, 235, 0, 2, 56, 0, 136, 90, 19, 1, - 23, 161, 0, 232, 68, 102, 244, 55, 161, 0, 110, 222, 132, 7, 66, 56, - 0, 224, 2, 155, 0, 32, 166, 3, 191, 222, 2, 240, 6, 168, 1, 144, 96, - 18, 9, 16, 72, 1, 148, 96, 31, 0, 0, 24, 1, 8, 90, 15, 0, 23, 129, 1, - 136, 94, 6, 129, 84, 10, 1, 52, 90, 15, 0, 23, 128, 0, 2, 94, 2, 240, - 0, 219, 0, 176, 1, 123, 0, 16, 101, 0, 176, 86, 35, 0, 23, 161, 0, 224, - 94, 134, 160, 151, 161, 0, 232, 94, 132, 0, 244, 3, 0, 232, 94, 132, - 0, 244, 22, 0, 176, 90, 3, 0, 20, 19, 0, 176, 90, 7, 0, 20, 20, 0, 176, - 90, 11, 0, 20, 21, 0, 104, 222, 7, 0, 66, 80, 0, 232, 0, 151, 0, 87, - 161, 1, 188, 94, 134, 240, 20, 27, 1, 124, 94, 135, 0, 244, 28, 0, 176, - 32, 95, 0, 23, 129, 0, 2, 94, 2, 240, 13, 58, 0, 176, 1, 123, 0, 16, - 101, 1, 8, 90, 15, 0, 23, 129, 0, 176, 94, 135, 0, 20, 30, 3, 191, 222, - 2, 240, 2, 83, 0, 176, 86, 23, 0, 20, 27, 0, 176, 86, 27, 0, 20, 28, - 0, 176, 84, 19, 0, 20, 30, 0, 176, 80, 19, 0, 16, 134, 0, 109, 0, 167, - 0, 130, 89, 1, 144, 1, 99, 0, 16, 138, 0, 176, 65, 143, 0, 16, 98, 0, - 2, 94, 2, 240, 17, 173, 0, 176, 66, 43, 0, 20, 6, 1, 188, 96, 3, 24, - 23, 161, 0, 109, 193, 140, 32, 2, 92, 1, 188, 96, 3, 2, 151, 161, 0, - 224, 94, 132, 3, 119, 161, 0, 224, 94, 134, 176, 17, 29, 3, 191, 222, - 2, 240, 2, 212, 2, 3, 0, 199, 0, 2, 111, 2, 12, 208, 3, 0, 2, 111, 1, - 20, 0, 99, 0, 23, 161, 2, 133, 0, 99, 0, 2, 111, 0, 128, 222, 135, 1, - 247, 162, 1, 188, 96, 27, 2, 87, 162, 0, 224, 94, 138, 13, 176, 101, - 0, 176, 65, 151, 0, 20, 50, 0, 128, 222, 135, 0, 183, 162, 1, 188, 96, - 23, 31, 215, 162, 0, 224, 94, 138, 13, 176, 100, 0, 176, 65, 147, 0, - 20, 51, 0, 104, 216, 19, 0, 2, 121, 2, 0, 90, 27, 0, 2, 113, 1, 128, - 96, 6, 132, 244, 39, 3, 191, 222, 2, 240, 5, 200, 2, 1, 208, 3, 0, 2, - 113, 0, 176, 80, 155, 0, 20, 47, 2, 129, 208, 199, 0, 2, 244, 1, 11, - 208, 3, 0, 23, 161, 1, 60, 80, 43, 0, 23, 162, 1, 140, 94, 134, 244, - 87, 161, 1, 72, 1, 67, 0, 23, 162, 0, 104, 94, 134, 244, 66, 121, 1, - 145, 96, 18, 132, 244, 39, 3, 191, 222, 2, 240, 2, 247, 0, 2, 94, 2, - 240, 1, 140, 0, 176, 80, 19, 0, 16, 134, 0, 176, 80, 23, 0, 16, 138, - 0, 104, 47, 191, 0, 2, 132, 2, 145, 208, 23, 0, 2, 130, 2, 145, 208, - 27, 0, 2, 130, 2, 145, 208, 31, 0, 2, 130, 2, 145, 208, 35, 0, 2, 130, - 3, 191, 222, 2, 240, 2, 132, 1, 145, 96, 2, 132, 244, 39, 3, 191, 222, - 2, 240, 2, 247, 3, 162, 94, 2, 240, 2, 179, 2, 12, 208, 3, 0, 2, 160, - 2, 3, 0, 199, 0, 2, 159, 0, 176, 80, 203, 0, 16, 101, 0, 2, 94, 2, 240, - 18, 70, 2, 3, 80, 199, 0, 2, 141, 1, 188, 96, 35, 0, 151, 161, 0, 168, - 80, 2, 244, 52, 0, 3, 191, 222, 2, 240, 2, 164, 2, 4, 129, 171, 0, 2, - 143, 0, 109, 66, 70, 192, 128, 19, 0, 176, 90, 19, 0, 23, 128, 0, 2, - 94, 2, 240, 0, 229, 0, 176, 84, 15, 0, 20, 30, 0, 176, 90, 7, 0, 23, - 161, 0, 176, 90, 19, 0, 23, 128, 1, 135, 90, 22, 240, 23, 128, 0, 176, - 65, 143, 0, 16, 101, 0, 2, 94, 2, 240, 17, 182, 0, 224, 94, 134, 160, - 116, 3, 2, 135, 94, 3, 0, 2, 158, 1, 9, 222, 3, 0, 23, 163, 0, 224, - 94, 139, 0, 119, 162, 0, 224, 94, 138, 244, 119, 162, 0, 136, 94, 139, - 0, 55, 161, 0, 224, 94, 134, 244, 80, 137, 3, 191, 222, 2, 240, 2, 164, - 0, 109, 66, 74, 132, 128, 19, 1, 6, 80, 7, 0, 23, 161, 2, 140, 208, - 3, 0, 2, 163, 0, 104, 94, 135, 0, 2, 164, 1, 130, 222, 134, 134, 52, - 49, 1, 130, 96, 2, 134, 52, 49, 0, 32, 208, 3, 4, 2, 170, 0, 176, 80, - 79, 0, 17, 242, 0, 176, 80, 83, 0, 17, 243, 0, 176, 80, 87, 0, 17, 244, - 1, 188, 96, 3, 0, 145, 240, 2, 1, 1, 179, 0, 2, 172, 1, 135, 224, 6, - 245, 119, 171, 3, 148, 94, 2, 240, 2, 179, 2, 6, 80, 3, 0, 2, 175, 2, - 135, 222, 175, 0, 2, 179, 2, 129, 80, 3, 0, 5, 7, 2, 2, 208, 199, 0, - 2, 178, 2, 8, 80, 43, 0, 2, 179, 2, 133, 208, 3, 0, 5, 30, 1, 144, 96, - 18, 134, 52, 49, 3, 162, 94, 2, 240, 2, 192, 0, 176, 80, 15, 0, 17, - 22, 2, 2, 208, 199, 0, 2, 184, 0, 176, 80, 91, 0, 17, 22, 2, 130, 208, - 3, 0, 2, 192, 2, 129, 71, 195, 0, 2, 185, 2, 128, 80, 79, 0, 2, 190, - 0, 32, 71, 199, 63, 130, 192, 0, 32, 199, 219, 0, 194, 246, 3, 191, - 222, 2, 240, 2, 192, 3, 165, 94, 2, 240, 2, 192, 2, 128, 199, 223, 0, - 2, 246, 2, 136, 80, 199, 0, 2, 218, 1, 41, 80, 11, 0, 23, 146, 2, 3, - 0, 199, 0, 2, 205, 2, 12, 208, 3, 0, 2, 205, 2, 131, 80, 199, 0, 2, - 205, 0, 176, 80, 203, 0, 16, 101, 1, 56, 90, 19, 0, 23, 128, 1, 130, - 90, 23, 0, 87, 129, 1, 14, 90, 19, 0, 23, 161, 1, 142, 94, 134, 240, - 55, 129, 2, 2, 208, 199, 0, 2, 218, 0, 176, 80, 27, 0, 16, 138, 3, 191, - 222, 2, 240, 2, 218, 2, 130, 208, 199, 0, 2, 212, 1, 56, 80, 39, 0, - 23, 128, 1, 8, 80, 19, 0, 23, 129, 1, 2, 80, 19, 0, 23, 161, 1, 130, - 94, 134, 240, 55, 129, 0, 176, 80, 127, 0, 16, 137, 3, 191, 222, 2, - 240, 2, 218, 1, 56, 80, 111, 0, 23, 128, 1, 8, 80, 43, 0, 23, 129, 1, - 6, 208, 7, 0, 23, 161, 1, 130, 94, 134, 240, 55, 129, 0, 176, 80, 27, - 0, 16, 138, 0, 176, 80, 131, 0, 16, 137, 0, 2, 94, 2, 240, 0, 219, 0, - 2, 94, 2, 240, 13, 45, 1, 2, 66, 27, 0, 23, 129, 1, 130, 94, 5, 2, 247, - 129, 0, 2, 94, 2, 240, 13, 58, 0, 224, 94, 132, 1, 23, 161, 1, 217, - 222, 135, 0, 16, 131, 2, 0, 1, 179, 0, 2, 227, 1, 224, 1, 183, 0, 16, - 131, 1, 188, 97, 55, 3, 183, 145, 0, 104, 94, 75, 2, 130, 250, 2, 4, - 0, 191, 0, 2, 232, 2, 135, 80, 3, 0, 2, 232, 3, 148, 94, 2, 240, 2, - 233, 3, 34, 94, 2, 240, 2, 235, 1, 188, 97, 3, 0, 48, 128, 3, 191, 222, - 2, 240, 0, 2, 1, 188, 97, 51, 3, 183, 145, 3, 43, 222, 2, 240, 2, 241, - 0, 144, 0, 99, 0, 151, 161, 0, 224, 100, 130, 244, 48, 101, 0, 110, - 90, 19, 0, 34, 241, 1, 136, 224, 6, 242, 55, 145, 0, 104, 222, 75, 4, - 130, 243, 1, 188, 97, 187, 3, 183, 145, 3, 191, 222, 2, 240, 2, 250, - 1, 145, 96, 14, 132, 244, 39, 3, 191, 222, 2, 240, 2, 247, 1, 145, 96, - 6, 132, 244, 39, 1, 188, 96, 3, 0, 16, 180, 1, 129, 224, 6, 134, 52, - 49, 3, 191, 222, 2, 240, 5, 200, 3, 196, 222, 2, 240, 11, 101, 2, 6, - 80, 3, 0, 3, 2, 2, 7, 222, 175, 0, 3, 2, 1, 188, 97, 3, 0, 55, 145, - 2, 7, 80, 3, 0, 3, 0, 1, 188, 98, 3, 0, 247, 145, 0, 224, 1, 11, 0, - 32, 66, 3, 191, 222, 2, 240, 3, 3, 1, 188, 96, 3, 0, 32, 66, 0, 176, - 94, 71, 0, 16, 128, 2, 0, 1, 179, 0, 3, 9, 1, 130, 96, 6, 16, 48, 129, - 2, 1, 129, 179, 0, 3, 9, 1, 188, 96, 3, 5, 183, 147, 3, 191, 222, 2, - 240, 6, 218, 2, 4, 0, 191, 0, 3, 16, 0, 176, 5, 139, 0, 16, 100, 0, - 110, 69, 23, 0, 0, 2, 0, 104, 222, 75, 2, 131, 15, 0, 160, 68, 180, - 42, 49, 69, 3, 191, 222, 2, 240, 0, 2, 0, 2, 94, 2, 240, 13, 71, 0, - 104, 197, 23, 0, 0, 2, 3, 208, 94, 2, 240, 3, 20, 0, 2, 94, 2, 240, - 13, 71, 3, 191, 222, 2, 240, 0, 2, 1, 131, 96, 2, 247, 247, 191, 1, - 188, 96, 3, 0, 144, 4, 0, 168, 65, 35, 48, 16, 72, 1, 188, 98, 15, 0, - 17, 224, 1, 129, 96, 2, 245, 215, 174, 2, 2, 0, 191, 0, 3, 40, 0, 104, - 222, 75, 2, 3, 28, 0, 2, 94, 2, 240, 19, 17, 0, 104, 222, 75, 6, 35, - 40, 2, 4, 94, 179, 0, 3, 40, 2, 0, 69, 111, 0, 3, 40, 0, 232, 68, 101, - 86, 247, 161, 0, 232, 42, 174, 244, 55, 161, 0, 105, 94, 135, 8, 35, - 40, 1, 131, 224, 2, 43, 145, 92, 2, 7, 1, 171, 0, 3, 37, 1, 128, 224, - 2, 9, 208, 78, 1, 188, 96, 3, 24, 81, 120, 0, 176, 69, 227, 0, 24, 0, - 1, 128, 96, 2, 47, 49, 121, 1, 135, 224, 2, 245, 119, 171, 0, 104, 129, - 11, 0, 35, 43, 0, 176, 68, 103, 0, 0, 67, 1, 130, 224, 6, 9, 16, 72, - 1, 129, 96, 2, 13, 144, 108, 1, 130, 96, 6, 40, 145, 68, 1, 136, 224, - 2, 11, 144, 92, 0, 2, 94, 2, 240, 15, 51, 1, 133, 224, 2, 247, 247, - 191, 2, 136, 66, 27, 0, 3, 51, 1, 133, 224, 6, 247, 247, 191, 3, 91, - 94, 2, 240, 3, 53, 1, 188, 96, 19, 0, 16, 67, 1, 188, 96, 3, 0, 16, - 133, 1, 188, 96, 3, 0, 16, 184, 0, 136, 80, 119, 0, 144, 185, 2, 8, - 80, 43, 0, 3, 60, 1, 56, 80, 115, 0, 23, 161, 1, 124, 80, 110, 244, - 55, 161, 0, 136, 94, 135, 0, 144, 185, 2, 0, 71, 163, 0, 3, 64, 1, 188, - 96, 3, 0, 17, 234, 0, 144, 66, 231, 0, 145, 235, 0, 176, 71, 163, 0, - 209, 232, 2, 0, 71, 179, 0, 3, 66, 1, 176, 224, 142, 61, 145, 236, 1, - 210, 224, 2, 16, 144, 132, 3, 169, 94, 2, 240, 4, 49, 1, 188, 96, 3, - 0, 16, 132, 0, 224, 1, 195, 0, 32, 112, 2, 129, 129, 179, 0, 3, 120, - 3, 32, 222, 2, 240, 3, 148, 1, 129, 96, 6, 245, 183, 173, 0, 104, 222, - 75, 4, 163, 91, 2, 3, 222, 187, 0, 3, 77, 0, 224, 44, 143, 0, 16, 101, - 3, 191, 222, 2, 240, 3, 78, 1, 188, 96, 35, 1, 208, 101, 0, 160, 94, - 127, 254, 16, 236, 0, 176, 90, 3, 0, 16, 237, 0, 176, 90, 7, 0, 16, - 238, 0, 176, 90, 11, 0, 16, 239, 0, 176, 90, 15, 0, 16, 240, 1, 188, - 99, 255, 30, 240, 132, 1, 188, 96, 3, 0, 48, 133, 1, 188, 96, 3, 0, - 16, 180, 1, 188, 96, 3, 1, 208, 166, 1, 188, 96, 3, 4, 80, 181, 1, 188, - 96, 35, 4, 208, 180, 0, 224, 2, 175, 0, 32, 171, 3, 191, 222, 2, 240, - 3, 220, 0, 104, 222, 75, 5, 35, 97, 1, 188, 96, 3, 0, 16, 180, 1, 188, - 96, 7, 21, 208, 166, 1, 188, 96, 3, 2, 208, 181, 1, 188, 96, 35, 4, - 208, 180, 3, 191, 222, 2, 240, 3, 107, 0, 104, 222, 75, 2, 67, 120, - 2, 133, 195, 143, 0, 3, 100, 0, 224, 94, 39, 0, 55, 137, 1, 218, 94, - 39, 0, 16, 238, 1, 188, 99, 255, 31, 240, 206, 1, 188, 96, 3, 0, 16, - 180, 1, 188, 96, 3, 0, 208, 166, 1, 188, 96, 3, 3, 208, 181, 1, 188, - 96, 35, 4, 208, 180, 0, 224, 1, 211, 0, 32, 116, 1, 188, 97, 255, 31, - 240, 132, 1, 188, 96, 3, 0, 16, 133, 1, 132, 96, 7, 0, 17, 224, 2, 130, - 222, 179, 0, 4, 238, 2, 4, 94, 179, 0, 4, 238, 1, 131, 224, 6, 9, 16, - 72, 0, 176, 65, 35, 0, 24, 0, 1, 188, 96, 3, 6, 183, 142, 1, 129, 224, - 6, 245, 215, 174, 0, 176, 84, 19, 0, 23, 161, 0, 224, 94, 132, 1, 23, - 161, 0, 136, 94, 135, 0, 112, 131, 3, 191, 222, 2, 240, 4, 238, 1, 188, - 96, 3, 31, 240, 132, 1, 3, 222, 83, 0, 23, 162, 2, 0, 94, 255, 0, 3, - 124, 1, 188, 96, 3, 0, 55, 162, 0, 104, 43, 103, 0, 3, 126, 1, 188, - 96, 3, 0, 55, 162, 1, 134, 94, 138, 28, 112, 227, 0, 106, 195, 147, - 0, 3, 136, 0, 232, 67, 144, 0, 208, 228, 2, 2, 66, 27, 0, 3, 134, 0, - 144, 0, 27, 0, 55, 161, 0, 32, 66, 27, 0, 67, 133, 0, 176, 32, 175, - 0, 23, 161, 0, 224, 67, 146, 244, 48, 228, 0, 105, 195, 147, 0, 3, 136, - 1, 188, 96, 3, 0, 16, 228, 0, 104, 43, 103, 0, 3, 138, 0, 224, 67, 145, - 91, 240, 228, 1, 188, 96, 3, 0, 16, 180, 1, 188, 96, 3, 0, 16, 166, - 1, 188, 96, 3, 2, 16, 181, 1, 188, 96, 35, 4, 208, 180, 0, 104, 94, - 75, 6, 163, 146, 0, 224, 1, 203, 0, 32, 114, 1, 188, 96, 3, 0, 8, 55, - 3, 191, 222, 2, 240, 3, 220, 0, 224, 1, 207, 0, 32, 115, 3, 191, 222, - 2, 240, 3, 220, 3, 32, 94, 2, 240, 3, 227, 1, 129, 224, 2, 9, 16, 72, - 0, 224, 1, 215, 0, 32, 117, 3, 30, 222, 2, 240, 3, 195, 1, 188, 96, - 3, 0, 23, 162, 0, 106, 94, 35, 0, 3, 156, 1, 2, 66, 143, 0, 23, 162, - 1, 133, 94, 138, 9, 16, 72, 1, 128, 224, 6, 16, 48, 129, 2, 132, 222, - 83, 0, 3, 163, 0, 176, 0, 119, 0, 23, 161, 0, 224, 94, 132, 4, 55, 161, - 0, 136, 94, 135, 0, 87, 161, 0, 224, 94, 135, 13, 87, 161, 3, 191, 222, - 2, 240, 3, 164, 1, 188, 96, 3, 13, 87, 161, 0, 104, 0, 39, 0, 3, 195, - 0, 224, 94, 132, 1, 247, 161, 1, 188, 96, 35, 1, 80, 101, 0, 136, 65, - 151, 0, 48, 182, 1, 188, 96, 3, 0, 16, 180, 0, 144, 94, 135, 0, 80, - 166, 1, 188, 96, 3, 1, 16, 181, 1, 188, 96, 35, 0, 176, 180, 3, 23, - 222, 2, 240, 3, 172, 3, 151, 222, 2, 240, 3, 173, 0, 32, 222, 135, 0, - 67, 182, 0, 32, 222, 135, 0, 35, 179, 1, 184, 94, 34, 208, 22, 128, - 1, 128, 94, 138, 208, 54, 129, 3, 191, 222, 2, 240, 3, 188, 1, 188, - 94, 34, 208, 22, 128, 1, 132, 94, 138, 208, 54, 129, 3, 191, 222, 2, - 240, 3, 188, 0, 32, 222, 135, 0, 35, 186, 1, 184, 94, 34, 208, 54, 129, - 1, 128, 94, 138, 208, 86, 130, 3, 191, 222, 2, 240, 3, 188, 1, 188, - 94, 34, 208, 54, 129, 1, 132, 94, 138, 208, 86, 130, 1, 136, 96, 2, - 244, 48, 168, 0, 176, 90, 3, 0, 16, 176, 0, 176, 90, 7, 0, 16, 177, - 2, 128, 66, 163, 0, 3, 191, 0, 224, 66, 163, 0, 144, 168, 0, 176, 90, - 11, 0, 16, 176, 0, 176, 90, 15, 0, 16, 177, 1, 135, 96, 6, 16, 144, - 132, 0, 224, 94, 39, 0, 55, 137, 1, 218, 94, 39, 0, 16, 238, 1, 188, - 96, 3, 0, 16, 180, 1, 188, 96, 3, 3, 80, 166, 0, 176, 0, 51, 0, 16, - 181, 2, 132, 222, 83, 0, 3, 205, 0, 224, 96, 104, 3, 176, 166, 0, 224, - 66, 152, 4, 48, 166, 0, 176, 0, 55, 0, 16, 181, 1, 188, 96, 35, 4, 208, - 180, 1, 132, 96, 6, 242, 151, 148, 1, 134, 96, 2, 9, 16, 72, 3, 158, - 222, 2, 240, 3, 215, 2, 128, 68, 31, 0, 3, 218, 0, 176, 94, 63, 0, 17, - 69, 1, 188, 96, 3, 0, 23, 143, 0, 176, 94, 67, 0, 23, 133, 0, 176, 94, - 15, 0, 23, 144, 3, 191, 222, 2, 240, 3, 218, 0, 176, 94, 15, 0, 23, - 133, 2, 128, 68, 31, 0, 3, 218, 0, 160, 68, 182, 240, 177, 69, 1, 188, - 96, 3, 1, 16, 66, 1, 131, 96, 6, 242, 151, 148, 1, 132, 96, 7, 0, 17, - 224, 3, 160, 94, 2, 240, 4, 236, 2, 6, 94, 175, 0, 4, 238, 1, 134, 224, - 6, 245, 119, 171, 1, 188, 96, 3, 0, 16, 128, 0, 2, 94, 2, 240, 11, 35, - 3, 191, 222, 2, 240, 6, 30, 3, 161, 94, 2, 240, 4, 88, 1, 20, 0, 99, - 0, 23, 161, 0, 104, 222, 135, 0, 227, 232, 1, 129, 96, 6, 9, 16, 72, - 3, 191, 222, 2, 240, 4, 88, 1, 129, 96, 6, 245, 215, 174, 0, 32, 96, - 14, 134, 36, 16, 1, 135, 96, 4, 3, 16, 160, 0, 176, 0, 99, 0, 16, 180, - 1, 188, 96, 3, 11, 16, 181, 0, 176, 0, 99, 0, 240, 180, 2, 3, 0, 199, - 0, 3, 251, 2, 12, 208, 3, 0, 3, 251, 2, 128, 80, 199, 0, 3, 243, 0, - 176, 84, 19, 0, 23, 161, 0, 224, 94, 134, 128, 116, 26, 0, 176, 80, - 107, 0, 16, 228, 0, 176, 66, 19, 2, 16, 132, 2, 9, 80, 43, 0, 3, 251, - 0, 176, 66, 19, 0, 48, 132, 1, 210, 224, 58, 160, 48, 224, 2, 128, 80, - 199, 0, 4, 1, 1, 210, 224, 82, 160, 48, 224, 3, 191, 222, 2, 240, 4, - 1, 2, 2, 208, 199, 0, 4, 1, 0, 176, 80, 95, 0, 16, 224, 0, 176, 80, - 99, 0, 16, 225, 0, 176, 80, 103, 0, 16, 226, 0, 176, 80, 107, 0, 16, - 228, 0, 176, 66, 19, 2, 240, 132, 2, 0, 80, 199, 0, 4, 11, 1, 138, 224, - 14, 16, 144, 132, 1, 188, 96, 251, 28, 16, 229, 1, 188, 96, 3, 8, 144, - 230, 0, 176, 0, 99, 0, 16, 180, 1, 188, 96, 3, 2, 16, 181, 0, 176, 0, - 99, 4, 208, 180, 1, 132, 96, 7, 0, 17, 224, 1, 188, 96, 3, 0, 23, 142, - 3, 191, 222, 2, 240, 4, 240, 0, 224, 1, 199, 0, 32, 113, 0, 176, 0, - 99, 0, 16, 180, 1, 188, 96, 3, 2, 208, 181, 0, 176, 0, 99, 4, 208, 180, - 3, 191, 222, 2, 240, 4, 136, 1, 133, 96, 6, 247, 247, 191, 1, 3, 80, - 3, 0, 23, 161, 0, 184, 94, 135, 0, 55, 161, 1, 135, 94, 134, 16, 16, - 128, 2, 12, 208, 3, 0, 4, 87, 2, 3, 0, 199, 0, 4, 39, 0, 176, 80, 203, - 0, 16, 101, 1, 188, 96, 3, 0, 22, 133, 0, 224, 90, 51, 0, 54, 140, 2, - 3, 80, 199, 0, 4, 28, 0, 224, 90, 39, 0, 54, 137, 3, 191, 222, 2, 240, - 4, 88, 1, 188, 96, 3, 0, 23, 178, 0, 176, 90, 11, 0, 11, 36, 1, 56, - 90, 19, 0, 23, 161, 1, 188, 90, 6, 244, 48, 224, 1, 60, 90, 19, 0, 23, - 161, 1, 124, 90, 6, 244, 48, 225, 1, 129, 224, 6, 16, 144, 132, 1, 133, - 224, 7, 0, 16, 227, 1, 133, 224, 7, 0, 16, 195, 2, 130, 208, 199, 0, - 4, 44, 3, 191, 222, 2, 240, 4, 47, 2, 2, 208, 199, 0, 4, 49, 0, 176, - 42, 75, 0, 23, 161, 1, 184, 80, 110, 244, 48, 224, 0, 176, 80, 115, - 0, 23, 161, 1, 184, 42, 78, 244, 48, 225, 2, 130, 66, 19, 0, 4, 47, - 0, 176, 80, 123, 0, 16, 228, 0, 176, 66, 19, 2, 16, 132, 1, 133, 224, - 6, 28, 48, 225, 0, 176, 66, 19, 0, 112, 132, 1, 135, 96, 4, 3, 16, 160, - 2, 3, 0, 199, 0, 4, 70, 0, 176, 80, 203, 0, 16, 101, 0, 109, 94, 202, - 209, 196, 55, 1, 133, 224, 2, 24, 112, 195, 0, 224, 94, 203, 0, 54, - 142, 1, 188, 96, 27, 9, 208, 101, 0, 224, 65, 150, 246, 80, 101, 0, - 176, 80, 151, 0, 22, 128, 0, 104, 222, 203, 0, 4, 62, 1, 188, 96, 35, - 1, 80, 184, 0, 104, 44, 147, 0, 36, 68, 3, 191, 222, 2, 240, 4, 80, - 0, 176, 94, 203, 0, 16, 181, 0, 176, 0, 99, 8, 112, 180, 2, 131, 66, - 211, 0, 4, 64, 1, 188, 96, 3, 1, 112, 184, 0, 104, 172, 147, 0, 36, - 80, 1, 188, 96, 3, 1, 112, 184, 2, 188, 80, 103, 0, 4, 79, 3, 191, 222, - 2, 240, 4, 78, 1, 12, 208, 3, 0, 23, 161, 3, 169, 94, 2, 240, 4, 75, - 1, 188, 96, 35, 1, 80, 184, 0, 104, 94, 135, 0, 100, 78, 3, 191, 222, - 2, 240, 4, 80, 1, 188, 96, 3, 1, 112, 184, 0, 104, 94, 135, 0, 68, 80, - 1, 188, 96, 3, 1, 112, 184, 1, 129, 224, 2, 23, 16, 184, 1, 188, 96, - 3, 0, 240, 165, 1, 188, 96, 3, 14, 16, 181, 0, 176, 0, 99, 0, 16, 180, - 0, 176, 0, 99, 0, 240, 180, 0, 176, 66, 211, 0, 24, 0, 1, 136, 96, 8, - 3, 16, 180, 1, 129, 96, 6, 13, 144, 108, 3, 191, 222, 2, 240, 4, 136, - 2, 2, 208, 199, 0, 4, 94, 0, 176, 80, 111, 0, 16, 224, 0, 176, 80, 115, - 0, 16, 225, 0, 176, 80, 119, 0, 16, 226, 2, 130, 66, 19, 0, 4, 93, 0, - 176, 80, 123, 0, 16, 228, 0, 176, 66, 19, 2, 240, 132, 0, 224, 94, 159, - 0, 55, 167, 3, 161, 94, 2, 240, 4, 103, 1, 188, 96, 3, 0, 23, 167, 1, - 135, 96, 4, 3, 16, 160, 0, 176, 0, 99, 0, 16, 180, 1, 188, 96, 3, 14, - 16, 181, 0, 176, 0, 99, 0, 240, 180, 1, 136, 96, 8, 3, 16, 180, 3, 191, - 222, 2, 240, 4, 125, 0, 176, 1, 123, 0, 16, 101, 0, 176, 90, 3, 0, 16, - 229, 1, 188, 99, 255, 31, 240, 197, 0, 176, 90, 7, 0, 16, 230, 1, 188, - 99, 255, 31, 240, 198, 0, 176, 90, 11, 0, 16, 231, 1, 188, 99, 255, - 31, 240, 199, 0, 104, 160, 99, 0, 4, 112, 0, 224, 94, 39, 0, 55, 137, - 0, 104, 32, 99, 0, 4, 116, 1, 133, 224, 7, 0, 16, 227, 1, 133, 224, - 7, 0, 16, 195, 0, 176, 66, 19, 1, 16, 132, 1, 218, 94, 39, 0, 16, 238, - 1, 135, 96, 6, 16, 144, 132, 0, 176, 66, 19, 28, 16, 132, 1, 188, 96, - 3, 0, 16, 180, 0, 224, 96, 104, 3, 176, 166, 0, 176, 0, 151, 0, 16, - 181, 1, 188, 96, 35, 4, 208, 180, 1, 132, 96, 7, 0, 17, 224, 3, 191, - 222, 2, 240, 4, 220, 1, 8, 94, 75, 0, 23, 161, 0, 104, 94, 135, 0, 36, - 136, 2, 2, 80, 3, 0, 4, 135, 2, 158, 80, 159, 0, 4, 132, 2, 1, 208, - 3, 0, 4, 132, 0, 224, 94, 39, 0, 55, 137, 1, 88, 94, 39, 0, 20, 45, - 1, 218, 80, 183, 0, 16, 238, 1, 135, 96, 6, 16, 144, 132, 3, 191, 222, - 2, 240, 4, 136, 1, 188, 96, 3, 0, 20, 45, 1, 4, 193, 7, 0, 23, 161, - 3, 34, 94, 2, 240, 4, 139, 1, 3, 222, 83, 0, 23, 161, 0, 176, 94, 135, - 0, 23, 162, 2, 0, 94, 255, 0, 4, 142, 1, 188, 96, 3, 0, 55, 162, 0, - 104, 43, 103, 0, 4, 144, 1, 188, 96, 3, 0, 55, 162, 2, 136, 94, 75, - 0, 4, 147, 0, 104, 94, 75, 6, 132, 147, 1, 188, 96, 3, 0, 23, 162, 1, - 131, 222, 134, 242, 151, 148, 1, 131, 222, 134, 132, 244, 39, 2, 129, - 194, 19, 0, 4, 154, 1, 134, 94, 139, 0, 16, 227, 1, 134, 96, 7, 0, 16, - 195, 1, 129, 224, 6, 16, 144, 132, 3, 191, 222, 2, 240, 4, 156, 1, 134, - 94, 138, 28, 112, 227, 1, 134, 96, 6, 24, 112, 195, 2, 184, 71, 167, - 0, 4, 216, 2, 160, 71, 183, 0, 4, 218, 3, 169, 94, 2, 240, 4, 164, 1, - 8, 94, 75, 0, 23, 161, 0, 104, 94, 135, 0, 36, 217, 2, 30, 80, 159, - 0, 4, 164, 1, 133, 224, 6, 28, 112, 227, 1, 133, 224, 6, 24, 112, 195, - 1, 20, 0, 99, 0, 23, 161, 0, 104, 222, 135, 0, 132, 173, 0, 176, 1, - 83, 0, 23, 162, 0, 104, 222, 139, 255, 228, 169, 0, 104, 66, 71, 0, - 36, 170, 0, 104, 222, 138, 132, 196, 173, 1, 133, 96, 2, 9, 16, 72, - 1, 134, 224, 2, 28, 112, 227, 1, 134, 224, 6, 24, 112, 195, 1, 16, 80, - 7, 0, 23, 166, 0, 104, 94, 155, 0, 4, 217, 1, 188, 96, 3, 0, 17, 228, - 1, 58, 80, 7, 0, 23, 128, 0, 136, 94, 3, 0, 119, 128, 0, 224, 0, 174, - 240, 16, 100, 0, 104, 222, 155, 0, 68, 190, 2, 7, 208, 3, 0, 4, 184, - 1, 188, 96, 43, 18, 183, 162, 0, 224, 94, 0, 11, 55, 163, 0, 2, 94, - 2, 240, 13, 136, 1, 188, 96, 35, 7, 151, 129, 0, 224, 65, 131, 1, 112, - 99, 0, 224, 65, 143, 0, 176, 101, 0, 2, 94, 2, 240, 13, 93, 1, 188, - 96, 35, 7, 80, 100, 1, 188, 96, 71, 0, 23, 162, 0, 2, 94, 2, 240, 13, - 176, 0, 104, 94, 155, 0, 68, 218, 1, 164, 96, 70, 244, 113, 224, 0, - 104, 222, 155, 0, 196, 204, 1, 188, 97, 19, 0, 183, 161, 2, 6, 0, 243, - 0, 4, 197, 1, 188, 96, 19, 0, 183, 161, 1, 146, 194, 26, 244, 55, 162, - 3, 41, 94, 2, 240, 4, 202, 1, 188, 96, 3, 0, 17, 238, 0, 144, 66, 231, - 0, 145, 239, 1, 146, 224, 14, 244, 55, 162, 0, 176, 94, 139, 0, 17, - 236, 3, 191, 222, 2, 240, 4, 218, 0, 104, 94, 155, 0, 100, 209, 0, 104, - 94, 155, 0, 164, 209, 0, 176, 80, 47, 0, 17, 226, 0, 176, 80, 51, 0, - 17, 226, 3, 191, 222, 2, 240, 4, 218, 1, 135, 96, 2, 61, 17, 232, 0, - 104, 222, 155, 0, 164, 212, 1, 135, 96, 6, 61, 17, 232, 1, 188, 96, - 3, 0, 17, 234, 0, 144, 66, 231, 0, 145, 235, 1, 146, 194, 27, 0, 183, - 162, 1, 184, 94, 138, 61, 17, 232, 3, 191, 222, 2, 240, 4, 218, 1, 132, - 96, 7, 0, 17, 224, 1, 188, 96, 3, 0, 17, 45, 0, 176, 68, 131, 0, 20, - 44, 3, 163, 222, 2, 240, 4, 239, 1, 188, 96, 3, 0, 23, 142, 0, 104, - 94, 75, 5, 164, 224, 2, 0, 80, 3, 0, 4, 233, 1, 131, 224, 6, 9, 16, - 72, 0, 176, 65, 35, 0, 24, 0, 1, 188, 96, 3, 4, 183, 142, 3, 169, 94, - 2, 240, 4, 238, 0, 104, 94, 75, 4, 36, 238, 1, 188, 96, 3, 6, 55, 142, - 0, 104, 94, 75, 5, 164, 238, 1, 188, 96, 3, 6, 183, 142, 3, 191, 222, - 2, 240, 4, 238, 1, 129, 96, 6, 245, 119, 171, 0, 176, 94, 15, 0, 23, - 133, 0, 2, 94, 2, 240, 13, 71, 1, 188, 96, 3, 0, 23, 140, 1, 188, 96, - 3, 0, 23, 141, 3, 35, 222, 2, 240, 4, 240, 1, 135, 224, 6, 16, 112, - 131, 1, 133, 224, 2, 245, 183, 173, 3, 41, 94, 2, 240, 5, 4, 2, 3, 0, - 199, 0, 4, 255, 0, 176, 80, 203, 0, 16, 101, 2, 130, 208, 199, 0, 4, - 247, 0, 224, 90, 35, 0, 54, 136, 3, 191, 222, 2, 240, 4, 248, 0, 224, - 90, 39, 0, 54, 137, 0, 104, 44, 147, 0, 36, 255, 0, 224, 94, 203, 0, - 55, 178, 1, 10, 94, 203, 0, 23, 161, 0, 224, 80, 202, 244, 48, 101, - 0, 208, 96, 6, 246, 87, 162, 0, 32, 90, 26, 244, 68, 255, 3, 191, 222, - 2, 240, 4, 249, 0, 2, 94, 2, 240, 15, 51, 3, 213, 222, 2, 240, 10, 80, - 3, 214, 222, 2, 240, 10, 104, 3, 80, 222, 2, 240, 4, 255, 3, 191, 222, - 2, 240, 5, 38, 2, 5, 94, 175, 0, 5, 6, 1, 135, 224, 6, 38, 113, 51, - 3, 191, 222, 2, 240, 0, 2, 1, 144, 96, 10, 134, 52, 49, 2, 130, 208, - 199, 0, 5, 16, 1, 60, 80, 39, 0, 23, 128, 1, 9, 80, 43, 0, 23, 129, - 1, 7, 80, 7, 0, 23, 161, 1, 130, 94, 134, 240, 55, 129, 0, 176, 80, - 31, 0, 16, 138, 0, 176, 80, 15, 0, 17, 22, 3, 191, 222, 2, 240, 5, 22, - 1, 56, 80, 95, 0, 23, 128, 1, 10, 80, 43, 0, 23, 129, 1, 7, 208, 7, - 0, 23, 161, 1, 130, 94, 134, 240, 55, 129, 0, 176, 80, 35, 0, 16, 138, - 0, 176, 80, 91, 0, 17, 22, 2, 3, 0, 199, 0, 5, 27, 2, 12, 208, 3, 0, - 5, 27, 2, 8, 94, 7, 0, 5, 27, 1, 56, 84, 7, 0, 23, 128, 0, 176, 84, - 39, 0, 16, 138, 2, 128, 80, 199, 0, 5, 36, 1, 188, 96, 3, 5, 183, 146, - 3, 191, 222, 2, 240, 2, 184, 1, 144, 96, 6, 134, 52, 49, 2, 3, 0, 199, - 0, 5, 8, 2, 12, 208, 3, 0, 5, 8, 0, 176, 0, 31, 0, 23, 161, 0, 224, - 94, 134, 128, 116, 26, 3, 191, 222, 2, 240, 5, 8, 1, 188, 96, 3, 6, - 55, 146, 3, 191, 222, 2, 240, 2, 184, 2, 5, 94, 255, 0, 5, 53, 1, 133, - 96, 2, 247, 247, 191, 3, 43, 222, 2, 240, 5, 53, 2, 0, 0, 243, 0, 5, - 44, 0, 232, 0, 35, 0, 81, 66, 1, 188, 96, 10, 40, 81, 66, 3, 148, 94, - 2, 240, 5, 49, 0, 176, 5, 139, 0, 16, 100, 0, 104, 88, 3, 0, 5, 49, - 0, 176, 68, 103, 0, 17, 18, 0, 176, 88, 3, 0, 17, 21, 0, 104, 69, 31, - 0, 5, 53, 3, 162, 94, 2, 240, 5, 53, 1, 133, 224, 6, 245, 119, 171, - 0, 2, 94, 2, 240, 14, 119, 2, 1, 194, 227, 0, 5, 95, 2, 3, 0, 199, 0, - 5, 58, 0, 104, 44, 147, 0, 37, 74, 0, 110, 66, 70, 246, 69, 74, 3, 191, - 222, 2, 240, 5, 60, 0, 110, 66, 71, 0, 37, 74, 2, 3, 0, 199, 0, 5, 71, - 3, 85, 222, 2, 240, 5, 60, 1, 128, 96, 2, 134, 20, 48, 1, 56, 80, 131, - 0, 23, 161, 0, 176, 80, 203, 0, 16, 101, 0, 109, 218, 50, 244, 42, 80, - 0, 168, 65, 35, 20, 16, 72, 1, 20, 0, 99, 0, 16, 101, 0, 224, 65, 151, - 14, 208, 101, 0, 224, 90, 3, 0, 54, 128, 1, 188, 98, 31, 0, 17, 224, - 3, 191, 222, 2, 240, 0, 19, 1, 129, 224, 6, 134, 52, 49, 1, 145, 96, - 14, 132, 244, 39, 3, 191, 222, 2, 240, 5, 95, 1, 60, 80, 103, 0, 23, - 161, 1, 172, 94, 134, 23, 80, 186, 1, 188, 96, 3, 1, 144, 184, 2, 3, - 0, 199, 0, 5, 89, 0, 104, 172, 147, 0, 37, 84, 1, 129, 224, 2, 23, 16, - 184, 3, 213, 222, 2, 240, 10, 80, 3, 214, 222, 2, 240, 10, 104, 3, 80, - 222, 2, 240, 5, 80, 3, 191, 222, 2, 240, 5, 95, 0, 232, 44, 147, 0, - 43, 36, 0, 176, 94, 203, 0, 16, 181, 0, 176, 0, 99, 8, 112, 180, 2, - 131, 66, 211, 0, 5, 87, 3, 191, 222, 2, 240, 5, 90, 1, 134, 224, 4, - 3, 16, 160, 0, 2, 94, 2, 240, 1, 131, 3, 213, 222, 2, 240, 10, 80, 3, - 214, 222, 2, 240, 10, 104, 3, 80, 222, 2, 240, 5, 91, 3, 191, 222, 2, - 240, 3, 51, 1, 188, 96, 3, 0, 240, 165, 1, 130, 224, 2, 9, 16, 72, 1, - 188, 98, 31, 0, 17, 224, 1, 188, 96, 3, 0, 17, 236, 1, 188, 96, 15, - 0, 17, 232, 2, 133, 80, 11, 0, 5, 102, 1, 130, 96, 2, 9, 16, 72, 2, - 129, 129, 179, 0, 5, 109, 3, 160, 222, 2, 240, 5, 107, 3, 213, 222, - 2, 240, 10, 80, 3, 214, 222, 2, 240, 10, 104, 3, 32, 94, 2, 240, 5, - 109, 1, 136, 96, 2, 9, 16, 72, 3, 191, 222, 2, 240, 0, 19, 1, 188, 96, - 3, 0, 55, 161, 2, 0, 1, 179, 0, 5, 123, 2, 4, 1, 179, 0, 5, 122, 0, - 233, 1, 187, 0, 32, 110, 0, 232, 129, 191, 0, 0, 111, 0, 104, 129, 187, - 0, 5, 122, 0, 104, 129, 191, 0, 5, 122, 2, 129, 129, 179, 0, 5, 119, - 1, 188, 96, 3, 0, 0, 108, 3, 191, 222, 2, 240, 5, 200, 1, 188, 96, 3, - 0, 0, 108, 0, 2, 94, 2, 240, 10, 224, 3, 191, 222, 2, 240, 0, 19, 1, - 188, 96, 3, 0, 23, 161, 0, 2, 94, 2, 240, 12, 107, 2, 1, 1, 179, 0, - 5, 126, 3, 191, 222, 2, 240, 0, 19, 3, 163, 222, 2, 240, 0, 19, 2, 0, - 80, 199, 0, 5, 135, 1, 188, 96, 3, 0, 16, 128, 1, 130, 96, 6, 9, 16, - 72, 1, 128, 96, 2, 134, 52, 49, 1, 4, 193, 7, 0, 23, 161, 1, 131, 222, - 134, 242, 151, 148, 0, 224, 1, 203, 0, 32, 114, 3, 191, 222, 2, 240, - 1, 166, 2, 1, 1, 179, 0, 5, 137, 1, 135, 224, 6, 245, 119, 171, 0, 176, - 1, 11, 0, 23, 161, 0, 109, 222, 132, 8, 5, 200, 0, 232, 68, 100, 8, - 119, 161, 0, 110, 94, 132, 8, 37, 200, 1, 135, 224, 6, 245, 119, 171, - 2, 2, 0, 191, 0, 5, 155, 2, 136, 129, 171, 0, 5, 155, 2, 132, 0, 199, - 0, 5, 155, 1, 41, 80, 11, 0, 23, 161, 0, 104, 222, 135, 2, 5, 155, 2, - 3, 197, 115, 0, 5, 154, 2, 131, 222, 179, 0, 5, 154, 2, 130, 222, 187, - 0, 5, 151, 0, 104, 42, 255, 0, 5, 155, 0, 109, 222, 47, 1, 229, 155, - 1, 130, 224, 6, 247, 247, 191, 0, 224, 68, 101, 86, 10, 175, 3, 191, - 222, 2, 240, 0, 19, 3, 191, 222, 2, 240, 5, 200, 2, 130, 94, 175, 0, - 5, 171, 1, 130, 96, 6, 245, 119, 171, 0, 176, 68, 103, 0, 8, 34, 0, - 176, 1, 75, 0, 23, 162, 2, 8, 66, 27, 0, 5, 162, 0, 176, 1, 107, 0, - 23, 162, 0, 104, 94, 139, 0, 5, 168, 0, 144, 69, 43, 0, 151, 161, 0, - 128, 222, 134, 244, 87, 161, 0, 110, 32, 210, 13, 165, 168, 0, 176, - 65, 183, 0, 8, 52, 0, 224, 32, 210, 35, 40, 53, 1, 133, 224, 2, 245, - 183, 173, 2, 5, 94, 175, 0, 5, 171, 1, 188, 97, 3, 0, 17, 51, 0, 232, - 68, 101, 4, 87, 165, 0, 176, 68, 103, 0, 11, 216, 0, 109, 94, 151, 1, - 0, 173, 2, 2, 0, 191, 0, 5, 186, 0, 104, 222, 75, 6, 165, 177, 1, 132, - 224, 2, 247, 247, 191, 0, 104, 222, 75, 4, 5, 180, 2, 130, 222, 179, - 0, 5, 180, 1, 188, 96, 3, 0, 11, 16, 2, 4, 94, 179, 0, 5, 183, 0, 104, - 222, 75, 6, 37, 183, 0, 2, 94, 2, 240, 17, 38, 0, 2, 94, 2, 240, 15, - 52, 3, 163, 222, 2, 240, 5, 186, 1, 131, 224, 2, 245, 151, 172, 1, 188, - 96, 19, 20, 151, 161, 0, 2, 94, 2, 240, 0, 206, 1, 188, 99, 131, 0, - 23, 161, 0, 160, 64, 102, 244, 55, 162, 0, 104, 222, 138, 244, 37, 198, - 1, 188, 96, 19, 14, 119, 161, 0, 2, 94, 2, 240, 0, 206, 0, 160, 64, - 103, 63, 247, 162, 0, 152, 94, 139, 0, 55, 162, 0, 104, 94, 139, 0, - 5, 197, 0, 104, 222, 139, 15, 229, 198, 1, 188, 96, 35, 0, 16, 67, 1, - 130, 96, 2, 245, 119, 171, 3, 209, 94, 2, 240, 0, 2, 2, 0, 80, 195, - 0, 6, 23, 3, 37, 222, 2, 240, 5, 204, 1, 131, 96, 6, 132, 244, 39, 3, - 191, 222, 2, 240, 5, 254, 2, 12, 208, 3, 0, 5, 252, 2, 3, 0, 199, 0, - 5, 235, 1, 20, 0, 99, 0, 23, 161, 0, 109, 222, 135, 0, 133, 252, 1, - 188, 96, 3, 0, 23, 128, 0, 176, 80, 203, 0, 16, 101, 0, 176, 80, 207, - 0, 16, 100, 1, 129, 96, 6, 13, 144, 108, 1, 130, 96, 6, 134, 52, 49, - 0, 176, 90, 35, 0, 23, 161, 1, 188, 96, 3, 0, 22, 136, 1, 188, 90, 42, - 244, 55, 161, 1, 188, 96, 3, 0, 22, 138, 0, 176, 94, 135, 0, 20, 143, - 0, 176, 90, 39, 0, 23, 161, 1, 188, 96, 3, 0, 22, 137, 1, 188, 90, 46, - 244, 55, 161, 1, 188, 96, 3, 0, 22, 139, 0, 176, 94, 135, 0, 20, 144, - 0, 176, 90, 27, 0, 20, 141, 0, 176, 90, 31, 0, 20, 142, 1, 188, 96, - 3, 0, 22, 4, 0, 104, 222, 3, 0, 5, 232, 2, 3, 80, 199, 0, 5, 231, 1, - 0, 80, 159, 0, 23, 128, 1, 128, 94, 2, 145, 180, 141, 1, 188, 94, 2, - 146, 20, 144, 1, 188, 96, 3, 0, 55, 128, 0, 2, 94, 2, 240, 18, 146, - 0, 176, 94, 3, 0, 20, 140, 3, 191, 222, 2, 240, 5, 247, 0, 104, 194, - 71, 0, 5, 240, 1, 129, 224, 6, 134, 52, 49, 1, 145, 96, 14, 132, 244, - 39, 1, 188, 96, 3, 0, 20, 48, 3, 191, 222, 2, 240, 0, 2, 0, 176, 80, - 159, 0, 23, 161, 0, 2, 94, 2, 240, 1, 130, 0, 176, 94, 135, 0, 20, 39, - 1, 134, 224, 4, 3, 16, 160, 0, 176, 66, 131, 0, 24, 0, 1, 12, 208, 3, - 0, 23, 161, 0, 104, 222, 135, 0, 101, 235, 1, 2, 80, 199, 0, 23, 161, - 1, 128, 94, 134, 132, 244, 39, 1, 138, 224, 14, 132, 244, 39, 0, 176, - 80, 191, 0, 20, 38, 3, 191, 222, 2, 240, 5, 254, 1, 134, 224, 4, 3, - 16, 160, 2, 0, 80, 159, 0, 5, 254, 2, 134, 193, 7, 0, 6, 18, 3, 41, - 94, 2, 240, 6, 3, 0, 176, 82, 51, 0, 20, 45, 0, 176, 82, 55, 0, 23, - 161, 1, 158, 94, 134, 132, 244, 39, 0, 176, 80, 159, 0, 23, 161, 1, - 128, 222, 134, 244, 55, 161, 0, 176, 80, 187, 0, 16, 143, 0, 176, 80, - 183, 0, 16, 142, 0, 176, 80, 155, 0, 16, 141, 1, 128, 96, 6, 244, 48, - 140, 2, 2, 80, 199, 0, 6, 17, 0, 176, 82, 67, 0, 16, 143, 0, 176, 82, - 63, 0, 16, 142, 0, 176, 82, 59, 0, 16, 141, 1, 26, 82, 55, 0, 23, 161, - 1, 152, 222, 135, 4, 55, 161, 1, 184, 94, 134, 145, 176, 140, 1, 130, - 96, 2, 134, 52, 49, 1, 129, 96, 2, 13, 144, 108, 3, 37, 222, 2, 240, - 6, 21, 1, 156, 96, 2, 132, 244, 39, 3, 191, 222, 2, 240, 6, 25, 2, 133, - 80, 11, 0, 6, 23, 0, 168, 80, 199, 13, 20, 49, 1, 188, 96, 3, 0, 20, - 48, 1, 129, 96, 2, 245, 215, 174, 1, 131, 96, 2, 132, 244, 39, 1, 133, - 224, 2, 9, 16, 72, 1, 188, 96, 3, 0, 20, 46, 3, 162, 94, 2, 240, 1, - 166, 3, 191, 222, 2, 240, 0, 19, 3, 35, 222, 2, 240, 6, 137, 3, 163, - 94, 2, 240, 6, 137, 3, 162, 222, 2, 240, 6, 137, 1, 129, 96, 6, 245, - 119, 171, 3, 170, 94, 2, 240, 6, 137, 1, 131, 224, 2, 9, 16, 72, 3, - 81, 222, 2, 240, 6, 65, 2, 4, 94, 179, 0, 6, 46, 1, 132, 96, 2, 245, - 151, 172, 1, 131, 224, 2, 9, 16, 72, 0, 176, 43, 87, 0, 23, 161, 0, - 109, 43, 6, 244, 32, 2, 0, 224, 2, 123, 0, 32, 158, 1, 188, 96, 3, 0, - 10, 193, 0, 2, 94, 2, 240, 17, 41, 3, 191, 222, 2, 240, 0, 2, 2, 3, - 222, 179, 0, 6, 62, 1, 131, 224, 2, 245, 151, 172, 0, 224, 32, 231, - 0, 40, 57, 2, 1, 94, 187, 0, 6, 62, 0, 176, 42, 155, 0, 23, 161, 0, - 109, 32, 230, 244, 38, 57, 1, 188, 96, 3, 0, 8, 57, 0, 224, 2, 127, - 0, 32, 159, 3, 169, 94, 2, 240, 6, 60, 1, 145, 96, 26, 132, 244, 39, - 3, 191, 222, 2, 240, 2, 247, 1, 188, 99, 255, 31, 247, 161, 0, 2, 94, - 2, 240, 12, 107, 3, 41, 94, 2, 240, 6, 62, 1, 145, 96, 26, 132, 244, - 39, 3, 191, 222, 2, 240, 6, 62, 0, 224, 2, 107, 0, 32, 154, 1, 128, - 224, 6, 245, 119, 171, 3, 191, 222, 2, 240, 6, 70, 3, 1, 222, 2, 240, - 6, 68, 0, 104, 94, 79, 6, 38, 68, 1, 188, 96, 3, 0, 23, 168, 3, 164, - 94, 2, 240, 6, 70, 3, 193, 222, 2, 240, 6, 140, 1, 132, 96, 2, 9, 16, - 72, 2, 4, 0, 191, 0, 6, 75, 1, 188, 96, 3, 0, 17, 21, 1, 20, 0, 99, - 0, 23, 161, 0, 224, 102, 2, 244, 48, 101, 0, 2, 94, 2, 240, 13, 76, - 1, 130, 96, 2, 9, 16, 72, 3, 169, 94, 2, 240, 6, 102, 0, 104, 94, 59, - 4, 166, 86, 1, 240, 222, 23, 0, 55, 133, 0, 160, 94, 22, 240, 151, 133, - 0, 104, 94, 59, 6, 38, 86, 2, 1, 80, 3, 0, 6, 85, 2, 135, 128, 191, - 0, 6, 85, 1, 133, 224, 6, 9, 16, 72, 2, 128, 208, 3, 0, 6, 102, 0, 176, - 94, 27, 0, 23, 163, 0, 176, 0, 139, 0, 23, 164, 2, 4, 0, 191, 0, 6, - 92, 0, 110, 65, 151, 48, 102, 92, 1, 24, 90, 3, 0, 23, 163, 1, 26, 90, - 3, 0, 23, 164, 0, 104, 193, 131, 24, 6, 95, 0, 224, 2, 147, 0, 32, 164, - 3, 191, 222, 2, 240, 6, 97, 0, 109, 94, 46, 244, 134, 97, 1, 130, 224, - 6, 134, 52, 49, 0, 224, 94, 51, 0, 55, 140, 0, 104, 222, 50, 244, 102, - 100, 0, 176, 94, 15, 0, 23, 133, 0, 109, 222, 46, 244, 102, 114, 3, - 191, 222, 2, 240, 6, 132, 0, 176, 94, 31, 0, 23, 163, 0, 176, 0, 143, - 0, 23, 164, 2, 4, 0, 191, 0, 6, 108, 0, 110, 65, 151, 48, 102, 108, - 1, 28, 90, 3, 0, 23, 163, 1, 30, 90, 3, 0, 23, 164, 0, 109, 94, 46, - 244, 134, 110, 1, 130, 224, 6, 134, 52, 49, 0, 224, 94, 55, 0, 55, 141, - 0, 104, 222, 54, 244, 102, 113, 0, 176, 94, 15, 0, 23, 133, 0, 109, - 94, 46, 244, 102, 132, 1, 133, 224, 2, 9, 16, 72, 3, 209, 222, 2, 240, - 6, 116, 0, 104, 94, 75, 4, 134, 126, 0, 2, 94, 2, 240, 13, 71, 0, 104, - 65, 131, 24, 6, 168, 2, 3, 0, 199, 0, 6, 124, 2, 12, 208, 3, 0, 6, 124, - 2, 131, 80, 199, 0, 6, 124, 0, 104, 222, 75, 5, 166, 124, 3, 191, 222, - 2, 240, 18, 16, 1, 129, 224, 6, 134, 52, 49, 3, 191, 222, 2, 240, 5, - 200, 0, 176, 80, 79, 0, 17, 242, 0, 176, 80, 83, 0, 17, 243, 0, 176, - 80, 87, 0, 17, 244, 1, 188, 96, 3, 1, 17, 245, 1, 188, 96, 3, 0, 81, - 240, 3, 191, 222, 2, 240, 5, 200, 0, 2, 94, 2, 240, 13, 71, 1, 129, - 96, 2, 9, 16, 72, 3, 41, 94, 2, 240, 6, 137, 2, 131, 0, 199, 0, 18, - 16, 3, 191, 222, 2, 240, 5, 200, 3, 209, 222, 2, 240, 6, 138, 3, 165, - 222, 2, 240, 5, 200, 3, 191, 222, 2, 240, 0, 19, 2, 128, 1, 179, 0, - 0, 19, 2, 6, 80, 3, 0, 6, 147, 0, 176, 1, 3, 0, 23, 161, 0, 109, 129, - 10, 244, 38, 147, 0, 232, 68, 100, 8, 119, 161, 0, 110, 94, 132, 8, - 38, 147, 1, 135, 224, 6, 245, 119, 171, 1, 8, 94, 75, 0, 23, 161, 0, - 104, 94, 135, 0, 38, 150, 0, 176, 94, 15, 0, 23, 133, 0, 2, 94, 2, 240, - 13, 71, 0, 104, 94, 59, 6, 38, 156, 1, 188, 96, 3, 0, 23, 140, 2, 0, - 208, 3, 0, 6, 161, 1, 188, 96, 3, 0, 23, 141, 3, 191, 222, 2, 240, 6, - 161, 1, 188, 96, 3, 0, 23, 140, 2, 3, 0, 199, 0, 1, 166, 2, 12, 208, - 3, 0, 1, 166, 1, 156, 96, 2, 132, 244, 39, 3, 191, 222, 2, 240, 1, 166, - 0, 104, 65, 131, 24, 6, 167, 1, 128, 96, 6, 132, 244, 39, 3, 41, 94, - 2, 240, 5, 200, 1, 130, 96, 6, 134, 52, 49, 2, 131, 0, 199, 0, 18, 16, - 3, 191, 222, 2, 240, 5, 200, 0, 224, 2, 151, 0, 32, 165, 1, 129, 96, - 2, 9, 16, 72, 1, 188, 96, 3, 0, 8, 24, 0, 224, 1, 123, 0, 160, 94, 1, - 188, 96, 19, 16, 215, 161, 0, 109, 1, 122, 244, 32, 19, 1, 188, 96, - 19, 9, 64, 94, 3, 191, 222, 2, 240, 0, 19, 0, 2, 94, 2, 240, 11, 29, - 3, 56, 222, 2, 240, 0, 19, 3, 158, 222, 2, 240, 0, 19, 0, 232, 68, 76, - 0, 247, 161, 0, 232, 94, 132, 1, 23, 161, 0, 106, 222, 132, 1, 6, 184, - 0, 232, 94, 132, 1, 17, 135, 1, 188, 96, 3, 0, 17, 136, 1, 165, 224, - 34, 48, 17, 128, 1, 188, 96, 3, 0, 17, 19, 1, 188, 96, 3, 0, 17, 20, - 0, 176, 68, 103, 0, 23, 161, 0, 176, 68, 107, 0, 23, 162, 0, 176, 94, - 135, 0, 17, 4, 0, 176, 94, 139, 0, 17, 5, 3, 184, 222, 2, 240, 6, 186, - 3, 191, 222, 2, 240, 0, 19, 1, 188, 96, 3, 4, 183, 146, 1, 188, 96, - 3, 4, 23, 161, 1, 188, 99, 255, 31, 240, 203, 1, 188, 99, 255, 31, 240, - 204, 1, 188, 99, 255, 31, 240, 205, 1, 188, 99, 255, 31, 240, 206, 1, - 188, 99, 255, 31, 240, 207, 1, 188, 99, 255, 31, 240, 208, 0, 176, 82, - 23, 0, 16, 232, 1, 188, 99, 255, 31, 240, 200, 0, 176, 82, 27, 0, 16, - 233, 1, 188, 99, 255, 31, 240, 201, 0, 176, 82, 31, 0, 16, 234, 1, 188, - 99, 255, 31, 240, 202, 1, 188, 96, 3, 0, 16, 228, 2, 134, 0, 195, 0, - 6, 219, 0, 176, 84, 15, 0, 23, 162, 0, 105, 222, 138, 144, 134, 211, - 0, 232, 82, 18, 244, 80, 228, 0, 104, 160, 95, 0, 6, 219, 1, 188, 96, - 3, 0, 16, 228, 0, 176, 84, 39, 0, 16, 224, 0, 176, 84, 47, 0, 16, 225, - 3, 191, 222, 2, 240, 6, 228, 3, 164, 222, 2, 240, 8, 192, 3, 169, 222, - 2, 240, 8, 192, 1, 188, 96, 3, 1, 215, 161, 2, 6, 0, 195, 0, 6, 221, - 2, 128, 222, 95, 0, 6, 226, 0, 176, 84, 7, 0, 16, 224, 0, 104, 32, 95, - 0, 6, 224, 1, 210, 222, 134, 160, 48, 224, 0, 176, 84, 11, 0, 16, 225, - 3, 191, 222, 2, 240, 6, 228, 1, 188, 94, 134, 144, 16, 224, 1, 188, - 96, 31, 0, 16, 225, 1, 188, 96, 3, 0, 16, 226, 0, 176, 82, 35, 0, 16, - 229, 1, 188, 99, 255, 31, 240, 197, 0, 176, 82, 39, 0, 16, 230, 1, 188, - 99, 255, 31, 240, 198, 0, 176, 82, 43, 0, 16, 231, 1, 188, 99, 255, - 31, 240, 199, 0, 176, 0, 71, 0, 16, 134, 1, 8, 32, 95, 0, 23, 129, 1, - 56, 82, 3, 0, 23, 128, 1, 2, 192, 39, 0, 23, 166, 0, 2, 94, 2, 240, - 17, 169, 0, 104, 32, 95, 0, 70, 242, 0, 176, 84, 7, 0, 23, 128, 2, 129, - 129, 179, 0, 6, 244, 0, 2, 94, 2, 240, 13, 45, 0, 104, 32, 95, 0, 38, - 252, 0, 104, 160, 95, 0, 6, 247, 2, 26, 84, 7, 0, 6, 252, 0, 104, 0, - 167, 1, 6, 250, 1, 3, 192, 39, 0, 23, 161, 3, 191, 222, 2, 240, 6, 251, - 1, 6, 192, 59, 0, 23, 161, 1, 130, 94, 134, 16, 208, 134, 3, 169, 222, - 2, 240, 9, 27, 0, 104, 94, 79, 4, 39, 14, 1, 188, 99, 255, 31, 240, - 195, 0, 104, 94, 79, 5, 167, 4, 1, 188, 96, 3, 26, 144, 227, 1, 188, - 96, 3, 6, 183, 146, 0, 104, 94, 79, 5, 39, 14, 3, 191, 222, 2, 240, - 7, 8, 1, 188, 96, 3, 6, 55, 146, 2, 152, 68, 7, 0, 9, 233, 2, 128, 70, - 7, 0, 9, 233, 1, 188, 96, 3, 24, 144, 227, 0, 176, 32, 95, 0, 23, 129, - 0, 2, 94, 2, 240, 13, 58, 0, 232, 94, 132, 0, 215, 161, 0, 106, 94, - 134, 144, 135, 14, 0, 232, 82, 18, 244, 48, 228, 3, 191, 222, 2, 240, - 7, 17, 1, 188, 96, 3, 0, 16, 228, 3, 56, 222, 2, 240, 7, 17, 1, 135, - 224, 6, 28, 144, 228, 1, 144, 96, 10, 9, 16, 72, 1, 188, 97, 3, 4, 55, - 145, 0, 104, 94, 79, 5, 169, 233, 3, 131, 94, 2, 240, 8, 192, 3, 191, - 222, 2, 240, 0, 2, 1, 134, 96, 2, 247, 247, 191, 1, 130, 224, 2, 245, - 183, 173, 1, 133, 224, 2, 245, 183, 173, 2, 4, 65, 99, 0, 7, 33, 1, - 132, 96, 2, 11, 16, 88, 2, 5, 94, 175, 0, 7, 29, 1, 135, 224, 6, 38, - 113, 51, 2, 4, 0, 191, 0, 7, 32, 1, 133, 224, 2, 245, 119, 171, 0, 2, - 94, 2, 240, 14, 119, 3, 191, 222, 2, 240, 0, 2, 2, 131, 192, 55, 0, - 7, 41, 0, 108, 196, 101, 108, 7, 42, 1, 188, 96, 27, 26, 119, 161, 0, - 2, 94, 2, 240, 0, 206, 1, 128, 224, 6, 3, 55, 162, 0, 2, 94, 2, 240, - 0, 212, 1, 128, 224, 2, 244, 87, 162, 0, 2, 94, 2, 240, 0, 212, 0, 224, - 68, 101, 108, 43, 96, 2, 133, 197, 35, 0, 7, 48, 1, 132, 96, 6, 11, - 16, 88, 2, 0, 222, 255, 0, 7, 48, 1, 128, 224, 2, 247, 247, 191, 0, - 104, 43, 103, 0, 7, 48, 0, 224, 68, 101, 91, 10, 217, 2, 5, 94, 175, - 0, 7, 50, 1, 188, 97, 3, 0, 17, 51, 2, 5, 128, 191, 0, 7, 56, 1, 188, - 96, 19, 17, 87, 161, 0, 2, 94, 2, 240, 0, 206, 1, 150, 96, 14, 3, 48, - 25, 0, 176, 64, 103, 0, 23, 162, 0, 2, 94, 2, 240, 0, 212, 2, 131, 192, - 55, 0, 0, 19, 0, 224, 2, 31, 0, 32, 135, 1, 130, 96, 6, 40, 145, 68, - 3, 191, 222, 2, 240, 0, 19, 2, 129, 64, 19, 0, 0, 2, 2, 0, 66, 3, 0, - 7, 63, 1, 132, 96, 2, 245, 151, 172, 1, 188, 96, 3, 0, 16, 128, 3, 163, - 222, 2, 240, 7, 66, 1, 144, 96, 2, 9, 16, 72, 0, 176, 68, 103, 0, 23, - 158, 0, 176, 68, 107, 0, 23, 157, 0, 176, 68, 111, 0, 23, 156, 0, 176, - 68, 115, 0, 23, 155, 0, 104, 222, 122, 35, 39, 66, 0, 224, 2, 35, 0, - 32, 136, 1, 21, 64, 59, 0, 23, 151, 0, 176, 1, 67, 0, 23, 161, 1, 201, - 222, 132, 5, 40, 5, 1, 188, 96, 3, 16, 119, 149, 1, 145, 224, 2, 13, - 144, 108, 2, 134, 64, 55, 0, 7, 80, 0, 224, 2, 187, 0, 32, 174, 3, 191, - 222, 2, 240, 10, 145, 1, 188, 96, 3, 0, 20, 128, 1, 188, 96, 3, 0, 20, - 129, 1, 184, 96, 10, 4, 144, 36, 1, 188, 96, 3, 4, 8, 42, 1, 188, 96, - 3, 0, 72, 41, 1, 188, 96, 3, 0, 208, 42, 1, 179, 96, 7, 0, 16, 4, 1, - 188, 96, 3, 0, 8, 14, 1, 188, 96, 3, 0, 8, 15, 1, 188, 96, 3, 0, 8, - 16, 1, 188, 96, 3, 0, 8, 17, 1, 131, 224, 2, 245, 215, 174, 2, 135, - 192, 55, 0, 10, 141, 0, 2, 94, 2, 240, 17, 139, 0, 2, 94, 2, 240, 15, - 51, 3, 67, 94, 2, 240, 7, 92, 0, 109, 64, 51, 0, 202, 254, 0, 104, 94, - 95, 0, 71, 116, 0, 104, 94, 95, 0, 39, 113, 0, 104, 0, 167, 0, 199, - 102, 0, 104, 0, 167, 1, 7, 102, 0, 104, 128, 167, 0, 167, 103, 0, 224, - 68, 102, 144, 40, 54, 1, 188, 98, 195, 0, 23, 161, 2, 128, 82, 3, 0, - 7, 106, 1, 150, 82, 3, 0, 23, 161, 0, 128, 222, 134, 144, 55, 154, 2, - 3, 82, 3, 0, 7, 111, 0, 224, 94, 106, 144, 55, 154, 2, 7, 210, 3, 0, - 7, 111, 0, 232, 94, 107, 0, 55, 154, 2, 158, 94, 107, 0, 10, 254, 3, - 191, 222, 2, 240, 7, 121, 1, 82, 210, 3, 0, 23, 161, 1, 133, 210, 6, - 244, 55, 154, 3, 191, 222, 2, 240, 7, 121, 1, 60, 82, 3, 0, 23, 161, - 1, 188, 82, 6, 244, 55, 154, 0, 110, 94, 104, 11, 170, 254, 0, 104, - 47, 191, 0, 7, 121, 2, 142, 82, 7, 0, 10, 254, 2, 4, 192, 59, 0, 7, - 131, 1, 129, 224, 6, 13, 144, 108, 2, 135, 64, 55, 0, 10, 145, 0, 2, - 94, 2, 240, 17, 139, 0, 2, 94, 2, 240, 15, 51, 2, 135, 192, 175, 0, - 7, 123, 2, 135, 192, 175, 0, 10, 141, 1, 88, 64, 175, 0, 23, 154, 1, - 188, 96, 63, 30, 23, 161, 0, 109, 222, 106, 244, 42, 141, 3, 91, 94, - 2, 240, 7, 133, 1, 188, 96, 19, 0, 16, 67, 0, 176, 65, 35, 40, 16, 72, - 1, 128, 96, 2, 242, 151, 148, 1, 132, 224, 2, 9, 16, 72, 1, 88, 64, - 175, 0, 16, 42, 0, 104, 64, 171, 0, 42, 141, 1, 187, 94, 86, 0, 144, - 4, 2, 3, 94, 87, 0, 7, 148, 2, 0, 71, 163, 0, 7, 145, 1, 188, 98, 30, - 60, 17, 224, 1, 188, 96, 3, 0, 17, 234, 0, 176, 94, 107, 0, 17, 235, - 1, 152, 96, 30, 61, 17, 232, 2, 0, 71, 179, 0, 7, 148, 0, 176, 94, 107, - 0, 17, 239, 1, 176, 224, 206, 61, 145, 236, 3, 131, 94, 2, 240, 7, 152, - 0, 2, 94, 2, 240, 17, 139, 0, 2, 94, 2, 240, 15, 51, 0, 109, 64, 51, - 4, 199, 148, 1, 131, 96, 2, 13, 144, 108, 2, 2, 0, 243, 0, 7, 160, 3, - 170, 222, 2, 240, 7, 162, 2, 128, 82, 23, 0, 7, 162, 0, 224, 65, 135, - 0, 176, 101, 0, 2, 94, 2, 240, 12, 123, 2, 0, 192, 119, 0, 7, 160, 3, - 191, 222, 2, 240, 7, 161, 3, 48, 94, 2, 240, 7, 162, 1, 131, 96, 6, - 13, 144, 108, 1, 188, 96, 3, 0, 8, 2, 1, 136, 224, 15, 0, 8, 3, 0, 109, - 64, 51, 2, 8, 186, 1, 41, 82, 15, 0, 23, 147, 1, 9, 82, 15, 0, 23, 170, - 1, 150, 96, 2, 242, 151, 148, 0, 224, 65, 135, 1, 240, 101, 1, 188, - 96, 15, 0, 23, 161, 0, 40, 222, 134, 144, 103, 174, 1, 134, 96, 6, 242, - 151, 148, 0, 224, 65, 151, 0, 112, 101, 0, 224, 32, 171, 0, 200, 42, - 1, 6, 94, 83, 0, 23, 162, 0, 160, 94, 79, 4, 119, 161, 0, 104, 222, - 135, 4, 71, 188, 1, 134, 224, 6, 242, 151, 148, 0, 184, 94, 139, 0, - 55, 162, 0, 176, 90, 3, 0, 23, 160, 2, 10, 218, 3, 0, 7, 182, 1, 135, - 96, 6, 242, 151, 148, 2, 132, 192, 59, 0, 7, 188, 2, 3, 218, 3, 0, 7, - 188, 3, 171, 94, 2, 240, 7, 186, 2, 4, 65, 7, 0, 7, 188, 1, 128, 96, - 5, 0, 104, 3, 1, 6, 94, 83, 0, 23, 162, 1, 130, 222, 138, 0, 144, 4, - 3, 170, 222, 2, 240, 7, 235, 3, 171, 94, 2, 240, 7, 215, 2, 135, 210, - 19, 0, 7, 235, 0, 176, 82, 19, 0, 17, 134, 1, 165, 224, 10, 48, 17, - 128, 1, 132, 96, 2, 13, 144, 108, 1, 188, 99, 255, 31, 247, 153, 0, - 224, 65, 135, 1, 112, 101, 0, 104, 222, 171, 0, 39, 201, 0, 160, 94, - 79, 255, 119, 161, 0, 104, 222, 135, 7, 39, 213, 3, 191, 222, 2, 240, - 7, 203, 2, 132, 82, 15, 0, 7, 213, 2, 4, 210, 15, 0, 7, 206, 3, 177, - 94, 2, 240, 7, 212, 0, 224, 65, 135, 1, 16, 101, 3, 191, 222, 2, 240, - 7, 207, 3, 179, 94, 2, 240, 7, 212, 2, 0, 128, 243, 0, 7, 213, 2, 0, - 82, 23, 0, 7, 213, 0, 2, 94, 2, 240, 12, 123, 2, 0, 192, 119, 0, 7, - 213, 1, 41, 64, 119, 0, 23, 153, 1, 132, 96, 6, 13, 144, 108, 2, 0, - 82, 23, 0, 7, 235, 3, 49, 94, 2, 240, 7, 235, 1, 134, 96, 2, 48, 17, - 128, 1, 128, 224, 1, 97, 203, 14, 2, 0, 82, 23, 0, 7, 219, 2, 2, 171, - 71, 0, 7, 230, 0, 104, 222, 95, 0, 7, 230, 0, 176, 43, 175, 0, 23, 161, - 0, 104, 42, 179, 0, 7, 230, 0, 176, 43, 171, 0, 23, 162, 0, 109, 170, - 178, 244, 71, 230, 0, 104, 222, 171, 0, 71, 226, 1, 132, 224, 6, 247, - 247, 191, 0, 104, 222, 79, 2, 135, 230, 0, 2, 94, 2, 240, 19, 17, 2, - 6, 222, 255, 0, 7, 230, 0, 224, 43, 223, 0, 42, 247, 0, 104, 222, 95, - 0, 7, 233, 0, 104, 222, 171, 0, 71, 233, 1, 128, 224, 5, 97, 203, 14, - 0, 104, 43, 103, 0, 7, 235, 1, 128, 224, 6, 247, 247, 191, 2, 7, 82, - 15, 0, 8, 107, 2, 128, 71, 163, 0, 8, 104, 2, 128, 71, 179, 0, 8, 104, - 0, 224, 32, 171, 0, 136, 42, 0, 232, 32, 167, 0, 136, 41, 1, 188, 96, - 3, 0, 17, 228, 1, 188, 99, 255, 31, 247, 165, 1, 188, 96, 3, 3, 209, - 225, 2, 6, 94, 83, 0, 7, 245, 1, 188, 96, 3, 4, 145, 225, 2, 6, 222, - 83, 0, 7, 249, 0, 224, 71, 135, 0, 81, 225, 2, 7, 210, 15, 0, 7, 249, - 0, 224, 71, 135, 0, 145, 225, 0, 109, 64, 51, 2, 200, 186, 0, 104, 94, - 79, 5, 135, 252, 0, 104, 222, 171, 0, 72, 107, 3, 171, 94, 2, 240, 7, - 255, 2, 0, 82, 23, 0, 8, 107, 2, 5, 128, 243, 0, 8, 10, 0, 224, 65, - 135, 1, 16, 101, 2, 2, 0, 243, 0, 8, 3, 2, 4, 210, 15, 0, 8, 3, 0, 224, - 65, 135, 0, 176, 101, 0, 2, 94, 2, 240, 12, 123, 2, 0, 192, 119, 0, - 8, 7, 1, 41, 64, 119, 0, 23, 165, 0, 224, 94, 151, 0, 151, 165, 0, 104, - 222, 151, 255, 232, 10, 2, 128, 82, 23, 0, 8, 107, 2, 7, 0, 191, 0, - 8, 107, 1, 188, 96, 31, 20, 23, 162, 0, 144, 71, 135, 0, 48, 101, 0, - 224, 65, 150, 244, 80, 101, 0, 224, 71, 135, 1, 8, 32, 3, 131, 94, 2, - 240, 8, 18, 0, 2, 94, 2, 240, 17, 139, 0, 2, 94, 2, 240, 15, 51, 0, - 109, 64, 49, 4, 8, 14, 0, 109, 64, 49, 4, 8, 186, 1, 188, 96, 11, 29, - 87, 161, 0, 104, 222, 151, 255, 232, 34, 1, 15, 90, 7, 0, 23, 165, 3, - 30, 222, 2, 240, 8, 34, 2, 0, 82, 23, 0, 8, 34, 3, 44, 94, 2, 240, 8, - 107, 0, 104, 94, 103, 255, 232, 34, 0, 224, 94, 103, 0, 151, 153, 0, - 224, 94, 102, 244, 48, 100, 1, 42, 88, 3, 0, 23, 153, 1, 0, 222, 151, - 0, 23, 165, 0, 224, 94, 102, 244, 183, 153, 0, 224, 94, 103, 0, 55, - 153, 1, 21, 88, 3, 0, 23, 166, 3, 191, 222, 2, 240, 8, 50, 0, 224, 94, - 150, 244, 48, 100, 1, 42, 88, 3, 0, 23, 153, 2, 5, 128, 243, 0, 8, 49, - 1, 130, 224, 2, 243, 55, 153, 2, 0, 82, 23, 0, 8, 49, 1, 22, 216, 3, - 0, 23, 166, 1, 15, 90, 7, 0, 23, 164, 1, 12, 216, 3, 0, 23, 161, 0, - 104, 222, 146, 244, 40, 45, 0, 224, 94, 103, 2, 23, 153, 3, 191, 222, - 2, 240, 8, 54, 1, 13, 216, 3, 0, 23, 161, 0, 104, 222, 146, 244, 40, - 107, 0, 224, 94, 103, 4, 23, 153, 3, 191, 222, 2, 240, 8, 54, 1, 16, - 88, 3, 0, 23, 166, 0, 104, 222, 155, 0, 200, 54, 1, 129, 218, 3, 0, - 23, 161, 0, 184, 94, 134, 192, 23, 161, 2, 129, 222, 135, 0, 8, 107, - 0, 136, 94, 103, 0, 119, 128, 0, 224, 0, 174, 240, 16, 100, 1, 170, - 222, 101, 0, 72, 2, 0, 104, 222, 155, 0, 72, 80, 2, 7, 129, 135, 0, - 8, 67, 0, 109, 222, 3, 12, 8, 67, 2, 133, 82, 15, 0, 8, 67, 2, 152, - 82, 59, 0, 8, 67, 1, 129, 224, 5, 0, 104, 3, 0, 224, 94, 0, 11, 55, - 163, 0, 224, 94, 143, 0, 151, 163, 0, 224, 65, 135, 0, 119, 162, 0, - 2, 94, 2, 240, 13, 136, 0, 232, 32, 167, 1, 8, 41, 1, 188, 96, 35, 7, - 151, 129, 0, 136, 94, 151, 0, 119, 161, 0, 232, 94, 134, 244, 176, 99, - 1, 188, 96, 7, 14, 23, 161, 0, 224, 65, 142, 244, 48, 99, 0, 176, 86, - 23, 0, 23, 161, 0, 176, 86, 27, 0, 23, 162, 0, 104, 222, 134, 208, 72, - 107, 0, 104, 222, 138, 208, 104, 107, 0, 2, 94, 2, 240, 13, 93, 1, 188, - 96, 35, 7, 80, 100, 1, 188, 98, 79, 0, 23, 162, 0, 2, 94, 2, 240, 13, - 176, 0, 104, 94, 155, 0, 72, 104, 1, 188, 98, 30, 244, 113, 224, 0, - 104, 222, 155, 0, 200, 91, 1, 188, 97, 19, 0, 183, 161, 2, 6, 0, 243, - 0, 8, 87, 1, 188, 96, 19, 0, 183, 161, 1, 188, 96, 3, 0, 17, 238, 0, - 176, 94, 107, 0, 17, 239, 1, 146, 224, 14, 244, 49, 236, 3, 191, 222, - 2, 240, 8, 104, 0, 104, 94, 155, 0, 104, 93, 0, 104, 222, 155, 0, 168, - 104, 1, 152, 96, 6, 61, 17, 232, 0, 224, 32, 171, 0, 136, 42, 0, 232, - 32, 167, 0, 136, 41, 1, 188, 96, 3, 0, 17, 234, 0, 104, 222, 95, 0, - 72, 99, 0, 176, 94, 107, 0, 17, 235, 1, 146, 222, 94, 61, 17, 232, 1, - 135, 96, 2, 61, 17, 232, 0, 104, 222, 155, 0, 168, 103, 1, 135, 96, - 6, 61, 17, 232, 1, 152, 96, 22, 61, 17, 232, 1, 129, 224, 5, 0, 72, - 2, 1, 170, 222, 101, 0, 72, 2, 3, 191, 222, 2, 240, 8, 112, 1, 188, - 98, 15, 0, 17, 224, 1, 188, 96, 3, 0, 17, 228, 1, 129, 224, 1, 0, 104, - 3, 1, 188, 96, 15, 0, 17, 232, 1, 188, 96, 3, 0, 17, 236, 2, 0, 32, - 15, 0, 8, 119, 0, 224, 32, 166, 243, 72, 41, 0, 176, 32, 171, 0, 16, - 37, 0, 232, 32, 166, 4, 168, 41, 0, 106, 160, 167, 1, 200, 119, 1, 184, - 96, 6, 4, 144, 36, 1, 130, 224, 6, 242, 151, 148, 1, 136, 96, 10, 0, - 144, 4, 1, 188, 96, 3, 24, 119, 149, 3, 160, 222, 2, 240, 8, 132, 0, - 104, 94, 79, 6, 168, 137, 1, 56, 82, 3, 0, 23, 128, 0, 176, 94, 95, - 0, 23, 129, 2, 3, 222, 183, 0, 8, 131, 0, 104, 94, 7, 0, 8, 130, 1, - 188, 96, 3, 1, 119, 128, 1, 188, 96, 3, 0, 55, 129, 3, 191, 222, 2, - 240, 8, 131, 1, 188, 96, 3, 1, 87, 128, 0, 2, 94, 2, 240, 0, 219, 0, - 104, 222, 171, 0, 72, 137, 0, 160, 94, 79, 4, 119, 161, 0, 104, 94, - 135, 0, 74, 57, 0, 104, 94, 135, 4, 74, 57, 3, 191, 222, 2, 240, 12, - 1, 3, 134, 222, 2, 240, 10, 142, 2, 135, 192, 55, 0, 10, 141, 0, 2, - 94, 2, 240, 17, 139, 0, 2, 94, 2, 240, 15, 51, 3, 3, 94, 2, 240, 8, - 137, 3, 169, 222, 2, 240, 8, 149, 0, 2, 94, 2, 240, 17, 139, 0, 2, 94, - 2, 240, 15, 51, 2, 7, 64, 55, 0, 8, 143, 3, 134, 222, 2, 240, 10, 142, - 2, 135, 192, 55, 0, 10, 141, 0, 2, 94, 2, 240, 12, 120, 0, 110, 64, - 48, 2, 8, 192, 3, 1, 222, 2, 240, 8, 192, 0, 104, 222, 171, 0, 8, 167, - 3, 43, 94, 2, 240, 8, 155, 0, 224, 2, 43, 0, 32, 138, 3, 191, 222, 2, - 240, 8, 159, 2, 128, 82, 23, 0, 8, 158, 0, 224, 2, 67, 0, 32, 144, 3, - 191, 222, 2, 240, 8, 159, 0, 224, 2, 87, 0, 32, 149, 0, 104, 94, 79, - 4, 11, 112, 0, 104, 94, 79, 2, 139, 112, 0, 104, 94, 79, 2, 9, 240, - 0, 104, 94, 79, 4, 138, 50, 0, 104, 94, 79, 5, 11, 242, 0, 104, 94, - 79, 6, 11, 242, 0, 104, 94, 79, 6, 139, 251, 3, 191, 222, 2, 240, 12, - 1, 0, 104, 222, 171, 0, 40, 184, 3, 43, 94, 2, 240, 8, 171, 0, 224, - 2, 47, 0, 32, 139, 3, 191, 222, 2, 240, 8, 175, 2, 128, 82, 23, 0, 8, - 174, 0, 224, 2, 71, 0, 32, 145, 3, 191, 222, 2, 240, 8, 175, 0, 224, - 2, 91, 0, 32, 150, 0, 104, 94, 79, 6, 169, 196, 0, 104, 94, 79, 4, 44, - 25, 0, 104, 94, 79, 4, 172, 25, 0, 104, 94, 79, 5, 170, 63, 0, 104, - 94, 79, 6, 41, 196, 0, 104, 94, 79, 5, 43, 240, 0, 160, 94, 79, 255, - 119, 161, 0, 104, 94, 135, 7, 44, 12, 3, 191, 222, 2, 240, 9, 233, 0, - 224, 2, 19, 0, 32, 132, 3, 191, 222, 2, 240, 9, 237, 0, 224, 2, 15, - 0, 32, 131, 1, 188, 96, 3, 0, 17, 236, 1, 188, 96, 15, 0, 17, 232, 2, - 132, 192, 59, 0, 8, 107, 1, 132, 224, 6, 9, 16, 72, 3, 191, 222, 2, - 240, 8, 107, 2, 0, 192, 147, 0, 0, 2, 3, 163, 94, 2, 240, 8, 196, 3, - 195, 94, 2, 240, 8, 195, 3, 191, 222, 2, 240, 10, 250, 0, 2, 94, 2, - 240, 17, 139, 0, 2, 94, 2, 240, 15, 51, 2, 7, 192, 175, 0, 8, 200, 2, - 7, 64, 55, 0, 8, 196, 1, 7, 192, 175, 0, 23, 161, 0, 184, 94, 135, 0, - 55, 161, 1, 130, 94, 134, 13, 144, 108, 0, 176, 68, 127, 0, 8, 4, 1, - 131, 96, 2, 9, 16, 72, 2, 135, 192, 55, 0, 10, 141, 3, 134, 222, 2, - 240, 10, 142, 0, 2, 94, 2, 240, 17, 139, 0, 2, 94, 2, 240, 15, 51, 3, - 67, 94, 2, 240, 8, 205, 2, 135, 192, 55, 0, 10, 141, 2, 0, 129, 179, - 0, 8, 235, 1, 128, 96, 6, 242, 151, 148, 3, 1, 222, 2, 240, 8, 235, - 1, 56, 82, 3, 0, 23, 128, 0, 176, 94, 95, 0, 23, 164, 0, 2, 94, 2, 240, - 19, 4, 1, 188, 96, 47, 6, 87, 164, 0, 224, 94, 134, 244, 144, 101, 0, - 224, 90, 3, 0, 54, 128, 3, 176, 94, 2, 240, 8, 223, 0, 224, 2, 7, 0, - 32, 129, 3, 191, 222, 2, 240, 8, 224, 0, 224, 2, 3, 0, 32, 128, 2, 132, - 129, 179, 0, 8, 229, 1, 132, 224, 4, 13, 128, 108, 1, 188, 96, 3, 0, - 0, 110, 1, 188, 96, 3, 0, 0, 111, 3, 191, 222, 2, 240, 8, 234, 0, 232, - 82, 58, 247, 183, 161, 0, 232, 94, 135, 2, 23, 161, 0, 144, 94, 135, - 0, 151, 161, 0, 225, 1, 186, 244, 32, 110, 0, 224, 129, 191, 0, 0, 111, - 0, 176, 82, 59, 0, 23, 189, 3, 1, 222, 2, 240, 9, 1, 2, 128, 129, 179, - 0, 8, 238, 3, 48, 94, 2, 240, 9, 1, 1, 188, 96, 27, 31, 80, 101, 0, - 224, 65, 148, 223, 48, 101, 1, 45, 64, 107, 0, 23, 162, 0, 136, 94, - 139, 1, 55, 162, 1, 56, 64, 43, 0, 22, 128, 2, 136, 64, 39, 0, 8, 245, - 1, 132, 96, 6, 208, 22, 128, 0, 176, 90, 2, 244, 86, 128, 2, 5, 192, - 39, 0, 8, 248, 1, 135, 224, 6, 208, 22, 128, 1, 188, 96, 27, 13, 215, - 161, 0, 2, 94, 2, 240, 0, 206, 0, 176, 64, 103, 0, 22, 129, 1, 188, - 96, 27, 13, 247, 161, 0, 2, 94, 2, 240, 0, 206, 0, 176, 64, 103, 0, - 22, 130, 0, 224, 27, 231, 0, 102, 249, 0, 105, 27, 231, 1, 137, 1, 1, - 188, 96, 3, 0, 6, 249, 2, 0, 129, 179, 0, 9, 3, 2, 5, 1, 179, 0, 10, - 254, 2, 128, 32, 15, 0, 9, 5, 0, 110, 64, 48, 2, 9, 191, 3, 129, 222, - 2, 240, 9, 15, 0, 224, 2, 23, 0, 32, 133, 3, 169, 222, 2, 240, 9, 11, - 1, 132, 224, 6, 9, 16, 72, 1, 128, 224, 2, 9, 16, 72, 1, 132, 224, 2, - 247, 247, 191, 3, 134, 222, 2, 240, 10, 142, 1, 128, 96, 5, 0, 72, 2, - 1, 128, 96, 6, 242, 151, 148, 3, 191, 222, 2, 240, 9, 141, 1, 131, 96, - 2, 247, 247, 191, 3, 134, 222, 2, 240, 10, 142, 3, 43, 94, 2, 240, 9, - 53, 3, 169, 222, 2, 240, 9, 24, 0, 104, 222, 171, 0, 73, 53, 0, 176, - 82, 59, 0, 23, 159, 0, 176, 82, 59, 0, 23, 190, 1, 188, 96, 3, 0, 40, - 14, 3, 191, 222, 2, 240, 9, 53, 2, 135, 94, 83, 0, 9, 66, 3, 160, 222, - 2, 240, 9, 36, 3, 191, 222, 2, 240, 6, 192, 1, 130, 224, 6, 13, 144, - 108, 1, 144, 96, 10, 9, 16, 72, 0, 176, 82, 59, 0, 23, 159, 0, 176, - 82, 59, 0, 23, 190, 1, 158, 94, 131, 0, 176, 235, 1, 6, 82, 15, 0, 23, - 161, 0, 184, 94, 135, 0, 55, 161, 1, 130, 222, 134, 245, 119, 171, 1, - 188, 97, 3, 0, 48, 128, 0, 232, 82, 58, 243, 247, 162, 0, 107, 210, - 58, 243, 233, 39, 0, 232, 94, 126, 145, 215, 162, 0, 144, 94, 139, 0, - 151, 161, 1, 188, 96, 35, 1, 208, 100, 0, 107, 82, 58, 243, 233, 50, - 1, 24, 94, 135, 0, 23, 162, 1, 10, 94, 135, 0, 23, 163, 0, 136, 96, - 6, 244, 87, 162, 0, 224, 65, 146, 244, 112, 100, 0, 176, 88, 2, 244, - 86, 0, 0, 107, 222, 250, 145, 201, 53, 0, 176, 82, 59, 0, 23, 190, 3, - 191, 222, 2, 240, 9, 53, 0, 2, 94, 2, 240, 17, 251, 0, 176, 32, 59, - 0, 40, 14, 0, 176, 82, 59, 0, 23, 159, 3, 32, 222, 2, 240, 9, 66, 2, - 7, 94, 83, 0, 9, 57, 1, 128, 224, 2, 9, 16, 72, 3, 191, 222, 2, 240, - 9, 66, 0, 104, 222, 95, 0, 9, 63, 2, 26, 84, 7, 0, 9, 61, 1, 3, 192, - 39, 0, 23, 161, 1, 130, 94, 134, 16, 208, 134, 1, 2, 192, 39, 0, 23, - 161, 0, 224, 66, 42, 244, 48, 138, 1, 128, 224, 5, 0, 72, 2, 3, 169, - 222, 2, 240, 9, 66, 0, 176, 94, 71, 0, 16, 128, 1, 8, 94, 79, 0, 23, - 161, 0, 104, 94, 135, 0, 41, 97, 3, 171, 94, 2, 240, 9, 101, 2, 0, 82, - 23, 0, 9, 83, 0, 104, 222, 171, 0, 73, 72, 0, 224, 2, 83, 0, 32, 148, - 2, 134, 94, 83, 0, 9, 141, 2, 132, 82, 15, 0, 10, 254, 2, 132, 210, - 15, 0, 9, 77, 3, 172, 94, 2, 240, 9, 81, 3, 191, 222, 2, 240, 9, 90, - 3, 44, 94, 2, 240, 9, 90, 0, 104, 94, 79, 4, 9, 81, 1, 6, 210, 15, 0, - 23, 161, 1, 132, 94, 134, 242, 151, 148, 0, 104, 94, 79, 2, 9, 141, - 3, 191, 222, 2, 240, 9, 125, 3, 30, 222, 2, 240, 9, 87, 3, 49, 94, 2, - 240, 9, 87, 0, 104, 222, 171, 0, 73, 87, 1, 132, 96, 2, 242, 151, 148, - 0, 104, 222, 171, 0, 73, 92, 0, 224, 2, 63, 0, 32, 143, 3, 191, 222, - 2, 240, 9, 95, 0, 104, 94, 171, 0, 73, 95, 2, 128, 82, 47, 0, 9, 141, - 2, 2, 65, 7, 0, 9, 95, 0, 104, 94, 79, 4, 9, 141, 0, 104, 94, 79, 2, - 137, 141, 2, 4, 65, 7, 0, 10, 254, 3, 191, 222, 2, 240, 9, 141, 3, 43, - 94, 2, 240, 9, 141, 0, 104, 94, 79, 5, 169, 125, 0, 104, 94, 79, 5, - 41, 125, 3, 191, 222, 2, 240, 9, 141, 0, 104, 222, 171, 0, 73, 109, - 1, 188, 96, 3, 0, 10, 187, 1, 130, 96, 2, 245, 215, 174, 2, 128, 94, - 255, 0, 9, 107, 0, 104, 43, 103, 0, 9, 109, 0, 224, 68, 101, 91, 10, - 217, 0, 104, 43, 131, 255, 201, 109, 0, 224, 43, 131, 0, 42, 224, 2, - 6, 94, 83, 0, 9, 112, 0, 224, 2, 99, 0, 32, 152, 3, 191, 222, 2, 240, - 9, 141, 3, 35, 222, 2, 240, 9, 120, 1, 41, 80, 11, 0, 23, 163, 0, 104, - 222, 143, 5, 41, 120, 1, 135, 224, 2, 16, 112, 131, 1, 132, 96, 2, 9, - 16, 72, 0, 176, 94, 135, 0, 23, 161, 0, 110, 224, 3, 0, 41, 119, 3, - 209, 222, 2, 240, 9, 120, 0, 104, 222, 171, 0, 73, 122, 0, 224, 2, 39, - 0, 32, 137, 0, 104, 94, 79, 0, 9, 141, 0, 104, 94, 79, 1, 9, 141, 0, - 104, 94, 79, 5, 137, 141, 2, 128, 71, 199, 0, 9, 189, 3, 41, 222, 2, - 240, 9, 131, 1, 2, 222, 175, 0, 23, 161, 1, 6, 82, 15, 0, 23, 162, 0, - 56, 94, 134, 244, 73, 141, 1, 130, 222, 138, 245, 119, 171, 0, 176, - 82, 35, 0, 17, 242, 0, 176, 82, 39, 0, 17, 243, 0, 176, 82, 43, 0, 17, - 244, 1, 6, 82, 15, 0, 23, 161, 0, 224, 94, 135, 0, 49, 245, 0, 176, - 0, 91, 0, 17, 240, 0, 176, 71, 195, 0, 24, 0, 1, 52, 199, 199, 0, 23, - 161, 0, 110, 222, 132, 2, 169, 141, 1, 188, 96, 3, 8, 16, 66, 2, 131, - 193, 7, 0, 9, 143, 2, 128, 94, 83, 0, 10, 254, 0, 176, 64, 51, 0, 23, - 161, 1, 8, 160, 15, 0, 23, 162, 0, 104, 94, 139, 0, 105, 151, 0, 232, - 64, 49, 5, 87, 161, 2, 129, 32, 15, 0, 9, 151, 0, 176, 32, 171, 0, 23, - 161, 2, 128, 160, 15, 0, 9, 151, 0, 176, 94, 99, 0, 23, 161, 0, 110, - 94, 132, 2, 9, 191, 0, 176, 94, 135, 0, 7, 250, 1, 129, 96, 1, 0, 72, - 2, 2, 2, 192, 19, 0, 9, 157, 0, 224, 94, 132, 3, 71, 250, 1, 129, 96, - 5, 0, 72, 2, 2, 1, 32, 15, 0, 9, 184, 1, 3, 94, 83, 0, 23, 161, 1, 135, - 222, 133, 0, 72, 2, 3, 134, 222, 2, 240, 10, 142, 0, 2, 94, 2, 240, - 17, 139, 0, 2, 94, 2, 240, 15, 51, 3, 133, 94, 2, 240, 9, 160, 1, 142, - 96, 2, 61, 17, 232, 1, 7, 199, 131, 0, 23, 161, 1, 130, 94, 133, 0, - 72, 2, 2, 1, 160, 15, 0, 9, 170, 1, 3, 199, 151, 0, 23, 161, 1, 130, - 94, 133, 0, 104, 3, 0, 176, 32, 75, 0, 23, 161, 1, 142, 94, 133, 0, - 104, 3, 2, 7, 192, 175, 0, 12, 92, 1, 188, 96, 3, 0, 17, 236, 1, 188, - 96, 15, 0, 17, 232, 1, 132, 96, 5, 0, 104, 3, 0, 176, 64, 39, 0, 7, - 252, 0, 176, 64, 43, 0, 7, 253, 0, 176, 64, 107, 0, 7, 254, 0, 176, - 64, 111, 0, 7, 255, 1, 132, 96, 5, 0, 104, 3, 0, 2, 94, 2, 240, 12, - 120, 1, 188, 99, 255, 31, 215, 168, 0, 2, 94, 2, 240, 13, 76, 0, 2, - 94, 2, 240, 12, 92, 1, 168, 96, 10, 0, 144, 4, 2, 1, 32, 15, 0, 17, - 230, 0, 168, 64, 19, 0, 80, 4, 3, 191, 222, 2, 240, 6, 30, 0, 224, 2, - 135, 0, 32, 161, 3, 191, 222, 2, 240, 9, 192, 0, 224, 2, 11, 0, 32, - 130, 3, 169, 222, 2, 240, 10, 254, 1, 132, 96, 6, 9, 16, 72, 1, 132, - 224, 6, 9, 16, 72, 3, 191, 222, 2, 240, 10, 254, 3, 43, 94, 2, 240, - 9, 225, 0, 104, 222, 79, 6, 169, 200, 0, 224, 2, 59, 0, 32, 142, 3, - 191, 222, 2, 240, 9, 201, 0, 224, 2, 55, 0, 32, 141, 3, 35, 222, 2, - 240, 9, 233, 0, 104, 222, 78, 241, 201, 233, 1, 135, 224, 2, 16, 112, - 131, 1, 132, 96, 2, 9, 16, 72, 0, 176, 94, 135, 0, 23, 161, 0, 110, - 224, 3, 0, 41, 207, 3, 209, 222, 2, 240, 9, 208, 0, 104, 94, 79, 6, - 41, 223, 1, 188, 96, 3, 0, 8, 57, 3, 41, 94, 2, 240, 9, 213, 2, 3, 222, - 179, 0, 9, 214, 1, 145, 96, 26, 132, 244, 39, 1, 131, 224, 2, 245, 151, - 172, 2, 2, 0, 191, 0, 9, 222, 2, 3, 69, 111, 0, 9, 217, 1, 133, 224, - 6, 43, 113, 91, 2, 4, 94, 179, 0, 9, 222, 1, 135, 224, 2, 16, 112, 131, - 1, 131, 224, 2, 9, 16, 72, 0, 2, 94, 2, 240, 17, 42, 3, 191, 222, 2, - 240, 9, 233, 2, 5, 80, 11, 0, 9, 233, 1, 130, 96, 6, 9, 16, 72, 3, 191, - 222, 2, 240, 9, 233, 2, 135, 0, 195, 0, 9, 230, 0, 104, 222, 79, 6, - 169, 230, 0, 104, 210, 19, 0, 9, 230, 1, 188, 96, 3, 0, 17, 131, 1, - 188, 96, 3, 0, 17, 130, 0, 104, 222, 79, 6, 41, 233, 0, 224, 2, 79, - 0, 32, 147, 3, 191, 222, 2, 240, 9, 233, 3, 171, 94, 2, 240, 9, 235, - 2, 4, 65, 7, 0, 9, 238, 2, 131, 65, 7, 0, 8, 192, 3, 191, 222, 2, 240, - 9, 238, 2, 132, 65, 7, 0, 8, 192, 1, 128, 96, 6, 242, 151, 148, 3, 191, - 222, 2, 240, 8, 192, 3, 159, 94, 2, 240, 9, 243, 3, 158, 222, 2, 240, - 12, 1, 2, 3, 94, 83, 0, 12, 1, 2, 4, 129, 67, 0, 9, 247, 1, 0, 1, 99, - 0, 23, 161, 1, 2, 192, 39, 0, 23, 162, 0, 56, 222, 134, 244, 73, 237, - 3, 171, 94, 2, 240, 9, 249, 2, 0, 82, 23, 0, 9, 237, 2, 128, 82, 47, - 0, 9, 251, 3, 51, 94, 2, 240, 12, 1, 2, 60, 82, 63, 0, 10, 12, 1, 60, - 82, 63, 0, 23, 161, 0, 104, 222, 132, 4, 138, 44, 1, 188, 96, 3, 22, - 16, 100, 1, 188, 96, 31, 22, 16, 101, 0, 104, 94, 135, 0, 42, 8, 0, - 176, 90, 3, 0, 23, 162, 0, 104, 222, 138, 192, 10, 44, 0, 224, 65, 151, - 0, 48, 101, 0, 224, 65, 147, 0, 48, 100, 0, 232, 94, 135, 0, 87, 161, - 0, 106, 94, 135, 0, 42, 1, 0, 104, 94, 135, 0, 10, 13, 1, 56, 90, 3, - 0, 23, 161, 1, 56, 88, 3, 0, 23, 162, 0, 104, 222, 134, 244, 74, 44, - 3, 191, 222, 2, 240, 10, 13, 2, 133, 193, 7, 0, 12, 1, 1, 188, 96, 31, - 21, 240, 101, 1, 188, 96, 3, 5, 183, 164, 0, 2, 94, 2, 240, 1, 12, 2, - 128, 0, 195, 0, 10, 44, 1, 188, 96, 19, 16, 215, 166, 0, 224, 1, 127, - 0, 183, 165, 0, 109, 94, 150, 244, 202, 21, 1, 188, 96, 19, 9, 87, 165, - 0, 104, 94, 148, 11, 202, 48, 0, 176, 1, 123, 0, 16, 101, 0, 176, 82, - 39, 0, 23, 162, 0, 176, 82, 43, 0, 23, 163, 0, 104, 65, 148, 11, 234, - 32, 0, 104, 222, 142, 208, 74, 28, 0, 104, 94, 138, 208, 42, 44, 0, - 224, 65, 151, 0, 176, 101, 0, 109, 65, 150, 244, 202, 25, 1, 188, 96, - 19, 9, 80, 101, 3, 191, 222, 2, 240, 10, 25, 0, 224, 2, 139, 0, 32, - 162, 0, 176, 1, 127, 0, 16, 101, 0, 176, 82, 35, 0, 22, 128, 0, 176, - 82, 39, 0, 22, 129, 0, 176, 82, 43, 0, 22, 130, 1, 188, 82, 2, 242, - 247, 161, 1, 169, 94, 2, 244, 54, 131, 0, 144, 68, 103, 1, 22, 132, - 2, 2, 129, 171, 0, 10, 42, 0, 104, 222, 147, 5, 170, 43, 1, 132, 96, - 6, 208, 150, 132, 0, 176, 94, 151, 0, 0, 95, 2, 7, 129, 171, 0, 10, - 46, 1, 128, 96, 6, 242, 151, 148, 3, 171, 94, 2, 240, 6, 216, 3, 191, - 222, 2, 240, 8, 192, 0, 224, 2, 143, 0, 32, 163, 3, 191, 222, 2, 240, - 9, 237, 3, 158, 222, 2, 240, 12, 1, 3, 171, 94, 2, 240, 10, 53, 2, 0, - 82, 23, 0, 9, 237, 3, 51, 94, 2, 240, 12, 1, 1, 132, 96, 6, 242, 151, - 148, 3, 171, 94, 2, 240, 6, 216, 3, 191, 222, 2, 240, 8, 192, 3, 131, - 94, 2, 240, 10, 60, 0, 2, 94, 2, 240, 17, 139, 0, 109, 64, 51, 3, 138, - 57, 0, 109, 64, 51, 3, 137, 237, 3, 43, 94, 2, 240, 12, 5, 3, 191, 222, - 2, 240, 6, 216, 3, 43, 94, 2, 240, 10, 66, 0, 224, 2, 51, 0, 32, 140, - 3, 191, 222, 2, 240, 6, 218, 0, 224, 2, 75, 0, 32, 146, 1, 3, 192, 39, - 0, 23, 129, 1, 130, 94, 5, 2, 247, 129, 0, 2, 94, 2, 240, 13, 58, 0, - 136, 0, 35, 0, 55, 162, 0, 224, 94, 136, 0, 247, 162, 0, 224, 94, 134, - 244, 81, 137, 1, 134, 224, 6, 48, 17, 128, 3, 191, 222, 2, 240, 9, 233, - 3, 162, 222, 2, 240, 0, 174, 3, 163, 222, 2, 240, 10, 104, 0, 224, 1, - 255, 0, 32, 127, 1, 188, 96, 3, 0, 23, 163, 3, 191, 222, 2, 240, 10, - 106, 1, 135, 96, 4, 3, 16, 160, 1, 188, 96, 3, 0, 81, 228, 0, 176, 71, - 147, 0, 24, 0, 1, 188, 96, 3, 2, 144, 4, 1, 188, 98, 15, 0, 17, 224, - 1, 188, 96, 15, 1, 49, 232, 0, 176, 71, 163, 0, 24, 0, 1, 188, 96, 15, - 0, 17, 232, 1, 188, 96, 3, 1, 49, 236, 0, 176, 71, 179, 0, 24, 0, 1, - 188, 96, 3, 0, 17, 236, 1, 132, 96, 6, 9, 16, 72, 0, 32, 96, 30, 9, - 10, 95, 0, 224, 1, 251, 0, 32, 126, 3, 191, 222, 2, 240, 10, 112, 1, - 188, 96, 3, 14, 215, 161, 1, 20, 0, 99, 0, 23, 162, 0, 224, 94, 134, - 244, 80, 101, 0, 224, 90, 3, 0, 54, 128, 2, 3, 0, 199, 0, 10, 101, 3, - 169, 94, 2, 240, 10, 106, 2, 145, 80, 159, 0, 10, 105, 1, 145, 96, 26, - 132, 244, 39, 3, 191, 222, 2, 240, 10, 105, 0, 224, 1, 255, 0, 32, 127, - 1, 188, 96, 3, 0, 55, 163, 3, 35, 222, 2, 240, 10, 112, 1, 131, 224, - 2, 9, 16, 72, 1, 132, 96, 2, 245, 151, 172, 1, 188, 96, 3, 0, 23, 142, - 1, 135, 224, 2, 16, 112, 131, 1, 130, 96, 2, 9, 16, 72, 3, 208, 222, - 2, 240, 10, 113, 3, 208, 94, 2, 240, 10, 114, 1, 130, 224, 2, 9, 16, - 72, 3, 213, 222, 2, 240, 10, 116, 1, 188, 96, 3, 0, 16, 180, 1, 188, - 96, 3, 0, 247, 161, 0, 104, 0, 167, 0, 10, 120, 1, 133, 66, 26, 244, - 55, 161, 0, 2, 94, 2, 240, 0, 206, 0, 176, 64, 103, 0, 23, 165, 1, 188, - 99, 255, 31, 247, 162, 0, 2, 94, 2, 240, 0, 212, 0, 136, 96, 7, 1, 87, - 164, 0, 184, 94, 134, 244, 151, 161, 0, 2, 94, 2, 240, 0, 212, 2, 131, - 194, 31, 0, 10, 127, 0, 224, 68, 103, 1, 23, 161, 2, 4, 69, 35, 0, 10, - 132, 0, 107, 68, 102, 244, 42, 129, 0, 2, 94, 2, 240, 17, 114, 0, 104, - 94, 143, 0, 0, 2, 0, 104, 1, 179, 0, 10, 136, 1, 188, 96, 3, 0, 4, 238, - 3, 191, 222, 2, 240, 10, 139, 0, 32, 224, 30, 9, 10, 139, 0, 176, 94, - 151, 0, 20, 46, 3, 191, 222, 2, 240, 2, 247, 0, 168, 65, 35, 0, 240, - 72, 3, 191, 222, 2, 240, 0, 2, 1, 131, 96, 2, 9, 16, 72, 1, 188, 96, - 7, 0, 16, 66, 0, 110, 64, 48, 2, 10, 145, 0, 224, 2, 119, 0, 32, 157, - 0, 2, 94, 2, 240, 18, 184, 3, 163, 94, 2, 240, 8, 192, 3, 198, 222, - 2, 240, 10, 148, 1, 132, 224, 6, 9, 16, 72, 3, 191, 222, 2, 240, 10, - 254, 0, 104, 32, 223, 0, 10, 156, 0, 232, 68, 101, 6, 247, 161, 1, 188, - 96, 159, 2, 23, 162, 0, 109, 94, 134, 244, 74, 156, 1, 188, 96, 3, 0, - 8, 55, 0, 2, 94, 2, 240, 11, 29, 0, 32, 225, 2, 9, 0, 155, 0, 32, 98, - 138, 9, 10, 160, 0, 2, 94, 2, 240, 17, 139, 3, 191, 222, 2, 240, 0, - 155, 2, 132, 69, 35, 0, 0, 155, 3, 145, 94, 2, 240, 0, 155, 3, 150, - 222, 2, 240, 0, 155, 3, 150, 94, 2, 240, 0, 155, 0, 2, 94, 2, 240, 11, - 29, 1, 188, 96, 3, 0, 96, 32, 0, 104, 1, 115, 0, 10, 183, 1, 188, 96, - 19, 8, 144, 230, 0, 2, 94, 2, 240, 1, 0, 0, 176, 68, 103, 0, 8, 55, - 0, 176, 1, 115, 0, 16, 228, 1, 188, 96, 3, 0, 0, 6, 1, 188, 96, 3, 0, - 0, 92, 1, 188, 96, 3, 1, 215, 130, 1, 210, 222, 8, 117, 112, 224, 0, - 176, 14, 179, 0, 16, 225, 0, 176, 0, 71, 0, 16, 134, 0, 176, 14, 207, - 0, 16, 138, 1, 188, 96, 3, 0, 55, 129, 0, 2, 94, 2, 240, 13, 45, 1, - 144, 96, 10, 9, 16, 72, 1, 188, 97, 3, 0, 48, 128, 3, 191, 222, 2, 240, - 0, 2, 1, 188, 96, 3, 0, 48, 66, 1, 135, 224, 2, 36, 113, 35, 0, 2, 94, - 2, 240, 16, 141, 1, 188, 96, 3, 6, 119, 128, 0, 104, 13, 239, 0, 10, - 190, 0, 176, 13, 239, 0, 23, 129, 0, 2, 94, 2, 240, 13, 228, 3, 151, - 94, 2, 240, 11, 46, 3, 18, 94, 2, 240, 10, 190, 1, 188, 96, 3, 0, 64, - 32, 1, 188, 97, 131, 0, 17, 37, 0, 176, 0, 123, 0, 17, 39, 1, 188, 96, - 7, 2, 87, 128, 0, 2, 94, 2, 240, 13, 223, 0, 176, 94, 7, 0, 11, 47, - 1, 188, 96, 7, 2, 119, 128, 0, 2, 94, 2, 240, 13, 223, 0, 176, 94, 7, - 0, 11, 48, 1, 188, 96, 19, 9, 151, 161, 0, 2, 94, 2, 240, 0, 206, 0, - 176, 64, 103, 0, 11, 98, 1, 188, 96, 19, 9, 64, 94, 1, 188, 96, 19, - 9, 64, 95, 1, 128, 224, 6, 245, 215, 174, 1, 7, 193, 7, 0, 23, 161, - 1, 128, 94, 134, 245, 119, 171, 1, 188, 96, 15, 0, 17, 232, 1, 188, - 98, 15, 0, 17, 224, 0, 2, 94, 2, 240, 10, 224, 1, 188, 97, 207, 12, - 16, 92, 1, 188, 96, 3, 0, 16, 93, 1, 188, 97, 207, 1, 240, 94, 1, 188, - 96, 59, 10, 240, 95, 0, 2, 94, 2, 240, 16, 81, 1, 188, 96, 3, 0, 8, - 52, 2, 3, 0, 199, 0, 0, 19, 1, 188, 96, 3, 0, 6, 2, 1, 188, 96, 3, 0, - 6, 7, 1, 188, 96, 3, 0, 6, 12, 1, 188, 96, 3, 0, 6, 17, 3, 191, 222, - 2, 240, 0, 19, 1, 188, 96, 3, 0, 16, 72, 1, 133, 224, 2, 245, 183, 173, - 1, 188, 99, 255, 31, 240, 84, 1, 188, 99, 255, 31, 240, 85, 1, 188, - 99, 191, 31, 240, 86, 1, 188, 99, 255, 15, 240, 87, 0, 2, 94, 2, 240, - 18, 184, 1, 135, 224, 6, 36, 113, 35, 1, 188, 96, 3, 0, 16, 84, 1, 188, - 96, 3, 0, 16, 85, 1, 188, 96, 3, 0, 16, 86, 1, 188, 96, 3, 0, 16, 87, - 1, 188, 96, 15, 0, 32, 23, 1, 6, 193, 7, 0, 23, 161, 1, 130, 94, 132, - 2, 224, 23, 1, 7, 65, 7, 0, 23, 161, 0, 184, 94, 135, 0, 55, 161, 1, - 128, 222, 135, 0, 0, 22, 0, 2, 222, 2, 240, 0, 0, 2, 133, 192, 55, 0, - 0, 2, 0, 2, 94, 2, 240, 17, 139, 0, 2, 94, 2, 240, 15, 51, 2, 134, 64, - 55, 0, 10, 243, 0, 224, 2, 27, 0, 32, 134, 3, 134, 222, 2, 240, 10, - 142, 2, 135, 192, 55, 0, 10, 142, 1, 88, 96, 3, 0, 16, 42, 1, 188, 96, - 3, 0, 144, 4, 0, 176, 64, 19, 0, 23, 161, 3, 191, 222, 2, 240, 0, 19, - 1, 184, 96, 10, 4, 144, 36, 3, 170, 94, 2, 240, 11, 1, 1, 88, 96, 3, - 0, 16, 42, 1, 188, 96, 3, 2, 144, 4, 0, 176, 64, 19, 0, 24, 0, 1, 131, - 96, 2, 9, 16, 72, 1, 188, 96, 3, 0, 81, 228, 0, 176, 71, 147, 0, 24, - 0, 1, 188, 98, 15, 0, 17, 224, 1, 128, 96, 1, 0, 104, 3, 0, 2, 94, 2, - 240, 15, 51, 3, 133, 94, 2, 240, 11, 8, 1, 188, 98, 15, 0, 17, 224, - 1, 188, 96, 15, 1, 49, 232, 0, 176, 71, 163, 0, 24, 0, 1, 188, 96, 15, - 0, 17, 232, 1, 188, 96, 3, 1, 87, 161, 0, 232, 94, 135, 0, 55, 161, - 0, 104, 222, 135, 0, 11, 15, 1, 188, 96, 3, 2, 144, 4, 0, 176, 64, 19, - 0, 24, 0, 1, 188, 96, 3, 1, 49, 236, 0, 176, 71, 179, 0, 24, 0, 1, 188, - 96, 3, 0, 17, 236, 3, 36, 222, 2, 240, 6, 30, 1, 134, 96, 6, 245, 119, - 171, 0, 2, 94, 2, 240, 11, 29, 1, 128, 96, 6, 16, 48, 129, 0, 176, 94, - 135, 0, 23, 161, 1, 128, 96, 2, 16, 48, 129, 3, 191, 222, 2, 240, 6, - 30, 1, 188, 97, 3, 0, 16, 128, 0, 176, 66, 3, 0, 24, 0, 0, 110, 224, - 3, 0, 43, 32, 3, 80, 94, 2, 240, 11, 35, 0, 1, 94, 2, 240, 0, 0, 3, - 191, 222, 2, 240, 3, 20, 1, 132, 96, 2, 245, 151, 172, 0, 168, 65, 35, - 4, 240, 72, 1, 130, 96, 2, 9, 16, 72, 2, 6, 222, 175, 0, 11, 41, 3, - 213, 222, 2, 240, 11, 41, 3, 80, 222, 2, 240, 11, 39, 1, 188, 96, 3, - 0, 16, 180, 2, 132, 199, 131, 0, 11, 44, 1, 188, 96, 11, 0, 17, 224, - 1, 142, 96, 2, 245, 119, 171, 0, 2, 222, 2, 240, 0, 0, 3, 162, 222, - 2, 240, 0, 155, 2, 188, 66, 135, 0, 11, 53, 1, 188, 96, 3, 0, 55, 164, - 1, 188, 96, 3, 31, 247, 163, 1, 20, 0, 99, 0, 23, 162, 0, 136, 96, 6, - 244, 87, 162, 3, 191, 222, 2, 240, 11, 58, 0, 136, 96, 7, 1, 23, 164, - 1, 188, 99, 255, 0, 23, 163, 1, 20, 0, 99, 0, 23, 162, 0, 224, 94, 139, - 1, 23, 162, 0, 136, 96, 6, 244, 87, 162, 1, 188, 96, 19, 17, 16, 101, - 1, 188, 96, 27, 2, 80, 100, 1, 188, 96, 3, 0, 23, 165, 0, 32, 194, 134, - 244, 139, 68, 0, 224, 65, 151, 6, 208, 101, 0, 224, 65, 147, 1, 240, - 100, 0, 224, 94, 151, 0, 55, 165, 0, 136, 94, 147, 0, 55, 164, 0, 32, - 94, 146, 244, 107, 99, 3, 191, 222, 2, 240, 11, 61, 0, 104, 222, 146, - 244, 75, 73, 0, 104, 0, 131, 0, 107, 73, 3, 160, 222, 2, 240, 11, 73, - 0, 32, 193, 35, 22, 11, 62, 0, 2, 94, 2, 240, 11, 29, 0, 109, 222, 147, - 32, 11, 95, 2, 3, 0, 199, 0, 11, 83, 0, 109, 222, 151, 0, 139, 83, 1, - 188, 96, 3, 0, 22, 8, 1, 188, 96, 3, 0, 22, 9, 1, 188, 96, 3, 0, 22, - 10, 1, 188, 96, 3, 0, 22, 11, 1, 188, 96, 3, 0, 22, 12, 1, 188, 96, - 3, 0, 22, 13, 1, 188, 96, 3, 0, 22, 14, 2, 0, 90, 195, 0, 11, 94, 2, - 60, 90, 159, 0, 11, 94, 0, 104, 0, 131, 0, 107, 94, 3, 133, 222, 2, - 240, 0, 155, 3, 133, 94, 2, 240, 0, 155, 3, 162, 222, 2, 240, 0, 155, - 3, 163, 222, 2, 240, 0, 155, 3, 151, 222, 2, 240, 0, 155, 0, 176, 65, - 151, 0, 16, 96, 1, 145, 96, 10, 132, 244, 39, 3, 191, 222, 2, 240, 2, - 247, 1, 128, 96, 2, 214, 22, 176, 0, 176, 94, 147, 0, 16, 161, 1, 131, - 96, 2, 247, 247, 191, 1, 188, 96, 3, 0, 48, 67, 3, 191, 222, 2, 240, - 11, 62, 0, 104, 128, 131, 0, 96, 155, 3, 191, 222, 2, 240, 10, 191, - 2, 131, 194, 31, 0, 0, 2, 0, 176, 94, 135, 0, 23, 161, 3, 208, 222, - 2, 240, 5, 38, 1, 188, 96, 3, 4, 16, 66, 3, 158, 222, 2, 240, 0, 19, - 0, 176, 94, 63, 0, 17, 69, 1, 188, 96, 3, 0, 23, 143, 0, 176, 94, 67, - 0, 23, 133, 0, 176, 94, 15, 0, 23, 144, 0, 2, 94, 2, 240, 11, 29, 3, - 191, 222, 2, 240, 0, 19, 0, 109, 64, 51, 5, 137, 238, 3, 172, 94, 2, - 240, 11, 117, 0, 104, 94, 79, 2, 139, 172, 0, 224, 2, 103, 0, 32, 153, - 3, 191, 222, 2, 240, 11, 172, 0, 104, 94, 79, 2, 139, 171, 0, 224, 2, - 95, 0, 32, 151, 1, 133, 96, 2, 245, 183, 173, 1, 130, 96, 2, 245, 215, - 174, 1, 188, 96, 3, 0, 10, 187, 3, 159, 94, 2, 240, 11, 238, 3, 158, - 222, 2, 240, 11, 138, 3, 33, 222, 2, 240, 11, 138, 0, 224, 2, 111, 0, - 32, 155, 0, 2, 94, 2, 240, 11, 29, 1, 134, 96, 2, 9, 16, 72, 1, 128, - 96, 2, 9, 16, 72, 1, 129, 224, 2, 9, 16, 72, 1, 188, 96, 3, 2, 16, 66, - 2, 128, 68, 31, 0, 11, 137, 0, 176, 94, 63, 0, 17, 69, 1, 188, 96, 3, - 0, 23, 143, 0, 176, 94, 67, 0, 23, 133, 0, 176, 94, 15, 0, 23, 144, - 3, 191, 222, 2, 240, 11, 138, 0, 160, 68, 182, 240, 113, 69, 3, 159, - 94, 2, 240, 11, 238, 2, 130, 0, 195, 0, 11, 171, 3, 51, 94, 2, 240, - 11, 171, 0, 176, 0, 115, 0, 23, 161, 0, 224, 94, 134, 176, 23, 161, - 0, 225, 94, 122, 244, 55, 158, 0, 225, 222, 119, 0, 23, 157, 0, 225, - 222, 115, 0, 23, 156, 0, 224, 222, 111, 0, 23, 155, 3, 158, 222, 2, - 240, 11, 155, 0, 110, 94, 110, 146, 75, 238, 0, 109, 94, 110, 146, 75, - 155, 0, 110, 94, 114, 146, 43, 238, 0, 109, 94, 114, 146, 43, 155, 0, - 110, 94, 118, 146, 11, 238, 0, 109, 94, 118, 146, 11, 155, 0, 109, 222, - 122, 145, 235, 238, 0, 176, 68, 103, 0, 8, 51, 0, 176, 68, 107, 0, 8, - 50, 0, 176, 68, 111, 0, 8, 49, 0, 176, 68, 115, 0, 8, 48, 0, 104, 160, - 206, 35, 43, 155, 0, 233, 32, 206, 243, 215, 158, 0, 233, 160, 202, - 243, 183, 157, 0, 233, 160, 198, 243, 151, 156, 0, 232, 160, 194, 243, - 119, 155, 0, 225, 94, 122, 145, 247, 161, 0, 176, 94, 135, 0, 17, 25, - 0, 225, 222, 118, 146, 17, 26, 0, 225, 222, 114, 146, 49, 27, 0, 224, - 222, 110, 146, 81, 28, 0, 104, 222, 134, 35, 43, 164, 1, 188, 96, 3, - 0, 11, 240, 3, 30, 222, 2, 240, 11, 238, 0, 104, 94, 79, 2, 139, 238, - 1, 188, 96, 31, 22, 176, 101, 1, 188, 96, 3, 0, 151, 164, 0, 2, 94, - 2, 240, 1, 12, 0, 104, 222, 147, 0, 139, 219, 2, 133, 0, 195, 0, 11, - 219, 2, 7, 193, 151, 0, 11, 182, 1, 60, 90, 15, 0, 23, 162, 1, 188, - 90, 18, 244, 87, 162, 3, 191, 222, 2, 240, 11, 183, 0, 176, 90, 15, - 0, 23, 162, 1, 188, 96, 3, 0, 17, 50, 3, 44, 94, 2, 240, 11, 189, 2, - 128, 68, 31, 0, 11, 219, 0, 176, 94, 139, 0, 17, 134, 1, 165, 224, 14, - 48, 17, 128, 3, 191, 222, 2, 240, 11, 219, 3, 51, 94, 2, 240, 11, 212, - 2, 155, 64, 47, 0, 11, 212, 2, 0, 68, 7, 0, 11, 206, 2, 0, 196, 7, 0, - 11, 200, 2, 129, 68, 7, 0, 11, 219, 1, 130, 224, 7, 1, 144, 16, 0, 176, - 82, 47, 0, 16, 17, 0, 176, 82, 51, 0, 16, 17, 0, 176, 82, 55, 0, 16, - 17, 0, 176, 94, 139, 0, 17, 15, 3, 191, 222, 2, 240, 11, 219, 1, 130, - 224, 7, 1, 48, 16, 0, 176, 82, 47, 0, 16, 17, 0, 176, 82, 51, 0, 16, - 17, 0, 176, 82, 55, 0, 16, 17, 0, 176, 94, 139, 0, 17, 13, 3, 191, 222, - 2, 240, 11, 219, 1, 130, 224, 7, 0, 208, 16, 0, 176, 82, 47, 0, 16, - 17, 0, 176, 82, 51, 0, 16, 17, 0, 176, 82, 55, 0, 16, 17, 0, 176, 94, - 139, 0, 17, 11, 3, 191, 222, 2, 240, 11, 219, 3, 51, 222, 2, 240, 11, - 215, 0, 176, 94, 139, 0, 17, 11, 3, 191, 222, 2, 240, 11, 219, 3, 52, - 94, 2, 240, 11, 218, 0, 176, 94, 139, 0, 17, 13, 3, 191, 222, 2, 240, - 11, 219, 0, 176, 94, 139, 0, 17, 15, 3, 30, 222, 2, 240, 11, 238, 3, - 159, 94, 2, 240, 11, 238, 0, 104, 94, 79, 2, 139, 238, 3, 51, 94, 2, - 240, 11, 238, 1, 188, 96, 31, 22, 176, 101, 1, 188, 96, 3, 0, 183, 164, - 0, 2, 94, 2, 240, 1, 12, 0, 104, 222, 147, 0, 171, 238, 2, 7, 193, 151, - 0, 11, 231, 1, 60, 90, 7, 0, 23, 136, 1, 60, 90, 11, 0, 23, 161, 3, - 191, 222, 2, 240, 11, 233, 1, 56, 90, 7, 0, 23, 136, 1, 56, 90, 11, - 0, 23, 161, 1, 132, 94, 134, 242, 151, 148, 1, 135, 222, 134, 36, 145, - 36, 2, 6, 128, 243, 0, 11, 238, 1, 132, 96, 2, 242, 151, 148, 1, 135, - 224, 2, 36, 145, 36, 3, 171, 94, 2, 240, 6, 216, 3, 191, 222, 2, 240, - 8, 192, 3, 43, 94, 2, 240, 9, 237, 3, 191, 222, 2, 240, 6, 216, 3, 171, - 94, 2, 240, 11, 245, 3, 44, 94, 2, 240, 9, 237, 3, 191, 222, 2, 240, - 12, 5, 0, 176, 82, 35, 0, 17, 242, 0, 176, 82, 39, 0, 17, 243, 0, 176, - 82, 43, 0, 17, 244, 1, 188, 96, 3, 0, 145, 245, 0, 176, 0, 91, 0, 17, - 240, 3, 191, 222, 2, 240, 6, 216, 1, 56, 82, 63, 0, 23, 161, 2, 6, 94, - 83, 0, 11, 254, 1, 56, 82, 75, 0, 23, 161, 0, 104, 222, 135, 0, 140, - 1, 3, 171, 94, 2, 240, 6, 216, 3, 191, 222, 2, 240, 8, 192, 0, 104, - 222, 79, 2, 12, 4, 2, 7, 129, 171, 0, 12, 4, 1, 128, 96, 6, 242, 151, - 148, 3, 171, 94, 2, 240, 6, 216, 2, 0, 0, 243, 0, 12, 10, 2, 6, 222, - 83, 0, 12, 10, 1, 24, 94, 131, 0, 23, 161, 0, 104, 222, 135, 0, 172, - 10, 1, 188, 96, 11, 2, 81, 66, 2, 0, 82, 23, 0, 9, 237, 3, 191, 222, - 2, 240, 8, 192, 1, 188, 96, 3, 0, 17, 131, 1, 188, 96, 3, 0, 17, 130, - 3, 44, 94, 2, 240, 12, 17, 1, 153, 224, 6, 32, 17, 0, 3, 191, 222, 2, - 240, 12, 21, 1, 25, 64, 47, 0, 23, 161, 0, 104, 94, 135, 0, 9, 233, - 1, 153, 222, 134, 32, 17, 0, 3, 49, 94, 2, 240, 9, 233, 0, 160, 94, - 59, 0, 151, 162, 0, 32, 94, 78, 244, 73, 233, 1, 132, 96, 2, 9, 16, - 72, 3, 191, 222, 2, 240, 9, 233, 3, 43, 94, 2, 240, 9, 233, 0, 104, - 222, 79, 4, 44, 30, 0, 176, 82, 51, 0, 23, 159, 0, 176, 82, 47, 0, 16, - 235, 2, 129, 82, 47, 0, 6, 192, 0, 224, 2, 171, 0, 32, 170, 2, 129, - 82, 47, 0, 9, 201, 3, 41, 94, 2, 240, 12, 36, 2, 3, 222, 179, 0, 12, - 36, 1, 145, 96, 26, 132, 244, 39, 1, 131, 224, 2, 245, 151, 172, 2, - 8, 82, 47, 0, 6, 216, 3, 191, 222, 2, 240, 8, 192, 1, 188, 96, 3, 0, - 16, 103, 1, 188, 96, 3, 0, 16, 70, 1, 128, 224, 6, 9, 48, 73, 2, 130, - 193, 31, 0, 12, 46, 1, 188, 96, 47, 31, 240, 101, 1, 188, 96, 3, 0, - 22, 128, 0, 232, 65, 151, 0, 48, 101, 0, 105, 193, 151, 0, 12, 43, 1, - 188, 96, 11, 0, 23, 148, 1, 188, 96, 3, 0, 23, 171, 1, 188, 96, 3, 0, - 23, 172, 1, 188, 96, 3, 0, 23, 173, 1, 188, 96, 3, 0, 23, 174, 1, 188, - 96, 3, 0, 23, 191, 1, 188, 96, 3, 0, 32, 32, 1, 188, 96, 3, 0, 23, 161, - 0, 2, 94, 2, 240, 0, 206, 1, 56, 64, 103, 0, 0, 40, 1, 28, 64, 103, - 0, 0, 41, 1, 188, 96, 3, 0, 80, 73, 1, 188, 96, 3, 0, 23, 167, 1, 188, - 96, 3, 0, 23, 168, 1, 188, 96, 3, 0, 23, 169, 1, 188, 96, 3, 0, 23, - 172, 1, 188, 96, 3, 0, 23, 173, 1, 130, 224, 6, 15, 16, 120, 2, 6, 193, - 227, 0, 12, 64, 0, 104, 128, 167, 0, 12, 67, 3, 191, 222, 2, 240, 12, - 68, 0, 104, 128, 167, 0, 140, 68, 1, 188, 96, 11, 26, 224, 0, 1, 188, - 97, 231, 3, 32, 1, 1, 188, 99, 211, 3, 128, 2, 1, 188, 96, 151, 11, - 160, 3, 1, 188, 96, 3, 0, 0, 4, 1, 188, 96, 83, 13, 128, 5, 1, 188, - 96, 31, 20, 16, 97, 1, 188, 96, 19, 23, 208, 96, 1, 188, 96, 3, 0, 8, - 40, 0, 176, 94, 15, 0, 23, 133, 0, 160, 68, 182, 240, 113, 69, 2, 135, - 65, 215, 0, 12, 79, 1, 188, 96, 3, 0, 11, 239, 1, 188, 96, 3, 0, 16, - 125, 1, 188, 96, 3, 0, 16, 124, 1, 188, 96, 99, 0, 16, 123, 1, 188, - 96, 3, 0, 16, 122, 1, 172, 96, 127, 0, 16, 117, 1, 188, 99, 71, 8, 151, - 161, 0, 104, 193, 218, 244, 44, 91, 1, 26, 65, 223, 0, 23, 161, 0, 104, - 222, 135, 1, 108, 91, 1, 188, 99, 123, 21, 171, 239, 3, 191, 222, 2, - 240, 10, 165, 1, 136, 94, 92, 255, 135, 252, 1, 188, 96, 31, 31, 80, - 7, 1, 188, 96, 3, 1, 144, 8, 1, 136, 96, 6, 0, 144, 4, 3, 134, 222, - 2, 240, 10, 142, 3, 5, 222, 2, 240, 12, 96, 3, 134, 222, 2, 240, 10, - 142, 3, 133, 222, 2, 240, 12, 98, 0, 176, 94, 135, 0, 23, 161, 0, 110, - 224, 3, 0, 44, 102, 3, 134, 222, 2, 240, 10, 142, 0, 110, 192, 20, 111, - 44, 105, 1, 188, 96, 7, 0, 16, 66, 2, 7, 192, 175, 0, 7, 127, 0, 2, - 222, 2, 240, 0, 0, 3, 33, 94, 2, 240, 12, 111, 0, 224, 32, 98, 244, - 40, 24, 0, 176, 32, 99, 0, 23, 139, 3, 191, 222, 2, 240, 12, 119, 2, - 129, 80, 199, 0, 12, 116, 1, 28, 80, 159, 0, 23, 139, 0, 224, 94, 46, - 244, 55, 139, 1, 156, 94, 46, 132, 244, 39, 3, 191, 222, 2, 240, 12, - 119, 1, 30, 80, 159, 0, 23, 139, 0, 224, 94, 46, 244, 55, 139, 1, 158, - 94, 46, 132, 244, 39, 0, 2, 222, 2, 240, 0, 0, 1, 7, 64, 39, 0, 8, 39, - 0, 224, 32, 159, 0, 40, 39, 0, 2, 222, 2, 240, 0, 0, 0, 176, 90, 3, - 0, 16, 31, 0, 176, 90, 7, 0, 16, 32, 0, 176, 90, 11, 0, 16, 33, 1, 128, - 96, 7, 0, 16, 29, 2, 128, 64, 119, 0, 12, 127, 0, 2, 222, 2, 240, 0, - 0, 1, 135, 224, 2, 245, 119, 171, 3, 145, 94, 2, 240, 0, 2, 0, 32, 227, - 254, 9, 0, 2, 2, 129, 94, 83, 0, 12, 141, 2, 131, 65, 31, 0, 12, 135, - 2, 129, 222, 83, 0, 12, 147, 1, 188, 96, 3, 0, 17, 81, 1, 188, 96, 3, - 0, 17, 82, 1, 188, 98, 3, 0, 17, 83, 1, 188, 96, 3, 0, 81, 80, 1, 137, - 96, 6, 242, 151, 148, 3, 191, 222, 2, 240, 0, 2, 2, 128, 197, 67, 0, - 0, 2, 1, 240, 197, 71, 0, 17, 86, 1, 7, 197, 71, 0, 23, 161, 1, 240, - 197, 74, 244, 49, 85, 1, 137, 96, 10, 242, 151, 148, 1, 188, 96, 3, - 8, 16, 71, 3, 146, 222, 2, 240, 0, 2, 0, 104, 192, 23, 0, 0, 2, 2, 4, - 193, 7, 0, 0, 2, 3, 158, 222, 2, 240, 12, 155, 3, 184, 222, 2, 240, - 0, 2, 0, 176, 1, 127, 0, 23, 161, 0, 104, 222, 132, 11, 192, 2, 3, 191, - 222, 2, 240, 12, 157, 2, 3, 222, 83, 0, 0, 2, 0, 104, 222, 35, 0, 12, - 158, 2, 132, 94, 83, 0, 0, 2, 2, 135, 196, 147, 0, 0, 2, 2, 130, 222, - 187, 0, 12, 161, 0, 104, 42, 255, 0, 12, 164, 0, 104, 43, 135, 255, - 224, 2, 0, 176, 42, 239, 0, 23, 161, 0, 109, 222, 133, 85, 192, 2, 0, - 176, 1, 43, 0, 23, 163, 2, 130, 222, 187, 0, 12, 167, 0, 104, 42, 255, - 0, 12, 168, 0, 224, 94, 141, 92, 55, 163, 0, 176, 68, 11, 0, 23, 161, - 0, 176, 68, 15, 0, 23, 162, 0, 233, 94, 134, 35, 55, 161, 0, 232, 222, - 138, 35, 87, 162, 0, 233, 94, 134, 244, 102, 229, 0, 232, 222, 139, - 0, 8, 20, 0, 176, 68, 31, 0, 24, 0, 0, 136, 68, 35, 1, 87, 163, 0, 144, - 68, 35, 0, 215, 164, 0, 110, 94, 138, 244, 138, 210, 0, 109, 175, 195, - 0, 44, 200, 0, 104, 129, 111, 0, 12, 182, 0, 104, 94, 35, 0, 44, 200, - 0, 104, 0, 39, 0, 44, 200, 0, 232, 94, 35, 0, 55, 161, 0, 105, 222, - 135, 0, 12, 185, 0, 224, 94, 132, 1, 55, 161, 1, 60, 1, 111, 0, 23, - 165, 0, 104, 222, 151, 0, 12, 192, 1, 56, 1, 111, 0, 23, 165, 0, 104, - 94, 151, 0, 12, 196, 0, 232, 94, 151, 0, 55, 161, 0, 104, 94, 135, 0, - 12, 200, 3, 191, 222, 2, 240, 12, 196, 0, 232, 94, 151, 0, 55, 165, - 0, 128, 222, 148, 1, 55, 165, 0, 224, 94, 134, 13, 183, 161, 0, 104, - 94, 135, 0, 12, 200, 0, 225, 27, 150, 244, 102, 229, 0, 224, 160, 82, - 244, 136, 20, 0, 232, 94, 135, 0, 55, 161, 0, 106, 94, 135, 0, 12, 196, - 1, 188, 97, 3, 0, 17, 35, 0, 105, 32, 83, 0, 12, 204, 1, 128, 224, 6, - 242, 151, 148, 3, 191, 222, 2, 240, 12, 206, 1, 128, 224, 2, 242, 151, - 148, 3, 191, 222, 2, 240, 0, 2, 0, 104, 65, 39, 0, 12, 216, 2, 132, - 69, 35, 0, 12, 207, 0, 176, 68, 103, 0, 23, 161, 0, 232, 68, 102, 244, - 55, 162, 0, 109, 94, 139, 0, 76, 209, 3, 146, 222, 2, 240, 10, 210, - 0, 2, 94, 2, 240, 16, 145, 0, 2, 94, 2, 240, 13, 239, 0, 2, 94, 2, 240, - 13, 234, 0, 2, 94, 2, 240, 13, 250, 1, 188, 96, 15, 0, 17, 232, 3, 30, - 222, 2, 240, 12, 223, 1, 188, 96, 3, 0, 16, 92, 1, 188, 96, 3, 0, 144, - 93, 1, 188, 96, 83, 4, 16, 94, 1, 188, 96, 3, 0, 16, 95, 3, 191, 222, - 2, 240, 12, 227, 1, 188, 96, 11, 0, 16, 92, 1, 188, 96, 3, 0, 144, 93, - 1, 188, 96, 67, 4, 16, 94, 1, 188, 96, 3, 0, 16, 95, 1, 188, 96, 3, - 0, 128, 32, 2, 133, 0, 191, 0, 13, 30, 0, 176, 27, 151, 0, 17, 81, 0, - 176, 32, 83, 0, 17, 82, 0, 110, 27, 150, 42, 140, 235, 0, 104, 160, - 83, 0, 12, 235, 0, 224, 27, 150, 35, 40, 21, 3, 191, 222, 2, 240, 12, - 237, 0, 176, 68, 103, 0, 8, 21, 1, 188, 96, 3, 0, 49, 80, 1, 188, 96, - 3, 12, 144, 64, 0, 0, 222, 2, 240, 0, 0, 0, 104, 193, 3, 0, 12, 242, - 2, 128, 69, 67, 0, 12, 237, 0, 107, 68, 101, 2, 172, 237, 1, 188, 96, - 3, 0, 17, 80, 2, 132, 69, 67, 0, 12, 243, 0, 176, 68, 103, 0, 23, 161, - 0, 104, 94, 134, 35, 44, 245, 1, 188, 96, 3, 0, 64, 32, 0, 233, 27, - 150, 42, 55, 161, 0, 232, 160, 82, 42, 87, 162, 0, 225, 68, 102, 244, - 49, 25, 0, 225, 196, 106, 244, 81, 26, 0, 225, 196, 111, 0, 17, 27, - 0, 224, 196, 115, 0, 17, 28, 0, 176, 68, 31, 0, 24, 0, 0, 136, 68, 35, - 1, 87, 163, 0, 144, 68, 35, 0, 215, 164, 0, 176, 68, 11, 0, 23, 161, - 0, 176, 68, 15, 0, 23, 162, 0, 233, 94, 134, 35, 55, 161, 0, 232, 222, - 138, 35, 87, 162, 0, 105, 222, 139, 0, 13, 12, 0, 225, 68, 10, 244, - 113, 2, 0, 224, 196, 14, 244, 145, 3, 0, 224, 42, 239, 0, 42, 187, 0, - 232, 94, 35, 0, 55, 136, 0, 105, 222, 35, 0, 13, 0, 0, 232, 0, 39, 0, - 55, 136, 3, 191, 222, 2, 240, 13, 0, 1, 134, 96, 2, 32, 17, 0, 2, 0, - 222, 83, 0, 13, 32, 1, 128, 224, 2, 242, 151, 148, 0, 2, 94, 2, 240, - 13, 237, 1, 188, 96, 3, 0, 16, 64, 3, 191, 222, 2, 240, 13, 19, 2, 0, - 128, 195, 0, 13, 23, 0, 224, 68, 100, 9, 87, 161, 0, 232, 94, 134, 33, - 55, 161, 0, 108, 196, 102, 244, 45, 21, 3, 191, 222, 2, 240, 13, 32, - 0, 232, 1, 42, 33, 38, 229, 1, 188, 96, 3, 0, 8, 20, 0, 176, 27, 151, - 0, 17, 81, 1, 188, 96, 3, 0, 17, 82, 1, 188, 96, 3, 0, 49, 80, 2, 128, - 69, 67, 0, 13, 28, 3, 191, 222, 2, 240, 12, 247, 1, 188, 96, 3, 0, 16, - 64, 0, 176, 1, 43, 0, 17, 9, 0, 104, 170, 223, 0, 13, 34, 0, 0, 222, - 2, 240, 0, 0, 3, 86, 94, 2, 240, 13, 36, 0, 2, 94, 2, 240, 1, 80, 0, - 176, 1, 47, 0, 17, 9, 1, 188, 97, 207, 12, 16, 92, 1, 188, 96, 3, 0, - 16, 93, 1, 188, 97, 207, 1, 240, 94, 1, 188, 96, 59, 10, 240, 95, 0, - 2, 94, 2, 240, 13, 246, 0, 2, 94, 2, 240, 13, 255, 0, 2, 94, 2, 240, - 13, 243, 3, 191, 222, 2, 240, 10, 210, 1, 136, 94, 6, 16, 208, 134, - 1, 2, 94, 7, 0, 23, 161, 1, 130, 94, 134, 16, 208, 134, 1, 188, 96, - 3, 6, 119, 128, 0, 176, 13, 239, 0, 23, 129, 2, 136, 66, 27, 0, 13, - 52, 0, 176, 13, 235, 0, 23, 129, 0, 104, 94, 7, 0, 13, 54, 0, 2, 94, - 2, 240, 13, 228, 2, 11, 66, 27, 0, 13, 56, 3, 191, 222, 2, 240, 13, - 57, 1, 139, 32, 158, 16, 208, 134, 0, 2, 222, 2, 240, 0, 0, 0, 176, - 84, 19, 0, 23, 161, 2, 0, 222, 7, 0, 13, 65, 0, 176, 65, 139, 0, 16, - 101, 1, 188, 96, 3, 1, 215, 161, 0, 2, 94, 2, 240, 17, 182, 0, 224, - 94, 132, 0, 247, 161, 3, 191, 222, 2, 240, 13, 70, 2, 4, 128, 243, 0, - 13, 70, 2, 2, 94, 7, 0, 13, 70, 2, 128, 94, 7, 0, 13, 70, 0, 144, 0, - 27, 0, 55, 162, 0, 232, 84, 18, 244, 87, 161, 0, 2, 222, 2, 240, 0, - 0, 2, 4, 0, 191, 0, 13, 74, 0, 2, 94, 2, 240, 14, 237, 3, 191, 222, - 2, 240, 13, 75, 0, 160, 68, 182, 240, 177, 69, 0, 2, 222, 2, 240, 0, - 0, 2, 0, 0, 191, 0, 13, 92, 0, 104, 172, 7, 0, 13, 92, 0, 224, 94, 163, - 0, 55, 168, 0, 109, 94, 160, 5, 205, 92, 0, 176, 44, 179, 0, 23, 161, - 0, 2, 94, 2, 240, 0, 206, 0, 176, 64, 103, 0, 23, 162, 0, 104, 222, - 163, 255, 237, 89, 0, 176, 94, 137, 101, 183, 162, 0, 109, 0, 167, 0, - 141, 88, 0, 109, 160, 159, 0, 77, 90, 3, 191, 222, 2, 240, 13, 89, 0, - 104, 160, 159, 0, 13, 90, 0, 184, 94, 137, 101, 183, 162, 0, 2, 94, - 2, 240, 0, 212, 1, 188, 96, 3, 0, 23, 168, 0, 2, 222, 2, 240, 0, 0, - 0, 216, 90, 3, 1, 23, 162, 1, 184, 90, 6, 244, 87, 162, 0, 176, 86, - 3, 0, 8, 60, 0, 176, 86, 7, 0, 8, 61, 0, 176, 86, 11, 0, 8, 62, 0, 176, - 86, 15, 0, 8, 63, 0, 176, 86, 19, 0, 8, 64, 0, 224, 86, 18, 244, 72, - 65, 0, 176, 90, 3, 0, 8, 58, 1, 56, 94, 139, 0, 8, 59, 0, 176, 33, 7, - 0, 23, 164, 1, 188, 96, 3, 0, 23, 162, 0, 176, 65, 147, 0, 16, 101, - 0, 184, 94, 146, 208, 23, 164, 0, 224, 94, 6, 244, 80, 99, 0, 240, 94, - 147, 0, 23, 163, 0, 240, 94, 147, 0, 119, 164, 0, 224, 94, 139, 0, 55, - 162, 0, 184, 94, 146, 244, 119, 164, 0, 224, 65, 146, 244, 80, 101, - 0, 224, 86, 2, 244, 149, 128, 0, 176, 86, 3, 0, 23, 164, 0, 110, 222, - 139, 0, 173, 106, 0, 184, 94, 146, 192, 215, 162, 0, 216, 94, 139, 0, - 55, 162, 0, 224, 32, 242, 244, 72, 60, 0, 176, 32, 243, 0, 23, 164, - 0, 184, 94, 146, 192, 247, 162, 0, 216, 94, 139, 0, 55, 162, 0, 224, - 32, 246, 244, 72, 61, 0, 216, 32, 247, 0, 55, 162, 0, 224, 32, 250, - 244, 72, 62, 0, 216, 32, 251, 0, 55, 162, 0, 224, 32, 254, 244, 72, - 63, 0, 216, 32, 255, 0, 55, 162, 0, 224, 33, 2, 244, 72, 64, 0, 216, - 33, 3, 0, 55, 162, 0, 224, 33, 6, 244, 72, 65, 0, 176, 33, 7, 0, 23, - 162, 0, 184, 94, 138, 192, 23, 162, 0, 144, 94, 139, 0, 55, 162, 1, - 188, 94, 137, 7, 104, 59, 0, 2, 222, 2, 240, 0, 0, 1, 128, 96, 6, 60, - 145, 228, 1, 135, 96, 6, 60, 209, 230, 1, 168, 96, 2, 60, 209, 230, - 1, 139, 96, 2, 60, 209, 230, 0, 176, 94, 143, 0, 16, 99, 0, 176, 86, - 3, 0, 17, 231, 0, 176, 86, 7, 0, 17, 231, 0, 176, 86, 11, 0, 17, 231, - 0, 176, 86, 15, 0, 17, 231, 1, 169, 96, 66, 60, 145, 228, 1, 168, 96, - 2, 60, 209, 230, 1, 139, 96, 6, 60, 209, 230, 0, 176, 94, 139, 0, 16, - 99, 1, 188, 96, 3, 0, 87, 161, 2, 4, 86, 3, 0, 13, 152, 1, 188, 96, - 3, 1, 23, 161, 0, 224, 65, 142, 244, 48, 99, 0, 176, 86, 3, 0, 17, 231, - 0, 176, 86, 7, 0, 17, 231, 0, 176, 86, 11, 0, 17, 231, 0, 176, 94, 139, - 0, 16, 99, 1, 188, 96, 3, 0, 183, 161, 2, 4, 214, 3, 0, 13, 162, 1, - 188, 96, 3, 1, 23, 161, 2, 6, 94, 83, 0, 13, 162, 1, 188, 96, 3, 1, - 151, 161, 0, 224, 65, 142, 244, 48, 99, 0, 176, 86, 3, 0, 17, 231, 0, - 176, 86, 7, 0, 17, 231, 0, 176, 86, 11, 0, 17, 231, 1, 188, 96, 3, 0, - 23, 161, 2, 6, 222, 83, 0, 13, 173, 0, 176, 94, 139, 0, 16, 99, 2, 6, - 94, 83, 0, 13, 172, 0, 160, 86, 63, 1, 247, 161, 3, 191, 222, 2, 240, - 13, 173, 0, 160, 86, 51, 1, 247, 161, 0, 176, 94, 135, 0, 17, 231, 1, - 188, 96, 3, 0, 17, 231, 0, 2, 222, 2, 240, 0, 0, 0, 104, 94, 155, 0, - 205, 202, 1, 188, 96, 7, 2, 17, 227, 0, 104, 222, 155, 0, 77, 189, 0, - 232, 71, 135, 1, 17, 225, 1, 188, 96, 3, 0, 17, 226, 1, 188, 96, 3, - 0, 17, 226, 1, 188, 96, 3, 0, 17, 226, 1, 188, 96, 3, 0, 17, 226, 1, - 188, 96, 3, 0, 17, 226, 1, 188, 96, 3, 0, 17, 226, 1, 188, 96, 3, 0, - 17, 226, 1, 188, 96, 3, 0, 17, 226, 0, 176, 97, 66, 244, 81, 224, 0, - 176, 88, 3, 0, 17, 226, 0, 176, 88, 7, 0, 17, 226, 0, 176, 88, 11, 0, - 17, 226, 0, 176, 88, 15, 0, 17, 226, 0, 176, 88, 19, 0, 17, 226, 0, - 176, 88, 23, 0, 17, 226, 0, 176, 88, 27, 0, 17, 226, 0, 176, 88, 31, - 0, 17, 226, 0, 176, 94, 155, 0, 23, 164, 0, 104, 222, 155, 0, 173, 200, - 1, 188, 96, 3, 0, 119, 164, 1, 146, 222, 147, 2, 23, 163, 0, 2, 222, - 2, 240, 0, 0, 1, 188, 96, 7, 0, 17, 227, 0, 176, 88, 3, 0, 17, 226, - 0, 176, 88, 7, 0, 17, 226, 0, 176, 88, 11, 0, 17, 226, 0, 176, 88, 15, - 0, 17, 226, 0, 176, 88, 19, 0, 17, 226, 0, 176, 88, 23, 0, 17, 226, - 0, 176, 88, 27, 0, 17, 226, 0, 176, 88, 31, 0, 17, 226, 0, 224, 1, 70, - 240, 16, 100, 1, 188, 96, 7, 0, 49, 227, 0, 176, 88, 3, 0, 17, 226, - 0, 176, 88, 7, 0, 17, 226, 0, 176, 88, 11, 0, 17, 226, 0, 176, 88, 15, - 0, 17, 226, 0, 176, 88, 19, 0, 17, 226, 0, 176, 88, 23, 0, 17, 226, - 0, 176, 88, 27, 0, 17, 226, 0, 176, 88, 31, 0, 17, 226, 1, 146, 224, - 27, 0, 23, 163, 0, 2, 222, 2, 240, 0, 0, 2, 135, 64, 195, 0, 13, 223, - 1, 134, 96, 6, 240, 16, 48, 2, 134, 64, 195, 0, 13, 225, 0, 176, 64, - 199, 0, 23, 129, 0, 2, 222, 2, 240, 0, 0, 2, 135, 64, 195, 0, 13, 228, - 0, 176, 94, 7, 0, 16, 49, 1, 134, 224, 6, 240, 16, 48, 0, 2, 222, 2, - 240, 0, 0, 0, 104, 0, 167, 1, 18, 244, 3, 191, 222, 2, 240, 13, 254, - 0, 2, 94, 2, 240, 13, 237, 0, 2, 94, 2, 240, 13, 255, 0, 2, 222, 2, - 240, 0, 0, 0, 104, 0, 167, 1, 18, 189, 0, 2, 222, 2, 240, 0, 0, 1, 129, - 96, 6, 9, 48, 73, 0, 104, 0, 167, 0, 141, 242, 0, 2, 94, 2, 240, 14, - 15, 0, 2, 222, 2, 240, 0, 0, 0, 2, 94, 2, 240, 14, 15, 1, 129, 96, 2, - 9, 48, 73, 0, 2, 222, 2, 240, 0, 0, 1, 136, 224, 14, 9, 48, 73, 0, 176, - 65, 39, 0, 24, 0, 0, 176, 0, 43, 0, 16, 2, 0, 2, 222, 2, 240, 0, 0, - 1, 188, 96, 3, 0, 16, 2, 1, 130, 224, 2, 15, 16, 120, 1, 188, 96, 3, - 0, 16, 73, 0, 176, 65, 39, 0, 24, 0, 0, 2, 222, 2, 240, 0, 0, 0, 104, - 0, 167, 1, 14, 0, 2, 128, 222, 83, 0, 14, 6, 1, 188, 96, 19, 7, 119, - 161, 0, 2, 94, 2, 240, 0, 206, 1, 144, 96, 2, 3, 55, 162, 0, 2, 94, - 2, 240, 0, 212, 0, 2, 222, 2, 240, 0, 0, 1, 188, 96, 19, 7, 151, 161, - 0, 2, 94, 2, 240, 0, 206, 1, 144, 96, 30, 3, 55, 162, 0, 2, 94, 2, 240, - 0, 212, 1, 188, 96, 19, 7, 119, 161, 0, 2, 94, 2, 240, 0, 206, 1, 144, - 96, 30, 3, 55, 162, 0, 2, 94, 2, 240, 0, 212, 0, 2, 222, 2, 240, 0, - 0, 1, 0, 222, 83, 0, 23, 166, 1, 129, 222, 154, 9, 48, 73, 0, 176, 65, - 39, 0, 24, 0, 0, 2, 222, 2, 240, 0, 0, 0, 2, 222, 2, 240, 0, 0, 0, 176, - 68, 103, 0, 23, 162, 1, 125, 94, 138, 35, 87, 163, 0, 176, 28, 119, - 0, 23, 161, 0, 184, 94, 132, 227, 215, 162, 2, 90, 94, 139, 0, 14, 28, - 1, 128, 224, 6, 244, 39, 30, 1, 130, 94, 134, 242, 151, 148, 0, 176, - 94, 143, 0, 7, 27, 2, 0, 28, 123, 0, 14, 99, 0, 232, 94, 140, 227, 119, - 162, 0, 109, 94, 136, 227, 142, 99, 0, 224, 68, 103, 2, 135, 33, 2, - 133, 197, 35, 0, 14, 96, 0, 32, 227, 254, 9, 14, 96, 1, 188, 96, 19, - 9, 151, 161, 0, 2, 94, 2, 240, 0, 206, 0, 104, 192, 103, 0, 14, 96, - 1, 188, 96, 19, 22, 23, 161, 0, 2, 94, 2, 240, 0, 206, 0, 104, 192, - 103, 0, 14, 96, 1, 188, 96, 19, 9, 215, 161, 0, 2, 94, 2, 240, 0, 206, - 0, 104, 192, 103, 0, 14, 96, 1, 188, 99, 255, 31, 247, 161, 0, 104, - 222, 134, 44, 46, 96, 2, 0, 156, 123, 0, 14, 84, 1, 128, 224, 0, 227, - 199, 30, 1, 188, 96, 35, 15, 87, 161, 0, 2, 94, 2, 240, 0, 206, 0, 176, - 64, 103, 0, 119, 164, 0, 176, 94, 147, 0, 23, 162, 0, 2, 94, 2, 240, - 0, 212, 1, 188, 96, 27, 27, 87, 161, 0, 2, 94, 2, 240, 0, 206, 1, 129, - 224, 6, 3, 55, 162, 1, 134, 224, 6, 244, 87, 162, 0, 2, 94, 2, 240, - 0, 212, 1, 188, 96, 23, 20, 215, 161, 1, 188, 96, 3, 0, 183, 162, 0, - 2, 94, 2, 240, 0, 212, 1, 188, 96, 23, 20, 87, 161, 1, 188, 96, 3, 24, - 119, 162, 0, 2, 94, 2, 240, 0, 212, 1, 188, 96, 23, 20, 183, 161, 1, - 188, 96, 3, 0, 247, 162, 0, 2, 94, 2, 240, 0, 212, 1, 188, 96, 23, 16, - 119, 161, 1, 188, 96, 15, 4, 23, 162, 0, 2, 94, 2, 240, 0, 212, 1, 188, - 96, 23, 16, 151, 161, 1, 188, 96, 3, 0, 23, 162, 0, 2, 94, 2, 240, 0, - 212, 1, 188, 96, 23, 16, 183, 161, 1, 188, 96, 11, 0, 23, 162, 0, 2, - 94, 2, 240, 0, 212, 1, 188, 96, 23, 16, 215, 161, 1, 188, 96, 3, 0, - 23, 162, 0, 2, 94, 2, 240, 0, 212, 1, 188, 96, 23, 16, 23, 161, 1, 188, - 96, 11, 0, 55, 162, 0, 2, 94, 2, 240, 0, 212, 1, 188, 96, 35, 15, 87, - 161, 0, 168, 94, 147, 0, 119, 162, 0, 2, 94, 2, 240, 0, 212, 1, 188, - 96, 23, 16, 23, 161, 0, 2, 94, 2, 240, 0, 206, 2, 0, 64, 103, 0, 14, - 89, 0, 108, 196, 100, 228, 46, 32, 3, 191, 222, 2, 240, 14, 96, 1, 188, - 96, 23, 18, 119, 161, 0, 2, 94, 2, 240, 0, 206, 0, 104, 192, 103, 31, - 238, 96, 1, 128, 96, 0, 227, 199, 30, 1, 188, 96, 3, 0, 144, 67, 1, - 128, 96, 0, 227, 199, 30, 1, 130, 96, 2, 242, 151, 148, 1, 128, 224, - 4, 227, 199, 30, 1, 188, 96, 3, 0, 7, 26, 3, 191, 222, 2, 240, 14, 99, - 0, 2, 222, 2, 240, 0, 0, 2, 1, 193, 31, 0, 14, 118, 2, 133, 94, 175, - 0, 14, 105, 1, 133, 96, 6, 245, 119, 171, 0, 176, 68, 103, 0, 8, 36, - 0, 176, 68, 107, 0, 8, 37, 0, 233, 68, 101, 4, 151, 161, 0, 232, 196, - 105, 4, 183, 162, 0, 208, 94, 135, 0, 119, 161, 1, 225, 222, 138, 244, - 55, 162, 0, 233, 94, 134, 38, 151, 161, 0, 232, 222, 138, 38, 183, 162, - 0, 105, 94, 139, 0, 14, 118, 1, 188, 97, 3, 0, 17, 51, 0, 225, 68, 218, - 244, 49, 54, 0, 225, 68, 222, 244, 81, 55, 1, 133, 96, 2, 245, 119, - 171, 1, 188, 96, 3, 1, 16, 71, 1, 188, 96, 3, 0, 80, 67, 0, 2, 222, - 2, 240, 0, 0, 0, 176, 69, 31, 0, 23, 129, 0, 176, 5, 183, 0, 23, 166, - 1, 188, 96, 7, 4, 16, 100, 1, 188, 96, 19, 17, 16, 101, 1, 188, 96, - 3, 0, 23, 161, 2, 5, 222, 175, 0, 14, 143, 0, 176, 88, 15, 0, 23, 128, - 0, 104, 94, 132, 44, 46, 151, 2, 0, 94, 155, 0, 14, 143, 2, 128, 218, - 3, 0, 14, 133, 1, 24, 88, 31, 0, 23, 130, 0, 224, 94, 11, 0, 55, 130, - 1, 152, 94, 10, 192, 246, 7, 3, 191, 222, 2, 240, 14, 136, 1, 26, 88, - 31, 0, 23, 130, 0, 224, 94, 11, 0, 55, 130, 1, 154, 94, 10, 192, 246, - 7, 1, 240, 222, 3, 0, 55, 128, 0, 160, 94, 2, 192, 87, 128, 0, 176, - 94, 3, 0, 22, 3, 0, 160, 68, 182, 240, 23, 130, 0, 176, 94, 11, 0, 22, - 5, 0, 224, 94, 10, 192, 150, 6, 3, 191, 222, 2, 240, 14, 151, 0, 176, - 88, 19, 0, 23, 130, 0, 232, 94, 6, 240, 87, 165, 0, 106, 222, 151, 0, - 14, 149, 0, 232, 88, 22, 244, 182, 5, 0, 105, 216, 23, 0, 14, 149, 1, - 188, 96, 3, 0, 22, 5, 0, 176, 88, 23, 0, 23, 165, 0, 224, 88, 18, 244, - 182, 6, 0, 224, 65, 147, 2, 16, 100, 0, 224, 65, 151, 6, 208, 101, 0, - 224, 94, 135, 0, 55, 161, 0, 144, 94, 155, 0, 55, 166, 0, 104, 222, - 135, 0, 142, 124, 1, 188, 96, 3, 0, 17, 71, 0, 2, 222, 2, 240, 0, 0, - 1, 188, 96, 3, 0, 1, 108, 1, 188, 96, 3, 0, 1, 109, 1, 188, 96, 7, 10, - 16, 100, 1, 188, 96, 3, 0, 119, 161, 0, 176, 66, 143, 0, 23, 128, 0, - 160, 94, 3, 1, 247, 128, 0, 176, 94, 3, 0, 1, 110, 1, 188, 99, 255, - 31, 247, 162, 0, 104, 222, 3, 0, 14, 168, 1, 188, 96, 3, 0, 23, 162, - 0, 136, 96, 6, 244, 55, 129, 0, 32, 5, 186, 240, 46, 173, 0, 104, 222, - 138, 192, 206, 173, 0, 224, 5, 179, 0, 33, 108, 0, 176, 5, 182, 240, - 33, 109, 0, 104, 94, 3, 0, 14, 177, 0, 32, 94, 6, 240, 14, 183, 0, 110, - 222, 138, 192, 206, 183, 3, 191, 222, 2, 240, 14, 178, 0, 109, 222, - 138, 192, 206, 183, 0, 176, 94, 135, 0, 23, 163, 0, 176, 65, 147, 0, - 1, 102, 0, 176, 88, 27, 0, 23, 162, 1, 188, 96, 3, 0, 1, 108, 1, 188, - 96, 3, 0, 1, 109, 0, 232, 65, 147, 2, 16, 100, 0, 232, 94, 135, 0, 55, - 161, 0, 105, 222, 135, 0, 14, 168, 0, 176, 94, 143, 0, 1, 101, 0, 2, - 222, 2, 240, 0, 0, 0, 176, 5, 155, 0, 16, 100, 0, 110, 88, 27, 0, 46, - 192, 0, 224, 88, 27, 0, 49, 69, 3, 191, 222, 2, 240, 14, 193, 0, 232, - 88, 27, 0, 49, 69, 0, 176, 5, 155, 0, 1, 98, 0, 176, 5, 151, 0, 1, 97, - 0, 176, 88, 15, 0, 23, 133, 0, 176, 88, 7, 0, 23, 131, 0, 176, 88, 11, - 0, 23, 132, 1, 24, 88, 31, 0, 23, 140, 1, 26, 88, 31, 0, 23, 141, 0, - 2, 222, 2, 240, 0, 0, 0, 176, 5, 151, 0, 23, 128, 0, 104, 94, 0, 44, - 46, 236, 1, 188, 96, 3, 0, 17, 18, 1, 188, 96, 3, 0, 17, 21, 0, 176, - 5, 155, 0, 16, 100, 2, 0, 69, 35, 0, 14, 214, 0, 176, 69, 31, 0, 23, - 129, 0, 232, 5, 146, 240, 55, 128, 0, 106, 222, 3, 0, 14, 212, 0, 176, - 94, 3, 0, 17, 69, 3, 191, 222, 2, 240, 14, 215, 1, 188, 96, 3, 0, 49, - 69, 3, 191, 222, 2, 240, 14, 215, 0, 176, 5, 147, 0, 17, 69, 0, 176, - 5, 131, 0, 1, 105, 0, 176, 5, 139, 0, 1, 106, 0, 176, 5, 143, 0, 1, - 107, 0, 176, 5, 135, 0, 1, 104, 0, 176, 5, 171, 0, 16, 101, 2, 132, - 90, 31, 0, 14, 224, 0, 176, 94, 23, 0, 22, 131, 1, 152, 94, 50, 208, - 246, 135, 1, 154, 94, 54, 208, 246, 135, 1, 132, 96, 2, 208, 246, 135, - 0, 176, 5, 147, 0, 1, 96, 0, 176, 5, 155, 0, 1, 98, 0, 176, 5, 159, - 0, 1, 99, 0, 176, 5, 151, 0, 1, 97, 0, 176, 5, 139, 0, 16, 100, 0, 176, - 88, 15, 0, 23, 133, 0, 176, 88, 7, 0, 23, 131, 0, 176, 88, 11, 0, 23, - 132, 1, 152, 88, 30, 241, 151, 140, 1, 154, 88, 30, 241, 183, 141, 3, - 191, 222, 2, 240, 14, 236, 0, 2, 222, 2, 240, 0, 0, 0, 176, 5, 139, - 0, 16, 100, 0, 110, 65, 147, 42, 14, 249, 0, 160, 68, 182, 240, 183, - 161, 0, 176, 94, 135, 0, 22, 5, 0, 224, 88, 18, 244, 54, 6, 2, 0, 0, - 243, 0, 14, 246, 0, 109, 65, 147, 40, 14, 246, 2, 0, 222, 175, 0, 14, - 246, 1, 188, 96, 11, 2, 81, 66, 0, 176, 94, 135, 0, 1, 111, 2, 1, 94, - 175, 0, 14, 249, 0, 176, 94, 23, 0, 22, 3, 1, 129, 96, 2, 245, 119, - 171, 0, 2, 222, 2, 240, 0, 0, 2, 1, 69, 35, 0, 15, 4, 2, 135, 196, 147, - 0, 15, 4, 1, 130, 96, 2, 245, 215, 174, 2, 1, 44, 59, 0, 15, 1, 0, 224, - 44, 67, 0, 43, 16, 1, 129, 96, 1, 97, 203, 14, 2, 5, 94, 183, 0, 15, - 4, 0, 224, 42, 239, 0, 42, 187, 1, 133, 96, 2, 245, 183, 173, 0, 2, - 222, 2, 240, 0, 0, 2, 2, 0, 191, 0, 15, 18, 0, 2, 94, 2, 240, 15, 52, - 2, 2, 222, 179, 0, 15, 10, 0, 32, 66, 143, 0, 12, 129, 3, 191, 222, - 2, 240, 0, 2, 2, 136, 129, 171, 0, 15, 18, 2, 132, 94, 255, 0, 15, 8, - 2, 132, 94, 179, 0, 15, 8, 2, 130, 222, 255, 0, 15, 8, 2, 130, 43, 71, - 0, 15, 16, 0, 104, 42, 179, 0, 15, 18, 2, 132, 222, 175, 0, 15, 8, 2, - 131, 94, 183, 0, 15, 8, 0, 176, 94, 135, 0, 23, 161, 0, 2, 222, 2, 240, - 0, 0, 1, 130, 224, 2, 245, 151, 172, 2, 3, 222, 255, 0, 15, 28, 2, 132, - 69, 35, 0, 15, 28, 2, 1, 43, 71, 0, 15, 28, 1, 128, 224, 6, 242, 151, - 148, 0, 2, 94, 2, 240, 14, 15, 1, 128, 224, 2, 242, 151, 148, 0, 2, - 94, 2, 240, 14, 15, 1, 128, 224, 2, 242, 151, 148, 2, 132, 0, 199, 0, - 13, 232, 3, 191, 222, 2, 240, 13, 234, 2, 4, 0, 199, 0, 15, 38, 2, 132, - 197, 111, 0, 15, 50, 2, 132, 69, 35, 0, 15, 35, 2, 0, 66, 3, 0, 15, - 50, 0, 104, 94, 75, 4, 175, 50, 0, 104, 94, 75, 6, 175, 50, 0, 104, - 94, 75, 6, 47, 50, 1, 130, 224, 6, 245, 151, 172, 2, 132, 69, 35, 0, - 15, 41, 3, 35, 222, 2, 240, 15, 42, 1, 131, 224, 6, 245, 151, 172, 1, - 128, 224, 6, 242, 151, 148, 2, 132, 0, 199, 0, 13, 232, 0, 176, 42, - 239, 0, 23, 162, 0, 109, 222, 137, 85, 205, 232, 2, 135, 43, 71, 0, - 13, 234, 2, 0, 94, 255, 0, 13, 232, 2, 135, 171, 71, 0, 13, 234, 3, - 191, 222, 2, 240, 13, 232, 0, 2, 222, 2, 240, 0, 0, 2, 2, 0, 191, 0, - 16, 69, 0, 104, 43, 3, 0, 15, 57, 0, 232, 68, 101, 88, 23, 161, 1, 188, - 99, 247, 29, 23, 162, 0, 109, 94, 134, 244, 79, 57, 0, 232, 68, 102, - 244, 74, 192, 0, 108, 196, 101, 87, 47, 59, 0, 232, 68, 103, 0, 42, - 185, 2, 128, 69, 111, 0, 15, 114, 2, 3, 222, 183, 0, 16, 69, 1, 131, - 224, 2, 245, 183, 173, 2, 2, 222, 179, 0, 15, 65, 1, 131, 96, 6, 43, - 145, 92, 0, 2, 94, 2, 240, 15, 20, 2, 131, 94, 187, 0, 15, 68, 0, 232, - 69, 137, 91, 183, 161, 0, 110, 94, 133, 85, 111, 89, 2, 4, 222, 183, - 0, 15, 85, 0, 224, 43, 175, 0, 42, 235, 1, 188, 96, 3, 0, 10, 237, 0, - 176, 43, 175, 0, 23, 162, 2, 4, 222, 255, 0, 15, 75, 0, 109, 94, 137, - 93, 143, 75, 1, 132, 224, 2, 247, 247, 191, 2, 6, 222, 255, 0, 15, 85, - 0, 224, 43, 223, 2, 10, 247, 0, 176, 68, 103, 0, 11, 2, 1, 24, 43, 223, - 0, 23, 161, 1, 26, 43, 223, 0, 23, 162, 0, 110, 94, 135, 0, 15, 83, - 0, 109, 222, 137, 95, 15, 83, 3, 191, 222, 2, 240, 15, 85, 1, 188, 96, - 3, 0, 10, 247, 1, 134, 224, 2, 247, 247, 191, 2, 2, 94, 255, 0, 16, - 69, 0, 104, 171, 3, 0, 16, 69, 0, 176, 42, 223, 0, 10, 192, 0, 2, 222, - 2, 240, 0, 0, 1, 130, 224, 2, 247, 247, 191, 2, 2, 94, 255, 0, 15, 102, - 2, 6, 0, 199, 0, 15, 95, 2, 128, 43, 235, 0, 15, 95, 0, 176, 43, 67, - 0, 23, 187, 0, 110, 43, 26, 247, 112, 69, 2, 2, 94, 255, 0, 15, 102, - 0, 232, 69, 137, 91, 183, 161, 0, 109, 222, 133, 97, 15, 100, 0, 232, - 68, 101, 97, 55, 161, 0, 109, 94, 133, 97, 79, 102, 0, 176, 68, 103, - 0, 10, 192, 0, 2, 222, 2, 240, 0, 0, 2, 4, 222, 183, 0, 15, 108, 0, - 232, 68, 101, 86, 138, 188, 0, 224, 43, 183, 0, 42, 237, 0, 176, 43, - 187, 0, 23, 161, 0, 109, 43, 182, 244, 47, 108, 1, 188, 96, 3, 0, 10, - 235, 0, 104, 171, 15, 0, 175, 111, 0, 176, 68, 103, 0, 10, 245, 0, 176, - 68, 107, 0, 10, 249, 0, 104, 171, 15, 1, 47, 113, 0, 176, 68, 103, 0, - 11, 17, 0, 2, 222, 2, 240, 0, 0, 2, 3, 222, 183, 0, 15, 121, 2, 130, - 222, 179, 0, 16, 69, 2, 3, 197, 115, 0, 16, 55, 0, 232, 68, 101, 86, - 247, 161, 0, 109, 94, 133, 86, 112, 69, 1, 131, 96, 6, 245, 215, 174, - 3, 191, 222, 2, 240, 16, 69, 1, 188, 96, 3, 0, 10, 221, 0, 109, 69, - 135, 31, 79, 124, 0, 176, 69, 135, 0, 10, 221, 0, 224, 68, 101, 91, - 183, 187, 0, 232, 94, 238, 44, 42, 183, 1, 131, 96, 2, 245, 215, 174, - 1, 131, 224, 6, 245, 183, 173, 1, 132, 224, 2, 245, 183, 173, 1, 130, - 96, 2, 247, 247, 191, 1, 132, 96, 2, 245, 183, 173, 1, 1, 69, 111, 0, - 23, 161, 1, 135, 94, 134, 245, 119, 171, 1, 188, 96, 3, 0, 11, 11, 0, - 232, 68, 101, 86, 247, 161, 0, 109, 94, 133, 94, 143, 134, 0, 109, 94, - 133, 86, 111, 138, 0, 224, 43, 123, 0, 42, 222, 0, 176, 42, 171, 0, - 23, 179, 1, 188, 96, 3, 0, 17, 120, 0, 176, 69, 227, 0, 24, 0, 0, 176, - 69, 231, 0, 10, 202, 1, 188, 96, 3, 0, 49, 120, 0, 176, 69, 227, 0, - 24, 0, 0, 176, 69, 231, 0, 10, 203, 1, 188, 96, 3, 0, 81, 120, 0, 176, - 69, 227, 0, 24, 0, 0, 176, 69, 231, 0, 10, 204, 1, 132, 96, 0, 6, 0, - 48, 2, 7, 171, 51, 0, 15, 151, 1, 132, 96, 4, 6, 0, 48, 0, 176, 43, - 43, 0, 23, 187, 1, 42, 94, 239, 0, 10, 195, 1, 188, 96, 19, 28, 87, - 187, 2, 30, 43, 43, 0, 15, 158, 1, 30, 43, 43, 0, 23, 166, 0, 128, 222, - 154, 247, 119, 187, 0, 176, 65, 183, 0, 23, 179, 0, 110, 43, 15, 1, - 239, 162, 0, 136, 96, 5, 88, 119, 187, 0, 32, 222, 237, 93, 15, 165, - 3, 191, 222, 2, 240, 15, 168, 0, 232, 43, 15, 2, 23, 187, 0, 136, 96, - 6, 247, 119, 187, 0, 32, 94, 237, 93, 47, 168, 1, 132, 96, 6, 245, 183, - 173, 2, 4, 128, 195, 0, 15, 168, 1, 132, 224, 5, 97, 107, 11, 0, 110, - 43, 15, 1, 239, 172, 0, 136, 96, 5, 88, 119, 187, 0, 32, 222, 237, 91, - 79, 175, 3, 191, 222, 2, 240, 15, 176, 0, 232, 43, 15, 2, 23, 187, 0, - 136, 96, 6, 247, 119, 187, 0, 32, 94, 237, 91, 111, 176, 1, 132, 96, - 5, 97, 107, 11, 0, 104, 171, 15, 0, 175, 186, 2, 7, 94, 255, 0, 15, - 186, 1, 44, 43, 51, 0, 23, 163, 0, 109, 222, 141, 96, 239, 186, 0, 104, - 94, 143, 0, 15, 186, 2, 128, 171, 47, 0, 15, 184, 1, 131, 96, 5, 97, - 107, 11, 3, 191, 222, 2, 240, 15, 186, 0, 176, 43, 243, 0, 10, 246, - 0, 176, 68, 107, 0, 10, 253, 2, 129, 171, 235, 0, 15, 199, 0, 104, 171, - 15, 1, 47, 199, 1, 188, 96, 3, 0, 10, 224, 0, 104, 44, 71, 0, 15, 199, - 0, 232, 68, 101, 98, 55, 161, 0, 109, 94, 133, 98, 79, 196, 0, 176, - 44, 75, 0, 23, 162, 0, 224, 94, 137, 98, 119, 162, 0, 109, 222, 134, - 244, 79, 198, 2, 0, 172, 59, 0, 15, 199, 1, 133, 96, 5, 97, 107, 11, - 3, 191, 222, 2, 240, 15, 199, 1, 128, 224, 1, 97, 203, 14, 0, 104, 171, - 15, 1, 15, 202, 0, 176, 42, 223, 0, 10, 215, 1, 135, 224, 6, 247, 247, - 191, 2, 7, 222, 255, 0, 15, 204, 1, 129, 224, 5, 97, 107, 11, 0, 104, - 43, 15, 0, 47, 208, 0, 104, 43, 15, 1, 239, 208, 0, 104, 43, 15, 3, - 15, 208, 0, 104, 171, 15, 0, 143, 213, 1, 130, 96, 6, 247, 247, 191, - 0, 176, 42, 223, 0, 10, 191, 0, 104, 171, 15, 0, 143, 213, 1, 26, 43, - 47, 0, 10, 198, 0, 176, 42, 223, 0, 10, 206, 2, 2, 222, 187, 0, 15, - 219, 2, 132, 222, 255, 0, 15, 216, 2, 6, 222, 255, 0, 15, 219, 0, 176, - 43, 175, 0, 23, 161, 0, 109, 222, 133, 93, 143, 219, 1, 130, 224, 5, - 97, 107, 11, 0, 224, 94, 205, 85, 119, 179, 1, 130, 96, 2, 245, 215, - 174, 0, 176, 44, 67, 0, 23, 161, 0, 176, 42, 239, 0, 23, 162, 0, 109, - 94, 137, 85, 207, 226, 2, 133, 94, 183, 0, 15, 235, 3, 191, 222, 2, - 240, 15, 228, 0, 109, 94, 133, 96, 175, 237, 2, 129, 44, 59, 0, 15, - 235, 0, 176, 68, 11, 0, 23, 163, 0, 176, 68, 15, 0, 23, 162, 0, 233, - 94, 142, 35, 55, 163, 0, 232, 222, 138, 35, 87, 162, 0, 105, 94, 139, - 0, 15, 237, 0, 104, 222, 139, 0, 15, 237, 0, 110, 94, 142, 246, 111, - 237, 1, 130, 96, 6, 245, 215, 174, 0, 2, 94, 2, 240, 17, 77, 1, 188, - 96, 19, 28, 87, 187, 1, 44, 43, 51, 0, 23, 162, 0, 128, 222, 138, 247, - 119, 187, 0, 176, 65, 183, 0, 23, 162, 0, 104, 43, 15, 0, 79, 246, 0, - 104, 43, 15, 2, 79, 246, 0, 104, 43, 15, 2, 111, 246, 0, 104, 43, 15, - 0, 111, 246, 3, 191, 222, 2, 240, 16, 4, 1, 132, 224, 6, 245, 183, 173, - 0, 104, 94, 139, 0, 15, 253, 0, 176, 94, 139, 0, 10, 172, 1, 130, 224, - 6, 245, 215, 174, 0, 224, 43, 195, 0, 42, 240, 0, 110, 94, 137, 96, - 207, 253, 1, 130, 96, 5, 97, 107, 11, 0, 232, 68, 101, 86, 247, 161, - 0, 176, 68, 107, 0, 23, 162, 0, 176, 68, 103, 0, 23, 163, 0, 104, 222, - 138, 35, 79, 253, 0, 233, 94, 142, 244, 42, 180, 0, 232, 222, 139, 0, - 10, 181, 1, 132, 96, 2, 247, 247, 191, 2, 130, 222, 179, 0, 16, 69, - 2, 3, 197, 115, 0, 16, 55, 0, 176, 42, 195, 0, 23, 162, 0, 176, 42, - 203, 0, 23, 163, 0, 104, 171, 15, 0, 144, 17, 2, 128, 43, 235, 0, 16, - 17, 0, 176, 43, 27, 0, 23, 161, 0, 109, 94, 133, 89, 48, 13, 1, 128, - 224, 5, 97, 107, 11, 0, 104, 94, 135, 0, 16, 17, 0, 104, 43, 255, 0, - 16, 17, 0, 176, 43, 255, 0, 23, 162, 0, 176, 44, 3, 0, 23, 163, 0, 104, - 94, 143, 0, 16, 23, 0, 104, 43, 3, 0, 16, 23, 0, 232, 68, 101, 88, 23, - 161, 0, 224, 94, 142, 244, 87, 162, 0, 109, 94, 134, 244, 80, 23, 1, - 129, 96, 5, 97, 107, 11, 2, 129, 171, 71, 0, 16, 28, 2, 0, 94, 255, - 0, 16, 28, 2, 4, 69, 35, 0, 16, 28, 3, 160, 222, 2, 240, 16, 28, 1, - 131, 224, 5, 97, 107, 11, 2, 128, 128, 191, 0, 16, 69, 2, 130, 94, 187, - 0, 16, 69, 2, 130, 43, 235, 0, 16, 49, 2, 129, 172, 47, 0, 16, 49, 2, - 128, 172, 47, 0, 16, 49, 2, 129, 44, 47, 0, 16, 49, 2, 130, 44, 47, - 0, 16, 49, 2, 136, 129, 171, 0, 16, 49, 2, 130, 172, 47, 0, 16, 42, - 2, 128, 43, 47, 0, 16, 49, 2, 131, 44, 47, 0, 16, 42, 2, 133, 44, 47, - 0, 16, 42, 2, 132, 44, 47, 0, 16, 49, 2, 132, 172, 47, 0, 16, 49, 2, - 131, 172, 47, 0, 16, 49, 2, 131, 94, 183, 0, 16, 48, 2, 4, 222, 175, - 0, 16, 48, 2, 129, 222, 187, 0, 16, 48, 1, 132, 224, 2, 245, 119, 171, - 0, 2, 94, 2, 240, 17, 54, 3, 191, 222, 2, 240, 16, 69, 1, 131, 224, - 2, 43, 145, 92, 2, 7, 1, 171, 0, 16, 52, 1, 128, 224, 2, 9, 208, 78, - 1, 188, 96, 3, 24, 81, 120, 0, 176, 69, 227, 0, 24, 0, 1, 128, 96, 2, - 47, 49, 121, 0, 232, 68, 101, 86, 247, 161, 0, 109, 94, 133, 85, 112, - 69, 2, 129, 1, 171, 0, 16, 61, 2, 0, 129, 171, 0, 16, 63, 2, 132, 44, - 47, 0, 16, 63, 2, 128, 172, 47, 0, 16, 63, 1, 131, 96, 2, 43, 145, 92, - 3, 191, 222, 2, 240, 16, 69, 1, 131, 96, 2, 43, 145, 92, 0, 2, 94, 2, - 240, 15, 31, 2, 131, 94, 183, 0, 16, 69, 1, 132, 224, 6, 245, 119, 171, - 0, 224, 43, 63, 0, 42, 207, 3, 191, 222, 2, 240, 17, 30, 0, 2, 222, - 2, 240, 0, 0, 1, 132, 224, 2, 245, 183, 173, 1, 131, 96, 2, 245, 215, - 174, 1, 130, 224, 2, 245, 215, 174, 1, 130, 224, 2, 247, 247, 191, 1, - 132, 224, 2, 247, 247, 191, 1, 188, 96, 3, 0, 10, 217, 1, 188, 96, 3, - 0, 10, 206, 1, 188, 96, 3, 0, 10, 198, 1, 188, 96, 3, 0, 10, 240, 1, - 135, 96, 1, 96, 43, 1, 0, 2, 222, 2, 240, 0, 0, 2, 2, 0, 191, 0, 16, - 125, 2, 131, 222, 255, 0, 16, 140, 1, 131, 224, 6, 247, 247, 191, 1, - 188, 96, 3, 2, 17, 93, 0, 176, 42, 175, 0, 17, 94, 1, 133, 96, 6, 11, - 112, 91, 1, 133, 96, 6, 11, 240, 95, 2, 128, 69, 107, 0, 16, 94, 1, - 139, 96, 2, 43, 145, 92, 1, 188, 96, 3, 24, 81, 120, 0, 176, 69, 227, - 0, 24, 0, 1, 128, 96, 2, 47, 49, 121, 1, 136, 96, 14, 43, 81, 90, 1, - 188, 96, 3, 0, 55, 163, 0, 2, 94, 2, 240, 17, 104, 0, 104, 42, 211, - 0, 16, 99, 1, 132, 96, 6, 247, 247, 191, 1, 188, 96, 3, 0, 10, 180, - 0, 2, 94, 2, 240, 16, 70, 0, 232, 68, 105, 96, 151, 161, 0, 110, 222, - 135, 0, 48, 107, 0, 176, 43, 239, 0, 10, 246, 1, 188, 96, 3, 0, 10, - 245, 0, 104, 43, 3, 0, 16, 107, 0, 176, 68, 103, 0, 10, 191, 0, 232, - 68, 101, 86, 10, 192, 2, 128, 128, 191, 0, 16, 113, 2, 129, 222, 187, - 0, 16, 120, 2, 0, 69, 111, 0, 16, 113, 2, 131, 197, 115, 0, 16, 113, - 1, 188, 99, 255, 31, 247, 161, 0, 104, 197, 134, 244, 48, 120, 1, 139, - 96, 14, 43, 145, 92, 1, 188, 96, 3, 24, 81, 120, 0, 176, 69, 227, 0, - 24, 0, 1, 139, 43, 70, 47, 49, 121, 1, 131, 224, 2, 245, 183, 173, 1, - 132, 224, 2, 245, 119, 171, 3, 191, 222, 2, 240, 17, 41, 1, 131, 96, - 2, 43, 145, 92, 0, 2, 94, 2, 240, 15, 31, 1, 131, 224, 6, 245, 183, - 173, 1, 132, 224, 6, 245, 119, 171, 3, 191, 222, 2, 240, 17, 41, 1, - 141, 96, 2, 11, 240, 95, 1, 136, 96, 14, 43, 81, 90, 2, 129, 129, 171, - 0, 16, 133, 1, 139, 96, 6, 43, 145, 92, 1, 188, 96, 3, 24, 81, 120, - 0, 176, 69, 227, 0, 24, 0, 1, 128, 96, 2, 47, 49, 121, 3, 191, 222, - 2, 240, 16, 137, 1, 139, 96, 2, 43, 145, 92, 1, 188, 96, 3, 24, 81, - 120, 0, 176, 69, 227, 0, 24, 0, 1, 128, 96, 2, 47, 49, 121, 1, 131, - 224, 2, 245, 183, 173, 1, 132, 224, 2, 245, 119, 171, 0, 2, 94, 2, 240, - 16, 70, 0, 2, 222, 2, 240, 0, 0, 0, 176, 68, 107, 0, 11, 4, 2, 2, 222, - 179, 0, 16, 145, 1, 131, 96, 6, 43, 145, 92, 0, 2, 94, 2, 240, 15, 20, - 2, 2, 0, 191, 0, 16, 161, 1, 131, 224, 2, 247, 247, 191, 2, 3, 197, - 115, 0, 16, 154, 2, 0, 128, 191, 0, 16, 154, 1, 139, 96, 14, 43, 145, - 92, 1, 188, 96, 3, 24, 81, 120, 0, 176, 69, 227, 0, 24, 0, 1, 139, 43, - 70, 47, 49, 121, 3, 191, 222, 2, 240, 16, 158, 1, 139, 96, 2, 43, 145, - 92, 1, 188, 96, 3, 24, 81, 120, 0, 176, 69, 227, 0, 24, 0, 1, 128, 96, - 2, 47, 49, 121, 1, 130, 224, 2, 245, 151, 172, 1, 188, 96, 3, 0, 23, - 163, 0, 2, 94, 2, 240, 17, 104, 0, 2, 222, 2, 240, 0, 0, 1, 188, 96, - 3, 0, 112, 16, 1, 188, 99, 255, 31, 240, 197, 1, 188, 99, 255, 31, 240, - 203, 0, 176, 64, 71, 0, 16, 229, 0, 176, 64, 71, 0, 16, 235, 1, 188, - 96, 3, 0, 144, 16, 1, 188, 99, 255, 31, 240, 198, 1, 188, 99, 255, 31, - 240, 204, 0, 176, 64, 71, 0, 16, 230, 0, 176, 64, 71, 0, 16, 236, 1, - 188, 96, 3, 0, 176, 16, 1, 188, 99, 255, 31, 240, 199, 1, 188, 99, 255, - 31, 240, 205, 0, 176, 64, 71, 0, 16, 231, 0, 176, 64, 71, 0, 16, 237, - 1, 188, 96, 3, 0, 16, 16, 0, 176, 64, 67, 0, 24, 0, 1, 188, 99, 255, - 31, 240, 200, 0, 176, 64, 71, 0, 16, 232, 1, 188, 96, 3, 0, 48, 16, - 0, 176, 64, 67, 0, 24, 0, 1, 188, 99, 255, 31, 240, 201, 0, 176, 64, - 71, 0, 16, 233, 1, 188, 96, 3, 0, 80, 16, 0, 176, 64, 67, 0, 24, 0, - 1, 188, 99, 255, 31, 240, 202, 0, 176, 64, 71, 0, 16, 234, 0, 2, 222, - 2, 240, 0, 0, 1, 188, 96, 3, 0, 55, 162, 0, 32, 227, 254, 9, 16, 253, - 0, 32, 224, 66, 13, 144, 253, 2, 128, 66, 3, 0, 16, 253, 2, 132, 69, - 35, 0, 16, 253, 3, 145, 94, 2, 240, 16, 253, 0, 104, 171, 103, 0, 16, - 253, 2, 130, 222, 255, 0, 16, 253, 2, 128, 94, 255, 0, 17, 50, 2, 1, - 128, 199, 0, 17, 41, 2, 130, 222, 179, 0, 16, 253, 2, 4, 128, 199, 0, - 16, 233, 0, 104, 94, 139, 0, 16, 213, 0, 176, 43, 155, 0, 23, 161, 0, - 110, 171, 130, 244, 48, 213, 2, 3, 197, 115, 0, 16, 233, 0, 104, 42, - 179, 0, 16, 212, 0, 104, 42, 211, 0, 16, 213, 0, 232, 68, 101, 86, 151, - 161, 0, 232, 42, 178, 244, 55, 161, 0, 106, 222, 133, 85, 176, 233, - 0, 106, 222, 133, 91, 16, 233, 0, 104, 42, 255, 0, 16, 233, 2, 3, 222, - 83, 0, 16, 216, 0, 176, 43, 159, 0, 10, 173, 3, 191, 222, 2, 240, 17, - 41, 1, 188, 96, 3, 2, 87, 146, 1, 188, 99, 255, 31, 240, 195, 1, 188, - 96, 3, 9, 16, 227, 1, 134, 94, 138, 28, 112, 227, 1, 132, 96, 6, 28, - 112, 227, 0, 104, 43, 7, 0, 16, 223, 1, 133, 224, 6, 28, 112, 227, 1, - 188, 96, 3, 3, 151, 130, 0, 2, 94, 2, 240, 17, 7, 1, 188, 99, 255, 31, - 240, 196, 0, 176, 84, 19, 0, 16, 228, 0, 224, 67, 145, 91, 240, 228, - 0, 2, 94, 2, 240, 16, 162, 1, 188, 96, 3, 0, 16, 238, 1, 188, 99, 255, - 31, 240, 206, 0, 224, 43, 7, 0, 42, 193, 3, 191, 222, 2, 240, 16, 247, - 2, 131, 94, 183, 0, 16, 253, 1, 188, 96, 35, 8, 144, 230, 0, 2, 94, - 2, 240, 1, 0, 0, 176, 94, 207, 0, 16, 228, 0, 104, 42, 179, 0, 16, 244, - 0, 176, 42, 243, 0, 16, 228, 2, 128, 69, 111, 0, 16, 244, 0, 232, 68, - 101, 86, 151, 161, 0, 232, 42, 178, 244, 55, 161, 0, 105, 94, 135, 0, - 16, 244, 0, 224, 94, 133, 87, 144, 228, 1, 188, 96, 3, 1, 215, 130, - 0, 2, 94, 2, 240, 17, 7, 3, 191, 222, 2, 240, 16, 247, 0, 176, 0, 71, - 0, 16, 134, 0, 2, 94, 2, 240, 17, 169, 0, 2, 94, 2, 240, 13, 45, 1, - 144, 96, 10, 9, 16, 72, 1, 132, 96, 6, 245, 151, 172, 1, 188, 97, 51, - 0, 112, 128, 0, 2, 222, 2, 240, 0, 0, 2, 128, 94, 255, 0, 17, 2, 2, - 129, 222, 187, 0, 17, 2, 2, 1, 128, 199, 0, 17, 41, 2, 4, 128, 199, - 0, 17, 41, 1, 128, 96, 2, 247, 247, 191, 2, 128, 194, 143, 0, 17, 42, - 2, 1, 222, 187, 0, 17, 42, 1, 188, 96, 3, 0, 23, 162, 3, 191, 222, 2, - 240, 16, 191, 1, 188, 99, 255, 31, 240, 192, 1, 188, 99, 255, 31, 240, - 193, 2, 133, 222, 255, 0, 17, 23, 0, 104, 94, 75, 6, 49, 16, 0, 176, - 43, 79, 0, 23, 161, 0, 109, 171, 6, 244, 49, 23, 1, 188, 96, 3, 1, 55, - 128, 0, 176, 43, 83, 0, 23, 161, 0, 109, 43, 6, 244, 49, 18, 2, 129, - 43, 235, 0, 17, 18, 1, 188, 96, 3, 1, 119, 128, 1, 188, 96, 3, 0, 55, - 129, 0, 2, 94, 2, 240, 0, 219, 1, 210, 222, 10, 160, 48, 224, 0, 176, - 84, 11, 0, 16, 225, 3, 191, 222, 2, 240, 17, 29, 2, 128, 171, 235, 0, - 17, 16, 1, 188, 96, 3, 1, 87, 128, 1, 188, 96, 3, 0, 23, 129, 0, 2, - 94, 2, 240, 0, 219, 0, 176, 84, 7, 0, 16, 224, 0, 136, 94, 11, 0, 112, - 225, 0, 2, 222, 2, 240, 0, 0, 0, 104, 43, 11, 0, 17, 41, 2, 4, 222, - 175, 0, 17, 41, 0, 232, 68, 101, 88, 87, 164, 0, 110, 94, 145, 85, 177, - 41, 0, 136, 94, 147, 0, 55, 164, 0, 109, 94, 145, 85, 177, 41, 0, 2, - 94, 2, 240, 17, 93, 3, 191, 222, 2, 240, 17, 54, 0, 232, 68, 101, 88, - 87, 164, 0, 136, 94, 147, 0, 55, 164, 0, 2, 94, 2, 240, 17, 93, 3, 191, - 222, 2, 240, 17, 54, 2, 132, 222, 175, 0, 17, 45, 1, 129, 224, 2, 245, - 215, 174, 3, 191, 222, 2, 240, 17, 54, 0, 104, 43, 127, 0, 17, 50, 0, - 224, 68, 101, 91, 234, 217, 0, 104, 43, 131, 0, 17, 49, 0, 224, 68, - 101, 91, 10, 217, 0, 2, 222, 2, 240, 0, 0, 1, 128, 96, 6, 247, 247, - 191, 0, 104, 43, 11, 0, 17, 54, 0, 232, 68, 101, 88, 87, 164, 0, 2, - 94, 2, 240, 17, 93, 1, 132, 96, 2, 245, 151, 172, 1, 188, 96, 3, 0, - 10, 194, 1, 188, 96, 3, 0, 10, 217, 1, 188, 96, 3, 0, 10, 193, 1, 4, - 222, 175, 0, 23, 161, 1, 131, 94, 134, 245, 183, 173, 2, 132, 222, 175, - 0, 17, 63, 1, 128, 96, 6, 13, 144, 108, 0, 2, 222, 2, 240, 0, 0, 0, - 176, 42, 167, 0, 23, 163, 2, 4, 0, 195, 0, 17, 66, 0, 176, 42, 199, - 0, 23, 163, 2, 2, 222, 187, 0, 17, 68, 0, 176, 42, 163, 0, 23, 163, - 0, 224, 68, 102, 244, 106, 185, 0, 176, 68, 103, 0, 11, 9, 1, 131, 224, - 2, 43, 145, 92, 2, 7, 1, 171, 0, 17, 73, 1, 128, 224, 2, 9, 208, 78, - 1, 188, 96, 3, 24, 81, 120, 0, 176, 69, 227, 0, 24, 0, 1, 128, 96, 2, - 47, 49, 121, 0, 2, 222, 2, 240, 0, 0, 2, 2, 222, 179, 0, 17, 80, 1, - 131, 96, 6, 43, 145, 92, 0, 2, 94, 2, 240, 15, 20, 2, 3, 197, 115, 0, - 17, 85, 2, 132, 222, 175, 0, 17, 85, 2, 129, 222, 187, 0, 17, 85, 2, - 128, 94, 255, 0, 17, 85, 2, 3, 94, 183, 0, 17, 92, 1, 139, 96, 14, 43, - 145, 92, 1, 188, 96, 3, 24, 81, 120, 0, 176, 69, 227, 0, 24, 0, 1, 139, - 43, 70, 47, 49, 121, 1, 131, 96, 6, 245, 183, 173, 1, 132, 224, 2, 245, - 119, 171, 1, 188, 96, 3, 0, 10, 193, 0, 2, 222, 2, 240, 0, 0, 0, 104, - 43, 115, 0, 17, 95, 0, 176, 43, 115, 0, 23, 164, 0, 109, 94, 145, 86, - 17, 97, 0, 176, 42, 195, 0, 23, 164, 0, 136, 43, 31, 0, 55, 165, 0, - 232, 43, 34, 244, 170, 200, 0, 136, 94, 147, 0, 55, 164, 0, 224, 43, - 34, 244, 138, 200, 0, 144, 43, 35, 0, 170, 199, 0, 176, 43, 31, 0, 10, - 173, 0, 2, 222, 2, 240, 0, 0, 2, 3, 44, 63, 0, 17, 113, 2, 135, 65, - 215, 0, 17, 105, 1, 188, 96, 99, 0, 16, 123, 1, 188, 96, 7, 0, 16, 122, - 1, 172, 96, 127, 28, 16, 117, 2, 135, 65, 215, 0, 17, 109, 1, 132, 94, - 142, 14, 208, 118, 1, 172, 96, 191, 28, 16, 117, 2, 135, 65, 215, 0, - 17, 112, 0, 2, 222, 2, 240, 0, 0, 2, 134, 65, 7, 0, 17, 114, 1, 188, - 96, 19, 9, 23, 161, 0, 2, 94, 2, 240, 0, 206, 1, 135, 96, 6, 3, 55, - 162, 0, 2, 94, 2, 240, 0, 212, 0, 176, 94, 135, 0, 23, 161, 0, 176, - 94, 135, 0, 23, 161, 0, 176, 94, 135, 0, 23, 161, 1, 135, 96, 2, 244, - 87, 162, 0, 2, 94, 2, 240, 0, 212, 1, 188, 96, 19, 9, 87, 161, 0, 2, - 94, 2, 240, 0, 206, 1, 128, 96, 6, 3, 55, 162, 0, 2, 94, 2, 240, 0, - 212, 0, 224, 2, 179, 0, 32, 172, 1, 128, 96, 2, 244, 87, 162, 0, 2, - 94, 2, 240, 0, 212, 1, 188, 96, 39, 8, 87, 161, 0, 2, 94, 2, 240, 0, - 206, 0, 104, 192, 103, 1, 241, 138, 1, 188, 96, 3, 0, 23, 162, 0, 2, - 94, 2, 240, 0, 212, 1, 188, 96, 3, 1, 247, 162, 0, 2, 94, 2, 240, 0, - 212, 0, 2, 222, 2, 240, 0, 0, 3, 144, 94, 2, 240, 17, 158, 3, 135, 94, - 2, 240, 17, 158, 3, 144, 222, 2, 240, 17, 158, 2, 4, 69, 35, 0, 17, - 149, 2, 131, 194, 31, 0, 17, 158, 0, 104, 160, 179, 0, 17, 146, 0, 176, - 68, 103, 0, 8, 44, 0, 232, 68, 101, 5, 151, 161, 0, 110, 94, 135, 125, - 17, 153, 3, 191, 222, 2, 240, 17, 159, 2, 134, 192, 55, 0, 17, 158, - 0, 224, 68, 103, 0, 215, 161, 2, 6, 64, 55, 0, 17, 158, 0, 108, 196, - 102, 244, 49, 151, 0, 2, 94, 2, 240, 11, 29, 0, 2, 94, 2, 240, 17, 114, - 1, 188, 96, 3, 0, 8, 44, 0, 2, 94, 2, 240, 10, 224, 3, 191, 222, 2, - 240, 0, 19, 1, 188, 96, 3, 0, 8, 44, 0, 2, 222, 2, 240, 0, 0, 2, 128, - 66, 3, 0, 17, 168, 2, 133, 69, 35, 0, 17, 167, 2, 133, 222, 183, 0, - 17, 165, 1, 133, 224, 6, 245, 183, 173, 0, 224, 68, 107, 0, 43, 32, - 0, 108, 196, 105, 100, 17, 168, 0, 2, 94, 2, 240, 17, 114, 1, 133, 224, - 2, 245, 183, 173, 0, 2, 222, 2, 240, 0, 0, 1, 12, 129, 67, 0, 23, 161, - 1, 188, 96, 3, 0, 80, 138, 0, 104, 94, 7, 0, 17, 173, 0, 104, 94, 135, - 0, 17, 173, 0, 104, 94, 7, 0, 17, 181, 1, 144, 66, 42, 161, 48, 138, - 0, 104, 94, 7, 0, 49, 181, 1, 144, 66, 42, 160, 16, 138, 1, 9, 222, - 3, 0, 23, 162, 1, 143, 94, 138, 17, 80, 138, 0, 104, 94, 139, 0, 17, - 181, 1, 145, 224, 14, 17, 80, 138, 0, 2, 222, 2, 240, 0, 0, 1, 9, 222, - 3, 0, 23, 164, 0, 224, 90, 6, 244, 151, 165, 0, 144, 94, 150, 244, 151, - 165, 2, 3, 222, 3, 0, 17, 189, 2, 130, 222, 3, 0, 17, 189, 1, 188, 97, - 239, 8, 87, 166, 0, 128, 222, 150, 244, 215, 165, 1, 22, 222, 135, 0, - 23, 163, 0, 136, 94, 135, 0, 119, 161, 0, 225, 94, 135, 2, 215, 161, - 0, 224, 222, 143, 0, 23, 163, 1, 188, 96, 3, 0, 23, 162, 2, 14, 94, - 3, 0, 17, 196, 1, 188, 96, 3, 0, 55, 162, 0, 144, 94, 150, 244, 87, - 165, 0, 128, 222, 150, 244, 55, 161, 0, 225, 65, 183, 255, 247, 166, - 0, 225, 222, 135, 1, 247, 161, 0, 128, 222, 150, 244, 119, 163, 0, 225, - 222, 134, 13, 183, 161, 0, 224, 222, 143, 0, 23, 163, 1, 122, 94, 134, - 244, 119, 161, 0, 136, 94, 134, 244, 87, 161, 0, 176, 94, 135, 0, 23, - 162, 2, 135, 222, 3, 0, 17, 209, 0, 136, 94, 135, 0, 87, 161, 3, 191, - 222, 2, 240, 17, 222, 2, 135, 94, 3, 0, 17, 216, 1, 188, 99, 155, 12, - 215, 165, 0, 128, 222, 134, 244, 183, 161, 0, 225, 65, 183, 255, 247, - 165, 0, 224, 222, 135, 0, 23, 161, 0, 136, 94, 135, 0, 87, 161, 3, 191, - 222, 2, 240, 17, 222, 0, 136, 94, 135, 0, 87, 161, 1, 188, 99, 155, - 12, 247, 165, 0, 128, 222, 134, 244, 183, 161, 1, 188, 98, 3, 0, 23, - 165, 0, 225, 65, 182, 244, 183, 165, 0, 224, 222, 135, 0, 23, 161, 0, - 224, 94, 132, 0, 215, 161, 0, 2, 222, 2, 240, 0, 0, 2, 0, 32, 15, 0, - 0, 19, 2, 130, 222, 83, 0, 17, 230, 1, 136, 96, 2, 4, 144, 36, 0, 224, - 32, 170, 243, 8, 42, 0, 232, 32, 166, 243, 8, 41, 3, 191, 222, 2, 240, - 9, 141, 1, 184, 96, 22, 4, 144, 36, 1, 188, 96, 3, 1, 208, 37, 3, 5, - 94, 2, 240, 17, 248, 2, 135, 192, 55, 0, 10, 141, 3, 134, 222, 2, 240, - 10, 142, 0, 2, 94, 2, 240, 15, 51, 0, 2, 94, 2, 240, 17, 139, 3, 92, - 222, 2, 240, 17, 232, 0, 216, 64, 155, 1, 23, 161, 0, 224, 94, 135, - 2, 55, 152, 0, 168, 94, 99, 0, 119, 152, 1, 2, 222, 83, 0, 23, 161, - 1, 130, 224, 2, 242, 151, 148, 1, 136, 222, 133, 0, 104, 3, 0, 110, - 160, 166, 243, 17, 248, 0, 232, 94, 99, 1, 208, 37, 1, 184, 96, 6, 4, - 144, 36, 3, 191, 222, 2, 240, 0, 2, 1, 129, 96, 5, 0, 104, 3, 1, 184, - 96, 10, 4, 144, 36, 3, 191, 222, 2, 240, 0, 2, 2, 40, 94, 135, 0, 18, - 14, 0, 176, 65, 147, 0, 23, 164, 0, 224, 65, 147, 0, 112, 100, 1, 10, - 94, 135, 0, 23, 162, 0, 232, 65, 146, 244, 80, 99, 1, 24, 94, 135, 0, - 23, 161, 0, 232, 96, 66, 244, 55, 162, 0, 136, 86, 2, 244, 54, 0, 0, - 104, 65, 142, 244, 146, 10, 0, 232, 65, 143, 0, 48, 99, 0, 232, 65, - 147, 0, 48, 100, 0, 104, 94, 139, 2, 18, 2, 0, 144, 86, 2, 244, 87, - 163, 0, 176, 88, 6, 244, 118, 1, 3, 191, 222, 2, 240, 18, 2, 0, 104, - 65, 146, 244, 146, 14, 0, 232, 65, 147, 0, 48, 100, 1, 188, 96, 3, 0, - 22, 0, 3, 191, 222, 2, 240, 18, 10, 0, 176, 94, 135, 0, 23, 161, 0, - 2, 222, 2, 240, 0, 0, 1, 128, 96, 2, 134, 20, 48, 0, 176, 80, 203, 0, - 16, 101, 1, 56, 80, 131, 0, 23, 161, 0, 104, 222, 59, 6, 50, 22, 0, - 224, 90, 51, 0, 54, 140, 0, 110, 218, 50, 244, 32, 19, 0, 176, 90, 11, - 0, 23, 162, 0, 224, 1, 247, 0, 32, 125, 0, 224, 1, 210, 244, 64, 116, - 1, 188, 99, 255, 31, 247, 163, 0, 176, 80, 207, 0, 16, 100, 0, 110, - 218, 50, 244, 50, 29, 0, 176, 90, 55, 0, 23, 163, 0, 176, 88, 19, 0, - 23, 130, 1, 188, 96, 3, 0, 22, 4, 1, 188, 96, 27, 9, 215, 182, 1, 2, - 208, 199, 0, 23, 161, 0, 224, 65, 150, 244, 48, 101, 0, 224, 80, 203, - 0, 208, 100, 1, 188, 96, 3, 0, 23, 180, 1, 188, 96, 3, 0, 23, 128, 1, - 188, 96, 3, 0, 55, 129, 1, 135, 96, 4, 3, 16, 160, 0, 144, 82, 51, 0, - 151, 164, 0, 224, 65, 135, 1, 183, 181, 0, 104, 94, 210, 240, 82, 68, - 0, 224, 94, 218, 246, 144, 99, 0, 32, 216, 2, 240, 50, 56, 2, 2, 80, - 199, 0, 18, 62, 0, 144, 86, 3, 0, 151, 161, 0, 232, 94, 134, 244, 151, - 161, 1, 158, 96, 2, 244, 55, 161, 0, 109, 222, 135, 8, 18, 62, 1, 10, - 94, 135, 0, 23, 162, 1, 218, 96, 2, 244, 55, 161, 0, 224, 94, 214, 244, - 80, 99, 0, 136, 96, 6, 244, 55, 161, 0, 32, 86, 2, 244, 50, 62, 0, 176, - 88, 2, 240, 54, 0, 0, 224, 90, 43, 0, 54, 138, 0, 106, 222, 210, 244, - 114, 58, 0, 104, 222, 210, 240, 18, 63, 0, 224, 94, 3, 0, 55, 128, 0, - 104, 94, 3, 0, 50, 63, 1, 134, 224, 4, 3, 16, 160, 3, 191, 222, 2, 240, - 18, 63, 0, 106, 222, 210, 244, 114, 58, 0, 224, 94, 211, 0, 55, 180, - 0, 208, 94, 7, 0, 55, 129, 2, 152, 94, 211, 0, 18, 41, 0, 224, 65, 147, - 0, 48, 100, 3, 191, 222, 2, 240, 18, 41, 0, 104, 94, 3, 0, 0, 19, 3, - 191, 222, 2, 240, 5, 209, 2, 130, 208, 199, 0, 18, 78, 0, 176, 42, 79, - 0, 23, 161, 1, 184, 42, 74, 244, 54, 132, 1, 2, 80, 19, 0, 22, 133, - 1, 60, 80, 131, 0, 23, 161, 0, 176, 80, 167, 0, 23, 164, 0, 109, 90, - 50, 244, 50, 87, 1, 130, 224, 6, 134, 52, 49, 2, 136, 80, 43, 0, 18, - 83, 0, 176, 90, 51, 0, 23, 161, 1, 158, 94, 134, 132, 244, 39, 1, 131, - 96, 6, 134, 52, 49, 0, 2, 222, 2, 240, 0, 0, 0, 176, 80, 115, 0, 23, - 161, 1, 184, 80, 110, 244, 54, 132, 1, 6, 208, 7, 0, 22, 133, 0, 176, - 80, 171, 0, 23, 164, 0, 208, 96, 6, 192, 151, 128, 0, 224, 65, 151, - 0, 215, 181, 1, 10, 88, 19, 0, 23, 161, 0, 224, 94, 214, 244, 55, 181, - 0, 176, 88, 15, 0, 16, 99, 1, 22, 86, 3, 0, 23, 129, 0, 104, 216, 19, - 0, 18, 108, 1, 20, 0, 99, 0, 23, 161, 0, 104, 222, 135, 0, 18, 98, 0, - 136, 1, 59, 1, 22, 128, 3, 191, 222, 2, 240, 18, 103, 0, 104, 222, 135, - 0, 114, 101, 0, 160, 1, 59, 224, 22, 128, 3, 191, 222, 2, 240, 18, 103, - 0, 224, 94, 135, 9, 112, 98, 0, 136, 84, 3, 1, 22, 128, 0, 232, 90, - 3, 48, 22, 128, 1, 188, 96, 3, 0, 22, 129, 1, 188, 96, 3, 0, 22, 130, - 1, 188, 96, 3, 0, 22, 131, 3, 191, 222, 2, 240, 18, 113, 0, 224, 65, - 142, 192, 144, 99, 0, 110, 193, 142, 192, 50, 113, 0, 232, 65, 142, - 192, 48, 99, 0, 232, 88, 3, 0, 55, 161, 0, 224, 65, 142, 244, 48, 99, - 1, 56, 80, 163, 0, 23, 165, 0, 104, 88, 19, 3, 242, 140, 0, 104, 65, - 142, 192, 82, 140, 0, 109, 218, 10, 244, 178, 140, 1, 22, 86, 3, 0, - 23, 161, 0, 104, 222, 134, 240, 50, 140, 1, 88, 86, 3, 0, 23, 161, 0, - 224, 94, 135, 13, 215, 162, 0, 176, 94, 215, 0, 16, 98, 0, 32, 222, - 2, 160, 18, 131, 0, 224, 94, 134, 208, 55, 163, 0, 224, 94, 142, 208, - 119, 163, 0, 109, 90, 2, 244, 82, 140, 0, 110, 94, 142, 244, 146, 140, - 0, 232, 96, 2, 244, 54, 131, 0, 176, 94, 143, 0, 22, 129, 0, 160, 90, - 15, 0, 118, 131, 0, 224, 90, 11, 0, 54, 130, 0, 232, 90, 2, 244, 86, - 128, 0, 208, 94, 3, 0, 55, 128, 0, 224, 88, 19, 0, 54, 4, 0, 224, 65, - 143, 0, 48, 99, 2, 152, 88, 19, 0, 18, 137, 0, 224, 94, 215, 0, 55, - 181, 0, 110, 193, 142, 192, 50, 114, 0, 176, 88, 3, 0, 16, 99, 3, 191, - 222, 2, 240, 18, 114, 0, 176, 88, 19, 0, 23, 161, 0, 104, 218, 55, 0, - 18, 143, 0, 176, 94, 135, 0, 22, 141, 0, 109, 222, 134, 209, 178, 145, - 0, 176, 94, 135, 0, 22, 141, 0, 2, 222, 2, 240, 0, 0, 1, 188, 96, 3, - 0, 23, 161, 1, 135, 96, 4, 3, 16, 160, 1, 188, 96, 3, 9, 144, 181, 0, - 176, 0, 99, 0, 240, 180, 1, 188, 96, 87, 4, 144, 182, 1, 188, 96, 3, - 0, 144, 181, 0, 176, 0, 99, 0, 176, 180, 0, 176, 66, 211, 0, 24, 0, - 3, 23, 222, 2, 240, 18, 154, 3, 151, 222, 2, 240, 18, 155, 0, 176, 42, - 75, 0, 20, 47, 1, 142, 224, 12, 3, 16, 160, 0, 109, 222, 2, 209, 178, - 161, 0, 232, 90, 54, 240, 22, 141, 3, 191, 222, 2, 240, 18, 163, 1, - 188, 96, 3, 0, 22, 140, 1, 188, 96, 3, 0, 22, 141, 0, 110, 90, 58, 240, - 18, 166, 1, 188, 96, 3, 0, 22, 142, 3, 191, 222, 2, 240, 18, 167, 0, - 232, 90, 58, 240, 22, 142, 0, 176, 88, 7, 0, 23, 161, 0, 224, 88, 14, - 240, 22, 3, 0, 110, 216, 14, 244, 50, 173, 0, 232, 94, 134, 192, 23, - 161, 0, 232, 88, 14, 244, 54, 3, 0, 232, 88, 15, 0, 54, 3, 1, 24, 94, - 3, 0, 23, 161, 0, 109, 222, 3, 2, 18, 181, 0, 232, 96, 66, 244, 55, - 162, 0, 144, 90, 26, 244, 54, 134, 0, 136, 90, 30, 244, 87, 162, 0, - 144, 90, 30, 244, 54, 135, 0, 176, 90, 26, 244, 86, 134, 3, 191, 222, - 2, 240, 18, 183, 0, 144, 90, 30, 244, 54, 134, 1, 188, 96, 3, 0, 22, - 135, 0, 2, 222, 2, 240, 0, 0, 1, 88, 96, 3, 0, 16, 42, 1, 184, 96, 10, - 4, 144, 36, 1, 188, 96, 3, 2, 144, 4, 1, 137, 224, 2, 13, 144, 108, - 0, 2, 222, 2, 240, 0, 0, 2, 0, 222, 83, 0, 18, 226, 1, 188, 96, 19, - 9, 183, 161, 0, 2, 94, 2, 240, 0, 206, 1, 165, 96, 2, 3, 55, 162, 1, - 153, 224, 2, 244, 87, 162, 0, 2, 94, 2, 240, 0, 212, 1, 188, 96, 19, - 9, 151, 161, 0, 2, 94, 2, 240, 0, 206, 1, 164, 96, 126, 3, 55, 162, - 1, 153, 224, 62, 244, 87, 162, 0, 2, 94, 2, 240, 0, 212, 1, 188, 96, - 19, 22, 247, 161, 0, 2, 94, 2, 240, 0, 206, 1, 180, 96, 2, 3, 55, 162, - 0, 2, 94, 2, 240, 0, 212, 1, 188, 96, 19, 22, 55, 161, 0, 2, 94, 2, - 240, 0, 206, 1, 134, 224, 2, 3, 55, 162, 1, 133, 96, 2, 244, 87, 162, - 0, 2, 94, 2, 240, 0, 212, 1, 188, 96, 19, 22, 23, 161, 0, 2, 94, 2, - 240, 0, 206, 1, 129, 224, 6, 3, 55, 162, 1, 133, 224, 6, 244, 87, 162, - 1, 131, 96, 6, 244, 87, 162, 0, 2, 94, 2, 240, 0, 212, 1, 188, 96, 19, - 31, 87, 161, 0, 2, 94, 2, 240, 0, 206, 1, 129, 224, 2, 3, 55, 162, 2, - 134, 0, 199, 0, 18, 220, 1, 129, 224, 6, 3, 55, 162, 0, 2, 94, 2, 240, - 0, 212, 1, 188, 96, 19, 31, 55, 161, 0, 2, 94, 2, 240, 0, 206, 1, 129, - 224, 6, 3, 55, 162, 0, 2, 94, 2, 240, 0, 212, 0, 2, 222, 2, 240, 0, - 0, 1, 188, 96, 19, 9, 151, 161, 0, 2, 94, 2, 240, 0, 206, 1, 164, 96, - 2, 3, 55, 162, 1, 153, 224, 2, 244, 87, 162, 1, 136, 96, 2, 244, 87, - 162, 0, 2, 94, 2, 240, 0, 212, 1, 188, 96, 19, 22, 23, 161, 0, 2, 94, - 2, 240, 0, 206, 1, 129, 224, 2, 3, 55, 162, 1, 133, 224, 2, 244, 87, - 162, 1, 131, 96, 2, 244, 87, 162, 0, 2, 94, 2, 240, 0, 212, 2, 6, 0, - 199, 0, 18, 243, 1, 188, 96, 19, 31, 55, 161, 0, 2, 94, 2, 240, 0, 206, - 1, 129, 224, 2, 3, 55, 162, 0, 2, 94, 2, 240, 0, 212, 0, 2, 222, 2, - 240, 0, 0, 2, 0, 222, 83, 0, 18, 226, 1, 188, 96, 19, 9, 183, 161, 0, - 2, 94, 2, 240, 0, 206, 1, 135, 96, 2, 3, 55, 162, 1, 129, 224, 2, 244, - 87, 162, 1, 136, 96, 6, 244, 87, 162, 0, 2, 94, 2, 240, 0, 212, 1, 188, - 96, 19, 9, 151, 161, 0, 2, 94, 2, 240, 0, 206, 2, 4, 0, 199, 0, 19, - 0, 1, 136, 96, 14, 3, 55, 162, 3, 191, 222, 2, 240, 19, 2, 1, 134, 96, - 6, 3, 55, 162, 1, 129, 224, 6, 244, 87, 162, 0, 2, 94, 2, 240, 0, 212, - 3, 191, 222, 2, 240, 18, 215, 0, 104, 222, 147, 0, 19, 8, 0, 224, 94, - 3, 0, 87, 162, 1, 9, 94, 139, 0, 23, 161, 3, 191, 222, 2, 240, 19, 16, - 0, 104, 222, 147, 0, 51, 12, 1, 16, 94, 3, 0, 23, 162, 0, 224, 94, 139, - 0, 151, 161, 3, 191, 222, 2, 240, 19, 16, 1, 48, 94, 3, 0, 23, 162, - 0, 224, 94, 139, 1, 151, 161, 0, 109, 94, 135, 5, 147, 16, 1, 188, 96, - 3, 5, 151, 161, 0, 2, 222, 2, 240, 0, 0, 0, 104, 43, 227, 0, 19, 22, - 0, 176, 44, 11, 0, 23, 161, 0, 224, 94, 133, 96, 119, 161, 0, 107, 222, - 134, 35, 51, 22, 1, 134, 224, 6, 247, 247, 191, 0, 2, 222, 2, 240, 0, - 0, 0, 176, 94, 143, 0, 16, 100, 0, 176, 94, 135, 0, 23, 163, 0, 176, - 94, 139, 0, 16, 101, 0, 176, 90, 3, 0, 23, 161, 0, 104, 65, 147, 0, - 19, 31, 0, 2, 94, 2, 240, 0, 206, 0, 176, 64, 103, 0, 22, 1, 0, 224, - 65, 147, 0, 80, 100, 0, 176, 90, 7, 0, 23, 162, 0, 2, 94, 2, 240, 0, - 212, 0, 224, 65, 151, 0, 80, 101, 0, 232, 94, 143, 0, 55, 163, 0, 104, - 222, 143, 0, 19, 26, 0, 2, 222, 2, 240, 0, 0, 0, 176, 94, 143, 0, 16, - 100, 0, 176, 94, 135, 0, 23, 163, 0, 176, 94, 139, 0, 16, 101, 0, 176, - 90, 3, 0, 23, 128, 0, 104, 65, 147, 0, 19, 45, 0, 2, 94, 2, 240, 13, - 223, 0, 176, 94, 7, 0, 22, 1, 0, 224, 65, 147, 0, 80, 100, 0, 176, 90, - 7, 0, 23, 129, 0, 2, 94, 2, 240, 13, 228, 0, 224, 65, 151, 0, 80, 101, - 0, 232, 94, 143, 0, 55, 163, 0, 104, 222, 143, 0, 19, 40, 0, 2, 222, - 2, 240, 0, 0, 2, 2, 0, 191, 0, 1, 177, 2, 3, 197, 115, 0, 1, 218, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 159, 224, 17, 204 -}; -const resource_hnd_t wifi_firmware_image = { RESOURCE_IN_MEMORY, 210624, {.mem = { (const char *) wifi_firmware_image_data }}}; - diff --git a/components/WWD/WWD/sdio_driver/wlan_bus_sdio.c b/components/WWD/WWD/sdio_driver/wlan_bus_sdio.c deleted file mode 100644 index b7d44590d83452283a0ed134030c0fe16255dea0..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/sdio_driver/wlan_bus_sdio.c +++ /dev/null @@ -1,730 +0,0 @@ -/** -****************************************************************************** -* @file wlan_bus_sdio.h -* @author William Xu -* @version V1.0.0 -* @date 16-Sep-2014 -* @brief This file provides bus communication functions with Wi-Fi RF chip. -****************************************************************************** -* -* The MIT License -* Copyright (c) 2014 MXCHIP Inc. -* -* 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. -****************************************************************************** -*/ - -#include "string.h" /* For memcpy */ -#include - -#include -#include - -/* Suppress unused parameter warning */ -#ifndef UNUSED_PARAMETER -#define UNUSED_PARAMETER(x) ( (void)(x) ) -#endif - -#define kNoErr 0 //! No error occurred. -#define kGeneralErr -1 //! General error. -#define kInProgressErr 1 //! Operation in progress. -#define kTimeoutErr -6722 //! Timeout occurred. -void platform_mcu_powersave_exit_notify(void) -{ - -} -void platform_mcu_powersave_enable(void) -{ - -} -#ifndef __cplusplus - -typedef char bool; -#define false 0 -#define true 1 - -#endif -/****************************************************** - * Constants - ******************************************************/ - -#define COMMAND_FINISHED_CMD52_TIMEOUT_LOOPS (100000) -#define COMMAND_FINISHED_CMD53_TIMEOUT_LOOPS (100000) -#define SDIO_TX_RX_COMPLETE_TIMEOUT_LOOPS (100000) -#define SDIO_DMA_TIMEOUT_LOOPS (1000000) -#define MAX_TIMEOUTS (30) -#define SDIO_ERROR_MASK ( SDIO_STA_CCRCFAIL | SDIO_STA_DCRCFAIL | SDIO_STA_CTIMEOUT | SDIO_STA_DTIMEOUT | SDIO_STA_TXUNDERR | SDIO_STA_RXOVERR | SDIO_STA_STBITERR ) -#define SDIO_IRQ_CHANNEL ((IRQn_Type)0x31) -#define DMA2_3_IRQ_CHANNEL ((IRQn_Type)DMA2_Stream3_IRQn) -#define BUS_LEVEL_MAX_RETRIES (5) -#define SDIO_ENUMERATION_TIMEOUT_MS (500) - -/****************************************************** - * Structures - ******************************************************/ - -typedef struct -{ - /*@shared@*/ /*@null@*/ uint8_t* data; - uint16_t length; -} sdio_dma_segment_t; - -/****************************************************** - * Enumerations - ******************************************************/ -/** - * Transfer direction for the mico platform bus interface - */ -typedef enum -{ - /* If updating this enum, the bus_direction_mapping variable will also need to be updated */ - BUS_READ, - BUS_WRITE -} bus_transfer_direction_t; - -/****************************************************** - * Variables Definitions - ******************************************************/ -static const uint32_t bus_direction_mapping[] = -{ - [BUS_READ] = SDIO_TransferDir_ToSDIO, - [BUS_WRITE] = SDIO_TransferDir_ToCard -}; - -/****************************************************** - * Enumerations - ******************************************************/ - -/* - * SDIO specific constants - */ -typedef enum -{ - SDIO_CMD_0 = 0, - SDIO_CMD_3 = 3, - SDIO_CMD_5 = 5, - SDIO_CMD_7 = 7, - SDIO_CMD_52 = 52, - SDIO_CMD_53 = 53, - __MAX_VAL = 64 -} sdio_command_t; - -typedef enum -{ - SDIO_BLOCK_MODE = ( 0 << 2 ), /* These are STM32 implementation specific */ - SDIO_BYTE_MODE = ( 1 << 2 ) /* These are STM32 implementation specific */ -} sdio_transfer_mode_t; - -typedef enum -{ - SDIO_1B_BLOCK = 1, - SDIO_2B_BLOCK = 2, - SDIO_4B_BLOCK = 4, - SDIO_8B_BLOCK = 8, - SDIO_16B_BLOCK = 16, - SDIO_32B_BLOCK = 32, - SDIO_64B_BLOCK = 64, - SDIO_128B_BLOCK = 128, - SDIO_256B_BLOCK = 256, - SDIO_512B_BLOCK = 512, - SDIO_1024B_BLOCK = 1024, - SDIO_2048B_BLOCK = 2048 -} sdio_block_size_t; - -typedef enum -{ - RESPONSE_NEEDED, - NO_RESPONSE -} sdio_response_needed_t; - - -/****************************************************** - * Variables - ******************************************************/ - -static uint8_t temp_dma_buffer[2*1024]; -static uint8_t* user_data; -static uint32_t user_data_size; -static uint8_t* dma_data_source; -static uint32_t dma_transfer_size; -//static mico_semaphore_t sdio_transfer_finished_semaphore; -static bool sdio_transfer_failed; -static bus_transfer_direction_t current_transfer_direction; -static uint32_t current_command; -/****************************************************** - * Function declarations - ******************************************************/ - -static uint32_t sdio_get_blocksize_dctrl ( sdio_block_size_t block_size ); -static sdio_block_size_t find_optimal_block_size ( uint32_t data_size ); -static void sdio_prepare_data_transfer ( bus_transfer_direction_t direction, sdio_block_size_t block_size, /*@unique@*/ uint8_t* data, uint16_t data_size ) /*@modifies dma_data_source, user_data, user_data_size, dma_transfer_size@*/; - -void dma_irq ( void ); -int32_t host_platform_sdio_transfer( bus_transfer_direction_t direction, sdio_command_t command, sdio_transfer_mode_t mode, sdio_block_size_t block_size, uint32_t argument, /*@null@*/ uint32_t* data, uint16_t data_size, sdio_response_needed_t response_expected, /*@out@*/ /*@null@*/ uint32_t* response ); -//extern void wlan_notify_irq( void ); -void wlan_notify_irq( void ) -{ - -} -/****************************************************** - * Function definitions - ******************************************************/ - -#if !(defined (MICO_DISABLE_MCU_POWERSAVE)) && !(defined (SDIO_1_BIT)) //SDIO 4 Bit mode and enable MCU powersave, need an OOB interrupt -static void sdio_oob_irq_handler( void* arg ) -{ - UNUSED_PARAMETER(arg); - platform_mcu_powersave_exit_notify( ); - wlan_notify_irq( ); -} - -int32_t host_enable_oob_interrupt( void ) -{ - //platform_gpio_init( &wifi_sdio_pins[WIFI_PIN_SDIO_OOB_IRQ], INPUT_HIGH_IMPEDANCE ); - //platform_gpio_irq_enable( &wifi_sdio_pins[WIFI_PIN_SDIO_OOB_IRQ], IRQ_TRIGGER_RISING_EDGE, sdio_oob_irq_handler, 0 ); - return kNoErr; -} - -uint8_t host_platform_get_oob_interrupt_pin( void ) -{ - return 0;//MICO_WIFI_OOB_IRQ_GPIO_PIN; -} - -#elif defined (MICO_DISABLE_MCU_POWERSAVE) && !(defined (SDIO_1_BIT)) //SDIO 4 Bit mode and disable MCU powersave, do not need OOB interrupt - -int32_t host_enable_oob_interrupt( void ) -{ - return kNoErr; -} - -uint8_t host_platform_get_oob_interrupt_pin( void ) -{ - return 0; -} -#endif - -#ifdef SDIO_1_BIT -static void sdio_int_pin_irq_handler( void* arg ) //SDIO 1 Bit mode -{ - UNUSED_PARAMETER(arg); - platform_mcu_powersave_exit_notify( ); - wlan_notify_irq( ); -} - -bool host_platform_is_sdio_int_asserted(void) -{ - if ( platform_gpio_input_get( &wifi_sdio_pins[WIFI_PIN_SDIO_IRQ] ) == true) //SDIO INT pin is high - return false; - else - return true; // SDIO D1 is low, data need read -} - -int32_t host_enable_oob_interrupt( void ) -{ - return kNoErr; -} - -#endif - -static void sdio_enable_bus_irq( void ) -{ - SDIO->MASK = SDIO_MASK_SDIOITIE | SDIO_MASK_CMDRENDIE | SDIO_MASK_CMDSENTIE; -} - -static void sdio_disable_bus_irq( void ) -{ - SDIO->MASK = 0; -} - - -void sdio_irq( void ) -{ - uint32_t intstatus = SDIO->STA; - - if ( ( intstatus & ( SDIO_STA_CCRCFAIL | SDIO_STA_DCRCFAIL | SDIO_STA_TXUNDERR | SDIO_STA_RXOVERR | SDIO_STA_STBITERR )) != 0 ) - { - sdio_transfer_failed = true; - SDIO->ICR = (uint32_t) 0xffffffff; - //mico_rtos_set_semaphore( &sdio_transfer_finished_semaphore ); - } - else - { - if ((intstatus & (SDIO_STA_CMDREND | SDIO_STA_CMDSENT)) != 0) - { - if ( ( SDIO->RESP1 & 0x800 ) != 0 ) - { - sdio_transfer_failed = true; - //mico_rtos_set_semaphore( &sdio_transfer_finished_semaphore ); - } - else if (current_command == SDIO_CMD_53) - { - if (current_transfer_direction == BUS_WRITE) - { - DMA2_Stream3->CR = DMA_DIR_MemoryToPeripheral | - DMA_Channel_4 | DMA_PeripheralInc_Disable | DMA_MemoryInc_Enable | - DMA_PeripheralDataSize_Word | DMA_MemoryDataSize_Word | - DMA_Mode_Normal | DMA_Priority_VeryHigh | - DMA_MemoryBurst_INC4 | DMA_PeripheralBurst_INC4 | DMA_SxCR_PFCTRL | DMA_SxCR_EN | DMA_SxCR_TCIE; - } - else - { - DMA2_Stream3->CR = DMA_DIR_PeripheralToMemory | - DMA_Channel_4 | DMA_PeripheralInc_Disable | DMA_MemoryInc_Enable | - DMA_PeripheralDataSize_Word | DMA_MemoryDataSize_Word | - DMA_Mode_Normal | DMA_Priority_VeryHigh | - DMA_MemoryBurst_INC4 | DMA_PeripheralBurst_INC4 | DMA_SxCR_PFCTRL | DMA_SxCR_EN | DMA_SxCR_TCIE; - } - } - - /* Clear all command/response interrupts */ - SDIO->ICR = (SDIO_STA_CMDREND | SDIO_STA_CMDSENT); - } - } - -#ifndef SDIO_1_BIT - /* Check whether the external interrupt was triggered */ - if ( ( intstatus & SDIO_STA_SDIOIT ) != 0 ) - { - /* Clear the interrupt and then inform MiCO thread */ - SDIO->ICR = SDIO_ICR_SDIOITC; - platform_mcu_powersave_exit_notify( ); - wlan_notify_irq( ); - } -#endif -} - -/*@-exportheader@*/ /* Function picked up by linker script */ -void dma_irq( void ) -{ - int32_t result; - - /* Clear interrupt */ - DMA2->LIFCR = (uint32_t) (0x3F << 22); - -// result = mico_rtos_set_semaphore( &sdio_transfer_finished_semaphore ); - result = kNoErr; - /* check result if in debug mode */ - //check_string(result == kNoErr, "failed to set dma semaphore" ); - if(result != kNoErr) - printf("failed to set dma semaphore"); - /*@-noeffect@*/ - (void) result; /* ignore result if in release mode */ - /*@+noeffect@*/ -} -/*@+exportheader@*/ - -/** - * @brief Initializes the SD Card and put it into StandBy State (Ready for - * data transfer). - * @param None - * @retval None - */ -void SD_LowLevel_Init(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; - static uint32_t i; - /* GPIOC and GPIOD Periph clock enable */ - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOG, ENABLE); - - GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_SDIO); - GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_SDIO); - GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SDIO); - GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SDIO); - GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SDIO); - GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_SDIO); - - /* Configure PC.08, PC.09, PC.10, PC.11 pins: D0, D1, D2, D3 pins */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |GPIO_Pin_12; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(GPIOC, &GPIO_InitStructure); - - /* Configure PD.02 CMD line */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; - GPIO_Init(GPIOD, &GPIO_InitStructure); - -// /* Configure PC.12 pin: CLK pin */ -// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; -// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; -// GPIO_Init(GPIOC, &GPIO_InitStructure); - - /* ConfigurePG.09 pin */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(GPIOG, &GPIO_InitStructure); - - GPIO_ResetBits(GPIOG,GPIO_Pin_9); - for(i=0;i<0xffff;i++) - { - __nop(); - } - GPIO_SetBits(GPIOG,GPIO_Pin_9); - -} -int32_t host_platform_bus_init( void ) -{ - SDIO_InitTypeDef sdio_init_structure; - - /* Turn on SDIO IRQ */ - SDIO->ICR = (uint32_t) 0xffffffff; - -// NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 ); -// NVIC_SetPriority( SDIO_IRQn , 2 ); -// NVIC_SetPriority( DMA2_Stream3_IRQn, 3 ); - /* Must be lower priority than the value of configMAX_SYSCALL_INTERRUPT_PRIORITY */ - /* otherwise FreeRTOS will not be able to mask the interrupt */ - /* keep in mind that ARMCM3 interrupt priority logic is inverted, the highest value */ - /* is the lowest priority */ - NVIC_EnableIRQ( SDIO_IRQ_CHANNEL ); - NVIC_EnableIRQ( DMA2_3_IRQ_CHANNEL ); - - - /* Setup GPIO pins for SDIO data & clock */ - SD_LowLevel_Init(); -// for ( a = WIFI_PIN_SDIO_CLK; a < WIFI_PIN_SDIO_MAX; a++ ) -// { -// platform_gpio_set_alternate_function( wifi_sdio_pins[ a ].port, wifi_sdio_pins[ a ].pin_number, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_AF_SDIO ); -// } - -//#ifdef SDIO_1_BIT -// platform_gpio_init( &wifi_sdio_pins[WIFI_PIN_SDIO_IRQ], INPUT_PULL_UP ); -// platform_gpio_irq_enable( &wifi_sdio_pins[WIFI_PIN_SDIO_IRQ], IRQ_TRIGGER_FALLING_EDGE, sdio_int_pin_irq_handler, 0 ); -//#endif - - /*!< Enable the SDIO AHB Clock and the DMA2 Clock */ - RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_DMA2, ENABLE ); - RCC_APB2PeriphClockCmd( RCC_APB2Periph_SDIO, ENABLE ); - - SDIO_DeInit( ); - sdio_init_structure.SDIO_ClockDiv = (uint8_t) 120; /* 0x78, clock is taken from the high speed APB bus ; */ /* About 400KHz */ - sdio_init_structure.SDIO_ClockEdge = SDIO_ClockEdge_Rising; - sdio_init_structure.SDIO_ClockBypass = SDIO_ClockBypass_Disable; - sdio_init_structure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Enable; - sdio_init_structure.SDIO_BusWide = SDIO_BusWide_1b; - sdio_init_structure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable; - SDIO_Init( &sdio_init_structure ); - SDIO_SetPowerState( SDIO_PowerState_ON ); - SDIO_SetSDIOReadWaitMode( SDIO_ReadWaitMode_CLK ); - SDIO_ClockCmd( ENABLE ); - - platform_mcu_powersave_enable(); - - return kNoErr; -} - -int32_t host_platform_sdio_enumerate( void ) -{ - int32_t result; - uint32_t loop_count; - uint32_t data = 0; - - loop_count = 0; - do - { - /* Send CMD0 to set it to idle state */ - host_platform_sdio_transfer( BUS_WRITE, SDIO_CMD_0, SDIO_BYTE_MODE, SDIO_1B_BLOCK, 0, 0, 0, NO_RESPONSE, NULL ); - - /* CMD5. */ - host_platform_sdio_transfer( BUS_READ, SDIO_CMD_5, SDIO_BYTE_MODE, SDIO_1B_BLOCK, 0, 0, 0, NO_RESPONSE, NULL ); - - /* Send CMD3 to get RCA. */ - result = host_platform_sdio_transfer( BUS_READ, SDIO_CMD_3, SDIO_BYTE_MODE, SDIO_1B_BLOCK, 0, 0, 0, RESPONSE_NEEDED, &data ); - loop_count++; - if ( loop_count >= (uint32_t) SDIO_ENUMERATION_TIMEOUT_MS ) - { - LED_RED; - return kTimeoutErr; - } - } while ( ( result != kNoErr ));//( mico_thread_msleep( (uint32_t) 1 ), ( 1 == 1 ) ) - /* If you're stuck here, check the platform matches your hardware */ - - /* Send CMD7 with the returned RCA to select the card */ - host_platform_sdio_transfer( BUS_WRITE, SDIO_CMD_7, SDIO_BYTE_MODE, SDIO_1B_BLOCK, data, 0, 0, RESPONSE_NEEDED, NULL ); - - return kNoErr; -} - -int32_t host_platform_bus_deinit( void ) -{ - int32_t result; - - /* Disable SPI and SPI DMA */ - sdio_disable_bus_irq( ); - SDIO_ClockCmd( DISABLE ); - SDIO_SetPowerState( SDIO_PowerState_OFF ); - SDIO_DeInit( ); - RCC_APB2PeriphClockCmd( RCC_APB2Periph_SDIO, DISABLE ); - -#ifdef SDIO_1_BIT - platform_gpio_deinit( &wifi_sdio_pins[WIFI_PIN_SDIO_IRQ] ); - platform_gpio_irq_disable( &wifi_sdio_pins[WIFI_PIN_SDIO_IRQ] ); -#endif - - -#if defined ( MICO_WIFI_USE_GPIO_FOR_BOOTSTRAP ) - platform_gpio_deinit( &wifi_control_pins[WIFI_PIN_BOOTSTRAP_0] ); - platform_gpio_deinit( &wifi_control_pins[WIFI_PIN_BOOTSTRAP_1] ); -#endif - - /* Turn off SDIO IRQ */ - NVIC_DisableIRQ( SDIO_IRQ_CHANNEL ); - NVIC_DisableIRQ( DMA2_3_IRQ_CHANNEL ); - - platform_mcu_powersave_enable(); - - return result; -} - -int32_t host_platform_sdio_transfer( bus_transfer_direction_t direction, sdio_command_t command, sdio_transfer_mode_t mode, sdio_block_size_t block_size, uint32_t argument, /*@null@*/ uint32_t* data, uint16_t data_size, sdio_response_needed_t response_expected, /*@out@*/ /*@null@*/ uint32_t* response ) -{ - uint32_t loop_count = 0; - int32_t result; - uint16_t attempts = 0; - - //check_string(!((command == SDIO_CMD_53) && (data == NULL)), "Bad args" ); - if((command == SDIO_CMD_53) && (data == NULL)) - printf("Bad args"); - if ( response != NULL ) - { - *response = 0; - } - - /* Ensure the bus isn't stuck half way through transfer */ - DMA2_Stream3->CR = 0; - -restart: - SDIO->ICR = (uint32_t) 0xFFFFFFFF; - sdio_transfer_failed = false; - ++attempts; - - /* Check if we've tried too many times */ - if (attempts >= (uint16_t) BUS_LEVEL_MAX_RETRIES) - { - result = kGeneralErr; - goto exit; - } - - /* Prepare the data transfer register */ - current_command = command; - if ( command == SDIO_CMD_53 ) - { - sdio_enable_bus_irq(); - - /* Dodgy STM32 hack to set the CMD53 byte mode size to be the same as the block size */ - if ( mode == SDIO_BYTE_MODE ) - { - block_size = find_optimal_block_size( data_size ); - if ( block_size < SDIO_512B_BLOCK ) - { - argument = ( argument & (uint32_t) ( ~0x1FF ) ) | block_size; - } - else - { - argument = ( argument & (uint32_t) ( ~0x1FF ) ); - } - } - - /* Prepare the SDIO for a data transfer */ - current_transfer_direction = direction; - sdio_prepare_data_transfer( direction, block_size, (uint8_t*) data, data_size ); - - /* Send the command */ - SDIO->ARG = argument; - SDIO->CMD = (uint32_t) ( command | SDIO_Response_Short | SDIO_Wait_No | SDIO_CPSM_Enable ); - - /* Wait for the whole transfer to complete */ - //result = mico_rtos_get_semaphore( &sdio_transfer_finished_semaphore, (uint32_t) 50 ); - if ( result != kNoErr ) - { - goto exit; - } - - if ( sdio_transfer_failed == true ) - { - goto restart; - } - - /* Check if there were any SDIO errors */ - if(( SDIO->STA & ( SDIO_STA_DTIMEOUT | SDIO_STA_CTIMEOUT ) ) != 0) - goto restart; - //require(( SDIO->STA & ( SDIO_STA_DTIMEOUT | SDIO_STA_CTIMEOUT ) ) == 0, restart); - //require_string(( SDIO->STA & ( SDIO_STA_CCRCFAIL | SDIO_STA_DCRCFAIL | SDIO_STA_TXUNDERR | SDIO_STA_RXOVERR ) ) == 0, restart, "SDIO communication failure"); - if(( SDIO->STA & ( SDIO_STA_CCRCFAIL | SDIO_STA_DCRCFAIL | SDIO_STA_TXUNDERR | SDIO_STA_RXOVERR ) ) != 0) - printf("SDIO communication failure"); - /* Wait till complete */ - loop_count = (uint32_t) SDIO_TX_RX_COMPLETE_TIMEOUT_LOOPS; - do - { - loop_count--; - if ( loop_count == 0 || ( ( SDIO->STA & SDIO_ERROR_MASK ) != 0 ) ) - { - goto restart; - } - } while ( ( SDIO->STA & ( SDIO_STA_TXACT | SDIO_STA_RXACT ) ) != 0 ); - - if ( direction == BUS_READ ) - { - memcpy( user_data, dma_data_source, (size_t) user_data_size ); - } - } - else - { - uint32_t temp_sta; - - /* Send the command */ - SDIO->ARG = argument; - SDIO->CMD = (uint32_t) ( command | SDIO_Response_Short | SDIO_Wait_No | SDIO_CPSM_Enable ); - - loop_count = (uint32_t) COMMAND_FINISHED_CMD52_TIMEOUT_LOOPS; - do - { - temp_sta = SDIO->STA; - loop_count--; - if ( loop_count == 0 || ( ( response_expected == RESPONSE_NEEDED ) && ( ( temp_sta & SDIO_ERROR_MASK ) != 0 ) ) ) - { - goto restart; - } - } while ( ( temp_sta & SDIO_FLAG_CMDACT ) != 0 ); - } - - if ( response != NULL ) - { - *response = SDIO->RESP1; - } - result = kNoErr; - -exit: - platform_mcu_powersave_enable(); -#ifndef SDIO_1_BIT - SDIO->MASK = SDIO_MASK_SDIOITIE; -#endif - return result; -} - - -static void sdio_prepare_data_transfer( bus_transfer_direction_t direction, sdio_block_size_t block_size, /*@unique@*/ uint8_t* data, uint16_t data_size ) /*@modifies dma_data_source, user_data, user_data_size, dma_transfer_size@*/ -{ - /* Setup a single transfer using the temp buffer */ - user_data = data; - user_data_size = data_size; - dma_transfer_size = (uint32_t) ( ( ( data_size + (uint16_t) block_size - 1 ) / (uint16_t) block_size ) * (uint16_t) block_size ); - - if ( direction == BUS_WRITE ) - { - dma_data_source = data; - } - else - { - dma_data_source = temp_dma_buffer; - } - - SDIO->DTIMER = (uint32_t) 0xFFFFFFFF; - SDIO->DLEN = dma_transfer_size; - SDIO->DCTRL = (uint32_t)sdio_get_blocksize_dctrl(block_size) | bus_direction_mapping[(int)direction] | SDIO_TransferMode_Block | SDIO_DPSM_Enable | (1 << 3) | (1 << 11); - - /* DMA2 Stream3 */ - DMA2_Stream3->CR = 0; - DMA2->LIFCR = (uint32_t) ( 0x3F << 22 ); - DMA2_Stream3->FCR = (uint32_t) ( 0x00000021 | DMA_FIFOMode_Enable | DMA_FIFOThreshold_Full ); - DMA2_Stream3->PAR = (uint32_t) &SDIO->FIFO; - DMA2_Stream3->M0AR = (uint32_t) dma_data_source; - DMA2_Stream3->NDTR = dma_transfer_size/4; -} - - - -void host_platform_enable_high_speed_sdio( void ) -{ - SDIO_InitTypeDef sdio_init_structure; - - sdio_init_structure.SDIO_ClockDiv = (uint8_t) 0; /* 0 = 24MHz if SDIO clock = 48MHz */ - sdio_init_structure.SDIO_ClockEdge = SDIO_ClockEdge_Rising; - sdio_init_structure.SDIO_ClockBypass = SDIO_ClockBypass_Disable; - sdio_init_structure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable; -#ifndef SDIO_1_BIT - sdio_init_structure.SDIO_BusWide = SDIO_BusWide_4b; -#else - sdio_init_structure.SDIO_BusWide = SDIO_BusWide_1b; -#endif - sdio_init_structure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable; - - SDIO_DeInit( ); - SDIO_Init( &sdio_init_structure ); - SDIO_SetPowerState( SDIO_PowerState_ON ); - SDIO_ClockCmd( ENABLE ); - sdio_enable_bus_irq( ); -} - -static sdio_block_size_t find_optimal_block_size( uint32_t data_size ) -{ - if ( data_size > (uint32_t) 256 ) - return SDIO_512B_BLOCK; - if ( data_size > (uint32_t) 128 ) - return SDIO_256B_BLOCK; - if ( data_size > (uint32_t) 64 ) - return SDIO_128B_BLOCK; - if ( data_size > (uint32_t) 32 ) - return SDIO_64B_BLOCK; - if ( data_size > (uint32_t) 16 ) - return SDIO_32B_BLOCK; - if ( data_size > (uint32_t) 8 ) - return SDIO_16B_BLOCK; - if ( data_size > (uint32_t) 4 ) - return SDIO_8B_BLOCK; - if ( data_size > (uint32_t) 2 ) - return SDIO_4B_BLOCK; - - return SDIO_4B_BLOCK; -} - -static uint32_t sdio_get_blocksize_dctrl(sdio_block_size_t block_size) -{ - switch (block_size) - { - case SDIO_1B_BLOCK: return SDIO_DataBlockSize_1b; - case SDIO_2B_BLOCK: return SDIO_DataBlockSize_2b; - case SDIO_4B_BLOCK: return SDIO_DataBlockSize_4b; - case SDIO_8B_BLOCK: return SDIO_DataBlockSize_8b; - case SDIO_16B_BLOCK: return SDIO_DataBlockSize_16b; - case SDIO_32B_BLOCK: return SDIO_DataBlockSize_32b; - case SDIO_64B_BLOCK: return SDIO_DataBlockSize_64b; - case SDIO_128B_BLOCK: return SDIO_DataBlockSize_128b; - case SDIO_256B_BLOCK: return SDIO_DataBlockSize_256b; - case SDIO_512B_BLOCK: return SDIO_DataBlockSize_512b; - case SDIO_1024B_BLOCK: return SDIO_DataBlockSize_1024b; - case SDIO_2048B_BLOCK: return SDIO_DataBlockSize_2048b; - default: return 0; - } -} - -void SDIO_IRQHandler(void) -{ - /* Process All SDIO Interrupt Sources */ - sdio_irq(); -} - -void DMA2_Stream3_IRQHandler(void) -{ - dma_irq(); -} - diff --git a/components/WWD/WWD/sdio_driver/wlan_bus_sdio_imxrt10xx.c b/components/WWD/WWD/sdio_driver/wlan_bus_sdio_imxrt10xx.c deleted file mode 100644 index 688b93d1d53c6ee46d3f852fe8e16e2154f3d74b..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/sdio_driver/wlan_bus_sdio_imxrt10xx.c +++ /dev/null @@ -1,188 +0,0 @@ -#include -#include - -#include -#include - -#include -#include -#include "wwd_constants.h" - -#include - -/****************************************************** - * Constants - ******************************************************/ -#define kNoErr 0 //! No error occurred. -#define kGeneralErr -1 //! General error. -#define kInProgressErr 1 //! Operation in progress. -#define kTimeoutErr -6722 //! Timeout occurred. - -#define SECTOR_SIZE (512) - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Variables - ******************************************************/ -/* - * SDIO specific constants - */ -typedef enum -{ - SDIO_CMD_0 = 0, - SDIO_CMD_3 = 3, - SDIO_CMD_5 = 5, - SDIO_CMD_7 = 7, - SDIO_CMD_52 = 52, - SDIO_CMD_53 = 53, - __MAX_VAL = 64 -} imsrt_sdio_command_t; - -typedef enum -{ - SDIO_BLOCK_MODE = ( 0 << 2 ), /* These are STM32 implementation specific */ - SDIO_BYTE_MODE = ( 1 << 2 ) /* These are STM32 implementation specific */ -} sdio_transfer_mode_t; - -typedef enum -{ - SDIO_1B_BLOCK = 1, - SDIO_2B_BLOCK = 2, - SDIO_4B_BLOCK = 4, - SDIO_8B_BLOCK = 8, - SDIO_16B_BLOCK = 16, - SDIO_32B_BLOCK = 32, - SDIO_64B_BLOCK = 64, - SDIO_128B_BLOCK = 128, - SDIO_256B_BLOCK = 256, - SDIO_512B_BLOCK = 512, - SDIO_1024B_BLOCK = 1024, - SDIO_2048B_BLOCK = 2048 -} sdio_block_size_t; - -typedef enum -{ - RESPONSE_NEEDED, - NO_RESPONSE -} sdio_response_needed_t; - -/****************************************************** - * Static Function Declarations - ******************************************************/ - -/****************************************************** - * Function definitions - ******************************************************/ -#ifndef WICED_DISABLE_MCU_POWERSAVE -static void sdio_oob_irq_handler( void* arg ) -{ - -} -#endif /* ifndef WICED_DISABLE_MCU_POWERSAVE */ - -#ifndef WICED_DISABLE_MCU_POWERSAVE -wwd_result_t host_enable_oob_interrupt( void ) -{ - /* Set GPIO_B[1:0] to input. One of them will be re-purposed as OOB interrupt */ -// platform_gpio_init( &wifi_sdio_pins[WWD_PIN_SDIO_OOB_IRQ], INPUT_HIGH_IMPEDANCE ); -// platform_gpio_irq_enable( &wifi_sdio_pins[WWD_PIN_SDIO_OOB_IRQ], IRQ_TRIGGER_RISING_EDGE, sdio_oob_irq_handler, 0 ); - return WWD_SUCCESS; -} - -uint8_t host_platform_get_oob_interrupt_pin( void ) -{ - return kNoErr; -} -#endif /* ifndef WICED_DISABLE_MCU_POWERSAVE */ - -wwd_result_t host_platform_bus_init( void ) -{ - return WWD_SUCCESS; -} - -wwd_result_t host_platform_sdio_enumerate( void ) -{ - return WWD_SUCCESS; -} - -wwd_result_t host_platform_bus_deinit( void ) -{ - return WWD_SUCCESS; -} - -extern void wwd_thread_notify_irq( void ); -extern struct os_wwd_device *wwd_dev; -wwd_result_t host_platform_sdio_transfer( wwd_bus_transfer_direction_t direction, imsrt_sdio_command_t command, sdio_transfer_mode_t mode, - sdio_block_size_t block_size, uint32_t argument, uint32_t* data, uint16_t data_size, - sdio_response_needed_t response_expected, uint32_t* response ) -{ - - uint8_t *txData = NULL; - uint8_t *rxData = NULL; - wwd_result_t result; - - if(data_size) - { - if(direction == BUS_READ) - { - rxData = (uint8_t *)data; - } - else - { - txData = (uint8_t *)data; - } - } - -// wwd_thread_notify_irq( ); - - if(SDIO_IO_Transfer((sdio_card_t *)wwd_dev->card, (sdio_command_t)command, argument, block_size, txData, rxData, data_size, response) == kStatus_Fail) - { - return WWD_TIMEOUT; - } - - return WWD_SUCCESS; -exit: -// platform_mcu_powersave_enable(); - return result; -} - - -wwd_result_t host_platform_enable_high_speed_sdio( void ) -{ -#if 0 - sdio_bus_width_t busWidth = kSDIO_DataBus1Bit; - /* try to switch high speed */ - if (kStatus_Success != SDIO_SwitchToHighSpeed(&g_sdio)) - { - return WWD_TIMEOUT; - } - /* switch data bus width */ - if ((g_sdio.cccrflags & kSDIO_CCCRSupportHighSpeed) || (g_sdio.cccrflags & kSDIO_CCCRSupportLowSpeed4Bit)) - { - busWidth = kSDIO_DataBus4Bit; - } - if (kStatus_Success != SDIO_SetDataBusWidth(&g_sdio, busWidth)) - { - return WWD_TIMEOUT; - } -#endif - return WWD_SUCCESS; -} - -wwd_result_t host_platform_bus_enable_interrupt( void ) -{ - return WWD_SUCCESS; -} - -wwd_result_t host_platform_bus_disable_interrupt( void ) -{ - return WWD_SUCCESS; -} - -//void host_platform_bus_buffer_freed( wwd_buffer_dir_t direction ) -//{ -// UNUSED_PARAMETER( direction ); -//} diff --git a/components/WWD/WWD/sdio_driver/wlan_bus_sdio_stm32.c b/components/WWD/WWD/sdio_driver/wlan_bus_sdio_stm32.c deleted file mode 100644 index be3918e8d08679f96bc75f0d7d33136dbc9a08a1..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/sdio_driver/wlan_bus_sdio_stm32.c +++ /dev/null @@ -1,284 +0,0 @@ -#include -#include - -#include -#include - -#include -#include -#include "wwd_constants.h" - -#define kNoErr 0 //! No error occurred. -#define kGeneralErr -1 //! General error. -#define kInProgressErr 1 //! Operation in progress. -#define kTimeoutErr -6722 //! Timeout occurred. - -#define SECTOR_SIZE (512) - -/* - * SDIO specific constants - */ -typedef enum -{ - SDIO_CMD_0 = 0, - SDIO_CMD_3 = 3, - SDIO_CMD_5 = 5, - SDIO_CMD_7 = 7, - SDIO_CMD_52 = 52, - SDIO_CMD_53 = 53, - __MAX_VAL = 64 -} sdio_command_t; - -typedef enum -{ - SDIO_BLOCK_MODE = ( 0 << 2 ), /* These are STM32 implementation specific */ - SDIO_BYTE_MODE = ( 1 << 2 ) /* These are STM32 implementation specific */ -} sdio_transfer_mode_t; - -typedef enum -{ - SDIO_1B_BLOCK = 1, - SDIO_2B_BLOCK = 2, - SDIO_4B_BLOCK = 4, - SDIO_8B_BLOCK = 8, - SDIO_16B_BLOCK = 16, - SDIO_32B_BLOCK = 32, - SDIO_64B_BLOCK = 64, - SDIO_128B_BLOCK = 128, - SDIO_256B_BLOCK = 256, - SDIO_512B_BLOCK = 512, - SDIO_1024B_BLOCK = 1024, - SDIO_2048B_BLOCK = 2048 -} sdio_block_size_t; - -typedef enum -{ - RESPONSE_NEEDED, - NO_RESPONSE -} sdio_response_needed_t; - - -#if !(defined (MICO_DISABLE_MCU_POWERSAVE)) && !(defined (SDIO_1_BIT)) //SDIO 4 Bit mode and enable MCU powersave, need an OOB interrupt - -int32_t host_enable_oob_interrupt( void ) -{ - //platform_gpio_init( &wifi_sdio_pins[WIFI_PIN_SDIO_OOB_IRQ], INPUT_HIGH_IMPEDANCE ); - //platform_gpio_irq_enable( &wifi_sdio_pins[WIFI_PIN_SDIO_OOB_IRQ], IRQ_TRIGGER_RISING_EDGE, sdio_oob_irq_handler, 0 ); - return kNoErr; -} - -uint8_t host_platform_get_oob_interrupt_pin( void ) -{ - return 0;//MICO_WIFI_OOB_IRQ_GPIO_PIN; -} - -#elif defined (MICO_DISABLE_MCU_POWERSAVE) && !(defined (SDIO_1_BIT)) //SDIO 4 Bit mode and disable MCU powersave, do not need OOB interrupt - -int32_t host_enable_oob_interrupt( void ) -{ - return kNoErr; -} - -uint8_t host_platform_get_oob_interrupt_pin( void ) -{ - return 0; -} -#endif - -#ifdef SDIO_1_BIT -static void sdio_int_pin_irq_handler( void* arg ) //SDIO 1 Bit mode -{ - UNUSED_PARAMETER(arg); - platform_mcu_powersave_exit_notify( ); - wlan_notify_irq( ); -} - -bool host_platform_is_sdio_int_asserted(void) -{ - if ( platform_gpio_input_get( &wifi_sdio_pins[WIFI_PIN_SDIO_IRQ] ) == true) //SDIO INT pin is high - return false; - else - return true; // SDIO D1 is low, data need read -} - -int32_t host_enable_oob_interrupt( void ) -{ - return kNoErr; -} - -#endif - -void host_platform_enable_high_speed_sdio( void ) -{ - return; -} - -int32_t host_platform_bus_init( void ) -{ - return 0; -} - -int32_t host_platform_bus_deinit( void ) -{ - return 0; -} - -static sdio_block_size_t find_optimal_block_size( uint32_t data_size ) -{ - if ( data_size > (uint32_t) 256 ) - return SDIO_512B_BLOCK; - if ( data_size > (uint32_t) 128 ) - return SDIO_256B_BLOCK; - if ( data_size > (uint32_t) 64 ) - return SDIO_128B_BLOCK; - if ( data_size > (uint32_t) 32 ) - return SDIO_64B_BLOCK; - if ( data_size > (uint32_t) 16 ) - return SDIO_32B_BLOCK; - if ( data_size > (uint32_t) 8 ) - return SDIO_16B_BLOCK; - if ( data_size > (uint32_t) 4 ) - return SDIO_8B_BLOCK; - if ( data_size > (uint32_t) 2 ) - return SDIO_4B_BLOCK; - - return SDIO_4B_BLOCK; -} - -os_int32_t host_sdio_io_rw_direct(struct os_mmcsd_card *card, os_int32_t rw, os_int32_t arg, os_uint32_t cmd_code, os_uint8_t *pdata) -{ - struct os_mmcsd_cmd cmd; - os_int32_t err; - - OS_ASSERT(card != OS_NULL); - - memset(&cmd, 0, sizeof(struct os_mmcsd_cmd)); - - cmd.cmd_code = SD_IO_RW_DIRECT; - cmd.arg = rw ? SDIO_ARG_CMD52_WRITE : SDIO_ARG_CMD52_READ; - cmd.arg |= arg; - cmd.flags = RESP_SPI_R5 | RESP_R5 | CMD_AC; - - err = mmcsd_send_cmd(card->host, &cmd, 0); - if (err) - return err; - - if (cmd.resp[0] & R5_ERROR) - return OS_EIO; - if (cmd.resp[0] & R5_FUNCTION_NUMBER) - return OS_ERROR; - if (cmd.resp[0] & R5_OUT_OF_RANGE) - return OS_ERROR; - - if (!rw) - { - *pdata = cmd.resp[0] & 0xFF; - } - - return 0; -} - -os_int32_t host_sdio_io_rw_extended( - struct os_mmcsd_card *card, - os_int32_t argument, - os_uint8_t * buf, - uint16_t data_size) -{ - int block_mode = (argument >> 27) & 1; - - int block_size; - int blocks; - - if (block_mode == 1) - { - blocks = argument & 0x1ff; - if (blocks == 0) - blocks = 512; - - block_size = 512; - } - else - { - blocks = 1; - - block_size = argument & 0x1ff; - if (block_size == 0) - block_size = 512; - - block_size = find_optimal_block_size(block_size); - - argument = argument & ~0x1ff; - if (block_size < 512) - argument |= block_size; - } - - struct os_mmcsd_req req; - struct os_mmcsd_cmd cmd; - struct os_mmcsd_data data; - - OS_ASSERT(card != OS_NULL); - - memset(&req, 0, sizeof(struct os_mmcsd_req)); - memset(&cmd, 0, sizeof(struct os_mmcsd_cmd)); - memset(&data, 0, sizeof(struct os_mmcsd_data)); - - req.cmd = &cmd; - req.cmd->data = &data; - - cmd.cmd_code = SD_IO_RW_EXTENDED; - cmd.arg = argument; - cmd.flags = RESP_SPI_R5 | RESP_R5 | CMD_ADTC; - - data.blksize = block_size; - data.blks = blocks; - data.flags = (argument >> 31) ? DATA_DIR_WRITE : DATA_DIR_READ; - data.buf = buf; - - mmcsd_set_data_timeout(&data, card); - - mmcsd_send_request(card->host, &req); - - if (cmd.err) - return cmd.err; - if (data.err) - return data.err; - - if (!controller_is_spi(card->host)) - { - if (cmd.resp[0] & R5_ERROR) - return OS_EIO; - if (cmd.resp[0] & R5_FUNCTION_NUMBER) - return OS_ERROR; - if (cmd.resp[0] & R5_OUT_OF_RANGE) - return OS_ERROR; - } - - return 0; -} - -extern struct os_wwd_device *wwd_dev; -OS_USED int32_t host_platform_sdio_transfer(wwd_bus_transfer_direction_t direction, sdio_command_t command, sdio_transfer_mode_t mode, - sdio_block_size_t block_size, uint32_t argument, /*@null@*/ uint32_t* data, uint16_t data_size, - sdio_response_needed_t response_expected, /*@out@*/ /*@null@*/ uint32_t* response) -{ - os_uint32_t rw; - int32_t result; - - if ( response != NULL ) - { - *response = 0; - } - - if (command == SDIO_CMD_53 ) - { - result = host_sdio_io_rw_extended((struct os_mmcsd_card *)wwd_dev->card, argument, (os_uint8_t *)data, data_size); - } - else - { - rw = direction ? SDIO_ARG_CMD52_WRITE : SDIO_ARG_CMD52_READ; - result = host_sdio_io_rw_direct((struct os_mmcsd_card *)wwd_dev->card, rw, argument, command, (os_uint8_t *)response); - } - - return result; -} - diff --git a/components/WWD/WWD/utilities/besl_structures.h b/components/WWD/WWD/utilities/besl_structures.h deleted file mode 100644 index 89313ce7c015bdeb2ac2daa0fa8c0ac489ab7e6c..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/utilities/besl_structures.h +++ /dev/null @@ -1,427 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#pragma once - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * Macros - ******************************************************/ - -/****************************************************** - * Constants - ******************************************************/ - -#define BESL_ETHERNET_ADDRESS_LENGTH (6) - -/****************************************************** - * Enumerations - ******************************************************/ - -#ifndef RESULT_ENUM -#define RESULT_ENUM( prefix, name, value ) prefix ## name = (value) -#endif /* ifndef RESULT_ENUM */ - -/* - * Values: 3000 - 3999 - */ -#define WPS_BESL_RESULT_LIST( prefix ) \ - RESULT_ENUM( prefix, SUCCESS, 0 ), /**< Success */ \ - RESULT_ENUM( prefix, TIMEOUT, 2 ), /**< Timeout */ \ - RESULT_ENUM( prefix, BADARG, 5 ), /**< Bad Arguments */ \ - RESULT_ENUM( prefix, UNPROCESSED, 3001 ), /**< */ \ - RESULT_ENUM( prefix, IN_PROGRESS, 3002 ), /**< In progress */ \ - RESULT_ENUM( prefix, COMPLETE, 3003 ), /**< */ \ - RESULT_ENUM( prefix, PBC_OVERLAP, 3004 ), /**< */ \ - RESULT_ENUM( prefix, ABORTED, 3005 ), /**< */ \ - RESULT_ENUM( prefix, NOT_STARTED, 3006 ), /**< */ \ - RESULT_ENUM( prefix, REGISTRAR_NOT_READY, 3007 ), /**< */ \ - RESULT_ENUM( prefix, ATTEMPTED_EXTERNAL_REGISTRAR_DISCOVERY, 3008 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_JOIN_FAILED, 3009 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_ENCRYPTED_TLV_HMAC_FAIL, 3010 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_SECRET_NONCE_MISMATCH, 3011 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_MESSAGE_HMAC_FAIL, 3012 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_MESSAGE_TLV_MASK_MISMATCH, 3013 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_ENCRYPTION_TYPE_ERROR, 3014 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_AUTHENTICATION_TYPE_ERROR, 3015 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_REGISTRAR_NONCE_MISMATCH, 3016 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_ENROLLEE_NONCE_MISMATCH, 3017 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_VERSION_MISMATCH, 3018 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_CRYPTO_ERROR, 3019 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_MESSAGE_MISSING_TLV, 3020 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_INCORRECT_MESSAGE, 3021 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_NO_RESPONSE, 3022 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_RECEIVED_EAP_FAIL, 3023 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_RECEIVED_WEP_CREDENTIALS, 3024 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_OUT_OF_MEMORY, 3025 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_QUEUE_PUSH, 3026 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_SCAN_START_FAIL, 3027 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_WPS_STACK_MALLOC_FAIL, 3028 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_CREATING_EAPOL_PACKET, 3029 ), /**< */ \ - RESULT_ENUM( prefix, UNKNOWN_EVENT, 3033 ), /**< */ \ - RESULT_ENUM( prefix, OUT_OF_HEAP_SPACE, 3034 ), /**< */ \ - RESULT_ENUM( prefix, CERT_PARSE_FAIL, 3035 ), /**< */ \ - RESULT_ENUM( prefix, KEY_PARSE_FAIL, 3036 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_DEVICE_LIST_FIND, 3037 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_NO_P2P_TLV, 3038 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_ALREADY_STARTED, 3039 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_HANDLER_ALREADY_REGISTERED, 3040 ), /**< */ \ - RESULT_ENUM( prefix, BUFFER_ALLOC_FAIL, 3041 ), /**< */ \ - RESULT_ENUM( prefix, OTHER_ENROLLEE, 3042 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_RECEIVED_INVALID_CREDENTIALS, 3043 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_HMAC_CHECK_FAIL, 3044 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_UNABLE_TO_SET_WLAN_SECURITY, 3045 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_RUNT_WPS_PACKET, 3046 ), /**< */ - -#define TLS_RESULT_LIST( prefix ) \ - RESULT_ENUM( prefix, SUCCESS, 0 ), /**< */ \ - RESULT_ENUM( prefix, TIMEOUT, 2 ), /**< */ \ - RESULT_ENUM( prefix, ERROR, 4 ), /**< */ \ - RESULT_ENUM( prefix, RECEIVE_FAILED, 5001 ), /**< */ \ - RESULT_ENUM( prefix, ALERT_NO_CERTIFICATE, 5002 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_OUT_OF_MEMORY, 5003 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_FEATURE_UNAVAILABLE, 5004 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_INPUT_DATA, 5005 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_INVALID_MAC, 5006 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_INVALID_RECORD, 5007 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_INVALID_MODULUS_SIZE, 5008 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_UNKNOWN_CIPHER, 5009 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_NO_CIPHER_CHOSEN, 5010 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_NO_SESSION_FOUND, 5011 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_NO_CLIENT_CERTIFICATE, 5012 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_CERTIFICATE_TOO_LARGE, 5013 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_CERTIFICATE_REQUIRED, 5014 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_PRIVATE_KEY_REQUIRED, 5015 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_CA_CHAIN_REQUIRED, 5016 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_UNEXPECTED_MESSAGE, 5017 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_FATAL_ALERT_MESSAGE, 5018 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_PEER_VERIFY_FAILED, 5019 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_PEER_CLOSE_NOTIFY, 5020 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_CLIENT_HELLO, 5021 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_SERVER_HELLO, 5022 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_CERTIFICATE, 5023 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_CERTIFICATE_REQUEST, 5024 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_SERVER_KEY_EXCHANGE, 5025 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_SERVER_HELLO_DONE, 5026 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_CLIENT_KEY_EXCHANGE, 5027 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_CERTIFICATE_VERIFY, 5028 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_CHANGE_CIPHER_SPEC, 5029 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_FINISHED, 5030 ), /**< */ \ - RESULT_ENUM( prefix, HANDSHAKE_TIMEOUT, 5031 ), /**< */ \ - RESULT_ENUM( prefix, HANDSHAKE_ERROR, 5032 ), /**< */ \ - RESULT_ENUM( prefix, INIT_FAIL, 5033 ), /**< */ \ - RESULT_ENUM( prefix, BAD_MESSAGE, 5034 ), /**< */ \ - RESULT_ENUM( prefix, UNTRUSTED_CERTIFICATE, 5035 ), /**< */ \ - RESULT_ENUM( prefix, EXPIRED_CERTIFICATE, 5036 ), /**< */ \ - RESULT_ENUM( prefix, CERTIFICATE_NAME_MISMATCH, 5037 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_DECRYPTION_FAIL, 5038 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_ENCRYPTION_FAIL, 5039 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_HMAC_CHECK_FAIL, 5040 ), /**< */ \ - RESULT_ENUM( prefix, CERTIFICATE_REVOKED, 5041 ), /**< */ \ - RESULT_ENUM( prefix, NO_DATA, 5042 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_UNSUPPORTED_EXTENSION, 5043 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_UNITIALIZED_CONTEXT, 5044 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_UNRECOGNIZED_SERVER_NAME, 5045 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_ILLEGAL_PARAMETER, 5046 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_RECORD_OVERFLOW, 5047 ), /**< */ - -#define DTLS_RESULT_LIST( prefix ) \ - RESULT_ENUM( prefix, SUCCESS, 0 ), /**< */ \ - RESULT_ENUM( prefix, TIMEOUT, 2 ), /**< */ \ - RESULT_ENUM( prefix, ERROR, 4 ), /**< */ \ - RESULT_ENUM( prefix, RECEIVE_FAILED, 5001 ), /**< */ \ - RESULT_ENUM( prefix, ALERT_NO_CERTIFICATE, 5002 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_OUT_OF_MEMORY, 5003 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_FEATURE_UNAVAILABLE, 5004 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_INPUT_DATA, 5005 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_INVALID_MAC, 5006 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_INVALID_RECORD, 5007 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_INVALID_MODULUS_SIZE, 5008 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_UNKNOWN_CIPHER, 5009 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_NO_CIPHER_CHOSEN, 5010 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_NO_SESSION_FOUND, 5011 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_NO_CLIENT_CERTIFICATE, 5012 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_CERTIFICATE_TOO_LARGE, 5013 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_CERTIFICATE_REQUIRED, 5014 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_PRIVATE_KEY_REQUIRED, 5015 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_CA_CHAIN_REQUIRED, 5016 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_UNEXPECTED_MESSAGE, 5017 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_FATAL_ALERT_MESSAGE, 5018 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_PEER_VERIFY_FAILED, 5019 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_PEER_CLOSE_NOTIFY, 5020 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_CLIENT_HELLO, 5021 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_SERVER_HELLO, 5022 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_CERTIFICATE, 5023 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_CERTIFICATE_REQUEST, 5024 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_SERVER_KEY_EXCHANGE, 5025 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_SERVER_HELLO_DONE, 5026 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_CLIENT_KEY_EXCHANGE, 5027 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_CERTIFICATE_VERIFY, 5028 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_CHANGE_CIPHER_SPEC, 5029 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_BAD_HS_FINISHED, 5030 ), /**< */ \ - RESULT_ENUM( prefix, HANDSHAKE_TIMEOUT, 5031 ), /**< */ \ - RESULT_ENUM( prefix, HANDSHAKE_ERROR, 5032 ), /**< */ \ - RESULT_ENUM( prefix, INIT_FAIL, 5033 ), /**< */ \ - RESULT_ENUM( prefix, BAD_MESSAGE, 5034 ), /**< */ \ - RESULT_ENUM( prefix, UNTRUSTED_CERTIFICATE, 5035 ), /**< */ \ - RESULT_ENUM( prefix, EXPIRED_CERTIFICATE, 5036 ), /**< */ \ - RESULT_ENUM( prefix, CERTIFICATE_NAME_MISMATCH, 5037 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_DECRYPTION_FAIL, 5038 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_ENCRYPTION_FAIL, 5039 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_HMAC_CHECK_FAIL, 5040 ), /**< */ \ - RESULT_ENUM( prefix, CERTIFICATE_REVOKED, 5041 ), /**< */ \ - RESULT_ENUM( prefix, NO_DATA, 5042 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_UNSUPPORTED_EXTENSION, 5043 ), /**< */ - - - #define SUPPLICANT_RESULT_LIST( prefix ) \ - RESULT_ENUM( prefix, SUCCESS, 0 ), /**< */ \ - RESULT_ENUM( prefix, TIMEOUT, 2 ), /**< */ \ - RESULT_ENUM( prefix, IN_PROGRESS, 6001 ), /**< */ \ - RESULT_ENUM( prefix, ABORTED, 6002 ), /**< */ \ - RESULT_ENUM( prefix, NOT_STARTED, 6003 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_STACK_MALLOC_FAIL, 6004 ), /**< */ \ - RESULT_ENUM( prefix, OUT_OF_HEAP_SPACE, 6005 ), /**< */ \ - RESULT_ENUM( prefix, COMPLETE, 6006 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_AT_THREAD_START, 6007 ), /**< */ \ - RESULT_ENUM( prefix, UNPROCESSED, 6008 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_CREATING_EAPOL_PACKET, 6009 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_READING_BSSID, 6010 ), /**< */ \ - RESULT_ENUM( prefix, RECEIVED_EAP_FAIL, 6011 ), /**< */ - -#define P2P_RESULT_LIST( prefix ) \ - RESULT_ENUM( prefix, SUCCESS, 0 ), /**< */ \ - RESULT_ENUM( prefix, TIMEOUT, 2 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_FAIL, 9001 ), /**< */ \ - RESULT_ENUM( prefix, ACCEPT_CONNECTION, 9002 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_INCORRECT_SSID, 9003 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_INVALID_DEVICE, 9004 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_MISSING_RSN_IE, 9005 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_INVALID_SCAN_RESULT, 9006 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_MISSING_TLV, 9007 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_INVALID_MAC_ADDRESS, 9008 ), /**< */ \ - RESULT_ENUM( prefix, ERROR_ASSOCIATED_DEVICE_NOT_FOUND, 9009 ), /**< */ \ - RESULT_ENUM( prefix, GROUP_OWNER_WAITING_FOR_CONNECTION, 9010 ), /**< */ \ - RESULT_ENUM( prefix, GROUP_OWNER_WPS_IN_PROGRESS, 9011 ), /**< */ \ - RESULT_ENUM( prefix, GROUP_OWNER_WPS_FAILED, 9012 ), /**< */ \ - RESULT_ENUM( prefix, GROUP_OWNER_WPS_COMPLETE, 9013 ), /**< */ \ - RESULT_ENUM( prefix, GROUP_OWNER_WPS_PBC_OVERLAP, 9014 ), /**< */ \ - RESULT_ENUM( prefix, GROUP_OWNER_WPS_TIMED_OUT, 9015 ), /**< */ \ - RESULT_ENUM( prefix, GROUP_OWNER_WPS_ABORTED, 9016 ), /**< */ \ - RESULT_ENUM( prefix, UNKNOWN, 9017 ), /**< */ - -typedef enum -{ - WPS_BESL_RESULT_LIST( BESL_ ) - TLS_RESULT_LIST( BESL_TLS_ ) - SUPPLICANT_RESULT_LIST( SUPPLICANT_ ) - P2P_RESULT_LIST( BESL_P2P_ ) -} besl_result_t; - - -/****************************************************** - * Type Definitions - ******************************************************/ - -typedef uint8_t besl_bool_t; -typedef uint32_t besl_time_t; - -/****************************************************** - * Packed Structures - ******************************************************/ - -#pragma pack(1) - -typedef struct -{ - uint8_t octet[BESL_ETHERNET_ADDRESS_LENGTH]; -} besl_mac_t; - -typedef struct -{ - uint8_t* data; - uint16_t length; - uint32_t packet_mask; -} besl_ie_t; - -typedef struct -{ - uint8_t ether_dhost[BESL_ETHERNET_ADDRESS_LENGTH]; - uint8_t ether_shost[BESL_ETHERNET_ADDRESS_LENGTH]; - uint16_t ether_type; -} ether_header_t; - -typedef struct -{ - uint8_t version; - uint8_t type; - uint16_t length; -} eapol_header_t; - -typedef struct -{ - ether_header_t ethernet; - eapol_header_t eapol; -} eapol_packet_header_t; - -typedef struct -{ - ether_header_t ethernet; - eapol_header_t eapol; - uint8_t data[1]; -} eapol_packet_t; - -typedef struct -{ - uint8_t code; - uint8_t id; - uint16_t length; - uint8_t type; -} eap_header_t; - -typedef struct -{ - uint8_t type; -} peap_header_t; - -typedef struct -{ - uint8_t type; - uint8_t data[1]; -} peap_packet_t; - -typedef struct -{ - ether_header_t ethernet; - eapol_header_t eapol; - eap_header_t eap; - uint8_t data[1]; -} eap_packet_t; - -typedef struct -{ - uint8_t vendor_id[3]; - uint32_t vendor_type; - uint8_t op_code; - uint8_t flags; -} eap_expanded_header_t; - -typedef struct -{ - uint8_t flags; -} eap_tls_header_t; - -typedef struct -{ - ether_header_t ethernet; - eapol_header_t eapol; - eap_header_t eap; - eap_tls_header_t eap_tls; - uint8_t data[1]; // Data starts with a length of TLS data field or TLS data depending on the flags field -} eap_tls_packet_t; - -typedef struct -{ - uint16_t type; - uint16_t length; - uint8_t value[1]; -}avp_request_t; - -typedef struct -{ - uint16_t type; - uint16_t length; - uint16_t status; -}avp_result_t; - -typedef struct -{ - eap_header_t header; - avp_request_t avp[1]; -}peap_extention_request_t; - -typedef struct -{ - eap_header_t header; - avp_result_t avp[1]; -}peap_extention_response_t; - -typedef struct -{ - uint8_t opcode; - uint8_t id; - uint16_t length; -}mschapv2_header_t; - -typedef struct -{ - uint8_t opcode; - uint8_t id; - uint16_t length; - uint8_t data[1]; -}mschapv2_packet_t; - -typedef struct -{ - uint8_t opcode; - uint8_t id; - uint16_t length; - uint8_t value_size; - uint8_t challenge[16]; - uint8_t name[1]; -}mschapv2_challenge_packet_t; - -typedef struct -{ - uint8_t opcode; - uint8_t id; - uint16_t length; - uint8_t value_size; - uint8_t peer_challenge[16]; - uint8_t reserved[8]; - uint8_t nt_reponse[24]; - uint8_t flags; - uint8_t name[1]; -}mschapv2_response_packet_t; - -typedef struct -{ - uint8_t opcode; - uint8_t id; - uint16_t length; - uint8_t message[1]; -}mschapv2_success_request_packet_t; - -typedef struct -{ - uint8_t opcode; -}mschapv2_success_response_packet_t; - -typedef mschapv2_success_request_packet_t mschapv2_failure_request_packet_t; - -typedef mschapv2_success_response_packet_t mschapv2_failure_response_packet_t; - -#pragma pack() - -/****************************************************** - * Global Variables - ******************************************************/ - -/****************************************************** - * Function Declarations - ******************************************************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif diff --git a/components/WWD/WWD/utilities/crc.h b/components/WWD/WWD/utilities/crc.h deleted file mode 100644 index 5c37ef4e2ff5e86de87becd728a1ec2774cbf927..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/utilities/crc.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#ifndef _INCLUDED_CRC_H_ -#define _INCLUDED_CRC_H_ - -#include -#include "platform_toolchain.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* crc defines */ -#define CRC8_INIT_VALUE 0xff /* Initial CRC8 checksum value */ -#define CRC16_INIT_VALUE 0xffff /* Initial CRC16 checksum value */ -#define CRC32_INIT_VALUE 0xffffffff /* Initial CRC32 checksum value */ - -#ifdef NO_CRC_FUNCTIONS -#define WICED_CRC_FUNCTION_NAME(function) wiced_##function -#else -#define WICED_CRC_FUNCTION_NAME(function) function -#endif - -extern uint8_t WICED_CRC_FUNCTION_NAME( crc8 ) - ( - uint8_t* pdata, /* pointer to array of data to process */ - unsigned int nbytes, /* number of input data bytes to process */ - uint8_t crc /* either CRC8_INIT_VALUE or previous return value */ - ); - -extern uint16_t WICED_CRC_FUNCTION_NAME( crc16 ) - ( - uint8_t* pdata, /* pointer to array of data to process */ - unsigned int nbytes, /* number of input data bytes to process */ - uint16_t crc /* either CRC16_INIT_VALUE or previous return value */ - ); - -extern uint32_t WICED_CRC_FUNCTION_NAME( crc32 ) - ( - uint8_t* pdata, /* pointer to array of data to process */ - unsigned int nbytes, /* number of input data bytes to process */ - uint32_t crc /* either CRC32_INIT_VALUE or previous return value */ - ); - -#ifdef NO_CRC_FUNCTIONS -static inline ALWAYS_INLINE uint8_t crc8( uint8_t* pdata, unsigned int nbytes, uint8_t crc ) -{ - return wiced_crc8( pdata, nbytes, crc ); -} - -static inline ALWAYS_INLINE uint16_t crc16( uint8_t* pdata, unsigned int nbytes, uint16_t crc ) -{ - return wiced_crc16( pdata, nbytes, crc ); -} - -static inline ALWAYS_INLINE uint32_t crc32( uint8_t* pdata, unsigned int nbytes, uint32_t crc ) -{ - return wiced_crc32( pdata, nbytes, crc ); -} -#endif - -#ifdef __cplusplus -} /*extern "C" */ -#endif - -#endif /* ifndef _INCLUDED_CRC_H_ */ diff --git a/components/WWD/WWD/utilities/tlv.c b/components/WWD/WWD/utilities/tlv.c deleted file mode 100644 index ea4cddb9be2e697fc374b1901d2535b3e56f27cb..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/utilities/tlv.c +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#include -#include "tlv.h" -#include "wiced_utilities.h" - -/****************************************************** - * Macros - ******************************************************/ - -/****************************************************** - * Constants - ******************************************************/ - -/****************************************************** - * Enumerations - ******************************************************/ - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Static Function Declarations - ******************************************************/ - -static uint32_t tlv_hton32_ptr(uint8_t* in, uint8_t* out); -static uint16_t tlv_hton16_ptr(uint8_t* in, uint8_t* out); - -/****************************************************** - * Variable Definitions - ******************************************************/ - -/****************************************************** - * Function Definitions - ******************************************************/ - -tlv8_data_t* tlv_find_tlv8( const uint8_t* message, uint32_t message_length, uint8_t type ) -{ - while ( message_length != 0 ) - { - uint8_t current_tlv_type = message[ 0 ]; - uint16_t current_tlv_length = message[ 1 ] + 2; - - /* Check if we've overrun the buffer */ - if ( current_tlv_length > message_length ) - { - return NULL; - } - - /* Check if we've found the type we are looking for */ - if ( current_tlv_type == type ) - { - return (tlv8_data_t*) message; - } - - /* Skip current TLV */ - message += current_tlv_length; - message_length -= current_tlv_length; - } - return 0; -} - -tlv16_data_t* tlv_find_tlv16( const uint8_t* message, uint32_t message_length, uint16_t type ) -{ - while ( message_length != 0 ) - { - tlv16_data_t* tlv = (tlv16_data_t*) message; - uint16_t current_tlv_type = htobe16( WICED_READ_16( &tlv->type ) ); - uint16_t current_tlv_length = htobe16( WICED_READ_16( &tlv->length ) ) + 4; - - /* Check if we've overrun the buffer */ - if ( current_tlv_length > message_length ) - { - return NULL; - } - - /* Check if we've found the type we are looking for */ - if ( current_tlv_type == type ) - { - return tlv; - } - - /* Skip current TLV */ - message += current_tlv_length; - message_length -= current_tlv_length; - } - - return NULL; -} - -tlv_result_t tlv_read_value ( uint16_t type, const uint8_t* message, uint16_t message_length, void* value, uint16_t value_size, tlv_data_type_t data_type ) -{ - tlv16_data_t* tlv = tlv_find_tlv16( message, message_length, type ); - if (tlv == NULL) - { - return TLV_NOT_FOUND; - } - - switch (data_type) - { - case TLV_UINT16: - tlv_hton16_ptr((uint8_t*) tlv->data, value ); - break; - - case TLV_UINT32: - tlv_hton32_ptr((uint8_t*) tlv->data, value ); - break; - - default: - memcpy( value, tlv->data, value_size ); - break; - } - - return TLV_SUCCESS; -} - -uint8_t* tlv_write_value( uint8_t* buffer, uint16_t type, uint16_t length, const void* data, tlv_data_type_t data_type ) -{ - tlv16_data_t* tlv = (tlv16_data_t*) buffer; - WICED_WRITE_16( &tlv->type, htobe16(type) ); - WICED_WRITE_16( &tlv->length, htobe16(length) ); - switch (data_type) - { - case TLV_UINT16: - tlv_hton16_ptr((uint8_t*) data, tlv->data); - break; - - case TLV_UINT32: - tlv_hton32_ptr((uint8_t*) data, tlv->data); - break; - - default: - memcpy(tlv->data, data, length); - break; - } - return buffer + sizeof(tlv16_header_t) + length; -} - -uint8_t* tlv_write_header( uint8_t* buffer, uint16_t type, uint16_t length ) -{ - tlv16_header_t* tlv = (tlv16_header_t*)buffer; - WICED_WRITE_16( &tlv->type, htobe16(type) ); - WICED_WRITE_16( &tlv->length, htobe16(length) ); - return buffer + sizeof(tlv16_header_t); -} - - - -static uint32_t tlv_hton32_ptr(uint8_t * in, uint8_t * out) -{ - uint32_t temp; - temp = WICED_READ_32(in); - temp = htobe32(temp); - WICED_WRITE_32(out, temp); - return temp; -} - -static uint16_t tlv_hton16_ptr(uint8_t * in, uint8_t * out) -{ - uint16_t temp; - temp = WICED_READ_16(in); - temp = htobe16(temp); - WICED_WRITE_16(out, temp); - return temp; -} diff --git a/components/WWD/WWD/utilities/tlv.h b/components/WWD/WWD/utilities/tlv.h deleted file mode 100644 index d701dbac0416ce0a05650e4f29e5750e8cb9bccc..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/utilities/tlv.h +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ - - -/** @file - * Functions to read/write Type-Length-Value (TLV) data used in many common protocols. - */ - -#ifndef INCLUDED_TLV_H -#define INCLUDED_TLV_H - -#include - -/****************************************************** - * Macros - ******************************************************/ - -/****************************************************** - * Constants - ******************************************************/ - -/****************************************************** - * Enumerations - ******************************************************/ - -typedef enum -{ - TLV_UINT8 = 1, - TLV_UINT16 = 2, - TLV_UINT32 = 3, - TLV_CHAR_PTR = 4, - TLV_UINT8_PTR = 5, -} tlv_data_type_t; - -typedef enum -{ - TLV_SUCCESS, - TLV_NOT_FOUND -} tlv_result_t; - - -/****************************************************** - * Type Definitions - ******************************************************/ - -#pragma pack(1) - -/* Structures for TLVs with 16-bit type and 16-bit length */ -typedef struct -{ - uint16_t type; - uint16_t length; -} tlv16_header_t; - -typedef struct -{ - uint16_t type; - uint16_t length; - uint8_t data; -} tlv16_uint8_t; - -typedef struct -{ - uint16_t type; - uint16_t length; - uint16_t data; -} tlv16_uint16_t; - -typedef struct -{ - uint16_t type; - uint16_t length; - uint32_t data; -} tlv16_uint32_t; - -typedef struct -{ - uint16_t type; - uint16_t length; - uint8_t data[1]; -} tlv16_data_t; - -/* Structures for TLVs with 8-bit type and 8-bit length */ -typedef struct -{ - uint8_t type; - uint8_t length; -} tlv8_header_t; - -typedef struct -{ - uint8_t type; - uint8_t length; - uint8_t data; -} tlv8_uint8_t; - -typedef struct -{ - uint8_t type; - uint8_t length; - uint16_t data; -} tlv8_uint16_t; - -typedef struct -{ - uint8_t type; - uint8_t length; - uint32_t data; -} tlv8_uint32_t; - -typedef struct -{ - uint8_t type; - uint8_t length; - uint8_t data[1]; -} tlv8_data_t; - -#pragma pack() - -#ifdef __cplusplus -extern "C" { -#endif - -/** Finds a particular type from a buffer of TLV data. - * - * Returns a pointer to the first TLV which has a type that matches the given type. - * The pointer points to the 'type' field. - * This is the 8-bit-Type & 8-bit-Lenght version - * - * @param[in] message : A pointer to the source TLV data to be searched - * @param[in] message_length : The length of the source TLV data to be searched - * @param[in] type : The TLV type to search for - * - * @return Pointer to start of first matching TLV, or NULL if not found - */ -tlv8_data_t* tlv_find_tlv8 ( const uint8_t* message, uint32_t message_length, uint8_t type ); - -/** Finds a particular type from a buffer of TLV data. - * - * Returns a pointer to the first TLV which has a type that matches the given type. - * The pointer points to the 'type' field. - * This is the 16-bit-Type & 16-bit-Lenght version - * - * @param[in] message : A pointer to the source TLV data to be searched - * @param[in] message_length : The length of the source TLV data to be searched - * @param[in] type : The TLV type to search for - * - * @return Pointer to start of first matching TLV, or NULL if not found - */ -tlv16_data_t* tlv_find_tlv16 ( const uint8_t* message, uint32_t message_length, uint16_t type ); -uint8_t* tlv_write_header ( uint8_t* buffer, uint16_t type, uint16_t length ); -tlv_result_t tlv_read_value ( uint16_t type, const uint8_t* message, uint16_t message_length, void* value, uint16_t value_size, tlv_data_type_t data_type ); -uint8_t* tlv_write_value ( uint8_t* buffer, uint16_t type, uint16_t length, const void* data, tlv_data_type_t data_type ); - -#ifdef __cplusplus -} /*extern "C" */ -#endif - -#endif /* INCLUDED_TLV_H */ diff --git a/components/WWD/WWD/utilities/wiced_utilities.h b/components/WWD/WWD/utilities/wiced_utilities.h deleted file mode 100644 index 46552c21c57c97bd1a2f5d24b710a95e21ffbd69..0000000000000000000000000000000000000000 --- a/components/WWD/WWD/utilities/wiced_utilities.h +++ /dev/null @@ -1,475 +0,0 @@ -/* - * Broadcom Proprietary and Confidential. Copyright 2016 Broadcom - * All Rights Reserved. - * - * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation; - * the contents of this file may not be disclosed to third parties, copied - * or duplicated in any form, in whole or in part, without the prior - * written permission of Broadcom Corporation. - */ -#pragma once - -#include -#include -#include "platform_toolchain.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/****************************************************** - * @cond Macros - ******************************************************/ - -#ifdef LINT -/* Lint does not know about inline functions */ -extern uint16_t htobe16(uint16_t v); -extern uint32_t htobe32(uint32_t v); - -#else /* ifdef LINT */ - -#if defined(WIN32) && !defined(ALWAYS_INLINE) -#define ALWAYS_INLINE -#endif - -#ifndef htobe16 /* This is defined in POSIX platforms */ -static inline ALWAYS_INLINE uint16_t htobe16(uint16_t v) -{ - return (uint16_t)(((v&0x00FF) << 8) | ((v&0xFF00)>>8)); -} -#endif /* ifndef htobe16 */ - -#ifndef htobe32 /* This is defined in POSIX platforms */ -static inline ALWAYS_INLINE uint32_t htobe32(uint32_t v) -{ - return (uint32_t)(((v&0x000000FF) << 24) | ((v&0x0000FF00) << 8) | ((v&0x00FF0000) >> 8) | ((v&0xFF000000) >> 24)); -} -#endif /* ifndef htobe32 */ - -#endif /* ifdef LINT */ - -#ifndef MIN -#define MIN(x,y) ((x) < (y) ? (x) : (y)) -#endif /* ifndef MIN */ - -#ifndef MAX -#define MAX(x,y) ((x) > (y) ? (x) : (y)) -#endif /* ifndef MAX */ - -#ifndef ROUND_UP -#define ROUND_UP(x,y) ((x) % (y) ? (x) + (y)-((x)%(y)) : (x)) -#endif /* ifndef ROUND_UP */ - -#ifndef DIV_ROUND_UP -#define DIV_ROUND_UP(m, n) (((m) + (n) - 1) / (n)) -#endif /* ifndef DIV_ROUND_UP */ - -#define WICED_VERIFY(x) {wiced_result_t res = (x); if (res != WICED_SUCCESS){return res;}} - -#define WICED_VERIFY_GOTO( expr, res_var, label ) {res_var = (expr); if (res_var != WICED_SUCCESS){goto label;}} - -#define MEMCAT(destination, source, source_length) (void*)((uint8_t*)memcpy((destination),(source),(source_length)) + (source_length)) - -#define MALLOC_OBJECT(name,object_type) ((object_type*)malloc_named(name,sizeof(object_type))) - -#define OFFSET(type, member) ((uint32_t)&((type *)0)->member) - -#define ARRAY_SIZE(a) ( sizeof(a) / sizeof(a[0]) ) -#define ARRAY_POSITION( array, element_pointer ) ( ((uint32_t)element_pointer - (uint32_t)array) / sizeof(array[0]) ) - -/* Macros for comparing MAC addresses */ -#define CMP_MAC( a, b ) (((((unsigned char*)a)[0])==(((unsigned char*)b)[0]))&& \ - ((((unsigned char*)a)[1])==(((unsigned char*)b)[1]))&& \ - ((((unsigned char*)a)[2])==(((unsigned char*)b)[2]))&& \ - ((((unsigned char*)a)[3])==(((unsigned char*)b)[3]))&& \ - ((((unsigned char*)a)[4])==(((unsigned char*)b)[4]))&& \ - ((((unsigned char*)a)[5])==(((unsigned char*)b)[5]))) - -#define NULL_MAC( a ) (((((unsigned char*)a)[0])==0)&& \ - ((((unsigned char*)a)[1])==0)&& \ - ((((unsigned char*)a)[2])==0)&& \ - ((((unsigned char*)a)[3])==0)&& \ - ((((unsigned char*)a)[4])==0)&& \ - ((((unsigned char*)a)[5])==0)) - - -#define MEMORY_BARRIER_AGAINST_COMPILER_REORDERING() __asm__ __volatile__ ("" : : : "memory") /* assume registers are Device memory, so have implicit CPU memory barriers */ - -#define REGISTER_WRITE_WITH_BARRIER( type, address, value ) do {*(volatile type *)(address) = (type)(value); MEMORY_BARRIER_AGAINST_COMPILER_REORDERING();} while (0) -#define REGISTER_READ( type, address ) (*(volatile type *)(address)) - -#define wiced_jump_when_not_true( condition, label ) \ - do \ - { \ - if( ( condition ) == 0 ) \ - { \ - goto label; \ - } \ - } while(0) - -#define wiced_action_jump_when_not_true( condition, jump_label, action ) \ - do \ - { \ - if( ( condition ) == 0 ) \ - { \ - { action; } \ - goto jump_label; \ - } \ - } while(0) - - -typedef enum -{ - LEAK_CHECK_THREAD, - LEAK_CHECK_GLOBAL, -} leak_check_scope_t; - -#ifdef WICED_ENABLE_MALLOC_DEBUG -#include "malloc_debug.h" -extern void malloc_print_mallocs ( void ); -#else -#define calloc_named( name, nelems, elemsize) calloc ( nelems, elemsize ) -#define calloc_named_hideleak( name, nelems, elemsize ) calloc ( nelems, elemsize ) -#define realloc_named( name, ptr, size ) realloc( ptr, size ) -#define malloc_named( name, size ) malloc ( size ) -#define malloc_named_hideleak( name, size ) malloc ( size ) -#define malloc_set_name( name ) -#define malloc_leak_set_ignored( global_flag ) -#define malloc_leak_set_base( global_flag ) -#define malloc_leak_check( thread, global_flag ) -#define malloc_transfer_to_curr_thread( block ) -#define malloc_transfer_to_thread( block, thread ) -#define malloc_print_mallocs( void ) -#define malloc_debug_startup_finished( ) -#endif /* ifdef WICED_ENABLE_MALLOC_DEBUG */ - -/* Define macros to assist operation on host MCUs that require aligned memory access */ -#ifndef WICED_HOST_REQUIRES_ALIGNED_MEMORY_ACCESS - -#define WICED_MEMCPY(destination, source, size) memcpy(destination, source, size) - -#define WICED_WRITE_16( pointer, value ) (*((uint16_t*)pointer) = value) -#define WICED_WRITE_32( pointer, value ) (*((uint32_t*)pointer) = value) -#define WICED_READ_16( pointer ) *((uint16_t*)pointer) -#define WICED_READ_32( pointer ) *((uint32_t*)pointer) - -#else /* WICED_HOST_REQUIRES_ALIGNED_MEMORY_ACCESS */ - -#define WICED_MEMCPY( destination, source, size ) mem_byte_cpy( destination, source, size ) - -#define WICED_WRITE_16( pointer, value ) do { ((uint8_t*)pointer)[0] = (uint8_t)value; ((uint8_t*)pointer)[1]=(uint8_t)(value>>8); } while(0) -#define WICED_WRITE_32( pointer, value ) do { ((uint8_t*)pointer)[0] = (uint8_t)value; ((uint8_t*)pointer)[1]=(uint8_t)(value>>8); ((uint8_t*)pointer)[2]=(uint8_t)(value>>16); ((uint8_t*)pointer)[3]=(uint8_t)(value>>24); } while(0) -#define WICED_READ_16( pointer ) (((uint8_t*)pointer)[0] + (((uint8_t*)pointer)[1] << 8)) -#define WICED_READ_32( pointer ) (((uint8_t*)pointer)[0] + ((((uint8_t*)pointer)[1] << 8)) + (((uint8_t*)pointer)[2] << 16) + (((uint8_t*)pointer)[3] << 24)) - -#endif /* WICED_HOST_REQUIRES_ALIGNED_MEMORY_ACCESS */ - -/****************************************************** - * Constants - ******************************************************/ - -#define WICED_NEVER_TIMEOUT (0xFFFFFFFF) -#define WICED_WAIT_FOREVER (0xFFFFFFFF) -#define WICED_NO_WAIT (0) -#define FLOAT_TO_STRING_MAX_FRACTION_SUPPORTED (6) - -/* size ascii printable string for an ethernet address */ -#define WICED_ETHER_ADDR_STR_LEN 18 -#define WICED_ETHER_ADDR_LEN 6 - -/****************************************************** - * Enumerations - ******************************************************/ - -typedef enum -{ - WEP_KEY_ASCII_FORMAT, - WEP_KEY_HEX_FORMAT, -} wep_key_format_t; - -/****************************************************** - * Type Definitions - ******************************************************/ - -/****************************************************** - * Structures - ******************************************************/ - -/****************************************************** - * Global Variables - ******************************************************/ - -/****************************************************** - * Function Declarations - * @endcond - ******************************************************/ - -/** - * Converts a decimal/hexidecimal string to an unsigned long int - * Better than strtol or atol or atoi because the return value indicates if an error occurred - * - * @param string[in] : The string buffer to be converted - * @param str_length[in] : The maximum number of characters to process in the string buffer - * @param value_out[out] : The unsigned in that will receive value of the the decimal string - * @param is_hex[in] : 0 = Decimal string, 1 = Hexidecimal string - * - * @return the number of characters successfully converted. i.e. 0 = error - * - */ -uint8_t string_to_unsigned( const char* string, uint8_t str_length, uint32_t* value_out, uint8_t is_hex ); - -/** - * Converts a unsigned long int to a decimal string - * - * @param value[in] : The unsigned long to be converted - * @param output[out] : The buffer which will receive the decimal string - * @param min_length[in] : the minimum number of characters to output (zero padding will apply if required) - * @param max_length[in] : the maximum number of characters to output (up to 10 ) - * - * @note: No trailing null is added. - * - * @return the number of characters returned. - * - */ -uint8_t unsigned_to_decimal_string( uint32_t value, char* output, uint8_t min_length, uint8_t max_length ); - -/*! - ****************************************************************************** - * Convert a decimal or hexidecimal string to an integer. - * - * @param[in] str The string containing the value. - * - * @return The value represented by the string. - */ - -/** - * Converts a unsigned long int to a decimal string - * - * @param value[in] : The unsigned long to be converted - * @param output[out] : The buffer which will receive the decimal string - * @param min_length[in] : the minimum number of characters to output (zero padding will apply if required) - * @param max_length[in] : the maximum number of characters to output (up to 10 ) - * - * @note: No trailing null is added. - * - * @return the number of characters returned. - * - */ -uint8_t unsigned_to_decimal_string( uint32_t value, char* output, uint8_t min_length, uint8_t max_length ); - -/*! - ****************************************************************************** - * Convert a decimal or hexidecimal string to an integer. - * - * @param[in] str The string containing the value. - * - * @return The value represented by the string. - */ - -uint32_t generic_string_to_unsigned( const char* str ); - -/** - * Converts a decimal/hexidecimal string (with optional sign) to a signed long int - * Better than strtol or atol or atoi because the return value indicates if an error occurred - * - * @param string[in] : The string buffer to be converted - * @param str_length[in] : The maximum number of characters to process in the string buffer - * @param value_out[out] : The unsigned in that will receive value of the the decimal string - * @param is_hex[in] : 0 = Decimal string, 1 = Hexidecimal string - * - * @return the number of characters successfully converted (including sign). i.e. 0 = error - * - */ -uint8_t string_to_signed( const char* string, uint16_t str_length, int32_t* value_out, uint8_t is_hex ); - - -/** - * Converts a signed long int to a decimal string - * - * @param value[in] : The signed long to be converted - * @param output[out] : The buffer which will receive the decimal string - * @param min_length[in] : the minimum number of characters to output (zero padding will apply if required) - * @param max_length[in] : the maximum number of characters to output (up to 10 ) - * - * @note: No trailing null is added. - * - * @return the number of characters returned. - * - */ -uint8_t signed_to_decimal_string( int32_t value, char* output, uint8_t min_length, uint8_t max_length ); - -/** - * Converts a unsigned long int to a hexidecimal string - * - * @param value[in] : The unsigned long to be converted - * @param output[out] : The buffer which will receive the hexidecimal string - * @param min_length[in] : the minimum number of characters to output (zero padding will apply if required) - * @param max_length[in] : the maximum number of characters to output (up to 8 ) - * - * @note: No leading '0x' or trailing null is added. - * - * @return the number of characters returned. - * - */ -uint8_t unsigned_to_hex_string( uint32_t value, char* output, uint8_t min_length, uint8_t max_length ); - - -/** - * Verifies the provided string is a collection of digits. - * - * @param str[in] : The string to verify - * - * @return 1 if string is valid digits, 0 otherwise - * - */ -int is_digit_str( const char* str ); - -/** - ****************************************************************************** - * Convert a nibble into a hex character - * - * @param[in] nibble The value of the nibble in the lower 4 bits - * - * @return The hex character corresponding to the nibble - */ -static inline ALWAYS_INLINE char nibble_to_hexchar( uint8_t nibble ) -{ - if (nibble > 9) - { - return (char)('A' + (nibble - 10)); - } - else - { - return (char) ('0' + nibble); - } -} - - -///** -// ****************************************************************************** -// * Convert a nibble into a hex character -// * -// * @param[in] nibble The value of the nibble in the lower 4 bits -// * -// * @return The hex character corresponding to the nibble -// */ -//static inline ALWAYS_INLINE char hexchar_to_nibble( char hexchar, uint8_t* nibble ) -//{ -// if ( ( hexchar >= '0' ) && ( hexchar <= '9' ) ) -// { -// *nibble = (uint8_t)( hexchar - '0' ); -// return 0; -// } -// else if ( ( hexchar >= 'A' ) && ( hexchar <= 'F' ) ) -// { -// *nibble = (uint8_t) ( hexchar - 'A' + 10 ); -// return 0; -// } -// else if ( ( hexchar >= 'a' ) && ( hexchar <= 'f' ) ) -// { -// *nibble = (uint8_t) ( hexchar - 'a' + 10 ); -// return 0; -// } -// return -1; -//} - -/** - ****************************************************************************** - * Append the two character hex value of a byte to a string - * - * @note: no terminating null is added - * - * @param[out] string The buffer which will receive the two bytes - * @param[in] byte The byte which will be converted to hex - * - * @return A pointer to the character after the two hex characters added - */ -static inline ALWAYS_INLINE char* string_append_two_digit_hex_byte( char* string, uint8_t byte ) -{ - *string = nibble_to_hexchar( ( byte & 0xf0 ) >> 4 ); - string++; - *string = nibble_to_hexchar( ( byte & 0x0f ) >> 0 ); - string++; - return string; -} - -/** - ****************************************************************************** - * Convert WEP security key to the format used by WICED - * - * @param[out] wep_key_ouput The converted key - * @param[in] wep_key_data The WEP key to convert - * @param[in,out] wep_key_length The length of the WEP key data. Upon return, the length of the converted WEP key - * @param[in] wep_key_format The current format of the WEP key - */ -void format_wep_keys( char* wep_key_output, const char* wep_key_data, uint8_t* wep_key_length, wep_key_format_t wep_key_format ); - -/** - ****************************************************************************** - * Length limited version of strstr. Adapted from bcmstrnstr in bcmutils.c - * - * @param arg The string to be searched. - * @param arg The length of the string to be searched. - * @param arg The string to be found. - * @param arg The length of the string to be found. - * - * @return pointer to the found string if search successful, otherwise NULL - */ -char* strnstr( const char* s, uint16_t s_len, const char* substr, uint16_t substr_len ); - -/** - ****************************************************************************** - * Length limited version of strcasestr. Adapted from bcmstrnstr in bcmutils.c - * - * @param arg The string to be searched. - * @param arg The length of the string to be searched. - * @param arg The string to be found. - * @param arg The length of the string to be found. - * - * @return pointer to the found string if search successful, otherwise NULL - */ -char* strncasestr( const char* s, uint16_t s_len, const char* substr, uint16_t substr_len ); - -/** - ****************************************************************************** - * Compare a string to a pattern containing wildcard character(s). - * - * @note: The following wildcard characters are supported: - * \li '*' for matching zero or more characters - * \li '?' for matching exactly one character - * - * @param[in] string The target string to compare with with the pattern - * @param[in] length The length of the target string - * @param[in] pattern The NUL-terminated string pattern which contains wildcard character(s) - * - * @return 1 if the string matches the pattern; 0 otherwise. - */ -uint8_t match_string_with_wildcard_pattern( const char* string, uint32_t length, const char* pattern ); - -/** - ****************************************************************************** - * Convert ether address to a printable string - * - * @param[in] ea Ethernet address to convert - * @param[in] buf Buffer to write the ascii string into - * @param[in] buf_len Length of the memory buf points to - * - * @return Pointer to buf if successful; "" if not successful due to buffer too short - */ -char* wiced_ether_ntoa( const uint8_t *ea, char *buf, uint8_t buf_len ); - -/* - ****************************************************************************** - * Float output into the char buffer - * - * @param arg Char buffer in which float value to be stored. - * @param arg Float value. - * @param arg Decimal resolution max support upto 6. - * -* @return Number of char printed in buffer. On error, returns 0. - */ -uint8_t float_to_string ( char* buffer, uint8_t buffer_len, float value, uint8_t resolution ); - -#ifdef __cplusplus -} /*extern "C" */ -#endif diff --git a/components/WWD/ap6181.c b/components/WWD/ap6181.c deleted file mode 100644 index 61ae043d8c61d8567d4d8c823daa7954b6c07acd..0000000000000000000000000000000000000000 --- a/components/WWD/ap6181.c +++ /dev/null @@ -1,141 +0,0 @@ -/** - *********************************************************************************************************************** - * Copyright (c) 2020, China Mobile Communications Group Co.,Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - * - * @file drv_ap6181.c - * - * @brief This file implements ap6181 driver. - * - * @revision - * Date Author Notes - * 2021-08-12 OneOS Team First Version - *********************************************************************************************************************** - */ - -#include -#include -#include -#include -#include - -#include "oneos_config.h" -#include "drv_cfg.h" - -#include "wlan_dev.h" -#include "wlan_lwip.h" - -#define DRV_EXT_LVL DBG_EXT_INFO -#define DRV_EXT_TAG "wwd_wifi" -#include - -#ifndef BSP_USING_AP6181_AP_PASSWORD -#define BSP_USING_AP6181_AP_PASSWORD OS_NULL -#endif - -static int ap6181_early_init(void) -{ - /* WIFI_REG_ON */ - if (BSP_AP6181_IRQ_PIN >= 0) - { - os_pin_mode(BSP_AP6181_REG_ON_PIN, PIN_MODE_OUTPUT); - os_pin_write(BSP_AP6181_REG_ON_PIN, PIN_LOW); - os_hw_us_delay(1000); - os_pin_write(BSP_AP6181_REG_ON_PIN, PIN_HIGH); - os_hw_us_delay(1000); - } - return 0; -} -OS_PREV_INIT(ap6181_early_init, OS_INIT_SUBLEVEL_HIGH); - -static int ap6181_init(void) -{ - struct os_device *dev = OS_NULL; - -#ifdef BSP_USING_AP6181_STA - dev = os_device_find(OS_WLAN_DEVICE_STA_NAME); - if (dev == OS_NULL) - { - LOG_E(DRV_EXT_TAG, "wifi_dev %s cannot find!", OS_WLAN_DEVICE_STA_NAME); - return OS_EOK; - } - - if (BSP_AP6181_IRQ_PIN >= 0) - { - os_pin_mode(BSP_AP6181_IRQ_PIN, PIN_MODE_INPUT_PULLUP); - os_pin_attach_irq(BSP_AP6181_IRQ_PIN, PIN_IRQ_MODE_RISING_FALLING, os_wlan_irq_handler, dev); - os_pin_irq_enable(BSP_AP6181_IRQ_PIN, PIN_IRQ_ENABLE); - } - else - { - os_wlan_noirq_handler(dev); - } - -#ifdef BSP_USING_AP6181_LWIP - if (os_wlan_lwip_register(dev) != OS_EOK) - { - LOG_E(DRV_EXT_TAG, "os_wlan_lwip_register fialed!"); - return OS_EOK; - } -#endif - - os_wlan_sta_start(dev, OS_WLAN_COUNTRY_CHINA, OS_WLAN_SECURITY_WPA2_MIXED_PSK); -#endif - -#ifdef BSP_USING_AP6181_AP - dev = os_device_find(OS_WLAN_DEVICE_AP_NAME); - if (dev == OS_NULL) - { - LOG_E(DRV_EXT_TAG, "wifi_dev %s cannot find!", OS_WLAN_DEVICE_AP_NAME); - return OS_EOK; - } - - if (BSP_AP6181_IRQ_PIN >= 0) - { - os_pin_mode(BSP_AP6181_IRQ_PIN, PIN_MODE_INPUT_PULLUP); - os_pin_attach_irq(BSP_AP6181_IRQ_PIN, PIN_IRQ_MODE_RISING_FALLING, os_wlan_irq_handler, dev); - os_pin_irq_enable(BSP_AP6181_IRQ_PIN, PIN_IRQ_ENABLE); - } - else - { - os_wlan_noirq_handler(dev); - } - -#ifdef BSP_USING_AP6181_LWIP - if (os_wlan_lwip_register(dev) != OS_EOK) - { - LOG_E(DRV_EXT_TAG, "os_wlan_lwip_register fialed!"); - return OS_EOK; - } -#endif - - os_wlan_security_t security; - - switch (BSP_USING_AP6181_AP_SECURITY) - { - case 0: - security = OS_WLAN_SECURITY_OPEN; - break; - case 1: - security = OS_WLAN_SECURITY_WPA2_AES_PSK; - break; - default: - security = OS_WLAN_SECURITY_WPA2_AES_PSK; - break; - } - - os_wlan_ap_start(dev, BSP_USING_AP6181_AP_SSID, BSP_USING_AP6181_AP_PASSWORD, OS_WLAN_COUNTRY_CHINA, security, BSP_USING_AP6181_AP_CHANNEL); -#endif - - return OS_EOK; -} - -OS_APP_INIT(ap6181_init, OS_INIT_SUBLEVEL_LOW); diff --git a/components/WWD/wwd_bus_imxrt10xx.c b/components/WWD/wwd_bus_imxrt10xx.c deleted file mode 100644 index 7cdfe5ded9f4263dc561344be0587aa0509604a6..0000000000000000000000000000000000000000 --- a/components/WWD/wwd_bus_imxrt10xx.c +++ /dev/null @@ -1,79 +0,0 @@ -/** - *********************************************************************************************************************** - * Copyright (c) 2020, China Mobile Communications Group Co.,Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - * - * @file wwd_bus.c - * - * @brief This file implements wwd bus driver. - * - * @revision - * Date Author Notes - * 2021-08-12 OneOS Team First Version - *********************************************************************************************************************** - */ -#include -#include -#include -#include -#include -#include -#include -#include - -#include "wwd_wifi.h" -#include "wwd_poll.h" -#include - -#include -#include "drv_sdio.h" - -#define DRV_EXT_LVL DBG_EXT_INFO -#define DRV_EXT_TAG "wwd_bus" -#include - -os_err_t os_wwd_wait_bus(void) -{ - return OS_EOK; -} - -os_err_t os_wwd_bus_init(void) -{ - os_uint8_t i = 0; - char dev_name[6] = "sdio0"; - - if (wwd_dev->status != WWD_STATE_UNUSED) - { - return OS_EOK; - } - - for (i = 0;i < IMXRT_SDIO_MAX_NUM;i++) - { - wwd_dev->card = (void *)imxrt_sdio_get_card(dev_name); - if (wwd_dev->card != OS_NULL) - { - break; - } - - dev_name[4]++; - } - - if (wwd_dev->card == OS_NULL) - { - LOG_E(DRV_EXT_TAG, "wwd_dev->card get fail"); - return OS_ERROR; - } - - wwd_dev->driver = OS_NULL; - wwd_dev->status = WWD_STATE_INIT; - - return OS_EOK; -} diff --git a/components/WWD/wwd_bus_stm32.c b/components/WWD/wwd_bus_stm32.c deleted file mode 100644 index dd12225a82e691bd66f545f03be6fdb84b9c1b8e..0000000000000000000000000000000000000000 --- a/components/WWD/wwd_bus_stm32.c +++ /dev/null @@ -1,88 +0,0 @@ -/** - *********************************************************************************************************************** - * Copyright (c) 2020, China Mobile Communications Group Co.,Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - * - * @file wwd_bus.c - * - * @brief This file implements wwd bus driver. - * - * @revision - * Date Author Notes - * 2021-08-12 OneOS Team First Version - *********************************************************************************************************************** - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "wwd_wifi.h" -#include "wwd_poll.h" -#include - -static os_int32_t os_wwd_sdio_probe(struct os_mmcsd_card *card) -{ - wwd_dev->card = (void *)card; - return 0; -} - -static os_int32_t os_wwd_sdio_remove(struct os_mmcsd_card *card) -{ - return 0; -} - -static struct os_sdio_device_id wwd_sdio_id = -{ - .func_code = 0, - .manufacturer = 0x02D0, - .product = 0xA962, -}; - -struct os_sdio_driver wwd_sdio_driver = -{ - .name = "wwd", - .probe = os_wwd_sdio_probe, - .remove = os_wwd_sdio_remove, - .id = &wwd_sdio_id, -}; - -os_err_t os_wwd_wait_bus(void) -{ - while(wwd_dev->card == OS_NULL) - { - os_task_msleep(50); - } - - return OS_EOK; -} - -os_err_t os_wwd_bus_init(void) -{ - if (wwd_dev->status != WWD_STATE_UNUSED) - { - return OS_EOK; - } - - wwd_dev->card = OS_NULL; - wwd_dev->driver = (void *)&wwd_sdio_driver; - wwd_dev->status = WWD_STATE_INIT; - - sdio_register_driver((struct os_sdio_driver *)wwd_dev->driver); - - return OS_EOK; -} diff --git a/components/WWD/wwd_dev.c b/components/WWD/wwd_dev.c deleted file mode 100644 index c9e4ca6f2c7e7ae6cfc185dd6ff9e2ad635facc3..0000000000000000000000000000000000000000 --- a/components/WWD/wwd_dev.c +++ /dev/null @@ -1,506 +0,0 @@ -/** - *********************************************************************************************************************** - * Copyright (c) 2020, China Mobile Communications Group Co.,Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - * - * @file wwd_dev.c - * - * @brief This file implements wwd driver. - * - * @revision - * Date Author Notes - * 2021-08-12 OneOS Team First Version - *********************************************************************************************************************** - */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "platform/wwd_platform_interface.h" -#include "platform/wwd_bus_interface.h" -#include "wwd_management.h" -#include "network/wwd_buffer_interface.h" -#include "network/wwd_network_interface.h" -#include "network/wwd_network_constants.h" -#include "RTOS/wwd_rtos_interface.h" -#include "wwd_wifi.h" -#include "wwd_poll.h" -#include "wwd_events.h" -#include -#include "NoOS_canned_send.h" -#include "wwd_debug.h" -#include "wiced_utilities.h" - -#define DRV_EXT_LVL DBG_EXT_INFO -#define DRV_EXT_TAG "wwd_dev" -#include - -struct os_wwd_device *wwd_dev = OS_NULL; - -const wwd_event_num_t event_nums[] = -{ - WLC_E_AP_STARTED, - WLC_E_LINK, - WLC_E_NONE /***the last member must be WLC_E_NONE***/ -}; - -void *os_wwd_event_handler(const wwd_event_header_t *event_header, const uint8_t *event_data, void *handler_user_data) -{ - os_ubase_t event = 0; - - struct os_wlan_device *wlan_dev = (struct os_wlan_device *)handler_user_data; - - switch(event_header->event_type) - { - case WLC_E_AP_STARTED: - event = ION_WLAN_AP_START; - break; - case WLC_E_LINK: - event = ION_WLAN_JOIN; - break; - default: - break; - } - - os_device_notify(&wlan_dev->parent, event, (os_ubase_t)wlan_dev); - - return handler_user_data; -} - -os_err_t os_wwd_register_event_handler(struct os_wlan_device *wlan_dev) -{ - wwd_interface_t interface; - - if (wlan_dev->mode == OS_WLAN_STATION) - interface = WWD_STA_INTERFACE; - else - interface = WWD_AP_INTERFACE; - - wwd_management_set_event_handler(event_nums, os_wwd_event_handler, wlan_dev, interface); - - return OS_EOK; -} - -void os_wwd_init_task(void *parameter) -{ - struct os_wlan_device *wlan_dev = (struct os_wlan_device *)parameter; - - if (os_wwd_bus_init() != OS_EOK) - { - LOG_E(DRV_EXT_TAG, "os_wwd_bus_init failed!"); - return; - } - - if (os_wwd_wait_bus() != OS_EOK) - { - LOG_E(DRV_EXT_TAG, "os_wwd_wait_bus failed!"); - return; - } - - NoOS_setup_timing(); - - wwd_buffer_init(OS_NULL); - - if(wwd_management_wifi_on((wiced_country_code_t)wlan_dev->info.country) != WWD_SUCCESS) - { - LOG_E(DRV_EXT_TAG, "Error when starting WICED!"); - } - else - { - os_wwd_register_event_handler(wlan_dev); - - os_wlan_init_callback((struct os_wlan_device *)parameter); - - if (wlan_dev->mode == OS_WLAN_AP) - { - wiced_ssid_t ap_ssid = {0}; - os_uint8_t ssid_len = strlen(wlan_dev->info.ssid); - os_uint8_t password_len = strlen(wlan_dev->info.password); - - memcpy(&ap_ssid.value, wlan_dev->info.ssid, ssid_len); - ap_ssid.length = ssid_len; - - if (wwd_wifi_start_ap(&ap_ssid, (wiced_security_t)wlan_dev->info.security, (uint8_t*)wlan_dev->info.password, password_len, wlan_dev->info.channel) != WWD_SUCCESS) - { - LOG_E(DRV_EXT_TAG, "wwd_wifi_start_ap fialed!"); - return; - } - } - - wwd_dev->status = WWD_STATE_RUN; - } -} - -void os_wwd_init(struct os_wlan_device *wlan_dev) -{ - os_task_t *task; - - task = os_task_create("wwd_init", os_wwd_init_task, wlan_dev, WWD_INIT_TASK_STACK, WWD_INIT_TASK_PRIORITY); - OS_ASSERT(task); - os_task_startup(task); -} - -os_err_t os_wwd_ap_start(struct os_wlan_device *wlan_dev) -{ - os_wwd_init(wlan_dev); - - return OS_EOK; -} - -os_err_t os_wwd_ap_stop(struct os_wlan_device *wlan_dev) -{ - if(wwd_wifi_stop_ap() != WWD_SUCCESS) - { - return OS_ERROR; - } - - return OS_EOK; -} - -os_err_t os_wwd_sta_start(struct os_wlan_device *wlan_dev) -{ - os_wwd_init(wlan_dev); - - return OS_EOK; -} - -os_err_t os_wwd_sta_stop(struct os_wlan_device *wlan_dev) -{ - return OS_EOK; -} - -void os_wwd_irq_handler(void *param) -{ - wwd_thread_notify_irq(); -} - -void wwd_notify_task(void *param) -{ -#ifdef WWD_NOTIFY_TASK_PERIOD - while(wwd_dev->status == WWD_STATE_UNUSED) - { - os_task_msleep(50); - } - - while(wwd_dev->status != WWD_STATE_UNUSED) - { - wwd_thread_notify_irq(); - os_task_msleep(WWD_NOTIFY_TASK_PERIOD); - } -#endif -} - -void os_wwd_noirq_handler(void *param) -{ -#if defined(WWD_NOTIFY_TASK_STACK) && defined(WWD_NOTIFY_TASK_PRIORITY) - struct os_wlan_device *wlan_dev = (struct os_wlan_device *)param; - - wlan_dev->wwd_dev->notify_task = os_task_create("wwd_notify", wwd_notify_task, wlan_dev, WWD_NOTIFY_TASK_STACK, WWD_NOTIFY_TASK_PRIORITY); - if (wlan_dev->wwd_dev->notify_task == OS_NULL) - { - LOG_E(DRV_EXT_TAG, "wwd_notify_task create failed!"); - return; - } - - os_task_startup(wlan_dev->wwd_dev->notify_task); -#endif -} - -os_err_t os_wwd_protocol_send(struct os_wlan_device *wlan_dev, char *buff) -{ - wwd_interface_t interface; - - if (wlan_dev->mode == OS_WLAN_STATION) - interface = WWD_STA_INTERFACE; - else - interface = WWD_AP_INTERFACE; - - host_network_send_ethernet_data(buff, interface); - - return OS_EOK; -} - -void host_network_process_ethernet_data(wiced_buffer_t buffer, wwd_interface_t interface) -{ - if (interface == WWD_STA_INTERFACE) - { - os_wlan_protocol_report(&wwd_dev->wlan_sta_dev, (char *)buffer); - } - else if (interface == WWD_AP_INTERFACE) - { - os_wlan_protocol_report(&wwd_dev->wlan_ap_dev, (char *)buffer); - } -} - -static os_err_t os_wwd_join(struct os_wlan_device *wlan_dev) -{ - wiced_ssid_t ap_ssid = {0}; - os_uint8_t ssid_len = strlen(wlan_dev->info.ssid); - os_uint8_t password_len = strlen(wlan_dev->info.password); - - if (wlan_dev->mode != OS_WLAN_STATION) - { - LOG_E(DRV_EXT_TAG, "%s is ap only, not support join", wlan_dev->parent.name); - return OS_ERROR; - } - - if (ssid_len >= SSID_NAME_SIZE) - { - LOG_E(DRV_EXT_TAG, "ssid_len is more than SSID_NAME_SIZE!"); - return OS_ERROR; - } - - if (wwd_dev->status != WWD_STATE_RUN) - { - return OS_ERROR; - } - - memcpy(&ap_ssid.value, wlan_dev->info.ssid, ssid_len); - ap_ssid.length = ssid_len; - - if (wwd_wifi_join(&ap_ssid, (wiced_security_t)wlan_dev->info.security, (uint8_t*)wlan_dev->info.password, password_len, OS_NULL) != WWD_SUCCESS) - { - return OS_ERROR; - } - - return OS_EOK; -} - -static os_err_t os_wwd_leave(struct os_wlan_device *wlan_dev) -{ - wwd_interface_t interface; - - if (wlan_dev->mode == OS_WLAN_STATION) - { - interface = WWD_STA_INTERFACE; - } - else - { - return OS_ERROR; - } - - if (wwd_wifi_leave(interface) != WWD_SUCCESS) - { - return OS_ERROR; - } - - return OS_EOK; -} - -static os_err_t os_wwd_get_mac(struct os_wlan_device *wlan_dev, os_uint8_t *mac) -{ - wwd_interface_t interface; - - if (wlan_dev->mode == OS_WLAN_STATION) - interface = WWD_STA_INTERFACE; - else - interface = WWD_AP_INTERFACE; - - if (wwd_wifi_get_mac_address((wiced_mac_t *)mac, interface) != WWD_SUCCESS) - { - return OS_ERROR; - } - - return OS_EOK; -} - -static void scan_results_handler(wiced_scan_result_t** result_ptr, void* user_data, wiced_scan_status_t status) -{ - int i = 0; - wiced_scan_result_t *result = (*result_ptr); - struct os_wlan_scan_info *info = OS_NULL; - struct os_wwd_scan_process_info *process_info = user_data; - - if (result_ptr == OS_NULL) - { - os_sem_post(&process_info->sem); - return; - } - - if (process_info->scan_result->scan_info != OS_NULL) - { - while ((NULL_MAC(process_info->scan_result->scan_info[i].bssid) == WICED_FALSE) && (i !=process_info->scan_result->num)) - { - if (CMP_MAC(result->BSSID.octet, process_info->scan_result->scan_info[i].bssid)) - { - return; - } - i++; - } - } - - process_info->scan_result->num++; - - info = os_realloc(process_info->scan_result->scan_info, process_info->scan_result->num * sizeof(struct os_wlan_scan_info)); - - if (info == OS_NULL) - { - process_info->scan_result->num--; - LOG_E(DRV_EXT_TAG, "no enough memery to store scan info!"); - os_sem_post(&process_info->sem); - return; - } - - process_info->scan_result->scan_info = info; - - info = &process_info->scan_result->scan_info[process_info->scan_result->num-1]; - - memcpy(&info->bssid[0], result->BSSID.octet, 6); - strncpy((char *)&info->ssid.val[0], (const char *)result->SSID.value, OS_WLAN_SSID_MAX_LENGTH); - - info->ssid.len = result->SSID.length; - info->band = (os_wlan_802_11_band_t)result->band; - info->channel = result->channel; - info->max_data_rate = result->max_data_rate; - info->security = (os_wlan_security_t)result->security; - info->signal_strength = result->signal_strength; -} - - -static struct os_wlan_scan_result *os_wwd_scan(struct os_wlan_device *wlan, os_uint32_t msec) -{ - wiced_scan_result_t *result_ptr = OS_NULL; - struct os_wlan_scan_result *scan_result = OS_NULL; - struct os_wwd_scan_process_info *process_info = OS_NULL; - - result_ptr = os_calloc(1, sizeof(wiced_scan_result_t)); - if (result_ptr == OS_NULL) - { - LOG_E(DRV_EXT_TAG, "os_calloc wiced_scan_result_t failed!"); - return OS_NULL; - } - - scan_result = os_calloc(1, sizeof(struct os_wlan_scan_result)); - if(scan_result == OS_NULL) - { - LOG_E(DRV_EXT_TAG, "os_calloc os_wlan_scan_result failed!"); - os_free(result_ptr); - return OS_NULL; - } - - process_info = os_calloc(1, sizeof(struct os_wwd_scan_process_info)); - if(process_info == OS_NULL) - { - os_free(scan_result); - os_free(result_ptr); - LOG_E(DRV_EXT_TAG, "os_calloc os_wwd_scan_process_info failed!"); - return OS_NULL; - } - - process_info->scan_result = scan_result; - - if (os_sem_init(&process_info->sem, "scan", 0, 1) != OS_EOK) - { - goto end; - } - - if (OS_EOK != wwd_wifi_scan(WICED_SCAN_TYPE_ACTIVE, WICED_BSS_TYPE_ANY, NULL, NULL, NULL, NULL, scan_results_handler, (wiced_scan_result_t **) &result_ptr, process_info, WWD_STA_INTERFACE ) ) - { - LOG_E(DRV_EXT_TAG, "Error starting scan"); - goto end; - } - - if (os_sem_wait(&process_info->sem, os_tick_from_ms(msec)) != OS_EOK) - { - wwd_wifi_abort_scan(); - } - - os_sem_deinit(&process_info->sem); - - os_free(result_ptr); - os_free(process_info); - - return scan_result; -end: - os_sem_deinit(&process_info->sem); - - os_free(scan_result); - os_free(result_ptr); - os_free(process_info); - return OS_NULL; -} - -static os_err_t os_wwd_scan_stop(struct os_wlan_device *wlan) -{ - wwd_wifi_abort_scan(); - - return OS_EOK; -} - -static os_err_t os_wwd_scan_clean_result(struct os_wlan_device *wlan, struct os_wlan_scan_result *info) -{ - os_free(info->scan_info); - os_free(info); - - return OS_EOK; -} - -static const struct os_wlan_device_ops wlan_ops = -{ - .ap_start = os_wwd_ap_start, - .ap_stop = os_wwd_ap_stop, - .sta_start = os_wwd_sta_start, - .sta_stop = os_wwd_sta_stop, - .get_mac = os_wwd_get_mac, - .join = os_wwd_join, - .check_join_status = OS_NULL, - .leave = os_wwd_leave, - .irq_handler = os_wwd_irq_handler, - .noirq_handler = os_wwd_noirq_handler, - .protocol_send = os_wwd_protocol_send, - .wlan_scan = os_wwd_scan, - .wlan_scan_stop = os_wwd_scan_stop, - .wlan_scan_clean_result = os_wwd_scan_clean_result -}; - -int os_wlan_wwd_probe(void) -{ - wwd_dev = os_calloc(1, sizeof(struct os_wwd_device)); - if (wwd_dev == OS_NULL) - { - LOG_E(DRV_EXT_TAG, "wwd_dev mem call failed"); - return OS_ERROR; - } - - wwd_dev->status = WWD_STATE_UNUSED; - - wwd_dev->wlan_sta_dev.ops = &wlan_ops; - wwd_dev->wlan_sta_dev.flags = OS_WLAN_FLAG_STA_ONLY; - wwd_dev->wlan_sta_dev.mode = OS_WLAN_STATION; - wwd_dev->wlan_sta_dev.parent.type = OS_DEVICE_TYPE_MISCELLANEOUS; - - if (os_wlan_register(&wwd_dev->wlan_sta_dev, OS_WLAN_DEVICE_STA_NAME) != OS_EOK) - { - return OS_ERROR; - } - - wwd_dev->wlan_ap_dev.ops = &wlan_ops; - wwd_dev->wlan_ap_dev.flags = OS_WLAN_FLAG_AP_ONLY; - wwd_dev->wlan_ap_dev.mode = OS_WLAN_AP; - wwd_dev->wlan_ap_dev.parent.type = OS_DEVICE_TYPE_MISCELLANEOUS; - - if (os_wlan_register(&wwd_dev->wlan_ap_dev, OS_WLAN_DEVICE_AP_NAME) != OS_EOK) - { - return OS_ERROR; - } - - return OS_EOK; -} -OS_CMPOENT_INIT(os_wlan_wwd_probe, OS_INIT_SUBLEVEL_MIDDLE); - diff --git a/components/WWD/wwd_dev.h b/components/WWD/wwd_dev.h deleted file mode 100644 index b574b8103b95ebf7f9a4478cbc8548a1c0fc7d20..0000000000000000000000000000000000000000 --- a/components/WWD/wwd_dev.h +++ /dev/null @@ -1,69 +0,0 @@ -/** - *********************************************************************************************************************** - * Copyright (c) 2020, China Mobile Communications Group Co.,Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - * - * @file wwd_dev.h - * - * @brief This file implements wwd interface. - * - * @revision - * Date Author Notes - * 2021-08-12 OneOS Team First Version - *********************************************************************************************************************** - */ - -#ifndef __WWD_DEV_H__ -#define __WWD_DEV_H__ - -#include "os_task.h" -#include "wlan_dev.h" - -#define COUNTRY WICED_COUNTRY_CHINA -#define AP_SEC WICED_SECURITY_WPA2_MIXED_PSK -#define AP_CHANNEL 1 - -typedef enum -{ - WWD_STATE_UNUSED = 0, - WWD_STATE_INIT = 1, - WWD_STATE_RUN = 2 -}wwd_status_t; - -struct os_wwd_device -{ - struct os_wlan_device wlan_sta_dev; - struct os_wlan_device wlan_ap_dev; - void *card; - void *driver; - os_task_t *notify_task; - wwd_status_t status; -}; - -struct os_wwd_scan_process_info -{ - os_sem_t sem; - struct os_wlan_scan_result *scan_result; -}; - -extern struct os_wwd_device *wwd_dev; - -extern os_err_t os_wwd_bus_init(void); -extern os_err_t os_wwd_wait_bus(void); - -struct os_wwd_device *os_wlan_wwd_init(void); - - -#endif - - - - diff --git a/demos/driver/wlan_test.c b/demos/driver/wlan_test.c deleted file mode 100644 index 5119d4a07201871fd1942eecf272346fec2f2592..0000000000000000000000000000000000000000 --- a/demos/driver/wlan_test.c +++ /dev/null @@ -1,199 +0,0 @@ -/** - *********************************************************************************************************************** - * Copyright (c) 2020, China Mobile Communications Group Co.,Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - * - * @file wlan_test.c - * - * @brief The test file for wlan. - * - * @revision - * Date Author Notes - * 2020-02-20 OneOS Team First Version - *********************************************************************************************************************** - */ - -#include -#include -#include -#include - -#define DRV_EXT_LVL DBG_EXT_INFO -#define DRV_EXT_TAG "wlan_lwip" -#include - -#define wlan_name "wlan0" -#if 0 -static int wifi_scan(int argc, char **argv) -{ - int index; - os_device_t *device = OS_NULL; - struct os_wlan_scan_result *scan_result = OS_NULL; - - device = os_device_find(wlan_name); - if (device == OS_NULL) - { - LOG_E(DRV_EXT_TAG, "os_device_find failed!"); - } - - scan_result = os_wlan_scan(device, 2000); - if (scan_result == OS_NULL) - { - LOG_E(DRV_EXT_TAG, "os_wlan_scan failed!"); - } - - os_kprintf(" SSID MAC security rssi chn Mbps\r\n"); - os_kprintf("------------------------------- ----------------- -------------- ---- --- ----\r\n"); - for (index = 0; index < scan_result->num; index++) - { - os_kprintf("%s\r\n", &scan_result->scan_info[index].ssid.val[0]); - os_kprintf("%02x:%02x:%02x:%02x:%02x:%02x\r\n", - scan_result->scan_info[index].bssid[0], - scan_result->scan_info[index].bssid[1], - scan_result->scan_info[index].bssid[2], - scan_result->scan_info[index].bssid[3], - scan_result->scan_info[index].bssid[4], - scan_result->scan_info[index].bssid[5]); - } - os_wlan_scan_clean_result(device, scan_result); - - return 0; -} -#endif -static int wifi_scan(int argc, char **argv) -{ - int index; - char *security; - os_device_t *device = OS_NULL; - struct os_wlan_scan_result *scan_result = OS_NULL; - - device = os_device_find(wlan_name); - if (device == OS_NULL) - { - LOG_E(DRV_EXT_TAG, "os_device_find failed!"); - } - - scan_result = os_wlan_scan(device, 2000); - if (scan_result == OS_NULL) - { - LOG_E(DRV_EXT_TAG, "os_wlan_scan failed!"); - } - - os_kprintf(" SSID MAC security rssi chn Mbps\r\n"); - os_kprintf("------------------------------- ----------------- -------------- ---- --- ----\r\n"); - for (index = 0; index < scan_result->num; index++) - { - os_kprintf("%-32.32s", &scan_result->scan_info[index].ssid.val[0]); - os_kprintf("%02x:%02x:%02x:%02x:%02x:%02x ", - scan_result->scan_info[index].bssid[0], - scan_result->scan_info[index].bssid[1], - scan_result->scan_info[index].bssid[2], - scan_result->scan_info[index].bssid[3], - scan_result->scan_info[index].bssid[4], - scan_result->scan_info[index].bssid[5]); - switch (scan_result->scan_info[index].security) - { - case OS_WLAN_SECURITY_OPEN: - security = "OPEN"; - break; - case OS_WLAN_SECURITY_WEP_PSK: - security = "WEP_PSK"; - break; - case OS_WLAN_SECURITY_WEP_SHARED: - security = "WEP_SHARED"; - break; - case OS_WLAN_SECURITY_WPA_TKIP_PSK: - security = "WPA_TKIP_PSK"; - break; - case OS_WLAN_SECURITY_WPA_AES_PSK: - security = "WPA_AES_PSK"; - break; - case OS_WLAN_SECURITY_WPA2_AES_PSK: - security = "WPA2_AES_PSK"; - break; - case OS_WLAN_SECURITY_WPA2_TKIP_PSK: - security = "WPA2_TKIP_PSK"; - break; - case OS_WLAN_SECURITY_WPA2_MIXED_PSK: - security = "WPA2_MIXED_PSK"; - break; - case OS_WLAN_SECURITY_WPS_OPEN: - security = "WPS_OPEN"; - break; - case OS_WLAN_SECURITY_WPS_SECURE: - security = "WPS_SECURE"; - break; - default: - security = "UNKNOWN"; - break; - } - os_kprintf("%-14.14s ", security); - os_kprintf("%-4d ", scan_result->scan_info[index].signal_strength); - os_kprintf("%3d ", scan_result->scan_info[index].channel); - os_kprintf("%4d\r\n", scan_result->scan_info[index].max_data_rate / 1000); - } - - os_wlan_scan_clean_result(device, scan_result); - - return 0; -} -SH_CMD_EXPORT(wifi_scan, wifi_scan, "wifi_scan"); - -static int wifi_join(int argc, char **argv) -{ - const char *ssid = OS_NULL; - const char *key = OS_NULL; - os_device_t *device = OS_NULL; - - if (argc >= 2) - { - /* ssid */ - ssid = argv[1]; - } - - if (argc >= 3) - { - /* Password */ - key = argv[2]; - } - - device = os_device_find(wlan_name); - if (device == OS_NULL) - { - LOG_E(DRV_EXT_TAG, "os_device_find failed!"); - } - - if (os_wlan_join(device, ssid, key) != OS_EOK) - LOG_E(DRV_EXT_TAG, "os_wlan_join failed! %s %s", ssid, key); - else - LOG_I(DRV_EXT_TAG, "os_wlan_join success! %s %s", ssid, key); - - return 0; -} -SH_CMD_EXPORT(wifi_join, wifi_join, "wifi_join"); - -static int wifi_leave(int argc, char *argv[]) -{ - os_device_t *device = OS_NULL; - - device = os_device_find(wlan_name); - if (device == OS_NULL) - { - LOG_E(DRV_EXT_TAG, "os_device_find failed!"); - } - - if (os_wlan_leave(device) != OS_EOK) - LOG_E(DRV_EXT_TAG, "os_wlan_leave failed!"); - else - LOG_I(DRV_EXT_TAG, "os_wlan_leave success!"); - return 0; -} -SH_CMD_EXPORT(wifi_leave, wifi_leave, "wifi_leave"); diff --git a/kernel/include/os_version.h b/kernel/include/os_version.h index 0659b8138b07efa6c61c95a861e4807320803dfb..b1e7c382302619aacae414b01ce32d365c19dd5d 100644 --- a/kernel/include/os_version.h +++ b/kernel/include/os_version.h @@ -34,6 +34,6 @@ * - z: Revision number. *********************************************************************************************************************** */ -#define ONEOS_VERSION "OneOS-V2.2.0" +#define ONEOS_VERSION "OneOS-V2.2.1" #endif /* __OS_VERSION__ */