commit f821a46ea057c11701c28a4e5d5459daa3a4c3bf Author: Christopher Métrailler Date: Wed Apr 10 19:17:57 2024 +0200 Hello TOR 2k24 Have fun 🚀 diff --git a/Audio_746G_Discovery.c b/Audio_746G_Discovery.c new file mode 100644 index 0000000..524e56b --- /dev/null +++ b/Audio_746G_Discovery.c @@ -0,0 +1,1162 @@ +/*----------------------------------------------------------------------------- + * Name: Audio_756G_EVAL.c + * Purpose: Audio interface for STM32756G-EVAL Board + * Rev.: 1.0.0 + *----------------------------------------------------------------------------*/ + +/* Copyright (c) 2015 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + +#include "stm32f7xx_hal.h" + +#include "cmsis_os2.h" +#include "Driver_I2C.h" +#include "Driver_SAI.h" +#include "Board_Audio.h" + + +// WM8994 Outputs (Available: Headphone1 and speaker output) +#define WM8994_OUTPUT_NONE (0U) +#define WM8994_OUTPUT_HPOUT1 (1U) +#define WM8994_OUTPUT_SPKOUT (2U) + +#ifndef WM8994_OUTPUT +#define WM8994_OUTPUT (WM8994_OUTPUT_HPOUT1 | WM8994_OUTPUT_SPKOUT) +#endif + +// WM8994 Inputs (Available: Digital microphone 2 input and Line IN1) +#define WM8994_INPUT_NONE (0U) +#define WM8994_INPUT_DMIC2 (1U) +#define WM8994_INPUT_IN1 (2U) + +#ifndef WM8994_INPUT +#define WM8994_INPUT (WM8994_INPUT_DMIC2) +#endif + +#if (WM8994_INPUT == (WM8994_INPUT_DMIC2 | WM8994_INPUT_IN1)) +#error "Digital microphone 2 and Line IN1, can not be used together. Please select just one!" +#endif + + +// I2C +#ifndef WM8994_I2C_PORT +#define WM8994_I2C_PORT 3 // I2C Port number +#endif + +#define WM8994_I2C_ADDR 0x1A // WM8994 I2C address + +// I2C Driver +#define _I2C_Driver_(n) Driver_I2C##n +#define I2C_Driver_(n) _I2C_Driver_(n) +extern ARM_DRIVER_I2C I2C_Driver_(WM8994_I2C_PORT); +#define ptrI2C (&I2C_Driver_(WM8994_I2C_PORT)) + +// SAI +#ifndef WM8994_SAI_PORT_OUT +#define WM8994_SAI_PORT_OUT 2 // SAI Port number +#endif + +#ifndef WM8994_SAI_PORT_IN +#define WM8994_SAI_PORT_IN 2 // SAI Port number +#endif + +// SAI Driver +#define _SAI_Driver_(n) Driver_SAI##n +#define SAI_Driver_(n) _SAI_Driver_(n) +extern ARM_DRIVER_SAI SAI_Driver_(WM8994_SAI_PORT_OUT); +#define ptrSAI_OUT (&SAI_Driver_(WM8994_SAI_PORT_OUT)) +extern ARM_DRIVER_SAI SAI_Driver_(WM8994_SAI_PORT_IN); +#define ptrSAI_IN (&SAI_Driver_(WM8994_SAI_PORT_IN)) + +// Pointer to Stream info +#define STREAM_PTR(stream) ((stream & 0x80U) == 0U ? (&Audio.Out) : (&Audio.In)) + + +// Audio Stream run-time information +typedef struct _STREAM_INFO { + void *pData; + uint32_t DataSize; + uint8_t Volume_L; + uint8_t Volume_R; + uint8_t Mono; + uint8_t Running; + uint8_t Paused; + uint8_t UnderflowPending; + uint8_t SendCompletePending; +} STREAM_INFO; + +// Audio Stream +typedef struct _STREAM { + ARM_DRIVER_SAI *SAI; + STREAM_INFO *Info; +} STREAM; + +// Audio run-time information +typedef const struct _AUDIO_RESOURCES { + STREAM Out; + STREAM In; +} AUDIO_RESOURCES; + +static uint8_t DataBits = 16U; +static uint32_t SamplingFreq = 16000U; +static STREAM_INFO StreamInfoOut = { 0U }; +static STREAM_INFO StreamInfoIn = { 0U }; + +static const AUDIO_RESOURCES Audio = { + ptrSAI_OUT, + &StreamInfoOut, + ptrSAI_IN, + &StreamInfoIn, +}; + +static Audio_SignalEvent_t CB_Event; + + +// Callback +/** + \fn void (uint16_t reg, uint16_t reg_val) + \brief SAI callback function + \param[in] event +*/ +void SAI_callback (uint32_t event) { + + if (event & ARM_SAI_EVENT_FRAME_ERROR) { + // Audio interface does not support FRAME ERRORS + event &= ~ARM_SAI_EVENT_FRAME_ERROR; + } + + if (event & ARM_SAI_EVENT_TX_UNDERFLOW) { + if ((Audio.Out.Info->Running == 0U) || + (Audio.Out.Info->Paused == 1U)) { + Audio.Out.Info->UnderflowPending = 1U; + + // Invalid underflow: Transmitter is running to generate clock for codec + event &= ~ARM_SAI_EVENT_TX_UNDERFLOW; + } + } + + if (event & ARM_SAI_EVENT_SEND_COMPLETE) { + if (Audio.Out.Info->Paused == 1U) { + Audio.Out.Info->SendCompletePending = 1U; + + // Invalid SendComplete: Transmitter is running to generate clock for codec + event &= ~ARM_SAI_EVENT_SEND_COMPLETE; + } + } + + if ((CB_Event != NULL) && (event != 0U)) { + CB_Event (event); + } +} + +// Local functions +/** + \fn int32_t WM8994_RegRead (uint16_t reg, uint16_t * reg_val) + \brief Read value from WM8994 register + \param[in] reg WM8994 register address + \param[Out] reg_val Pointer to value read from WM8994 register + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +static int32_t WM8994_RegRead (uint16_t reg, uint16_t *reg_val) { + uint8_t buf[2], reg_addr[2]; + + reg_addr[0] = (uint8_t)(reg >> 8); + reg_addr[1] = (uint8_t)reg; + + if (ptrI2C->MasterTransmit (WM8994_I2C_ADDR, reg_addr, 2U, true) != ARM_DRIVER_OK) { + return -1; + } + while (ptrI2C->GetStatus().busy); + + if (ptrI2C->MasterReceive (WM8994_I2C_ADDR, buf, 2U, false) != ARM_DRIVER_OK) { + return -1; + } + while (ptrI2C->GetStatus().busy); + + *reg_val = buf[0] << 8; + *reg_val |= buf[1]; + + return 0; +} + +/** + \fn int32_t WM8994_RegWrite (uint8_16 reg, uint16_t reg_val) + \brief Write value to WM8994 register + \param[in] reg WM8994 register address + \param[in] reg_val Value to be written to WM8994 register + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +static int32_t WM8994_RegWrite (uint16_t reg, uint16_t reg_val) { + uint8_t buf[4]; + + buf[0] = (uint8_t)(reg >> 8); + buf[1] = (uint8_t)(reg ); + buf[2] = (uint8_t)(reg_val >> 8); + buf[3] = (uint8_t)(reg_val ); + + if (ptrI2C->MasterTransmit (WM8994_I2C_ADDR, buf, 4U, false) != ARM_DRIVER_OK) { + return -1; + } + while (ptrI2C->GetStatus().busy); + + return 0; +} + +/** + \fn int32_t WM8994_RegModify (uint8_16 reg, uint16_t mask, uint16_t val) + \brief Write value to WM8994 register + \param[in] reg WM8994 register address + \param[in] mask Mask bits to be changed + \param[in] val Value of masked bits + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +static int32_t WM8994_RegModify (uint16_t reg, uint16_t mask, uint16_t val) { + uint8_t buf[4]; + uint16_t rd_val; + + WM8994_RegRead (reg, &rd_val); + val |= (rd_val & ~mask); + + buf[0] = (uint8_t)(reg >> 8); + buf[1] = (uint8_t)(reg ); + buf[2] = (uint8_t)(val >> 8); + buf[3] = (uint8_t)(val ); + + if (ptrI2C->MasterTransmit (WM8994_I2C_ADDR, buf, 4U, false) != ARM_DRIVER_OK) { + return -1; + } + while (ptrI2C->GetStatus().busy); + + return 0; +} + +/** + \fn int32_t SAI_Configure (STREAM *ptrStream) + \brief Configure SAI transmitter + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +static int32_t SAI_Configure (const STREAM *ptrStream) { + uint32_t cfg, arg1, arg2; + + if (ptrStream == &Audio.Out) { + // Master transmitter, User protocol + cfg = ARM_SAI_CONFIGURE_TX | + ARM_SAI_MODE_MASTER | + ARM_SAI_PROTOCOL_USER | + ARM_SAI_CLOCK_POLARITY_0 | + ARM_SAI_MCLK_PIN_OUTPUT | + ARM_SAI_DATA_SIZE(DataBits); + arg2 = (SamplingFreq & ARM_SAI_AUDIO_FREQ_Msk) | ARM_SAI_MCLK_PRESCALER(256); + } + + if (ptrStream == &Audio.In) { + // Slave receiver, User protocol + cfg = ARM_SAI_CONFIGURE_RX | + ARM_SAI_MODE_SLAVE | + ARM_SAI_PROTOCOL_USER | + ARM_SAI_CLOCK_POLARITY_0 | + ARM_SAI_SYNCHRONOUS | + ARM_SAI_DATA_SIZE(DataBits); + } + + if (ptrStream->Info->Mono == 1U) { + cfg |= ARM_SAI_MONO_MODE; + } + arg1 = ARM_SAI_FRAME_LENGTH(DataBits * 4U) | + ARM_SAI_FRAME_SYNC_WIDTH(DataBits *2U) | + ARM_SAI_FRAME_SYNC_EARLY | + ARM_SAI_FRAME_SYNC_POLARITY_LOW | + ARM_SAI_SLOT_COUNT(4); + if (ptrStream->SAI->Control (cfg, arg1, arg2) != ARM_DRIVER_OK) { + return -1; + } + + return 0; +} + +// Board Audio Interface +/** + \fn int32_t Audio_Initialize (Audio_SignalEvent_t cb_event) + \brief Initialize Audio Interface + \param[in] cb_event pointer to event notification function + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +int32_t Audio_Initialize (Audio_SignalEvent_t cb_event) { + uint16_t reg_val; + + CB_Event = cb_event; + + // Clear Stream info + Audio.Out.Info->DataSize = 0U; + Audio.Out.Info->pData = NULL; + Audio.In.Info->DataSize = 0U; + Audio.In.Info->pData = NULL; + + // Set Default values + DataBits = 16U; + SamplingFreq = 16000; + + // SAI Initialization + Audio.Out.SAI->Initialize (SAI_callback); + Audio.In.SAI->Initialize (SAI_callback); + Audio.Out.SAI->PowerControl (ARM_POWER_FULL); + Audio.In.SAI->PowerControl (ARM_POWER_FULL); + + // Set default TX SAI configuration + // Enable slot 0 and 2 + if (Audio.Out.SAI->Control (ARM_SAI_MASK_SLOTS_TX, ~(0x05U), 0) != ARM_DRIVER_OK) { + return -1; + } + if (SAI_Configure (&Audio.Out) != 0U) return -1; + + // Set default RX SAI configuration +#if (WM8994_INPUT == WM8994_INPUT_IN1) + // Enable slot 0 and 2 + if (Audio.In.SAI->Control (ARM_SAI_MASK_SLOTS_RX, ~(0x05U), 0) != ARM_DRIVER_OK) { + return -1; + } +#endif +#if (WM8994_INPUT == WM8994_INPUT_DMIC2) + // Enable slot 1 and 3 + if (Audio.In.SAI->Control (ARM_SAI_MASK_SLOTS_RX, ~(0x0AU), 0) != ARM_DRIVER_OK) { + return -1; + } +#endif + if (SAI_Configure (&Audio.In) != 0U) return -1; + + // Start transmitter to run Codec clock + Audio.Out.SAI->Control (ARM_SAI_CONTROL_TX, 1U, 0U); + + // I2C Initialization and configuration + ptrI2C->Initialize (NULL); + ptrI2C->PowerControl (ARM_POWER_FULL); + ptrI2C->Control (ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_STANDARD); + ptrI2C->Control (ARM_I2C_BUS_CLEAR, 0U); + + + // WM8994 Reset + WM8994_RegWrite (0x0000, 0x0000); + + // WM8994 ReadID + WM8994_RegRead (0x0000, ®_val); + if (reg_val != 0x8994) { return -1; } + + // WM8994 Codec Setup + + // Errata Work-Arounds + WM8994_RegWrite(0x0102, 0x0003); + WM8994_RegWrite(0x0817, 0x0000); + WM8994_RegWrite(0x0102, 0x0000); + + // VMID Soft fast start, VMID buffer enabled + WM8994_RegWrite(0x0039, 0x006C); + + // Enable Bias Generator, Enable VMID + WM8994_RegWrite(0x0001, 0x0003); + + osDelay (50); + +#if ((WM8994_OUTPUT & WM8994_OUTPUT_HPOUT1) || \ + (WM8994_OUTPUT & WM8994_INPUT_SPKOUT )) + + // Configure AIF1 (Timeslot 0) to DAC1 + + // Enable AIF1DAC1(left and right) input path (Timeslot 0), Enable ADAC1(left and right) + WM8994_RegWrite(0x0005, 0x0303); + + // Enable AIF1 (Timeslot 0, left) to DAC1L + WM8994_RegWrite(0x0601, 0x0001); + + // Enable AIF1 (Timeslot 0, Right) to DAC1R + WM8994_RegWrite(0x0602, 0x0001); +#endif + +#if (WM8994_INPUT == WM8994_INPUT_IN1) + + // Enable ADCL and ADCR, Enable AIF1ADC1 (left) and AIF1ADC1 (right) path + WM8994_RegWrite (0x0004, 0x0303); + + // Enable IN1L and IN1R, Enable Thermal sensor & shout down + WM8994_RegWrite (0x0002, 0x6350); + + // Enable the ADCL(Left) to AIF1 Timeslot 0 (Left) mixer path + WM8994_RegWrite (0x0606, 0x0002); + + // Enable the ADCR(Right) to AIF1 Timeslot 0 (Right) mixer path + WM8994_RegWrite (0x0607, 0x0002); + + // GPIO1 Function = AIF1 DRC1 + WM8994_RegWrite (0x0700, 0x000D); + + // Enable Bias generator and VMID + WM8994_RegModify(0x0001, 0x0003, 0x0003); + + WM8994_RegWrite (0x0018, 0x000B); + WM8994_RegWrite (0x001A, 0x000B); + + WM8994_RegWrite (0x0029, 0x0025); + WM8994_RegWrite (0x002A, 0x0025); + + // IN1L PGA Inverting Input Select, IN1R PGA Inverting Input Select + WM8994_RegWrite (0x0028, 0x0011); + + // Enable AIF1ADC1 Digital HPF + WM8994_RegWrite(0x0410, 0x1800); +#endif + +#if (WM8994_INPUT == WM8994_INPUT_DMIC2) + + // MIC bias1 enable, VDIM divider enable, Normal bias current enable + WM8994_RegModify(0x0001, 0x0013, 0x0013); + osDelay (50); + + // Configure DMIC2 to AIF1 (Timeslot 1) + + // DMIC2 configuration + WM8994_RegWrite(0x0700, 0x8101); + + // Enable AIF1ADC2(Left) and AIF1ADC2(Right) output path + WM8994_RegWrite(0x0004, 0x0C30); + + // Enable DMIC2 (Left) to AIF1 (Timeslot 1, Left) output + WM8994_RegWrite(0x0608, 0x0002); + + // Enable DMIC2 (Right) to AIF1 (Timeslot 1, Right) output + WM8994_RegWrite(0x0609, 0x0002); + + // Enable AIF1ADC2 Digital HPF + WM8994_RegWrite(0x0411, 0x1800); +#endif + +#if ((WM8994_INPUT != WM8994_INPUT_NONE ) && \ + (WM8994_OUTPUT != WM8994_OUTPUT_NONE)) + + // default sample rate = 16kHz; AIF1CLK/fs ratio = 256 + WM8994_RegWrite(0x0210, 0x0033); + + // Right ADC data is output on right channel, Digital audio interface = I2S, + // Word Length = 16bits, + WM8994_RegWrite(0x0300, 0x4010); + + // Slave mode + WM8994_RegWrite(0x0302, 0x0000); + + // Enable AIF1 Processing clock and Digital mixing processor clock + WM8994_RegWrite(0x0208, 0x000A); + + // AIF1CLK Source = MCLK1, Enable AIF1CLK + WM8994_RegWrite(0x0200, 0x0001); +#endif + +#if (WM8994_OUTPUT & WM8994_OUTPUT_HPOUT1) + + // Digital audio source for envelope tracking: AIF1, DAC Timeslot 0 + // Enable Class W + WM8994_RegWrite(0x0051, 0x0005); + + // Enable HPOUT1L and HPOUT1R input stage + WM8994_RegModify(0x0001, 0x0300, 0x0300); + + // Enable HPOUT1L and HPOUT1R intermediate stage + WM8994_RegWrite(0x0060, 0x0022); + + // Enable Charge pump + WM8994_RegWrite(0x004c, 0x9F25); + osDelay(15); + + // DAC1L to Left HP Output PGA (HPOUT1LVOL) + WM8994_RegWrite(0x002D, 0x0001); + + // DAC1R to Right HP Output PGA (HPOUT1RVOL) + WM8994_RegWrite(0x002E, 0x0001); + + // Enable MIXOUTL and MIXOUTR output mixer + WM8994_RegModify(0x0003, 0x00F0, 0x00F0); + + // Enable and Start-Up DC Servo for HPOUT1L and HPOUT1R + WM8994_RegWrite(0x0054, 0x0033); + osDelay(250); + + // Remove HPOUT1L and HPOUT1R short + // Enable HPOUT1L and HPOUT1R output stage + WM8994_RegModify(0x0060, 0x00CC, 0x00CC); +#endif + +#if (WM8994_OUTPUT & WM8994_OUTPUT_SPKOUT) + // Enable SPKMIXL and SPKMIXR output mixer + WM8994_RegModify(0x0003, 0x0300, 0x0300); + + // Un-mute Left speaker mixer volume control + WM8994_RegWrite(0x0022, 0x0000); + + // Un-mute Right speaker mixer volume control + WM8994_RegWrite(0x0023, 0x0000); + + // UN-mute DAC1 to Speaker mixer + WM8994_RegWrite(0x0036, 0x0003); + + // Enable Mixer, SPKRVOL PGA and SOKOUTR output + // Enable SPKMIXR Mixer, SPKLVOL PGA and SPKOUTL output + WM8994_RegModify(0x0001, 0x3000, 0x3000); + + // Digital audio source for envelope tracking: AIF1, DAC Timeslot 0 + // Enable Class W + WM8994_RegWrite(0x0051, 0x0005); + // Un-mute AIF1 Timeslot 0 path +#endif + +#if ((WM8994_OUTPUT & WM8994_OUTPUT_HPOUT1) || \ + (WM8994_OUTPUT & WM8994_INPUT_SPKOUT )) + + // Un-mute DAC1L, DAC1L Digital Volume = 0dB + WM8994_RegWrite(0x0610, 0x00C0); + + // Un-mute DAC1R, DAC1R Digital Volume = 0dB + WM8994_RegWrite(0x0611, 0x00C0); + + // Un-mute AIF1DAC1 input path (AIF1 Timeslot0) + WM8994_RegWrite(0x0420, 0x0000); +#endif + + return 0; +} + +/** + \fn int32_t Audio_Uninitialize (void) + \brief De-initialize Audio Interface + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +int32_t Audio_Uninitialize (void) { + + // Abort SAI Send and Receive + Audio.In.SAI->Control (ARM_SAI_ABORT_RECEIVE, 0U, 0U); + Audio.Out.SAI->Control (ARM_SAI_ABORT_SEND, 0U, 0U); + + // WM8994 Reset + WM8994_RegWrite (0x0000, 0x0000); + + // Disable SAI transmitter and receiver + Audio.In.SAI->Control (ARM_SAI_CONTROL_RX, 0U, 0U); + Audio.Out.SAI->Control (ARM_SAI_CONTROL_TX, 0U, 0U); + + return 0; +} + +/** + \fn int32_t Audio_SendData (const void *data, uint32_t num) + \brief Start sending data to Audio output stream + \param[in] data pointer to buffer with data to send + \param[in] num number of data items to send + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +int32_t Audio_SendData (const void *data, uint32_t num) { + + if ((Audio.Out.Info->Running == 0U) || + (Audio.Out.Info->Paused == 1U)) { + // Save data info + Audio.Out.Info->pData = (void *)data; + Audio.Out.Info->DataSize = num; + } else { + Audio.Out.Info->pData = (void *)data; + Audio.Out.Info->DataSize = num; + if (Audio.Out.SAI->Send (data, num) != ARM_DRIVER_OK) { + return -1; + } + } + + return 0; +} + +/** + \fn int32_t Audio_ReceiveData (void *data, uint32_t num) + \brief Start receiving data from Audio input stream + \param[out] data pointer to buffer for data to receive + \param[in] num number of data items to send + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +int32_t Audio_ReceiveData (void *data, uint32_t num) { + + if (Audio.In.SAI->Receive (data, num) != ARM_DRIVER_OK) { + return -1; + } + + return 0; +} + +/** + \fn uint32_t Audio_GetDataTxCount (void) + \brief Get transmitted data count + \returns number of data items transmitted +*/ +uint32_t Audio_GetDataTxCount (void) { + return (Audio.Out.SAI->GetTxCount()); +} + +/** + \fn uint32_t Audio_GetDataRxCount (void) + \brief Get received data count + \returns number of data items received +*/ +uint32_t Audio_GetDataRxCount (void) { + return (Audio.Out.SAI->GetRxCount()); +} + +/** + \fn int32_t Audio_Start (uint8_t stream) + \brief Start Audio stream + \param[in] stream stream identifier + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +int32_t Audio_Start (uint8_t stream) { + void * data; + uint32_t num, evt = 0U; + + switch (stream) { + case AUDIO_STREAM_OUT: + // Set Running flag + Audio.Out.Info->Running = 1U; + if (Audio.Out.Info->Paused == 0U) { + + // Check for valid data to be send + if (Audio.Out.Info->DataSize != 0U) { + // Clear pending event flags + Audio.Out.Info->UnderflowPending = 0U; + Audio.Out.Info->SendCompletePending = 0U; + + // Save data information, before clearing it + num = Audio.Out.Info->DataSize; + data = Audio.Out.Info->pData; + Audio.Out.Info->DataSize = 0U; + Audio.Out.Info->pData = NULL; + + // Send data + if (Audio.Out.SAI->Send (data, num) != ARM_DRIVER_OK) { + return -1; + } + } else { + // Check for pending events + if (Audio.Out.Info->UnderflowPending == 1U) { evt |= AUDIO_EVENT_TX_UNDERFLOW; } + if (Audio.Out.Info->SendCompletePending == 1U) { evt |= AUDIO_EVENT_SEND_COMPLETE; } + + // Clear pending event flags + Audio.Out.Info->UnderflowPending = 0U; + Audio.Out.Info->SendCompletePending = 0U; + + if ((CB_Event != NULL) && (evt != 0U)) { + CB_Event (evt); + } + } + } + break; + case AUDIO_STREAM_IN: + Audio.In.SAI->Control (ARM_SAI_CONTROL_RX, 1U, 0U); + break; + default: return -1; + } + + return 0; +} + +/** + \fn int32_t Audio_Stop (uint8_t stream) + \brief Stop Audio stream + \param[in] stream stream identifier + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +int32_t Audio_Stop (uint8_t stream) { + + switch (stream) { + case AUDIO_STREAM_OUT: + // Clear running flag + Audio.Out.Info->Running = 0U; + // Abort transfer + Audio.Out.SAI->Control (ARM_SAI_ABORT_SEND, 1U, 0U); + break; + case AUDIO_STREAM_IN: + // Clear running flag + Audio.In.Info->Running = 0U; + Audio.In.SAI->Control (ARM_SAI_CONTROL_RX, 0U, 0U); + // Abort transfer + Audio.In.SAI->Control (ARM_SAI_ABORT_RECEIVE, 1U, 0U); + break; + default: return (-1); + } + + return 0; +} + +/** + \fn int32_t Audio_Pause (uint8_t stream) + \brief Pause Audio stream + \param[in] stream stream identifier + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +int32_t Audio_Pause (uint8_t stream) { + + switch (stream) { + case AUDIO_STREAM_OUT: + if (Audio.Out.Info->Running == 0U) { return 0U; } + + // Clear pending event flags + Audio.Out.Info->UnderflowPending = 0U; + Audio.Out.Info->SendCompletePending = 0U; + + // Set paused flag + Audio.Out.Info->Paused = 1U; + break; + case AUDIO_STREAM_IN: + if (Audio.In.Info->Running == 0U) { return 0U; } + + // Disable SAI receiver + Audio.In.SAI->Control (ARM_SAI_CONTROL_RX, 0U, 0U); + break; + default: return (-1); + } + return 0; +} + +/** + \fn int32_t Audio_Resume (uint8_t stream) + \brief Resume Audio stream + \param[in] stream stream identifier + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +int32_t Audio_Resume (uint8_t stream) { + void * data; + uint32_t num, evt = 0U; + + switch (stream) { + case AUDIO_STREAM_OUT: + if ((Audio.Out.Info->Paused == 1U) && + (Audio.Out.Info->Running == 1U)) { + + // Clear Paused flag + Audio.Out.Info->Paused = 0U; + + // Check for valid data to be send + if (Audio.Out.Info->DataSize != 0U) { + // Clear pending event flags + Audio.Out.Info->UnderflowPending = 0U; + Audio.Out.Info->SendCompletePending = 0U; + + // Save data information, before clearing it + num = Audio.Out.Info->DataSize; + data = Audio.Out.Info->pData; + Audio.Out.Info->DataSize = 0U; + Audio.Out.Info->pData = NULL; + + // Send data + if (Audio.Out.SAI->Send (data, num) != ARM_DRIVER_OK) { + return -1; + } + } else { + // Check for pending events + if (Audio.Out.Info->UnderflowPending == 1U) { evt |= AUDIO_EVENT_TX_UNDERFLOW; } + if (Audio.Out.Info->SendCompletePending == 1U) { evt |= AUDIO_EVENT_SEND_COMPLETE; } + + // Clear pending event flags + Audio.Out.Info->UnderflowPending = 0U; + Audio.Out.Info->SendCompletePending = 0U; + + if ((CB_Event != NULL) && (evt != 0U)) { + CB_Event (evt); + } + } + } + break; + case AUDIO_STREAM_IN: + if (Audio.In.Info->Paused == 1U) { + // Clear paused flag + Audio.In.Info->Paused = 0U; + + // Enable Receiver + Audio.In.SAI->Control (ARM_SAI_CONTROL_RX, 1U, 0U); + } + break; + default: return -1; + } + + return 0; +} + +/** + \fn int32_t Audio_SetVolume (uint8_t stream, uint8_t channel, uint8_t volume) + \brief Set volume level for Audio stream + \param[in] stream stream identifier + \param[in] channel channel identifier + \param[in] volume volume level (0..100) + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +int32_t Audio_SetVolume (uint8_t stream, uint8_t channel, uint8_t volume) { + + if (volume > 100) { return -1; } + + switch (stream) { + case AUDIO_STREAM_OUT: + // Scale volume + volume = (volume * 63) / 100; + switch (channel) { + case AUDIO_CHANNEL_MASTER: +#if (WM8994_OUTPUT & WM8994_OUTPUT_HPOUT1) + // Update Left and Right channel volume + WM8994_RegWrite(0x001C, 0x0040 | volume); + WM8994_RegWrite(0x001D, 0x0140 | volume); +#endif +#if (WM8994_OUTPUT & WM8994_OUTPUT_SPKOUT) + // Update Left and Right channel volume + WM8994_RegWrite(0x0026, 0x0040 | volume); + WM8994_RegWrite(0x0027, 0x0140 | volume); +#endif + break; + + case AUDIO_CHANNEL_LEFT: +#if (WM8994_OUTPUT & WM8994_OUTPUT_HPOUT1) + // Update Left channel volume + WM8994_RegWrite(0x001C, 0x0140 | volume); +#endif +#if (WM8994_OUTPUT & WM8994_OUTPUT_SPKOUT) + // Update Left channel volume + WM8994_RegWrite(0x0026, 0x0140 | volume); +#endif + break; + case AUDIO_CHANNEL_RIGHT: +#if (WM8994_OUTPUT & WM8994_OUTPUT_HPOUT1) + // Update Right channel volume + WM8994_RegWrite(0x001D, 0x0140 | volume); +#endif +#if (WM8994_OUTPUT & WM8994_OUTPUT_SPKOUT) + // Update Right channel volume + WM8994_RegWrite(0x0027, 0x0140 | volume); +#endif + break; + } + break; + case AUDIO_STREAM_IN: + // Scale Volume + volume = (volume * 239) / 100; + switch (channel) { + case AUDIO_CHANNEL_MASTER: + // Save Audio IN volume settings + Audio.In.Info->Volume_L = volume; + Audio.In.Info->Volume_R = volume; + + // Update Left and Right channel volume +#if (WM8994_INPUT == WM8994_INPUT_DMIC2) + WM8994_RegWrite(0x0404, volume); + WM8994_RegWrite(0x0405, volume); +#endif +#if (WM8994_INPUT == WM8994_INPUT_IN1) + WM8994_RegWrite(0x0400, volume); + WM8994_RegWrite(0x0401, volume); +#endif + break; + case AUDIO_CHANNEL_LEFT: + // Save Audio IN volume settings + Audio.In.Info->Volume_L = volume; + + // Update Left channel volume +#if (WM8994_INPUT == WM8994_INPUT_DMIC2) + WM8994_RegWrite(0x0404, volume); +#endif +#if (WM8994_INPUT == WM8994_INPUT_IN1) + WM8994_RegWrite(0x0400, volume); +#endif + break; + case AUDIO_CHANNEL_RIGHT: + // Save Audio IN volume settings + Audio.In.Info->Volume_R = volume; + + // Update Right channel volume +#if (WM8994_INPUT == WM8994_INPUT_DMIC2) + WM8994_RegWrite(0x0405, volume); +#endif +#if (WM8994_INPUT == WM8994_INPUT_IN1) + WM8994_RegWrite(0x0401, volume); +#endif + break; + } + + break; + + default: return -1; + } + return 0; +} + +/** + \fn int32_t Audio_SetMute (uint8_t stream, uint8_t channel, bool mute) + \brief Set mute state for Audio stream + \param[in] stream stream identifier + \param[in] channel channel identifier + \param[in] mute mute state + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +int32_t Audio_SetMute (uint8_t stream, uint8_t channel, bool mute) { +#if (WM8994_OUTPUT != WM8994_OUTPUT_NONE) + uint16_t unmute; +#endif +#if (WM8994_INPUT != WM8994_INPUT_NONE) + uint16_t vol_l, vol_r; +#endif + + switch (stream) { +#if (WM8994_OUTPUT != WM8994_OUTPUT_NONE) + case AUDIO_STREAM_OUT: + if (mute == false) { unmute = 0x0100 | (1U << 6); } + else { unmute = 0x0100; } + + switch (channel) { + case AUDIO_CHANNEL_MASTER: +#if (WM8994_OUTPUT & WM8994_OUTPUT_HPOUT1) + WM8994_RegModify(0x001C, 0x0040, unmute); + WM8994_RegModify(0x001D, 0x00140, unmute); +#endif +#if (WM8994_OUTPUT & WM8994_OUTPUT_SPKOUT) + WM8994_RegModify(0x0026, 0x0040, unmute); + WM8994_RegModify(0x0027, 0x00140, unmute); +#endif + break; + + case AUDIO_CHANNEL_LEFT: +#if (WM8994_OUTPUT & WM8994_OUTPUT_HPOUT1) + WM8994_RegModify(0x001C, 0x00140, unmute); +#endif +#if (WM8994_OUTPUT & WM8994_OUTPUT_SPKOUT) + WM8994_RegModify(0x0026, 0x00140, unmute); +#endif + break; + case AUDIO_CHANNEL_RIGHT: +#if (WM8994_OUTPUT & WM8994_OUTPUT_HPOUT1) + WM8994_RegModify(0x001D, 0x0140, unmute); +#endif +#if (WM8994_OUTPUT & WM8994_OUTPUT_SPKOUT) + WM8994_RegModify(0x0027, 0x0140, unmute); +#endif + break; + } + break; +#endif + +#if (WM8994_INPUT != WM8994_INPUT_NONE) + case AUDIO_STREAM_IN: + if (mute == true) { + vol_l = vol_r = 0U; + } else { + vol_l = Audio.In.Info->Volume_L; + vol_r = Audio.In.Info->Volume_R; + } + switch (channel) { + case AUDIO_CHANNEL_MASTER: + // Update Left and Right channel volume +#if (WM8994_INPUT == WM8994_INPUT_DMIC2) + WM8994_RegWrite(0x0404, vol_l); + WM8994_RegWrite(0x0405, vol_r); +#endif +#if (WM8994_INPUT == WM8994_INPUT_IN1) + WM8994_RegWrite(0x0400, vol_l); + WM8994_RegWrite(0x0401, vol_r); +#endif + break; + + case AUDIO_CHANNEL_LEFT: + // Update Left channel volume +#if (WM8994_INPUT == WM8994_INPUT_DMIC2) + WM8994_RegWrite(0x0404, vol_l); +#endif +#if (WM8994_INPUT == WM8994_INPUT_IN1) + WM8994_RegWrite(0x0400, vol_l); +#endif + break; + case AUDIO_CHANNEL_RIGHT: + // Update Right channel volume +#if (WM8994_INPUT == WM8994_INPUT_DMIC2) + WM8994_RegWrite(0x0405, vol_r); +#endif +#if (WM8994_INPUT == WM8994_INPUT_IN1) + WM8994_RegWrite(0x0401, vol_r); +#endif + break; + } + break; +#endif + + default: return -1; + } + return 0; +} + +/** + \fn int32_t Audio_SetDataFormat (uint8_t stream, uint8_t format) + \brief Set Audio data format + \param[in] stream stream identifier + \param[in] format data format + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +int32_t Audio_SetDataFormat (uint8_t stream, uint8_t format) { + const STREAM *ptrStream; + + ptrStream = STREAM_PTR(stream); + + switch (format) { + case AUDIO_DATA_8_MONO: + // Not Supported + return -1; + case AUDIO_DATA_16_MONO: + DataBits = 16U; + ptrStream->Info->Mono = 1U; + break; + case AUDIO_DATA_32_MONO: + DataBits = 32U; + ptrStream->Info->Mono = 1U; + break; + case AUDIO_DATA_8_STEREO: + // Not supported + return -1; + case AUDIO_DATA_16_STEREO: + DataBits = 16U; + ptrStream->Info->Mono = 0U; + break; + case AUDIO_DATA_32_STEREO: + DataBits = 32U; + ptrStream->Info->Mono = 0U; + break; + default: return -1; + } + + // Update SAI Data format configuration + if (SAI_Configure (ptrStream) == -1) { return -1; } + + if (DataBits == 16U) { + // 16-bit data + WM8994_RegModify (0x0300, 0x0060, 0x0000); + } + if (DataBits == 32U) { + // 32-bit data + WM8994_RegModify (0x0300, 0x0060, 0x0060); + } + + return 0; +} + +/** + \fn int32_t Audio_SetFrequency (uint8_t stream, uint32_t frequency) + \brief Set Audio stream frequency + \param[in] stream stream identifier + \param[in] frequency Audio frequency in Hz + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +int32_t Audio_SetFrequency (uint8_t stream, uint32_t frequency) { + uint16_t val; + + /* Clock Configurations */ + switch (frequency){ + case 8000: + // AIF1 Sample Rate = 8 kHz + val = 0x0003; + break; + + case 16000: + // AIF1 Sample Rate = 16 kHz + val = 0x0033; + break; + + case 32000: + // AIF1 Sample Rate = 32 kHz + val = 0x0063; + break; + + case 48000: + // AIF1 Sample Rate = 48 kHz + val = 0x0083; + break; + + case 96000: + // AIF1 Sample Rate = 96 kHz + val = 0x00A3; + break; + + case 11000: + // AIF1 Sample Rate = 11 kHz + val = 0x0013; + break; + + case 22000: + // AIF1 Sample Rate = 22 kHz + val = 0x0043; + break; + + case 44000: + // AIF1 Sample Rate = 44 kHz + val = 0x0073; + break; + + default: return -1; + } + + // Save Audio frequency value + SamplingFreq = frequency; + + // Update SAI Audio frequency configuration + SAI_Configure (&Audio.Out); + + // Update WM8994 codec Audio frequency + WM8994_RegWrite (0x0210, val); + + return 0; +} diff --git a/Board_Audio.h b/Board_Audio.h new file mode 100644 index 0000000..e4dd524 --- /dev/null +++ b/Board_Audio.h @@ -0,0 +1,203 @@ +/*----------------------------------------------------------------------------- + * Name: Board_Audio.h + * Purpose: Audio interface header file + * Rev.: 1.1.0 + *-----------------------------------------------------------------------------*/ + +/* Copyright (c) 2013 - 2014 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + +#ifndef __BOARD_AUDIO_H +#define __BOARD_AUDIO_H + +#include +#include + +/* Audio Stream identifier */ +#define AUDIO_STREAM_OUT 0x00 ///< Output stream +#define AUDIO_STREAM_IN 0x80 ///< Input stream + +/* Audio Channel identifier */ +#define AUDIO_CHANNEL_MASTER 0 ///< Master channel +#define AUDIO_CHANNEL_LEFT 1 ///< Left channel (stereo) +#define AUDIO_CHANNEL_RIGHT 2 ///< Right channel (stereo) + +/* Audio Data format */ +#define AUDIO_DATA_8_MONO 0x01 ///< 8-bit samples (uint8_t) +#define AUDIO_DATA_16_MONO 0x02 ///< 16-bit samples (uint16_t) +#define AUDIO_DATA_32_MONO 0x04 ///< 32-bit samples (uint32_t) +#define AUDIO_DATA_8_STEREO 0x81 ///< 2* 8-bit stereo samples: L R (uint8_t) +#define AUDIO_DATA_16_STEREO 0x82 ///< 2*16-bit stereo samples: L R (uint16_t) +#define AUDIO_DATA_32_STEREO 0x84 ///< 2*32-bit stereo samples: L R (uint32_t) + +/* Audio Volume */ +#define AUDIO_VOLUME_AUTO_GAIN 0x80 ///< Automatic gain control + +/* Audio Events */ +#define AUDIO_EVENT_SEND_COMPLETE (1UL << 0) ///< Send completed +#define AUDIO_EVENT_RECEIVE_COMPLETE (1UL << 1) ///< Receive completed +#define AUDIO_EVENT_TX_UNDERFLOW (1UL << 2) ///< Transmit data not available +#define AUDIO_EVENT_RX_OVERFLOW (1UL << 3) ///< Receive data overflow + +/** + \fn int32_t Audio_Initialize (Audio_SignalEvent_t cb_event) + \brief Initialize Audio Interface + \param[in] cb_event pointer to event notification function + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +/** + \fn int32_t Audio_Uninitialize (void) + \brief De-initialize Audio Interface + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +/** + \fn int32_t Audio_SendData (const void *data, uint32_t num) + \brief Prepare for sending data to Audio output stream + \param[in] data pointer to buffer with data to send + \param[in] num number of data items to send + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +/** + \fn int32_t Audio_ReceiveData (void *data, uint32_t num) + \brief Prepare for receiving data from Audio input stream + \param[out] data pointer to buffer for data to receive + \param[in] num number of data items to send + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +/** + \fn uint32_t Audio_GetDataTxCount (void) + \brief Get transmitted data count + \returns number of data items transmitted +*/ +/** + \fn uint32_t Audio_GetDataRxCount (void) + \brief Get received data count + \returns number of data items received +*/ +/** + \fn int32_t Audio_Start (uint8_t stream) + \brief Start Audio stream + \param[in] stream stream identifier + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +/** + \fn int32_t Audio_Stop (uint8_t stream) + \brief Stop Audio stream + \param[in] stream stream identifier + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +/** + \fn int32_t Audio_Pause (uint8_t stream) + \brief Pause Audio stream + \param[in] stream stream identifier + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +/** + \fn int32_t Audio_Resume (uint8_t stream) + \brief Resume Audio stream + \param[in] stream stream identifier + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +/** + \fn int32_t Audio_SetVolume (uint8_t stream, uint8_t channel, uint8_t volume) + \brief Set volume level for Audio stream + \param[in] stream stream identifier + \param[in] channel channel identifier + \param[in] volume volume level (0..100) + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +/** + \fn int32_t Audio_SetMute (uint8_t stream, uint8_t channel, bool mute) + \brief Set mute state for Audio stream + \param[in] stream stream identifier + \param[in] channel channel identifier + \param[in] mute mute state + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +/** + \fn int32_t Audio_SetDataFormat (uint8_t stream, uint8_t format) + \brief Set Audio data format + \param[in] stream stream identifier + \param[in] format data format + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ +/** + \fn int32_t Audio_SetFrequency (uint8_t stream, uint32_t frequency) + \brief Set Audio stream frequency + \param[in] stream stream identifier + \param[in] frequency Audio frequency in Hz + \returns + - \b 0: function succeeded + - \b -1: function failed +*/ + +/** + \fn void Audio_SignalEvent (uint32_t event) + \brief Signal Audio Events + \param[in] event notification mask + \return none +*/ +typedef void (*Audio_SignalEvent_t) (uint32_t event); + +extern int32_t Audio_Initialize (Audio_SignalEvent_t cb_event); +extern int32_t Audio_Uninitialize (void); +extern int32_t Audio_SendData (const void *data, uint32_t num); +extern int32_t Audio_ReceiveData ( void *data, uint32_t num); +extern uint32_t Audio_GetDataTxCount(void); +extern uint32_t Audio_GetDataRxCount(void); +extern int32_t Audio_Start (uint8_t stream); +extern int32_t Audio_Stop (uint8_t stream); +extern int32_t Audio_Pause (uint8_t stream); +extern int32_t Audio_Resume (uint8_t stream); +extern int32_t Audio_SetVolume (uint8_t stream, uint8_t channel, uint8_t volume); +extern int32_t Audio_SetMute (uint8_t stream, uint8_t channel, bool mute); +extern int32_t Audio_SetDataFormat (uint8_t stream, uint8_t format); +extern int32_t Audio_SetFrequency (uint8_t stream, uint32_t frequency); + +#endif /* __BOARD_AUDIO_H */ diff --git a/EventRecorderStub.scvd b/EventRecorderStub.scvd new file mode 100644 index 0000000..2956b29 --- /dev/null +++ b/EventRecorderStub.scvd @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e3b6111 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# 227-PTR Token Ring base project + +The base code for the Token Ring project was developed as part of the HEI Real-Time Programming (227-PTR) course. + +The provided project is a real-time chat application based on a custom Token Ring protocol implementation using the RTX5 (CMSIS-RTOS2) RTOS. + +This is a Keil uVision project that is ready to use. It was tested with Keil ARMCC version 5.06 update 7 (build 960). The project compiles without error but is not functional since the MAC layers have not been implemented. + +The project runs on an ARM Cortex-M7 STM32F746 SoC at 216 MHz. uGFX (https://ugfx.io/) is used as a graphical library. The provided project has the stdout/ITM enabled (Debug printf Viewer) and the Event Recorder by default. TraceAnlyzer can be used to debug the real-time application. All configuration settings are available in the `main.h` header file. diff --git a/RTE/CMSIS/RTX_Config.c b/RTE/CMSIS/RTX_Config.c new file mode 100644 index 0000000..22151e9 --- /dev/null +++ b/RTE/CMSIS/RTX_Config.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2013-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + * + * ----------------------------------------------------------------------------- + * + * $Revision: V5.1.0 + * + * Project: CMSIS-RTOS RTX + * Title: RTX Configuration + * + * ----------------------------------------------------------------------------- + */ + +#include "cmsis_compiler.h" +#include "rtx_os.h" + +// OS Idle Thread +__WEAK __NO_RETURN void osRtxIdleThread (void *argument) { + (void)argument; + + for (;;) {} +} + +// OS Error Callback function +__WEAK uint32_t osRtxErrorNotify (uint32_t code, void *object_id) { + (void)object_id; + + switch (code) { + case osRtxErrorStackUnderflow: + // Stack overflow detected for thread (thread_id=object_id) + break; + case osRtxErrorISRQueueOverflow: + // ISR Queue overflow detected when inserting object (object_id) + break; + case osRtxErrorTimerQueueOverflow: + // User Timer Callback Queue overflow detected for timer (timer_id=object_id) + break; + case osRtxErrorClibSpace: + // Standard C/C++ library libspace not available: increase OS_THREAD_LIBSPACE_NUM + break; + case osRtxErrorClibMutex: + // Standard C/C++ library mutex initialization failed + break; + default: + break; + } + for (;;) {} +//return 0U; +} diff --git a/RTE/CMSIS/RTX_Config.h b/RTE/CMSIS/RTX_Config.h new file mode 100644 index 0000000..3704f9a --- /dev/null +++ b/RTE/CMSIS/RTX_Config.h @@ -0,0 +1,395 @@ +/* + * Copyright (c) 2013-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 + * + * 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. + * + * ----------------------------------------------------------------------------- + * + * $Revision: V5.2.0 + * + * Project: CMSIS-RTOS RTX + * Title: RTX Configuration definitions + * + * ----------------------------------------------------------------------------- + */ + +#ifndef RTX_CONFIG_H_ +#define RTX_CONFIG_H_ + +//-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- + +// System Configuration +// ======================= + +// Global Dynamic Memory size [bytes] <0-1073741824:8> +// Defines the combined global dynamic memory size. +// Default: 4096 +#ifndef OS_DYNAMIC_MEM_SIZE +#define OS_DYNAMIC_MEM_SIZE 100000 +#endif + +// Kernel Tick Frequency [Hz] <1-1000000> +// Defines base time unit for delays and timeouts. +// Default: 1000 (1ms tick) +#ifndef OS_TICK_FREQ +#define OS_TICK_FREQ 1000 +#endif + +// Round-Robin Thread switching +// Enables Round-Robin Thread switching. +#ifndef OS_ROBIN_ENABLE +#define OS_ROBIN_ENABLE 1 +#endif + +// Round-Robin Timeout <1-1000> +// Defines how many ticks a thread will execute before a thread switch. +// Default: 5 +#ifndef OS_ROBIN_TIMEOUT +#define OS_ROBIN_TIMEOUT 5 +#endif + +// + +// Event Recording + +// Memory Management +// Enables Memory Management events recording. +#ifndef OS_EVR_MEMORY +#define OS_EVR_MEMORY 1 +#endif + +// Kernel +// Enables Kernel events recording. +#ifndef OS_EVR_KERNEL +#define OS_EVR_KERNEL 1 +#endif + +// Thread +// Enables Thread events recording. +#ifndef OS_EVR_THREAD +#define OS_EVR_THREAD 1 +#endif + +// Timer +// Enables Timer events recording. +#ifndef OS_EVR_TIMER +#define OS_EVR_TIMER 1 +#endif + +// Event Flags +// Enables Event Flags events recording. +#ifndef OS_EVR_EVFLAGS +#define OS_EVR_EVFLAGS 1 +#endif + +// Mutex +// Enables Mutex events recording. +#ifndef OS_EVR_MUTEX +#define OS_EVR_MUTEX 0 +#endif + +// Semaphore +// Enables Semaphore events recording. +#ifndef OS_EVR_SEMAPHORE +#define OS_EVR_SEMAPHORE 0 +#endif + +// Memory Pool +// Enables Memory Pool events recording. +#ifndef OS_EVR_MEMPOOL +#define OS_EVR_MEMPOOL 1 +#endif + +// Message Queue +// Enables Message Queue events recording. +#ifndef OS_EVR_MSGQUEUE +#define OS_EVR_MSGQUEUE 1 +#endif + +// + +// ISR FIFO Queue +// <4=> 4 entries <8=> 8 entries <12=> 12 entries <16=> 16 entries +// <24=> 24 entries <32=> 32 entries <48=> 48 entries <64=> 64 entries +// <96=> 96 entries <128=> 128 entries <196=> 196 entries <256=> 256 entries +// RTOS Functions called from ISR store requests to this buffer. +// Default: 16 entries +#ifndef OS_ISR_FIFO_QUEUE +#define OS_ISR_FIFO_QUEUE 16 +#endif + +// + +// Thread Configuration +// ======================= + +// Object specific Memory allocation +// Enables object specific memory allocation. +#ifndef OS_THREAD_OBJ_MEM +#define OS_THREAD_OBJ_MEM 0 +#endif + +// Number of user Threads <1-1000> +// Defines maximum number of user threads that can be active at the same time. +// Applies to user threads with system provided memory for control blocks. +#ifndef OS_THREAD_NUM +#define OS_THREAD_NUM 1 +#endif + +// Number of user Threads with default Stack size <0-1000> +// Defines maximum number of user threads with default stack size. +// Applies to user threads with zero stack size specified. +#ifndef OS_THREAD_DEF_STACK_NUM +#define OS_THREAD_DEF_STACK_NUM 0 +#endif + +// Total Stack size [bytes] for user Threads with user-provided Stack size <0-1073741824:8> +// Defines the combined stack size for user threads with user-provided stack size. +// Applies to user threads with user-provided stack size and system provided memory for stack. +// Default: 0 +#ifndef OS_THREAD_USER_STACK_SIZE +#define OS_THREAD_USER_STACK_SIZE 0 +#endif + +// + +// Default Thread Stack size [bytes] <96-1073741824:8> +// Defines stack size for threads with zero stack size specified. +// Default: 200 +#ifndef OS_STACK_SIZE +#define OS_STACK_SIZE 200 +#endif + +// Idle Thread Stack size [bytes] <72-1073741824:8> +// Defines stack size for Idle thread. +// Default: 200 +#ifndef OS_IDLE_THREAD_STACK_SIZE +#define OS_IDLE_THREAD_STACK_SIZE 200 +#endif + +// Idle Thread TrustZone Module Identifier +// Defines TrustZone Thread Context Management Identifier. +// Applies only to cores with TrustZone technology. +// Default: 0 (not used) +#ifndef OS_IDLE_THREAD_TZ_MOD_ID +#define OS_IDLE_THREAD_TZ_MOD_ID 0 +#endif + +// Stack overrun checking +// Enable stack overrun checks at thread switch. +// Enabling this option increases slightly the execution time of a thread switch. +#ifndef OS_STACK_CHECK +#define OS_STACK_CHECK 1 +#endif + +// Stack usage watermark +// Initialize thread stack with watermark pattern for analyzing stack usage. +// Enabling this option increases significantly the execution time of thread creation. +#ifndef OS_STACK_WATERMARK +#define OS_STACK_WATERMARK 0 +#endif + +// Processor mode for Thread execution +// <0=> Unprivileged mode +// <1=> Privileged mode +// Default: Privileged mode +#ifndef OS_PRIVILEGE_MODE +#define OS_PRIVILEGE_MODE 1 +#endif + +// + +// Timer Configuration +// ====================== + +// Object specific Memory allocation +// Enables object specific memory allocation. +#ifndef OS_TIMER_OBJ_MEM +#define OS_TIMER_OBJ_MEM 0 +#endif + +// Number of Timer objects <1-1000> +// Defines maximum number of objects that can be active at the same time. +// Applies to objects with system provided memory for control blocks. +#ifndef OS_TIMER_NUM +#define OS_TIMER_NUM 1 +#endif + +// + +// Timer Thread Priority +// <8=> Low +// <16=> Below Normal <24=> Normal <32=> Above Normal +// <40=> High +// <48=> Realtime +// Defines priority for timer thread +// Default: High +#ifndef OS_TIMER_THREAD_PRIO +#define OS_TIMER_THREAD_PRIO 40 +#endif + +// Timer Thread Stack size [bytes] <0-1073741824:8> +// Defines stack size for Timer thread. +// May be set to 0 when timers are not used. +// Default: 200 +#ifndef OS_TIMER_THREAD_STACK_SIZE +#define OS_TIMER_THREAD_STACK_SIZE 200 +#endif + +// Timer Thread TrustZone Module Identifier +// Defines TrustZone Thread Context Management Identifier. +// Applies only to cores with TrustZone technology. +// Default: 0 (not used) +#ifndef OS_TIMER_THREAD_TZ_MOD_ID +#define OS_TIMER_THREAD_TZ_MOD_ID 0 +#endif + +// Timer Callback Queue entries <0-256> +// Number of concurrent active timer callback functions. +// May be set to 0 when timers are not used. +// Default: 4 +#ifndef OS_TIMER_CB_QUEUE +#define OS_TIMER_CB_QUEUE 4 +#endif + +// + +// Event Flags Configuration +// ============================ + +// Object specific Memory allocation +// Enables object specific memory allocation. +#ifndef OS_EVFLAGS_OBJ_MEM +#define OS_EVFLAGS_OBJ_MEM 0 +#endif + +// Number of Event Flags objects <1-1000> +// Defines maximum number of objects that can be active at the same time. +// Applies to objects with system provided memory for control blocks. +#ifndef OS_EVFLAGS_NUM +#define OS_EVFLAGS_NUM 1 +#endif + +// + +// + +// Mutex Configuration +// ====================== + +// Object specific Memory allocation +// Enables object specific memory allocation. +#ifndef OS_MUTEX_OBJ_MEM +#define OS_MUTEX_OBJ_MEM 0 +#endif + +// Number of Mutex objects <1-1000> +// Defines maximum number of objects that can be active at the same time. +// Applies to objects with system provided memory for control blocks. +#ifndef OS_MUTEX_NUM +#define OS_MUTEX_NUM 1 +#endif + +// + +// + +// Semaphore Configuration +// ========================== + +// Object specific Memory allocation +// Enables object specific memory allocation. +#ifndef OS_SEMAPHORE_OBJ_MEM +#define OS_SEMAPHORE_OBJ_MEM 0 +#endif + +// Number of Semaphore objects <1-1000> +// Defines maximum number of objects that can be active at the same time. +// Applies to objects with system provided memory for control blocks. +#ifndef OS_SEMAPHORE_NUM +#define OS_SEMAPHORE_NUM 1 +#endif + +// + +// + +// Memory Pool Configuration +// ============================ + +// Object specific Memory allocation +// Enables object specific memory allocation. +#ifndef OS_MEMPOOL_OBJ_MEM +#define OS_MEMPOOL_OBJ_MEM 0 +#endif + +// Number of Memory Pool objects <1-1000> +// Defines maximum number of objects that can be active at the same time. +// Applies to objects with system provided memory for control blocks. +#ifndef OS_MEMPOOL_NUM +#define OS_MEMPOOL_NUM 1 +#endif + +// Data Storage Memory size [bytes] <0-1073741824:8> +// Defines the combined data storage memory size. +// Applies to objects with system provided memory for data storage. +// Default: 0 +#ifndef OS_MEMPOOL_DATA_SIZE +#define OS_MEMPOOL_DATA_SIZE 0 +#endif + +// + +// + +// Message Queue Configuration +// ============================== + +// Object specific Memory allocation +// Enables object specific memory allocation. +#ifndef OS_MSGQUEUE_OBJ_MEM +#define OS_MSGQUEUE_OBJ_MEM 0 +#endif + +// Number of Message Queue objects <1-1000> +// Defines maximum number of objects that can be active at the same time. +// Applies to objects with system provided memory for control blocks. +#ifndef OS_MSGQUEUE_NUM +#define OS_MSGQUEUE_NUM 12 +#endif + +// Data Storage Memory size [bytes] <0-1073741824:8> +// Defines the combined data storage memory size. +// Applies to objects with system provided memory for data storage. +// Default: 0 +#ifndef OS_MSGQUEUE_DATA_SIZE +#define OS_MSGQUEUE_DATA_SIZE 0 +#endif + +// + +// + +// Number of Threads which use standard C/C++ library libspace +// (when thread specific memory allocation is not used). +#if (OS_THREAD_OBJ_MEM == 0) +#define OS_THREAD_LIBSPACE_NUM 4 +#else +#define OS_THREAD_LIBSPACE_NUM OS_THREAD_NUM +#endif + +//------------- <<< end of configuration section >>> --------------------------- + +#endif // RTX_CONFIG_H_ diff --git a/RTE/Compiler/EventRecorderConf.h b/RTE/Compiler/EventRecorderConf.h new file mode 100644 index 0000000..b1fc3c1 --- /dev/null +++ b/RTE/Compiler/EventRecorderConf.h @@ -0,0 +1,44 @@ +/*------------------------------------------------------------------------------ + * MDK - Component ::Event Recorder + * Copyright (c) 2016 ARM Germany GmbH. All rights reserved. + *------------------------------------------------------------------------------ + * Name: EventRecorderConf.h + * Purpose: Event Recorder Configuration + * Rev.: V1.0.0 + *----------------------------------------------------------------------------*/ + +//-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- + +// Event Recorder + +// Number of Records +// <8=>8 <16=>16 <32=>32 <64=>64 <128=>128 <256=>256 <512=>512 <1024=>1024 +// <2048=>2048 <4096=>4096 <8192=>8192 <16384=>16384 <32768=>32768 +// <65536=>65536 <131072=>131072 <262144=>262144 <524288=>524288 +// <1048576=>1048576 +// Configure size of Event Record Buffer (each record is 16 bytes) +// Must be 2^n (min=8, max=1048576) +#define EVENT_RECORD_COUNT 1024U + +// Time Stamp Source +// <0=> DWT Cycle Counter <1=> SysTick +// <3=> User Timer (Normal Reset) <4=> User Timer (Power-On Reset) +// Selects source for 32-bit time stamp +#define EVENT_TIMESTAMP_SOURCE 0 + +// SysTick Configuration +// Configure values when Time Stamp Source is set to SysTick + +// SysTick Input Clock Frequency [Hz] <1-1000000000> +// Defines SysTick input clock (typical identical with processor clock) +#define SYSTICK_CLOCK 216000000U + +// SysTick Interrupt Period [us] <1-1000000000> +// Defines time period of the SysTick timer interrupt +#define SYSTICK_PERIOD_US 1000U + +// + +// + +//------------- <<< end of configuration section >>> --------------------------- diff --git a/RTE/Device/STM32F746NGHx/RTE_Device.h b/RTE/Device/STM32F746NGHx/RTE_Device.h new file mode 100644 index 0000000..2e0b9d1 --- /dev/null +++ b/RTE/Device/STM32F746NGHx/RTE_Device.h @@ -0,0 +1,3277 @@ +/* ----------------------------------------------------------------------------- + * Copyright (c) 2013-2016 ARM Ltd. + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. Permission is granted to anyone to use this + * software for any purpose, including commercial applications, and to alter + * it and redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in + * a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + * + * $Date: 4. November 2016 + * $Revision: V1.4.0 + * + * Project: RTE Device Configuration for ST STM32F7xx + * -------------------------------------------------------------------------- */ + +//-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- + +#ifndef __RTE_DEVICE_H +#define __RTE_DEVICE_H + + +#define GPIO_PORT0 GPIOA +#define GPIO_PORT1 GPIOB +#define GPIO_PORT2 GPIOC +#define GPIO_PORT3 GPIOD +#define GPIO_PORT4 GPIOE +#define GPIO_PORT5 GPIOF +#define GPIO_PORT6 GPIOG +#define GPIO_PORT7 GPIOH +#define GPIO_PORT8 GPIOI +#define GPIO_PORT9 GPIOJ +#define GPIO_PORT10 GPIOK + +#define GPIO_PORT(num) GPIO_PORT##num + + +// USART1 (Universal synchronous asynchronous receiver transmitter) [Driver_USART1] +// Configuration settings for Driver_USART1 in component ::CMSIS Driver:USART +#define RTE_USART1 0 + +// USART1_TX Pin <0=>Not Used <1=>PA9 <2=>PB6 <3=>PB14 +#define RTE_USART1_TX_ID 0 +#if (RTE_USART1_TX_ID == 0) +#define RTE_USART1_TX 0 +#elif (RTE_USART1_TX_ID == 1) +#define RTE_USART1_TX 1 +#define RTE_USART1_TX_PORT GPIOA +#define RTE_USART1_TX_BIT 9 +#elif (RTE_USART1_TX_ID == 2) +#define RTE_USART1_TX 1 +#define RTE_USART1_TX_PORT GPIOB +#define RTE_USART1_TX_BIT 6 +#elif (RTE_USART1_TX_ID == 3) +#define RTE_USART1_TX 1 +#define RTE_USART1_TX_PORT GPIOB +#define RTE_USART1_TX_BIT 14 +#else +#error "Invalid USART1_TX Pin Configuration!" +#endif + +// USART1_RX Pin <0=>Not Used <1=>PA10 <2=>PB7 <3=>PB15 +#define RTE_USART1_RX_ID 0 +#if (RTE_USART1_RX_ID == 0) +#define RTE_USART1_RX 0 +#elif (RTE_USART1_RX_ID == 1) +#define RTE_USART1_RX 1 +#define RTE_USART1_RX_PORT GPIOA +#define RTE_USART1_RX_BIT 10 +#elif (RTE_USART1_RX_ID == 2) +#define RTE_USART1_RX 1 +#define RTE_USART1_RX_PORT GPIOB +#define RTE_USART1_RX_BIT 7 +#elif (RTE_USART1_RX_ID == 3) +#define RTE_USART1_RX 1 +#define RTE_USART1_RX_PORT GPIOB +#define RTE_USART1_RX_BIT 15 +#else +#error "Invalid USART1_RX Pin Configuration!" +#endif + +// USART1_CK Pin <0=>Not Used <1=>PA8 +#define RTE_USART1_CK_ID 0 +#if (RTE_USART1_CK_ID == 0) +#define RTE_USART1_CK 0 +#elif (RTE_USART1_CK_ID == 1) +#define RTE_USART1_CK 1 +#define RTE_USART1_CK_PORT GPIOA +#define RTE_USART1_CK_BIT 8 +#else +#error "Invalid USART1_CK Pin Configuration!" +#endif + +// USART1_CTS Pin <0=>Not Used <1=>PA11 +#define RTE_USART1_CTS_ID 0 +#if (RTE_USART1_CTS_ID == 0) +#define RTE_USART1_CTS 0 +#elif (RTE_USART1_CTS_ID == 1) +#define RTE_USART1_CTS 1 +#define RTE_USART1_CTS_PORT GPIOA +#define RTE_USART1_CTS_BIT 11 +#else +#error "Invalid USART1_CTS Pin Configuration!" +#endif + +// USART1_RTS Pin <0=>Not Used <1=>PA12 +#define RTE_USART1_RTS_ID 0 +#if (RTE_USART1_RTS_ID == 0) +#define RTE_USART1_RTS 0 +#elif (RTE_USART1_RTS_ID == 1) +#define RTE_USART1_RTS 1 +#define RTE_USART1_RTS_PORT GPIOA +#define RTE_USART1_RTS_BIT 12 +#else +#error "Invalid USART1_RTS Pin Configuration!" +#endif + +// DMA Rx +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <2=>2 <5=>5 +// Selects DMA Stream (only Stream 2 or 5 can be used) +// Channel <4=>4 +// Selects DMA Channel (only Channel 4 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_USART1_RX_DMA 0 +#define RTE_USART1_RX_DMA_NUMBER 2 +#define RTE_USART1_RX_DMA_STREAM 2 +#define RTE_USART1_RX_DMA_CHANNEL 4 +#define RTE_USART1_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <7=>7 +// Selects DMA Stream (only Stream 7 can be used) +// Channel <4=>4 +// Selects DMA Channel (only Channel 4 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_USART1_TX_DMA 0 +#define RTE_USART1_TX_DMA_NUMBER 2 +#define RTE_USART1_TX_DMA_STREAM 7 +#define RTE_USART1_TX_DMA_CHANNEL 4 +#define RTE_USART1_TX_DMA_PRIORITY 0 + +// + + +// USART2 (Universal synchronous asynchronous receiver transmitter) [Driver_USART2] +// Configuration settings for Driver_USART2 in component ::CMSIS Driver:USART +#define RTE_USART2 0 + +// USART2_TX Pin <0=>Not Used <1=>PA2 <2=>PD5 +#define RTE_USART2_TX_ID 0 +#if (RTE_USART2_TX_ID == 0) +#define RTE_USART2_TX 0 +#elif (RTE_USART2_TX_ID == 1) +#define RTE_USART2_TX 1 +#define RTE_USART2_TX_PORT GPIOA +#define RTE_USART2_TX_BIT 2 +#elif (RTE_USART2_TX_ID == 2) +#define RTE_USART2_TX 1 +#define RTE_USART2_TX_PORT GPIOD +#define RTE_USART2_TX_BIT 5 +#else +#error "Invalid USART2_TX Pin Configuration!" +#endif + +// USART2_RX Pin <0=>Not Used <1=>PA3 <2=>PD6 +#define RTE_USART2_RX_ID 0 +#if (RTE_USART2_RX_ID == 0) +#define RTE_USART2_RX 0 +#elif (RTE_USART2_RX_ID == 1) +#define RTE_USART2_RX 1 +#define RTE_USART2_RX_PORT GPIOA +#define RTE_USART2_RX_BIT 3 +#elif (RTE_USART2_RX_ID == 2) +#define RTE_USART2_RX 1 +#define RTE_USART2_RX_PORT GPIOD +#define RTE_USART2_RX_BIT 6 +#else +#error "Invalid USART2_RX Pin Configuration!" +#endif + +// USART2_CK Pin <0=>Not Used <1=>PA4 <2=>PD7 +#define RTE_USART2_CK_ID 0 +#if (RTE_USART2_CK_ID == 0) +#define RTE_USART2_CK 0 +#elif (RTE_USART2_CK_ID == 1) +#define RTE_USART2_CK 1 +#define RTE_USART2_CK_PORT GPIOA +#define RTE_USART2_CK_BIT 4 +#elif (RTE_USART2_CK_ID == 2) +#define RTE_USART2_CK 1 +#define RTE_USART2_CK_PORT GPIOD +#define RTE_USART2_CK_BIT 7 +#else +#error "Invalid USART2_CK Pin Configuration!" +#endif + +// USART2_CTS Pin <0=>Not Used <1=>PA0 <2=>PD3 +#define RTE_USART2_CTS_ID 0 +#if (RTE_USART2_CTS_ID == 0) +#define RTE_USART2_CTS 0 +#elif (RTE_USART2_CTS_ID == 1) +#define RTE_USART2_CTS 1 +#define RTE_USART2_CTS_PORT GPIOA +#define RTE_USART2_CTS_BIT 0 +#elif (RTE_USART2_CTS_ID == 2) +#define RTE_USART2_CTS 1 +#define RTE_USART2_CTS_PORT GPIOD +#define RTE_USART2_CTS_BIT 3 +#else +#error "Invalid USART2_CTS Pin Configuration!" +#endif + +// USART2_RTS Pin <0=>Not Used <1=>PA1 <2=>PD4 +#define RTE_USART2_RTS_ID 0 +#if (RTE_USART2_RTS_ID == 0) +#define RTE_USART2_RTS 0 +#elif (RTE_USART2_RTS_ID == 1) +#define RTE_USART2_RTS 1 +#define RTE_USART2_RTS_PORT GPIOA +#define RTE_USART2_RTS_BIT 1 +#elif (RTE_USART2_RTS_ID == 2) +#define RTE_USART2_RTS 1 +#define RTE_USART2_RTS_PORT GPIOD +#define RTE_USART2_RTS_BIT 4 +#else +#error "Invalid USART2_RTS Pin Configuration!" +#endif + +// DMA Rx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <5=>5 +// Selects DMA Stream (only Stream 5 can be used) +// Channel <4=>4 +// Selects DMA Channel (only Channel 4 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_USART2_RX_DMA 0 +#define RTE_USART2_RX_DMA_NUMBER 1 +#define RTE_USART2_RX_DMA_STREAM 5 +#define RTE_USART2_RX_DMA_CHANNEL 4 +#define RTE_USART2_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <6=>6 +// Selects DMA Stream (only Stream 6 can be used) +// Channel <4=>4 +// Selects DMA Channel (only Channel 4 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_USART2_TX_DMA 0 +#define RTE_USART2_TX_DMA_NUMBER 1 +#define RTE_USART2_TX_DMA_STREAM 6 +#define RTE_USART2_TX_DMA_CHANNEL 4 +#define RTE_USART2_TX_DMA_PRIORITY 0 + +// + + +// USART3 (Universal synchronous asynchronous receiver transmitter) [Driver_USART3] +// Configuration settings for Driver_USART3 in component ::CMSIS Driver:USART +#define RTE_USART3 0 + +// USART3_TX Pin <0=>Not Used <1=>PB10 <2=>PC10 <3=>PD8 +#define RTE_USART3_TX_ID 0 +#if (RTE_USART3_TX_ID == 0) +#define RTE_USART3_TX 0 +#elif (RTE_USART3_TX_ID == 1) +#define RTE_USART3_TX 1 +#define RTE_USART3_TX_PORT GPIOB +#define RTE_USART3_TX_BIT 10 +#elif (RTE_USART3_TX_ID == 2) +#define RTE_USART3_TX 1 +#define RTE_USART3_TX_PORT GPIOC +#define RTE_USART3_TX_BIT 10 +#elif (RTE_USART3_TX_ID == 3) +#define RTE_USART3_TX 1 +#define RTE_USART3_TX_PORT GPIOD +#define RTE_USART3_TX_BIT 8 +#else +#error "Invalid USART3_TX Pin Configuration!" +#endif + +// USART3_RX Pin <0=>Not Used <1=>PB11 <2=>PC11 <3=>PD9 +#define RTE_USART3_RX_ID 0 +#if (RTE_USART3_RX_ID == 0) +#define RTE_USART3_RX 0 +#elif (RTE_USART3_RX_ID == 1) +#define RTE_USART3_RX 1 +#define RTE_USART3_RX_PORT GPIOB +#define RTE_USART3_RX_BIT 11 +#elif (RTE_USART3_RX_ID == 2) +#define RTE_USART3_RX 1 +#define RTE_USART3_RX_PORT GPIOC +#define RTE_USART3_RX_BIT 11 +#elif (RTE_USART3_RX_ID == 3) +#define RTE_USART3_RX 1 +#define RTE_USART3_RX_PORT GPIOD +#define RTE_USART3_RX_BIT 9 +#else +#error "Invalid USART3_RX Pin Configuration!" +#endif + +// USART3_CK Pin <0=>Not Used <1=>PB12 <2=>PC12 <3=>PD10 +#define RTE_USART3_CK_ID 0 +#if (RTE_USART3_CK_ID == 0) +#define RTE_USART3_CK 0 +#elif (RTE_USART3_CK_ID == 1) +#define RTE_USART3_CK 1 +#define RTE_USART3_CK_PORT GPIOB +#define RTE_USART3_CK_BIT 12 +#elif (RTE_USART3_CK_ID == 2) +#define RTE_USART3_CK 1 +#define RTE_USART3_CK_PORT GPIOC +#define RTE_USART3_CK_BIT 12 +#elif (RTE_USART3_CK_ID == 3) +#define RTE_USART3_CK 1 +#define RTE_USART3_CK_PORT GPIOD +#define RTE_USART3_CK_BIT 10 +#else +#error "Invalid USART3_CK Pin Configuration!" +#endif + +// USART3_CTS Pin <0=>Not Used <1=>PB13 <2=>PD11 +#define RTE_USART3_CTS_ID 0 +#if (RTE_USART3_CTS_ID == 0) +#define RTE_USART3_CTS 0 +#elif (RTE_USART3_CTS_ID == 1) +#define RTE_USART3_CTS 1 +#define RTE_USART3_CTS_PORT GPIOB +#define RTE_USART3_CTS_BIT 13 +#elif (RTE_USART3_CTS_ID == 2) +#define RTE_USART3_CTS 1 +#define RTE_USART3_CTS_PORT GPIOD +#define RTE_USART3_CTS_BIT 11 +#else +#error "Invalid USART3_CTS Pin Configuration!" +#endif + +// USART3_RTS Pin <0=>Not Used <1=>PB14 <2=>PD12 +#define RTE_USART3_RTS_ID 0 +#if (RTE_USART3_RTS_ID == 0) +#define RTE_USART3_RTS 0 +#elif (RTE_USART3_RTS_ID == 1) +#define RTE_USART3_RTS 1 +#define RTE_USART3_RTS_PORT GPIOB +#define RTE_USART3_RTS_BIT 14 +#elif (RTE_USART3_RTS_ID == 2) +#define RTE_USART3_RTS 1 +#define RTE_USART3_RTS_PORT GPIOD +#define RTE_USART3_RTS_BIT 12 +#else +#error "Invalid USART3_RTS Pin Configuration!" +#endif + +// DMA Rx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <1=>1 +// Selects DMA Stream (only Stream 1 can be used) +// Channel <4=>4 +// Selects DMA Channel (only Channel 4 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_USART3_RX_DMA 0 +#define RTE_USART3_RX_DMA_NUMBER 1 +#define RTE_USART3_RX_DMA_STREAM 1 +#define RTE_USART3_RX_DMA_CHANNEL 4 +#define RTE_USART3_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <3=>3 <4=>4 +// Selects DMA Stream (only Stream 3 or 4 can be used) +// Channel <4=>4 <7=>7 +// Selects DMA Channel (only Channel 4 or 7 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_USART3_TX_DMA 0 +#define RTE_USART3_TX_DMA_NUMBER 1 +#define RTE_USART3_TX_DMA_STREAM 3 +#define RTE_USART3_TX_DMA_CHANNEL 4 +#define RTE_USART3_TX_DMA_PRIORITY 0 + +// + + +// UART4 (Universal asynchronous receiver transmitter) [Driver_USART4] +// Configuration settings for Driver_USART4 in component ::CMSIS Driver:USART +#define RTE_UART4 0 + +// UART4_TX Pin <0=>Not Used <1=>PA0 <2=>PC10 <3=>PA12 <4=>PD1 <5=>PH13 +#define RTE_UART4_TX_ID 0 +#if (RTE_UART4_TX_ID == 0) +#define RTE_UART4_TX 0 +#elif (RTE_UART4_TX_ID == 1) +#define RTE_UART4_TX 1 +#define RTE_UART4_TX_PORT GPIOA +#define RTE_UART4_TX_BIT 0 +#elif (RTE_UART4_TX_ID == 2) +#define RTE_UART4_TX 1 +#define RTE_UART4_TX_PORT GPIOC +#define RTE_UART4_TX_BIT 10 +#elif (RTE_UART4_TX_ID == 3) +#define RTE_UART4_TX 1 +#define RTE_UART4_TX_PORT GPIOA +#define RTE_UART4_TX_BIT 12 +#elif (RTE_UART4_TX_ID == 4) +#define RTE_UART4_TX 1 +#define RTE_UART4_TX_PORT GPIOD +#define RTE_UART4_TX_BIT 1 +#elif (RTE_UART4_TX_ID == 5) +#define RTE_UART4_TX 1 +#define RTE_UART4_TX_PORT GPIOH +#define RTE_UART4_TX_BIT 13 +#else +#error "Invalid UART4_TX Pin Configuration!" +#endif + +// UART4_RX Pin <0=>Not Used <1=>PA1 <2=>PC11 <3=>PA11 <4=>PD0 <5=>PH14 <6=>PI9 +#define RTE_UART4_RX_ID 0 +#if (RTE_UART4_RX_ID == 0) +#define RTE_UART4_RX 0 +#elif (RTE_UART4_RX_ID == 1) +#define RTE_UART4_RX 1 +#define RTE_UART4_RX_PORT GPIOA +#define RTE_UART4_RX_BIT 1 +#elif (RTE_UART4_RX_ID == 2) +#define RTE_UART4_RX 1 +#define RTE_UART4_RX_PORT GPIOC +#define RTE_UART4_RX_BIT 11 +#elif (RTE_UART4_RX_ID == 3) +#define RTE_UART4_RX 1 +#define RTE_UART4_RX_PORT GPIOA +#define RTE_UART4_RX_BIT 11 +#elif (RTE_UART4_RX_ID == 4) +#define RTE_UART4_RX 1 +#define RTE_UART4_RX_PORT GPIOD +#define RTE_UART4_RX_BIT 0 +#elif (RTE_UART4_RX_ID == 5) +#define RTE_UART4_RX 1 +#define RTE_UART4_RX_PORT GPIOH +#define RTE_UART4_RX_BIT 14 +#elif (RTE_UART4_RX_ID == 6) +#define RTE_UART4_RX 1 +#define RTE_UART4_RX_PORT GPIOI +#define RTE_UART4_RX_BIT 9 +#else +#error "Invalid UART4_RX Pin Configuration!" +#endif + +// UART4_CTS Pin <0=>Not Used <1=>PB0 <2=>PB15 +#define RTE_UART4_CTS_ID 0 +#if (RTE_UART4_CTS_ID == 0) +#define RTE_UART4_CTS 0 +#elif (RTE_UART4_CTS_ID == 1) +#define RTE_UART4_CTS 1 +#define RTE_UART4_CTS_PORT GPIOB +#define RTE_UART4_CTS_BIT 0 +#elif (RTE_UART4_CTS_ID == 2) +#define RTE_UART4_CTS 1 +#define RTE_UART4_CTS_PORT GPIOB +#define RTE_UART4_CTS_BIT 15 +#else +#error "Invalid UART4_CTS Pin Configuration!" +#endif + +// UART4_RTS Pin <0=>Not Used <1=>PA15 <2=>PB14 +#define RTE_UART4_RTS_ID 0 +#if (RTE_UART4_RTS_ID == 0) +#define RTE_UART4_RTS 0 +#elif (RTE_UART4_RTS_ID == 1) +#define RTE_UART4_RTS 1 +#define RTE_UART4_RTS_PORT GPIOA +#define RTE_UART4_RTS_BIT 15 +#elif (RTE_UART4_RTS_ID == 2) +#define RTE_UART4_RTS 1 +#define RTE_UART4_RTS_PORT GPIOB +#define RTE_UART4_RTS_BIT 14 +#else +#error "Invalid UART4_RTS Pin Configuration!" +#endif + +// DMA Rx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <2=>2 +// Selects DMA Stream (only Stream 2 can be used) +// Channel <4=>4 +// Selects DMA Channel (only Channel 4 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_UART4_RX_DMA 0 +#define RTE_UART4_RX_DMA_NUMBER 1 +#define RTE_UART4_RX_DMA_STREAM 2 +#define RTE_UART4_RX_DMA_CHANNEL 4 +#define RTE_UART4_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <4=>4 +// Selects DMA Stream (only Stream 4 can be used) +// Channel <4=>4 +// Selects DMA Channel (only Channel 4 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_UART4_TX_DMA 0 +#define RTE_UART4_TX_DMA_NUMBER 1 +#define RTE_UART4_TX_DMA_STREAM 4 +#define RTE_UART4_TX_DMA_CHANNEL 4 +#define RTE_UART4_TX_DMA_PRIORITY 0 + +// + + +// UART5 (Universal asynchronous receiver transmitter) [Driver_USART5] +// Configuration settings for Driver_USART5 in component ::CMSIS Driver:USART +#define RTE_UART5 0 + +// UART5_TX Pin <0=>Not Used <1=>PC12 <2=>PB6 <3=>PB9 <4=>PB13 +#define RTE_UART5_TX_ID 0 +#if (RTE_UART5_TX_ID == 0) +#define RTE_UART5_TX 0 +#elif (RTE_UART5_TX_ID == 1) +#define RTE_UART5_TX 1 +#define RTE_UART5_TX_PORT GPIOC +#define RTE_UART5_TX_BIT 12 +#elif (RTE_UART5_TX_ID == 2) +#define RTE_UART5_TX 1 +#define RTE_UART5_TX_PORT GPIOB +#define RTE_UART5_TX_BIT 6 +#elif (RTE_UART5_TX_ID == 3) +#define RTE_UART5_TX 1 +#define RTE_UART5_TX_PORT GPIOB +#define RTE_UART5_TX_BIT 9 +#elif (RTE_UART5_TX_ID == 4) +#define RTE_UART5_TX 1 +#define RTE_UART5_TX_PORT GPIOB +#define RTE_UART5_TX_BIT 13 +#else +#error "Invalid UART5_TX Pin Configuration!" +#endif + +// UART5_RX Pin <0=>Not Used <1=>PD2 <2=>PB5 <3=>PB8 <4=>PB12 +#define RTE_UART5_RX_ID 0 +#if (RTE_UART5_RX_ID == 0) +#define RTE_UART5_RX 0 +#elif (RTE_UART5_RX_ID == 1) +#define RTE_UART5_RX 1 +#define RTE_UART5_RX_PORT GPIOD +#define RTE_UART5_RX_BIT 2 +#elif (RTE_UART5_RX_ID == 2) +#define RTE_UART5_RX 1 +#define RTE_UART5_RX_PORT GPIOB +#define RTE_UART5_RX_BIT 5 +#elif (RTE_UART5_RX_ID == 3) +#define RTE_UART5_RX 1 +#define RTE_UART5_RX_PORT GPIOB +#define RTE_UART5_RX_BIT 8 +#elif (RTE_UART5_RX_ID == 4) +#define RTE_UART5_RX 1 +#define RTE_UART5_RX_PORT GPIOB +#define RTE_UART5_RX_BIT 12 +#else +#error "Invalid UART5_RX Pin Configuration!" +#endif + +// UART5_CTS Pin <0=>Not Used <1=>PC9 +#define RTE_UART5_CTS_ID 0 +#if (RTE_UART5_CTS_ID == 0) +#define RTE_UART5_CTS 0 +#elif (RTE_UART5_CTS_ID == 1) +#define RTE_UART5_CTS 1 +#define RTE_UART5_CTS_PORT GPIOC +#define RTE_UART5_CTS_BIT 9 +#else +#error "Invalid UART5_CTS Pin Configuration!" +#endif + +// UART5_RTS Pin <0=>Not Used <1=>PC8 +#define RTE_UART5_RTS_ID 0 +#if (RTE_UART5_RTS_ID == 0) +#define RTE_UART5_RTS 0 +#elif (RTE_UART5_RTS_ID == 1) +#define RTE_UART5_RTS 1 +#define RTE_UART5_RTS_PORT GPIOC +#define RTE_UART5_RTS_BIT 8 +#else +#error "Invalid UART5_RTS Pin Configuration!" +#endif + +// DMA Rx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <0=>0 +// Selects DMA Stream (only Stream 0 can be used) +// Channel <4=>4 +// Selects DMA Channel (only Channel 4 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_UART5_RX_DMA 0 +#define RTE_UART5_RX_DMA_NUMBER 1 +#define RTE_UART5_RX_DMA_STREAM 0 +#define RTE_UART5_RX_DMA_CHANNEL 4 +#define RTE_UART5_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <7=>7 +// Selects DMA Stream (only Stream 7 can be used) +// Channel <4=>4 +// Selects DMA Channel (only Channel 4 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_UART5_TX_DMA 0 +#define RTE_UART5_TX_DMA_NUMBER 1 +#define RTE_UART5_TX_DMA_STREAM 7 +#define RTE_UART5_TX_DMA_CHANNEL 4 +#define RTE_UART5_TX_DMA_PRIORITY 0 + +// + + +// USART6 (Universal synchronous asynchronous receiver transmitter) [Driver_USART6] +// Configuration settings for Driver_USART6 in component ::CMSIS Driver:USART +#define RTE_USART6 0 + +// USART6_TX Pin <0=>Not Used <1=>PC6 <2=>PG14 +#define RTE_USART6_TX_ID 0 +#if (RTE_USART6_TX_ID == 0) +#define RTE_USART6_TX 0 +#elif (RTE_USART6_TX_ID == 1) +#define RTE_USART6_TX 1 +#define RTE_USART6_TX_PORT GPIOC +#define RTE_USART6_TX_BIT 6 +#elif (RTE_USART6_TX_ID == 2) +#define RTE_USART6_TX 1 +#define RTE_USART6_TX_PORT GPIOG +#define RTE_USART6_TX_BIT 14 +#else +#error "Invalid USART6_TX Pin Configuration!" +#endif + +// USART6_RX Pin <0=>Not Used <1=>PC7 <2=>PG9 +#define RTE_USART6_RX_ID 0 +#if (RTE_USART6_RX_ID == 0) +#define RTE_USART6_RX 0 +#elif (RTE_USART6_RX_ID == 1) +#define RTE_USART6_RX 1 +#define RTE_USART6_RX_PORT GPIOC +#define RTE_USART6_RX_BIT 7 +#elif (RTE_USART6_RX_ID == 2) +#define RTE_USART6_RX 1 +#define RTE_USART6_RX_PORT GPIOG +#define RTE_USART6_RX_BIT 9 +#else +#error "Invalid USART6_RX Pin Configuration!" +#endif + +// USART6_CK Pin <0=>Not Used <1=>PC8 <2=>PG7 +#define RTE_USART6_CK_ID 0 +#if (RTE_USART6_CK_ID == 0) +#define RTE_USART6_CK 0 +#elif (RTE_USART6_CK_ID == 1) +#define RTE_USART6_CK 1 +#define RTE_USART6_CK_PORT GPIOC +#define RTE_USART6_CK_BIT 8 +#elif (RTE_USART6_CK_ID == 2) +#define RTE_USART6_CK 1 +#define RTE_USART6_CK_PORT GPIOG +#define RTE_USART6_CK_BIT 7 +#else +#error "Invalid USART6_CK Pin Configuration!" +#endif + +// USART6_CTS Pin <0=>Not Used <1=>PG13 <2=>PG15 +#define RTE_USART6_CTS_ID 0 +#if (RTE_USART6_CTS_ID == 0) +#define RTE_USART6_CTS 0 +#elif (RTE_USART6_CTS_ID == 1) +#define RTE_USART6_CTS 1 +#define RTE_USART6_CTS_PORT GPIOG +#define RTE_USART6_CTS_BIT 13 +#elif (RTE_USART6_CTS_ID == 2) +#define RTE_USART6_CTS 1 +#define RTE_USART6_CTS_PORT GPIOG +#define RTE_USART6_CTS_BIT 15 +#else +#error "Invalid USART6_CTS Pin Configuration!" +#endif + +// USART6_RTS Pin <0=>Not Used <1=>PG8 <2=>PG12 +#define RTE_USART6_RTS_ID 0 +#if (RTE_USART6_RTS_ID == 0) +#define RTE_USART6_RTS 0 +#elif (RTE_USART6_RTS_ID == 1) +#define RTE_USART6_RTS 1 +#define RTE_USART6_RTS_PORT GPIOG +#define RTE_USART6_RTS_BIT 8 +#elif (RTE_USART6_RTS_ID == 2) +#define RTE_USART6_RTS 1 +#define RTE_USART6_RTS_PORT GPIOG +#define RTE_USART6_RTS_BIT 12 +#else +#error "Invalid USART6_RTS Pin Configuration!" +#endif + +// DMA Rx +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <1=>1 <2=>2 +// Selects DMA Stream (only Stream 1 or 2 can be used) +// Channel <5=>5 +// Selects DMA Channel (only Channel 5 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_USART6_RX_DMA 0 +#define RTE_USART6_RX_DMA_NUMBER 2 +#define RTE_USART6_RX_DMA_STREAM 1 +#define RTE_USART6_RX_DMA_CHANNEL 5 +#define RTE_USART6_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <6=>6 <7=>7 +// Selects DMA Stream (only Stream 6 or 7 can be used) +// Channel <5=>5 +// Selects DMA Channel (only Channel 5 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_USART6_TX_DMA 0 +#define RTE_USART6_TX_DMA_NUMBER 2 +#define RTE_USART6_TX_DMA_STREAM 6 +#define RTE_USART6_TX_DMA_CHANNEL 5 +#define RTE_USART6_TX_DMA_PRIORITY 0 + +// + +// UART7 (Universal asynchronous receiver transmitter) [Driver_USART7] +// Configuration settings for Driver_USART7 in component ::CMSIS Driver:USART +#define RTE_UART7 0 + +// UART7_TX Pin <0=>Not Used <1=>PF7 <2=>PE8 <3=>PA15 <4=>PB4 +#define RTE_UART7_TX_ID 0 +#if (RTE_UART7_TX_ID == 0) +#define RTE_UART7_TX 0 +#elif (RTE_UART7_TX_ID == 1) +#define RTE_UART7_TX 1 +#define RTE_UART7_TX_PORT GPIOF +#define RTE_UART7_TX_BIT 7 +#elif (RTE_UART7_TX_ID == 2) +#define RTE_UART7_TX 1 +#define RTE_UART7_TX_PORT GPIOE +#define RTE_UART7_TX_BIT 8 +#elif (RTE_UART7_TX_ID == 3) +#define RTE_UART7_TX 1 +#define RTE_UART7_TX_PORT GPIOA +#define RTE_UART7_TX_BIT 15 +#elif (RTE_UART7_TX_ID == 4) +#define RTE_UART7_TX 1 +#define RTE_UART7_TX_PORT GPIOB +#define RTE_UART7_TX_BIT 4 +#else +#error "Invalid UART7_TX Pin Configuration!" +#endif + +// UART7_RX Pin <0=>Not Used <1=>PF6 <2=>PE7 <3=>PA8 <4=>PB3 +#define RTE_UART7_RX_ID 0 +#if (RTE_UART7_RX_ID == 0) +#define RTE_UART7_RX 0 +#elif (RTE_UART7_RX_ID == 1) +#define RTE_UART7_RX 1 +#define RTE_UART7_RX_PORT GPIOF +#define RTE_UART7_RX_BIT 6 +#elif (RTE_UART7_RX_ID == 2) +#define RTE_UART7_RX 1 +#define RTE_UART7_RX_PORT GPIOE +#define RTE_UART7_RX_BIT 7 +#elif (RTE_UART7_RX_ID == 3) +#define RTE_UART7_RX 1 +#define RTE_UART7_RX_PORT GPIOA +#define RTE_UART7_RX_BIT 8 +#elif (RTE_UART7_RX_ID == 4) +#define RTE_UART7_RX 1 +#define RTE_UART7_RX_PORT GPIOB +#define RTE_UART7_RX_BIT 3 +#else +#error "Invalid UART7_RX Pin Configuration!" +#endif + +// UART7_CTS Pin <0=>Not Used <1=>PF9 <2=>PE10 +#define RTE_UART7_CTS_ID 0 +#if (RTE_UART7_CTS_ID == 0) +#define RTE_UART7_CTS 0 +#elif (RTE_UART7_CTS_ID == 1) +#define RTE_UART7_CTS 1 +#define RTE_UART7_CTS_PORT GPIOF +#define RTE_UART7_CTS_BIT 9 +#elif (RTE_UART7_CTS_ID == 2) +#define RTE_UART7_CTS 1 +#define RTE_UART7_CTS_PORT GPIOE +#define RTE_UART7_CTS_BIT 10 +#else +#error "Invalid UART7_CTS Pin Configuration!" +#endif + +// UART7_RTS Pin <0=>Not Used <1=>PF8 <2=>PE9 +#define RTE_UART7_RTS_ID 0 +#if (RTE_UART7_RTS_ID == 0) +#define RTE_UART7_RTS 0 +#elif (RTE_UART7_RTS_ID == 1) +#define RTE_UART7_RTS 1 +#define RTE_UART7_RTS_PORT GPIOF +#define RTE_UART7_RTS_BIT 8 +#elif (RTE_UART7_RTS_ID == 2) +#define RTE_UART7_RTS 1 +#define RTE_UART7_RTS_PORT GPIOE +#define RTE_UART7_RTS_BIT 9 +#else +#error "Invalid UART7_RTS Pin Configuration!" +#endif + +// DMA Rx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <3=>3 +// Selects DMA Stream (only Stream 3 can be used) +// Channel <5=>5 +// Selects DMA Channel (only Channel 5 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_UART7_RX_DMA 0 +#define RTE_UART7_RX_DMA_NUMBER 1 +#define RTE_UART7_RX_DMA_STREAM 3 +#define RTE_UART7_RX_DMA_CHANNEL 5 +#define RTE_UART7_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <1=>1 +// Selects DMA Stream (only Stream 1 can be used) +// Channel <5=>5 +// Selects DMA Channel (only Channel 5 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_UART7_TX_DMA 0 +#define RTE_UART7_TX_DMA_NUMBER 1 +#define RTE_UART7_TX_DMA_STREAM 1 +#define RTE_UART7_TX_DMA_CHANNEL 5 +#define RTE_UART7_TX_DMA_PRIORITY 0 + +// + +// UART8 (Universal asynchronous receiver transmitter) [Driver_USART8] +// Configuration settings for Driver_USART8 in component ::CMSIS Driver:USART +#define RTE_UART8 0 + +// UART8_TX Pin <0=>Not Used <1=>PE1 +#define RTE_UART8_TX_ID 0 +#if (RTE_UART8_TX_ID == 0) +#define RTE_UART8_TX 0 +#elif (RTE_UART8_TX_ID == 1) +#define RTE_UART8_TX 1 +#define RTE_UART8_TX_PORT GPIOE +#define RTE_UART8_TX_BIT 1 +#else +#error "Invalid UART8_TX Pin Configuration!" +#endif + +// UART8_RX Pin <0=>Not Used <1=>PE0 +#define RTE_UART8_RX_ID 0 +#if (RTE_UART8_RX_ID == 0) +#define RTE_UART8_RX 0 +#elif (RTE_UART8_RX_ID == 1) +#define RTE_UART8_RX 1 +#define RTE_UART8_RX_PORT GPIOE +#define RTE_UART8_RX_BIT 0 +#else +#error "Invalid UART8_RX Pin Configuration!" +#endif + +// UART8_CTS Pin <0=>Not Used <1=>PD14 +#define RTE_UART8_CTS_ID 0 +#if (RTE_UART8_CTS_ID == 0) +#define RTE_UART8_CTS 0 +#elif (RTE_UART8_CTS_ID == 1) +#define RTE_UART8_CTS 1 +#define RTE_UART8_CTS_PORT GPIOD +#define RTE_UART8_CTS_BIT 14 +#else +#error "Invalid UART8_CTS Pin Configuration!" +#endif + +// UART8_RTS Pin <0=>Not Used <1=>PD15 +#define RTE_UART8_RTS_ID 0 +#if (RTE_UART8_RTS_ID == 0) +#define RTE_UART8_RTS 0 +#elif (RTE_UART8_RTS_ID == 1) +#define RTE_UART8_RTS 1 +#define RTE_UART8_RTS_PORT GPIOD +#define RTE_UART8_RTS_BIT 15 +#else +#error "Invalid UART8_RTS Pin Configuration!" +#endif + +// DMA Rx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <6=>6 +// Selects DMA Stream (only Stream 6 can be used) +// Channel <5=>5 +// Selects DMA Channel (only Channel 5 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_UART8_RX_DMA 0 +#define RTE_UART8_RX_DMA_NUMBER 1 +#define RTE_UART8_RX_DMA_STREAM 6 +#define RTE_UART8_RX_DMA_CHANNEL 5 +#define RTE_UART8_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <0=>0 +// Selects DMA Stream (only Stream 0 can be used) +// Channel <5=>5 +// Selects DMA Channel (only Channel 5 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_UART8_TX_DMA 0 +#define RTE_UART8_TX_DMA_NUMBER 1 +#define RTE_UART8_TX_DMA_STREAM 0 +#define RTE_UART8_TX_DMA_CHANNEL 5 +#define RTE_UART8_TX_DMA_PRIORITY 0 + +// + + +// I2C1 (Inter-integrated Circuit Interface 1) [Driver_I2C1] +// Configuration settings for Driver_I2C1 in component ::CMSIS Driver:I2C +#define RTE_I2C1 0 + +// I2C1_SCL Pin <0=>PB6 <1=>PB8 +#define RTE_I2C1_SCL_PORT_ID 0 +#if (RTE_I2C1_SCL_PORT_ID == 0) +#define RTE_I2C1_SCL_PORT GPIOB +#define RTE_I2C1_SCL_BIT 6 +#elif (RTE_I2C1_SCL_PORT_ID == 1) +#define RTE_I2C1_SCL_PORT GPIOB +#define RTE_I2C1_SCL_BIT 8 +#else +#error "Invalid I2C1_SCL Pin Configuration!" +#endif + +// I2C1_SDA Pin <0=>PB7 <1=>PB9 +#define RTE_I2C1_SDA_PORT_ID 0 +#if (RTE_I2C1_SDA_PORT_ID == 0) +#define RTE_I2C1_SDA_PORT GPIOB +#define RTE_I2C1_SDA_BIT 7 +#elif (RTE_I2C1_SDA_PORT_ID == 1) +#define RTE_I2C1_SDA_PORT GPIOB +#define RTE_I2C1_SDA_BIT 9 +#else +#error "Invalid I2C1_SDA Pin Configuration!" +#endif + +// DMA Rx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <0=>0 <5=>5 +// Selects DMA Stream (only Stream 0 or 5 can be used) +// Channel <1=>1 +// Selects DMA Channel (only Channel 1 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_I2C1_RX_DMA 0 +#define RTE_I2C1_RX_DMA_NUMBER 1 +#define RTE_I2C1_RX_DMA_STREAM 0 +#define RTE_I2C1_RX_DMA_CHANNEL 1 +#define RTE_I2C1_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <6=>6 <7=>7 +// Selects DMA Stream (only Stream 6 or 7 can be used) +// Channel <1=>1 +// Selects DMA Channel (only Channel 1 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_I2C1_TX_DMA 0 +#define RTE_I2C1_TX_DMA_NUMBER 1 +#define RTE_I2C1_TX_DMA_STREAM 6 +#define RTE_I2C1_TX_DMA_CHANNEL 1 +#define RTE_I2C1_TX_DMA_PRIORITY 0 + +// + + +// I2C2 (Inter-integrated Circuit Interface 2) [Driver_I2C2] +// Configuration settings for Driver_I2C2 in component ::CMSIS Driver:I2C +#define RTE_I2C2 0 + +// I2C2_SCL Pin <0=>PF1 <1=>PH4 <2=>PB10 +#define RTE_I2C2_SCL_PORT_ID 0 +#if (RTE_I2C2_SCL_PORT_ID == 0) +#define RTE_I2C2_SCL_PORT GPIOF +#define RTE_I2C2_SCL_BIT 1 +#elif (RTE_I2C2_SCL_PORT_ID == 1) +#define RTE_I2C2_SCL_PORT GPIOH +#define RTE_I2C2_SCL_BIT 4 +#elif (RTE_I2C2_SCL_PORT_ID == 2) +#define RTE_I2C2_SCL_PORT GPIOB +#define RTE_I2C2_SCL_BIT 10 +#else +#error "Invalid I2C2_SCL Pin Configuration!" +#endif + +// I2C2_SDA Pin <0=>PF0 <1=>PH5 <2=>PB11 <3=>PB3 <4=>PB9 +#define RTE_I2C2_SDA_PORT_ID 0 +#if (RTE_I2C2_SDA_PORT_ID == 0) +#define RTE_I2C2_SDA_PORT GPIOF +#define RTE_I2C2_SDA_BIT 0 +#elif (RTE_I2C2_SDA_PORT_ID == 1) +#define RTE_I2C2_SDA_PORT GPIOH +#define RTE_I2C2_SDA_BIT 5 +#elif (RTE_I2C2_SDA_PORT_ID == 2) +#define RTE_I2C2_SDA_PORT GPIOB +#define RTE_I2C2_SDA_BIT 11 +#elif (RTE_I2C2_SDA_PORT_ID == 3) +#define RTE_I2C2_SDA_PORT GPIOB +#define RTE_I2C2_SDA_BIT 3 +#elif (RTE_I2C2_SDA_PORT_ID == 4) +#define RTE_I2C2_SDA_PORT GPIOB +#define RTE_I2C2_SDA_BIT 9 +#else +#error "Invalid I2C2_SDA Pin Configuration!" +#endif + +// DMA Rx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <2=>2 <3=>3 +// Selects DMA Stream (only Stream 2 or 3 can be used) +// Channel <7=>7 +// Selects DMA Channel (only Channel 7 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_I2C2_RX_DMA 0 +#define RTE_I2C2_RX_DMA_NUMBER 1 +#define RTE_I2C2_RX_DMA_STREAM 2 +#define RTE_I2C2_RX_DMA_CHANNEL 7 +#define RTE_I2C2_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <7=>7 +// Selects DMA Stream (only Stream 7 can be used) +// Channel <7=>7 +// Selects DMA Channel (only Channel 1 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_I2C2_TX_DMA 0 +#define RTE_I2C2_TX_DMA_NUMBER 1 +#define RTE_I2C2_TX_DMA_STREAM 7 +#define RTE_I2C2_TX_DMA_CHANNEL 7 +#define RTE_I2C2_TX_DMA_PRIORITY 0 + +// + + +// I2C3 (Inter-integrated Circuit Interface 3) [Driver_I2C3] +// Configuration settings for Driver_I2C3 in component ::CMSIS Driver:I2C +#define RTE_I2C3 1 + +// I2C3_SCL Pin <0=>PH7 <1=>PA8 +#define RTE_I2C3_SCL_PORT_ID 0 +#if (RTE_I2C3_SCL_PORT_ID == 0) +#define RTE_I2C3_SCL_PORT GPIOH +#define RTE_I2C3_SCL_BIT 7 +#elif (RTE_I2C3_SCL_PORT_ID == 1) +#define RTE_I2C3_SCL_PORT GPIOA +#define RTE_I2C3_SCL_BIT 8 +#else +#error "Invalid I2C3_SCL Pin Configuration!" +#endif + +// I2C3_SDA Pin <0=>PH8 <1=>PC9 <2=>PB4 <3=>PB8 +#define RTE_I2C3_SDA_PORT_ID 0 +#if (RTE_I2C3_SDA_PORT_ID == 0) +#define RTE_I2C3_SDA_PORT GPIOH +#define RTE_I2C3_SDA_BIT 8 +#elif (RTE_I2C3_SDA_PORT_ID == 1) +#define RTE_I2C3_SDA_PORT GPIOC +#define RTE_I2C3_SDA_BIT 9 +#elif (RTE_I2C3_SDA_PORT_ID == 2) +#define RTE_I2C3_SDA_PORT GPIOB +#define RTE_I2C3_SDA_BIT 4 +#elif (RTE_I2C3_SDA_PORT_ID == 3) +#define RTE_I2C3_SDA_PORT GPIOB +#define RTE_I2C3_SDA_BIT 8 +#else +#error "Invalid I2C3_SDA Pin Configuration!" +#endif + +// DMA Rx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <1=>1 <2=>2 +// Selects DMA Stream (only Stream 1 or 2 can be used) +// Channel <1=>1 <3=>3 +// Selects DMA Channel (only Channel 1 or 3 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_I2C3_RX_DMA 0 +#define RTE_I2C3_RX_DMA_NUMBER 1 +#define RTE_I2C3_RX_DMA_STREAM 2 +#define RTE_I2C3_RX_DMA_CHANNEL 3 +#define RTE_I2C3_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <4=>4 +// Selects DMA Stream (only Stream 4 can be used) +// Channel <3=>3 +// Selects DMA Channel (only Channel 3 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_I2C3_TX_DMA 0 +#define RTE_I2C3_TX_DMA_NUMBER 1 +#define RTE_I2C3_TX_DMA_STREAM 4 +#define RTE_I2C3_TX_DMA_CHANNEL 3 +#define RTE_I2C3_TX_DMA_PRIORITY 0 + +// + + +// I2C4 (Inter-integrated Circuit Interface 4) [Driver_I2C4] +// Configuration settings for Driver_I2C4 in component ::CMSIS Driver:I2C +#define RTE_I2C4 0 + +// I2C4_SCL Pin <0=>PD12 <1=>PF14 <2=>PH11 <3=>PB6 <4=>PB8 +#define RTE_I2C4_SCL_PORT_ID 0 +#if (RTE_I2C4_SCL_PORT_ID == 0) +#define RTE_I2C4_SCL_PORT GPIOD +#define RTE_I2C4_SCL_BIT 12 +#elif (RTE_I2C4_SCL_PORT_ID == 1) +#define RTE_I2C4_SCL_PORT GPIOF +#define RTE_I2C4_SCL_BIT 14 +#elif (RTE_I2C4_SCL_PORT_ID == 2) +#define RTE_I2C4_SCL_PORT GPIOH +#define RTE_I2C4_SCL_BIT 11 +#elif (RTE_I2C4_SCL_PORT_ID == 3) +#define RTE_I2C4_SCL_PORT GPIOB +#define RTE_I2C4_SCL_BIT 6 +#elif (RTE_I2C4_SCL_PORT_ID == 4) +#define RTE_I2C4_SCL_PORT GPIOB +#define RTE_I2C4_SCL_BIT 8 +#else +#error "Invalid I2C4_SCL Pin Configuration!" +#endif + +// I2C4_SDA Pin <0=>PD13 <1=>PF15 <2=>PH12 <3=>PB7 <4=>PB9 +#define RTE_I2C4_SDA_PORT_ID 0 +#if (RTE_I2C4_SDA_PORT_ID == 0) +#define RTE_I2C4_SDA_PORT GPIOD +#define RTE_I2C4_SDA_BIT 13 +#elif (RTE_I2C4_SDA_PORT_ID == 1) +#define RTE_I2C4_SDA_PORT GPIOF +#define RTE_I2C4_SDA_BIT 15 +#elif (RTE_I2C4_SDA_PORT_ID == 2) +#define RTE_I2C4_SDA_PORT GPIOH +#define RTE_I2C4_SDA_BIT 12 +#elif (RTE_I2C4_SDA_PORT_ID == 3) +#define RTE_I2C4_SDA_PORT GPIOB +#define RTE_I2C4_SDA_BIT 7 +#elif (RTE_I2C4_SDA_PORT_ID == 4) +#define RTE_I2C4_SDA_PORT GPIOB +#define RTE_I2C4_SDA_BIT 9 +#else +#error "Invalid I2C4_SDA Pin Configuration!" +#endif + +// DMA Rx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <2=>2 +// Selects DMA Stream (only Stream 2 can be used) +// Channel <2=>2 +// Selects DMA Channel (only Channel 2 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_I2C4_RX_DMA 0 +#define RTE_I2C4_RX_DMA_NUMBER 1 +#define RTE_I2C4_RX_DMA_STREAM 2 +#define RTE_I2C4_RX_DMA_CHANNEL 3 +#define RTE_I2C4_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <5=>5 +// Selects DMA Stream (only Stream 5 can be used) +// Channel <2=>2 +// Selects DMA Channel (only Channel 2 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_I2C4_TX_DMA 0 +#define RTE_I2C4_TX_DMA_NUMBER 1 +#define RTE_I2C4_TX_DMA_STREAM 4 +#define RTE_I2C4_TX_DMA_CHANNEL 3 +#define RTE_I2C4_TX_DMA_PRIORITY 0 + +// + + +// SPI1 (Serial Peripheral Interface 1) [Driver_SPI1] +// Configuration settings for Driver_SPI1 in component ::CMSIS Driver:SPI +#define RTE_SPI1 0 + +// SPI1_MISO Pin <0=>Not Used <1=>PA6 <2=>PB4 <3=>PG9 +#define RTE_SPI1_MISO_PORT_ID 0 +#if (RTE_SPI1_MISO_PORT_ID == 0) +#define RTE_SPI1_MISO 0 +#elif (RTE_SPI1_MISO_PORT_ID == 1) +#define RTE_SPI1_MISO 1 +#define RTE_SPI1_MISO_PORT GPIOA +#define RTE_SPI1_MISO_BIT 6 +#elif (RTE_SPI1_MISO_PORT_ID == 2) +#define RTE_SPI1_MISO 1 +#define RTE_SPI1_MISO_PORT GPIOB +#define RTE_SPI1_MISO_BIT 4 +#elif (RTE_SPI1_MISO_PORT_ID == 3) +#define RTE_SPI1_MISO 1 +#define RTE_SPI1_MISO_PORT GPIOG +#define RTE_SPI1_MISO_BIT 9 +#else +#error "Invalid SPI1_MISO Pin Configuration!" +#endif + +// SPI1_MOSI Pin <0=>Not Used <1=>PA7 <2=>PB5 <3=>PD7 +#define RTE_SPI1_MOSI_PORT_ID 0 +#if (RTE_SPI1_MOSI_PORT_ID == 0) +#define RTE_SPI1_MOSI 0 +#elif (RTE_SPI1_MOSI_PORT_ID == 1) +#define RTE_SPI1_MOSI 1 +#define RTE_SPI1_MOSI_PORT GPIOA +#define RTE_SPI1_MOSI_BIT 7 +#elif (RTE_SPI1_MOSI_PORT_ID == 2) +#define RTE_SPI1_MOSI 1 +#define RTE_SPI1_MOSI_PORT GPIOB +#define RTE_SPI1_MOSI_BIT 5 +#elif (RTE_SPI1_MOSI_PORT_ID == 3) +#define RTE_SPI1_MOSI 1 +#define RTE_SPI1_MOSI_PORT GPIOD +#define RTE_SPI1_MOSI_BIT 7 +#else +#error "Invalid SPI1_MOSI Pin Configuration!" +#endif + +// SPI1_SCK Pin <0=>PA5 <1=>PB3 <2=>PG11 +#define RTE_SPI1_SCL_PORT_ID 0 +#if (RTE_SPI1_SCL_PORT_ID == 0) +#define RTE_SPI1_SCL_PORT GPIOA +#define RTE_SPI1_SCL_BIT 5 +#elif (RTE_SPI1_SCL_PORT_ID == 1) +#define RTE_SPI1_SCL_PORT GPIOB +#define RTE_SPI1_SCL_BIT 3 +#elif (RTE_SPI1_SCL_PORT_ID == 2) +#define RTE_SPI1_SCL_PORT GPIOG +#define RTE_SPI1_SCL_BIT 11 +#else +#error "Invalid SPI1_SCK Pin Configuration!" +#endif + +// SPI1_NSS Pin <0=>Not Used <1=>PA4 <2=>PA15 <3=>PG10 +#define RTE_SPI1_NSS_PORT_ID 0 +#if (RTE_SPI1_NSS_PORT_ID == 0) +#define RTE_SPI1_NSS_PIN 0 +#elif (RTE_SPI1_NSS_PORT_ID == 1) +#define RTE_SPI1_NSS_PIN 1 +#define RTE_SPI1_NSS_PORT GPIOA +#define RTE_SPI1_NSS_BIT 4 +#elif (RTE_SPI1_NSS_PORT_ID == 2) +#define RTE_SPI1_NSS_PIN 1 +#define RTE_SPI1_NSS_PORT GPIOA +#define RTE_SPI1_NSS_BIT 15 +#elif (RTE_SPI1_NSS_PORT_ID == 3) +#define RTE_SPI1_NSS_PIN 1 +#define RTE_SPI1_NSS_PORT GPIOG +#define RTE_SPI1_NSS_BIT 10 +#else +#error "Invalid SPI1_NSS Pin Configuration!" +#endif + +// DMA Rx +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <0=>0 <2=>2 +// Selects DMA Stream (only Stream 0 or 2 can be used) +// Channel <3=>3 +// Selects DMA Channel (only Channel 3 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SPI1_RX_DMA 0 +#define RTE_SPI1_RX_DMA_NUMBER 2 +#define RTE_SPI1_RX_DMA_STREAM 0 +#define RTE_SPI1_RX_DMA_CHANNEL 3 +#define RTE_SPI1_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <3=>3 <5=>5 +// Selects DMA Stream (only Stream 3 or 5 can be used) +// Channel <3=>3 +// Selects DMA Channel (only Channel 3 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SPI1_TX_DMA 0 +#define RTE_SPI1_TX_DMA_NUMBER 2 +#define RTE_SPI1_TX_DMA_STREAM 5 +#define RTE_SPI1_TX_DMA_CHANNEL 3 +#define RTE_SPI1_TX_DMA_PRIORITY 0 + +// + + +// SPI2 (Serial Peripheral Interface 2) [Driver_SPI2] +// Configuration settings for Driver_SPI2 in component ::CMSIS Driver:SPI +#define RTE_SPI2 0 + +// SPI2_MISO Pin <0=>Not Used <1=>PB14 <2=>PC2 <3=>PI2 +#define RTE_SPI2_MISO_PORT_ID 0 +#if (RTE_SPI2_MISO_PORT_ID == 0) +#define RTE_SPI2_MISO 0 +#elif (RTE_SPI2_MISO_PORT_ID == 1) +#define RTE_SPI2_MISO 1 +#define RTE_SPI2_MISO_PORT GPIOB +#define RTE_SPI2_MISO_BIT 14 +#elif (RTE_SPI2_MISO_PORT_ID == 2) +#define RTE_SPI2_MISO 1 +#define RTE_SPI2_MISO_PORT GPIOC +#define RTE_SPI2_MISO_BIT 2 +#elif (RTE_SPI2_MISO_PORT_ID == 3) +#define RTE_SPI2_MISO 1 +#define RTE_SPI2_MISO_PORT GPIOI +#define RTE_SPI2_MISO_BIT 2 +#else +#error "Invalid SPI2_MISO Pin Configuration!" +#endif + +// SPI2_MOSI Pin <0=>Not Used <1=>PB15 <2=>PC1 <3=>PC3 <4=>PI3 <5=>PB15 +#define RTE_SPI2_MOSI_PORT_ID 0 +#if (RTE_SPI2_MOSI_PORT_ID == 0) +#define RTE_SPI2_MOSI 0 +#elif (RTE_SPI2_MOSI_PORT_ID == 1) +#define RTE_SPI2_MOSI 1 +#define RTE_SPI2_MOSI_PORT GPIOB +#define RTE_SPI2_MOSI_BIT 15 +#elif (RTE_SPI2_MOSI_PORT_ID == 2) +#define RTE_SPI2_MOSI 1 +#define RTE_SPI2_MOSI_PORT GPIOC +#define RTE_SPI2_MOSI_BIT 1 +#elif (RTE_SPI2_MOSI_PORT_ID == 3) +#define RTE_SPI2_MOSI 1 +#define RTE_SPI2_MOSI_PORT GPIOC +#define RTE_SPI2_MOSI_BIT 3 +#elif (RTE_SPI2_MOSI_PORT_ID == 4) +#define RTE_SPI2_MOSI 1 +#define RTE_SPI2_MOSI_PORT GPIOI +#define RTE_SPI2_MOSI_BIT 3 +#elif (RTE_SPI2_MOSI_PORT_ID == 5) +#define RTE_SPI2_MOSI 1 +#define RTE_SPI2_MOSI_PORT GPIOB +#define RTE_SPI2_MOSI_BIT 15 +#else +#error "Invalid SPI2_MOSI Pin Configuration!" +#endif + +// SPI2_SCK Pin <0=>PA9 <1=>PB10 <2=>PB13 <3=>PD3 <4=>PI1 <5=>PA12 +#define RTE_SPI2_SCL_PORT_ID 0 +#if (RTE_SPI2_SCL_PORT_ID == 0) +#define RTE_SPI2_SCL_PORT GPIOA +#define RTE_SPI2_SCL_BIT 9 +#elif (RTE_SPI2_SCL_PORT_ID == 1) +#define RTE_SPI2_SCL_PORT GPIOB +#define RTE_SPI2_SCL_BIT 10 +#elif (RTE_SPI2_SCL_PORT_ID == 2) +#define RTE_SPI2_SCL_PORT GPIOB +#define RTE_SPI2_SCL_BIT 13 +#elif (RTE_SPI2_SCL_PORT_ID == 3) +#define RTE_SPI2_SCL_PORT GPIOD +#define RTE_SPI2_SCL_BIT 3 +#elif (RTE_SPI2_SCL_PORT_ID == 4) +#define RTE_SPI2_SCL_PORT GPIOI +#define RTE_SPI2_SCL_BIT 1 +#elif (RTE_SPI2_SCL_PORT_ID == 5) +#define RTE_SPI2_SCL_PORT GPIOA +#define RTE_SPI2_SCL_BIT 12 +#else +#error "Invalid SPI2_SCK Pin Configuration!" +#endif + +// SPI2_NSS Pin <0=>Not Used <1=>PB4 <2=>PB9 <3=>PB12 <4=>PI0 <5=>PA11 +#define RTE_SPI2_NSS_PORT_ID 0 +#if (RTE_SPI2_NSS_PORT_ID == 0) +#define RTE_SPI2_NSS_PIN 0 +#elif (RTE_SPI2_NSS_PORT_ID == 1) +#define RTE_SPI2_NSS_PIN 1 +#define RTE_SPI2_NSS_PORT GPIOB +#define RTE_SPI2_NSS_BIT 4 +#elif (RTE_SPI2_NSS_PORT_ID == 2) +#define RTE_SPI2_NSS_PIN 1 +#define RTE_SPI2_NSS_PORT GPIOB +#define RTE_SPI2_NSS_BIT 9 +#elif (RTE_SPI2_NSS_PORT_ID == 3) +#define RTE_SPI2_NSS_PIN 1 +#define RTE_SPI2_NSS_PORT GPIOB +#define RTE_SPI2_NSS_BIT 12 +#elif (RTE_SPI2_NSS_PORT_ID == 4) +#define RTE_SPI2_NSS_PIN 1 +#define RTE_SPI2_NSS_PORT GPIOI +#define RTE_SPI2_NSS_BIT 0 +#elif (RTE_SPI2_NSS_PORT_ID == 5) +#define RTE_SPI2_NSS_PIN 1 +#define RTE_SPI2_NSS_PORT GPIOA +#define RTE_SPI2_NSS_BIT 11 +#else +#error "Invalid SPI2_NSS Pin Configuration!" +#endif + +// DMA Rx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <3=>3 +// Selects DMA Stream (only Stream 3 can be used) +// Channel <0=>0 +// Selects DMA Channel (only Channel 0 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SPI2_RX_DMA 0 +#define RTE_SPI2_RX_DMA_NUMBER 1 +#define RTE_SPI2_RX_DMA_STREAM 3 +#define RTE_SPI2_RX_DMA_CHANNEL 0 +#define RTE_SPI2_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <4=>4 +// Selects DMA Stream (only Stream 4 can be used) +// Channel <0=>0 +// Selects DMA Channel (only Channel 0 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SPI2_TX_DMA 0 +#define RTE_SPI2_TX_DMA_NUMBER 1 +#define RTE_SPI2_TX_DMA_STREAM 4 +#define RTE_SPI2_TX_DMA_CHANNEL 0 +#define RTE_SPI2_TX_DMA_PRIORITY 0 + +// + + +// SPI3 (Serial Peripheral Interface 3) [Driver_SPI3] +// Configuration settings for Driver_SPI3 in component ::CMSIS Driver:SPI +#define RTE_SPI3 0 + +// SPI3_MISO Pin <0=>Not Used <1=>PB4 <2=>PC11 +#define RTE_SPI3_MISO_PORT_ID 0 +#if (RTE_SPI3_MISO_PORT_ID == 0) +#define RTE_SPI3_MISO 0 +#elif (RTE_SPI3_MISO_PORT_ID == 1) +#define RTE_SPI3_MISO 1 +#define RTE_SPI3_MISO_PORT GPIOB +#define RTE_SPI3_MISO_BIT 4 +#elif (RTE_SPI3_MISO_PORT_ID == 2) +#define RTE_SPI3_MISO 1 +#define RTE_SPI3_MISO_PORT GPIOC +#define RTE_SPI3_MISO_BIT 11 +#else +#error "Invalid SPI3_MISO Pin Configuration!" +#endif + +// SPI3_MOSI Pin <0=>Not Used <1=>PB2 <2=>PB5 <3=>PC12 <4=>PD6 +#define RTE_SPI3_MOSI_PORT_ID 0 +#if (RTE_SPI3_MOSI_PORT_ID == 0) +#define RTE_SPI3_MOSI 0 +#elif (RTE_SPI3_MOSI_PORT_ID == 1) +#define RTE_SPI3_MOSI 1 +#define RTE_SPI3_MOSI_PORT GPIOB +#define RTE_SPI3_MOSI_BIT 2 +#elif (RTE_SPI3_MOSI_PORT_ID == 2) +#define RTE_SPI3_MOSI 1 +#define RTE_SPI3_MOSI_PORT GPIOB +#define RTE_SPI3_MOSI_BIT 5 +#elif (RTE_SPI3_MOSI_PORT_ID == 3) +#define RTE_SPI3_MOSI 1 +#define RTE_SPI3_MOSI_PORT GPIOC +#define RTE_SPI3_MOSI_BIT 12 +#elif (RTE_SPI3_MOSI_PORT_ID == 4) +#define RTE_SPI3_MOSI 1 +#define RTE_SPI3_MOSI_PORT GPIOD +#define RTE_SPI3_MOSI_BIT 6 +#else +#error "Invalid SPI3_MOSI Pin Configuration!" +#endif + +// SPI3_SCK Pin <0=>PB3 <1=>PC10 +#define RTE_SPI3_SCL_PORT_ID 0 +#if (RTE_SPI3_SCL_PORT_ID == 0) +#define RTE_SPI3_SCL_PORT GPIOB +#define RTE_SPI3_SCL_BIT 3 +#elif (RTE_SPI3_SCL_PORT_ID == 1) +#define RTE_SPI3_SCL_PORT GPIOC +#define RTE_SPI3_SCL_BIT 10 +#else +#error "Invalid SPI3_SCK Pin Configuration!" +#endif + +// SPI3_NSS Pin <0=>Not Used <1=>PA4 <2=>PA15 +#define RTE_SPI3_NSS_PORT_ID 0 +#if (RTE_SPI3_NSS_PORT_ID == 0) +#define RTE_SPI3_NSS_PIN 0 +#elif (RTE_SPI3_NSS_PORT_ID == 1) +#define RTE_SPI3_NSS_PIN 1 +#define RTE_SPI3_NSS_PORT GPIOA +#define RTE_SPI3_NSS_BIT 4 +#elif (RTE_SPI3_NSS_PORT_ID == 2) +#define RTE_SPI3_NSS_PIN 1 +#define RTE_SPI3_NSS_PORT GPIOA +#define RTE_SPI3_NSS_BIT 15 +#else +#error "Invalid SPI3_NSS Pin Configuration!" +#endif + +// DMA Rx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <0=>0 <2=>2 +// Selects DMA Stream (only Stream 0 or 2 can be used) +// Channel <0=>0 +// Selects DMA Channel (only Channel 0 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SPI3_RX_DMA 0 +#define RTE_SPI3_RX_DMA_NUMBER 1 +#define RTE_SPI3_RX_DMA_STREAM 0 +#define RTE_SPI3_RX_DMA_CHANNEL 0 +#define RTE_SPI3_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <1=>1 +// Selects DMA Number (only DMA1 can be used) +// Stream <5=>5 <7=>7 +// Selects DMA Stream (only Stream 5 or 7 can be used) +// Channel <0=>0 +// Selects DMA Channel (only Channel 0 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SPI3_TX_DMA 0 +#define RTE_SPI3_TX_DMA_NUMBER 1 +#define RTE_SPI3_TX_DMA_STREAM 5 +#define RTE_SPI3_TX_DMA_CHANNEL 0 +#define RTE_SPI3_TX_DMA_PRIORITY 0 + +// + + +// SPI4 (Serial Peripheral Interface 4) [Driver_SPI4] +// Configuration settings for Driver_SPI4 in component ::CMSIS Driver:SPI +#define RTE_SPI4 0 + +// SPI4_MISO Pin <0=>Not Used <1=>PE5 <2=>PE13 +#define RTE_SPI4_MISO_PORT_ID 0 +#if (RTE_SPI4_MISO_PORT_ID == 0) +#define RTE_SPI4_MISO 0 +#elif (RTE_SPI4_MISO_PORT_ID == 1) +#define RTE_SPI4_MISO 1 +#define RTE_SPI4_MISO_PORT GPIOE +#define RTE_SPI4_MISO_BIT 5 +#elif (RTE_SPI4_MISO_PORT_ID == 2) +#define RTE_SPI4_MISO 1 +#define RTE_SPI4_MISO_PORT GPIOE +#define RTE_SPI4_MISO_BIT 13 +#else +#error "Invalid SPI4_MISO Pin Configuration!" +#endif + +// SPI4_MOSI Pin <0=>Not Used <1=>PE6 <2=>PE14 +#define RTE_SPI4_MOSI_PORT_ID 0 +#if (RTE_SPI4_MOSI_PORT_ID == 0) +#define RTE_SPI4_MOSI 0 +#elif (RTE_SPI4_MOSI_PORT_ID == 1) +#define RTE_SPI4_MOSI 1 +#define RTE_SPI4_MOSI_PORT GPIOE +#define RTE_SPI4_MOSI_BIT 6 +#elif (RTE_SPI4_MOSI_PORT_ID == 2) +#define RTE_SPI4_MOSI 1 +#define RTE_SPI4_MOSI_PORT GPIOE +#define RTE_SPI4_MOSI_BIT 14 +#else +#error "Invalid SPI4_MOSI Pin Configuration!" +#endif + +// SPI4_SCK Pin <0=>PE2 <1=>PE12 +#define RTE_SPI4_SCL_PORT_ID 0 +#if (RTE_SPI4_SCL_PORT_ID == 0) +#define RTE_SPI4_SCL_PORT GPIOE +#define RTE_SPI4_SCL_BIT 2 +#elif (RTE_SPI4_SCL_PORT_ID == 1) +#define RTE_SPI4_SCL_PORT GPIOE +#define RTE_SPI4_SCL_BIT 12 +#else +#error "Invalid SPI4_SCK Pin Configuration!" +#endif + +// SPI4_NSS Pin <0=>Not Used <1=>PE4 <2=>PE11 +#define RTE_SPI4_NSS_PORT_ID 0 +#if (RTE_SPI4_NSS_PORT_ID == 0) +#define RTE_SPI4_NSS_PIN 0 +#elif (RTE_SPI4_NSS_PORT_ID == 1) +#define RTE_SPI4_NSS_PIN 1 +#define RTE_SPI4_NSS_PORT GPIOE +#define RTE_SPI4_NSS_BIT 4 +#elif (RTE_SPI4_NSS_PORT_ID == 2) +#define RTE_SPI4_NSS_PIN 1 +#define RTE_SPI4_NSS_PORT GPIOE +#define RTE_SPI4_NSS_BIT 11 +#else +#error "Invalid SPI4_NSS Pin Configuration!" +#endif + +// DMA Rx +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <0=>0 <3=>3 +// Selects DMA Stream (only Stream 0 or 3 can be used) +// Channel <4=>4 <5=>5 +// Selects DMA Channel (only Channel 4 or 5 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SPI4_RX_DMA 0 +#define RTE_SPI4_RX_DMA_NUMBER 2 +#define RTE_SPI4_RX_DMA_STREAM 0 +#define RTE_SPI4_RX_DMA_CHANNEL 4 +#define RTE_SPI4_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <1=>1 <4=>4 +// Selects DMA Stream (only Stream 1 or 4 can be used) +// Channel <4=>4 <5=>5 +// Selects DMA Channel (only Channel 4 or 5 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SPI4_TX_DMA 0 +#define RTE_SPI4_TX_DMA_NUMBER 2 +#define RTE_SPI4_TX_DMA_STREAM 1 +#define RTE_SPI4_TX_DMA_CHANNEL 4 +#define RTE_SPI4_TX_DMA_PRIORITY 0 + +// + + +// SPI5 (Serial Peripheral Interface 5) [Driver_SPI5] +// Configuration settings for Driver_SPI5 in component ::CMSIS Driver:SPI +#define RTE_SPI5 0 + +// SPI5_MISO Pin <0=>Not Used <1=>PF8 <2=>PH7 +#define RTE_SPI5_MISO_PORT_ID 0 +#if (RTE_SPI5_MISO_PORT_ID == 0) +#define RTE_SPI5_MISO 0 +#elif (RTE_SPI5_MISO_PORT_ID == 1) +#define RTE_SPI5_MISO 1 +#define RTE_SPI5_MISO_PORT GPIOF +#define RTE_SPI5_MISO_BIT 8 +#elif (RTE_SPI5_MISO_PORT_ID == 2) +#define RTE_SPI5_MISO 1 +#define RTE_SPI5_MISO_PORT GPIOH +#define RTE_SPI5_MISO_BIT 7 +#else +#error "Invalid SPI5_MISO Pin Configuration!" +#endif + +// SPI5_MOSI Pin <0=>Not Used <1=>PF9 <2=>PF11 +#define RTE_SPI5_MOSI_PORT_ID 0 +#if (RTE_SPI5_MOSI_PORT_ID == 0) +#define RTE_SPI5_MOSI 0 +#elif (RTE_SPI5_MOSI_PORT_ID == 1) +#define RTE_SPI5_MOSI 1 +#define RTE_SPI5_MOSI_PORT GPIOF +#define RTE_SPI5_MOSI_BIT 9 +#elif (RTE_SPI5_MOSI_PORT_ID == 2) +#define RTE_SPI5_MOSI 1 +#define RTE_SPI5_MOSI_PORT GPIOF +#define RTE_SPI5_MOSI_BIT 11 +#else +#error "Invalid SPI5_MOSI Pin Configuration!" +#endif + +// SPI5_SCK Pin <0=>PF7 <1=>PH6 +#define RTE_SPI5_SCL_PORT_ID 0 +#if (RTE_SPI5_SCL_PORT_ID == 0) +#define RTE_SPI5_SCL_PORT GPIOF +#define RTE_SPI5_SCL_BIT 7 +#elif (RTE_SPI5_SCL_PORT_ID == 1) +#define RTE_SPI5_SCL_PORT GPIOH +#define RTE_SPI5_SCL_BIT 6 +#else +#error "Invalid SPI5_SCK Pin Configuration!" +#endif + +// SPI5_NSS Pin <0=>Not Used <1=>PF6 <2=>PH5 +#define RTE_SPI5_NSS_PORT_ID 0 +#if (RTE_SPI5_NSS_PORT_ID == 0) +#define RTE_SPI5_NSS_PIN 0 +#elif (RTE_SPI5_NSS_PORT_ID == 1) +#define RTE_SPI5_NSS_PIN 1 +#define RTE_SPI5_NSS_PORT GPIOF +#define RTE_SPI5_NSS_BIT 6 +#elif (RTE_SPI5_NSS_PORT_ID == 2) +#define RTE_SPI5_NSS_PIN 1 +#define RTE_SPI5_NSS_PORT GPIOH +#define RTE_SPI5_NSS_BIT 5 +#else +#error "Invalid SPI5_NSS Pin Configuration!" +#endif + +// DMA Rx +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <3=>3 <5=>5 +// Selects DMA Stream (only Stream 3 or 5 can be used) +// Channel <2=>2 <7=>7 +// Selects DMA Channel (only Channel 2 or 7 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SPI5_RX_DMA 0 +#define RTE_SPI5_RX_DMA_NUMBER 2 +#define RTE_SPI5_RX_DMA_STREAM 3 +#define RTE_SPI5_RX_DMA_CHANNEL 2 +#define RTE_SPI5_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <4=>4 <6=>6 +// Selects DMA Stream (only Stream 4 or 6 can be used) +// Channel <2=>2 <7=>7 +// Selects DMA Channel (only Channel 2 or 7 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SPI5_TX_DMA 0 +#define RTE_SPI5_TX_DMA_NUMBER 2 +#define RTE_SPI5_TX_DMA_STREAM 4 +#define RTE_SPI5_TX_DMA_CHANNEL 2 +#define RTE_SPI5_TX_DMA_PRIORITY 0 + +// + + +// SPI6 (Serial Peripheral Interface 6) [Driver_SPI6] +// Configuration settings for Driver_SPI6 in component ::CMSIS Driver:SPI +#define RTE_SPI6 0 + +// SPI6_MISO Pin <0=>Not Used <1=>PG12 <2=>PA6 <3=>PB4 +#define RTE_SPI6_MISO_PORT_ID 0 +#if (RTE_SPI6_MISO_PORT_ID == 0) +#define RTE_SPI6_MISO 0 +#elif (RTE_SPI6_MISO_PORT_ID == 1) +#define RTE_SPI6_MISO 1 +#define RTE_SPI6_MISO_PORT GPIOG +#define RTE_SPI6_MISO_BIT 12 +#elif (RTE_SPI6_MISO_PORT_ID == 2) +#define RTE_SPI6_MISO 1 +#define RTE_SPI6_MISO_PORT GPIOA +#define RTE_SPI6_MISO_BIT 6 +#elif (RTE_SPI6_MISO_PORT_ID == 3) +#define RTE_SPI6_MISO 1 +#define RTE_SPI6_MISO_PORT GPIOB +#define RTE_SPI6_MISO_BIT 4 +#else +#error "Invalid SPI6_MISO Pin Configuration!" +#endif + +// SPI6_MOSI Pin <0=>Not Used <1=>PG14 <2=>PA7 <3=>PB5 +#define RTE_SPI6_MOSI_PORT_ID 0 +#if (RTE_SPI6_MOSI_PORT_ID == 0) +#define RTE_SPI6_MOSI 0 +#elif (RTE_SPI6_MOSI_PORT_ID == 1) +#define RTE_SPI6_MOSI 1 +#define RTE_SPI6_MOSI_PORT GPIOG +#define RTE_SPI6_MOSI_BIT 14 +#elif (RTE_SPI6_MOSI_PORT_ID == 2) +#define RTE_SPI6_MOSI 1 +#define RTE_SPI6_MOSI_PORT GPIOA +#define RTE_SPI6_MOSI_BIT 7 +#elif (RTE_SPI6_MOSI_PORT_ID == 3) +#define RTE_SPI6_MOSI 1 +#define RTE_SPI6_MOSI_PORT GPIOB +#define RTE_SPI6_MOSI_BIT 5 +#else +#error "Invalid SPI6_MOSI Pin Configuration!" +#endif + +// SPI6_SCK Pin <0=>PG13 <1=>PA5 <2=>PB3 +#define RTE_SPI6_SCL_PORT_ID 0 +#if (RTE_SPI6_SCL_PORT_ID == 0) +#define RTE_SPI6_SCL_PORT GPIOG +#define RTE_SPI6_SCL_BIT 13 +#elif (RTE_SPI6_SCL_PORT_ID == 1) +#define RTE_SPI6_SCL_PORT GPIOA +#define RTE_SPI6_SCL_BIT 5 +#elif (RTE_SPI6_SCL_PORT_ID == 2) +#define RTE_SPI6_SCL_PORT GPIOB +#define RTE_SPI6_SCL_BIT 3 +#else +#error "Invalid SPI6_SCK Pin Configuration!" +#endif + +// SPI6_NSS Pin <0=>Not Used <1=>PG8 <2=>PA4 <3=>PA15 +#define RTE_SPI6_NSS_PORT_ID 0 +#if (RTE_SPI6_NSS_PORT_ID == 0) +#define RTE_SPI6_NSS_PIN 0 +#elif (RTE_SPI6_NSS_PORT_ID == 1) +#define RTE_SPI6_NSS_PIN 1 +#define RTE_SPI6_NSS_PORT GPIOG +#define RTE_SPI6_NSS_BIT 8 +#elif (RTE_SPI6_NSS_PORT_ID == 2) +#define RTE_SPI6_NSS_PIN 1 +#define RTE_SPI6_NSS_PORT GPIOA +#define RTE_SPI6_NSS_BIT 4 +#elif (RTE_SPI6_NSS_PORT_ID == 3) +#define RTE_SPI6_NSS_PIN 1 +#define RTE_SPI6_NSS_PORT GPIOA +#define RTE_SPI6_NSS_BIT 15 +#else +#error "Invalid SPI6_NSS Pin Configuration!" +#endif + +// DMA Rx +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <6=>6 +// Selects DMA Stream (only Stream 6 can be used) +// Channel <1=>1 +// Selects DMA Channel (only Channel 1 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SPI6_RX_DMA 0 +#define RTE_SPI6_RX_DMA_NUMBER 2 +#define RTE_SPI6_RX_DMA_STREAM 6 +#define RTE_SPI6_RX_DMA_CHANNEL 1 +#define RTE_SPI6_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <5=>5 +// Selects DMA Stream (only Stream 5 can be used) +// Channel <1=>1 +// Selects DMA Channel (only Channel 1 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SPI6_TX_DMA 0 +#define RTE_SPI6_TX_DMA_NUMBER 2 +#define RTE_SPI6_TX_DMA_STREAM 5 +#define RTE_SPI6_TX_DMA_CHANNEL 1 +#define RTE_SPI6_TX_DMA_PRIORITY 0 + +// + + +// SAI1 (Serial Audio Interface 1) [Driver_SAI1] +// Configuration settings for Driver_SAI1 in component ::CMSIS Driver:SAI +#define RTE_SAI1 0 + +// SAI1_SD_A Pin <0=>Not Used <1=>PB2 <2=>PC1 <3=>PD6 <4=>PE6 +#define RTE_SAI1_SD_A_PORT_ID 0 +#if (RTE_SAI1_SD_A_PORT_ID == 0) +#define RTE_SAI1_SD_A_PIN 0 +#elif (RTE_SAI1_SD_A_PORT_ID == 1) +#define RTE_SAI1_SD_A_PIN 1 +#define RTE_SAI1_SD_A_PORT GPIOB +#define RTE_SAI1_SD_A_BIT 2 +#elif (RTE_SAI1_SD_A_PORT_ID == 2) +#define RTE_SAI1_SD_A_PIN 1 +#define RTE_SAI1_SD_A_PORT GPIOC +#define RTE_SAI1_SD_A_BIT 1 +#elif (RTE_SAI1_SD_A_PORT_ID == 3) +#define RTE_SAI1_SD_A_PIN 1 +#define RTE_SAI1_SD_A_PORT GPIOD +#define RTE_SAI1_SD_A_BIT 6 +#elif (RTE_SAI1_SD_A_PORT_ID == 4) +#define RTE_SAI1_SD_A_PIN 1 +#define RTE_SAI1_SD_A_PORT GPIOE +#define RTE_SAI1_SD_A_BIT 6 +#else +#error "Invalid SAI1_SD_A Pin Configuration!" +#endif + +// SAI1_FS_A Pin <0=>Not Used <1=>PE4 +#define RTE_SAI1_FS_A_PORT_ID 0 +#if (RTE_SAI1_FS_A_PORT_ID == 0) +#define RTE_SAI1_FS_A_PIN 0 +#elif (RTE_SAI1_FS_A_PORT_ID == 1) +#define RTE_SAI1_FS_A_PIN 1 +#define RTE_SAI1_FS_A_PORT GPIOE +#define RTE_SAI1_FS_A_BIT 4 +#else +#error "Invalid SAI1_FS_A Pin Configuration!" +#endif + +// SAI1_SCK_A Pin <0=>Not Used <1=>PE5 +#define RTE_SAI1_SCK_A_PORT_ID 0 +#if (RTE_SAI1_SCK_A_PORT_ID == 0) +#define RTE_SAI1_SCK_A_PIN 0 +#elif (RTE_SAI1_SCK_A_PORT_ID == 1) +#define RTE_SAI1_SCK_A_PIN 1 +#define RTE_SAI1_SCK_A_PORT GPIOE +#define RTE_SAI1_SCK_A_BIT 5 +#else +#error "Invalid SAI1_SCK_A Pin Configuration!" +#endif + +// SAI1_MCLK_A Pin <0=>Not Used <1=>PE2 <2=>PG7 +#define RTE_SAI1_MCLK_A_PORT_ID 0 +#if (RTE_SAI1_MCLK_A_PORT_ID == 0) +#define RTE_SAI1_MCLK_A_PIN 0 +#elif (RTE_SAI1_MCLK_A_PORT_ID == 1) +#define RTE_SAI1_MCLK_A_PIN 1 +#define RTE_SAI1_MCLK_A_PORT GPIOE +#define RTE_SAI1_MCLK_A_BIT 2 +#elif (RTE_SAI1_MCLK_A_PORT_ID == 2) +#define RTE_SAI1_MCLK_A_PIN 1 +#define RTE_SAI1_MCLK_A_PORT GPIOG +#define RTE_SAI1_MCLK_A_BIT 7 +#else +#error "Invalid SAI1_MCLK_A Pin Configuration!" +#endif + +// SAI1_SD_B Pin <0=>Not Used <1=>PE3 <2=>PF6 +#define RTE_SAI1_SD_B_PORT_ID 0 +#if (RTE_SAI1_SD_B_PORT_ID == 0) +#define RTE_SAI1_SD_B_PIN 0 +#elif (RTE_SAI1_SD_B_PORT_ID == 1) +#define RTE_SAI1_SD_B_PIN 1 +#define RTE_SAI1_SD_B_PORT GPIOE +#define RTE_SAI1_SD_B_BIT 3 +#elif (RTE_SAI1_SD_B_PORT_ID == 2) +#define RTE_SAI1_SD_B_PIN 1 +#define RTE_SAI1_SD_B_PORT GPIOF +#define RTE_SAI1_SD_B_BIT 6 +#else +#error "Invalid SAI1_SD_B Pin Configuration!" +#endif + +// SAI1_FS_B Pin <0=>Not Used <1=>PF9 +#define RTE_SAI1_FS_B_PORT_ID 0 +#if (RTE_SAI1_FS_B_PORT_ID == 0) +#define RTE_SAI1_FS_B_PIN 0 +#elif (RTE_SAI1_FS_B_PORT_ID == 1) +#define RTE_SAI1_FS_B_PIN 1 +#define RTE_SAI1_FS_B_PORT GPIOF +#define RTE_SAI1_FS_B_BIT 9 +#else +#error "Invalid SAI1_FS_B Pin Configuration!" +#endif + +// SAI1_SCK_B Pin <0=>Not Used <1=>PF8 +#define RTE_SAI1_SCK_B_PORT_ID 0 +#if (RTE_SAI1_SCK_B_PORT_ID == 0) +#define RTE_SAI1_SCK_B_PIN 0 +#elif (RTE_SAI1_SCK_B_PORT_ID == 1) +#define RTE_SAI1_SCK_B_PIN 1 +#define RTE_SAI1_SCK_B_PORT GPIOF +#define RTE_SAI1_SCK_B_BIT 8 +#else +#error "Invalid SAI1_SCK_B Pin Configuration!" +#endif + +// SAI1_MCLK_B Pin <0=>Not Used <1=>PF7 +#define RTE_SAI1_MCLK_B_PORT_ID 0 +#if (RTE_SAI1_MCLK_B_PORT_ID == 0) +#define RTE_SAI1_MCLK_B_PIN 0 +#elif (RTE_SAI1_MCLK_B_PORT_ID == 1) +#define RTE_SAI1_MCLK_B_PIN 1 +#define RTE_SAI1_MCLK_B_PORT GPIOF +#define RTE_SAI1_MCLK_B_BIT 7 +#else +#error "Invalid SAI1_MCLK_B Pin Configuration!" +#endif + +// DMA SAI1_A +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <1=>1 <3=>3 +// Selects DMA Stream (only Stream 1 or 3 can be used) +// Channel <0=>0 +// Selects DMA Channel (only Channel 0 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SAI1_A_DMA 0 +#define RTE_SAI1_A_DMA_NUMBER 2 +#define RTE_SAI1_A_DMA_STREAM 1 +#define RTE_SAI1_A_DMA_CHANNEL 0 +#define RTE_SAI1_A_DMA_PRIORITY 0 + +// DMA SAI1_B +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <4=>4 <5=>5 <7=>7 +// Selects DMA Stream (only Stream 4, 5 or 7 can be used) +// Channel <0=>0 <1=>1 +// Selects DMA Channel (only Channel 0 or 1 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SAI1_B_DMA 0 +#define RTE_SAI1_B_DMA_NUMBER 2 +#define RTE_SAI1_B_DMA_STREAM 5 +#define RTE_SAI1_B_DMA_CHANNEL 0 +#define RTE_SAI1_B_DMA_PRIORITY 0 + +// + +// SAI2 (Serial Audio Interface 2) [Driver_SAI2] +// Configuration settings for Driver_SAI2 in component ::CMSIS Driver:SAI +#define RTE_SAI2 1 + +// SAI2_SD_A Pin <0=>Not Used <1=>PD11 <2=>PI6 +#define RTE_SAI2_SD_A_PORT_ID 2 +#if (RTE_SAI2_SD_A_PORT_ID == 0) +#define RTE_SAI2_SD_A_PIN 0 +#elif (RTE_SAI2_SD_A_PORT_ID == 1) +#define RTE_SAI2_SD_A_PIN 1 +#define RTE_SAI2_SD_A_PORT GPIOD +#define RTE_SAI2_SD_A_BIT 11 +#elif (RTE_SAI2_SD_A_PORT_ID == 2) +#define RTE_SAI2_SD_A_PIN 1 +#define RTE_SAI2_SD_A_PORT GPIOI +#define RTE_SAI2_SD_A_BIT 6 +#else +#error "Invalid SAI2_SD_A Pin Configuration!" +#endif + +// SAI2_FS_A Pin <0=>Not Used <1=>PD12 <2=>PI7 +#define RTE_SAI2_FS_A_PORT_ID 2 +#if (RTE_SAI2_FS_A_PORT_ID == 0) +#define RTE_SAI2_FS_A_PIN 0 +#elif (RTE_SAI2_FS_A_PORT_ID == 1) +#define RTE_SAI2_FS_A_PIN 1 +#define RTE_SAI2_FS_A_PORT GPIOD +#define RTE_SAI2_FS_A_BIT 12 +#elif (RTE_SAI2_FS_A_PORT_ID == 2) +#define RTE_SAI2_FS_A_PIN 1 +#define RTE_SAI2_FS_A_PORT GPIOI +#define RTE_SAI2_FS_A_BIT 7 +#else +#error "Invalid SAI2_FS_A Pin Configuration!" +#endif + +// SAI2_SCK_A Pin <0=>Not Used <1=>PD13 <2=>PI5 +#define RTE_SAI2_SCK_A_PORT_ID 2 +#if (RTE_SAI2_SCK_A_PORT_ID == 0) +#define RTE_SAI2_SCK_A_PIN 0 +#elif (RTE_SAI2_SCK_A_PORT_ID == 1) +#define RTE_SAI2_SCK_A_PIN 1 +#define RTE_SAI2_SCK_A_PORT GPIOD +#define RTE_SAI2_SCK_A_BIT 13 +#elif (RTE_SAI2_SCK_A_PORT_ID == 2) +#define RTE_SAI2_SCK_A_PIN 1 +#define RTE_SAI2_SCK_A_PORT GPIOI +#define RTE_SAI2_SCK_A_BIT 5 +#else +#error "Invalid SAI2_SCK_A Pin Configuration!" +#endif + +// SAI2_MCLK_A Pin <0=>Not Used <1=>PE0 <2=>PI4 +#define RTE_SAI2_MCLK_A_PORT_ID 2 +#if (RTE_SAI2_MCLK_A_PORT_ID == 0) +#define RTE_SAI2_MCLK_A_PIN 0 +#elif (RTE_SAI2_MCLK_A_PORT_ID == 1) +#define RTE_SAI2_MCLK_A_PIN 1 +#define RTE_SAI2_MCLK_A_PORT GPIOE +#define RTE_SAI2_MCLK_A_BIT 0 +#elif (RTE_SAI2_MCLK_A_PORT_ID == 2) +#define RTE_SAI2_MCLK_A_PIN 1 +#define RTE_SAI2_MCLK_A_PORT GPIOI +#define RTE_SAI2_MCLK_A_BIT 4 +#else +#error "Invalid SAI2_MCLK_A Pin Configuration!" +#endif + +// SAI2_SD_B Pin <0=>Not Used <1=>PA0 <2=>PE11 <3=>PF11 <4=>PG10 +#define RTE_SAI2_SD_B_PORT_ID 4 +#if (RTE_SAI2_SD_B_PORT_ID == 0) +#define RTE_SAI2_SD_B_PIN 0 +#elif (RTE_SAI2_SD_B_PORT_ID == 1) +#define RTE_SAI2_SD_B_PIN 1 +#define RTE_SAI2_SD_B_PORT GPIOA +#define RTE_SAI2_SD_B_BIT 0 +#elif (RTE_SAI2_SD_B_PORT_ID == 2) +#define RTE_SAI2_SD_B_PIN 1 +#define RTE_SAI2_SD_B_PORT GPIOE +#define RTE_SAI2_SD_B_BIT 11 +#elif (RTE_SAI2_SD_B_PORT_ID == 3) +#define RTE_SAI2_SD_B_PIN 1 +#define RTE_SAI2_SD_B_PORT GPIOF +#define RTE_SAI2_SD_B_BIT 11 +#elif (RTE_SAI2_SD_B_PORT_ID == 4) +#define RTE_SAI2_SD_B_PIN 1 +#define RTE_SAI2_SD_B_PORT GPIOG +#define RTE_SAI2_SD_B_BIT 10 +#else +#error "Invalid SAI2_SD_B Pin Configuration!" +#endif + +// SAI2_FS_B Pin <0=>Not Used <1=>PA12 <2=>PC0 <3=>PE13 <4=>PG9 +#define RTE_SAI2_FS_B_PORT_ID 0 +#if (RTE_SAI2_FS_B_PORT_ID == 0) +#define RTE_SAI2_FS_B_PIN 0 +#elif (RTE_SAI2_FS_B_PORT_ID == 1) +#define RTE_SAI2_FS_B_PIN 1 +#define RTE_SAI2_FS_B_PORT GPIOA +#define RTE_SAI2_FS_B_BIT 12 +#elif (RTE_SAI2_FS_B_PORT_ID == 2) +#define RTE_SAI2_FS_B_PIN 1 +#define RTE_SAI2_FS_B_PORT GPIOC +#define RTE_SAI2_FS_B_BIT 0 +#elif (RTE_SAI2_FS_B_PORT_ID == 3) +#define RTE_SAI2_FS_B_PIN 1 +#define RTE_SAI2_FS_B_PORT GPIOE +#define RTE_SAI2_FS_B_BIT 13 +#elif (RTE_SAI2_FS_B_PORT_ID == 4) +#define RTE_SAI2_FS_B_PIN 1 +#define RTE_SAI2_FS_B_PORT GPIOG +#define RTE_SAI2_FS_B_BIT 9 +#else +#error "Invalid SAI2_FS_B Pin Configuration!" +#endif + +// SAI2_SCK_B Pin <0=>Not Used <1=>PA2 <2=>PE12 <3=>PH2 +#define RTE_SAI2_SCK_B_PORT_ID 0 +#if (RTE_SAI2_SCK_B_PORT_ID == 0) +#define RTE_SAI2_SCK_B_PIN 0 +#elif (RTE_SAI2_SCK_B_PORT_ID == 1) +#define RTE_SAI2_SCK_B_PIN 1 +#define RTE_SAI2_SCK_B_PORT GPIOA +#define RTE_SAI2_SCK_B_BIT 2 +#elif (RTE_SAI2_SCK_B_PORT_ID == 2) +#define RTE_SAI2_SCK_B_PIN 1 +#define RTE_SAI2_SCK_B_PORT GPIOE +#define RTE_SAI2_SCK_B_BIT 12 +#elif (RTE_SAI2_SCK_B_PORT_ID == 3) +#define RTE_SAI2_SCK_B_PIN 1 +#define RTE_SAI2_SCK_B_PORT GPIOH +#define RTE_SAI2_SCK_B_BIT 2 +#else +#error "Invalid SAI2_SCK_B Pin Configuration!" +#endif + +// SAI2_MCLK_B Pin <0=>Not Used <1=>PA1 <2=>PE6 <3=>PE14 <4=>PH3 +#define RTE_SAI2_MCLK_B_PORT_ID 0 +#if (RTE_SAI2_MCLK_B_PORT_ID == 0) +#define RTE_SAI2_MCLK_B_PIN 0 +#elif (RTE_SAI2_MCLK_B_PORT_ID == 1) +#define RTE_SAI2_MCLK_B_PIN 1 +#define RTE_SAI2_MCLK_B_PORT GPIOA +#define RTE_SAI2_MCLK_B_BIT 1 +#elif (RTE_SAI2_MCLK_B_PORT_ID == 2) +#define RTE_SAI2_MCLK_B_PIN 1 +#define RTE_SAI2_MCLK_B_PORT GPIOE +#define RTE_SAI2_MCLK_B_BIT 6 +#elif (RTE_SAI2_MCLK_B_PORT_ID == 3) +#define RTE_SAI2_MCLK_B_PIN 1 +#define RTE_SAI2_MCLK_B_PORT GPIOE +#define RTE_SAI2_MCLK_B_BIT 14 +#elif (RTE_SAI2_MCLK_B_PORT_ID == 4) +#define RTE_SAI2_MCLK_B_PIN 1 +#define RTE_SAI2_MCLK_B_PORT GPIOH +#define RTE_SAI2_MCLK_B_BIT 3 +#else +#error "Invalid SAI2_MCLK_B Pin Configuration!" +#endif + +// DMA SAI2_A +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <4=>4 +// Selects DMA Stream (only Stream 4 can be used) +// Channel <3=>3 +// Selects DMA Channel (only Channel 3 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SAI2_A_DMA 1 +#define RTE_SAI2_A_DMA_NUMBER 2 +#define RTE_SAI2_A_DMA_STREAM 4 +#define RTE_SAI2_A_DMA_CHANNEL 3 +#define RTE_SAI2_A_DMA_PRIORITY 0 + +// DMA SAI2_B +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <6=>6 <7=>7 +// Selects DMA Stream (only Stream 6 or 7 can be used) +// Channel <0=>0 <3=>3 +// Selects DMA Channel (only Channel 0 or 3 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SAI2_B_DMA 1 +#define RTE_SAI2_B_DMA_NUMBER 2 +#define RTE_SAI2_B_DMA_STREAM 7 +#define RTE_SAI2_B_DMA_CHANNEL 0 +#define RTE_SAI2_B_DMA_PRIORITY 0 + +// + + +// SDMMC1 (SD/SDIO/MMC card host interface 1) [Driver_MCI0] +// Configuration settings for Driver_MCI0 in component ::CMSIS Driver:MCI +#define RTE_SDMMC1 0 + +// SDMMC Peripheral Bus +// SDMMC1_CK Pin <0=>PC12 +#define RTE_SDMMC1_CK_PORT_ID 0 +#if (RTE_SDMMC1_CK_PORT_ID == 0) + #define RTE_SDMMC1_CK_PORT GPIOC + #define RTE_SDMMC1_CK_PIN GPIO_PIN_12 +#else + #error "Invalid SDMMC1_CLK Pin Configuration!" +#endif +// SDMMC1_CMD Pin <0=>PD2 +#define RTE_SDMMC1_CMD_PORT_ID 0 +#if (RTE_SDMMC1_CMD_PORT_ID == 0) + #define RTE_SDMMC1_CMD_PORT GPIOD + #define RTE_SDMMC1_CMD_PIN GPIO_PIN_2 +#else + #error "Invalid SDMMC1_CMD Pin Configuration!" +#endif +// SDMMC1_D0 Pin <0=>PC8 +#define RTE_SDMMC1_D0_PORT_ID 0 +#if (RTE_SDMMC1_D0_PORT_ID == 0) + #define RTE_SDMMC1_D0_PORT GPIOC + #define RTE_SDMMC1_D0_PIN GPIO_PIN_8 +#else + #error "Invalid SDMMC1_D0 Pin Configuration!" +#endif +// SDMMC1_D[1 .. 3] +#define RTE_SDMMC1_BUS_WIDTH_4 1 +// SDMMC1_D1 Pin <0=>PC9 +#define RTE_SDMMC1_D1_PORT_ID 0 +#if (RTE_SDMMC1_D1_PORT_ID == 0) + #define RTE_SDMMC1_D1_PORT GPIOC + #define RTE_SDMMC1_D1_PIN GPIO_PIN_9 +#else + #error "Invalid SDMMC1_D1 Pin Configuration!" +#endif +// SDMMC1_D2 Pin <0=>PC10 +#define RTE_SDMMC1_D2_PORT_ID 0 +#if (RTE_SDMMC1_D2_PORT_ID == 0) + #define RTE_SDMMC1_D2_PORT GPIOC + #define RTE_SDMMC1_D2_PIN GPIO_PIN_10 +#else + #error "Invalid SDMMC1_D2 Pin Configuration!" +#endif +// SDMMC1_D3 Pin <0=>PC11 +#define RTE_SDMMC1_D3_PORT_ID 0 +#if (RTE_SDMMC1_D3_PORT_ID == 0) + #define RTE_SDMMC1_D3_PORT GPIOC + #define RTE_SDMMC1_D3_PIN GPIO_PIN_11 +#else + #error "Invalid SDMMC1_D3 Pin Configuration!" +#endif +// SDMMC1_D[1 .. 3] +// SDMMC1_D[4 .. 7] +#define RTE_SDMMC1_BUS_WIDTH_8 0 +// SDMMC1_D4 Pin <0=>PB8 +#define RTE_SDMMC1_D4_PORT_ID 0 +#if (RTE_SDMMC1_D4_PORT_ID == 0) + #define RTE_SDMMC1_D4_PORT GPIOB + #define RTE_SDMMC1_D4_PIN GPIO_PIN_8 +#else + #error "Invalid SDMMC1_D4 Pin Configuration!" +#endif +// SDMMC1_D5 Pin <0=>PB9 +#define RTE_SDMMC1_D5_PORT_ID 0 +#if (RTE_SDMMC1_D5_PORT_ID == 0) + #define RTE_SDMMC1_D5_PORT GPIOB + #define RTE_SDMMC1_D5_PIN GPIO_PIN_9 +#else + #error "Invalid SDMMC1_D5 Pin Configuration!" +#endif +// SDMMC1_D6 Pin <0=>PC6 +#define RTE_SDMMC1_D6_PORT_ID 0 +#if (RTE_SDMMC1_D6_PORT_ID == 0) + #define RTE_SDMMC1_D6_PORT GPIOC + #define RTE_SDMMC1_D6_PIN GPIO_PIN_6 +#else + #error "Invalid SDMMC1_D6 Pin Configuration!" +#endif +// SDMMC1_D7 Pin <0=>PC7 +#define RTE_SDMMC1_D7_PORT_ID 0 +#if (RTE_SDMMC1_D7_PORT_ID == 0) + #define RTE_SDMMC1_D7_PORT GPIOC + #define RTE_SDMMC1_D7_PIN GPIO_PIN_7 +#else + #error "Invalid SDMMC1_D7 Pin Configuration!" +#endif +// SDMMC1_D[4 .. 7] +// SDMMC Peripheral Bus + +// Card Detect Pin +// Configure Pin if exists +// GPIO Pxy (x = A..H, y = 0..15) or (x = I, y = 0..11) +// Active State <0=>Low <1=>High +// Selects Active State Logical Level +// Port <0=>GPIOA <1=>GPIOB <2=>GPIOC <3=>GPIOD +// <4=>GPIOE <5=>GPIOF <6=>GPIOG <7=>GPIOH <8=>GPIOI +// Selects Port Name +// Bit <0-15> +// Selects Port Bit +// Pull Resistor <0=>Inactive <1=>Pull-up <2=>Pull-down +// Select Pin Pull Resistor function +// +#define RTE_SDMMC1_CD_PIN_EN 0 +#define RTE_SDMMC1_CD_ACTIVE 0 +#define RTE_SDMMC1_CD_PORT GPIO_PORT(0) +#define RTE_SDMMC1_CD_PIN 0 +#define RTE_SDMMC1_CD_PULL 1 + +// Write Protect Pin +// Configure Pin if exists +// GPIO Pxy (x = A..H, y = 0..15) or (x = I, y = 0..11) +// Active State <0=>Low <1=>High +// Selects Active State Logical Level +// Port <0=>GPIOA <1=>GPIOB <2=>GPIOC <3=>GPIOD +// <4=>GPIOE <5=>GPIOF <6=>GPIOG <7=>GPIOH <8=>GPIOI +// Selects Port Name +// Bit <0-15> +// Selects Port Bit +// Pull Resistor <0=>Inactive <1=>Pull-up <2=>Pull-down +// Select Pin Pull Resistor function +// +#define RTE_SDMMC1_WP_EN 0 +#define RTE_SDMMC1_WP_ACTIVE 0 +#define RTE_SDMMC1_WP_PORT GPIO_PORT(0) +#define RTE_SDMMC1_WP_PIN 0 +#define RTE_SDMMC1_WP_PULL 1 + +// DMA Rx +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <3=>3 <6=>6 +// Selects DMA Stream (only Stream 3 or 6 can be used) +// Channel <4=>4 +// Selects DMA Channel (only Channel 4 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SDMMC1_RX_DMA 1 +#define RTE_SDMMC1_RX_DMA_NUMBER 2 +#define RTE_SDMMC1_RX_DMA_STREAM 3 +#define RTE_SDMMC1_RX_DMA_CHANNEL 4 +#define RTE_SDMMC1_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <3=>3 <6=>6 +// Selects DMA Stream (only Stream 3 or 6 can be used) +// Channel <4=>4 +// Selects DMA Channel (only Channel 4 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SDMMC1_TX_DMA 1 +#define RTE_SDMMC1_TX_DMA_NUMBER 2 +#define RTE_SDMMC1_TX_DMA_STREAM 6 +#define RTE_SDMMC1_TX_DMA_CHANNEL 4 +#define RTE_SDMMC1_TX_DMA_PRIORITY 0 + +// + + +// SDMMC2 (SD/SDIO/MMC card host interface 2) [Driver_MCI1] +// Configuration settings for Driver_MCI1 in component ::CMSIS Driver:MCI +#define RTE_SDMMC2 0 + +// SDMMC Peripheral Bus +// SDMMC2_CK Pin <0=>PD6 +#define RTE_SDMMC2_CK_PORT_ID 0 +#if (RTE_SDMMC2_CK_PORT_ID == 0) + #define RTE_SDMMC2_CK_PORT GPIOD + #define RTE_SDMMC2_CK_PIN GPIO_PIN_6 + #define RTE_SDMMC2_CK_AF GPIO_AF11_SDMMC2 +#else + #error "Invalid SDMMC2_CLK Pin Configuration!" +#endif +// SDMMC2_CMD Pin <0=>PD7 +#define RTE_SDMMC2_CMD_PORT_ID 0 +#if (RTE_SDMMC2_CMD_PORT_ID == 0) + #define RTE_SDMMC2_CMD_PORT GPIOD + #define RTE_SDMMC2_CMD_PIN GPIO_PIN_7 + #define RTE_SDMMC2_CMD_AF GPIO_AF11_SDMMC2 +#else + #error "Invalid SDMMC2_CMD Pin Configuration!" +#endif +// SDMMC2_D0 Pin <0=>PB14 <1=>PG9 +#define RTE_SDMMC2_D0_PORT_ID 0 +#if (RTE_SDMMC2_D0_PORT_ID == 0) + #define RTE_SDMMC2_D0_PORT GPIOB + #define RTE_SDMMC2_D0_PIN GPIO_PIN_14 + #define RTE_SDMMC2_D0_AF GPIO_AF10_SDMMC2 +#elif (RTE_SDMMC2_D0_PORT_ID == 1) + #define RTE_SDMMC2_D0_PORT GPIOG + #define RTE_SDMMC2_D0_PIN GPIO_PIN_9 + #define RTE_SDMMC2_D0_AF GPIO_AF11_SDMMC2 +#else + #error "Invalid SDMMC2_D0 Pin Configuration!" +#endif +// SDMMC2_D[1 .. 3] +#define RTE_SDMMC2_BUS_WIDTH_4 1 +// SDMMC2_D1 Pin <0=>PB15 <1=>PG10 +#define RTE_SDMMC2_D1_PORT_ID 0 +#if (RTE_SDMMC2_D1_PORT_ID == 0) + #define RTE_SDMMC2_D1_PORT GPIOB + #define RTE_SDMMC2_D1_PIN GPIO_PIN_15 + #define RTE_SDMMC2_D1_AF GPIO_AF10_SDMMC2 +#elif (RTE_SDMMC2_D1_PORT_ID == 1) + #define RTE_SDMMC2_D1_PORT GPIOG + #define RTE_SDMMC2_D1_PIN GPIO_PIN_10 + #define RTE_SDMMC2_D1_AF GPIO_AF11_SDMMC2 +#else + #error "Invalid SDMMC2_D1 Pin Configuration!" +#endif +// SDMMC2_D2 Pin <0=>PB3 <1=>PG11 +#define RTE_SDMMC2_D2_PORT_ID 0 +#if (RTE_SDMMC2_D2_PORT_ID == 0) + #define RTE_SDMMC2_D2_PORT GPIOB + #define RTE_SDMMC2_D2_PIN GPIO_PIN_3 + #define RTE_SDMMC2_D2_AF GPIO_AF10_SDMMC2 +#elif (RTE_SDMMC2_D2_PORT_ID == 1) + #define RTE_SDMMC2_D2_PORT GPIOG + #define RTE_SDMMC2_D2_PIN GPIO_PIN_11 + #define RTE_SDMMC2_D2_AF GPIO_AF10_SDMMC2 +#else + #error "Invalid SDMMC2_D2 Pin Configuration!" +#endif +// SDMMC2_D3 Pin <0=>PB4 <1=>PG12 +#define RTE_SDMMC2_D3_PORT_ID 0 +#if (RTE_SDMMC2_D3_PORT_ID == 0) + #define RTE_SDMMC2_D3_PORT GPIOB + #define RTE_SDMMC2_D3_PIN GPIO_PIN_4 + #define RTE_SDMMC2_D3_AF GPIO_AF10_SDMMC2 +#elif (RTE_SDMMC2_D3_PORT_ID == 1) + #define RTE_SDMMC2_D3_PORT GPIOG + #define RTE_SDMMC2_D3_PIN GPIO_PIN_12 + #define RTE_SDMMC2_D3_AF GPIO_AF11_SDMMC2 +#else + #error "Invalid SDMMC2_D3 Pin Configuration!" +#endif +// SDMMC2_D[1 .. 3] +// SDMMC2_D[4 .. 7] +#define RTE_SDMMC2_BUS_WIDTH_8 0 +// SDMMC2_D4 Pin <0=>PB8 +#define RTE_SDMMC2_D4_PORT_ID 0 +#if (RTE_SDMMC2_D4_PORT_ID == 0) + #define RTE_SDMMC2_D4_PORT GPIOB + #define RTE_SDMMC2_D4_PIN GPIO_PIN_8 + #define RTE_SDMMC2_D4_AF GPIO_AF10_SDMMC2 +#else + #error "Invalid SDMMC2_D4 Pin Configuration!" +#endif +// SDMMC2_D5 Pin <0=>PB9 +#define RTE_SDMMC2_D5_PORT_ID 0 +#if (RTE_SDMMC2_D5_PORT_ID == 0) + #define RTE_SDMMC2_D5_PORT GPIOB + #define RTE_SDMMC2_D5_PIN GPIO_PIN_9 + #define RTE_SDMMC2_D5_AF GPIO_AF10_SDMMC2 +#else + #error "Invalid SDMMC2_D5 Pin Configuration!" +#endif +// SDMMC2_D6 Pin <0=>PC6 +#define RTE_SDMMC2_D6_PORT_ID 0 +#if (RTE_SDMMC2_D6_PORT_ID == 0) + #define RTE_SDMMC2_D6_PORT GPIOC + #define RTE_SDMMC2_D6_PIN GPIO_PIN_6 + #define RTE_SDMMC2_D6_AF GPIO_AF10_SDMMC2 +#else + #error "Invalid SDMMC2_D6 Pin Configuration!" +#endif +// SDMMC2_D7 Pin <0=>PC7 +#define RTE_SDMMC2_D7_PORT_ID 0 +#if (RTE_SDMMC2_D7_PORT_ID == 0) + #define RTE_SDMMC2_D7_PORT GPIOC + #define RTE_SDMMC2_D7_PIN GPIO_PIN_7 + #define RTE_SDMMC2_D7_AF GPIO_AF10_SDMMC2 +#else + #error "Invalid SDMMC2_D7 Pin Configuration!" +#endif +// SDMMC2_D[4 .. 7] +// SDMMC Peripheral Bus + +// Card Detect Pin +// Configure Pin if exists +// GPIO Pxy (x = A..H, y = 0..15) or (x = I, y = 0..11) +// Active State <0=>Low <1=>High +// Selects Active State Logical Level +// Port <0=>GPIOA <1=>GPIOB <2=>GPIOC <3=>GPIOD +// <4=>GPIOE <5=>GPIOF <6=>GPIOG <7=>GPIOH <8=>GPIOI +// Selects Port Name +// Bit <0-15> +// Selects Port Bit +// Pull Resistor <0=>Inactive <1=>Pull-up <2=>Pull-down +// Select Pin Pull Resistor function +// +#define RTE_SDMMC2_CD_PIN_EN 1 +#define RTE_SDMMC2_CD_ACTIVE 0 +#define RTE_SDMMC2_CD_PORT GPIO_PORT(2) +#define RTE_SDMMC2_CD_PIN 12 +#define RTE_SDMMC2_CD_PULL 1 + +// Write Protect Pin +// Configure Pin if exists +// GPIO Pxy (x = A..H, y = 0..15) or (x = I, y = 0..11) +// Active State <0=>Low <1=>High +// Selects Active State Logical Level +// Port <0=>GPIOA <1=>GPIOB <2=>GPIOC <3=>GPIOD +// <4=>GPIOE <5=>GPIOF <6=>GPIOG <7=>GPIOH <8=>GPIOI +// Selects Port Name +// Bit <0-15> +// Selects Port Bit +// Pull Resistor <0=>Inactive <1=>Pull-up <2=>Pull-down +// Select Pin Pull Resistor function +// +#define RTE_SDMMC2_WP_EN 0 +#define RTE_SDMMC2_WP_ACTIVE 0 +#define RTE_SDMMC2_WP_PORT GPIO_PORT(0) +#define RTE_SDMMC2_WP_PIN 0 +#define RTE_SDMMC2_WP_PULL 1 + +// DMA Rx +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <0=>0 <5=>5 +// Selects DMA Stream (only Stream 0 or 5 can be used) +// Channel <11=>11 +// Selects DMA Channel (only Channel 11 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SDMMC2_RX_DMA 1 +#define RTE_SDMMC2_RX_DMA_NUMBER 2 +#define RTE_SDMMC2_RX_DMA_STREAM 0 +#define RTE_SDMMC2_RX_DMA_CHANNEL 11 +#define RTE_SDMMC2_RX_DMA_PRIORITY 0 + +// DMA Tx +// Number <2=>2 +// Selects DMA Number (only DMA2 can be used) +// Stream <0=>0 <5=>5 +// Selects DMA Stream (only Stream 0 or 5 can be used) +// Channel <11=>11 +// Selects DMA Channel (only Channel 11 can be used) +// Priority <0=>Low <1=>Medium <2=>High <3=>Very High +// Selects DMA Priority +// +#define RTE_SDMMC2_TX_DMA 1 +#define RTE_SDMMC2_TX_DMA_NUMBER 2 +#define RTE_SDMMC2_TX_DMA_STREAM 5 +#define RTE_SDMMC2_TX_DMA_CHANNEL 11 +#define RTE_SDMMC2_TX_DMA_PRIORITY 0 + +// + + +// CAN1 (Controller Area Network 1) [Driver_CAN1] +// Configuration settings for Driver_CAN1 in component ::CMSIS Driver:CAN +#define RTE_CAN1 0 + +// CAN1_RX Pin <0=>PA11 <1=>PB8 <2=>PD0 <3=>PI9 <4=>PH14 +#define RTE_CAN1_RX_PORT_ID 0 +#if (RTE_CAN1_RX_PORT_ID == 0) +#define RTE_CAN1_RX_PORT GPIOA +#define RTE_CAN1_RX_BIT GPIO_PIN_11 +#elif (RTE_CAN1_RX_PORT_ID == 1) +#define RTE_CAN1_RX_PORT GPIOB +#define RTE_CAN1_RX_BIT GPIO_PIN_8 +#elif (RTE_CAN1_RX_PORT_ID == 2) +#define RTE_CAN1_RX_PORT GPIOD +#define RTE_CAN1_RX_BIT GPIO_PIN_0 +#elif (RTE_CAN1_RX_PORT_ID == 3) +#define RTE_CAN1_RX_PORT GPIOI +#define RTE_CAN1_RX_BIT GPIO_PIN_9 +#elif (RTE_CAN1_RX_PORT_ID == 4) +#define RTE_CAN1_RX_PORT GPIOH +#define RTE_CAN1_RX_BIT GPIO_PIN_14 +#else +#error "Invalid CAN1_RX Pin Configuration!" +#endif + +// CAN1_TX Pin <0=>PA12 <1=>PB9 <2=>PD1 <3=>PH13 +#define RTE_CAN1_TX_PORT_ID 0 +#if (RTE_CAN1_TX_PORT_ID == 0) +#define RTE_CAN1_TX_PORT GPIOA +#define RTE_CAN1_TX_BIT GPIO_PIN_12 +#elif (RTE_CAN1_TX_PORT_ID == 1) +#define RTE_CAN1_TX_PORT GPIOB +#define RTE_CAN1_TX_BIT GPIO_PIN_9 +#elif (RTE_CAN1_TX_PORT_ID == 2) +#define RTE_CAN1_TX_PORT GPIOD +#define RTE_CAN1_TX_BIT GPIO_PIN_1 +#elif (RTE_CAN1_TX_PORT_ID == 3) +#define RTE_CAN1_TX_PORT GPIOH +#define RTE_CAN1_TX_BIT GPIO_PIN_13 +#else +#error "Invalid CAN1_TX Pin Configuration!" +#endif + +// + + +// CAN2 (Controller Area Network 2) [Driver_CAN2] +// Configuration settings for Driver_CAN2 in component ::CMSIS Driver:CAN +#define RTE_CAN2 0 + +// CAN2_RX Pin <0=>PB5 <1=>PB12 +#define RTE_CAN2_RX_PORT_ID 0 +#if (RTE_CAN2_RX_PORT_ID == 0) +#define RTE_CAN2_RX_PORT GPIOB +#define RTE_CAN2_RX_BIT GPIO_PIN_5 +#elif (RTE_CAN2_RX_PORT_ID == 1) +#define RTE_CAN2_RX_PORT GPIOB +#define RTE_CAN2_RX_BIT GPIO_PIN_12 +#else +#error "Invalid CAN2_RX Pin Configuration!" +#endif + +// CAN2_TX Pin <0=>PB6 <1=>PB13 +#define RTE_CAN2_TX_PORT_ID 0 +#if (RTE_CAN2_TX_PORT_ID == 0) +#define RTE_CAN2_TX_PORT GPIOB +#define RTE_CAN2_TX_BIT GPIO_PIN_6 +#elif (RTE_CAN2_TX_PORT_ID == 1) +#define RTE_CAN2_TX_PORT GPIOB +#define RTE_CAN2_TX_BIT GPIO_PIN_13 +#else +#error "Invalid CAN2_TX Pin Configuration!" +#endif + +// + + +// CAN3 (Controller Area Network 3) [Driver_CAN3] +// Configuration settings for Driver_CAN3 in component ::CMSIS Driver:CAN +// Available only on STM32F76x and STM32F77x device series +#define RTE_CAN3 0 + +// CAN3_RX Pin <0=>PA8 <1=>PB3 +#define RTE_CAN3_RX_PORT_ID 0 +#if (RTE_CAN3_RX_PORT_ID == 0) +#define RTE_CAN3_RX_PORT GPIOA +#define RTE_CAN3_RX_BIT GPIO_PIN_8 +#elif (RTE_CAN3_RX_PORT_ID == 1) +#define RTE_CAN3_RX_PORT GPIOB +#define RTE_CAN3_RX_BIT GPIO_PIN_3 +#else +#error "Invalid CAN3_RX Pin Configuration!" +#endif + +// CAN3_TX Pin <0=>PA15 <1=>PB4 +#define RTE_CAN3_TX_PORT_ID 0 +#if (RTE_CAN3_TX_PORT_ID == 0) +#define RTE_CAN3_TX_PORT GPIOA +#define RTE_CAN3_TX_BIT GPIO_PIN_15 +#elif (RTE_CAN3_TX_PORT_ID == 1) +#define RTE_CAN3_TX_PORT GPIOB +#define RTE_CAN3_TX_BIT GPIO_PIN_4 +#else +#error "Invalid CAN3_TX Pin Configuration!" +#endif + +// + + +// ETH (Ethernet Interface) [Driver_ETH_MAC0] +// Configuration settings for Driver_ETH_MAC0 in component ::CMSIS Driver:Ethernet MAC +#define RTE_ETH 0 + +// MII (Media Independent Interface) +#define RTE_ETH_MII 1 + +// ETH_MII_TX_CLK Pin <0=>PC3 +#define RTE_ETH_MII_TX_CLK_PORT_ID 0 +#if (RTE_ETH_MII_TX_CLK_PORT_ID == 0) +#define RTE_ETH_MII_TX_CLK_PORT GPIOC +#define RTE_ETH_MII_TX_CLK_PIN 3 +#else +#error "Invalid ETH_MII_TX_CLK Pin Configuration!" +#endif +// ETH_MII_TXD0 Pin <0=>PB12 <1=>PG13 +#define RTE_ETH_MII_TXD0_PORT_ID 0 +#if (RTE_ETH_MII_TXD0_PORT_ID == 0) +#define RTE_ETH_MII_TXD0_PORT GPIOB +#define RTE_ETH_MII_TXD0_PIN 12 +#elif (RTE_ETH_MII_TXD0_PORT_ID == 1) +#define RTE_ETH_MII_TXD0_PORT GPIOG +#define RTE_ETH_MII_TXD0_PIN 13 +#else +#error "Invalid ETH_MII_TXD0 Pin Configuration!" +#endif +// ETH_MII_TXD1 Pin <0=>PB13 <1=>PG14 +#define RTE_ETH_MII_TXD1_PORT_ID 0 +#if (RTE_ETH_MII_TXD1_PORT_ID == 0) +#define RTE_ETH_MII_TXD1_PORT GPIOB +#define RTE_ETH_MII_TXD1_PIN 13 +#elif (RTE_ETH_MII_TXD1_PORT_ID == 1) +#define RTE_ETH_MII_TXD1_PORT GPIOG +#define RTE_ETH_MII_TXD1_PIN 14 +#else +#error "Invalid ETH_MII_TXD1 Pin Configuration!" +#endif +// ETH_MII_TXD2 Pin <0=>PC2 +#define RTE_ETH_MII_TXD2_PORT_ID 0 +#if (RTE_ETH_MII_TXD2_PORT_ID == 0) +#define RTE_ETH_MII_TXD2_PORT GPIOC +#define RTE_ETH_MII_TXD2_PIN 2 +#else +#error "Invalid ETH_MII_TXD2 Pin Configuration!" +#endif +// ETH_MII_TXD3 Pin <0=>PB8 <1=>PE2 +#define RTE_ETH_MII_TXD3_PORT_ID 0 +#if (RTE_ETH_MII_TXD3_PORT_ID == 0) +#define RTE_ETH_MII_TXD3_PORT GPIOB +#define RTE_ETH_MII_TXD3_PIN 8 +#elif (RTE_ETH_MII_TXD3_PORT_ID == 1) +#define RTE_ETH_MII_TXD3_PORT GPIOE +#define RTE_ETH_MII_TXD3_PIN 2 +#else +#error "Invalid ETH_MII_TXD3 Pin Configuration!" +#endif +// ETH_MII_TX_EN Pin <0=>PB11 <1=>PG11 +#define RTE_ETH_MII_TX_EN_PORT_ID 0 +#if (RTE_ETH_MII_TX_EN_PORT_ID == 0) +#define RTE_ETH_MII_TX_EN_PORT GPIOB +#define RTE_ETH_MII_TX_EN_PIN 11 +#elif (RTE_ETH_MII_TX_EN_PORT_ID == 1) +#define RTE_ETH_MII_TX_EN_PORT GPIOG +#define RTE_ETH_MII_TX_EN_PIN 11 +#else +#error "Invalid ETH_MII_TX_EN Pin Configuration!" +#endif +// ETH_MII_RX_CLK Pin <0=>PA1 +#define RTE_ETH_MII_RX_CLK_PORT_ID 0 +#if (RTE_ETH_MII_RX_CLK_PORT_ID == 0) +#define RTE_ETH_MII_RX_CLK_PORT GPIOA +#define RTE_ETH_MII_RX_CLK_PIN 1 +#else +#error "Invalid ETH_MII_RX_CLK Pin Configuration!" +#endif +// ETH_MII_RXD0 Pin <0=>PC4 +#define RTE_ETH_MII_RXD0_PORT_ID 0 +#if (RTE_ETH_MII_RXD0_PORT_ID == 0) +#define RTE_ETH_MII_RXD0_PORT GPIOC +#define RTE_ETH_MII_RXD0_PIN 4 +#else +#error "Invalid ETH_MII_RXD0 Pin Configuration!" +#endif +// ETH_MII_RXD1 Pin <0=>PC5 +#define RTE_ETH_MII_RXD1_PORT_ID 0 +#if (RTE_ETH_MII_RXD1_PORT_ID == 0) +#define RTE_ETH_MII_RXD1_PORT GPIOC +#define RTE_ETH_MII_RXD1_PIN 5 +#else +#error "Invalid ETH_MII_RXD1 Pin Configuration!" +#endif +// ETH_MII_RXD2 Pin <0=>PB0 <1=>PH6 +#define RTE_ETH_MII_RXD2_PORT_ID 0 +#if (RTE_ETH_MII_RXD2_PORT_ID == 0) +#define RTE_ETH_MII_RXD2_PORT GPIOB +#define RTE_ETH_MII_RXD2_PIN 0 +#elif (RTE_ETH_MII_RXD2_PORT_ID == 1) +#define RTE_ETH_MII_RXD2_PORT GPIOH +#define RTE_ETH_MII_RXD2_PIN 6 +#else +#error "Invalid ETH_MII_RXD2 Pin Configuration!" +#endif +// ETH_MII_RXD3 Pin <0=>PB1 <1=>PH7 +#define RTE_ETH_MII_RXD3_PORT_ID 0 +#if (RTE_ETH_MII_RXD3_PORT_ID == 0) +#define RTE_ETH_MII_RXD3_PORT GPIOB +#define RTE_ETH_MII_RXD3_PIN 1 +#elif (RTE_ETH_MII_RXD3_PORT_ID == 1) +#define RTE_ETH_MII_RXD3_PORT GPIOH +#define RTE_ETH_MII_RXD3_PIN 7 +#else +#error "Invalid ETH_MII_RXD3 Pin Configuration!" +#endif +// ETH_MII_RX_DV Pin <0=>PA7 +#define RTE_ETH_MII_RX_DV_PORT_ID 0 +#if (RTE_ETH_MII_RX_DV_PORT_ID == 0) +#define RTE_ETH_MII_RX_DV_PORT GPIOA +#define RTE_ETH_MII_RX_DV_PIN 7 +#else +#error "Invalid ETH_MII_RX_DV Pin Configuration!" +#endif +// ETH_MII_RX_ER Pin <0=>Not Used <1=>PB10 <2=>PI10 +#define RTE_ETH_MII_RX_ER_PORT_ID 0 +#if (RTE_ETH_MII_RX_ER_PORT_ID == 0) +#define RTE_ETH_MII_RX_ER_PORT NULL +#elif (RTE_ETH_MII_RX_ER_PORT_ID == 1) +#define RTE_ETH_MII_RX_ER_PORT GPIOB +#define RTE_ETH_MII_RX_ER_PIN 10 +#elif (RTE_ETH_MII_RX_ER_PORT_ID == 2) +#define RTE_ETH_MII_RX_ER_PORT GPIOI +#define RTE_ETH_MII_RX_ER_PIN 10 +#else +#error "Invalid ETH_MII_RX_ER Pin Configuration!" +#endif +// ETH_MII_CRS Pin <0=>Not Used <1=>PA0 <2=>PH2 +#define RTE_ETH_MII_CRS_PORT_ID 0 +#if (RTE_ETH_MII_CRS_PORT_ID == 0) +#define RTE_ETH_MII_CRS_PORT NULL +#elif (RTE_ETH_MII_CRS_PORT_ID == 1) +#define RTE_ETH_MII_CRS_PORT GPIOA +#define RTE_ETH_MII_CRS_PIN 0 +#elif (RTE_ETH_MII_CRS_PORT_ID == 2) +#define RTE_ETH_MII_CRS_PORT GPIOH +#define RTE_ETH_MII_CRS_PIN 2 +#else +#error "Invalid ETH_MII_CRS Pin Configuration!" +#endif +// ETH_MII_COL Pin <0=>Not Used <1=>PA3 <2=>PH3 +#define RTE_ETH_MII_COL_PORT_ID 0 +#if (RTE_ETH_MII_COL_PORT_ID == 0) +#define RTE_ETH_MII_COL_PORT NULL +#elif (RTE_ETH_MII_COL_PORT_ID == 1) +#define RTE_ETH_MII_COL_PORT GPIOA +#define RTE_ETH_MII_COL_PIN 3 +#elif (RTE_ETH_MII_COL_PORT_ID == 2) +#define RTE_ETH_MII_COL_PORT GPIOH +#define RTE_ETH_MII_COL_PIN 3 +#else +#error "Invalid ETH_MII_COL Pin Configuration!" +#endif + +// + +// RMII (Reduced Media Independent Interface) +#define RTE_ETH_RMII 0 + +// ETH_RMII_TXD0 Pin <0=>PB12 <1=>PG13 +#define RTE_ETH_RMII_TXD0_PORT_ID 0 +#if (RTE_ETH_RMII_TXD0_PORT_ID == 0) +#define RTE_ETH_RMII_TXD0_PORT GPIOB +#define RTE_ETH_RMII_TXD0_PIN 12 +#elif (RTE_ETH_RMII_TXD0_PORT_ID == 1) +#define RTE_ETH_RMII_TXD0_PORT GPIOG +#define RTE_ETH_RMII_TXD0_PIN 13 +#else +#error "Invalid ETH_RMII_TXD0 Pin Configuration!" +#endif +// ETH_RMII_TXD1 Pin <0=>PB13 <1=>PG14 +#define RTE_ETH_RMII_TXD1_PORT_ID 0 +#if (RTE_ETH_RMII_TXD1_PORT_ID == 0) +#define RTE_ETH_RMII_TXD1_PORT GPIOB +#define RTE_ETH_RMII_TXD1_PIN 13 +#elif (RTE_ETH_RMII_TXD1_PORT_ID == 1) +#define RTE_ETH_RMII_TXD1_PORT GPIOG +#define RTE_ETH_RMII_TXD1_PIN 14 +#else +#error "Invalid ETH_RMII_TXD1 Pin Configuration!" +#endif +// ETH_RMII_TX_EN Pin <0=>PB11 <1=>PG11 +#define RTE_ETH_RMII_TX_EN_PORT_ID 0 +#if (RTE_ETH_RMII_TX_EN_PORT_ID == 0) +#define RTE_ETH_RMII_TX_EN_PORT GPIOB +#define RTE_ETH_RMII_TX_EN_PIN 11 +#elif (RTE_ETH_RMII_TX_EN_PORT_ID == 1) +#define RTE_ETH_RMII_TX_EN_PORT GPIOG +#define RTE_ETH_RMII_TX_EN_PIN 11 +#else +#error "Invalid ETH_RMII_TX_EN Pin Configuration!" +#endif +// ETH_RMII_RXD0 Pin <0=>PC4 +#define RTE_ETH_RMII_RXD0_PORT_ID 0 +#if (RTE_ETH_RMII_RXD0_PORT_ID == 0) +#define RTE_ETH_RMII_RXD0_PORT GPIOC +#define RTE_ETH_RMII_RXD0_PIN 4 +#else +#error "Invalid ETH_RMII_RXD0 Pin Configuration!" +#endif +// ETH_RMII_RXD1 Pin <0=>PC5 +#define RTE_ETH_RMII_RXD1_PORT_ID 0 +#if (RTE_ETH_RMII_RXD1_PORT_ID == 0) +#define RTE_ETH_RMII_RXD1_PORT GPIOC +#define RTE_ETH_RMII_RXD1_PIN 5 +#else +#error "Invalid ETH_RMII_RXD1 Pin Configuration!" +#endif +// ETH_RMII_REF_CLK Pin <0=>PA1 +#define RTE_ETH_RMII_REF_CLK_PORT_ID 0 +#if (RTE_ETH_RMII_REF_CLK_PORT_ID == 0) +#define RTE_ETH_RMII_REF_CLK_PORT GPIOA +#define RTE_ETH_RMII_REF_CLK_PIN 1 +#else +#error "Invalid ETH_RMII_REF_CLK Pin Configuration!" +#endif +// ETH_RMII_CRS_DV Pin <0=>PA7 +#define RTE_ETH_RMII_CRS_DV_PORT_ID 0 +#if (RTE_ETH_RMII_CRS_DV_PORT_ID == 0) +#define RTE_ETH_RMII_CRS_DV_PORT GPIOA +#define RTE_ETH_RMII_CRS_DV_PIN 7 +#else +#error "Invalid ETH_RMII_CRS_DV Pin Configuration!" +#endif + +// + +// SMI (Station Management Interface) +// Hardware controlled +// Enable peripheral controlled SMI on dedicated pins +#define RTE_ETH_SMI_HW 1 +// ETH_MDC Pin <0=>PC1 +#define RTE_ETH_SMI_MDC_PORT_ID 0 +#if (RTE_ETH_SMI_MDC_PORT_ID == 0) +#define RTE_ETH_SMI_MDC_PORT GPIOC +#define RTE_ETH_SMI_MDC_PIN 1 +#else +#error "Invalid ETH_MDC Pin Configuration!" +#endif +// ETH_MDIO Pin <0=>PA2 +#define RTE_ETH_SMI_MDIO_PORT_ID 0 +#if (RTE_ETH_SMI_MDIO_PORT_ID == 0) +#define RTE_ETH_SMI_MDIO_PORT GPIOA +#define RTE_ETH_SMI_MDIO_PIN 2 +#else +#error "Invalid ETH_MDIO Pin Configuration!" +#endif +// + +// Software controlled +// Enable software controlled SMI on arbitrary GPIO pins +#define RTE_ETH_SMI_SW 0 +// ETH_MDC Pin +// Configure arbitrary GPIO as MDC Pin +// GPIO Pxy (x = A..H, y = 0..15) or (x = I, y = 0..11) +// Port <0=>GPIOA <1=>GPIOB <2=>GPIOC <3=>GPIOD +// <4=>GPIOE <5=>GPIOF <6=>GPIOG <7=>GPIOH <8=>GPIOI +// Selects Port Name +// Bit <0-15> +// Selects Port Bit +#define RTE_ETH_SMI_SW_MDC_PORT GPIO_PORT(6) +#define RTE_ETH_SMI_SW_MDC_PIN 7 +// + +// ETH_MDIO Pin +// Configure arbitrary GPIO as MDIO Pin +// GPIO Pxy (x = A..H, y = 0..15) or (x = I, y = 0..11) +// Port <0=>GPIOA <1=>GPIOB <2=>GPIOC <3=>GPIOD +// <4=>GPIOE <5=>GPIOF <6=>GPIOG <7=>GPIOH <8=>GPIOI +// Selects Port Name +// Bit <0-15> +// Selects Port Bit +#define RTE_ETH_SMI_SW_MDIO_PORT GPIO_PORT(6) +#define RTE_ETH_SMI_SW_MDIO_PIN 6 +// +// +// +// DMA Descriptor/Buffer Memory Address <0x20000000-0xE0000000> +// Configure location of the Ethernet DMA Descriptor and Buffer memory +#define RTE_ETH_DMA_MEM_ADDR 0x2000C000 + +// + + +// USB OTG Full-speed +#define RTE_USB_OTG_FS 0 + +// Device [Driver_USBD0] +// Configuration settings for Driver_USBD0 in component ::CMSIS Driver:USB Device + +#define RTE_USB_OTG_FS_DEVICE 1 + +// VBUS Sensing Pin +// Enable or disable VBUS sensing +#define RTE_OTG_FS_VBUS_SENSING_PIN 1 +// + +// Host [Driver_USBH0] +// Configuration settings for Driver_USBH0 in component ::CMSIS Driver:USB Host + +#define RTE_USB_OTG_FS_HOST 0 + +// VBUS Power On/Off Pin +// Configure Pin for driving VBUS +// GPIO Pxy (x = A..J, y = 0..15) or (x = K, y = 0..7) +// Active State <0=>Low <1=>High +// Selects Active State Logical Level +// Port <0=>GPIOA <1=>GPIOB <2=>GPIOC <3=>GPIOD +// <4=>GPIOE <5=>GPIOF <6=>GPIOG <7=>GPIOH +// <8=>GPIOI <8=>GPIOJ <9=>GPIOK +// Selects Port Name +// Bit <0-15> +// Selects Port Bit +// +#define RTE_OTG_FS_VBUS_PIN 1 +#define RTE_OTG_FS_VBUS_ACTIVE 0 +#define RTE_OTG_FS_VBUS_PORT GPIO_PORT(7) +#define RTE_OTG_FS_VBUS_BIT 5 + +// Overcurrent Detection Pin +// Configure Pin for overcurrent detection +// GPIO Pxy (x = A..J, y = 0..15) or (x = K, y = 0..7) +// Active State <0=>Low <1=>High +// Selects Active State Logical Level +// Port <0=>GPIOA <1=>GPIOB <2=>GPIOC <3=>GPIOD +// <4=>GPIOE <5=>GPIOF <6=>GPIOG <7=>GPIOH +// <8=>GPIOI <8=>GPIOJ <9=>GPIOK +// Selects Port Name +// Bit <0-15> +// Selects Port Bit +// +#define RTE_OTG_FS_OC_PIN 1 +#define RTE_OTG_FS_OC_ACTIVE 0 +#define RTE_OTG_FS_OC_PORT GPIO_PORT(5) +#define RTE_OTG_FS_OC_BIT 11 +// + +// + + +// USB OTG High-speed +#define RTE_USB_OTG_HS 0 + +// PHY (Physical Layer) + +// PHY Interface +// <0=>On-chip full-speed PHY +// <1=>External ULPI high-speed PHY +#define RTE_USB_OTG_HS_PHY 1 + +// External ULPI Pins (UTMI+ Low Pin Interface) + +// OTG_HS_ULPI_CK Pin <0=>PA5 +#define RTE_USB_OTG_HS_ULPI_CK_PORT_ID 0 +#if (RTE_USB_OTG_HS_ULPI_CK_PORT_ID == 0) +#define RTE_USB_OTG_HS_ULPI_CK_PORT GPIOA +#define RTE_USB_OTG_HS_ULPI_CK_PIN 5 +#else +#error "Invalid OTG_HS_ULPI_CK Pin Configuration!" +#endif +// OTG_HS_ULPI_DIR Pin <0=>PI11 <1=>PC2 +#define RTE_USB_OTG_HS_ULPI_DIR_PORT_ID 0 +#if (RTE_USB_OTG_HS_ULPI_DIR_PORT_ID == 0) +#define RTE_USB_OTG_HS_ULPI_DIR_PORT GPIOI +#define RTE_USB_OTG_HS_ULPI_DIR_PIN 11 +#elif (RTE_USB_OTG_HS_ULPI_DIR_PORT_ID == 1) +#define RTE_USB_OTG_HS_ULPI_DIR_PORT GPIOC +#define RTE_USB_OTG_HS_ULPI_DIR_PIN 2 +#else +#error "Invalid OTG_HS_ULPI_DIR Pin Configuration!" +#endif +// OTG_HS_ULPI_STP Pin <0=>PC0 +#define RTE_USB_OTG_HS_ULPI_STP_PORT_ID 0 +#if (RTE_USB_OTG_HS_ULPI_STP_PORT_ID == 0) +#define RTE_USB_OTG_HS_ULPI_STP_PORT GPIOC +#define RTE_USB_OTG_HS_ULPI_STP_PIN 0 +#else +#error "Invalid OTG_HS_ULPI_STP Pin Configuration!" +#endif +// OTG_HS_ULPI_NXT Pin <0=>PC3 <1=>PH4 +#define RTE_USB_OTG_HS_ULPI_NXT_PORT_ID 1 +#if (RTE_USB_OTG_HS_ULPI_NXT_PORT_ID == 0) +#define RTE_USB_OTG_HS_ULPI_NXT_PORT GPIOC +#define RTE_USB_OTG_HS_ULPI_NXT_PIN 3 +#elif (RTE_USB_OTG_HS_ULPI_NXT_PORT_ID == 1) +#define RTE_USB_OTG_HS_ULPI_NXT_PORT GPIOH +#define RTE_USB_OTG_HS_ULPI_NXT_PIN 4 +#else +#error "Invalid OTG_HS_ULPI_NXT Pin Configuration!" +#endif +// OTG_HS_ULPI_D0 Pin <0=>PA3 +#define RTE_USB_OTG_HS_ULPI_D0_PORT_ID 0 +#if (RTE_USB_OTG_HS_ULPI_D0_PORT_ID == 0) +#define RTE_USB_OTG_HS_ULPI_D0_PORT GPIOA +#define RTE_USB_OTG_HS_ULPI_D0_PIN 3 +#else +#error "Invalid OTG_HS_ULPI_D0 Pin Configuration!" +#endif +// OTG_HS_ULPI_D1 Pin <0=>PB0 +#define RTE_USB_OTG_HS_ULPI_D1_PORT_ID 0 +#if (RTE_USB_OTG_HS_ULPI_D1_PORT_ID == 0) +#define RTE_USB_OTG_HS_ULPI_D1_PORT GPIOB +#define RTE_USB_OTG_HS_ULPI_D1_PIN 0 +#else +#error "Invalid OTG_HS_ULPI_D1 Pin Configuration!" +#endif +// OTG_HS_ULPI_D2 Pin <0=>PB1 +#define RTE_USB_OTG_HS_ULPI_D2_PORT_ID 0 +#if (RTE_USB_OTG_HS_ULPI_D2_PORT_ID == 0) +#define RTE_USB_OTG_HS_ULPI_D2_PORT GPIOB +#define RTE_USB_OTG_HS_ULPI_D2_PIN 1 +#else +#error "Invalid OTG_HS_ULPI_D2 Pin Configuration!" +#endif +// OTG_HS_ULPI_D3 Pin <0=>PB10 +#define RTE_USB_OTG_HS_ULPI_D3_PORT_ID 0 +#if (RTE_USB_OTG_HS_ULPI_D3_PORT_ID == 0) +#define RTE_USB_OTG_HS_ULPI_D3_PORT GPIOB +#define RTE_USB_OTG_HS_ULPI_D3_PIN 10 +#else +#error "Invalid OTG_HS_ULPI_D3 Pin Configuration!" +#endif +// OTG_HS_ULPI_D4 Pin <0=>PB11 +#define RTE_USB_OTG_HS_ULPI_D4_PORT_ID 0 +#if (RTE_USB_OTG_HS_ULPI_D4_PORT_ID == 0) +#define RTE_USB_OTG_HS_ULPI_D4_PORT GPIOB +#define RTE_USB_OTG_HS_ULPI_D4_PIN 11 +#else +#error "Invalid OTG_HS_ULPI_D4 Pin Configuration!" +#endif +// OTG_HS_ULPI_D5 Pin <0=>PB12 +#define RTE_USB_OTG_HS_ULPI_D5_PORT_ID 0 +#if (RTE_USB_OTG_HS_ULPI_D5_PORT_ID == 0) +#define RTE_USB_OTG_HS_ULPI_D5_PORT GPIOB +#define RTE_USB_OTG_HS_ULPI_D5_PIN 12 +#else +#error "Invalid OTG_HS_ULPI_D5 Pin Configuration!" +#endif +// OTG_HS_ULPI_D6 Pin <0=>PB13 +#define RTE_USB_OTG_HS_ULPI_D6_PORT_ID 0 +#if (RTE_USB_OTG_HS_ULPI_D6_PORT_ID == 0) +#define RTE_USB_OTG_HS_ULPI_D6_PORT GPIOB +#define RTE_USB_OTG_HS_ULPI_D6_PIN 13 +#else +#error "Invalid OTG_HS_ULPI_D6 Pin Configuration!" +#endif +// OTG_HS_ULPI_D7 Pin <0=>PB5 +#define RTE_USB_OTG_HS_ULPI_D7_PORT_ID 0 +#if (RTE_USB_OTG_HS_ULPI_D7_PORT_ID == 0) +#define RTE_USB_OTG_HS_ULPI_D7_PORT GPIOB +#define RTE_USB_OTG_HS_ULPI_D7_PIN 5 +#else +#error "Invalid OTG_HS_ULPI_D7 Pin Configuration!" +#endif + +// + +// + +// Device [Driver_USBD1] +// Configuration settings for Driver_USBD1 in component ::CMSIS Driver:USB Device + +#define RTE_USB_OTG_HS_DEVICE 0 + +// VBUS Sensing Pin +// Enable or disable VBUS sensing +// Relevant only if PHY Interface On-chip full-speed PHY is selected +#define RTE_OTG_HS_VBUS_SENSING_PIN 0 +// + +// Host [Driver_USBH1] +// Configuration settings for Driver_USBH1 in component ::CMSIS Driver:USB Host +#define RTE_USB_OTG_HS_HOST 0 + +// VBUS Power On/Off Pin +// Configure Pin for driving VBUS +// GPIO Pxy (x = A..J, y = 0..15) or (x = K, y = 0..7) +// Active State <0=>Low <1=>High +// Selects Active State Logical Level +// Port <0=>GPIOA <1=>GPIOB <2=>GPIOC <3=>GPIOD +// <4=>GPIOE <5=>GPIOF <6=>GPIOG <7=>GPIOH +// <8=>GPIOI <8=>GPIOJ <9=>GPIOK +// Selects Port Name +// Bit <0-15> +// Selects Port Bit +// +#define RTE_OTG_HS_VBUS_PIN 1 +#define RTE_OTG_HS_VBUS_ACTIVE 0 +#define RTE_OTG_HS_VBUS_PORT GPIO_PORT(2) +#define RTE_OTG_HS_VBUS_BIT 2 + +// Overcurrent Detection Pin +// Configure Pin for overcurrent detection +// GPIO Pxy (x = A..J, y = 0..15) or (x = K, y = 0..7) +// Active State <0=>Low <1=>High +// Selects Active State Logical Level +// Port <0=>GPIOA <1=>GPIOB <2=>GPIOC <3=>GPIOD +// <4=>GPIOE <5=>GPIOF <6=>GPIOG <7=>GPIOH +// <8=>GPIOI <8=>GPIOJ <9=>GPIOK +// Selects Port Name +// Bit <0-15> +// Selects Port Bit +// +#define RTE_OTG_HS_OC_PIN 1 +#define RTE_OTG_HS_OC_ACTIVE 0 +#define RTE_OTG_HS_OC_PORT GPIO_PORT(5) +#define RTE_OTG_HS_OC_BIT 12 +// + +// DMA +// Use dedicated DMA for transfers +// If DMA is used all USB transfer data buffers have to be 4-byte aligned. +#define RTE_OTG_HS_DMA 0 + +// + + +#endif /* __RTE_DEVICE_H */ diff --git a/RTE/Device/STM32F746NGHx/startup_stm32f746xx.s b/RTE/Device/STM32F746NGHx/startup_stm32f746xx.s new file mode 100644 index 0000000..0e71f18 --- /dev/null +++ b/RTE/Device/STM32F746NGHx/startup_stm32f746xx.s @@ -0,0 +1,485 @@ +;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;* File Name : startup_stm32f746xx.s +;* Author : MCD Application Team +;* Version : V1.2.0 +;* Date : 30-December-2016 +;* Description : STM32F746xx devices vector table for MDK-ARM toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the CortexM7 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +; +;* Redistribution and use in source and binary forms, with or without modification, +;* are permitted provided that the following conditions are met: +;* 1. Redistributions of source code must retain the above copyright notice, +;* this list of conditions and the following disclaimer. +;* 2. Redistributions in binary form must reproduce the above copyright notice, +;* this list of conditions and the following disclaimer in the documentation +;* and/or other materials provided with the distribution. +;* 3. Neither the name of STMicroelectronics nor the names of its contributors +;* may be used to endorse or promote products derived from this software +;* without specific prior written permission. +;* +;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +;* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +;* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +;* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +;* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +;* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +;* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +; +;******************************************************************************* + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000200 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window WatchDog + DCD PVD_IRQHandler ; PVD through EXTI Line detection + DCD TAMP_STAMP_IRQHandler ; Tamper and TimeStamps through the EXTI line + DCD RTC_WKUP_IRQHandler ; RTC Wakeup through the EXTI line + DCD FLASH_IRQHandler ; FLASH + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line0 + DCD EXTI1_IRQHandler ; EXTI Line1 + DCD EXTI2_IRQHandler ; EXTI Line2 + DCD EXTI3_IRQHandler ; EXTI Line3 + DCD EXTI4_IRQHandler ; EXTI Line4 + DCD DMA1_Stream0_IRQHandler ; DMA1 Stream 0 + DCD DMA1_Stream1_IRQHandler ; DMA1 Stream 1 + DCD DMA1_Stream2_IRQHandler ; DMA1 Stream 2 + DCD DMA1_Stream3_IRQHandler ; DMA1 Stream 3 + DCD DMA1_Stream4_IRQHandler ; DMA1 Stream 4 + DCD DMA1_Stream5_IRQHandler ; DMA1 Stream 5 + DCD DMA1_Stream6_IRQHandler ; DMA1 Stream 6 + DCD ADC_IRQHandler ; ADC1, ADC2 and ADC3s + DCD CAN1_TX_IRQHandler ; CAN1 TX + DCD CAN1_RX0_IRQHandler ; CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; External Line[9:5]s + DCD TIM1_BRK_TIM9_IRQHandler ; TIM1 Break and TIM9 + DCD TIM1_UP_TIM10_IRQHandler ; TIM1 Update and TIM10 + DCD TIM1_TRG_COM_TIM11_IRQHandler ; TIM1 Trigger and Commutation and TIM11 + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD TIM3_IRQHandler ; TIM3 + DCD TIM4_IRQHandler ; TIM4 + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; External Line[15:10]s + DCD RTC_Alarm_IRQHandler ; RTC Alarm (A and B) through EXTI Line + DCD OTG_FS_WKUP_IRQHandler ; USB OTG FS Wakeup through EXTI line + DCD TIM8_BRK_TIM12_IRQHandler ; TIM8 Break and TIM12 + DCD TIM8_UP_TIM13_IRQHandler ; TIM8 Update and TIM13 + DCD TIM8_TRG_COM_TIM14_IRQHandler ; TIM8 Trigger and Commutation and TIM14 + DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare + DCD DMA1_Stream7_IRQHandler ; DMA1 Stream7 + DCD FMC_IRQHandler ; FMC + DCD SDMMC1_IRQHandler ; SDMMC1 + DCD TIM5_IRQHandler ; TIM5 + DCD SPI3_IRQHandler ; SPI3 + DCD UART4_IRQHandler ; UART4 + DCD UART5_IRQHandler ; UART5 + DCD TIM6_DAC_IRQHandler ; TIM6 and DAC1&2 underrun errors + DCD TIM7_IRQHandler ; TIM7 + DCD DMA2_Stream0_IRQHandler ; DMA2 Stream 0 + DCD DMA2_Stream1_IRQHandler ; DMA2 Stream 1 + DCD DMA2_Stream2_IRQHandler ; DMA2 Stream 2 + DCD DMA2_Stream3_IRQHandler ; DMA2 Stream 3 + DCD DMA2_Stream4_IRQHandler ; DMA2 Stream 4 + DCD ETH_IRQHandler ; Ethernet + DCD ETH_WKUP_IRQHandler ; Ethernet Wakeup through EXTI line + DCD CAN2_TX_IRQHandler ; CAN2 TX + DCD CAN2_RX0_IRQHandler ; CAN2 RX0 + DCD CAN2_RX1_IRQHandler ; CAN2 RX1 + DCD CAN2_SCE_IRQHandler ; CAN2 SCE + DCD OTG_FS_IRQHandler ; USB OTG FS + DCD DMA2_Stream5_IRQHandler ; DMA2 Stream 5 + DCD DMA2_Stream6_IRQHandler ; DMA2 Stream 6 + DCD DMA2_Stream7_IRQHandler ; DMA2 Stream 7 + DCD USART6_IRQHandler ; USART6 + DCD I2C3_EV_IRQHandler ; I2C3 event + DCD I2C3_ER_IRQHandler ; I2C3 error + DCD OTG_HS_EP1_OUT_IRQHandler ; USB OTG HS End Point 1 Out + DCD OTG_HS_EP1_IN_IRQHandler ; USB OTG HS End Point 1 In + DCD OTG_HS_WKUP_IRQHandler ; USB OTG HS Wakeup through EXTI + DCD OTG_HS_IRQHandler ; USB OTG HS + DCD DCMI_IRQHandler ; DCMI + DCD 0 ; Reserved + DCD RNG_IRQHandler ; Rng + DCD FPU_IRQHandler ; FPU + DCD UART7_IRQHandler ; UART7 + DCD UART8_IRQHandler ; UART8 + DCD SPI4_IRQHandler ; SPI4 + DCD SPI5_IRQHandler ; SPI5 + DCD SPI6_IRQHandler ; SPI6 + DCD SAI1_IRQHandler ; SAI1 + DCD LTDC_IRQHandler ; LTDC + DCD LTDC_ER_IRQHandler ; LTDC error + DCD DMA2D_IRQHandler ; DMA2D + DCD SAI2_IRQHandler ; SAI2 + DCD QUADSPI_IRQHandler ; QUADSPI + DCD LPTIM1_IRQHandler ; LPTIM1 + DCD CEC_IRQHandler ; HDMI_CEC + DCD I2C4_EV_IRQHandler ; I2C4 Event + DCD I2C4_ER_IRQHandler ; I2C4 Error + DCD SPDIF_RX_IRQHandler ; SPDIF_RX +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT TAMP_STAMP_IRQHandler [WEAK] + EXPORT RTC_WKUP_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Stream0_IRQHandler [WEAK] + EXPORT DMA1_Stream1_IRQHandler [WEAK] + EXPORT DMA1_Stream2_IRQHandler [WEAK] + EXPORT DMA1_Stream3_IRQHandler [WEAK] + EXPORT DMA1_Stream4_IRQHandler [WEAK] + EXPORT DMA1_Stream5_IRQHandler [WEAK] + EXPORT DMA1_Stream6_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT CAN1_TX_IRQHandler [WEAK] + EXPORT CAN1_RX0_IRQHandler [WEAK] + EXPORT CAN1_RX1_IRQHandler [WEAK] + EXPORT CAN1_SCE_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT TIM1_BRK_TIM9_IRQHandler [WEAK] + EXPORT TIM1_UP_TIM10_IRQHandler [WEAK] + EXPORT TIM1_TRG_COM_TIM11_IRQHandler [WEAK] + EXPORT TIM1_CC_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT TIM3_IRQHandler [WEAK] + EXPORT TIM4_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTC_Alarm_IRQHandler [WEAK] + EXPORT OTG_FS_WKUP_IRQHandler [WEAK] + EXPORT TIM8_BRK_TIM12_IRQHandler [WEAK] + EXPORT TIM8_UP_TIM13_IRQHandler [WEAK] + EXPORT TIM8_TRG_COM_TIM14_IRQHandler [WEAK] + EXPORT TIM8_CC_IRQHandler [WEAK] + EXPORT DMA1_Stream7_IRQHandler [WEAK] + EXPORT FMC_IRQHandler [WEAK] + EXPORT SDMMC1_IRQHandler [WEAK] + EXPORT TIM5_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT UART5_IRQHandler [WEAK] + EXPORT TIM6_DAC_IRQHandler [WEAK] + EXPORT TIM7_IRQHandler [WEAK] + EXPORT DMA2_Stream0_IRQHandler [WEAK] + EXPORT DMA2_Stream1_IRQHandler [WEAK] + EXPORT DMA2_Stream2_IRQHandler [WEAK] + EXPORT DMA2_Stream3_IRQHandler [WEAK] + EXPORT DMA2_Stream4_IRQHandler [WEAK] + EXPORT ETH_IRQHandler [WEAK] + EXPORT ETH_WKUP_IRQHandler [WEAK] + EXPORT CAN2_TX_IRQHandler [WEAK] + EXPORT CAN2_RX0_IRQHandler [WEAK] + EXPORT CAN2_RX1_IRQHandler [WEAK] + EXPORT CAN2_SCE_IRQHandler [WEAK] + EXPORT OTG_FS_IRQHandler [WEAK] + EXPORT DMA2_Stream5_IRQHandler [WEAK] + EXPORT DMA2_Stream6_IRQHandler [WEAK] + EXPORT DMA2_Stream7_IRQHandler [WEAK] + EXPORT USART6_IRQHandler [WEAK] + EXPORT I2C3_EV_IRQHandler [WEAK] + EXPORT I2C3_ER_IRQHandler [WEAK] + EXPORT OTG_HS_EP1_OUT_IRQHandler [WEAK] + EXPORT OTG_HS_EP1_IN_IRQHandler [WEAK] + EXPORT OTG_HS_WKUP_IRQHandler [WEAK] + EXPORT OTG_HS_IRQHandler [WEAK] + EXPORT DCMI_IRQHandler [WEAK] + EXPORT RNG_IRQHandler [WEAK] + EXPORT FPU_IRQHandler [WEAK] + EXPORT UART7_IRQHandler [WEAK] + EXPORT UART8_IRQHandler [WEAK] + EXPORT SPI4_IRQHandler [WEAK] + EXPORT SPI5_IRQHandler [WEAK] + EXPORT SPI6_IRQHandler [WEAK] + EXPORT SAI1_IRQHandler [WEAK] + EXPORT LTDC_IRQHandler [WEAK] + EXPORT LTDC_ER_IRQHandler [WEAK] + EXPORT DMA2D_IRQHandler [WEAK] + EXPORT SAI2_IRQHandler [WEAK] + EXPORT QUADSPI_IRQHandler [WEAK] + EXPORT LPTIM1_IRQHandler [WEAK] + EXPORT CEC_IRQHandler [WEAK] + EXPORT I2C4_EV_IRQHandler [WEAK] + EXPORT I2C4_ER_IRQHandler [WEAK] + EXPORT SPDIF_RX_IRQHandler [WEAK] + +WWDG_IRQHandler +PVD_IRQHandler +TAMP_STAMP_IRQHandler +RTC_WKUP_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Stream0_IRQHandler +DMA1_Stream1_IRQHandler +DMA1_Stream2_IRQHandler +DMA1_Stream3_IRQHandler +DMA1_Stream4_IRQHandler +DMA1_Stream5_IRQHandler +DMA1_Stream6_IRQHandler +ADC_IRQHandler +CAN1_TX_IRQHandler +CAN1_RX0_IRQHandler +CAN1_RX1_IRQHandler +CAN1_SCE_IRQHandler +EXTI9_5_IRQHandler +TIM1_BRK_TIM9_IRQHandler +TIM1_UP_TIM10_IRQHandler +TIM1_TRG_COM_TIM11_IRQHandler +TIM1_CC_IRQHandler +TIM2_IRQHandler +TIM3_IRQHandler +TIM4_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +EXTI15_10_IRQHandler +RTC_Alarm_IRQHandler +OTG_FS_WKUP_IRQHandler +TIM8_BRK_TIM12_IRQHandler +TIM8_UP_TIM13_IRQHandler +TIM8_TRG_COM_TIM14_IRQHandler +TIM8_CC_IRQHandler +DMA1_Stream7_IRQHandler +FMC_IRQHandler +SDMMC1_IRQHandler +TIM5_IRQHandler +SPI3_IRQHandler +UART4_IRQHandler +UART5_IRQHandler +TIM6_DAC_IRQHandler +TIM7_IRQHandler +DMA2_Stream0_IRQHandler +DMA2_Stream1_IRQHandler +DMA2_Stream2_IRQHandler +DMA2_Stream3_IRQHandler +DMA2_Stream4_IRQHandler +ETH_IRQHandler +ETH_WKUP_IRQHandler +CAN2_TX_IRQHandler +CAN2_RX0_IRQHandler +CAN2_RX1_IRQHandler +CAN2_SCE_IRQHandler +OTG_FS_IRQHandler +DMA2_Stream5_IRQHandler +DMA2_Stream6_IRQHandler +DMA2_Stream7_IRQHandler +USART6_IRQHandler +I2C3_EV_IRQHandler +I2C3_ER_IRQHandler +OTG_HS_EP1_OUT_IRQHandler +OTG_HS_EP1_IN_IRQHandler +OTG_HS_WKUP_IRQHandler +OTG_HS_IRQHandler +DCMI_IRQHandler +RNG_IRQHandler +FPU_IRQHandler +UART7_IRQHandler +UART8_IRQHandler +SPI4_IRQHandler +SPI5_IRQHandler +SPI6_IRQHandler +SAI1_IRQHandler +LTDC_IRQHandler +LTDC_ER_IRQHandler +DMA2D_IRQHandler +SAI2_IRQHandler +QUADSPI_IRQHandler +LPTIM1_IRQHandler +CEC_IRQHandler +I2C4_EV_IRQHandler +I2C4_ER_IRQHandler +SPDIF_RX_IRQHandler + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/RTE/Device/STM32F746NGHx/stm32f7xx_hal_conf.h b/RTE/Device/STM32F746NGHx/stm32f7xx_hal_conf.h new file mode 100644 index 0000000..920ea24 --- /dev/null +++ b/RTE/Device/STM32F746NGHx/stm32f7xx_hal_conf.h @@ -0,0 +1,560 @@ +/** + ****************************************************************************** + * @file stm32f7xx_hal_conf.h + * @author MCD Application Team + * @version V1.2.0 modified by ARM + * @date 23-September-2016 + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F7xx_HAL_CONF_H +#define __STM32F7xx_HAL_CONF_H + +#ifdef _RTE_ +#include "RTE_Components.h" // Component selection +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#ifdef RTE_DEVICE_HAL_COMMON +#define HAL_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_ADC +#define HAL_ADC_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_CAN +#define HAL_CAN_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_CEC +#define HAL_CEC_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_CRC +#define HAL_CRC_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_CRYP +#define HAL_CRYP_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_DAC +#define HAL_DAC_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_DCMI +#define HAL_DCMI_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_DMA +#define HAL_DMA_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_DMA2D +#define HAL_DMA2D_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_ETH +#define HAL_ETH_MODULE_ENABLED +#endif +#if defined (RTE_DEVICE_HAL_FLASH) || defined (RTE_DEVICE_HAL_COMMON) +#define HAL_FLASH_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_NAND +#define HAL_NAND_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_NOR +#define HAL_NOR_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_SRAM +#define HAL_SRAM_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_SDRAM +#define HAL_SDRAM_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_HASH +#define HAL_HASH_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_GPIO +#define HAL_GPIO_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_I2C +#define HAL_I2C_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_I2S +#define HAL_I2S_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_IWDG +#define HAL_IWDG_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_LPTIM +#define HAL_LPTIM_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_LTDC +#define HAL_LTDC_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_PWR +#define HAL_PWR_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_QSPI +#define HAL_QSPI_MODULE_ENABLED +#endif +#if defined RTE_DEVICE_HAL_RCC +#define HAL_RCC_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_RNG +#define HAL_RNG_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_RTC +#define HAL_RTC_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_SAI +#define HAL_SAI_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_SD +#define HAL_SD_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_SPDIFRX +#define HAL_SPDIFRX_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_SPI +#define HAL_SPI_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_TIM +#define HAL_TIM_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_UART +#define HAL_UART_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_USART +#define HAL_USART_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_IRDA +#define HAL_IRDA_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_SMARTCARD +#define HAL_SMARTCARD_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_WWDG +#define HAL_WWDG_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_CORTEX +#define HAL_CORTEX_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_PCD +#define HAL_PCD_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_HCD +#define HAL_HCD_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_DFSDM +#define HAL_DFSDM_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_DSI +#define HAL_DSI_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_JPEG +#define HAL_JPEG_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_MDIOS +#define HAL_MDIOS_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_SMBUS +#define HAL_SMBUS_MODULE_ENABLED +#endif +#ifdef RTE_DEVICE_HAL_MMC +#define HAL_MMC_MODULE_ENABLED +#endif + + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE 32000U /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature. */ +/** + * @brief External Low Speed oscillator (LSE) value. + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE 3300U /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY 0x0FU /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 1U +#define ART_ACCLERATOR_ENABLE 1U /* To enable instruction cache and prefetch */ + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1 */ + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 2U +#define MAC_ADDR1 0U +#define MAC_ADDR2 0U +#define MAC_ADDR3 0U +#define MAC_ADDR4 0U +#define MAC_ADDR5 0U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB 4U /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848 PHY Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY 0x000000FFU +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY 0x00000FFFU + +#define PHY_READ_TO 0x0000FFFFU +#define PHY_WRITE_TO 0x0000FFFFU + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x00U) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x01U) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ + +#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */ +#define PHY_MICR ((uint16_t)0x11U) /*!< MII Interrupt Control Register */ +#define PHY_MISR ((uint16_t)0x12U) /*!< MII Interrupt Status and Misc. Control Register */ + +#define PHY_LINK_STATUS ((uint16_t)0x0001U) /*!< PHY Link mask */ +#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ + +#define PHY_MICR_INT_EN ((uint16_t)0x0002U) /*!< PHY Enable interrupts */ +#define PHY_MICR_INT_OE ((uint16_t)0x0001U) /*!< PHY Enable output interrupt events */ + +#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020U) /*!< Enable Interrupt on change of link status */ +#define PHY_LINK_INTERRUPT ((uint16_t)0x2000U) /*!< PHY link status interrupt mask */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver +* Activated: CRC code is present inside driver +* Deactivated: CRC code cleaned from driver +*/ + +#define USE_SPI_CRC 1U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32f7xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f7xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f7xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f7xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f7xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f7xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32f7xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f7xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32f7xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32f7xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f7xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32f7xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32f7xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f7xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32f7xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32f7xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32f7xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED + #include "stm32f7xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32f7xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f7xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f7xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f7xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32f7xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32f7xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f7xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32f7xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32f7xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f7xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32f7xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32f7xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED + #include "stm32f7xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f7xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f7xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f7xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f7xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f7xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f7xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f7xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f7xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32f7xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32f7xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32f7xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_JPEG_MODULE_ENABLED + #include "stm32f7xx_hal_jpeg.h" +#endif /* HAL_JPEG_MODULE_ENABLED */ + +#ifdef HAL_MDIOS_MODULE_ENABLED + #include "stm32f7xx_hal_mdios.h" +#endif /* HAL_MDIOS_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + #include "stm32f7xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32f7xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0) +#endif /* USE_FULL_ASSERT */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F7xx_HAL_CONF_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/RTE/Device/STM32F746NGHx/system_stm32f7xx.c b/RTE/Device/STM32F746NGHx/system_stm32f7xx.c new file mode 100644 index 0000000..e53a665 --- /dev/null +++ b/RTE/Device/STM32F746NGHx/system_stm32f7xx.c @@ -0,0 +1,280 @@ +/** + ****************************************************************************** + * @file system_stm32f7xx.c + * @author MCD Application Team + * @version V1.2.0 + * @date 30-December-2016 + * @brief CMSIS Cortex-M7 Device Peripheral Access Layer System Source File. + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f7xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f7xx_system + * @{ + */ + +/** @addtogroup STM32F7xx_System_Private_Includes + * @{ + */ + +#include "stm32f7xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Variables + * @{ + */ + + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = 16000000; + const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the Embedded Flash Interface, the PLL and update the + * SystemFrequency variable. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ + #endif + /* Reset the RCC clock configuration to the default reset state ------------*/ + /* Set HSION bit */ + RCC->CR |= (uint32_t)0x00000001; + + /* Reset CFGR register */ + RCC->CFGR = 0x00000000; + + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFFF; + + /* Reset PLLCFGR register */ + RCC->PLLCFGR = 0x24003010; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Disable all interrupts */ + RCC->CIR = 0x00000000; + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/RTE/Hesso_pack/clock_216.c b/RTE/Hesso_pack/clock_216.c new file mode 100644 index 0000000..cc7b7f3 --- /dev/null +++ b/RTE/Hesso_pack/clock_216.c @@ -0,0 +1,38 @@ + +#include "stm32f7xx_hal.h" +#include "clock_216.h" + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +// Setup system clock to 216MHz +//------------------------------------------------------------------------------ +void SystemClock_Config (void) { + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_OscInitTypeDef RCC_OscInitStruct; + + /* Enable HSE Oscillator and activate PLL with HSE as source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.HSIState = RCC_HSI_OFF; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 25; + RCC_OscInitStruct.PLL.PLLN = 432; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 9; + HAL_RCC_OscConfig(&RCC_OscInitStruct); + + /* Activate the OverDrive to reach the 216 MHz Frequency */ + HAL_PWREx_EnableOverDrive(); + + /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */ + RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7); +} + + diff --git a/RTE/Hesso_pack/clock_216.h b/RTE/Hesso_pack/clock_216.h new file mode 100644 index 0000000..a281697 --- /dev/null +++ b/RTE/Hesso_pack/clock_216.h @@ -0,0 +1,17 @@ +/************************************************************************//** + * \file clock_216.h + * \brief Function to set the system clock to 216 MHz + * \author pascal (dot) sartoretti (at) hevs (dot) ch + ***************************************************************************/ +#ifndef __CLOCK_216_H +#define __CLOCK_216_H + +#include + +/************************************************************************//** + * \brief Inits the system clock to 216 MHz + ***************************************************************************/ +extern void SystemClock_Config (void); + + +#endif /* __CLOCK_216_H */ diff --git a/RTE/Hesso_pack/ext_buttons.c b/RTE/Hesso_pack/ext_buttons.c new file mode 100644 index 0000000..81fc72d --- /dev/null +++ b/RTE/Hesso_pack/ext_buttons.c @@ -0,0 +1,58 @@ + +#include "stm32f7xx_hal.h" +#include "ext_buttons.h" + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +int32_t Ext_Buttons_Init (void) { + GPIO_InitTypeDef GPIO_InitStruct; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOG_CLK_ENABLE(); + __HAL_RCC_GPIOI_CLK_ENABLE(); + + /* Configure GPIO pin: PI2 (BTN_0) */ + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLUP; + HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); + /* Configure GPIO pin: PI3 (BTN_1) */ + GPIO_InitStruct.Pin = GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLUP; + HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); + /* Configure GPIO pin: PG7 (BTN_2) */ + GPIO_InitStruct.Pin = GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLUP; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + /* Configure GPIO pin: PG6 (BTN_3) */ + GPIO_InitStruct.Pin = GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLUP; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + return 0; +} + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +uint32_t Ext_Buttons_GetState (void) { + uint32_t val = 0; + + if (HAL_GPIO_ReadPin(GPIOI, GPIO_PIN_2) == GPIO_PIN_RESET) { + val |= 1; + } + if (HAL_GPIO_ReadPin(GPIOI, GPIO_PIN_3) == GPIO_PIN_RESET) { + val |= 2; + } + if (HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_7) == GPIO_PIN_RESET) { + val |= 4; + } + if (HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_6) == GPIO_PIN_RESET) { + val |= 8; + } + + return val; +} + diff --git a/RTE/Hesso_pack/ext_buttons.h b/RTE/Hesso_pack/ext_buttons.h new file mode 100644 index 0000000..b77a12b --- /dev/null +++ b/RTE/Hesso_pack/ext_buttons.h @@ -0,0 +1,23 @@ +/************************************************************************//** + * \file ext_buttons.h + * \brief Function to use the extension uart + * \author pascal (dot) sartoretti (at) hevs (dot) ch + ***************************************************************************/ +#ifndef __EXT_BUTTONS_H +#define __EXT_BUTTONS_H + +#include + +/************************************************************************//** + * \brief Inits the external buttons usage. + * \return Always #0 + ***************************************************************************/ +extern int32_t Ext_Buttons_Init(void); + +/************************************************************************//** + * \brief Reads the buttons status + * \return The binary state of the buttons (example 4 for button 2 pressed). + ***************************************************************************/ +extern uint32_t Ext_Buttons_GetState(void); + +#endif /* __BOARD_BUTTONS_H */ diff --git a/RTE/Hesso_pack/ext_keyboard.c b/RTE/Hesso_pack/ext_keyboard.c new file mode 100644 index 0000000..8524479 --- /dev/null +++ b/RTE/Hesso_pack/ext_keyboard.c @@ -0,0 +1,579 @@ + +#include "stm32f7xx_hal.h" +#include "ext_keyboard.h" + +#define TRUE 1 +#define FALSE 0 +#define NORMAL 0 +#define SHIFT 1 +#define CONTROL 2 +#define ALT 3 +#define TABULATOR 0x09 +#define BACKSPACE 0x08 +#define ESCAPE 0x1B +#define CR 0x0D +#define F1 0x10 +#define F2 0x11 +#define F3 0x12 +#define F4 0x13 +#define F5 0x14 +#define F6 0x15 +#define F7 0x16 +#define F8 0x17 +#define F9 0x18 +#define F10 0x19 +#define F11 0x1A +#define F12 0x1B + +static SPI_HandleTypeDef keyboard; // SPI keyboard handle +uint8_t ext_kbChar; // exported to global use +uint8_t scan; +static uint32_t newChar=0; // internal flag +uint8_t release; +uint8_t state; +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +uint8_t ScanCodeAnalyse(uint8_t scan) +{ + switch(scan) + { + /*---------------------------------------------------------------------------*/ + case 0xF0: release = TRUE; return 0 ; /* release key code */ + /*---------------------------------------------------------------------------*/ + case 0x14: if (release == FALSE) + state = CONTROL; + else + { + state = NORMAL; + release = FALSE; + } + return 0x00; + /*---------------------------------------------------------------------------*/ + case 0x11: if (release == FALSE) + state = ALT; + else + { + state = NORMAL; + release = FALSE; + } + return 0x00; + /*---------------------------------------------------------------------------*/ + case 0x12: + case 0x58: + case 0x59: if (release == FALSE) + state = SHIFT; + else + { + state = NORMAL; + release = FALSE; + } + return 0x00; + } + /*---------------------------------------------------------------------------*/ + if (release == TRUE) + { + release = FALSE; + return 0x00; + } + /*---------------------------------------------------------------------------*/ + /*---------------------------------------------------------------------------*/ + switch(scan) + { + /*---------------------------------------------------------------------------*/ + case 0x05: return F1; // 'F1' to 'F12' + /*---------------------------------------------------------------------------*/ + case 0x06: return F2; + /*---------------------------------------------------------------------------*/ + case 0x04: return F3; + /*---------------------------------------------------------------------------*/ + case 0x0c: return F4; + /*---------------------------------------------------------------------------*/ + case 0x03: return F5; + /*---------------------------------------------------------------------------*/ + case 0x0B: return F6; + /*---------------------------------------------------------------------------*/ + case 0x83: return F7; + /*---------------------------------------------------------------------------*/ + case 0x0A: return F8; + /*---------------------------------------------------------------------------*/ + case 0x01: return F9; + /*---------------------------------------------------------------------------*/ + case 0x09: return F10; + /*---------------------------------------------------------------------------*/ + case 0x78: return F11; + /*---------------------------------------------------------------------------*/ + case 0x07: return F12; + /*---------------------------------------------------------------------------*/ + case 0x16: switch (state) /* key '1' */ + { + case NORMAL : return '1'; + case CONTROL : return 0; + case SHIFT : return '!'; + } + /*---------------------------------------------------------------------------*/ + case 0x1E: switch (state) /* key '2' */ + { + case NORMAL : return '2'; + case CONTROL : return 0; + case SHIFT : return '@'; + } + /*---------------------------------------------------------------------------*/ + case 0x26: switch (state) /* key '3' */ + { + case NORMAL : return '3'; + case CONTROL : return 0; + case SHIFT : return '#'; + } + /*---------------------------------------------------------------------------*/ + case 0x25: switch (state) /* key '4' */ + { + case NORMAL : return '4'; + case CONTROL : return 0; + case SHIFT : return '$'; + } + /*---------------------------------------------------------------------------*/ + case 0x2E: switch (state) /* key '5' */ + { + case NORMAL : return '5'; + case CONTROL : return 0; + case SHIFT : return '%'; + } + /*---------------------------------------------------------------------------*/ + case 0x36: switch (state) /* key '6' */ + { + case NORMAL : return '6'; + case CONTROL : return 0; + case SHIFT : return '^'; + } + /*---------------------------------------------------------------------------*/ + case 0x6C: + case 0x3D: switch (state) /* key '7' */ + { + case NORMAL : return '7'; + case CONTROL : return 0; + case SHIFT : return '&'; + } + /*---------------------------------------------------------------------------*/ + case 0x75: + case 0x3E: switch (state) /* key '8' */ + { + case NORMAL : return '8'; + case CONTROL : return 0; + case SHIFT : return '*'; + } + /*---------------------------------------------------------------------------*/ + case 0x7D: + case 0x46: switch (state) /* key '9' */ + { + case NORMAL : return '9'; + case CONTROL : return 0; + case SHIFT : return '('; + } + /*---------------------------------------------------------------------------*/ + case 0x7C: + case 0x45: switch (state) /* key '0' */ + { + case NORMAL : return '0'; + case CONTROL : return 0; + case SHIFT : return ')'; + } + /*---------------------------------------------------------------------------*/ + case 0x7E: switch (state) /* key '*' */ + { + case NORMAL : return '*'; + case CONTROL : return F11; + case SHIFT : return '?'; + default : return 0xBF; /* ? vertical flipped */ + } + /*---------------------------------------------------------------------------*/ + case 0x4E: switch (state) /* key '-' */ + { + case NORMAL : return '-'; + case CONTROL : return 0; + case SHIFT : return '_'; + default : return 0x00; + } + /*---------------------------------------------------------------------------*/ + case 0x65: return 0x1B; /* End button -> Escape command */ + /*---------------------------------------------------------------------------*/ + case 0x15: switch (state) /* key 'Q' */ + { + case SHIFT : return 'Q'; + case CONTROL : return 0x11; + default : return 'q'; + } + /*---------------------------------------------------------------------------*/ + case 0x1D: switch (state) /* key 'W' */ + { + case SHIFT : return 'W'; + case CONTROL : return 0x17; + default : return 'w'; + } + /*---------------------------------------------------------------------------*/ + case 0x24: switch (state) /* key 'E' */ + { + case SHIFT : return 'E'; + case CONTROL : return 0x05; + default : return 'e'; + } + /*---------------------------------------------------------------------------*/ + case 0x2D: switch (state) /* key 'R' */ + { + case SHIFT : return 'R'; + case CONTROL : return 0x12; + default : return 'r'; + } + /*---------------------------------------------------------------------------*/ + case 0x2C: switch (state) /* key 'T' */ + { + case SHIFT : return 'T'; + case CONTROL : return 0x14; + default : return 't'; + } + /*---------------------------------------------------------------------------*/ + case 0x35: switch (state) /* key 'Z' */ + { + case SHIFT : return 'Y'; + case CONTROL : return 0x1A; + default : return 'y'; + } + /*---------------------------------------------------------------------------*/ + case 0x6B: + case 0x3C: switch (state) /* key 'U' */ + { + case SHIFT : return 'U'; + case CONTROL : return 0x15; + default : return 'u'; + } + /*---------------------------------------------------------------------------*/ + case 0x73: + case 0x43: switch (state) /* key 'I' */ + { + case SHIFT : return 'I'; + case CONTROL : return 0x09; + default : return 'i'; + } + /*---------------------------------------------------------------------------*/ + case 0x74: + case 0x44: switch (state) /* key 'O' */ + { + case SHIFT : return 'O'; + case CONTROL : return 0x0F; + default : return 'o'; + } + /*---------------------------------------------------------------------------*/ + case 0x7B: + case 0x4D: switch (state) /* key 'P' */ + { + case SHIFT : return 'P'; + case CONTROL : return 0x10; + default : return 'p'; + } + /*---------------------------------------------------------------------------*/ + case 0x5B: switch (state) /* key 'è' */ + { + case SHIFT : return '}'; + case ALT : return 0; + default : return ']'; + } + /*---------------------------------------------------------------------------*/ + case 0x66: return 0x08; /* Backspace */ + /*---------------------------------------------------------------------------*/ + case 0x0D: return 0x09; /* Horizontal tabulator */ + /*---------------------------------------------------------------------------*/ + case 0x1C: switch (state) /* key 'A' */ + { + case SHIFT : return 'A'; + case CONTROL : return 0x01; + default : return 'a'; + } + /*---------------------------------------------------------------------------*/ + case 0x1B: switch (state) /* key 'S' */ + { + case SHIFT : return 'S'; + case CONTROL : return 0x13; + default : return 's'; + } + /*---------------------------------------------------------------------------*/ + case 0x23: switch (state) /* key 'D' */ + { + case SHIFT : return 'D'; + case CONTROL : return 0x04; + default : return 'd'; + } + /*---------------------------------------------------------------------------*/ + case 0x2B: switch (state) /* key 'F' */ + { + case SHIFT : return 'F'; + case CONTROL : return 0x06; + default : return 'f'; + } + /*---------------------------------------------------------------------------*/ + case 0x34: switch (state) /* key 'G' */ + { + case SHIFT : return 'G'; + case CONTROL : return 0x07; + default : return 'g'; + } + /*---------------------------------------------------------------------------*/ + case 0x33: switch (state) /* key 'H' */ + { + case SHIFT : return 'H'; + case CONTROL : return 0x08; + default : return 'h'; + } + /*---------------------------------------------------------------------------*/ + case 0x69: + case 0x3B: switch (state) /* key 'J' */ + { + case SHIFT : return 'J'; + case CONTROL : return 0x0A; + default : return 'j'; + } + /*---------------------------------------------------------------------------*/ + case 0x72: + case 0x42: switch (state) /* key 'K' */ + { + case SHIFT : return 'K'; + case CONTROL : return 0x0B; + default : return 'k'; + } + /*---------------------------------------------------------------------------*/ + case 0x7A: + case 0x4B: switch (state) /* key 'L' */ + { + case SHIFT : return 'L'; + case CONTROL : return 0x0C; + default : return 'l'; + } + /*---------------------------------------------------------------------------*/ + case 0x54: switch (state) /* key '[' */ + { + case SHIFT : return '{'; + case ALT : return 0; /* beta symbol */ + default : return '['; + } + /*---------------------------------------------------------------------------*/ + case 0x52: switch (state) /* key ''' */ + { + case SHIFT : return '"'; + case ALT : return 0; + default : return 0x27; + } + /*---------------------------------------------------------------------------*/ + case 0x1A: switch (state) /* key 'Y' */ + { + case SHIFT : return 'Z'; + case CONTROL : return 0x19; + default : return 'z'; + } + /*---------------------------------------------------------------------------*/ + case 0x22: switch (state) /* key 'X' */ + { + case SHIFT : return 'X'; + case CONTROL : return 0x18; + default : return 'x'; + } + /*---------------------------------------------------------------------------*/ + case 0x21: switch (state) /* key 'C' */ + { + case SHIFT : return 'C'; + case CONTROL : return 0x03; + default : return 'c'; + } + /*---------------------------------------------------------------------------*/ + case 0x2A: switch (state) /* key 'V' */ + { + case SHIFT : return 'V'; + case CONTROL : return 0x16; + default : return 'v'; + } + /*---------------------------------------------------------------------------*/ + case 0x32: switch (state) /* key 'B' */ + { + case SHIFT : return 'B'; + case CONTROL : return 0x02; + default : return 'b'; + } + /*---------------------------------------------------------------------------*/ + case 0x31: switch (state) /* key 'N' */ + { + case SHIFT : return 'N'; + case CONTROL : return 0x0E; + default : return 'n'; + } + /*---------------------------------------------------------------------------*/ + case 0x70: + case 0x3A: switch (state) /* key 'M' */ + { + case SHIFT : return 'M'; + case CONTROL : return 0x0D; + default : return 'm'; + } + /*---------------------------------------------------------------------------*/ + case 0x41: switch (state) /* key ',' */ + { + case SHIFT : return '<'; + default : return ','; + } + /*---------------------------------------------------------------------------*/ + case 0x49: switch (state) /* key '.' */ + { + case SHIFT : return '>'; + default : return '.'; + } + /*---------------------------------------------------------------------------*/ + case 0x5A: return 0x0D; /* Carriage return (Enter) */ + /*---------------------------------------------------------------------------*/ + case 0x29: return ' '; /* Spacebar */ + /*---------------------------------------------------------------------------*/ + case 0x63: switch (state) /* key 'UP ARROW' */ + { + case SHIFT : return 'U'; + default : return 'u'; + } + /*---------------------------------------------------------------------------*/ + case 0x60: switch (state) /* key 'DOWN ARROW' */ + { + case SHIFT : return 'D'; + default : return 'd'; + } + /*---------------------------------------------------------------------------*/ + case 0x61: switch (state) /* key 'LEFT ARROW' */ + { + case SHIFT : return 'L'; + default : return 'l'; + } + /*---------------------------------------------------------------------------*/ + case 0x6A: switch (state) /* key 'RIGHT ARROW' */ + { + case SHIFT : return 'R'; + default : return 'r'; + } + /*---------------------------------------------------------------------------*/ + case 0x0E: switch (state) /* key 'apostroph' */ + { + case SHIFT : return '~'; + default : return '`'; + } + /*---------------------------------------------------------------------------*/ + case 0x79: + case 0x4C: switch (state) /* key ';' */ + { + case SHIFT : return ':'; + default : return ';'; + } + /*---------------------------------------------------------------------------*/ + case 0x4A: switch (state) /* key '/' */ + { + case SHIFT : return '?'; + default : return '/'; + } + /*---------------------------------------------------------------------------*/ + case 0x5D: switch (state) /* key '\' */ + { + case SHIFT : return '|'; + default : return '\\'; + } + /*---------------------------------------------------------------------------*/ + case 0x55: switch (state) /* key '=' */ + { + case SHIFT : return '+'; + default : return '='; + } + } +} +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +void EXTI9_5_IRQHandler(void) +{ + // read keyboard data and store it on global variable + HAL_GPIO_WritePin(GPIOI, GPIO_PIN_0, GPIO_PIN_RESET); // SPI CS activate + HAL_SPI_Receive(&keyboard,&scan,1,100); // SPI read + HAL_GPIO_WritePin(GPIOI, GPIO_PIN_0, GPIO_PIN_SET); // SPI CS desactivate + // process irq + HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8); // clear irq and callback + ext_kbChar = ScanCodeAnalyse(scan); + if(ext_kbChar != 0) + { + newChar = 1; + } +} + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +void Ext_Keyboard_Init(void) +{ + volatile uint8_t dummy; + GPIO_InitTypeDef GPIO_InitStruct; + + /* Peripheral clock enable */ + __HAL_RCC_GPIOI_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOF_CLK_ENABLE(); + __HAL_RCC_SPI2_CLK_ENABLE(); + + /**SPI2 GPIO Configuration + PI1 ------> SPI2_SCK + PB14 ------> SPI2_MISO + PB15 ------> SPI2_MOSI + PI0 ------> /SPI_CB_SS + PF8 ------> /SPI_INT + */ + GPIO_InitStruct.Pin = GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); + GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + GPIO_InitStruct.Pin = GPIO_PIN_0; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; + HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); + GPIO_InitStruct.Pin = GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + keyboard.Instance = SPI2; + keyboard.Init.Mode = SPI_MODE_MASTER; + keyboard.Init.Direction = SPI_DIRECTION_2LINES; + keyboard.Init.DataSize = SPI_DATASIZE_8BIT; + keyboard.Init.CLKPolarity = SPI_POLARITY_HIGH; + keyboard.Init.CLKPhase = SPI_PHASE_1EDGE; + keyboard.Init.NSS = SPI_NSS_SOFT; + keyboard.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; //3.333MHz -> (Fosc/4) / 16 + keyboard.Init.FirstBit = SPI_FIRSTBIT_MSB; + keyboard.Init.TIMode = SPI_TIMODE_DISABLE; + keyboard.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + keyboard.Init.CRCPolynomial = 7; + keyboard.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + keyboard.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + HAL_SPI_Init(&keyboard); + // dummy read to clear any glitch + HAL_GPIO_WritePin(GPIOI, GPIO_PIN_0, GPIO_PIN_RESET); + HAL_SPI_Receive(&keyboard,(uint8_t *)&dummy,1,10); + HAL_GPIO_WritePin(GPIOI, GPIO_PIN_0, GPIO_PIN_SET); + // enable interrupts on keyboard ISR + HAL_NVIC_SetPriority(EXTI9_5_IRQn,5,5); + HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); +} + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +uint8_t Ext_Keyboard_Read(void) +{ + while(newChar == 0) // wait new char coming + {} + newChar = 0; // clear it + return ext_kbChar; // return read char +} + + + diff --git a/RTE/Hesso_pack/ext_keyboard.h b/RTE/Hesso_pack/ext_keyboard.h new file mode 100644 index 0000000..5579406 --- /dev/null +++ b/RTE/Hesso_pack/ext_keyboard.h @@ -0,0 +1,53 @@ +/************************************************************************//** + * \file ext_keyboard.h + * \brief Function to use the extension keyboard + * \author pascal (dot) sartoretti (at) hevs (dot) ch + ***************************************************************************/ + + +#ifndef __EXT_KEYBOARD_H +#define __EXT_KEYBOARD_H + +#include +#include "stm32f7xx_hal.h" + +extern uint8_t ext_kbChar; + +/************************************************************************//** + * \brief Inits the extension keyboard + * The extension keyboard use interrupt from keyboard (PF8) + * + * Read keyboard non blocking (interrupt): + * --------------------------------------- + * To read the keyboard, the callback function HAL_GPIO_EXTI_Callback has + * to be implemented. + * the example below send the keyboard char to the serial port + * void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) + * { + * if(GPIO_Pin == GPIO_PIN_8) + * { + * HAL_UART_Transmit(&ext_uart, &ext_kbChar, 1,100);; + * } + * } + * Read keyboard blocking (pooling until key pressed): + * --------------------------------------------------- + * The functions below have to be used: + * pressed = Ext_Keyboard_Read(); + * + * \warning The external interrupts (5,6,7,9) have to be implemented + * in the ext_keyboard.c file because they share the same processor irq + * EXTI9_5_IRQHandler. + ***************************************************************************/ + void Ext_Keyboard_Init(void); + +/************************************************************************//** + * \brief Read the pressed key on extension keyboard + * \return The ASCII code of key pressed. + * + * \warning This function is blocking until a char is received + ***************************************************************************/ + uint8_t Ext_Keyboard_Read(void); + + +#endif /* __BOARD_LED_H */ + diff --git a/RTE/Hesso_pack/ext_led.c b/RTE/Hesso_pack/ext_led.c new file mode 100644 index 0000000..e773038 --- /dev/null +++ b/RTE/Hesso_pack/ext_led.c @@ -0,0 +1,224 @@ + +#include "stm32f7xx_hal.h" +#include "ext_led.h" +#include + + +//------------------------------------------------------------------------------ +static const uint8_t cie1931[101] = +{ + 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, + 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, + 8, 8, 9, 10, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 22, 23, 24, 26, 27, + 29, 30, 32, 34, 35, 37, 39, 41, 43, 45, + 47, 49, 51, 54, 56, 58, 61, 64, 66, 69, + 72, 75, 78, 81, 84, 87, 90, 93, 97, 100, + 104, 108, 111, 115, 119, 123, 127, 131, 136, 140, + 145, 149, 154, 159, 163, 168, 173, 179, 184, 189, + 195, 200, 206, 212, 217, 223, 230, 236, 242, 248, + 255, +}; + +#if LIGHTNESS_PWM_STEP != 100 +#error this cie1931 array supports only 100 steps, feel free to implement your own +#endif + +//------------------------------------------------------------------------------ +uint8_t lightness_to_pwm(uint8_t percentage) +{ + if(percentage > (LIGHTNESS_PWM_STEP-1)) + percentage = (LIGHTNESS_PWM_STEP-1); + + return cie1931[percentage]; +} + + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +int32_t Ext_LED_Init(void) { + GPIO_InitTypeDef GPIO_InitStruct; + //---------------------------------------------------------------------------- + // Configure GPIO pin: PA15 (LED0) + __HAL_RCC_GPIOA_CLK_ENABLE(); // enable GPIO timer + __HAL_RCC_TIM2_CLK_ENABLE(); // enable timer 2 clock + GPIO_InitStruct.Pin = GPIO_PIN_15; // used pin is PA15 + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // alternate function use + GPIO_InitStruct.Pull = GPIO_NOPULL; // no pullup + GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;// timer 2 is used + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; // speed is fast + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + TIM2->CCER = TIM_CCER_CC1E; // compare for PWM usage + TIM2->PSC = 16; // timer prescaler + TIM2->ARR = 255; // max count value + TIM2->CCR1 = lightness_to_pwm(0); // duty cycle + TIM2->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE; + TIM2->EGR |= TIM_EGR_UG; // update register now + TIM2->CR1 = TIM_CR1_ARPE | TIM_CR1_CEN; // start the timer + //---------------------------------------------------------------------------- + // Configure GPIO pin: PH6 (LED1) + __HAL_RCC_GPIOH_CLK_ENABLE(); // enable GPIO timer + __HAL_RCC_TIM12_CLK_ENABLE(); // enable timer 12 clock + GPIO_InitStruct.Pin = GPIO_PIN_6; // used pin is PH6 + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // alternate function use + GPIO_InitStruct.Pull = GPIO_NOPULL; // no pullup + GPIO_InitStruct.Alternate = GPIO_AF9_TIM12;// timer 12 is used + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; // speed is fast + HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); + + TIM12->CCER = TIM_CCER_CC1E; // compare for PWM usage + TIM12->PSC = 16; // timer prescaler + TIM12->ARR = 255; // max count value + TIM12->CCR1 = lightness_to_pwm(0); // duty cycle + TIM12->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE; + TIM12->EGR |= TIM_EGR_UG; // update register now + TIM12->CR1 = TIM_CR1_ARPE | TIM_CR1_CEN; // start the timer + //---------------------------------------------------------------------------- + // Configure GPIO pin: PA8 (LED2) + __HAL_RCC_GPIOA_CLK_ENABLE(); // enable GPIO timer + __HAL_RCC_TIM1_CLK_ENABLE(); // enable timer 1 clock + + GPIO_InitStruct.Pin = GPIO_PIN_8; // used pin is PA8 + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // alternate function use + GPIO_InitStruct.Pull = GPIO_NOPULL; // no pullup + GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;// timer 5 is used + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; // speed is fast + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + TIM1->CCER = TIM_CCER_CC1E; // compare for PWM usage + TIM1->PSC = 16; // timer prescaler + TIM1->ARR = 255; // max count value + TIM1->CCR1 = lightness_to_pwm(0); // duty cycle + TIM1->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE; + TIM1->EGR |= TIM_EGR_UG; // update register now + TIM1->CR1 = TIM_CR1_ARPE | TIM_CR1_CEN; // start the timer + TIM1->BDTR = TIM_BDTR_MOE; // master output enable + //---------------------------------------------------------------------------- + // Configure GPIO pin: PB4 (LED3) + __HAL_RCC_GPIOB_CLK_ENABLE(); // enable GPIO timer + __HAL_RCC_TIM3_CLK_ENABLE(); // enable timer 3 clock + GPIO_InitStruct.Pin = GPIO_PIN_4; // used pin is PB4 + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // alternate function use + GPIO_InitStruct.Pull = GPIO_NOPULL; // no pullup + GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;// timer 3 is used + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; // speed is fast + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + TIM3->CCER = TIM_CCER_CC1E; // compare for PWM usage + TIM3->PSC = 16; // timer prescaler + TIM3->ARR = 255; // max count value + TIM3->CCR1 = lightness_to_pwm(0); // duty cycle + TIM3->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE; + TIM3->EGR |= TIM_EGR_UG; // update register now + TIM3->CR1 = TIM_CR1_ARPE | TIM_CR1_CEN; // start the timer + return 0; +} + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +int32_t Ext_LED_On (uint32_t num) { + + if((num & 1) != 0) + { + TIM2->CCR1 = lightness_to_pwm(LIGHTNESS_PWM_STEP); + } + if((num & 2) != 0) + { + TIM12->CCR1 = lightness_to_pwm(LIGHTNESS_PWM_STEP); + } + if((num & 4) != 0) + { + TIM1->CCR1 = lightness_to_pwm(LIGHTNESS_PWM_STEP); + } + if((num & 8) != 0) + { + TIM3->CCR1 = lightness_to_pwm(LIGHTNESS_PWM_STEP); + } + return 0; +} + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +int32_t Ext_LED_Off (uint32_t num) { + + if((num & 1) != 0) + { + TIM2->CCR1 = lightness_to_pwm(0); + } + if((num & 2) != 0) + { + TIM12->CCR1 = lightness_to_pwm(0); + } + if((num & 4) != 0) + { + TIM1->CCR1 = lightness_to_pwm(0); + } + if((num & 8) != 0) + { + TIM3->CCR1 = lightness_to_pwm(0); + } + return 0; +} + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +int32_t Ext_LED_PWM (uint32_t num, uint32_t duty) { + + if((num & 1) != 0) + { + TIM2->CCR1 = lightness_to_pwm(duty); + } + if((num & 2) != 0) + { + TIM12->CCR1 = lightness_to_pwm(duty); + } + if((num & 4) != 0) + { + TIM1->CCR1 = lightness_to_pwm(duty); + } + if((num & 8) != 0) + { + TIM3->CCR1 = lightness_to_pwm(duty); + } + return 0; +} + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +int32_t Ext_LEDs(uint32_t num) { + + if((num & 1) != 0) + { + TIM2->CCR1 = lightness_to_pwm(LIGHTNESS_PWM_STEP); + } + else + { + TIM2->CCR1 = lightness_to_pwm(0); + } + if((num & 2) != 0) + { + TIM12->CCR1 = lightness_to_pwm(LIGHTNESS_PWM_STEP); + } + else + { + TIM12->CCR1 = lightness_to_pwm(0); + } + if((num & 4) != 0) + { + TIM1->CCR1 = lightness_to_pwm(LIGHTNESS_PWM_STEP); + } + else + { + TIM1->CCR1 = lightness_to_pwm(0); + } + if((num & 8) != 0) + { + TIM3->CCR1 = lightness_to_pwm(LIGHTNESS_PWM_STEP); + } + else + { + TIM3->CCR1 = lightness_to_pwm(0); + } + return 0; +} diff --git a/RTE/Hesso_pack/ext_led.h b/RTE/Hesso_pack/ext_led.h new file mode 100644 index 0000000..28b8ed9 --- /dev/null +++ b/RTE/Hesso_pack/ext_led.h @@ -0,0 +1,51 @@ +/************************************************************************//** + * \file ext_led.h + * \brief Function to use the extension LEDs + * \author pascal (dot) sartoretti (at) hevs (dot) ch + ***************************************************************************/ + + +#ifndef __EXT_LED_H +#define __EXT_LED_H + +#include + +#define LIGHTNESS_PWM_STEP 100 + + +/************************************************************************//** + * \brief Inits the external Leds usage. + * \return Always #0 + ***************************************************************************/ +extern int32_t Ext_LED_Init (void); + +/************************************************************************//** + * \brief Turn on one led. + * \param num The led to turn on (1,2,4,8) + * \return Always 0 + ***************************************************************************/ +extern int32_t Ext_LED_On (uint32_t num); + +/************************************************************************//** + * \brief Turn off one led. + * \param num The led to turn off (1,2,4,8) + * \return Always 0 + ***************************************************************************/ +extern int32_t Ext_LED_Off (uint32_t num); + +/************************************************************************//** + * \brief Set a power on a led. + * \param num The led to turn set the power (1,2,4,8) + * \param duty The power of the led (0 to 255) + * \return Always 0 + ***************************************************************************/ +extern int32_t Ext_LED_PWM (uint32_t num, uint32_t duty); + +/************************************************************************//** + * \brief Set the state on all leds. + * \param val The binary state of the four leds (example 0b1101). + * \return Always 0 + ***************************************************************************/ +extern int32_t Ext_LEDs(uint32_t val); + +#endif /* __BOARD_LED_H */ diff --git a/RTE/Hesso_pack/ext_uart.c b/RTE/Hesso_pack/ext_uart.c new file mode 100644 index 0000000..adefcf8 --- /dev/null +++ b/RTE/Hesso_pack/ext_uart.c @@ -0,0 +1,57 @@ + +#include "stm32f7xx_hal.h" +#include "ext_uart.h" + +UART_HandleTypeDef ext_uart; // extension uart handler +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +void HAL_UART_MspInit(UART_HandleTypeDef* huart) +{ + + GPIO_InitTypeDef GPIO_InitStruct; + if(huart->Instance==USART6) + { + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_USART6_CLK_ENABLE(); + + /**USART6 GPIO Configuration + PC7 ------> USART6_RX + PC6 ------> USART6_TX + */ + GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF8_USART6; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + } +} + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +void Ext_UART_Init(uint32_t speed) +{ + ext_uart.Instance = USART6; + ext_uart.Init.BaudRate = speed; + ext_uart.Init.WordLength = UART_WORDLENGTH_8B; + ext_uart.Init.StopBits = UART_STOPBITS_1; + ext_uart.Init.Parity = UART_PARITY_NONE; + ext_uart.Init.Mode = UART_MODE_TX_RX; + ext_uart.Init.HwFlowCtl = UART_HWCONTROL_NONE; + ext_uart.Init.OverSampling = UART_OVERSAMPLING_16; + ext_uart.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + ext_uart.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + HAL_UART_Init(&ext_uart); + /* USART6 interrupt Init */ + HAL_NVIC_SetPriority(USART6_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USART6_IRQn); +} + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +void USART6_IRQHandler(void) +{ + HAL_UART_IRQHandler(&ext_uart); +} + + diff --git a/RTE/Hesso_pack/ext_uart.h b/RTE/Hesso_pack/ext_uart.h new file mode 100644 index 0000000..a892f70 --- /dev/null +++ b/RTE/Hesso_pack/ext_uart.h @@ -0,0 +1,44 @@ +/************************************************************************//** + * \file ext_uart.h + * \brief Function to use the extension uart + * \author pascal (dot) sartoretti (at) hevs (dot) ch + ***************************************************************************/ + + +#ifndef __EXT_UART_H +#define __EXT_UART_H + +#include +#include "stm32f7xx_hal.h" + +extern UART_HandleTypeDef ext_uart; // extension uart handle + +/************************************************************************//** + * \brief Inits the extension uart + * \param speed This si the uart speed selected for example 115200. + * The extension uart could be use with or without interrupts. + * + * Without interrupts: + * ------------------- + * To send something on the uart, you have to use HAL_UART_Transmit function + * as the example below. + * error = HAL_UART_Transmit(&ext_uart, msg, sizeof(msg),50); + * To receive you have to use HAL_UART_Receive as example below. + * error = HAL_UART_Receive(&ext_uart, msg, sizeof(msg),HAL_MAX_DELAY); + * The HAL_MAX_DELAY waits until receive is finished. + * + * With interrupts: + * ---------------- + * The functions below have to be used: + * HAL_UART_Transmit_IT(&ext_uart," Welcome\n\r", 10); + * HAL_UART_Receive_IT(&ext_uart,data,8); + * + * The callback functions above could be implemented for usage on interrupt + * mode when the full size is transmitted (or received). + * void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) + * void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) + * + ***************************************************************************/ +extern void Ext_UART_Init(uint32_t speed); + +#endif /* __BOARD_LED_H */ diff --git a/RTE/_Target_1/RTE_Components.h b/RTE/_Target_1/RTE_Components.h new file mode 100644 index 0000000..cf9b473 --- /dev/null +++ b/RTE/_Target_1/RTE_Components.h @@ -0,0 +1,61 @@ + +/* + * Auto generated Run-Time-Environment Configuration File + * *** Do not modify ! *** + * + * Project: 'tokenring_project' + * Target: 'Target 1' + */ + +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + + +/* + * Define the Device Header File: + */ +#define CMSIS_device_header "stm32f7xx.h" + +/* ARM::CMSIS:RTOS2:Keil RTX5:Source:5.5.4 */ +#define RTE_CMSIS_RTOS2 /* CMSIS-RTOS2 */ + #define RTE_CMSIS_RTOS2_RTX5 /* CMSIS-RTOS2 Keil RTX5 */ + #define RTE_CMSIS_RTOS2_RTX5_SOURCE /* CMSIS-RTOS2 Keil RTX5 Source */ +/* Keil.ARM Compiler::Compiler:Event Recorder:DAP:1.5.1 */ +#define RTE_Compiler_EventRecorder + #define RTE_Compiler_EventRecorder_DAP +/* Keil.ARM Compiler::Compiler:I/O:STDOUT:ITM:1.2.0 */ +#define RTE_Compiler_IO_STDOUT /* Compiler I/O: STDOUT */ + #define RTE_Compiler_IO_STDOUT_ITM /* Compiler I/O: STDOUT ITM */ +/* Keil::CMSIS Driver:I2C:1.9.0 */ +#define RTE_Drivers_I2C1 /* Driver I2C1 */ + #define RTE_Drivers_I2C2 /* Driver I2C2 */ + #define RTE_Drivers_I2C3 /* Driver I2C3 */ + #define RTE_Drivers_I2C4 /* Driver I2C4 */ +/* Keil::CMSIS Driver:SAI:1.5.0 */ +#define RTE_Drivers_SAI1 /* Driver SAI1 */ + #define RTE_Drivers_SAI2 /* Driver SAI2 */ +/* Keil::Device:STM32Cube Framework:Classic:1.2.7 */ +#define RTE_DEVICE_FRAMEWORK_CLASSIC +/* Keil::Device:STM32Cube HAL:Common:1.2.7 */ +#define RTE_DEVICE_HAL_COMMON +/* Keil::Device:STM32Cube HAL:Cortex:1.2.7 */ +#define RTE_DEVICE_HAL_CORTEX +/* Keil::Device:STM32Cube HAL:DMA:1.2.7 */ +#define RTE_DEVICE_HAL_DMA +/* Keil::Device:STM32Cube HAL:GPIO:1.2.7 */ +#define RTE_DEVICE_HAL_GPIO +/* Keil::Device:STM32Cube HAL:PWR:1.2.7 */ +#define RTE_DEVICE_HAL_PWR +/* Keil::Device:STM32Cube HAL:RCC:1.2.7 */ +#define RTE_DEVICE_HAL_RCC +/* Keil::Device:STM32Cube HAL:SDRAM:1.2.7 */ +#define RTE_DEVICE_HAL_SDRAM +/* Keil::Device:STM32Cube HAL:SPI:1.2.7 */ +#define RTE_DEVICE_HAL_SPI +/* Keil::Device:STM32Cube HAL:UART:1.2.7 */ +#define RTE_DEVICE_HAL_UART +/* Keil::Device:Startup:1.2.4 */ +#define RTE_DEVICE_STARTUP_STM32F7XX /* Device Startup for STM32F7 */ + + +#endif /* RTE_COMPONENTS_H */ diff --git a/RTE/uGFX_library/gfxconf.h b/RTE/uGFX_library/gfxconf.h new file mode 100644 index 0000000..449bb8b --- /dev/null +++ b/RTE/uGFX_library/gfxconf.h @@ -0,0 +1,473 @@ +/** + * This file has a different license to the rest of the uGFX system. + * You can copy, modify and distribute this file as you see fit. + * You do not need to publish your source modifications to this file. + * The only thing you are not permitted to do is to relicense it + * under a different license. + */ + +/** + * Copy this file into your project directory and rename it as gfxconf.h + * Edit your copy to turn on the uGFX features you want to use. + * The values below are the defaults. + * + * Only remove the comments from lines where you want to change the + * default value. This allows definitions to be included from + * driver makefiles when required and provides the best future + * compatibility for your project. + * + * Please use spaces instead of tabs in this file. + */ +//* <<< Use Configuration Wizard in Context Menu >>> +#ifndef _GFXCONF_H +#define _GFXCONF_H +// uGFX configuration with RTX5 operating system. +// Full documentation available at: https://wiki.ugfx.io +#define CONF_WIZ_OS 1 +/////////////////////////////////////////////////////////////////////////// +// GOS - One of these must be defined, preferably in your Makefile // +/////////////////////////////////////////////////////////////////////////// +//#define GFX_USE_OS_CHIBIOS FALSE +//#define GFX_USE_OS_FREERTOS FALSE +// #define GFX_FREERTOS_USE_TRACE FALSE +//#define GFX_USE_OS_WIN32 FALSE +//#define GFX_USE_OS_LINUX FALSE +//#define GFX_USE_OS_OSX FALSE +//#define GFX_USE_OS_ECOS FALSE +//#define GFX_USE_OS_RAWRTOS TRUE +//#define GFX_USE_OS_ARDUINO FALSE +//#define GFX_USE_OS_KEIL TRUE +//#define GFX_USE_OS_CMSIS FALSE +//#define GFX_USE_OS_CMSIS2 FALSE +#if CONF_WIZ_OS == 0 + #define GFX_USE_OS_RAW32 TRUE + #define GFX_USE_OS_RTX5 FALSE + #define GFX_OS_PRE_INIT_FUNCTION Raw32OSInit + #define GFX_OS_INIT_NO_WARNING TRUE +#else + #define GFX_USE_OS_RAW32 FALSE + #define GFX_USE_OS_RTX5 TRUE + #define GFX_OS_INIT_NO_WARNING TRUE +#endif +//#define GFX_USE_OS_ZEPHYR FALSE +//#define GFX_USE_OS_NIOS FALSE +//#define GFX_USE_OS_QT FALSE +// #define INTERRUPTS_OFF() optional_code +// #define INTERRUPTS_ON() optional_code + +// Options that (should where relevant) apply to all operating systems +// #define GFX_NO_INLINE FALSE + #define GFX_COMPILER GFX_COMPILER_KEIL +// #define GFX_SHOW_COMPILER FALSE + #define GFX_CPU GFX_CPU_CORTEX_M7 +// #define GFX_CPU_NO_ALIGNMENT_FAULTS FALSE +// #define GFX_CPU_ENDIAN GFX_CPU_ENDIAN_UNKNOWN +// GFX heap size (in bytes), min. 32000 + + #define GFX_OS_HEAP_SIZE 60000 + #define GFX_OS_NO_INIT TRUE +// #define GFX_OS_EXTRA_INIT_FUNCTION myOSInitRoutine +// #define GFX_OS_EXTRA_DEINIT_FUNCTION myOSDeInitRoutine +// #define GFX_OS_CALL_UGFXMAIN FALSE +// #define GFX_OS_UGFXMAIN_STACKSIZE 0 +// #define GFX_EMULATE_MALLOC FALSE +// LCD orientartion <0=> Board orientation +// <90=> 90 degree rotate +// <180=> 180 degree rotate (default laboratory) +// <270=> 270 degree rotate +#define GDISP_DEFAULT_ORIENTATION 180 // If not defined the native hardware orientation is used. + +/////////////////////////////////////////////////////////////////////////// +// GDISP // +/////////////////////////////////////////////////////////////////////////// +// GDISP configuration +#define GFX_USE_GDISP 1 +#define GDISP_NEED_CONTROL 1 // always because LCD is 180 degree +// Use of draw circle functions +#define GDISP_NEED_CIRCLE 1 +// Use of draw circle into circle +#define GDISP_NEED_DUALCIRCLE 0 +// Use of draw ellipse functions +#define GDISP_NEED_ELLIPSE 0 +// Use of draw arc functions +#define GDISP_NEED_ARC 0 +// Use of draw arc sectors functions +#define GDISP_NEED_ARCSECTORS 0 +// Use of draw convex polygon functions +#define GDISP_NEED_CONVEX_POLYGON 0 +// Use of scrolling functions +#define GDISP_NEED_SCROLL 0 +// Use of read pixel functions +#define GDISP_NEED_PIXELREAD 1 +//#define GDISP_NEED_QUERY FALSE +#define GDISP_NEED_MULTITHREAD 1 +//#define GDISP_NEED_STREAMING FALSE +//#define GDISP_NEED_AUTOFLUSH FALSE +//#define GDISP_NEED_TIMERFLUSH FALSE + +// Control LCD boundaries +#define GDISP_NEED_VALIDATION 0 +#define GDISP_NEED_CLIP TRUE +// Text usage +#define GDISP_NEED_TEXT 1 + +// Text word wrap + #define GDISP_NEED_TEXT_WORDWRAP 1 +// #define GDISP_NEED_TEXT_BOXPADLR 1 +// #define GDISP_NEED_TEXT_BOXPADTB 1 +// Text antialiasing + #define GDISP_NEED_ANTIALIAS 1 +// Text UTF8 + #define GDISP_NEED_UTF8 1 +// Text kerning + #define GDISP_NEED_TEXT_KERNING 1 + +// Fonts (use one at least) +#define FOR_CONF_WIZARD 1 +// Font ui1 + #define GDISP_INCLUDE_FONT_UI1 0 +// Font ui2 + #define GDISP_INCLUDE_FONT_UI2 1 // The smallest preferred font. +// Font Largenumbers + #define GDISP_INCLUDE_FONT_LARGENUMBERS 0 +// Font DejaVuSans10 + #define GDISP_INCLUDE_FONT_DEJAVUSANS10 0 +// Font DejaVuSans12 + #define GDISP_INCLUDE_FONT_DEJAVUSANS12 0 +// Font DejaVuSans16 + #define GDISP_INCLUDE_FONT_DEJAVUSANS16 0 +// Font DejaVuSans20 + #define GDISP_INCLUDE_FONT_DEJAVUSANS20 0 +// Font DejaVuSans24 + #define GDISP_INCLUDE_FONT_DEJAVUSANS24 0 +// Font DejaVuSans32 + #define GDISP_INCLUDE_FONT_DEJAVUSANS32 0 +// Font DejaVuSansBold12 + #define GDISP_INCLUDE_FONT_DEJAVUSANSBOLD12 0 +// Font Fixed_10x20 + #define GDISP_INCLUDE_FONT_FIXED_10X20 0 +// Font Fixed_7x14 + #define GDISP_INCLUDE_FONT_FIXED_7X14 0 +// Font Fixed_5x8 + #define GDISP_INCLUDE_FONT_FIXED_5X8 0 +// Font DejaVuSans12_aa + #define GDISP_INCLUDE_FONT_DEJAVUSANS12_AA 1 +// Font DejaVuSans16_aa + #define GDISP_INCLUDE_FONT_DEJAVUSANS16_AA 1 +// Font DejaVuSans20_aa + #define GDISP_INCLUDE_FONT_DEJAVUSANS20_AA 0 +// Font Dejavusans24_aa + #define GDISP_INCLUDE_FONT_DEJAVUSANS24_AA 0 +// Font DejaVuSans32_aa + #define GDISP_INCLUDE_FONT_DEJAVUSANS32_AA 0 +// Font DejaVuSansBold12_aa + #define GDISP_INCLUDE_FONT_DEJAVUSANSBOLD12_AA 0 +// Font user + #define GDISP_INCLUDE_USER_FONTS 1 +// +// +// Image usage +#define GDISP_NEED_IMAGE 1 +// Image bitmap (BMP) + #define GDISP_NEED_IMAGE_BMP 1 +// Bitmap 1 bit + #define GDISP_NEED_IMAGE_BMP_1 0 +// Bitmap 4 bits + #define GDISP_NEED_IMAGE_BMP_4 0 +// Bitmap 4 bits RLE compressed + #define GDISP_NEED_IMAGE_BMP_4_RLE 1 +// Bitmap 8 bits + #define GDISP_NEED_IMAGE_BMP_8 0 +// Bitmap 8 bits RLE compressed + #define GDISP_NEED_IMAGE_BMP_8_RLE 1 +// Bitmap 16 bits + #define GDISP_NEED_IMAGE_BMP_16 0 +// Bitmap 24 bits + #define GDISP_NEED_IMAGE_BMP_24 0 +// Bitmap 32 bits + #define GDISP_NEED_IMAGE_BMP_32 0 + #define GDISP_IMAGE_BMP_BLIT_BUFFER_SIZE 32 +// +// Image GIF + #define GDISP_NEED_IMAGE_GIF 0 + #define GDISP_IMAGE_GIF_BLIT_BUFFER_SIZE 32 +// Image JPG + #define GDISP_NEED_IMAGE_JPG 0 +// Image PNG + #define GDISP_NEED_IMAGE_PNG 0 +// PDG interlaced + #define GDISP_NEED_IMAGE_PNG_INTERLACED 0 +// PDG transparency + #define GDISP_NEED_IMAGE_PNG_TRANSPARENCY 1 +// PDG background + #define GDISP_NEED_IMAGE_PNG_BACKGROUND 1 +// #define GDISP_NEED_IMAGE_PNG_ALPHACLIFF 32 +// #define GDISP_NEED_IMAGE_PNG_PALETTE_124 TRUE +// #define GDISP_NEED_IMAGE_PNG_PALETTE_8 TRUE +// #define GDISP_NEED_IMAGE_PNG_GRAYSCALE_124 TRUE +// #define GDISP_NEED_IMAGE_PNG_GRAYSCALE_8 TRUE +// #define GDISP_NEED_IMAGE_PNG_GRAYSCALE_16 TRUE +// #define GDISP_NEED_IMAGE_PNG_GRAYALPHA_8 TRUE +// #define GDISP_NEED_IMAGE_PNG_GRAYALPHA_16 TRUE +// #define GDISP_NEED_IMAGE_PNG_RGB_8 TRUE +// #define GDISP_NEED_IMAGE_PNG_RGB_16 TRUE +// #define GDISP_NEED_IMAGE_PNG_RGBALPHA_8 TRUE +// #define GDISP_NEED_IMAGE_PNG_RGBALPHA_16 TRUE +// #define GDISP_IMAGE_PNG_BLIT_BUFFER_SIZE 32 +// #define GDISP_IMAGE_PNG_FILE_BUFFER_SIZE 8 +// #define GDISP_IMAGE_PNG_Z_BUFFER_SIZE 32768 +// +// #define GDISP_NEED_IMAGE_ACCOUNTING FALSE +// #define GDISP_NEED_IMAGE_NATIVE FALSE + +//#define GDISP_NEED_PIXMAP FALSE +// #define GDISP_NEED_PIXMAP_IMAGE FALSE + +//#define GDISP_LINEBUF_SIZE 128 +//#define GDISP_STARTUP_COLOR Black +#define GDISP_NEED_STARTUP_LOGO FALSE + +//#define GDISP_TOTAL_DISPLAYS 1 + +#define GDISP_DRIVER_LIST GDISPVMT_STM32LTDC +// #ifdef GDISP_DRIVER_LIST +// // For code and speed optimization define as TRUE or FALSE if all controllers have the same capability +// #define GDISP_HARDWARE_STREAM_WRITE FALSE +// #define GDISP_HARDWARE_STREAM_READ FALSE +// #define GDISP_HARDWARE_STREAM_POS FALSE +// #define GDISP_HARDWARE_DRAWPIXEL FALSE +// #define GDISP_HARDWARE_CLEARS FALSE +// #define GDISP_HARDWARE_FILLS FALSE +// #define GDISP_HARDWARE_BITFILLS FALSE +// #define GDISP_HARDWARE_SCROLL FALSE + #define GDISP_HARDWARE_PIXELREAD GFXON +// #define GDISP_HARDWARE_CONTROL FALSE +// #define GDISP_HARDWARE_QUERY FALSE +// #define GDISP_HARDWARE_CLIP FALSE + + #define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB565 +// #endif + +//#define GDISP_USE_GFXNET FALSE +// #define GDISP_GFXNET_PORT 13001 +// #define GDISP_GFXNET_CUSTOM_LWIP_STARTUP FALSE +// #define GDISP_DONT_WAIT_FOR_NET_DISPLAY FALSE +// #define GDISP_GFXNET_UNSAFE_SOCKETS FALSE +// +// +/////////////////////////////////////////////////////////////////////////// +// GWIN // +/////////////////////////////////////////////////////////////////////////// +// GWIN configuration +#define GFX_USE_GWIN 1 +// Use windows manager + #define GWIN_NEED_WINDOWMANAGER 1 +// Redraw imadiate + #define GWIN_REDRAW_IMMEDIATE 0 +// Redraw all windows in single operation + #define GWIN_REDRAW_SINGLEOP 1 +// Flashing widget support + #define GWIN_NEED_FLASHING 0 +// Flashing period + #define GWIN_FLASHING_PERIOD 250 +// +// Console support +#define GWIN_NEED_CONSOLE 1 +// Console history + #define GWIN_CONSOLE_HISTORY_ATCREATE 1 +// #define GWIN_CONSOLE_USE_HISTORY +// #define GWIN_CONSOLE_HISTORY_AVERAGING FALSE +// Use escape command for coloring + #define GWIN_CONSOLE_ESCSEQ 1 +// #define GWIN_CONSOLE_USE_BASESTREAM FALSE // chibios only +// Floating numbers support + #define GWIN_CONSOLE_USE_FLOAT 0 +// +//#define GWIN_NEED_GRAPH FALSE +//#define GWIN_NEED_GL3D FALSE +// Widget support +#define GWIN_NEED_WIDGET 1 +//#define GWIN_FOCUS_HIGHLIGHT_WIDTH 1 +// Label support + #define GWIN_NEED_LABEL 1 +// #define GWIN_LABEL_ATTRIBUTE FALSE +// Button support + #define GWIN_NEED_BUTTON 1 +// #define GWIN_BUTTON_LAZY_RELEASE FALSE +// Slider support + #define GWIN_NEED_SLIDER 0 +// #define GWIN_SLIDER_NOSNAP FALSE +// #define GWIN_SLIDER_DEAD_BAND 5 +// #define GWIN_SLIDER_TOGGLE_INC 20 +// Checkbox support + #define GWIN_NEED_CHECKBOX 1 +// Image support + #define GWIN_NEED_IMAGE 1 +// Image animation support + #define GWIN_NEED_IMAGE_ANIMATION 0 +// +// Radio button support + #define GWIN_NEED_RADIO 1 +// List support + #define GWIN_NEED_LIST 0 +// List image support + #define GWIN_NEED_LIST_IMAGES 0 +// + +// Progressbar support + #define GWIN_NEED_PROGRESSBAR 0 +// #define GWIN_PROGRESSBAR_AUTO FALSE +// Keyboard support + #define GWIN_NEED_KEYBOARD 0 +// #define GWIN_KEYBOARD_DEFAULT_LAYOUT VirtualKeyboard_English1 +// #define GWIN_NEED_KEYBOARD_ENGLISH1 TRUE +// Text edit support + #define GWIN_NEED_TEXTEDIT 0 +// #define GWIN_FLAT_STYLING FALSE +// Widgets tag support + #define GWIN_WIDGET_TAGS 1 +// Containers support + #define GWIN_NEED_CONTAINERS 1 +// Need container support + #define GWIN_NEED_CONTAINER 1 +// Frame support + #define GWIN_NEED_FRAME 0 +// Tabset support (see details) + #define GWIN_NEED_TABSET 0 +// #define GWIN_TABSET_TABHEIGHT 18 +// + +/////////////////////////////////////////////////////////////////////////// +// GTRANS // +/////////////////////////////////////////////////////////////////////////// +//#define GFX_USE_GTRANS FALSE + + +/////////////////////////////////////////////////////////////////////////// +// GEVENT // +/////////////////////////////////////////////////////////////////////////// +// GEVENT configuration +#define GFX_USE_GEVENT 1 + +//#define GEVENT_ASSERT_NO_RESOURCE FALSE +// Maximum size of an event (in bytes) +#define GEVENT_MAXIMUM_SIZE 32 +// Maximum Source/Listener pair +#define GEVENT_MAX_SOURCE_LISTENERS 32 + +// +/////////////////////////////////////////////////////////////////////////// +// GTIMER // +/////////////////////////////////////////////////////////////////////////// +#define GFX_USE_GTIMER 1 + +#define GTIMER_THREAD_PRIORITY HIGH_PRIORITY +#define GTIMER_THREAD_WORKAREA_SIZE 4096 + + +/////////////////////////////////////////////////////////////////////////// +// GQUEUE // +/////////////////////////////////////////////////////////////////////////// +#define GFX_USE_GQUEUE TRUE + +#define GQUEUE_NEED_ASYNC TRUE +//#define GQUEUE_NEED_GSYNC FALSE +//#define GQUEUE_NEED_FSYNC FALSE +//#define GQUEUE_NEED_BUFFERS FALSE + +/////////////////////////////////////////////////////////////////////////// +// GINPUT // +/////////////////////////////////////////////////////////////////////////// +// GINPUT configuration +#define GFX_USE_GINPUT 1 + +// Mouse / touchscreen support +#define GINPUT_NEED_MOUSE 1 +// #define GINPUT_TOUCH_STARTRAW FALSE + +// #define GINPUT_TOUCH_NOTOUCH FALSE +// #define GINPUT_TOUCH_NOCALIBRATE FALSE +#define GINPUT_TOUCH_NOCALIBRATE_GUI TRUE +// #define GINPUT_MOUSE_POLL_PERIOD 25 +// #define GINPUT_MOUSE_CLICK_TIME 300 +// #define GINPUT_TOUCH_CXTCLICK_TIME 700 +// #define GINPUT_TOUCH_USER_CALIBRATION_LOAD FALSE +// #define GINPUT_TOUCH_USER_CALIBRATION_SAVE FALSE + #define GMOUSE_DRIVER_LIST GMOUSEVMT_FT5336 +// Keyboard support +#define GINPUT_NEED_KEYBOARD 0 +// #define GINPUT_KEYBOARD_POLL_PERIOD 200 +// #define GKEYBOARD_DRIVER_LIST GKEYBOARDVMT_Win32, GKEYBOARDVMT_Win32 +// #define GKEYBOARD_LAYOUT_OFF FALSE +// #define GKEYBOARD_LAYOUT_SCANCODE2_US FALSE +//#define GINPUT_NEED_TOGGLE FALSE +//#define GINPUT_NEED_DIAL FALSE +// + + +/////////////////////////////////////////////////////////////////////////// +// GFILE // +/////////////////////////////////////////////////////////////////////////// +// GFILE configuration +#define GFX_USE_GFILE 1 +// String support +#define GFILE_NEED_STRINGS 0 +// printfg, fprintg, etc support +#define GFILE_NEED_PRINTG 0 +// scang, fscang, etc support +#define GFILE_NEED_SCANG 0 +// +//#define GFILE_NEED_FILELISTS FALSE +//#define GFILE_NEED_STDIO FALSE +//#define GFILE_NEED_NOAUTOMOUNT FALSE +//#define GFILE_NEED_NOAUTOSYNC FALSE + +//#define GFILE_NEED_MEMFS FALSE +// ROM file system support +#define GFILE_NEED_ROMFS 1 +// RAM file system support +#define GFILE_NEED_RAMFS 0 +//#define GFILE_NEED_FATFS FALSE +//#define GFILE_NEED_NATIVEFS FALSE +//#define GFILE_NEED_CHBIOSFS FALSE +//#define GFILE_NEED_USERFS FALSE + +//#define GFILE_ALLOW_FLOATS FALSE +//#define GFILE_ALLOW_DEVICESPECIFIC FALSE +// Maximum number of files +#define GFILE_MAX_GFILES 6 +// + +/////////////////////////////////////////////////////////////////////////// +// GADC // +/////////////////////////////////////////////////////////////////////////// +//#define GFX_USE_GADC FALSE +// #define GADC_MAX_LOWSPEED_DEVICES 4 + +/////////////////////////////////////////////////////////////////////////// +// GAUDIO // +/////////////////////////////////////////////////////////////////////////// +//#define GFX_USE_GAUDIO FALSE +// #define GAUDIO_NEED_PLAY FALSE +// #define GAUDIO_NEED_RECORD FALSE + +/////////////////////////////////////////////////////////////////////////// +// GMISC // +/////////////////////////////////////////////////////////////////////////// +// GMISC configuration (see details in file) +#define GFX_USE_GMISC 0 + +//#define GMISC_NEED_ARRAYOPS FALSE +//#define GMISC_NEED_FASTTRIG FALSE +//#define GMISC_NEED_FIXEDTRIG FALSE +//#define GMISC_NEED_INVSQRT FALSE +// #define GMISC_INVSQRT_MIXED_ENDIAN FALSE +// #define GMISC_INVSQRT_REAL_SLOW FALSE +#define GMISC_NEED_MATRIXFLOAT2D 0 +//#define GMISC_NEED_MATRIXFIXED2D FALSE +//#define GMISC_NEED_HITTEST_POLY FALSE +// +// + + +#endif /* _GFXCONF_H */ diff --git a/RTE/uGFX_library/stm32f7_i2c.c b/RTE/uGFX_library/stm32f7_i2c.c new file mode 100644 index 0000000..44baba1 --- /dev/null +++ b/RTE/uGFX_library/stm32f7_i2c.c @@ -0,0 +1,82 @@ +#include "gfx.h" + +#include "stm32f7_i2c.h" +#include "Driver_I2C.h" + +/* I2C Driver */ +extern ARM_DRIVER_I2C Driver_I2C3; +static ARM_DRIVER_I2C * I2Cdrv = &Driver_I2C3; + + +#ifndef EEPROM_I2C_PORT +#define EEPROM_I2C_PORT 3 /* I2C Port number */ +#endif + + +#define A_WR 0 /* Master will write to the I2C */ +#define A_RD 1 /* Master will read from the I2C */ + +static uint8_t wr_buf[256]; +uint8_t gI2CAccess = 0; +bool_t i2cInit(I2C_TypeDef* i2c) +{ + gI2CAccess = 1; + I2Cdrv->Initialize (NULL); + I2Cdrv->PowerControl (ARM_POWER_FULL); + I2Cdrv->Control (ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_STANDARD); + I2Cdrv->Control (ARM_I2C_BUS_CLEAR, 0); + gI2CAccess = 0; + + + return 1; // just says no error +} + + +void i2cWriteReg(I2C_TypeDef* i2c, uint8_t slaveAddr, uint8_t regAddr, uint8_t value) +{ + wr_buf[0] = regAddr; + wr_buf[1] = value; + gI2CAccess = 1; + + I2Cdrv->MasterTransmit (slaveAddr/2, wr_buf, 2, false); + while (I2Cdrv->GetStatus().busy); + if (I2Cdrv->GetDataCount () != 2) return; + /* Acknowledge polling */ + gI2CAccess = 0; + +// do { +// I2Cdrv->MasterReceive (DeviceAddr, &wr_buf[0], 1, false); +// while (I2Cdrv->GetStatus().busy); +// } while (I2Cdrv->GetDataCount () < 0); + +} + +uint8_t i2cReadByte(I2C_TypeDef* i2c, uint8_t slaveAddr, uint8_t regAddr) +{ + uint8_t ret = 0; + gI2CAccess = 1; + + I2Cdrv->MasterTransmit (slaveAddr/2, ®Addr, 1, true); + while (I2Cdrv->GetStatus().busy); + I2Cdrv->MasterReceive (slaveAddr/2, &ret, 1, false); + while (I2Cdrv->GetStatus().busy); + if (I2Cdrv->GetDataCount () != 1) return 0xAA; + gI2CAccess = 0; + + return ret; +} + +uint16_t i2cReadWord(I2C_TypeDef* i2c, uint8_t slaveAddr, uint8_t regAddr) +{ + uint8_t ret[2] = { 0, 0 }; + gI2CAccess = 1; + + I2Cdrv->MasterTransmit (slaveAddr/2, ®Addr, 1, true); + while (I2Cdrv->GetStatus().busy); + I2Cdrv->MasterReceive (slaveAddr/2, ret, 2, false); + while (I2Cdrv->GetStatus().busy); + if (I2Cdrv->GetDataCount () != 2) return 0xAAAA; + gI2CAccess = 0; + + return (uint16_t)((ret[0] << 8) | (ret[1] & 0x00FF)); +} diff --git a/audio.c b/audio.c new file mode 100644 index 0000000..3c7cbf5 --- /dev/null +++ b/audio.c @@ -0,0 +1,74 @@ +////////////////////////////////////////////////////////////////////////////////// +/// \file audio.c +/// \brief Audio thread +/// \author Pascal Sartoretti (sap at hevs dot ch) +/// \version 1.0 - original +/// \date 2018-02 +////////////////////////////////////////////////////////////////////////////////// +#include "stm32f7xx_hal.h" + +#include +#include "main.h" +#include "audio_msg.c" +#include "audio_error.c" +#include "audio_clock.c" +#include "Board_Audio.h" + +extern uint8_t gI2CAccess; + +////////////////////////////////////////////////////////////////////////////////// +// THREAD AUDIO +////////////////////////////////////////////////////////////////////////////////// +void AudioPlayer(void *argument) +{ + int32_t eventFlag; // current flag + + //------------------------------------------------------------------------------ + // Initialize the audio interface (need to be intialised first) + // this thread has a most important priority and block kernel switch when + // intilalising the audio interface + //------------------------------------------------------------------------------ + while(gI2CAccess != 0){} + osKernelLock(); + Audio_Initialize (NULL); + Audio_SetDataFormat(AUDIO_STREAM_OUT, AUDIO_DATA_16_MONO); + Audio_SetFrequency (AUDIO_STREAM_OUT,16000); + Audio_SetMute (AUDIO_STREAM_OUT, AUDIO_CHANNEL_MASTER, false); + Audio_SetVolume (AUDIO_STREAM_OUT, AUDIO_CHANNEL_MASTER, 50); + Audio_Start (AUDIO_STREAM_OUT); + //------------------------------------------------------------------------------ + // Bacause of audio initialize use the I2C interrupts and the uGFX touch + // protocol don't use it, we neeed to clear this register +// I2C3->CR1 = 0; + osKernelUnlock(); + + //------------------------------------------------------------------------------ + while (1) // forever + { + //---------------------------------------------------------------------------- + // EVENT GET wait always (AUDIO_xxx_EVT) + //---------------------------------------------------------------------------- + eventFlag = osEventFlagsWait( + eventFlag_id, + AUDIO_MSG_EVT | AUDIO_ERROR_EVT| AUDIO_CLOCK_EVT, + osFlagsWaitAny, + osWaitForever); + if(eventFlag < 0) // case of error + CheckRetCode(eventFlag,__LINE__,__FILE__,CONTINUE); + //---------------------------------------------------------------------------- + if((eventFlag & AUDIO_MSG_EVT) == AUDIO_MSG_EVT) // play incoming message + { + Audio_SendData(audio_msg, sizeof(audio_msg)/2); + } + if((eventFlag & AUDIO_ERROR_EVT) == AUDIO_ERROR_EVT) // play error message + { + Audio_SendData(audio_error, sizeof(audio_error)/2); + } + if((eventFlag & AUDIO_CLOCK_EVT) == AUDIO_CLOCK_EVT) // play clock message + { + Audio_SendData(audio_clock, sizeof(audio_clock)/2); + } + } +} + + diff --git a/audio_clock.c b/audio_clock.c new file mode 100644 index 0000000..ecc700f --- /dev/null +++ b/audio_clock.c @@ -0,0 +1,392 @@ +#include "stm32f7xx_hal.h" + +const uint16_t audio_clock[]={ +65497, 65481, 65477, 65474, 65473, 65466, 65458, 65451, +65448, 65460, 65476, 65504, 65534, 29, 53, 70, + 64, 53, 21, 65530, 65509, 65503, 65518, 65531, + 28, 34, 45, 28, 8, 65516, 65503, 65497, +65516, 2, 31, 40, 45, 25, 5, 65515, +65490, 65472, 65446, 65429, 65401, 65380, 65358, 65342, +65341, 65347, 65368, 65396, 65425, 65449, 65464, 65463, +65468, 65462, 65472, 65483, 65498, 65513, 65513, 65508, +65485, 65462, 65427, 65406, 65388, 65390, 65416, 65455, +65508, 35, 74, 124, 142, 165, 173, 182, + 178, 167, 144, 115, 80, 53, 23, 8, +65528, 65520, 65512, 65507, 65510, 65513, 65524, 65533, +65530, 65529, 65507, 65492, 65465, 65448, 65426, 65418, +65410, 65413, 65418, 65428, 65433, 65439, 65438, 65438, +65432, 65435, 65420, 65428, 65420, 65437, 65455, 65486, +65523, 26, 72, 118, 175, 227, 275, 307, + 311, 286, 230, 147, 59, 65500, 65434, 65396, +65399, 65443, 65506, 56, 138, 227, 299, 363, + 397, 400, 362, 293, 189, 93, 65518, 65438, +65365, 65310, 65274, 65254, 65255, 65285, 65330, 65393, +65456, 65517, 38, 79, 112, 127, 130, 126, + 125, 135, 159, 188, 213, 215, 201, 162, + 119, 78, 50, 36, 35, 43, 48, 54, + 56, 58, 71, 94, 123, 154, 170, 164, + 144, 110, 83, 65, 61, 59, 58, 36, + 2, 65493, 65438, 65399, 65366, 65352, 65356, 65368, +65392, 65422, 65455, 65498, 2, 40, 61, 67, + 50, 25, 65534, 65514, 65508, 65497, 65490, 65469, +65447, 65429, 65413, 65417, 65420, 65436, 65451, 65474, +65506, 4, 49, 88, 126, 159, 177, 190, + 181, 158, 121, 76, 36, 2, 65514, 65493, +65468, 65438, 65391, 65354, 65308, 65307, 65321, 65379, +65448, 65510, 24, 46, 65, 79, 119, 153, + 203, 217, 192, 106, 65487, 65277, 65047, 64830, +64684, 64624, 64668, 64793, 64975, 65195, 65415, 98, + 282, 425, 514, 537, 504, 406, 270, 116, +65501, 65400, 65317, 65285, 65243, 65208, 65157, 65134, +65124, 65172, 65229, 65316, 65381, 65452, 65481, 65504, +65484, 65469, 65457, 65488, 15, 81, 106, 65, +65488, 65351, 65225, 65151, 65128, 65157, 65217, 65295, +65379, 65429, 65441, 65403, 65364, 65354, 65426, 8, + 141, 227, 235, 187, 113, 66, 61, 93, + 148, 187, 180, 114, 65504, 65331, 65173, 65108, +65172, 65354, 62, 289, 428, 453, 374, 230, + 82, 65522, 65506, 46, 157, 246, 249, 148, +65521, 65367, 65286, 65310, 65407, 65530, 81, 97, + 35, 65454, 65336, 65275, 65340, 3, 296, 598, + 787, 799, 632, 346, 63, 65404, 65347, 65419, + 20, 148, 207, 162, 38, 65419, 65300, 65274, +65347, 65506, 159, 339, 468, 544, 559, 546, + 519, 515, 545, 600, 655, 658, 577, 401, + 154, 65415, 65168, 64996, 64919, 64965, 65093, 65276, +65448, 16, 47, 5, 65492, 65474, 65513, 65, + 159, 218, 211, 131, 65530, 65372, 65231, 65147, +65140, 65204, 65326, 65462, 69, 199, 325, 455, + 582, 697, 778, 801, 766, 657, 508, 313, + 126, 65481, 65344, 65238, 65165, 65119, 65088, 65088, +65105, 65169, 65243, 65339, 65411, 65451, 65440, 65374, +65281, 65181, 65123, 65106, 65140, 65181, 65211, 65207, +65190, 65188, 65245, 65365, 4, 203, 367, 495, + 543, 535, 479, 395, 308, 227, 164, 96, + 39, 65504, 65441, 65396, 65372, 65379, 65395, 65427, +65449, 65484, 65523, 37, 99, 150, 186, 183, + 127, 33, 65421, 65266, 65124, 65021, 64989, 65007, +65069, 65148, 65225, 65299, 65375, 65463, 33, 150, + 271, 386, 478, 544, 544, 483, 333, 130, +65448, 65251, 65136, 65070, 65065, 65054, 65034, 64993, +64966, 64978, 65055, 65184, 65357, 65533, 163, 293, + 369, 395, 354, 270, 146, 22, 65435, 65334, +65247, 65172, 65122, 65095, 65122, 65193, 65322, 65483, + 132, 319, 494, 636, 724, 745, 680, 553, + 369, 160, 65487, 65276, 65092, 64923, 64792, 64701, +64660, 64668, 64722, 64820, 64956, 65122, 65308, 65495, + 141, 294, 413, 481, 489, 436, 330, 205, + 88, 13, 65510, 65502, 65499, 65496, 65497, 65519, + 37, 131, 242, 373, 489, 601, 662, 678, + 616, 500, 352, 208, 100, 26, 65509, 65462, +65399, 65339, 65287, 65252, 65257, 65288, 65357, 65446, +65521, 21, 65518, 65413, 65277, 65175, 65155, 65230, +65376, 65522, 92, 120, 82, 19, 65508, 65505, + 24, 104, 182, 215, 192, 133, 82, 87, + 161, 286, 395, 439, 367, 199, 65507, 65296, +65157, 65138, 65230, 65420, 92, 270, 356, 345, + 265, 168, 98, 76, 82, 75, 52, 65523, +65471, 65433, 65436, 65467, 65515, 14, 36, 13, +65487, 65373, 65227, 65100, 65046, 65122, 65335, 110, + 427, 644, 687, 514, 176, 65252, 64776, 64343, +64017, 63832, 63802, 63932, 64197, 64582, 65028, 65522, + 485, 961, 1384, 1680, 1789, 1667, 1307, 793, + 231, 65277, 64941, 64762, 64704, 64711, 64734, 64765, +64811, 64883, 65007, 65178, 65403, 120, 352, 524, + 577, 524, 397, 263, 184, 147, 120, 28, +65369, 65082, 64761, 64493, 64330, 64311, 64401, 64570, +64752, 64915, 65044, 65147, 65268, 65413, 59, 247, + 388, 471, 474, 445, 410, 398, 409, 421, + 413, 364, 284, 181, 74, 65531, 65483, 65488, +65535, 64, 148, 232, 353, 505, 690, 854, + 930, 871, 665, 365, 48, 65320, 65151, 65057, +65011, 64963, 64900, 64815, 64751, 64740, 64827, 65022, +65290, 44, 273, 379, 356, 220, 55, 65463, +65422, 65473, 45, 137, 161, 72, 65417, 65170, +64942, 64783, 64748, 64820, 65003, 65247, 3, 306, + 586, 818, 965, 1028, 1018, 964, 899, 838, + 787, 723, 641, 516, 363, 194, 43, 65487, +65465, 65524, 86, 170, 195, 108, 65479, 65273, +65121, 65098, 65230, 65488, 250, 473, 569, 507, + 377, 236, 172, 173, 206, 201, 101, 65447, +65184, 64922, 64723, 64625, 64677, 64837, 65090, 65348, + 28, 176, 268, 348, 465, 611, 772, 881, + 901, 819, 672, 491, 351, 257, 231, 260, + 305, 366, 409, 437, 451, 452, 445, 429, + 395, 339, 249, 134, 65521, 65373, 65229, 65110, +65019, 64935, 64849, 64750, 64646, 64585, 64587, 64685, +64859, 65078, 65291, 65472, 64, 131, 141, 95, + 6, 65441, 65353, 65304, 65298, 65331, 65380, 65439, +65509, 37, 104, 135, 143, 101, 50, 65524, +65490, 65487, 65517, 43, 134, 249, 376, 520, + 643, 753, 815, 823, 765, 637, 448, 215, +65496, 65245, 65016, 64837, 64731, 64704, 64758, 64863, +64971, 65056, 65077, 65064, 65022, 65008, 65022, 65083, +65160, 65229, 65261, 65232, 65165, 65057, 64978, 64924, +64944, 65008, 65109, 65216, 65322, 65427, 15, 149, + 293, 413, 487, 498, 454, 380, 306, 263, + 255, 280, 322, 359, 391, 409, 427, 438, + 446, 436, 406, 339, 257, 145, 48, 65497, +65444, 65421, 65405, 65374, 65302, 65182, 65047, 64931, +64892, 64936, 65050, 65176, 65252, 65257, 65181, 65083, +65004, 64988, 65045, 65139, 65247, 65322, 65363, 65388, +65431, 65533, 172, 405, 654, 860, 974, 970, + 863, 701, 534, 417, 359, 346, 349, 325, + 277, 202, 143, 116, 143, 207, 280, 344, + 372, 378, 360, 336, 308, 262, 199, 92, +65498, 65341, 65192, 65066, 64984, 64948, 64947, 64973, +65003, 65046, 65086, 65139, 65191, 65240, 65264, 65255, +65205, 65127, 65049, 65006, 65022, 65115, 65265, 65447, + 87, 232, 330, 395, 426, 448, 453, 438, + 401, 334, 251, 173, 114, 96, 128, 198, + 313, 442, 576, 688, 762, 788, 757, 681, + 561, 413, 252, 84, 65465, 65330, 65225, 65153, +65116, 65112, 65131, 65185, 65253, 65345, 65441, 65515, + 29, 17, 65506, 65416, 65322, 65235, 65177, 65143, +65128, 65117, 65096, 65075, 65046, 65049, 65081, 65175, +65316, 65503, 162, 343, 477, 563, 591, 596, + 569, 555, 539, 534, 538, 532, 528, 501, + 464, 403, 334, 255, 179, 110, 51, 65530, +65472, 65406, 65340, 65269, 65219, 65182, 65186, 65211, +65270, 65334, 65393, 65439, 65443, 65432, 65392, 65348, +65296, 65244, 65175, 65097, 65004, 64921, 64865, 64865, +64926, 65043, 65196, 65350, 65494, 70, 159, 228, + 289, 337, 379, 387, 372, 305, 215, 104, + 10, 65488, 65493, 17, 119, 230, 311, 359, + 366, 352, 338, 317, 300, 251, 182, 68, +65489, 65371, 65284, 65230, 65193, 65177, 65146, 65113, +65068, 65027, 65001, 64996, 65012, 65049, 65086, 65123, +65137, 65131, 65108, 65078, 65061, 65068, 65107, 65175, +65265, 65370, 65480, 53, 154, 226, 268, 261, + 207, 118, 20, 65472, 65433, 65442, 65496, 45, + 135, 221, 290, 348, 397, 444, 481, 512, + 511, 487, 426, 337, 235, 121, 16, 65460, +65383, 65330, 65291, 65274, 65264, 65269, 65282, 65302, +65331, 65359, 65385, 65405, 65415, 65416, 65413, 65407, +65401, 65394, 65382, 65367, 65347, 65339, 65334, 65359, +65391, 65459, 65527, 85, 171, 260, 336, 395, + 430, 441, 423, 393, 345, 311, 271, 271, + 276, 314, 366, 415, 463, 487, 496, 481, + 457, 423, 392, 346, 307, 241, 186, 117, + 63, 21, 65527, 65512, 65493, 65471, 65434, 65387, +65337, 65292, 65263, 65251, 65260, 65281, 65310, 65329, +65349, 65349, 65360, 65371, 65404, 65460, 65528, 74, + 136, 187, 203, 202, 181, 169, 150, 158, + 158, 172, 176, 181, 185, 190, 213, 244, + 287, 335, 369, 386, 371, 329, 264, 197, + 129, 85, 56, 39, 27, 2, 65499, 65454, +65400, 65360, 65329, 65312, 65296, 65284, 65256, 65235, +65205, 65192, 65189, 65198, 65209, 65211, 65200, 65164, +65132, 65093, 65093, 65113, 65179, 65261, 65359, 65442, +65502, 65531, 1, 65529, 65524, 65526, 2, 19, + 27, 30, 8, 65525, 65487, 65469, 65447, 65449, +65452, 65467, 65484, 65496, 65517, 65524, 6, 5, + 7, 65525, 65499, 65461, 65418, 65370, 65334, 65304, +65286, 65283, 65277, 65281, 65266, 65255, 65219, 65191, +65153, 65126, 65107, 65101, 65106, 65116, 65127, 65140, +65149, 65167, 65190, 65227, 65277, 65338, 65398, 65454, +65485, 65503, 65497, 65484, 65478, 65486, 65527, 55, + 138, 221, 296, 339, 359, 350, 330, 307, + 286, 273, 252, 229, 182, 126, 54, 65523, +65464, 65426, 65396, 65383, 65361, 65344, 65311, 65293, +65279, 65289, 65326, 65365, 65414, 65439, 65435, 65412, +65355, 65314, 65265, 65258, 65258, 65282, 65314, 65328, +65351, 65347, 65362, 65375, 65413, 65466, 4, 82, + 160, 223, 265, 288, 278, 262, 225, 203, + 183, 187, 203, 238, 267, 296, 307, 300, + 289, 265, 251, 243, 243, 244, 252, 243, + 240, 226, 210, 198, 178, 160, 133, 100, + 67, 37, 16, 7, 3, 3, 65531, 65512, +65485, 65452, 65433, 65423, 65443, 65473, 65515, 17, + 41, 47, 44, 33, 30, 42, 69, 112, + 166, 221, 278, 321, 366, 393, 419, 427, + 429, 410, 389, 348, 312, 267, 233, 205, + 186, 183, 180, 190, 188, 185, 157, 121, + 63, 3, 65484, 65441, 65426, 65430, 65453, 65484, +65510, 65515, 65509, 65470, 65433, 65381, 65343, 65314, +65303, 65305, 65320, 65338, 65369, 65399, 65437, 65479, +65528, 34, 84, 111, 132, 130, 105, 67, + 13, 65496, 65453, 65427, 65433, 65460, 65511, 33, + 87, 124, 136, 128, 109, 88, 86, 95, + 132, 163, 192, 189, 158, 91, 10, 65448, +65367, 65293, 65240, 65197, 65163, 65143, 65143, 65173, +65245, 65356, 65502, 111, 224, 269, 205, 37, +65296, 64953, 64611, 64327, 64189, 64242, 64507, 64960, +65522, 549, 990, 1204, 1137, 798, 271, 65202, +64674, 64310, 64197, 64317, 64627, 65050, 65499, 373, + 705, 923, 1031, 997, 840, 553, 176, 65311, +64942, 64710, 64634, 64749, 64999, 65321, 91, 312, + 414, 398, 305, 176, 52, 65502, 65441, 65425, +65421, 65442, 65485, 65534, 62, 104, 105, 51, +65461, 65289, 65096, 64928, 64818, 64797, 64857, 64992, +65166, 65356, 0, 160, 286, 390, 455, 495, + 496, 456, 380, 267, 139, 20, 65473, 65466, + 14, 192, 438, 681, 865, 891, 742, 402, +65496, 65053, 64747, 64670, 64870, 65283, 270, 741, + 1031, 1067, 856, 483, 65, 65256, 65035, 64951, +64939, 64950, 64923, 64876, 64836, 64881, 65045, 65346, + 172, 530, 759, 812, 675, 402, 90, 65382, +65268, 65319, 65491, 177, 360, 431, 361, 152, +65405, 65108, 64894, 64821, 64918, 65187, 25, 435, + 786, 998, 1042, 908, 651, 343, 51, 65378, +65254, 65231, 65248, 65306, 65348, 65406, 65466, 21, + 149, 289, 436, 528, 561, 499, 356, 155, +65464, 65257, 65107, 65037, 65066, 65181, 65354, 17, + 187, 297, 324, 264, 152, 16, 65435, 65361, +65325, 65323, 65318, 65301, 65265, 65239, 65250, 65333, +65498, 186, 426, 622, 710, 669, 500, 246, +65509, 65293, 65170, 65187, 65299, 65491, 144, 293, + 358, 337, 250, 133, 43, 65521, 13, 63, + 148, 200, 197, 125, 65533, 65365, 65219, 65103, +65058, 65071, 65124, 65194, 65244, 65275, 65274, 65267, +65267, 65298, 65355, 65441, 65517, 43, 49, 13, +65465, 65365, 65281, 65243, 65274, 65384, 14, 223, + 417, 584, 672, 687, 620, 491, 324, 141, +65493, 65332, 65185, 65082, 65004, 64992, 65027, 65145, +65319, 5, 240, 441, 567, 592, 489, 289, + 14, 65256, 64995, 64803, 64714, 64728, 64827, 64996, +65189, 65385, 23, 153, 235, 269, 249, 198, + 110, 16, 65451, 65362, 65297, 65251, 65242, 65254, +65287, 65336, 65378, 65419, 65439, 65447, 65439, 65434, +65429, 65452, 65484, 7, 64, 108, 132, 109, + 63, 65524, 65455, 65402, 65395, 65430, 65513, 87, + 199, 303, 365, 393, 367, 303, 201, 75, +65476, 65341, 65236, 65155, 65134, 65149, 65225, 65322, +65445, 17, 101, 139, 124, 56, 65489, 65372, +65257, 65181, 65141, 65160, 65218, 65317, 65434, 24, + 146, 257, 345, 422, 457, 475, 457, 411, + 346, 265, 177, 109, 52, 30, 31, 51, + 81, 113, 142, 161, 183, 190, 192, 167, + 104, 11, 65415, 65272, 65150, 65063, 65058, 65124, +65254, 65432, 64, 219, 311, 353, 337, 287, + 213, 135, 63, 65533, 65465, 65398, 65313, 65226, +65149, 65090, 65086, 65134, 65233, 65373, 65510, 105, + 190, 236, 237, 214, 170, 123, 70, 16, +65489, 65424, 65355, 65297, 65272, 65276, 65343, 65450, + 62, 217, 345, 426, 431, 371, 264, 133, + 17, 65463, 65411, 65387, 65395, 65401, 65424, 65437, +65451, 65479, 65506, 24, 79, 151, 208, 253, + 260, 229, 161, 64, 65497, 65403, 65343, 65320, +65337, 65381, 65434, 65488, 65530, 31, 60, 86, + 118, 139, 170, 179, 196, 198, 197, 202, + 190, 198, 188, 189, 186, 175, 168, 153, + 138, 125, 109, 91, 75, 46, 17, 65520, +65488, 65475, 65470, 65490, 65526, 30, 74, 111, + 134, 154, 148, 139, 103, 55, 65528, 65458, +65395, 65348, 65321, 65332, 65378, 65457, 37, 150, + 270, 353, 401, 403, 361, 292, 203, 105, + 15, 65459, 65387, 65320, 65271, 65248, 65251, 65293, +65371, 65480, 73, 202, 309, 387, 406, 383, + 299, 187, 45, 65447, 65317, 65228, 65158, 65132, +65121, 65144, 65173, 65231, 65293, 65378, 65462, 10, + 71, 97, 86, 32, 65503, 65429, 65386, 65374, +65402, 65462, 65530, 60, 104, 118, 107, 66, + 18, 65501, 65452, 65413, 65375, 65338, 65301, 65258, +65221, 65184, 65175, 65179, 65224, 65297, 65404, 65529, + 134, 255, 359, 418, 431, 393, 316, 203, + 87, 65495, 65402, 65314, 65276, 65253, 65280, 65319, +65397, 65475, 36, 113, 185, 225, 239, 231, + 194, 143, 85, 15, 65485, 65419, 65353, 65299, +65260, 65239, 65254, 65291, 65358, 65447, 5, 104, + 184, 245, 270, 268, 231, 184, 133, 85, + 67, 42, 44, 25, 7, 65515, 65471, 65438, +65395, 65372, 65345, 65339, 65333, 65354, 65380, 65437, +65499, 44, 120, 193, 253, 299, 331, 353, + 359, 356, 324, 275, 183, 69, 65462, 65316, +65181, 65081, 65036, 65054, 65137, 65269, 65441, 80, + 261, 404, 522, 592, 620, 602, 539, 441, + 304, 157, 65522, 65372, 65233, 65134, 65077, 65062, +65092, 65157, 65240, 65339, 65428, 65512, 46, 105, + 161, 202, 238, 256, 253, 231, 194, 146, + 109, 79, 71, 79, 97, 117, 125, 116, + 86, 33, 65513, 65448, 65407, 65377, 65373, 65392, +65417, 65462, 65505, 18, 75, 119, 162, 171, + 164, 112, 44, 65486, 65390, 65295, 65223, 65166, +65148, 65150, 65181, 65235, 65301, 65386, 65464, 16, + 81, 135, 164, 159, 138, 82, 21, 65485, +65424, 65363, 65329, 65301, 65299, 65313, 65347, 65397, +65465, 65531, 66, 112, 148, 150, 138, 102, + 62, 23, 65522, 65506, 65490, 65490, 65484, 65477, +65464, 65442, 65421, 65400, 65382, 65378, 65372, 65381, +65380, 65382, 65374, 65369, 65364, 65380, 65407, 65459, +65526, 62, 138, 198, 242, 258, 249, 211, + 151, 75, 65524, 65439, 65359, 65296, 65255, 65238, +65249, 65276, 65324, 65376, 65434, 65490, 11, 62, + 113, 157, 192, 219, 231, 235, 221, 210, + 181, 154, 117, 68, 15, 65488, 65430, 65380, +65359, 65356, 65388, 65435, 65490, 14, 53, 87, + 88, 91, 64, 53, 25, 21, 19, 37, + 59, 86, 102, 111, 100, 88, 67, 57, + 48, 55, 51, 58, 47, 45, 33, 35, + 35, 47, 60, 76, 87, 93, 84, 70, + 48, 28, 17, 8, 6, 65534, 65515, 65490, +65450, 65421, 65393, 65393, 65415, 65460, 65516, 38, + 76, 98, 85, 53, 4, 65484, 65432, 65386, +65355, 65334, 65329, 65327, 65343, 65356, 65388, 65421, +65466, 65512, 25, 70, 106, 131, 141, 136, + 121, 96, 62, 37, 3, 65521, 65503, 65494, +65495, 65494, 65500, 65501, 65502, 65491, 65490, 65474, +65479, 65474, 65489, 65500, 65528, 15, 46, 66, + 85, 87, 87, 75, 62, 40, 22, 65535, +65514, 65497, 65473, 65457, 65434, 65416, 65398, 65380, +65377, 65373, 65390, 65409, 65440, 65476, 65513, 15, + 50, 80, 103, 119, 124, 120, 111, 90, + 78, 64, 54, 54, 46, 49, 47, 47, + 55, 59, 63, 67, 57, 50, 32, 12, +65531, 65507, 65504, 65494, 65504, 65515, 65525, 6, + 10, 18, 18, 14, 14, 10, 20, 28, + 41, 52, 54, 53, 40, 29, 12, 5, +65530, 65533, 65527, 4, 2, 14, 13, 8, + 6, 65525, 65519, 65501, 65489, 65481, 65479, 65496, +65522, 31, 76, 123, 146, 164, 146, 129, + 83, 48, 5, 65514, 65491, 65480, 65472, 65466, +65469, 65468, 65477, 65493, 65500, 65526, 65529, 17, + 20, 37, 42, 53, 60, 67, 77, 79, + 86, 80, 73, 54, 34, 2, 65511, 65475, +65455, 65432, 65428, 65430, 65444, 65466, 65495, 65526, + 22, 53, 77, 94, 99, 91, 76, 49, + 30, 8, 0, 3, 12, 36, 53, 70, + 76, 69, 55, 33, 11, 65526, 65518, 65507, +65516, 65517, 65529, 65534, 3, 7, 8, 11, + 17, 15, 27, 24, 32, 37, 39, 50, + 55, 72, 82, 100, 112, 116, 121, 110, + 99, 84, 65, 53, 39, 39, 35, 42, + 46, 47, 50, 40, 35, 18, 9, 65535, + 1, 8, 27, 45, 61, 76, 78, 79, + 75, 66, 66, 57, 59, 50, 46, 35, + 22, 6, 65530, 65511, 65501, 65487, 65475, 65470, +65464, 65466, 65475, 65484, 65499, 65512, 65525, 65531, + 5, 1, 3, 65533, 65533, 65528, 65528, 65525, +65521, 65514, 65504, 65486, 65469, 65448, 65430, 65417, +65409, 65415, 65414, 65434, 65435, 65453, 65455, 65465, +65469, 65477, 65484, 65496, 65507, 65517, 65527, 65530, +65532, 65527, 65513, 65499, 65477, 65453, 65433, 65408, +65397, 65379, 65378, 65365, 65376, 65371, 65388, 65392, +65407, 65415, 65420, 65427, 65422, 65433, 65427, 65440, +65439, 65447, 65454, 65456, 65462, 65464, 65462, 65465, +65462, 65465, 65465, 65471, 65472, 65474, 65476, 65467, +65469, 65460, 65465, 65469, 65475, 65488, 65490, 65501, +65496, 65500, 65494, 65498, 65492, 65501, 65501, 65512, +65525, 0, 19, 33, 47, 63, 68, 78, + 71, 71, 56, 53, 42, 42, 41, 41, + 45, 43, 44, 41, 38, 35, 29, 26, + 22, 20, 21, 20, 29, 33, 40, 50, + 52, 63, 65, 73, 75, 77, 75, 74, + 66, 63, 49, 46, 33, 27, 23, 18, + 23, 26, 37, 51, 67, 92, 104, 125, + 126, 132, 125, 119, 110, 96, 91, 77, + 80, 73, 81, 82, 85, 89, 86, 82, + 69, 52, 30, 3, 65522, 65503, 65505, 65500, +65519, 65525, 14, 29, 51, 69, 83, 90, + 98, 95, 97, 95, 90, 93, 86, 83, + 79, 65, 56, 36, 19, 1, 65524, 65516, +65509, 65509, 65506, 65511, 65510, 65514, 65511, 65507, +65503, 65500, 65506, 65516, 65531, 5, 12, 9, +65533, 65520, 65495, 65475, 65453, 65435, 65425, 65417, +65417, 65417, 65421, 65427, 65434, 65443, 65446, 65451, +65450, 65451, 65454, 65459, 65458, 65464, 65454, 65454, +65445, 65435, 65431, 65416, 65416, 65412, 65416, 65427, +65436, 65447, 65460, 65474, 65489, 65505, 65505, 65512, +65497, 65498, 65485, 65484, 65478, 65476, 65475, 65487, +65502, 65521 +}; + diff --git a/audio_error.c b/audio_error.c new file mode 100644 index 0000000..e2685a0 --- /dev/null +++ b/audio_error.c @@ -0,0 +1,2140 @@ +#include "stm32f7xx_hal.h" + +const uint16_t audio_error[]={ + 0, 0, 0, 0, 65535, 0, 2, 0, +65534, 0, 2, 0, 65534, 0, 2, 1, +65535, 65534, 1, 2, 65535, 65535, 1, 0, +65535, 1, 1, 65535, 0, 65535, 65535, 3, + 1, 65532, 65535, 4, 2, 65533, 65534, 2, + 2, 65533, 65534, 4, 1, 65532, 0, 4, +65535, 65533, 1, 1, 65535, 0, 1, 0, +65535, 1, 0, 65535, 1, 0, 0, 1, +65535, 65534, 1, 3, 65535, 65533, 0, 2, + 3, 65535, 65532, 0, 3, 1, 65534, 65535, + 1, 0, 65535, 1, 2, 65534, 65534, 3, + 1, 65532, 0, 3, 65535, 65535, 1, 65535, + 0, 3, 65535, 65532, 1, 3, 0, 65534, + 0, 1, 0, 65535, 0, 2, 0, 65534, + 0, 3, 0, 65533, 0, 1, 1, 0, +65534, 65535, 2, 3, 65535, 65533, 0, 2, + 1, 65535, 65535, 65535, 1, 3, 65535, 65532, + 1, 4, 65535, 65533, 2, 2, 65534, 65535, + 1, 0, 0, 0, 0, 0, 0, 1, + 1, 65534, 65533, 3, 4, 65533, 65532, 2, + 4, 65535, 65532, 0, 3, 1, 65535, 65535, +65535, 0, 2, 1, 65534, 65534, 1, 3, + 0, 65533, 0, 2, 0, 65535, 0, 0, +65535, 1, 1, 65535, 65535, 0, 1, 1, + 0, 65535, 0, 1, 0, 0, 0, 65535, + 0, 0, 0, 2, 0, 65533, 0, 3, +65535, 65533, 2, 2, 65534, 0, 0, 0, + 1, 0, 65534, 65535, 2, 0, 65535, 1, + 0, 65534, 0, 3, 0, 65532, 0, 5, + 0, 65530, 0, 6, 1, 65531, 65533, 4, + 3, 65534, 65534, 65535, 1, 3, 0, 65533, + 0, 3, 0, 65534, 0, 1, 1, 0, +65534, 65535, 3, 2, 65534, 65534, 1, 2, +65535, 65534, 2, 1, 65534, 0, 2, 0, +65534, 0, 2, 0, 65534, 65535, 2, 1, +65534, 65535, 3, 1, 65533, 65535, 2, 1, + 0, 65534, 65534, 2, 3, 65534, 65533, 2, + 3, 65535, 65534, 1, 1, 65535, 65535, 0, + 1, 1, 0, 65535, 65535, 1, 1, 65535, +65535, 0, 1, 1, 65534, 65535, 3, 1, +65533, 65535, 2, 1, 65535, 0, 65535, 65535, + 2, 1, 65534, 65535, 2, 1, 65535, 65535, + 0, 1, 0, 65535, 65535, 1, 2, 1, +65535, 65533, 0, 3, 0, 65533, 0, 2, + 0, 65535, 65535, 0, 2, 1, 65533, 65534, + 4, 3, 65532, 65532, 4, 3, 65532, 65534, + 3, 2, 65534, 65534, 2, 2, 65534, 65533, + 2, 4, 65534, 65532, 2, 4, 65534, 65533, + 1, 1, 0, 1, 0, 65533, 1, 4, +65534, 65533, 2, 1, 65534, 0, 1, 65535, + 0, 1, 65535, 1, 2, 65534, 65534, 1, + 2, 0, 65534, 65535, 1, 2, 0, 65535, + 0, 65535, 0, 2, 0, 65534, 65535, 2, + 1, 65534, 0, 2, 0, 65533, 0, 3, + 0, 65533, 65535, 2, 2, 0, 65534, 65535, + 1, 1, 1, 65535, 65534, 1, 3, 65535, +65532, 2, 3, 65533, 65535, 4, 1, 65532, +65535, 2, 0, 65535, 1, 0, 65535, 2, + 2, 65533, 65533, 2, 2, 65535, 0, 1, +65534, 65535, 4, 1, 65533, 65535, 1, 1, + 1, 65535, 65533, 1, 3, 65535, 65535, 2, +65535, 65533, 1, 2, 65535, 65535, 0, 1, + 2, 0, 65533, 0, 3, 65534, 65533, 3, + 2, 65533, 0, 2, 65535, 0, 1, 65535, + 0, 1, 65535, 65535, 1, 1, 65535, 65534, + 1, 3, 0, 65533, 65535, 3, 1, 65533, +65534, 2, 3, 65535, 65534, 0, 0, 2, + 1, 65533, 65534, 3, 2, 65534, 65535, 1, + 0, 65535, 1, 1, 65535, 65534, 0, 3, + 1, 65534, 65535, 0, 2, 2, 65533, 65533, + 4, 2, 65531, 0, 5, 65535, 65532, 1, + 2, 0, 0, 0, 65534, 65534, 3, 4, +65533, 65531, 4, 6, 65531, 65531, 5, 3, +65532, 65534, 2, 2, 1, 65534, 65533, 3, + 3, 65531, 65534, 5, 0, 65532, 2, 4, +65534, 65533, 0, 1, 2, 1, 65532, 65532, + 6, 8, 65527, 65524, 14, 16, 65515, 65513, + 33, 34, 65480, 65480, 609, 602, 1365, 1376, + 1032, 1065, 756, 799, 796, 841, 843, 892, + 623, 676, 65365, 65414, 64860, 64888, 65208, 65206, +65071, 65070, 65130, 65114, 65482, 65470, 35, 31, + 647, 638, 1284, 1300, 1544, 1579, 1522, 1585, + 1648, 1722, 1580, 1670, 761, 849, 65128, 65204, +64279, 64325, 64093, 64092, 63997, 63979, 63687, 63649, +63678, 63612, 63965, 63894, 63960, 63881, 63658, 63578, +63302, 63220, 62739, 62640, 62281, 62164, 62614, 62476, +63587, 63436, 64764, 64621, 351, 249, 1041, 968, + 1225, 1198, 899, 903, 187, 205, 65207, 65213, +64934, 64929, 65034, 65007, 293, 260, 1681, 1649, + 2983, 2992, 3865, 3912, 4637, 4751, 5499, 5661, + 6040, 6262, 6212, 6476, 6031, 6325, 5297, 5619, + 4491, 4810, 3683, 3984, 2870, 3147, 1915, 2153, + 708, 908, 64881, 65036, 63538, 63632, 62056, 62079, +60456, 60405, 59374, 59249, 59201, 59006, 59813, 59576, +60915, 60650, 62153, 61911, 63245, 63020, 63945, 63778, +64258, 64132, 64271, 64181, 64060, 63975, 64018, 63947, +64347, 64272, 64767, 64708, 64942, 64885, 64666, 64625, +64231, 64181, 63984, 63913, 63671, 63594, 63148, 63057, +62458, 62342, 61827, 61683, 61474, 61290, 61483, 61270, +61880, 61649, 62658, 62420, 63797, 63561, 65023, 64818, + 438, 268, 809, 696, 590, 503, 55, 65535, +65134, 65075, 64879, 64814, 65032, 64957, 262, 179, + 1616, 1545, 3139, 3093, 4288, 4303, 4734, 4817, + 4448, 4579, 3663, 3819, 2638, 2810, 1561, 1716, + 637, 752, 35, 110, 65222, 65271, 64987, 65011, +64742, 64746, 64491, 64481, 64318, 64294, 64331, 64301, +64473, 64430, 64660, 64632, 64868, 64828, 65086, 65077, +65431, 65412, 301, 305, 648, 656, 757, 793, + 716, 757, 524, 584, 152, 210, 65135, 65190, +64523, 64573, 64030, 64052, 63667, 63667, 63425, 63401, +63425, 63377, 63643, 63586, 64141, 64063, 64911, 64835, + 323, 266, 1267, 1230, 1928, 1926, 2233, 2256, + 2154, 2209, 1820, 1906, 1560, 1645, 1584, 1657, + 2025, 2101, 2796, 2864, 3661, 3744, 4392, 4501, + 4851, 4995, 5130, 5305, 5294, 5503, 5531, 5753, + 5896, 6129, 6258, 6527, 6313, 6607, 5689, 6012, + 4397, 4720, 2627, 2931, 578, 843, 63862, 64058, +61592, 61700, 59685, 59708, 58438, 58367, 57947, 57781, +58274, 58014, 59418, 59108, 61198, 60892, 63194, 62909, +64892, 64663, 460, 302, 973, 908, 1128, 1143, + 1063, 1112, 819, 874, 557, 625, 515, 571, + 720, 760, 803, 838, 380, 400, 64992, 64996, +63883, 63864, 62907, 62857, 62350, 62257, 62421, 62313, +63334, 63218, 64891, 64810, 1100, 1039, 2379, 2378, + 2923, 2976, 2857, 2972, 2603, 2727, 2555, 2691, + 2967, 3116, 3876, 4044, 5145, 5349, 6354, 6615, + 6873, 7200, 6426, 6768, 5192, 5572, 3527, 3904, + 1700, 1986, 65420, 75, 63687, 63824, 62134, 62210, +60809, 60817, 59647, 59520, 58657, 58446, 58005, 57748, +57824, 57479, 58116, 57697, 58774, 58341, 59738, 59289, +60921, 60520, 62300, 61951, 63750, 63455, 65057, 64826, + 416, 282, 716, 650, 429, 371, 65329, 65246, +64564, 64464, 63780, 63688, 63020, 62933, 62271, 62172, +61553, 61455, 60905, 60824, 60515, 60424, 60593, 60445, +61357, 61152, 62846, 62562, 64767, 64440, 1081, 784, + 2463, 2286, 3268, 3213, 3458, 3531, 3136, 3286, + 2564, 2740, 2078, 2223, 1886, 1966, 2050, 2080, + 2528, 2537, 3281, 3318, 4327, 4441, 5556, 5791, + 6864, 7218, 8153, 8615, 9261, 9838, 10021, 10715, +10201, 10965, 9579, 10370, 8118, 8882, 5981, 6645, + 3501, 4032, 932, 1300, 64036, 64249, 61849, 61910, +59837, 59756, 58013, 57780, 56455, 56096, 55574, 55015, +55548, 54784, 56306, 55489, 57767, 56949, 59637, 58866, +61589, 60935, 63297, 62820, 64584, 64337, 65440, 65383, + 429, 413, 596, 666, 579, 667, 431, 496, + 11, 84, 64824, 64857, 63951, 63906, 63179, 63085, +62890, 62733, 63233, 63026, 64226, 63973, 49, 65393, + 1519, 1399, 2788, 2757, 3761, 3747, 4401, 4452, + 4877, 5000, 5426, 5635, 6113, 6375, 6839, 7205, + 7696, 8181, 8713, 9284, 9706, 10353, 10411, 11120, +10711, 11414, 10549, 11183, 9820, 10409, 8516, 9046, + 6576, 7098, 4148, 4660, 1464, 1949, 64230, 64657, +61566, 61878, 59176, 59318, 57346, 57292, 56319, 56030, +56126, 55615, 56572, 55874, 57381, 56598, 58320, 57476, +59094, 58195, 59413, 58539, 59274, 58462, 58794, 58043, +58212, 57556, 57751, 57173, 57451, 56934, 57087, 56646, +56509, 56118, 55679, 55389, 54627, 54417, 53470, 53329, +52600, 52521, 52442, 52406, 53355, 53303, 55400, 55263, +58359, 58087, 61815, 61431, 65130, 64700, 2290, 1858, + 4195, 3833, 5342, 5070, 5835, 5711, 5919, 5933, + 5826, 5941, 5781, 5947, 5853, 6042, 6081, 6272, + 6346, 6596, 7103, 7082, 8279, 7965, 9523, 9455, +11283, 11448, 13272, 13558, 14919, 15368, 15729, 16430, +15329, 16499, 14088, 15470, 12298, 13455, 9682, 10783, + 6885, 7785, 4162, 4780, 1546, 1987, 65122, 65175, +63628, 63282, 62405, 61802, 61465, 60726, 61004, 60008, +60782, 59619, 60520, 59505, 60409, 59728, 60727, 60343, +61578, 61328, 62461, 62494, 63042, 63487, 63290, 64031, +63098, 63963, 62284, 63329, 61034, 62283, 59638, 61006, +58306, 59832, 57506, 59054, 57629, 58885, 58568, 59310, +60025, 60205, 61729, 61396, 63362, 62697, 64722, 63944, + 180, 65047, 851, 439, 1374, 1152, 1700, 1623, + 1951, 1936, 2368, 2135, 2975, 2371, 3711, 2777, + 4596, 3487, 5767, 4469, 7072, 5544, 8157, 6551, + 8828, 7294, 8947, 7587, 8341, 7254, 7120, 6262, + 5391, 4688, 3378, 2769, 1179, 672, 64440, 64108, +62235, 62182, 60349, 60664, 58827, 59584, 57657, 58900, +57017, 58518, 56914, 58340, 57242, 58361, 57810, 58478, +58404, 58597, 58850, 58691, 59115, 58776, 59291, 58892, +59470, 59102, 59592, 59300, 59624, 59389, 59561, 59283, +59281, 59042, 58744, 58622, 58008, 58192, 57413, 57893, +57288, 57994, 57638, 58564, 58524, 59750, 59952, 61781, +61816, 63875, 63920, 232, 456, 2107, 2298, 3736, + 3822, 4899, 4976, 5467, 5720, 5536, 6068, 5685, + 6039, 5799, 5859, 5683, 5734, 5887, 5839, 6218, + 6205, 6767, 6905, 7696, 7965, 8697, 9232, 9643, +10452, 10547, 11401, 11413, 11973, 11912, 12161, 11902, +11975, 11536, 11432, 10996, 10489, 10226, 9261, 9011, + 7811, 7475, 6268, 5943, 4687, 4398, 3214, 2781, + 1954, 1303, 1001, 32, 327, 64422, 65328, 63597, +64840, 63197, 64375, 63081, 64049, 63218, 63969, 63565, +64141, 64003, 64375, 64395, 64428, 64490, 64183, 64264, +63586, 63815, 62659, 63170, 61576, 62547, 60589, 62218, +59950, 62206, 59736, 62396, 59969, 62778, 60623, 63474, +61613, 64394, 62839, 65310, 64182, 625, 65471, 1257, + 952, 1636, 1597, 1862, 1755, 1863, 1481, 1613, + 947, 1065, 507, 467, 459, 70, 1009, 64, + 2061, 393, 3450, 1068, 4896, 2110, 6160, 3366, + 7012, 4480, 7310, 5121, 7016, 5050, 6176, 4246, + 4839, 2784, 3029, 872, 862, 64250, 64099, 62116, +61869, 60320, 59813, 58925, 58010, 57819, 56519, 56925, +55507, 56185, 54999, 55729, 54985, 55589, 55421, 55607, +56224, 55708, 57252, 55875, 58268, 56120, 59004, 56369, +59281, 56505, 59077, 56467, 58489, 56298, 57672, 56088, +56731, 55793, 55879, 55421, 55192, 54911, 54734, 54369, +54459, 53990, 54422, 54021, 54807, 54663, 55803, 56044, +57433, 58169, 59584, 60836, 62057, 63625, 64615, 594, + 1363, 2500, 3102, 3718, 4090, 4333, 4484, 4492, + 4604, 4512, 4883, 4693, 5576, 5249, 6774, 6209, + 8394, 7455, 10222, 8876, 11966, 10385, 13357, 11883, +14349, 13314, 15070, 14592, 15509, 15592, 15559, 16208, +15203, 16421, 14434, 16238, 13373, 15701, 12045, 14814, +10555, 13670, 9072, 12341, 7625, 10765, 6184, 8910, + 4697, 6782, 3146, 4501, 1635, 2232, 278, 125, +64713, 63897, 63902, 62655, 63350, 61918, 62996, 61703, +62663, 61849, 62233, 62111, 61564, 62214, 60650, 61964, +59468, 61282, 58076, 60270, 56612, 59078, 55296, 57964, +54301, 57100, 53796, 56626, 53892, 56607, 54684, 57000, +56075, 57731, 57810, 58727, 59624, 59975, 61304, 61397, +62701, 62835, 63658, 64105, 64155, 65068, 64341, 92, +64409, 235, 64581, 139, 65026, 21, 309, 120, + 1604, 534, 3359, 1336, 5451, 2510, 7601, 3918, + 9465, 5265, 10785, 6359, 11381, 7015, 11083, 7138, + 9902, 6647, 7974, 5552, 5609, 3985, 3082, 2140, + 655, 297, 63994, 64122, 62038, 62570, 60358, 61292, +59042, 60448, 58252, 60089, 58126, 60117, 58637, 60381, +59664, 60763, 60931, 61239, 62150, 61642, 63045, 61914, +63475, 62059, 63423, 62140, 62960, 62208, 62221, 62103, +61308, 61721, 60253, 60980, 59091, 59983, 57841, 58879, +56658, 57944, 55847, 57415, 55664, 57516, 56265, 58365, +57670, 59799, 59700, 61529, 62009, 63291, 64286, 64923, + 688, 748, 2213, 1744, 3325, 2335, 4135, 2626, + 4814, 2798, 5568, 3003, 6516, 3374, 7742, 4031, + 9263, 5077, 10965, 6524, 12729, 8269, 14385, 10159, +15712, 11998, 16589, 13570, 16878, 14781, 16480, 15540, +15571, 15821, 14276, 15638, 12794, 15027, 11268, 14118, + 9822, 12974, 8435, 11591, 7108, 9982, 5801, 8130, + 4456, 6062, 3065, 3927, 1578, 1797, 36, 65381, +64010, 63714, 62491, 62518, 61066, 61756, 59800, 61302, +58665, 60965, 57531, 60561, 56266, 59902, 54818, 58941, +53150, 57648, 51332, 56137, 49578, 54580, 48181, 53125, +47440, 52036, 47493, 51451, 48369, 51426, 49953, 52024, +51951, 53186, 54056, 54729, 56059, 56529, 57828, 58417, +59328, 60193, 60578, 61726, 61664, 62932, 62656, 63736, +63625, 64233, 64643, 64525, 233, 64848, 1611, 65377, + 3345, 678, 5511, 1788, 7989, 3113, 10536, 4517, +12814, 5910, 14487, 7149, 15347, 8089, 15311, 8621, +14391, 8611, 12727, 8104, 10506, 7113, 7954, 5718, + 5342, 4057, 2883, 2258, 813, 537, 64658, 64569, +63376, 63352, 62577, 62441, 62235, 61820, 62181, 61527, +62384, 61562, 62753, 61921, 63284, 62534, 63808, 63285, +64123, 64039, 64161, 64612, 63791, 64834, 63020, 64636, +61939, 64104, 60657, 63355, 59344, 62498, 58198, 61676, +57428, 61051, 57120, 60805, 57292, 61033, 57973, 61690, +59121, 62686, 60612, 63956, 62262, 65331, 63937, 1159, +65487, 2346, 1223, 3200, 2149, 3664, 2761, 3795, + 3214, 3695, 3673, 3453, 4339, 3259, 5340, 3332, + 6599, 3804, 8045, 4705, 9529, 5942, 10837, 7374, +11828, 8818, 12400, 10029, 12579, 10847, 12425, 11235, +11967, 11166, 11287, 10710, 10503, 10032, 9613, 9184, + 8656, 8151, 7621, 6930, 6537, 5575, 5426, 4078, + 4301, 2524, 3178, 1015, 2034, 65246, 914, 64237, +65353, 63543, 64273, 63151, 63175, 62971, 62000, 62800, +60731, 62444, 59343, 61862, 57851, 61037, 56254, 59938, +54634, 58596, 53061, 57085, 51627, 55497, 50472, 53977, +49673, 52667, 49352, 51731, 49546, 51282, 50238, 51438, +51319, 52312, 52663, 53829, 54129, 55734, 55623, 57798, +57039, 59693, 58281, 61267, 59370, 62392, 60331, 63058, +61281, 63377, 62346, 63522, 63515, 63642, 64820, 63932, + 748, 64513, 2388, 65405, 4168, 1031, 5960, 2402, + 7644, 3804, 9172, 5065, 10309, 6071, 10922, 6708, +10936, 6926, 10327, 6713, 9226, 6067, 7766, 5065, + 6113, 3727, 4411, 2189, 2861, 578, 1567, 64580, + 555, 63222, 65351, 62127, 64826, 61394, 64526, 61058, +64447, 61125, 64557, 61553, 64799, 62251, 65063, 63084, +65188, 63847, 65038, 64385, 64537, 64594, 63719, 64391, +62635, 63776, 61441, 62838, 60245, 61757, 59178, 60673, +58350, 59771, 57856, 59239, 57755, 59170, 58091, 59606, +58843, 60470, 59937, 61672, 61240, 63051, 62589, 64474, +63840, 227, 64929, 1322, 279, 2185, 1014, 2823, + 1739, 3314, 2595, 3724, 3681, 4184, 4991, 4819, + 6508, 5676, 8050, 6686, 9481, 7799, 10672, 8917, +11575, 9964, 12150, 10820, 12383, 11398, 12306, 11667, +11981, 11622, 11474, 11347, 10800, 10851, 9962, 10157, + 9031, 9311, 8065, 8380, 7138, 7419, 6279, 6488, + 5512, 5605, 4827, 4870, 4240, 4280, 3691, 3779, + 3073, 3356, 2312, 2995, 1330, 2577, 112, 1993, +64187, 1152, 62496, 52, 60625, 64188, 58629, 62557, +56602, 60741, 54606, 58841, 52768, 56980, 51213, 55276, +50099, 53857, 49525, 52815, 49489, 52208, 49951, 52161, +50781, 52632, 51832, 53565, 53020, 54842, 54253, 56318, +55469, 57836, 56595, 59245, 57701, 60462, 58867, 61452, +60155, 62253, 61522, 62938, 62987, 63620, 64603, 64408, + 798, 65364, 2743, 984, 4756, 2328, 6776, 3754, + 8687, 5163, 10345, 6443, 11636, 7455, 12411, 8130, +12644, 8441, 12416, 8373, 11768, 7911, 10718, 7051, + 9331, 5799, 7716, 4275, 5957, 2584, 4150, 870, + 2429, 64858, 894, 63573, 65221, 62684, 64416, 62221, +64045, 62183, 64046, 62509, 64253, 63061, 64520, 63720, +64661, 64368, 64535, 64852, 64062, 65045, 63271, 64904, +62277, 64407, 61161, 63628, 60022, 62660, 58989, 61646, +58149, 60767, 57554, 60163, 57280, 59914, 57359, 60033, +57794, 60496, 58496, 61221, 59369, 62120, 60298, 63060, +61214, 63935, 62079, 64669, 62903, 65301, 63759, 294, +64640, 792, 131, 1279, 1352, 1823, 2786, 2465, + 4311, 3208, 5818, 4015, 7253, 4881, 8553, 5749, + 9663, 6600, 10496, 7362, 11057, 8012, 11326, 8488, +11339, 8732, 11122, 8735, 10687, 8469, 10075, 7940, + 9344, 7243, 8599, 6457, 7884, 5661, 7271, 4940, + 6827, 4325, 6572, 3842, 6448, 3498, 6327, 3285, + 6111, 3214, 5752, 3209, 5183, 3211, 4379, 3138, + 3306, 2857, 1951, 2298, 349, 1396, 64089, 169, +62128, 64218, 60089, 62545, 58082, 60850, 56272, 59278, +54812, 57938, 53751, 56926, 53157, 56290, 52989, 56072, +53235, 56299, 53801, 56934, 54561, 57873, 55402, 58992, +56256, 60211, 57129, 61390, 58036, 62465, 59004, 63371, +60064, 64139, 61281, 64841, 62700, 17, 64310, 770, + 498, 1556, 2328, 2358, 4214, 3142, 6040, 3923, + 7675, 4673, 9036, 5351, 10070, 5915, 10730, 6313, +10991, 6471, 10802, 6347, 10188, 5884, 9174, 5038, + 7803, 3829, 6131, 2289, 4267, 517, 2345, 64166, + 503, 62353, 64409, 60733, 63019, 59432, 61958, 58493, +61202, 57967, 60735, 57863, 60425, 58094, 60183, 58544, +59899, 59116, 59489, 59630, 58889, 59936, 58066, 59921, +57024, 59567, 55850, 58876, 54654, 57954, 53577, 56967, +52753, 56098, 52238, 55488, 52110, 55255, 52339, 55432, +52843, 55988, 53506, 56820, 54306, 57775, 55150, 58727, +56003, 59590, 56860, 60343, 57753, 61008, 58795, 61633, +60012, 62300, 61406, 63036, 62961, 63873, 64666, 64763, + 920, 164, 2728, 1137, 4482, 2229, 6167, 3400, + 7742, 4662, 9124, 5975, 10274, 7238, 11096, 8362, +11608, 9240, 11783, 9793, 11699, 10004, 11382, 9912, +10900, 9591, 10381, 9130, 9889, 8588, 9479, 8011, + 9197, 7464, 9066, 6993, 9084, 6662, 9180, 6502, + 9335, 6572, 9484, 6851, 9523, 7243, 9363, 7661, + 8922, 7970, 8197, 8011, 7158, 7673, 5777, 6892, + 4126, 5724, 2281, 4240, 405, 2630, 64195, 1071, +62699, 65235, 61549, 64125, 60748, 63351, 60303, 62929, +60116, 62850, 60080, 63038, 60099, 63442, 60176, 64027, +60308, 64692, 60519, 65356, 60825, 409, 61261, 926, +61907, 1346, 62705, 1731, 63673, 2088, 64768, 2423, + 430, 2754, 1737, 3114, 3098, 3520, 4437, 3917, + 5730, 4317, 6886, 4711, 7847, 5061, 8516, 5268, + 8801, 5255, 8659, 5002, 8114, 4436, 7194, 3510, + 5972, 2230, 4517, 671, 2945, 64396, 1352, 62452, +65331, 60529, 63847, 58743, 62495, 57203, 61323, 55991, +60351, 55179, 59620, 54783, 59058, 54718, 58669, 54953, +58342, 55421, 57993, 55975, 57534, 56490, 56855, 56858, +55990, 57006, 55037, 56916, 54069, 56654, 53230, 56301, +52626, 55961, 52300, 55736, 52283, 55746, 52501, 55992, +52904, 56428, 53388, 57019, 53872, 57692, 54324, 58403, +54783, 59090, 55301, 59711, 55846, 60284, 56518, 60821, +57328, 61320, 58318, 61813, 59547, 62352, 60983, 63000, +62600, 63799, 64348, 64751, 615, 314, 2414, 1554, + 4150, 2871, 5761, 4226, 7176, 5526, 8370, 6722, + 9298, 7725, 9946, 8511, 10302, 9029, 10405, 9272, +10283, 9249, 10030, 9017, 9747, 8639, 9503, 8167, + 9327, 7696, 9247, 7326, 9285, 7121, 9441, 7168, + 9704, 7440, 10030, 7907, 10344, 8490, 10540, 9084, +10478, 9528, 10085, 9705, 9276, 9514, 8064, 8924, + 6514, 7955, 4749, 6675, 2930, 5199, 1199, 3670, +65238, 2226, 64026, 951, 63093, 65492, 62406, 64760, +61948, 64314, 61684, 64164, 61545, 64239, 61513, 64515, +61553, 64919, 61706, 65385, 61974, 330, 62338, 762, +62847, 1137, 63516, 1473, 64319, 1824, 65285, 2160, + 828, 2545, 2044, 2953, 3308, 3434, 4576, 3986, + 5812, 4613, 6948, 5281, 7960, 5920, 8761, 6500, + 9324, 6915, 9600, 7079, 9548, 6865, 9181, 6259, + 8510, 5280, 7550, 3924, 6385, 2256, 5074, 379, + 3671, 63946, 2207, 61971, 795, 60139, 65024, 58537, +63855, 57291, 62826, 56432, 61925, 55960, 61139, 55805, +60390, 55870, 59618, 56064, 58788, 56255, 57856, 56389, +56853, 56366, 55819, 56176, 54824, 55861, 53936, 55450, +53231, 55048, 52708, 54707, 52426, 54512, 52361, 54516, +52473, 54709, 52701, 55062, 52971, 55547, 53258, 56082, +53553, 56632, 53863, 57177, 54261, 57705, 54784, 58243, +55495, 58791, 56445, 59409, 57652, 60071, 59080, 60816, +60660, 61667, 62351, 62644, 64099, 63754, 276, 64973, + 1943, 722, 3500, 2030, 4903, 3292, 6080, 4449, + 6994, 5465, 7614, 6262, 7933, 6823, 7967, 7134, + 7761, 7179, 7391, 6995, 6938, 6598, 6485, 6075, + 6163, 5513, 6037, 5045, 6148, 4762, 6508, 4743, + 7044, 5010, 7693, 5553, 8291, 6264, 8720, 7007, + 8840, 7606, 8591, 7922, 7936, 7891, 6896, 7454, + 5576, 6661, 4061, 5550, 2453, 4269, 893, 2931, +65035, 1694, 63836, 634, 62884, 65386, 62181, 64861, +61700, 64523, 61387, 64374, 61197, 64357, 61132, 64455, +61145, 64643, 61179, 64902, 61308, 65265, 61571, 115, +61968, 513, 62481, 899, 63167, 1253, 64006, 1595, +65021, 1977, 615, 2426, 1823, 3007, 3081, 3724, + 4296, 4539, 5456, 5411, 6506, 6223, 7383, 6913, + 8077, 7411, 8577, 7665, 8853, 7618, 8835, 7238, + 8537, 6503, 7996, 5404, 7226, 4004, 6276, 2351, + 5177, 535, 4058, 64202, 2917, 62401, 1844, 60820, + 835, 59531, 65448, 58582, 64568, 57925, 63714, 57518, +62858, 57300, 61983, 57209, 61043, 57122, 60025, 56993, +58972, 56764, 57915, 56472, 56909, 56135, 56018, 55785, +55309, 55480, 54790, 55250, 54479, 55146, 54352, 55200, +54330, 55420, 54397, 55758, 54493, 56224, 54622, 56761, +54777, 57337, 54971, 57888, 55270, 58423, 55707, 58951, +56300, 59478, 57070, 60002, 58062, 60554, 59239, 61173, +60612, 61908, 62097, 62791, 63698, 63822, 65309, 64966, + 1333, 641, 2773, 1893, 4019, 3151, 5078, 4356, + 5923, 5476, 6545, 6443, 6934, 7230, 7088, 7756, + 7055, 8005, 6858, 7967, 6551, 7701, 6177, 7284, + 5838, 6809, 5664, 6416, 5697, 6170, 5963, 6123, + 6426, 6287, 7023, 6653, 7632, 7130, 8098, 7637, + 8271, 8059, 8063, 8319, 7465, 8337, 6482, 7998, + 5237, 7325, 3830, 6353, 2381, 5201, 970, 3951, +65211, 2725, 64035, 1600, 63005, 621, 62117, 65381, +61398, 64803, 60809, 64393, 60355, 64166, 60043, 64096, +59874, 64154, 59797, 64296, 59805, 64451, 59876, 64600, +60035, 64728, 60295, 64843, 60712, 64952, 61336, 65101, +62188, 65317, 63241, 101, 64454, 556, 205, 1166, + 1539, 1920, 2837, 2773, 4055, 3682, 5149, 4580, + 6094, 5409, 6874, 6102, 7481, 6557, 7869, 6721, + 8016, 6505, 7954, 5909, 7687, 4988, 7237, 3801, + 6673, 2443, 6056, 1013, 5461, 65175, 4902, 63950, + 4381, 62908, 3854, 62052, 3309, 61426, 2731, 60992, + 2092, 60743, 1365, 60606, 560, 60496, 65241, 60368, +64348, 60206, 63455, 59987, 62581, 59706, 61792, 59394, +61106, 59109, 60546, 58941, 60123, 58910, 59835, 59025, +59660, 59285, 59585, 59693, 59536, 60186, 59458, 60705, +59400, 61189, 59381, 61626, 59422, 61966, 59507, 62223, +59712, 62415, 60053, 62547, 60562, 62704, 61222, 62922, +61999, 63220, 62932, 63573, 63963, 64021, 65031, 64581, + 549, 65306, 1554, 619, 2510, 1589, 3365, 2606, + 4060, 3570, 4568, 4386, 4882, 4973, 4981, 5300, + 4884, 5323, 4602, 5105, 4180, 4688, 3721, 4147, + 3288, 3547, 2987, 2992, 2858, 2558, 2941, 2266, + 3237, 2176, 3662, 2277, 4091, 2539, 4415, 2888, + 4521, 3211, 4381, 3433, 3951, 3456, 3258, 3205, + 2357, 2673, 1281, 1906, 96, 917, 64374, 65347, +63070, 64188, 61793, 63075, 60575, 62070, 59485, 61243, +58571, 60632, 57851, 60258, 57312, 60139, 56963, 60216, +56741, 60465, 56649, 60802, 56631, 61145, 56721, 61473, +56914, 61753, 57258, 62023, 57729, 62281, 58372, 62567, +59179, 62920, 60164, 63373, 61318, 63967, 62600, 64711, +63998, 62, 65452, 1090, 1391, 2248, 2835, 3488, + 4166, 4733, 5340, 5858, 6315, 6780, 7040, 7416, + 7488, 7719, 7683, 7638, 7667, 7218, 7516, 6484, + 7249, 5506, 6937, 4380, 6607, 3217, 6241, 2086, + 5841, 1081, 5402, 249, 4915, 65132, 4370, 64604, + 3759, 64174, 3109, 63797, 2398, 63465, 1646, 63159, + 863, 62849, 77, 62532, 64816, 62183, 64020, 61808, +63302, 61462, 62716, 61179, 62267, 60976, 61925, 60923, +61722, 61036, 61579, 61293, 61439, 61643, 61267, 62031, +61085, 62398, 60927, 62719, 60859, 62956, 60913, 63118, +61119, 63255, 61471, 63345, 61956, 63452, 62577, 63586, +63293, 63788, 64095, 64081, 64971, 64478, 411, 65011, + 1446, 126, 2519, 860, 3539, 1645, 4471, 2436, + 5211, 3178, 5725, 3783, 5989, 4211, 5978, 4456, + 5715, 4495, 5256, 4320, 4673, 3960, 4064, 3454, + 3510, 2894, 3098, 2357, 2856, 1936, 2834, 1678, + 2958, 1616, 3212, 1770, 3494, 2074, 3763, 2438, + 3905, 2747, 3878, 2941, 3597, 2940, 3059, 2691, + 2304, 2196, 1318, 1528, 207, 687, 64543, 65271, +63304, 64229, 62098, 63181, 60967, 62191, 59927, 61336, +59011, 60652, 58251, 60195, 57647, 59967, 57190, 59936, +56856, 60047, 56635, 60249, 56534, 60499, 56545, 60751, +56657, 60996, 56878, 61208, 57218, 61421, 57662, 61682, +58230, 62039, 58973, 62499, 59870, 63095, 60915, 63820, +62122, 64673, 63438, 95, 64805, 1126, 605, 2236, + 1854, 3379, 2974, 4475, 3919, 5452, 4619, 6215, + 5112, 6700, 5395, 6849, 5507, 6670, 5553, 6179, + 5542, 5463, 5498, 4623, 5399, 3755, 5256, 2898, + 5045, 2075, 4728, 1342, 4307, 676, 3834, 83, + 3286, 65115, 2719, 64658, 2071, 64275, 1388, 63938, + 646, 63613, 65411, 63285, 64640, 62946, 63902, 62591, +63233, 62272, 62679, 62015, 62246, 61858, 61928, 61843, +61710, 61937, 61536, 62133, 61405, 62397, 61261, 62706, +61117, 63000, 61017, 63266, 60996, 63504, 61057, 63687, +61220, 63825, 61511, 63918, 61951, 64030, 62536, 64192, +63221, 64450, 64042, 64797, 64972, 65265, 483, 292, + 1612, 962, 2774, 1692, 3906, 2429, 4944, 3144, + 5813, 3782, 6480, 4364, 6911, 4810, 7129, 5102, + 7134, 5199, 6957, 5107, 6639, 4867, 6238, 4510, + 5814, 4117, 5439, 3717, 5160, 3391, 5031, 3192, + 5126, 3138, 5365, 3236, 5713, 3483, 6061, 3830, + 6317, 4189, 6405, 4489, 6266, 4617, 5872, 4518, + 5265, 4164, 4452, 3577, 3490, 2805, 2423, 1896, + 1273, 923, 74, 65487, 64417, 64589, 63244, 63755, +62158, 63067, 61190, 62523, 60403, 62133, 59747, 61894, +59214, 61798, 58813, 61820, 58493, 61877, 58254, 61932, +58090, 61938, 58057, 61921, 58138, 61880, 58345, 61840, +58645, 61840, 59067, 61922, 59637, 62104, 60321, 62427, +61180, 62923, 62168, 63595, 63258, 64398, 64425, 65338, + 47, 802, 1096, 1792, 1968, 2692, 2639, 3407, + 3108, 3892, 3411, 4120, 3564, 4070, 3648, 3798, + 3692, 3352, 3692, 2735, 3648, 2028, 3536, 1279, + 3344, 517, 3059, 65329, 2691, 64684, 2239, 64118, + 1705, 63670, 1110, 63308, 489, 62993, 65385, 62681, +64716, 62346, 64056, 62006, 63405, 61639, 62798, 61264, +62249, 60936, 61748, 60688, 61316, 60559, 60924, 60532, +60595, 60638, 60315, 60839, 60079, 61110, 59874, 61402, +59693, 61698, 59557, 62001, 59456, 62284, 59437, 62559, +59510, 62837, 59721, 63107, 60058, 63390, 60591, 63688, +61294, 64002, 62162, 64369, 63204, 64784, 64362, 65290, + 45, 340, 1295, 1013, 2471, 1732, 3552, 2450, + 4464, 3111, 5177, 3657, 5706, 4018, 6027, 4185, + 6164, 4178, 6107, 4015, 5925, 3727, 5641, 3340, + 5323, 2913, 5054, 2513, 4900, 2197, 4902, 1973, + 5061, 1929, 5382, 2052, 5768, 2361, 6172, 2796, + 6482, 3267, 6643, 3734, 6649, 4045, 6435, 4130, + 6030, 3947, 5453, 3514, 4710, 2859, 3856, 2067, + 2899, 1185, 1880, 281, 830, 64947, 65329, 64155, +64357, 63480, 63443, 62943, 62654, 62574, 61955, 62370, +61382, 62331, 60903, 62404, 60488, 62514, 60140, 62640, +59841, 62740, 59622, 62811, 59472, 62859, 59435, 62895, +59531, 62941, 59806, 63004, 60240, 63133, 60849, 63366, +61635, 63741, 62571, 64289, 63618, 64989, 64716, 326, + 252, 1324, 1222, 2365, 2077, 3364, 2747, 4203, + 3208, 4854, 3476, 5264, 3618, 5425, 3683, 5309, + 3690, 4973, 3646, 4458, 3541, 3798, 3350, 3031, + 3079, 2197, 2680, 1375, 2182, 571, 1609, 65385, + 988, 64732, 328, 64148, 65182, 63660, 64470, 63200, +63740, 62761, 63016, 62298, 62298, 61811, 61625, 61333, +61013, 60889, 60475, 60500, 60007, 60234, 59592, 60078, +59233, 60047, 58938, 60095, 58712, 60220, 58515, 60367, +58402, 60554, 58350, 60746, 58343, 60969, 58369, 61231, +58464, 61559, 58650, 61947, 58979, 62354, 59454, 62787, +60129, 63240, 61021, 63741, 62117, 64279, 63367, 64901, +64716, 35, 546, 772, 1878, 1557, 3119, 2343, + 4192, 3050, 5062, 3654, 5700, 4081, 6140, 4370, + 6370, 4462, 6418, 4410, 6296, 4237, 6079, 3985, + 5805, 3712, 5546, 3427, 5359, 3223, 5299, 3113, + 5370, 3168, 5549, 3342, 5840, 3681, 6169, 4103, + 6485, 4579, 6717, 5007, 6842, 5318, 6840, 5460, + 6678, 5401, 6350, 5121, 5871, 4631, 5254, 3967, + 4514, 3173, 3687, 2312, 2777, 1441, 1822, 636, + 881, 65510, 9, 64998, 64752, 64642, 64035, 64428, +63414, 64316, 62915, 64264, 62495, 64270, 62150, 64250, +61831, 64218, 61554, 64159, 61335, 64068, 61198, 63972, +61177, 63862, 61304, 63762, 61586, 63724, 62034, 63790, +62643, 63984, 63371, 64311, 64141, 64782, 64936, 65400, + 168, 595, 901, 1397, 1554, 2189, 2092, 2938, + 2540, 3540, 2909, 3944, 3196, 4114, 3429, 4057, + 3583, 3804, 3660, 3386, 3660, 2872, 3593, 2301, + 3433, 1718, 3150, 1122, 2764, 518, 2266, 65443, + 1715, 64827, 1065, 64215, 369, 63613, 65179, 63046, +64436, 62489, 63673, 61958, 62950, 61442, 62262, 60918, +61623, 60396, 61059, 59915, 60552, 59529, 60125, 59261, +59727, 59119, 59375, 59112, 59037, 59205, 58720, 59369, +58423, 59554, 58145, 59781, 57932, 60034, 57775, 60337, +57721, 60671, 57808, 61043, 58063, 61426, 58470, 61827, +59081, 62273, 59888, 62771, 60885, 63341, 62036, 64026, +63299, 64801, 64625, 94, 405, 927, 1621, 1734, + 2680, 2432, 3548, 2997, 4191, 3404, 4607, 3650, + 4837, 3760, 4865, 3697, 4746, 3498, 4509, 3186, + 4259, 2843, 4026, 2517, 3873, 2285, 3809, 2188, + 3894, 2258, 4075, 2493, 4356, 2862, 4673, 3309, + 4995, 3757, 5262, 4152, 5469, 4445, 5571, 4584, + 5551, 4546, 5372, 4309, 5065, 3928, 4622, 3375, + 4021, 2738, 3315, 2051, 2513, 1366, 1681, 707, + 862, 118, 79, 65183, 64893, 64817, 64272, 64629, +63728, 64544, 63264, 64561, 62886, 64636, 62548, 64690, +62263, 64689, 62001, 64607, 61818, 64452, 61730, 64255, +61765, 64074, 61913, 63925, 62213, 63869, 62613, 63911, +63134, 64089, 63758, 64403, 64446, 64851, 65181, 65424, + 397, 564, 1157, 1303, 1846, 2051, 2456, 2754, + 2965, 3339, 3411, 3760, 3763, 3993, 4057, 4029, + 4285, 3890, 4461, 3595, 4555, 3184, 4557, 2717, + 4467, 2214, 4261, 1686, 3949, 1151, 3532, 581, + 3065, 19, 2537, 65018, 1940, 64458, 1305, 63868, + 607, 63249, 65441, 62628, 64708, 62023, 64008, 61424, +63346, 60892, 62764, 60419, 62243, 60056, 61784, 59791, +61333, 59602, 60880, 59504, 60412, 59471, 59951, 59520, +59475, 59643, 59025, 59852, 58606, 60094, 58263, 60367, +58021, 60638, 57925, 60924, 57995, 61226, 58231, 61554, +58649, 61960, 59253, 62442, 60034, 63024, 60969, 63678, +62010, 64385, 63108, 65102, 64200, 273, 65255, 982, + 654, 1629, 1434, 2156, 2023, 2536, 2399, 2752, + 2591, 2807, 2589, 2694, 2474, 2436, 2262, 2089, + 2046, 1712, 1856, 1379, 1754, 1105, 1725, 939, + 1831, 917, 2032, 1072, 2332, 1362, 2660, 1747, + 2983, 2167, 3252, 2548, 3468, 2846, 3578, 2986, + 3618, 2967, 3548, 2791, 3362, 2501, 3055, 2099, + 2623, 1614, 2063, 1061, 1422, 493, 752, 65478, + 75, 65016, 64976, 64630, 64384, 64386, 63870, 64269, +63440, 64283, 63020, 64381, 62653, 64510, 62337, 64624, +62072, 64704, 61879, 64731, 61753, 64711, 61731, 64648, +61826, 64614, 62040, 64625, 62341, 64716, 62750, 64901, +63268, 65193, 63908, 78, 64624, 579, 65410, 1165, + 671, 1795, 1467, 2490, 2249, 3206, 2932, 3898, + 3557, 4510, 4132, 5037, 4669, 5448, 5162, 5744, + 5591, 5882, 5949, 5843, 6211, 5689, 6405, 5443, + 6466, 5135, 6424, 4758, 6277, 4350, 6022, 3904, + 5684, 3451, 5220, 2928, 4674, 2326, 4027, 1661, + 3333, 959, 2570, 247, 1813, 65065, 1044, 64345, + 318, 63650, 65154, 63028, 64483, 62499, 63844, 62050, +63243, 61710, 62680, 61459, 62127, 61318, 61592, 61235, +61079, 61156, 60588, 61101, 60126, 61040, 59739, 61022, +59451, 61045, 59247, 61114, 59210, 61261, 59301, 61477, +59557, 61778, 59994, 62152, 60613, 62608, 61414, 63172, +62349, 63844, 63380, 64597, 64456, 65383, 65505, 584, + 892, 1247, 1697, 1740, 2323, 2063, 2746, 2197, + 2973, 2159, 3004, 1980, 2891, 1708, 2640, 1371, + 2317, 1026, 1993, 708, 1721, 449, 1536, 279, + 1455, 224, 1490, 275, 1614, 450, 1792, 721, + 1978, 1051, 2170, 1372, 2328, 1668, 2452, 1865, + 2533, 1947, 2558, 1895, 2469, 1698, 2258, 1383, + 1897, 969, 1397, 495, 777, 3, 97, 65058, +64956, 64646, 64299, 64341, 63711, 64133, 63195, 64018, +62733, 63971, 62310, 63968, 61936, 63970, 61592, 63930, +61282, 63859, 61031, 63742, 60844, 63593, 60762, 63439, +60766, 63294, 60859, 63168, 61084, 63131, 61400, 63185, +61833, 63367, 62364, 63678, 62956, 64133, 63618, 64714, +64311, 65368, 65036, 518, 254, 1222, 997, 1891, + 1739, 2524, 2444, 3078, 3107, 3537, 3701, 3907, + 4225, 4174, 4675, 4342, 5075, 4417, 5398, 4390, + 5657, 4278, 5819, 4073, 5864, 3786, 5774, 3425, + 5550, 3019, 5203, 2588, 4754, 2150, 4227, 1686, + 3657, 1176, 3052, 617, 2420, 65519, 1777, 64860, + 1169, 64194, 592, 63584, 57, 63067, 65087, 62657, +64585, 62353, 64075, 62113, 63526, 61920, 62943, 61749, +62324, 61593, 61735, 61471, 61181, 61392, 60727, 61369, +60360, 61401, 60080, 61484, 59918, 61615, 59867, 61810, +59972, 62063, 60237, 62422, 60718, 62879, 61421, 63453, +62306, 64140, 63295, 64896, 64344, 132, 65357, 864, + 750, 1519, 1543, 2026, 2174, 2350, 2627, 2487, + 2879, 2442, 2970, 2256, 2884, 1967, 2673, 1593, + 2383, 1186, 2068, 803, 1805, 463, 1604, 201, + 1493, 61, 1463, 40, 1525, 148, 1627, 335, + 1776, 577, 1943, 813, 2102, 1054, 2229, 1224, + 2300, 1306, 2299, 1290, 2211, 1162, 2015, 939, + 1717, 624, 1317, 241, 816, 65375, 235, 64972, +65165, 64598, 64513, 64267, 63893, 64010, 63296, 63834, +62791, 63733, 62324, 63692, 61929, 63669, 61586, 63637, +61302, 63590, 61052, 63499, 60873, 63397, 60771, 63300, +60750, 63239, 60835, 63235, 60998, 63301, 61237, 63441, +61574, 63649, 61955, 63915, 62417, 64272, 62913, 64700, +63466, 65203, 64067, 225, 64686, 829, 65302, 1435, + 383, 2015, 1002, 2538, 1616, 2990, 2224, 3379, + 2834, 3678, 3427, 3927, 3946, 4094, 4370, 4180, + 4685, 4190, 4878, 4130, 4948, 3977, 4928, 3757, + 4817, 3483, 4609, 3146, 4278, 2753, 3864, 2297, + 3369, 1792, 2826, 1260, 2286, 694, 1745, 119, + 1243, 65104, 752, 64558, 308, 64091, 65418, 63662, +64971, 63292, 64479, 62972, 63961, 62707, 63405, 62478, +62854, 62269, 62290, 62056, 61740, 61877, 61219, 61704, +60755, 61559, 60365, 61472, 60089, 61461, 59955, 61585, +59993, 61854, 60257, 62290, 60771, 62863, 61494, 63575, +62398, 64354, 63418, 65183, 64507, 451, 30, 1220, + 1007, 1903, 1879, 2467, 2595, 2849, 3150, 3047, + 3517, 3051, 3720, 2886, 3764, 2612, 3667, 2243, + 3479, 1867, 3235, 1510, 2970, 1209, 2722, 998, + 2559, 876, 2494, 857, 2535, 915, 2642, 1066, + 2802, 1274, 2991, 1497, 3172, 1716, 3312, 1866, + 3377, 1937, 3362, 1903, 3240, 1793, 3039, 1568, + 2728, 1259, 2326, 873, 1833, 450, 1253, 17, + 634, 65156, 7, 64814, 64914, 64564, 64303, 64409, +63737, 64323, 63250, 64289, 62823, 64246, 62453, 64193, +62166, 64099, 61961, 64012, 61827, 63891, 61730, 63795, +61638, 63726, 61571, 63692, 61519, 63702, 61510, 63765, +61592, 63881, 61770, 64044, 62056, 64280, 62487, 64554, +62991, 64898, 63533, 65310, 64085, 224, 64645, 736, +65214, 1250, 263, 1774, 886, 2275, 1556, 2740, + 2233, 3146, 2869, 3477, 3430, 3744, 3895, 3912, + 4217, 4018, 4416, 4033, 4480, 3963, 4431, 3830, + 4251, 3605, 3974, 3311, 3616, 2922, 3208, 2490, + 2746, 1995, 2293, 1488, 1787, 918, 1542, 568, + 1428, 339, 1208, 8, 1255, 65517, 1327, 48, + 1163, 65528, 785, 65340, 115, 64889, 64406, 63916, +62676, 62462, 60956, 60997, 59746, 60009, 59013, 59481, +58679, 59332, 58758, 59594, 59110, 60147, 59589, 60810, +59997, 61326, 60093, 61493, 60215, 61609, 60632, 61981, +61243, 62510, 62128, 63273, 63182, 64174, 64129, 64932, +64774, 65329, 65242, 65472, 169, 65513, 366, 65261, + 276, 64709, 287, 64291, 517, 64140, 1035, 64347, + 1705, 64818, 2349, 65339, 3043, 449, 3630, 1003, + 4015, 1384, 4208, 1590, 4270, 1716, 4335, 1883, + 4349, 2017, 4524, 2326, 5050, 2986, 5699, 3766, + 6176, 4346, 6361, 4595, 6235, 4508, 5732, 4015, + 5010, 3297, 4329, 2639, 3879, 2269, 3708, 2211, + 3724, 2453, 3876, 2906, 4055, 3478, 4033, 3908, + 3675, 3993, 3063, 3818, 2363, 3504, 1615, 3042, + 889, 2526, 258, 2026, 65242, 1531, 64771, 1085, +64351, 646, 63802, 90, 63092, 64896, 62237, 64016, +61268, 63025, 60392, 62094, 59841, 61467, 59700, 61200, +59875, 61251, 60304, 61542, 60885, 62000, 61453, 62475, +61802, 62775, 61901, 62852, 61888, 62778, 61803, 62621, +61781, 62463, 61941, 62451, 62388, 62696, 63096, 63220, +63990, 63950, 64867, 64699, 65507, 65218, 247, 65408, + 164, 65230, 65331, 64782, 64813, 64207, 64295, 63638, +63849, 63132, 63510, 62738, 63298, 62474, 63129, 62222, +62842, 61862, 62336, 61309, 61606, 60587, 60720, 59750, +59798, 58917, 59039, 58266, 58530, 57904, 58305, 57857, +58330, 58086, 58545, 58484, 58808, 58982, 59099, 59502, +59387, 60049, 59719, 60638, 60131, 61285, 60650, 62037, +61281, 62874, 62061, 63829, 62988, 64905, 64038, 521, +65136, 1714, 726, 2886, 1828, 3974, 2881, 4919, + 3861, 5698, 4749, 6303, 5580, 6782, 6369, 7173, + 7070, 7454, 7600, 7602, 7917, 7567, 8001, 7394, + 7932, 7138, 7784, 6857, 7649, 6613, 7600, 6463, + 7628, 6411, 7703, 6409, 7748, 6426, 7706, 6374, + 7579, 6269, 7408, 6151, 7226, 6036, 7035, 5895, + 6844, 5690, 6637, 5388, 6391, 5010, 6059, 4541, + 5599, 4014, 5010, 3424, 4275, 2793, 3409, 2144, + 2493, 1505, 1550, 857, 580, 123, 65057, 64847, +63949, 63925, 62779, 62961, 61614, 61960, 60470, 60957, +59396, 60013, 58493, 59204, 57814, 58593, 57432, 58242, +57340, 58138, 57472, 58258, 57750, 58554, 58086, 58918, +58389, 59268, 58589, 59502, 58645, 59620, 58611, 59644, +58557, 59617, 58572, 59616, 58700, 59702, 59046, 59953, +59643, 60455, 60519, 61219, 61636, 62221, 62964, 63431, +64414, 64751, 348, 545, 1765, 1813, 3052, 2950, + 4195, 3951, 5170, 4831, 6009, 5618, 6700, 6277, + 7214, 6791, 7567, 7185, 7794, 7423, 7922, 7550, + 7933, 7541, 7780, 7374, 7486, 7040, 7059, 6569, + 6547, 6035, 6033, 5504, 5555, 5048, 5184, 4747, + 4926, 4618, 4767, 4644, 4635, 4746, 4493, 4845, + 4332, 4899, 4156, 4890, 3912, 4778, 3557, 4498, + 3056, 4038, 2423, 3438, 1683, 2793, 858, 2118, +65495, 1404, 64557, 690, 63657, 8, 62911, 64977, +62422, 64588, 62233, 64401, 62357, 64427, 62734, 64645, +63263, 64954, 63793, 65237, 64158, 65325, 64242, 65091, +64043, 64544, 63632, 63817, 63106, 62995, 62598, 62232, +62263, 61648, 62163, 61339, 62313, 61307, 62591, 61436, +62840, 61578, 62902, 61570, 62664, 61309, 62130, 60782, +61369, 60030, 60542, 59194, 59807, 58422, 59283, 57804, +59040, 57408, 59073, 57278, 59359, 57418, 59829, 57789, +60427, 58322, 61061, 58990, 61629, 59628, 62019, 60180, +62189, 60554, 62149, 60757, 61953, 60818, 61682, 60821, +61457, 60862, 61395, 61031, 61550, 61405, 61952, 61955, +62585, 62681, 63379, 63525, 64295, 64488, 65280, 65483, + 685, 906, 1534, 1797, 2252, 2597, 2873, 3321, + 3407, 3958, 3846, 4484, 4189, 4897, 4440, 5192, + 4595, 5358, 4694, 5476, 4737, 5547, 4787, 5612, + 4847, 5670, 4956, 5737, 5165, 5842, 5461, 5992, + 5820, 6159, 6173, 6293, 6425, 6371, 6552, 6355, + 6554, 6257, 6427, 6078, 6178, 5832, 5857, 5517, + 5490, 5174, 5056, 4792, 4613, 4349, 4140, 3836, + 3596, 3230, 2965, 2563, 2273, 1823, 1537, 1003, + 748, 99, 65510, 64727, 64780, 63857, 64141, 63119, +63571, 62510, 63033, 62015, 62445, 61549, 61713, 61002, +60787, 60244, 59644, 59270, 58399, 58137, 57171, 56961, +56105, 55922, 55315, 55181, 54962, 54915, 55067, 55162, +55584, 55905, 56407, 56968, 57382, 58181, 58322, 59351, +59125, 60277, 59691, 60928, 60051, 61288, 60277, 61477, +60453, 61589, 60701, 61742, 61072, 61994, 61613, 62350, +62309, 62824, 63138, 63404, 64064, 64063, 65039, 64792, + 499, 29, 1506, 858, 2443, 1707, 3277, 2498, + 3983, 3201, 4561, 3793, 5039, 4303, 5453, 4757, + 5849, 5193, 6301, 5626, 6647, 6006, 6987, 6333, + 7358, 6578, 7632, 6777, 7794, 6871, 7870, 6903, + 7773, 6899, 7520, 6925, 7232, 7019, 7116, 7200, + 7197, 7434, 7382, 7725, 7633, 8031, 7910, 8315, + 8122, 8537, 8143, 8619, 7834, 8495, 7175, 8107, + 6331, 7468, 5288, 6590, 4120, 5526, 2894, 4381, + 1635, 3172, 292, 1964, 64496, 809, 63342, 65328, +62385, 64481, 61585, 63800, 60991, 63241, 60644, 62766, +60500, 62350, 60535, 61986, 60608, 61669, 60728, 61363, +60865, 61091, 61042, 60911, 61241, 60839, 61495, 60884, +61839, 61054, 62234, 61342, 62631, 61714, 63120, 62116, +63563, 62438, 63836, 62627, 63827, 62590, 63537, 62299, +62987, 61753, 62225, 61041, 61460, 60239, 60842, 59480, +60535, 58928, 60533, 58621, 60823, 58596, 61316, 58814, +61873, 59184, 62271, 59601, 62486, 59946, 62496, 60187, +62353, 60301, 62069, 60297, 61708, 60163, 61297, 59991, +60899, 59786, 60551, 59600, 60279, 59466, 60045, 59449, +59915, 59598, 59916, 59964, 60104, 60581, 60527, 61449, +61207, 62508, 62048, 63672, 62962, 64869, 63873, 455, +64707, 1478, 65414, 2385, 455, 3206, 969, 3945, + 1446, 4632, 1972, 5257, 2548, 5815, 3182, 6270, + 3854, 6596, 4521, 6795, 5120, 6866, 5554, 6831, + 5756, 6672, 5691, 6417, 5407, 6049, 5025, 5663, + 4673, 5325, 4467, 5220, 4440, 5371, 4619, 5670, + 4893, 6137, 5120, 6587, 5168, 6813, 4950, 6734, + 4543, 6339, 4034, 5610, 3572, 4657, 3228, 3704, + 3041, 2997, 2984, 2577, 2983, 2359, 2938, 2256, + 2734, 2150, 2297, 1858, 1615, 1236, 718, 223, +65198, 64517, 64126, 63274, 63138, 62124, 62375, 61227, +61890, 60669, 61719, 60396, 61800, 60371, 62072, 60504, +62394, 60814, 62715, 61124, 62955, 61330, 63097, 61479, +63146, 61559, 63116, 61612, 63000, 61598, 62825, 61513, +62564, 61385, 62305, 61224, 62110, 61080, 62096, 61045, +62284, 61157, 62712, 61479, 63314, 61935, 64024, 62531, +64750, 63278, 65430, 64084, 497, 64853, 1076, 15, + 1587, 656, 2032, 1194, 2413, 1655, 2732, 2074, + 3002, 2488, 3191, 2895, 3327, 3273, 3376, 3591, + 3332, 3803, 3163, 3854, 2906, 3732, 2603, 3518, + 2333, 3338, 2159, 3259, 2144, 3342, 2309, 3660, + 2644, 4161, 3105, 4818, 3622, 5564, 4142, 6272, + 4607, 6847, 4997, 7201, 5239, 7276, 5304, 7084, + 5129, 6677, 4724, 6115, 4074, 5412, 3196, 4595, + 2126, 3732, 952, 2821, 65311, 1883, 64252, 914, +63394, 40, 62815, 64821, 62553, 64214, 62609, 63830, +62964, 63702, 63552, 63825, 64325, 64145, 65183, 64602, + 529, 65095, 1413, 8, 2272, 412, 3101, 761, + 3862, 1083, 4515, 1399, 5018, 1665, 5302, 1793, + 5340, 1776, 5098, 1567, 4568, 1110, 3800, 379, + 2850, 64970, 1807, 63846, 741, 62654, 65242, 61439, +64302, 60344, 63481, 59402, 62800, 58656, 62256, 58110, +61845, 57724, 61540, 57512, 61356, 57437, 61217, 57488, +61083, 57611, 60877, 57788, 60580, 57930, 60190, 58045, +59721, 58075, 59221, 58077, 58720, 58091, 58314, 58200, +58080, 58495, 58081, 58977, 58330, 59680, 58804, 60553, +59435, 61561, 60163, 62609, 60814, 63569, 61296, 64335, +61517, 64824, 61505, 65033, 61330, 65015, 61085, 64885, +60904, 64756, 60912, 64751, 61151, 64924, 61617, 65248, +62265, 130, 62971, 601, 63632, 1063, 64217, 1507, +64672, 1953, 65030, 2421, 65308, 2896, 57, 3391, + 383, 3899, 740, 4394, 1151, 4825, 1553, 5133, + 1966, 5315, 2329, 5366, 2655, 5311, 2907, 5160, + 3118, 4941, 3287, 4682, 3429, 4376, 3539, 4026, + 3619, 3664, 3684, 3286, 3700, 2868, 3621, 2397, + 3407, 1839, 3024, 1208, 2497, 464, 1824, 65167, + 1035, 64236, 162, 63214, 64780, 62165, 63854, 61119, +62978, 60113, 62226, 59228, 61652, 58536, 61283, 58099, +61145, 57952, 61220, 58080, 61492, 58445, 61862, 58997, +62258, 59646, 62609, 60311, 62879, 60951, 63049, 61492, +63135, 61930, 63196, 62211, 63210, 62393, 63235, 62510, +63267, 62619, 63332, 62752, 63437, 62936, 63587, 63210, +63818, 63592, 64148, 64092, 64559, 64705, 65049, 65391, + 52, 556, 623, 1290, 1194, 1999, 1729, 2683, + 2185, 3321, 2530, 3906, 2781, 4436, 2946, 4865, + 3010, 5160, 3032, 5359, 3011, 5470, 2944, 5511, + 2842, 5570, 2697, 5649, 2568, 5783, 2477, 5976, + 2492, 6263, 2696, 6629, 3118, 7092, 3802, 7588, + 4694, 8133, 5744, 8659, 6817, 9172, 7769, 9666, + 8470, 10078, 8863, 10368, 8898, 10506, 8617, 10457, + 8049, 10177, 7285, 9610, 6380, 8733, 5383, 7647, + 4372, 6372, 3371, 4993, 2454, 3631, 1632, 2336, + 982, 1235, 546, 349, 356, 65246, 405, 64785, + 681, 64482, 1155, 64282, 1768, 64202, 2518, 64251, + 3327, 64424, 4133, 64739, 4855, 65187, 5474, 183, + 5915, 750, 6201, 1266, 6294, 1685, 6201, 1962, + 5906, 2022, 5422, 1801, 4739, 1292, 3897, 477, + 2895, 64955, 1798, 63722, 673, 62380, 65129, 61069, +64146, 59902, 63295, 58972, 62542, 58303, 61851, 57891, +61169, 57697, 60461, 57656, 59695, 57685, 58858, 57671, +57925, 57555, 56968, 57336, 56022, 57068, 55212, 56812, +54588, 56654, 54221, 56628, 54105, 56787, 54232, 57110, +54505, 57614, 54900, 58210, 55355, 58860, 55833, 59521, +56311, 60144, 56802, 60732, 57342, 61290, 57927, 61842, +58541, 62374, 59251, 62888, 60012, 63408, 60842, 63936, +61691, 64481, 62537, 65046, 63360, 98, 64157, 702, +64893, 1295, 4, 1884, 556, 2438, 986, 2895, + 1322, 3262, 1612, 3526, 1856, 3695, 2079, 3754, + 2295, 3737, 2562, 3691, 2891, 3676, 3273, 3690, + 3716, 3795, 4175, 3958, 4647, 4168, 5080, 4363, + 5398, 4465, 5597, 4443, 5636, 4275, 5545, 3979, + 5341, 3622, 5052, 3215, 4681, 2800, 4251, 2391, + 3749, 1962, 3177, 1488, 2525, 896, 1819, 178, + 1067, 64881, 328, 63966, 65167, 63052, 64573, 62219, +64071, 61543, 63713, 61066, 63465, 60834, 63349, 60801, +63319, 60962, 63333, 61211, 63379, 61505, 63379, 61753, +63317, 61927, 63130, 61951, 62839, 61838, 62445, 61625, +62044, 61389, 61709, 61177, 61541, 61041, 61586, 61044, +61834, 61190, 62257, 61514, 62774, 61976, 63322, 62576, +63835, 63282, 64335, 64034, 64771, 64818, 65204, 18, + 24, 701, 362, 1326, 681, 1880, 927, 2348, + 1087, 2713, 1125, 2982, 1058, 3146, 875, 3252, + 661, 3285, 413, 3292, 239, 3307, 152, 3341, + 240, 3452, 517, 3637, 1003, 3924, 1664, 4288, + 2457, 4714, 3332, 5214, 4223, 5774, 5060, 6371, + 5805, 6974, 6416, 7586, 6883, 8120, 7167, 8567, + 7295, 8876, 7261, 8999, 7068, 8930, 6722, 8666, + 6276, 8212, 5742, 7596, 5161, 6873, 4555, 6041, + 3951, 5174, 3402, 4270, 2960, 3434, 2646, 2684, + 2493, 2038, 2495, 1523, 2645, 1144, 2919, 890, + 3269, 748, 3664, 716, 4095, 798, 4523, 1009, + 4920, 1321, 5254, 1723, 5524, 2174, 5672, 2576, + 5674, 2824, 5520, 2862, 5210, 2618, 4733, 2089, + 4117, 1283, 3382, 238, 2538, 64556, 1633, 63259, + 687, 61954, 65265, 60714, 64292, 59635, 63288, 58704, +62304, 57962, 61317, 57360, 60359, 56893, 59408, 56504, +58480, 56164, 57560, 55850, 56702, 55570, 55945, 55325, +55320, 55170, 54845, 55120, 54541, 55211, 54427, 55477, +54498, 55894, 54735, 56434, 55099, 57057, 55532, 57710, +56011, 58297, 56491, 58813, 56962, 59203, 57368, 59486, +57724, 59618, 58050, 59677, 58357, 59679, 58658, 59706, +58977, 59828, 59376, 60097, 59847, 60551, 60408, 61179, +61062, 61968, 61775, 62863, 62532, 63822, 63298, 64802, +64032, 209, 64691, 1081, 65260, 1862, 212, 2532, + 639, 3134, 1001, 3650, 1345, 4111, 1687, 4511, + 2058, 4823, 2465, 5068, 2885, 5209, 3309, 5269, + 3683, 5256, 4002, 5199, 4231, 5158, 4377, 5134, + 4449, 5121, 4426, 5102, 4289, 5038, 4063, 4872, + 3707, 4565, 3247, 4091, 2660, 3449, 1962, 2645, + 1164, 1729, 309, 728, 65011, 65250, 64215, 64285, +63561, 63431, 63032, 62768, 62725, 62320, 62624, 62111, +62744, 62130, 63017, 62345, 63367, 62680, 63757, 63058, +64113, 63417, 64403, 63703, 64584, 63859, 64660, 63875, +64616, 63757, 64496, 63512, 64324, 63206, 64132, 62877, +63973, 62609, 63866, 62438, 63870, 62416, 63986, 62516, +64235, 62768, 64607, 63157, 65075, 63634, 58, 64195, + 595, 64790, 1119, 65412, 1584, 511, 1997, 1156, + 2292, 1786, 2462, 2364, 2496, 2899, 2403, 3376, + 2208, 3764, 1947, 4086, 1650, 4317, 1367, 4470, + 1147, 4559, 1048, 4624, 1092, 4710, 1307, 4837, + 1703, 5022, 2245, 5296, 2957, 5663, 3759, 6111, + 4610, 6618, 5445, 7197, 6224, 7795, 6880, 8416, + 7371, 9010, 7617, 9516, 7660, 9889, 7449, 10050, + 7028, 9964, 6403, 9605, 5639, 8969, 4757, 8096, + 3843, 7081, 2953, 5989, 2141, 4884, 1459, 3814, + 947, 2809, 648, 1916, 554, 1140, 652, 493, + 938, 16, 1374, 65256, 1932, 65133, 2569, 65215, + 3249, 65475, 3914, 311, 4538, 775, 5092, 1250, + 5549, 1721, 5904, 2087, 6103, 2324, 6161, 2352, + 6080, 2212, 5882, 1855, 5561, 1289, 5141, 564, + 4664, 65265, 4132, 64386, 3554, 63516, 2941, 62705, + 2264, 61989, 1506, 61371, 686, 60849, 65327, 60397, +64372, 59968, 63368, 59532, 62334, 59064, 61316, 58587, +60324, 58105, 59417, 57663, 58633, 57316, 57995, 57085, +57551, 57036, 57307, 57149, 57262, 57438, 57379, 57817, +57611, 58271, 57878, 58743, 58184, 59183, 58480, 59574, +58765, 59885, 59034, 60120, 59318, 60281, 59623, 60399, +59978, 60508, 60368, 60667, 60817, 60906, 61294, 61232, +61785, 61672, 62270, 62182, 62746, 62749, 63148, 63323, +63494, 63903, 63755, 64461, 63935, 64990, 64012, 65478, +64040, 396, 64058, 842, 64118, 1219, 64255, 1524, +64492, 1759, 64836, 1934, 65264, 2065, 196, 2172, + 649, 2264, 1027, 2331, 1291, 2360, 1463, 2384, + 1554, 2387, 1542, 2369, 1463, 2315, 1340, 2235, + 1139, 2104, 864, 1904, 507, 1604, 69, 1168, +65110, 623, 64568, 65523, 64048, 64840, 63575, 64130, +63205, 63478, 62940, 62917, 62787, 62469, 62774, 62160, +62875, 61987, 63072, 61945, 63299, 61997, 63548, 62100, +63752, 62235, 63894, 62373, 63958, 62483, 63943, 62512, +63867, 62476, 63736, 62388, 63578, 62270, 63420, 62161, +63313, 62091, 63273, 62117, 63367, 62260, 63600, 62537, +64001, 62927, 64540, 63424, 65195, 63986, 338, 64575, + 991, 65172, 1537, 194, 1967, 694, 2246, 1160, + 2402, 1597, 2447, 2019, 2405, 2396, 2319, 2767, + 2151, 3112, 1951, 3437, 1681, 3732, 1400, 3990, + 1122, 4245, 858, 4492, 673, 4734, 590, 4975, + 673, 5215, 898, 5438, 1262, 5673, 1755, 5934, + 2332, 6208, 2936, 6512, 3494, 6821, 3961, 7127, + 4310, 7398, 4522, 7606, 4589, 7731, 4468, 7769, + 4231, 7729, 3878, 7595, 3464, 7364, 2970, 7029, + 2443, 6574, 1932, 6020, 1456, 5390, 1021, 4690, + 652, 3961, 383, 3259, 240, 2598, 197, 2026, + 305, 1545, 502, 1188, 781, 927, 1135, 757, + 1533, 649, 1960, 625, 2392, 648, 2843, 732, + 3287, 846, 3709, 989, 4077, 1109, 4383, 1173, + 4614, 1161, 4755, 1022, 4783, 758, 4693, 330, + 4511, 65325, 4245, 64659, 3889, 63915, 3472, 63134, + 3008, 62368, 2487, 61667, 1909, 61048, 1280, 60511, + 581, 60065, 65399, 59666, 64663, 59282, 63964, 58927, +63304, 58608, 62727, 58342, 62255, 58182, 61871, 58147, +61593, 58278, 61413, 58562, 61314, 58990, 61274, 59494, +61280, 60050, 61311, 60583, 61356, 61062, 61410, 61464, +61464, 61757, 61513, 61956, 61549, 62084, 61624, 62129, +61716, 62153, 61876, 62156, 62110, 62194, 62395, 62293, +62748, 62482, 63149, 62807, 63556, 63261, 63949, 63855, +64312, 64577, 64604, 65366, 64826, 638, 64981, 1392, +65064, 2072, 65105, 2637, 65111, 3075, 65115, 3389, +65116, 3575, 65140, 3649, 65155, 3651, 65186, 3597, +65260, 3537, 65383, 3453, 65532, 3392, 160, 3349, + 316, 3296, 443, 3196, 477, 3042, 382, 2804, + 168, 2486, 65376, 2073, 64922, 1551, 64361, 941, +63709, 231, 63002, 64987, 62265, 64115, 61518, 63220, +60798, 62319, 60156, 61463, 59620, 60680, 59218, 60006, +58973, 59473, 58896, 59104, 58989, 58918, 59234, 58887, +59611, 59013, 60087, 59237, 60610, 59526, 61144, 59817, +61642, 60088, 62063, 60307, 62417, 60472, 62681, 60598, +62917, 60715, 63144, 60861, 63416, 61058, 63726, 61338, +64104, 61683, 64518, 62096, 64981, 62557, 65471, 63055, + 466, 63562, 1029, 64084, 1589, 64608, 2136, 65150, + 2623, 198, 3065, 805, 3413, 1441, 3641, 2085, + 3760, 2717, 3766, 3304, 3671, 3859, 3510, 4337, + 3251, 4775, 3010, 5164, 2771, 5553, 2617, 5951, + 2568, 6369, 2677, 6796, 2968, 7239, 3439, 7697, + 4068, 8143, 4798, 8579, 5575, 9011, 6346, 9435, + 7065, 9869, 7654, 10288, 8083, 10679, 8298, 10969, + 8321, 11148, 8117, 11167, 7736, 11017, 7182, 10676, + 6516, 10182, 5776, 9550, 5002, 8825, 4208, 8027, + 3473, 7189, 2837, 6351, 2309, 5526, 1940, 4745, + 1732, 4036, 1671, 3402, 1710, 2866, 1847, 2430, + 2011, 2088, 2222, 1821, 2439, 1593, 2651, 1392, + 2848, 1180, 3007, 959, 3133, 714, 3218, 440, + 3239, 130, 3206, 65309, 3126, 64900, 2994, 64416, + 2801, 63887, 2533, 63283, 2193, 62629, 1774, 61948, + 1323, 61254, 828, 60556, 310, 59886, 65315, 59228, +64755, 58603, 64181, 58020, 63576, 57524, 62934, 57076, +62257, 56712, 61587, 56438, 60949, 56272, 60379, 56220, +59902, 56293, 59532, 56458, 59298, 56746, 59160, 57098, +59135, 57538, 59175, 58011, 59282, 58510, 59464, 59030, +59701, 59523, 60008, 59998, 60351, 60422, 60759, 60814, +61205, 61148, 61667, 61450, 62135, 61725, 62590, 62029, +63028, 62349, 63445, 62754, 63856, 63210, 64249, 63732, +64639, 64292, 64993, 64939, 65308, 58, 41, 723, + 222, 1364, 351, 1933, 429, 2418, 477, 2785, + 546, 3023, 632, 3183, 778, 3263, 949, 3329, + 1162, 3396, 1360, 3484, 1559, 3585, 1713, 3697, + 1814, 3804, 1853, 3852, 1835, 3853, 1749, 3756, + 1608, 3582, 1397, 3299, 1119, 2903, 752, 2421, + 315, 1857, 65355, 1231, 64795, 569, 64186, 65416, +63542, 64705, 62875, 63973, 62233, 63259, 61634, 62551, +61111, 61881, 60677, 61235, 60362, 60674, 60151, 60179, +60013, 59770, 59944, 59466, 59975, 59242, 60049, 59096, +60196, 59008, 60364, 58990, 60550, 59024, 60751, 59110, +60961, 59238, 61153, 59394, 61358, 59594, 61567, 59831, +61812, 60108, 62083, 60404, 62410, 60757, 62779, 61165, +63168, 61624, 63582, 62121, 64026, 62637, 64471, 63166, +64891, 63712, 65294, 64238, 92, 64772, 397, 65291, + 630, 278, 792, 814, 853, 1366, 852, 1946, + 797, 2547, 730, 3167, 692, 3784, 706, 4419, + 806, 5039, 1039, 5639, 1410, 6216, 1923, 6753, + 2551, 7261, 3258, 7737, 4025, 8192, 4809, 8623, + 5551, 9019, 6215, 9413, 6749, 9757, 7149, 10075, + 7381, 10331, 7460, 10522, 7394, 10596, 7219, 10528, + 6931, 10312, 6567, 9952, 6156, 9493, 5694, 8924, + 5240, 8312, 4780, 7678, 4360, 7041, 3962, 6423, + 3597, 5834, 3283, 5259, 3007, 4717, 2761, 4177, + 2582, 3684, 2435, 3240, 2348, 2830, 2311, 2468, + 2318, 2151, 2373, 1874, 2473, 1619, 2591, 1355, + 2743, 1105, 2866, 825, 2944, 533, 2976, 188, + 2905, 65345, 2758, 64895, 2506, 64371, 2159, 63762, + 1712, 63076, 1190, 62353, 597, 61598, 65498, 60857, +64832, 60142, 64147, 59482, 63483, 58887, 62864, 58383, +62309, 57972, 61812, 57650, 61370, 57420, 60997, 57279, +60688, 57222, 60463, 57254, 60326, 57390, 60262, 57613, +60261, 57933, 60319, 58320, 60417, 58765, 60533, 59225, +60647, 59687, 60776, 60089, 60904, 60426, 61045, 60678, +61202, 60882, 61405, 61060, 61664, 61216, 61993, 61414, +62396, 61674, 62861, 62024, 63371, 62477, 63895, 63018, +64433, 63672, 64946, 64391, 65417, 65143, 304, 365, + 682, 1101, 1013, 1800, 1291, 2429, 1494, 2973, + 1660, 3421, 1780, 3788, 1891, 4059, 1972, 4261, + 2067, 4396, 2193, 4492, 2351, 4578, 2550, 4633, + 2762, 4682, 2985, 4694, 3157, 4676, 3270, 4580, + 3310, 4416, 3253, 4156, 3080, 3823, 2812, 3391, + 2416, 2874, 1916, 2283, 1294, 1631, 589, 942, +65358, 223, 64539, 65033, 63724, 64299, 62956, 63572, +62277, 62872, 61692, 62225, 61270, 61636, 60976, 61121, +60819, 60692, 60776, 60365, 60847, 60134, 60986, 59978, +61179, 59909, 61387, 59902, 61590, 59969, 61783, 60060, +61939, 60179, 62085, 60303, 62203, 60437, 62328, 60578, +62441, 60738, 62596, 60915, 62785, 61130, 63024, 61391, +63307, 61702, 63651, 62054, 64035, 62441, 64447, 62874, +64873, 63321, 65301, 63799, 126, 64277, 432, 64750, + 638, 65208, 739, 118, 714, 552, 583, 967, + 376, 1398, 131, 1827, 65438, 2241, 65240, 2639, +65133, 3029, 65119, 3410, 65258, 3787, 3, 4173, + 418, 4577, 976, 5019, 1615, 5494, 2343, 6021, + 3114, 6586, 3912, 7140, 4680, 7680, 5365, 8170, + 5930, 8576, 6342, 8873, 6543, 9050, 6574, 9107, + 6422, 9044, 6150, 8861, 5777, 8553, 5372, 8158, + 4937, 7672, 4509, 7124, 4111, 6519, 3751, 5906, + 3425, 5312, 3126, 4766, 2893, 4301, 2714, 3901, + 2612, 3580, 2559, 3321, 2578, 3116, 2644, 2911, + 2741, 2720, 2857, 2517, 2966, 2308, 3069, 2092, + 3136, 1863, 3182, 1625, 3187, 1363, 3191, 1080, + 3143, 766, 3074, 389, 2971, 65511, 2795, 65024, + 2540, 64471, 2198, 63872, 1747, 63222, 1216, 62548, + 591, 61847, 65467, 61143, 64786, 60455, 64085, 59796, +63415, 59165, 62762, 58610, 62172, 58118, 61594, 57724, +61071, 57442, 60590, 57290, 60160, 57234, 59808, 57288, +59556, 57410, 59416, 57605, 59360, 57847, 59366, 58105, +59425, 58393, 59510, 58679, 59624, 58969, 59775, 59260, +59975, 59538, 60211, 59789, 60489, 60044, 60802, 60281, +61144, 60543, 61503, 60839, 61876, 61198, 62249, 61623, +62642, 62127, 63034, 62712, 63445, 63339, 63841, 64020, +64220, 64712, 64588, 65403, 64948, 526, 65292, 1127, + 77, 1663, 389, 2128, 682, 2558, 937, 2925, + 1182, 3266, 1406, 3577, 1608, 3860, 1807, 4097, + 2010, 4279, 2222, 4407, 2449, 4480, 2653, 4501, + 2829, 4465, 2953, 4350, 3014, 4168, 2995, 3891, + 2872, 3537, 2679, 3103, 2387, 2616, 2046, 2113, + 1635, 1603, 1179, 1108, 692, 625, 171, 161, +65184, 65227, 64641, 64698, 64081, 64135, 63564, 63540, +63088, 62932, 62673, 62340, 62360, 61815, 62139, 61381, +62038, 61023, 62059, 60792, 62141, 60622, 62277, 60528, +62417, 60477, 62542, 60471, 62650, 60511, 62744, 60593, +62823, 60711, 62899, 60867, 63013, 61056, 63174, 61270, +63370, 61499, 63590, 61749, 63829, 61992, 64069, 62259, +64306, 62524, 64525, 62781, 64708, 63068, 64846, 63345, +64933, 63653, 64976, 63976, 64951, 64342, 64872, 64744, +64747, 65188, 64572, 125, 64389, 633, 64201, 1156, +64046, 1672, 63951, 2182, 63956, 2680, 64091, 3180, +64367, 3685, 64801, 4196, 65363, 4737, 477, 5298, + 1160, 5875, 1846, 6428, 2511, 6983, 3094, 7471, + 3587, 7899, 3997, 8260, 4319, 8547, 4582, 8754, + 4752, 8882, 4861, 8917, 4887, 8818, 4837, 8625, + 4716, 8318, 4542, 7926, 4310, 7461, 4065, 6954, + 3816, 6449, 3593, 5972, 3394, 5525, 3220, 5119, + 3081, 4757, 2966, 4440, 2889, 4157, 2838, 3900, + 2822, 3672, 2859, 3452, 2951, 3231, 3113, 2995, + 3344, 2756, 3627, 2513, 3925, 2255, 4186, 2006, + 4390, 1722, 4479, 1400, 4465, 1014, 4311, 572, + 4032, 41, 3636, 64992, 3156, 64324, 2605, 63610, + 1990, 62878, 1325, 62147, 628, 61449, 65448, 60786, +64751, 60202, 64088, 59682, 63504, 59273, 63019, 58939, +62652, 58706, 62388, 58554, 62195, 58489, 62060, 58486, +61933, 58544, 61816, 58648, 61687, 58759, 61541, 58892, +61381, 59019, 61214, 59170, 61068, 59304, 60929, 59422, +60840, 59530, 60792, 59667, 60798, 59812, 60882, 60010, +61034, 60251, 61247, 60577, 61521, 60974, 61852, 61442, +62213, 61963, 62613, 62536, 63023, 63117, 63433, 63704, +63829, 64293, 64195, 64864, 64535, 65431, 64824, 425, +65069, 960, 65274, 1458, 65445, 1926, 52, 2354, + 200, 2756, 367, 3157, 555, 3540, 820, 3934, + 1129, 4330, 1488, 4719, 1887, 5073, 2293, 5365, + 2682, 5569, 3017, 5648, 3278, 5606, 3451, 5424, + 3521, 5142, 3486, 4752, 3341, 4300, 3082, 3781, + 2710, 3243, 2257, 2693, 1714, 2117, 1141, 1523, + 533, 908, 65489, 306, 64944, 65252, 64462, 64675, +64081, 64128, 63796, 63609, 63605, 63131, 63514, 62692, +63471, 62275, 63470, 61892, 63494, 61530, 63501, 61222, +63495, 60952, 63469, 60744, 63429, 60573, 63373, 60433, +63311, 60333, 63233, 60272, 63169, 60238, 63135, 60250, +63156, 60304, 63243, 60420, 63400, 60565, 63626, 60738, +63909, 60948, 64221, 61181, 64525, 61446, 64771, 61736, +64929, 62054, 64995, 62387, 64948, 62728, 64810, 63075, +64593, 63425, 64310, 63777, 64003, 64134, 63689, 64507, +63398, 64891, 63174, 65299, 63050, 190, 63051, 678, +63188, 1213, 63488, 1797, 63938, 2424, 64538, 3083, +65257, 3777, 514, 4473, 1331, 5177, 2144, 5851, + 2881, 6467, 3518, 7024, 4025, 7482, 4397, 7836, + 4651, 8038, 4805, 8117, 4860, 8069, 4835, 7921, + 4745, 7697, 4628, 7405, 4467, 7087, 4304, 6745, + 4151, 6415, 3985, 6090, 3845, 5814, 3695, 5570, + 3558, 5357, 3427, 5169, 3299, 4983, 3201, 4792, + 3128, 4586, 3102, 4357, 3124, 4101, 3188, 3821, + 3285, 3511, 3384, 3193, 3484, 2851, 3559, 2505, + 3591, 2158, 3592, 1811, 3536, 1468, 3418, 1109, + 3240, 725, 2994, 296, 2666, 65354, 2267, 64801, + 1780, 64168, 1219, 63476, 605, 62750, 65484, 62015, +64811, 61304, 64145, 60638, 63499, 60034, 62894, 59509, +62348, 59072, 61870, 58727, 61474, 58466, 61149, 58297, +60898, 58207, 60699, 58203, 60538, 58257, 60409, 58363, +60311, 58491, 60273, 58647, 60241, 58787, 60276, 58951, +60349, 59093, 60453, 59237, 60561, 59400, 60667, 59578, +60782, 59798, 60911, 60048, 61061, 60335, 61236, 60651, +61441, 61013, 61673, 61415, 61938, 61862, 62214, 62333, +62523, 62833, 62836, 63364, 63169, 63909, 63503, 64453, +63841, 65008, 64156, 13, 64439, 547, 64705, 1069, +64956, 1573, 65183, 2055, 65403, 2525, 78, 2977, + 302, 3385, 553, 3747, 807, 4075, 1080, 4327, + 1346, 4542, 1618, 4650, 1856, 4683, 2069, 4599, + 2231, 4439, 2352, 4197, 2389, 3897, 2356, 3566, + 2248, 3232, 2053, 2903, 1781, 2558, 1442, 2222, + 1060, 1842, 646, 1426, 225, 977, 65363, 489, +64987, 65524, 64668, 64990, 64395, 64484, 64183, 63991, +64052, 63549, 63976, 63151, 63979, 62811, 64039, 62537, +64142, 62320, 64280, 62180, 64400, 62101, 64520, 62081, +64615, 62122, 64693, 62193, 64770, 62285, 64867, 62369, +64983, 62433, 65119, 62489, 65282, 62532, 65466, 62576, + 104, 62636, 295, 62702, 476, 62801, 633, 62942, + 750, 63120, 794, 63342, 785, 63602, 686, 63895, + 505, 64221, 259, 64558, 65508, 64915, 65196, 65253, +64904, 60, 64663, 404, 64494, 773, 64403, 1138, +64409, 1504, 64517, 1907, 64732, 2351, 65037, 2861, +65436, 3417, 363, 4016, 904, 4659, 1515, 5349, + 2085, 5982, 2632, 6553, 3106, 7032, 3501, 7406, + 3809, 7666, 4044, 7803, 4203, 7835, 4310, 7757, + 4347, 7594, 4339, 7351, 4252, 7060, 4111, 6718, + 3928, 6343, 3678, 5961, 3400, 5570, 3092, 5201, + 2799, 4841, 2527, 4510, 2302, 4225, 2103, 3965, + 1974, 3728, 1902, 3530, 1905, 3328, 1957, 3136, + 2074, 2941, 2230, 2770, 2409, 2584, 2583, 2383, + 2754, 2148, 2894, 1872, 2975, 1541, 2988, 1162, + 2922, 728, 2775, 247, 2517, 65254, 2181, 64677, + 1771, 64050, 1283, 63387, 743, 62700, 181, 62022, +65170, 61373, 64650, 60769, 64164, 60240, 63725, 59810, +63349, 59478, 63009, 59253, 62731, 59103, 62499, 59016, +62314, 58977, 62175, 58955, 62094, 58953, 62017, 58930, +61957, 58924, 61888, 58918, 61819, 58933, 61734, 58961, +61673, 59023, 61640, 59110, 61645, 59257, 61713, 59448, +61811, 59688, 61940, 59973, 62083, 60310, 62234, 60687, +62372, 61116, 62532, 61575, 62695, 62041, 62882, 62514, +63087, 62986, 63308, 63430, 63503, 63847, 63695, 64249, +63868, 64654, 64021, 65059, 64169, 65467, 64317, 354, +64468, 793, 64611, 1253, 64745, 1708, 64872, 2169, +65013, 2621, 65160, 3062, 65362, 3470, 52, 3834, + 337, 4136, 648, 4346, 961, 4481, 1281, 4502, + 1540, 4434, 1745, 4284, 1863, 4062, 1892, 3797, + 1822, 3484, 1659, 3172, 1431, 2845, 1139, 2515, + 817, 2172, 478, 1821, 146, 1461, 65380, 1078, +65124, 684, 64911, 275, 64773, 65399, 64683, 64988, +64658, 64604, 64667, 64257, 64733, 63947, 64799, 63667, +64886, 63447, 64954, 63249, 65006, 63093, 65052, 62960, +65082, 62857, 65111, 62797, 65122, 62751, 65160, 62735, +65215, 62739, 65301, 62748, 65422, 62751, 48, 62772, + 246, 62802, 463, 62862, 667, 62963, 846, 63082, + 970, 63232, 1027, 63390, 1016, 63551, 943, 63705, + 806, 63887, 620, 64053, 404, 64253, 132, 64438, +65377, 64653, 65073, 64872, 64780, 65106, 64556, 65359, +64406, 97, 64366, 422, 64427, 791, 64600, 1203, +64851, 1657, 65179, 2145, 65523, 2659, 351, 3172, + 708, 3666, 1052, 4112, 1366, 4488, 1629, 4767, + 1833, 4933, 1979, 4999, 2055, 4969, 2061, 4865, + 2027, 4712, 1963, 4547, 1888, 4368, 1805, 4188, + 1730, 4029, 1660, 3866, 1601, 3724, 1529, 3588, + 1469, 3471, 1410, 3389, 1358, 3323, 1314, 3283, + 1273, 3243, 1268, 3207, 1293, 3144, 1341, 3081, + 1437, 2963, 1550, 2834, 1693, 2672, 1828, 2492, + 1969, 2294, 2086, 2096, 2192, 1887, 2259, 1657, + 2286, 1395, 2268, 1088, 2193, 727, 2074, 303, + 1910, 65379, 1692, 64866, 1421, 64328, 1099, 63790, + 737, 63272, 349, 62799, 65499, 62372, 65119, 62007, +64758, 61696, 64428, 61452, 64140, 61270, 63888, 61134, +63667, 61062, 63457, 61010, 63270, 60989, 63109, 60966, +62970, 60937, 62860, 60891, 62813, 60848, 62784, 60811, +62806, 60799, 62837, 60824, 62886, 60902, 62910, 61015, +62932, 61175, 62953, 61349, 62980, 61559, 63016, 61773, +63076, 62005, 63146, 62251, 63237, 62479, 63307, 62721, +63373, 62954, 63436, 63190, 63477, 63453, 63537, 63735, +63620, 64050, 63736, 64387, 63876, 64763, 64061, 65162, +64227, 51, 64384, 494, 64502, 942, 64591, 1383, +64675, 1802, 64763, 2196, 64870, 2541, 65007, 2831, +65196, 3075, 65397, 3260, 95, 3389, 336, 3463, + 580, 3488, 795, 3476, 979, 3433, 1124, 3351, + 1218, 3237, 1248, 3105, 1225, 2940, 1129, 2728, + 992, 2489, 789, 2203, 558, 1885, 284, 1523, + 7, 1140, 65268, 736, 64999, 324, 64772, 65452, +64577, 65064, 64463, 64672, 64397, 64344, 64400, 64055, +64451, 63832, 64544, 63690, 64648, 63603, 64766, 63576, +64887, 63582, 65019, 63603, 65149, 63622, 65289, 63627, +65439, 63628, 51, 63619, 212, 63599, 381, 63565, + 546, 63537, 698, 63512, 848, 63495, 966, 63483, + 1049, 63502, 1098, 63543, 1117, 63639, 1101, 63767, + 1052, 63932, 949, 64123, 805, 64340, 626, 64558, + 440, 64772, 230, 64990, 32, 65216, 65403, 65451, +65290, 178, 65244, 488, 65244, 814, 65306, 1184, +65427, 1584, 74, 2023, 317, 2487, 606, 2958, + 932, 3419, 1261, 3840, 1566, 4219, 1832, 4532, + 2048, 4784, 2242, 4968, 2379, 5070, 2487, 5097, + 2557, 5051, 2601, 4934, 2601, 4751, 2560, 4546, + 2489, 4296, 2383, 4068, 2235, 3828, 2076, 3593, + 1891, 3389, 1710, 3174, 1533, 2982, 1371, 2791, + 1228, 2606, 1118, 2442, 1061, 2297, 1058, 2170, + 1100, 2055, 1185, 1975, 1303, 1896, 1454, 1820, + 1605, 1738, 1759, 1623, 1859, 1469, 1918, 1246, + 1916, 976, 1863, 628, 1765, 233, 1609, 65329, + 1423, 64854, 1208, 64368, 955, 63875, 669, 63391, + 377, 62922, 70, 62496, 65318, 62126, 65037, 61824, +64786, 61591, 64541, 61420, 64319, 61325, 64121, 61254, +63929, 61226, 63762, 61186, 63594, 61157, 63438, 61105, +63306, 61041, 63179, 60976, 63060, 60906, 62974, 60847, +62900, 60806, 62881, 60803, 62893, 60824, 62942, 60909, +63014, 61052, 63102, 61262, 63209, 61509, 63332, 61808, +63449, 62128, 63580, 62452, 63724, 62774, 63870, 63065, +64010, 63339, 64137, 63579, 64248, 63812, 64306, 64028, +64347, 64247, 64348, 64467, 64336, 64710, 64319, 64977, +64319, 65273, 64354, 66, 64409, 430, 64490, 821, +64580, 1227, 64684, 1634, 64792, 2028, 64917, 2374, +65050, 2671, 65222, 2900, 65431, 3081, 119, 3198, + 374, 3253, 611, 3262, 832, 3236, 971, 3157, + 1046, 3050, 1048, 2902, 963, 2712, 804, 2502, + 573, 2238, 301, 1960, 18, 1678, 65272, 1375, +65006, 1073, 64785, 753, 64602, 450, 64484, 150, +64404, 65402, 64381, 65124, 64384, 64873, 64398, 64651, +64442, 64458, 64503, 64299, 64564, 64158, 64629, 64039, +64692, 63944, 64753, 63855, 64795, 63793, 64834, 63735, +64876, 63695, 64935, 63651, 65016, 63597, 65119, 63544, +65251, 63498, 65428, 63474, 75, 63472, 262, 63498, + 434, 63562, 564, 63625, 675, 63730, 732, 63819, + 746, 63934, 704, 64053, 620, 64185, 536, 64336, + 406, 64500, 290, 64668, 141, 64841, 26, 65026, +65450, 65221, 65379, 65453, 65337, 171, 65375, 489, +65465, 842, 83, 1237, 286, 1670, 514, 2115, + 765, 2554, 996, 2968, 1221, 3318, 1409, 3606, + 1569, 3816, 1701, 3953, 1784, 4004, 1836, 3984, + 1845, 3915, 1848, 3800, 1836, 3676, 1824, 3522, + 1815, 3387, 1789, 3248, 1747, 3142, 1678, 3044, + 1601, 2967, 1500, 2901, 1409, 2827, 1308, 2758, + 1219, 2666, 1147, 2584, 1084, 2468, 1052, 2370, + 1040, 2274, 1032, 2181, 1063, 2096, 1095, 1995, + 1139, 1898, 1177, 1781, 1223, 1640, 1262, 1489, + 1296, 1303, 1318, 1091, 1316, 851, 1294, 562, + 1228, 245, 1125, 65434, 993, 65066, 838, 64695, + 664, 64332, 474, 63983, 280, 63669, 66, 63381, +65400, 63141, 65163, 62942, 64910, 62777, 64665, 62674, +64403, 62591, 64171, 62545, 63952, 62496, 63776, 62455, +63647, 62388, 63573, 62313, 63543, 62231, 63535, 62148, +63557, 62090, 63592, 62053, 63624, 62043, 63659, 62072, +63708, 62140, 63770, 62236, 63840, 62367, 63928, 62510, +64004, 62651, 64082, 62811, 64138, 62946, 64186, 63089, +64237, 63207, 64277, 63331, 64334, 63445, 64395, 63590, +64472, 63742, 64571, 63927, 64663, 64141, 64740, 64409, +64802, 64716, 64832, 65053, 64863, 65404, 64871, 213, +64896, 558, 64928, 886, 64982, 1191, 65052, 1461, +65152, 1691, 65259, 1889, 65396, 2021, 8, 2119, + 167, 2169, 359, 2206, 542, 2212, 732, 2227, + 880, 2230, 995, 2228, 1038, 2217, 1020, 2177, + 950, 2103, 816, 1982, 649, 1808, 454, 1609, + 241, 1365, 29, 1103, 65361, 835, 65154, 558, +64966, 282, 64805, 33, 64676, 65328, 64594, 65122, +64541, 64913, 64543, 64757, 64586, 64617, 64644, 64531, +64730, 64470, 64813, 64440, 64903, 64436, 64977, 64446, +65059, 64461, 65148, 64458, 65247, 64449, 65349, 64418, +65463, 64368, 23, 64303, 109, 64233, 181, 64163, + 224, 64116, 269, 64088, 305, 64099, 335, 64134, + 370, 64201, 396, 64287, 414, 64382, 408, 64500, + 393, 64625, 374, 64765, 344, 64911, 299, 65063, + 256, 65219, 213, 65379, 161, 5, 125, 192, + 83, 400, 72, 642, 82, 919, 148, 1205, + 231, 1509, 357, 1815, 496, 2089, 646, 2327, + 797, 2527, 942, 2669, 1084, 2772, 1214, 2825, + 1347, 2840, 1455, 2846, 1543, 2823, 1590, 2789, + 1613, 2747, 1603, 2675, 1569, 2590, 1495, 2471, + 1404, 2347, 1276, 2205, 1144, 2063, 999, 1925, + 860, 1797, 757, 1704, 696, 1626, 683, 1590, + 709, 1550, 775, 1542, 846, 1542, 946, 1530, + 1037, 1527, 1127, 1509, 1190, 1460, 1238, 1385, + 1257, 1261, 1251, 1090, 1214, 862, 1160, 589, + 1079, 269, 988, 65451, 869, 65084, 735, 64708, + 594, 64374, 439, 64067, 277, 63803, 101, 63611, +65504, 63460, 65361, 63380, 65237, 63327, 65116, 63300, +64993, 63300, 64867, 63288, 64745, 63275, 64607, 63243, +64473, 63191, 64345, 63116, 64224, 63021, 64118, 62913, +64021, 62800, 63948, 62703, 63906, 62619, 63886, 62573, +63892, 62560, 63928, 62595, 63962, 62659, 64025, 62762, +64087, 62882, 64161, 63023, 64247, 63171, 64346, 63321, +64438, 63468, 64541, 63613, 64620, 63768, 64685, 63912, +64731, 64070, 64758, 64231, 64769, 64386, 64777, 64555, +64765, 64741, 64759, 64931, 64732, 65151, 64709, 65393, +64677, 120, 64651, 410, 64632, 705, 64648, 980, +64696, 1228, 64799, 1428, 64948, 1595, 65124, 1705, +65309, 1787, 65492, 1856, 96, 1894, 232, 1928, + 325, 1946, 399, 1941, 433, 1916, 438, 1870, + 409, 1789, 345, 1666, 255, 1542, 137, 1375, + 12, 1221, 65424, 1035, 65297, 841, 65188, 652, +65096, 453, 65016, 276, 64945, 100, 64907, 65490, +64882, 65353, 64894, 65241, 64899, 65136, 64933, 65040, +64963, 64946, 65018, 64884, 65074, 64829, 65133, 64796, +65197, 64779, 65261, 64776, 65340, 64776, 65415, 64765, +65498, 64755, 47, 64741, 139, 64717, 219, 64697, + 282, 64651, 320, 64625, 350, 64587, 352, 64575, + 347, 64555, 332, 64544, 307, 64547, 291, 64564, + 257, 64600, 218, 64640, 148, 64686, 60, 64750, +65507, 64831, 65414, 64944, 65332, 65081, 65267, 65276, +65248, 65489, 65264, 191, 65327, 456, 65424, 727, + 10, 1000, 139, 1241, 296, 1474, 433, 1660, + 555, 1820, 672, 1933, 782, 2019, 876, 2054, + 972, 2068, 1054, 2056, 1117, 2040, 1167, 2019, + 1162, 1981, 1142, 1953, 1061, 1913, 989, 1872, + 888, 1824, 810, 1775, 751, 1725, 718, 1683, + 708, 1645, 705, 1624, 715, 1601, 737, 1607, + 766, 1601, 810, 1601, 854, 1594, 920, 1574, + 979, 1553, 1051, 1515, 1098, 1475, 1137, 1425, + 1148, 1368, 1150, 1290, 1155, 1192, 1142, 1057, + 1135, 890, 1117, 681, 1102, 444, 1088, 186, + 1045, 65446, 999, 65172, 911, 64905, 812, 64661, + 680, 64447, 521, 64271, 350, 64134, 178, 64011, + 5, 63938, 65376, 63863, 65215, 63803, 65066, 63733, +64924, 63654, 64801, 63577, 64693, 63503, 64607, 63439, +64549, 63382, 64513, 63349, 64502, 63330, 64519, 63325, +64541, 63332, 64560, 63338, 64567, 63352, 64555, 63374, +64538, 63409, 64506, 63473, 64496, 63546, 64477, 63637, +64480, 63718, 64499, 63798, 64534, 63869, 64573, 63924, +64616, 64004, 64649, 64092, 64686, 64215, 64702, 64366, +64707, 64540, 64709, 64726, 64689, 64932, 64691, 65138, +64685, 65350, 64713, 31, 64741, 226, 64779, 435, +64821, 615, 64864, 774, 64908, 909, 64970, 1013, +65042, 1103, 65151, 1178, 65269, 1253, 65405, 1328, + 8, 1400, 139, 1473, 266, 1533, 358, 1586, + 434, 1609, 485, 1591, 497, 1534, 477, 1434, + 417, 1292, 324, 1116, 206, 907, 52, 688, +65443, 463, 65302, 242, 65171, 38, 65070, 65397, +64992, 65233, 64939, 65101, 64900, 64994, 64893, 64927, +64884, 64876, 64916, 64867, 64976, 64867, 65061, 64903, +65178, 64949, 65297, 65002, 65440, 65073, 15, 65115, + 135, 65149, 227, 65146, 290, 65124, 321, 65070, + 323, 64997, 312, 64924, 291, 64851, 275, 64794, + 264, 64757, 266, 64742, 269, 64733, 267, 64752, + 271, 64761, 262, 64781, 231, 64796, 194, 64826, + 154, 64858, 110, 64914, 75, 64994, 40, 65102, + 9, 65228, 65535, 65386, 65522, 11, 65518, 170, +65511, 334, 65520, 473, 65525, 613, 14, 728, + 38, 833, 87, 937, 177, 1034, 280, 1123, + 409, 1205, 526, 1280, 641, 1336, 725, 1379, + 783, 1410, 805, 1425, 794, 1424, 766, 1415, + 703, 1379, 637, 1356, 541, 1298, 450, 1260, + 358, 1205, 284, 1172, 239, 1137, 224, 1128, + 251, 1127, 306, 1139, 383, 1159, 480, 1179, + 570, 1199, 653, 1214, 723, 1221, 775, 1219, + 832, 1199, 869, 1158, 897, 1076, 905, 962, + 895, 803, 860, 611, 811, 389, 739, 153, + 654, 65471, 559, 65256, 468, 65075, 382, 64920, + 308, 64812, 232, 64732, 162, 64674, 101, 64638, + 38, 64599, 65510, 64562, 65442, 64525, 65370, 64469, +65291, 64402, 65204, 64321, 65126, 64241, 65046, 64166, +64966, 64086, 64910, 64026, 64860, 63980, 64835, 63957, +64817, 63941, 64823, 63956, 64829, 63987, 64847, 64026, +64857, 64081, 64863, 64140, 64867, 64216, 64867, 64279, +64872, 64356, 64877, 64423, 64902, 64488, 64918, 64549, +64934, 64595, 64944, 64637, 64937, 64672, 64909, 64702, +64876, 64745, 64847, 64793, 64823, 64887, 64807, 64992, +64809, 65143, 64820, 65312, 64848, 65487, 64878, 133, +64913, 311, 64968, 485, 65022, 625, 65090, 758, +65159, 851, 65241, 943, 65327, 1003, 65408, 1050, +65497, 1094, 38, 1124, 105, 1145, 163, 1149, + 183, 1126, 192, 1091, 161, 1024, 111, 952, + 58, 856, 65530, 750, 65486, 648, 65439, 541, +65400, 437, 65368, 329, 65330, 223, 65301, 110, +65267, 12, 65243, 65439, 65217, 65343, 65214, 65253, +65207, 65174, 65229, 65111, 65236, 65072, 65270, 65047, +65302, 65038, 65360, 65045, 65416, 65062, 65492, 65081, + 11, 65091, 70, 65097, 129, 65102, 172, 65103, + 210, 65110, 229, 65120, 245, 65120, 245, 65123, + 240, 65112, 221, 65090, 217, 65069, 193, 65021, + 169, 64981, 144, 64941, 110, 64906, 58, 64877, + 12, 64876, 65500, 64880, 65450, 64929, 65423, 64988, +65415, 65105, 65422, 65226, 65444, 65392, 65473, 19, +65509, 177, 0, 330, 17, 450, 53, 544, + 79, 608, 140, 669, 198, 709, 275, 744, + 355, 768, 445, 795, 528, 808, 608, 833, + 655, 847, 691, 861, 697, 889, 686, 930, + 660, 975, 616, 1011, 582, 1052, 534, 1077, + 504, 1102, 463, 1107, 449, 1109, 430, 1098, + 439, 1094, 463, 1085, 499, 1069, 550, 1070, + 606, 1063, 661, 1067, 708, 1079, 730, 1092, + 746, 1098, 759, 1102, 776, 1094, 791, 1068, + 785, 1004, 806, 926, 813, 820, 818, 697, + 806, 559, 787, 412, 736, 255, 671, 110, + 572, 65503, 471, 65374, 349, 65245, 218, 65133, + 77, 65020, 65478, 64928, 65335, 64843, 65196, 64768, +65069, 64689, 64974, 64616, 64895, 64547, 64853, 64475, +64844, 64411, 64852, 64366, 64881, 64319, 64910, 64297, +64948, 64276, 64971, 64267, 64992, 64260, 64991, 64249, +64992, 64246, 64976, 64245, 64956, 64251, 64929, 64260, +64896, 64284, 64869, 64305, 64848, 64324, 64833, 64352, +64842, 64366, 64862, 64393, 64896, 64416, 64936, 64459, +64969, 64515, 65001, 64581, 65020, 64664, 65042, 64774, +65053, 64901, 65067, 65033, 65095, 65177, 65123, 65309, +65156, 65442, 65178, 13, 65209, 117, 65234, 197, +65260, 269, 65299, 335, 65348, 396, 65416, 464, +65493, 530, 25, 596, 94, 664, 153, 721, + 200, 770, 224, 795, 238, 801, 235, 784, + 221, 740, 190, 683, 152, 600, 78, 491, + 15, 384, 65483, 269, 65413, 157, 65342, 46, +65277, 65494, 65222, 65411, 65170, 65349, 65141, 65309, +65114, 65294, 65113, 65298, 65135, 65317, 65172, 65353, +65229, 65392, 65296, 65429, 65385, 65456, 65470, 65482, + 23, 65498, 86, 65496, 150, 65481, 183, 65465, + 197, 65449, 184, 65430, 175, 65414, 144, 65405, + 118, 65399, 81, 65397, 50, 65392, 30, 65388, + 14, 65380, 11, 65382, 12, 65382, 24, 65379, + 32, 65385, 52, 65383, 53, 65404, 52, 65425, + 35, 65460, 15, 65501, 65520, 22, 65486, 83, +65442, 157, 65415, 223, 65381, 279, 65367, 322, +65359, 356, 65379, 377, 65414, 395, 65468, 410, +65534, 424, 68, 444, 152, 474, 227, 494, + 310, 530, 370, 549, 432, 563, 467, 564, + 483, 551, 468, 534, 431, 504, 371, 468, + 312, 441, 241, 404, 195, 390, 167, 366, + 168, 363, 197, 373, 239, 399, 284, 432, + 330, 474, 385, 526, 433, 569, 484, 611, + 532, 642, 564, 664, 605, 680, 610, 665, + 611, 641, 606, 573, 581, 487, 570, 366, + 554, 226, 535, 88, 517, 65482, 478, 65371, + 433, 65279, 376, 65229, 307, 65197, 228, 65183, + 142, 65164, 59, 65158, 65511, 65134, 65444, 65110, +65363, 65054, 65308, 65011, 65250, 64949, 65211, 64900, +65174, 64848, 65158, 64800, 65141, 64758, 65150, 64733, +65152, 64704, 65172, 64693, 65191, 64683, 65214, 64710, +65221, 64749, 65239, 64819, 65239, 64895, 65232, 64975, +65236, 65054, 65229, 65108, 65244, 65149, 65248, 65165, +65258, 65159, 65265, 65132, 65261, 65111, 65262, 65100, +65260, 65096, 65249, 65100, 65250, 65132, 65252, 65175, +65260, 65234, 65280, 65300, 65283, 65381, 65299, 65479, +65312, 39, 65340, 149, 65350, 262, 65384, 359, +65401, 458, 65443, 532, 65471, 609, 65508, 654, + 10, 701, 50, 725, 92, 745, 135, 748, + 153, 734, 176, 701, 165, 655, 145, 597, + 102, 529, 52, 454, 11, 368, 65508, 283, +65481, 196, 65444, 122, 65421, 44, 65386, 2, +65349, 65477, 65316, 65431, 65266, 65381, 65229, 65346, +65180, 65296, 65147, 65257, 65128, 65206, 65126, 65166, +65143, 65131, 65163, 65105, 65197, 65100, 65250, 65103, +65300, 65120, 65343, 65158, 65391, 65187, 65426, 65236, +65466, 65253, 65474, 65279, 65487, 65294, 65475, 65316, +65467, 65331, 65453, 65353, 65438, 65366, 65431, 65373, +65435, 65365, 65439, 65339, 65456, 65308, 65469, 65259, +65483, 65229, 65490, 65191, 65499, 65191, 65495, 65211, +65501, 65258, 65504, 65333, 65501, 65415, 65508, 65509, +65508, 56, 65526, 155, 65533, 221, 15, 298, + 47, 328, 76, 359, 112, 366, 155, 357, + 203, 347, 260, 319, 322, 301, 389, 282, + 458, 271, 515, 280, 573, 285, 596, 315, + 613, 342, 608, 373, 589, 399, 573, 415, + 535, 423, 505, 424, 470, 415, 449, 410, + 431, 396, 412, 387, 411, 369, 410, 359, + 417, 357, 421, 349, 423, 366, 418, 387, + 391, 413, 370, 452, 330, 484, 314, 508, + 283, 519, 289, 520, 290, 500, 311, 467, + 329, 415, 342, 368, 342, 310, 330, 254, + 303, 193, 268, 129, 222, 68, 160, 10, + 82, 65486, 6, 65425, 65456, 65353, 65362, 65304, +65270, 65241, 65196, 65200, 65129, 65149, 65087, 65106, +65058, 65064, 65042, 65035, 65049, 65017, 65064, 65008, +65090, 65013, 65106, 65023, 65136, 65039, 65153, 65057, +65184, 65077, 65209, 65090, 65242, 65107, 65260, 65111, +65278, 65117, 65289, 65119, 65306, 65121, 65301, 65126, +65314, 65111, 65317, 65108, 65333, 65090, 65359, 65087, +65376, 65083, 65405, 65090, 65413, 65106, 65414, 65135, +65412, 65175, 65397, 65219, 65376, 65268, 65365, 65311, +65354, 65356, 65342, 65388, 65340, 65434, 65347, 65467, +65366, 65510, 65404, 11, 65441, 50, 65491, 109, +65530, 160, 29, 211, 51, 262, 76, 301, + 90, 334, 108, 353, 108, 353, 117, 332, + 100, 297, 74, 250, 34, 190, 65528, 129, +65485, 58, 65444, 7, 65411, 65496, 65381, 65443, +65366, 65398, 65331, 65364, 65313, 65338, 65268, 65331, +65235, 65331, 65197, 65331, 65181, 65349, 65167, 65372, +65168, 65397, 65185, 65421, 65219, 65446, 65261, 65462, +65308, 65488, 65365, 65497, 65413, 65501, 65466, 65510, +65490, 65507, 65510, 65511, 65511, 65513, 65501, 65513, +65477, 65525, 65456, 65531, 65424, 3, 65416, 5, +65405, 19, 65410, 20, 65425, 20, 65449, 13, +65495, 8, 65515, 1, 18, 65535, 34, 10, + 62, 22, 80, 50, 85, 76, 86, 111, + 87, 145, 79, 187, 79, 212, 72, 234, + 74, 236, 71, 229, 84, 213, 99, 191, + 111, 174, 145, 155, 168, 155, 209, 152, + 252, 164, 285, 170, 329, 186, 360, 189, + 386, 194, 407, 196, 405, 191, 402, 184, + 391, 174, 373, 160, 357, 148, 334, 129, + 324, 120, 313, 107, 302, 105, 288, 113, + 286, 130, 271, 157, 265, 186, 252, 224, + 241, 263, 229, 292, 218, 328, 202, 351, + 190, 366, 177, 363, 169, 348, 172, 319, + 181, 280, 194, 238, 216, 187, 226, 144, + 236, 90, 230, 59, 223, 16, 183, 4, + 144, 65513, 88, 65500, 33, 65479, 65516, 65458, +65457, 65439, 65402, 65405, 65348, 65368, 65307, 65326, +65266, 65283, 65254, 65246, 65242, 65203, 65242, 65178, +65250, 65163, 65264, 65144, 65274, 65158, 65297, 65165, +65308, 65199, 65330, 65235, 65342, 65277, 65360, 65320, +65374, 65362, 65388, 65396, 65397, 65420, 65408, 65438, +65417, 65439, 65426, 65425, 65423, 65396, 65414, 65363, +65412, 65327, 65405, 65292, 65402, 65273, 65397, 65252, +65394, 65254, 65381, 65253, 65368, 65273, 65355, 65291, +65347, 65324, 65339, 65360, 65345, 65406, 65363, 65451, +65387, 65508, 65425, 13, 65473, 70, 65521, 127, + 17, 179, 67, 234, 103, 274, 132, 304, + 155, 328, 169, 332, 169, 337, 161, 312, + 138, 282, 118, 237, 96, 186, 69, 129, + 54, 77, 27, 30, 14, 65530, 65528, 65513, +65521, 65488, 65503, 65477, 65492, 65465, 65480, 65445, +65447, 65426, 65427, 65396, 65395, 65370, 65376, 65344, +65360, 65324, 65352, 65309, 65363, 65302, 65380, 65306, +65402, 65308, 65446, 65321, 65467, 65342, 65509, 65359, +65519, 65390, 5, 65412, 65530, 65455, 65518, 65481, +65496, 65515, 65468, 65535, 65441, 65534, 65412, 2, +65399, 65532, 65381, 65511, 65384, 65478, 65381, 65441, +65387, 65407, 65403, 65382, 65403, 65372, 65422, 65364, +65428, 65374, 65444, 65396, 65453, 65427, 65458, 65470, +65458, 65515, 65455, 23, 65456, 69, 65451, 121, +65445, 156, 65455, 195, 65459, 215, 65482, 233, +65506, 234, 4, 224, 34, 208, 80, 184, + 119, 177, 163, 155, 194, 168, 217, 170, + 232, 187, 243, 196, 243, 202, 245, 201, + 242, 195, 232, 184, 233, 169, 218, 154, + 214, 139, 207, 130, 200, 112, 189, 101, + 185, 89, 187, 82, 185, 81, 192, 98, + 191, 118, 190, 149, 193, 178, 176, 200, + 179, 218, 170, 224, 183, 219, 186, 214, + 214, 197, 233, 180, 262, 171, 282, 158, + 290, 154, 288, 144, 270, 133, 244, 116, + 216, 93, 175, 66, 134, 25, 83, 65528, + 38, 65493, 65523, 65448, 65481, 65412, 65433, 65376, +65412, 65347, 65383, 65314, 65373, 65296, 65363, 65274, +65357, 65264, 65361, 65262, 65359, 65260, 65375, 65278, +65376, 65292, 65389, 65320, 65387, 65331, 65398, 65357, +65390, 65367, 65392, 65384, 65386, 65387, 65398, 65386, +65405, 65388, 65423, 65382, 65436, 65382, 65443, 65377, +65450, 65372, 65432, 65372, 65416, 65371, 65376, 65377, +65345, 65372, 65318, 65376, 65298, 65372, 65292, 65384, +65294, 65389, 65300, 65403, 65316, 65411, 65333, 65422, +65356, 65438, 65379, 65450, 65411, 65471, 65446, 65499, +65491, 65529, 65531, 41, 21, 97, 49, 152, + 63, 207, 72, 242, 63, 263, 61, 255, + 42, 237, 43, 194, 38, 162, 35, 106, + 44, 65, 52, 34, 59, 65532, 65, 65515, + 57, 65473, 53, 65454, 41, 65425, 29, 65412, + 20, 65402, 4, 65397, 0, 65389, 65526, 65393, +65519, 65393, 65509, 65401, 65506, 65407, 65498, 65415, +65512, 65426, 65514, 65438, 65535, 65443, 65535, 65457, + 14, 65459, 29, 65475, 32, 65490, 22, 65504, + 8, 65527, 65523, 1, 65496, 18, 65462, 31, +65436, 27, 65420, 33, 65423, 13, 65416, 5, +65437, 65532, 65444, 65520, 65464, 65513, 65478, 65520, +65482, 65529, 65483, 7, 65476, 26, 65460, 50, +65440, 77, 65410, 99, 65399, 128, 65371, 154, +65362, 171, 65356, 189, 65364, 198, 65378, 199, +65401, 195, 65431, 194, 65464, 189, 65497, 188, +65522, 183, 6, 188, 22, 183, 49, 176, + 63, 166, 83, 147, 83, 133, 94, 123, + 88, 108, 95, 92, 101, 72, 115, 51, + 132, 25, 149, 6, 173, 65530, 182, 65518, + 185, 65516, 187, 65529, 183, 6, 180, 28, + 173, 53, 176, 71, 172, 86, 181, 97, + 185, 105, 194, 108, 201, 102, 208, 101, + 221, 78, 231, 72, 235, 45, 252, 28, + 259, 14, 267, 11, 271, 5, 266, 4, + 250, 7, 222, 0, 184, 65530, 151, 65506, + 102, 65491, 62, 65471, 17, 65448, 65522, 65425, +65491, 65400, 65463, 65385, 65452, 65357, 65442, 65344, +65443, 65323, 65447, 65320, 65453, 65317, 65454, 65324, +65458, 65340, 65447, 65361, 65455, 65387, 65449, 65414, +65461, 65445, 65466, 65469, 65479, 65496, 65501, 65526, +65514, 1, 65526, 23, 65533, 30, 65530, 38, +65517, 23, 65497, 7, 65478, 65528, 65450, 65503, +65427, 65492, 65392, 65483, 65363, 65482, 65336, 65489, +65316, 65492, 65307, 65494, 65307, 65493, 65324, 65493, +65350, 65489, 65382, 65495, 65422, 65515, 65460, 2, +65501, 34, 0, 82, 11, 126, 37, 167, + 41, 203, 46, 231, 50, 246, 44, 250, + 42, 245, 45, 228, 46, 201, 51, 172, + 41, 134, 36, 100, 20, 60, 6, 25, +65530, 65534, 65513, 65514, 65491, 65478, 65477, 65459, +65455, 65430, 65445, 65412, 65425, 65394, 65424, 65380, +65422, 65365, 65431, 65357, 65443, 65347, 65461, 65341, +65477, 65339, 65500, 65340, 65512, 65343, 65525, 65358, +65530, 65376, 65532, 65400, 2, 65425, 65528, 65442, +65531, 65459, 65514, 65471, 65512, 65485, 65495, 65484, +65480, 65481, 65468, 65472, 65448, 65458, 65439, 65433, +65430, 65415, 65428, 65388, 65435, 65377, 65438, 65366, +65448, 65368, 65455, 65386, 65459, 65401, 65460, 65422, +65452, 65446, 65442, 65465, 65433, 65486, 65416, 65499, +65414, 65515, 65406, 65535, 65418, 17, 65426, 40, +65450, 59, 65476, 78, 65503, 100, 65530, 108, + 15, 127, 42, 126, 64, 145, 83, 149, + 97, 164, 104, 169, 124, 169, 128, 171, + 147, 167, 151, 156, 173, 145, 176, 124, + 188, 108, 189, 82, 186, 63, 179, 40, + 167, 33, 154, 22, 139, 34, 125, 48, + 119, 73, 105, 86, 111, 104, 107, 123, + 117, 132, 124, 136, 137, 140, 147, 135, + 159, 131, 166, 127, 181, 125, 182, 131, + 188, 132, 184, 138, 187, 147, 178, 142, + 172, 145, 158, 138, 134, 127, 117, 109, + 78, 84, 54, 52, 16, 27, 6, 1, +65519, 65518, 65518, 65494, 65505, 65483, 65506, 65464, +65502, 65468, 65492, 65452, 65487, 65450, 65473, 65443, +65463, 65434, 65442, 65430, 65437, 65423, 65424, 65428, +65426, 65431, 65425, 65444, 65436, 65449, 65452, 65461, +65465, 65463, 65484, 65467, 65494, 65467, 65509, 65467, +65509, 65464, 65507, 65460, 65490, 65467, 65466, 65463, +65434, 65472, 65400, 65462, 65376, 65467, 65348, 65454, +65332, 65442, 65316, 65424, 65313, 65408, 65317, 65391, +65331, 65379, 65346, 65376, 65378, 65384, 65406, 65400, +65449, 65431, 65476, 65463, 65510, 65507, 65529, 2, + 6, 32, 15, 56, 23, 73, 27, 82, + 25, 88, 28, 78, 29, 74, 34, 62, + 35, 48, 42, 32, 43, 24, 41, 6, + 43, 65535, 32, 65528, 21, 65517, 8, 65515, +65535, 65508, 65535, 65511, 2, 65506, 2, 65504, + 20, 65504, 39, 65498, 43, 65492, 62, 65493, + 68, 65490, 73, 65495, 78, 65496, 81, 65504, + 76, 65516, 76, 65531, 70, 6, 55, 28, + 40, 37, 14, 61, 65531, 61, 65512, 64, +65489, 54, 65482, 41, 65467, 23, 65469, 5, +65465, 65534, 65471, 65520, 65479, 65516, 65484, 65511, +65495, 65509, 65493, 65519, 65500, 65510, 65491, 65522, +65484, 65523, 65466, 65529, 65452, 2, 65437, 65535, +65421, 13, 65414, 20, 65409, 23, 65419, 32, +65429, 31, 65452, 38, 65471, 38, 65493, 48, +65507, 48, 65525, 56, 65533, 61, 2, 65, + 2, 64, 9, 63, 6, 64, 20, 63, + 25, 56, 39, 56, 60, 43, 75, 38, + 96, 16, 103, 8, 119, 65534, 115, 65527, + 116, 65519, 109, 65521, 101, 65526, 95, 65535, + 88, 4, 85, 30, 80, 42, 78, 63, + 74, 72, 75, 75, 74, 72, 75, 70, + 81, 63, 90, 59, 102, 57, 115, 63, + 121, 68, 123, 74, 121, 79, 122, 76, + 111, 67, 105, 51, 89, 31, 81, 9, + 64, 65526, 54, 65504, 35, 65485, 24, 65467, + 5, 65456, 1, 65446, 65527, 65443, 65525, 65439, +65512, 65442, 65507, 65443, 65498, 65448, 65482, 65457, +65473, 65461, 65461, 65471, 65456, 65474, 65456, 65484, +65457, 65490, 65458, 65496, 65468, 65499, 65481, 65509, +65496, 65514, 65513, 65516, 65522, 65519, 65533, 65527, +65535, 65524, 65534, 65534, 65524, 65532, 65513, 2, +65494, 65535, 65472, 0, 65449, 0, 65426, 2, +65409, 65524, 65399, 65522, 65393, 65506, 65396, 65502, +65405, 65491, 65421, 65493, 65440, 65494, 65467, 65501, +65498, 65513, 65515, 65533, 3, 2, 9, 24, + 19, 42, 27, 56, 24, 70, 37, 84, + 31, 88, 48, 92, 55, 88, 71, 85, + 80, 74, 90, 69, 89, 49, 90, 42, + 79, 28, 68, 15, 48, 6, 32, 65532, + 5, 65527, 65535, 65514, 65514, 65507, 65505, 65495, +65499, 65481, 65496, 65472, 65509, 65450, 65512, 65442, +65531, 65424, 65533, 65420, 4, 65424, 2, 65428, + 8, 65441, 65535, 65457, 2, 65477, 65533, 65495, +65525, 65507, 65517, 65520, 65504, 65529, 65490, 65530, +65482, 65532, 65465, 65526, 65461, 65519, 65450, 65510, +65451, 65503, 65449, 65496, 65454, 65494, 65462, 65489, +65467, 65488, 65472, 65489, 65480, 65488, 65481, 65487, +65485, 65494, 65482, 65491, 65484, 65496, 65482, 65495, +65479, 65498, 65478, 65492, 65476, 65495, 65480, 65495, +65478, 65508, 65490, 65511, 65494, 65532, 65513, 0, +65524, 10, 1, 30, 8, 38, 17, 57, + 26, 70, 31, 84, 41, 101, 45, 104, + 54, 115, 68, 110, 78, 111, 94, 99, + 107, 90, 115, 75, 123, 66, 121, 48, + 119, 42, 106, 31, 91, 35, 80, 36, + 58, 42, 51, 46, 35, 49, 37, 46, + 30, 51, 33, 40, 32, 46, 31, 40, + 40, 42, 42, 46, 52, 53, 58, 66, + 71, 75, 75, 88, 82, 97, 75, 103, + 70, 107, 57, 95, 46, 91, 34, 73, + 20, 53, 15, 29, 9, 9, 14, 65527, + 13, 65516, 19, 65493, 7, 65494, 6, 65479, +65532, 65481, 65524, 65477, 65511, 65482, 65501, 65481, +65493, 65484, 65488, 65484, 65489, 65491, 65481, 65483, +65485, 65483, 65482, 65482, 65487, 65475, 65501, 65480, +65509, 65476, 65525, 65477, 2, 65481, 8, 65484, + 19, 65496, 24, 65500, 16, 65509, 13, 65522, +65531, 65526, 65521, 1, 65495, 0, 65477, 65535, +65453, 65531, 65441, 65522, 65430, 65516, 65427, 65506, +65429, 65500, 65440, 65493, 65450, 65494, 65466, 65498, +65478, 65503, 65491, 65513, 65506, 65527, 65519, 0, +65529, 8, 0, 17, 5, 28, 11, 35, + 18, 39, 19, 35, 29, 40, 32, 28, + 39, 27, 45, 13, 50, 10, 60, 3, + 56, 0, 56, 0, 46, 0, 37, 65535, + 27, 1, 15, 0, 3, 65530, 2, 65521, +65533, 65511, 2, 65503, 2, 65492, 5, 65489, + 18, 65482, 17, 65476, 30, 65480, 23, 65477, + 29, 65485, 16, 65487, 17, 65502, 6, 65512, + 1, 65525, 0, 0, 65530, 7, 65518, 21, +65511, 23, 65498, 29, 65492, 26, 65483, 26, +65483, 28, 65479, 18, 65477, 18, 65482, 20, +65482, 19, 65483, 25, 65483, 24, 65483, 31, +65483, 25, 65489, 28, 65491, 16, 65496, 10, +65494, 65535, 65503, 65534, 65506, 65524, 65509, 65520, +65515, 65521, 65513, 65526, 65516, 65532, 65515, 65533, +65519, 6, 65520, 8, 65518, 25, 65529, 22, +65524, 35, 65533, 36, 65535, 38, 65535, 36, + 2, 31, 11, 18, 21, 9, 36, 65534, + 46, 65532, 63, 65519, 69, 65512, 81, 65503, + 83, 65506, 85, 65502, 76, 65506, 66, 65507, + 54, 65515, 30, 65515, 20, 65525, 65535, 65528, +65534, 0, 65526, 0, 65525, 1, 65528, 65535, +65535, 1, 2, 65534, 13, 5, 28, 12, + 31, 26, 45, 36, 44, 52, 51, 58, + 43, 65, 44, 58, 37, 55, 30, 39, + 28, 26, 25, 9, 28, 65534, 23, 65524, + 19, 65507, 22, 65496, 14, 65488, 16, 65482, + 5, 65480, 5, 65480, 65535, 65489, 0, 65493, + 1, 65508, 0, 65513, 8, 65528, 8, 65528, + 17, 3, 22, 65533, 30, 3, 32, 65531, + 38, 65532, 43, 65529, 41, 65535, 45, 1, + 40, 0, 43, 14, 37, 19, 28, 28, + 16, 36, 3, 41, 65533, 40, 65512, 46, +65504, 37, 65485, 37, 65478, 30, 65469, 25, +65461, 14, 65462, 14, 65463, 9, 65470, 12, +65472, 12, 65480, 19, 65487, 18, 65489, 27, +65490, 29, 65496, 31, 65498, 37, 65501, 33, +65508, 41, 65514, 32, 65522, 33, 65535, 31, + 1, 23, 7, 17, 12, 15, 16, 65535, + 13, 4, 9, 65532, 0, 65534, 65534, 65524, +65530, 65522, 65516, 65510, 65516, 65507, 65501, 65493, +65502, 65488, 65492, 65474, 65497, 65470, 65497, 65451, +65511, 65446, 65516, 65440, 65533, 65435, 2, 65438, + 8, 65443, 12, 65450, 10, 65458, 7, 65474, + 0, 65485, 65533, 65498, 65527, 65517, 65522, 65527, +65521, 2, 65519, 65534, 65522, 2, 65518, 2, +65522, 65533, 65513, 4, 65522, 65533, 65517, 2, +65530, 1, 65529, 6, 1, 16, 1, 15, + 5, 17, 4, 13, 8, 4, 2, 0, + 5, 65531, 65534, 65516, 0, 65508, 65528, 65499, +65526, 65493, 65524, 65495, 65520, 65497, 65520, 65504, +65520, 65513, 65528, 65523, 65524, 0, 65533, 7, +65535, 19, 1, 31, 8, 35, 16, 47, + 26, 46, 36, 50, 45, 43, 54, 40, + 56, 28, 66, 21, 62, 10, 63, 2, + 55, 1, 51, 65534, 38, 2, 34, 65535, + 18, 0, 14, 1, 65534, 2, 65535, 9, +65526, 15, 65515, 18, 65517, 20, 65514, 27, +65519, 29, 65525, 40, 65534, 45, 65535, 54, + 4, 60, 6, 71, 11, 68, 11, 80, + 8, 79, 11, 83, 11, 83, 10, 78, + 18, 73, 16, 63, 23, 50, 19, 37, + 23, 27, 14, 15, 12, 4, 0, 65535, + 2, 2, 65532, 65527, 65532, 65535, 65522, 65525, +65524, 65523, 65518, 65518, 65521, 65517, 65520, 65506, +65519, 65502, 65521, 65495, 65529, 65487, 65534, 65486, + 9, 65480, 18, 65485, 32, 65482, 37, 65493, + 44, 65498, 39, 65510, 38, 65515, 31, 65530, + 22, 65529, 10, 4, 1, 65533, 65528, 2, +65515, 65535, 65495, 0, 65491, 65525, 65474, 65519, +65477, 65511, 65469, 65507, 65476, 65504, 65482, 65504, +65489, 65508, 65501, 65510, 65508, 65519, 65515, 65526, +65523, 65533, 65526, 65535, 65525, 1, 65525, 65534, +65526, 3, 65524, 65533, 65526, 3, 65518, 65533, +65527, 3, 65523, 65533, 65533, 2, 65532, 65534, + 2, 1, 2, 0, 11, 0, 13, 10, + 17, 8, 23, 19, 18, 17, 24, 23, + 20, 12, 22, 8, 20, 65533, 23, 65526, + 11, 65512, 20, 65499, 13, 65491, 18, 65485, + 15, 65481, 16, 65485, 17, 65484, 14, 65500, + 18, 65506, 13, 65519, 19, 65529, 13, 65532, + 11, 4, 5, 5, 4, 14, 0, 14, +65535, 16, 65535, 18, 65525, 20, 65524, 24, +65521, 30, 65514, 22, 65515, 38, 65515, 26, +65520, 34, 65520, 21, 65528, 25, 65528, 11, +65535, 14, 1, 65534, 65535, 4, 0, 65532, + 1, 65534, 65534, 65529, 3, 65530, 65532, 65529, +65534, 65532, 65524, 65530, 65526, 3, 65522, 65532, +65516, 5, 65514, 6, 65516, 6, 65513, 9, +65522, 4, 65529, 6, 65534, 0, 4, 1, + 10, 65535, 17, 1, 20, 65528, 26, 65531, + 29, 65522, 31, 65528, 29, 65525, 19, 65524, + 10, 65528, 2, 65522, 65525, 65529, 65517, 65522, +65497, 65528, 65502, 65522, 65487, 65523, 65498, 65527, +65491, 65526, 65505, 65531, 65509, 3, 65517, 65535, +65532, 18, 65535, 20, 8, 35, 16, 36, + 22, 48, 26, 46, 23, 49, 23, 46, + 13, 40, 16, 35, 7, 25, 6, 13, + 5, 6, 6, 65534, 4, 65532, 11, 65521, + 10, 65520, 10, 65520, 12, 65523, 8, 65527, + 18, 65530, 13, 65531, 20, 65533, 26, 65532, + 29, 65531, 39, 65530, 34, 65526, 40, 65523, + 33, 65519, 42, 65517, 32, 65515, 34, 65513, + 31, 65519, 31, 65520, 32, 65529, 26, 65531, + 22, 2, 17, 4, 5, 14, 65533, 15, +65529, 16, 65515, 13, 65514, 8, 65502, 3, +65500, 0, 65490, 65534, 65497, 3, 65484, 65534, +65494, 1, 65483, 65535, 65493, 7, 65484, 7, +65492, 20, 65492, 12, 65495, 28, 65496, 20, +65506, 31, 65505, 28, 65518, 34, 65518, 28, +65531, 27, 65533, 18, 1, 22, 1, 11, +65533, 12, 8, 12, 0, 3, 8, 10, +65532, 65534, 2, 4, 0, 65533, 65535, 2, + 1, 65534, 0, 65533, 65535, 65524, 2, 65515, + 6, 65506, 8, 65500, 14, 65490, 18, 65491, + 23, 65483, 23, 65486, 29, 65488, 25, 65490, + 23, 65493, 13, 65497, 12, 65503, 1, 65503, +65535, 65504, 2, 65506, 65527, 65507, 65529, 65512, +65523, 65514, 65526, 65515, 65525, 65527, 65530, 65525, +65530, 65532, 3, 2, 65533, 65534, 3, 4, +65534, 7, 1, 10, 0, 11, 0, 8, +65535, 2, 2, 2, 65531, 65533, 65534, 65532, +65528, 65522, 65531, 65520, 65532, 65522, 65529, 65518, +65531, 65530, 65531, 65527, 65530, 3, 65528, 65535, +65525, 6, 65525, 15, 65530, 18, 65530, 28, +65533, 24, 65535, 28, 1, 22, 0, 19, + 2, 13, 9, 10, 7, 3, 18, 6, + 13, 65533, 19, 3, 9, 5, 10, 6, + 4, 10, 1, 11, 0, 10, 65530, 11, +65524, 10, 65523, 5, 65515, 4, 65516, 4, +65515, 65532, 65518, 4, 65524, 65533, 65526, 5, +65535, 9, 65534, 12, 3, 25, 65532, 23, + 10, 42, 4, 38, 15, 49, 11, 47, + 20, 49, 21, 43, 26, 45, 28, 33, + 34, 37, 29, 25, 35, 24, 27, 13, + 27, 11, 17, 2, 17, 1, 8, 65533, + 7, 65529, 3, 65526, 0, 65523, 0, 65529, +65535, 65520, 1, 65521, 65535, 65517, 5, 65510, + 9, 65509, 14, 65502, 18, 65504, 24, 65503, + 22, 65506, 30, 65507, 21, 65517, 22, 65516, + 17, 65524, 11, 65522, 2, 65528, 0, 65523, +65527, 65528, 65518, 65521, 65508, 65522, 65500, 65519, +65501, 65521, 65496, 65520, 65500, 65520, 65500, 65525, +65500, 65524, 65511, 65531, 65507, 65531, 65512, 1, +65513, 0, 65517, 5, 65512, 11, 65518, 10, +65511, 11, 65519, 10, 65511, 11, 65517, 3, +65514, 8, 65518, 1, 65522, 1, 65521, 65535, +65529, 2, 65531, 4, 3, 7, 65534, 4, + 6, 13, 11, 10, 17, 10, 16, 11, + 17, 10, 14, 11, 18, 8, 13, 65535, + 15, 0, 7, 65533, 13, 65522, 9, 65520, + 12, 65510, 2, 65509, 8, 65510, 3, 65508, + 7, 65513, 5, 65516, 5, 65519, 5, 65524, + 5, 65524, 6, 65529, 5, 65530, 5, 65531, + 6, 65531, 4, 65531, 7, 65530, 3, 0, + 3, 65535, 65534, 2, 1, 2, 0, 9, +65535, 9, 1, 12, 0, 11, 65535, 12, + 1, 11, 0, 9, 0, 11, 65535, 3, + 2, 1, 5, 0, 5, 0, 7, 65535, + 3, 2, 3, 65534, 65534, 0, 2, 1, +65533, 0, 65531, 65535, 65531, 2, 65528, 65533, +65528, 3, 65529, 65535, 65532, 0, 65533, 1, + 1, 65535, 0, 1, 6, 65535, 11, 1, + 16, 0, 15, 0, 15, 0, 8, 65535, + 7, 1, 2, 0, 65532, 65535, 65532, 2, +65515, 65530, 65517, 65534, 65507, 65523, 65504, 65528, +65501, 65523, 65497, 65528, 65500, 65530, 65501, 2, +65508, 65535, 65513, 0, 65519, 4, 65527, 5, +65531, 12, 0, 12, 1, 18, 65535, 14, + 1, 18, 0, 17, 65535, 16, 1, 14, +65534, 10, 3, 5, 65532, 2, 4, 65535, +65533, 0, 2, 1, 65534, 65535, 2, 0, +65534, 1, 4, 4, 6, 6, 4, 5, + 10, 0, 11, 65535, 18, 2, 18, 65533, + 23, 65533, 26, 65528, 26, 65529, 35, 65523, + 30, 65527, 31, 65525, 34, 65526, 29, 65530, + 34, 0, 29, 65534, 22, 5, 20, 5, + 12, 5, 3, 5, 5, 3, 65531, 65535, + 3, 0, 65525, 65532, 65535, 65526, 65527, 65528, +65525, 65521, 65525, 65533, 65521, 65527, 65517, 0, +65520, 65535, 65511, 0, 65518, 0, 65512, 4, +65517, 8, 65513, 11, 65522, 10, 65517, 16, +65524, 15, 65523, 17, 65526, 15, 65528, 16, +65531, 15, 65531, 10, 0, 10, 0, 11, + 0, 10, 0, 12, 0, 10, 65535, 10, + 2, 5, 65535, 4, 65535, 2, 2, 65535, +65534, 65535, 2, 65532, 65535, 65527, 65535, 65528, + 2, 65522, 65533, 65525, 65530, 65517, 65532, 65522, +65529, 65519, 65532, 65517, 65530, 65513, 65531, 65518, +65531, 65510, 65530, 65519, 65532, 65512, 65529, 65517, +65531, 65520, 65532, 65519, 65530, 65521, 4, 65526, +65532, 65528, 4, 65535, 2, 65534, 9, 2, + 10, 65534, 10, 3, 10, 65533, 4, 3, + 6, 65533, 6, 65533, 0, 65530, 1, 65522, + 0, 65523, 0, 65516, 65535, 65522, 2, 65513, + 1, 65522, 11, 65520, 65535, 65522, 11, 65531, + 1, 65532, 9, 2, 12, 65534, 9, 2, + 12, 6, 18, 5, 13, 6, 19, 2, + 14, 65535, 17, 0, 14, 1, 25, 0, + 17, 0, 26, 65535, 15, 3, 17, 1, + 14, 13, 6, 7, 5, 15, 65535, 16, +65534, 16, 65535, 15, 65527, 17, 65527, 14, +65525, 14, 65517, 7, 65522, 15, 65520, 6, +65519, 14, 65522, 8, 65517, 13, 65522, 9, +65520, 17, 65520, 16, 65520, 21, 65523, 24, +65526, 26, 65526, 27, 65532, 26, 65530, 28, + 2, 25, 65535, 28, 1, 26, 65535, 19, + 6, 25, 5, 16, 3, 20, 1, 9, +65534, 11, 0, 7, 2, 3, 65534, 1, + 1, 0, 0, 65535, 65535, 65535, 1, 65525, + 0, 65525, 65535, 65518, 3, 65515, 6, 65512, + 11, 65510, 15, 65509, 17, 65510, 14, 65513, + 19, 65514, 13, 65519, 16, 65520, 8, 65520, + 11, 65527, 3, 65523, 3, 65526, 65534, 65516, + 1, 65523, 65530, 65518, 65531, 65517, 65531, 65515, +65531, 65520, 65531, 65520, 65535, 65523, 0, 65525, + 0, 65533, 1, 65527, 65534, 65535, 2, 65527, +65535, 65533, 65533, 65529, 65530, 65532, 65527, 65532, +65524, 65535, 65525, 65535, 65517, 1, 65522, 0, +65525, 65535, 65526, 2, 65525, 65533, 65530, 6, +65532, 2, 65531, 12, 4, 9, 65533, 12, + 2, 16, 65534, 15, 4, 17, 5, 15, + 7, 11, 4, 8, 3, 6, 65534, 0, + 2, 0, 65535, 1, 0, 65534, 1, 2, +65535, 65535, 1, 1, 65534, 65534, 2, 4, +65535, 2, 0, 8, 2, 4, 65533, 5, + 2, 7, 65535, 3, 0, 65535, 0, 1, + 5, 65534, 5, 2, 5, 65534, 65534, 2, + 1, 65535, 0, 0, 65535, 0, 3, 0, +65532, 0, 4, 1, 65532, 65535, 3, 65535, +65535, 2, 7, 65531, 4, 65531, 5, 65531, + 6, 65529, 5, 65532, 5, 65531, 7, 65530, + 2, 65532, 10, 65529, 0, 65532, 4, 65530, +65534, 65531, 2, 65531, 65534, 65529, 2, 65533, +65534, 65528, 9, 65534, 2, 65527, 10, 65531, + 12, 65530, 8, 65530, 14, 65532, 6, 65531, + 15, 65529, 3, 65534, 7, 65533, 0, 3, +65535, 65534, 65533, 1, 65526, 65535, 65522, 1, +65520, 0, 65516, 0, 65514, 65535, 65515, 1, +65516, 0, 65516, 3, 65525, 9, 65521, 1, +65528, 9, 65529, 7, 65531, 12, 65531, 7, + 0, 5, 65535, 5, 1, 6, 65535, 4, + 1, 7, 65535, 3, 0, 7, 0, 5, +65535, 4, 2, 8, 65535, 2, 0, 10, + 0, 8, 1, 14, 65534, 7, 2, 15, +65535, 6, 65535, 15, 2, 6, 65535, 5, +65535, 65534, 3, 1, 3, 65532, 7, 65528, + 6, 65526, 3, 65525, 9, 65524, 8, 65528, + 13, 65528, 8, 65534, 15, 2, 16, 65533, + 12, 3, 12, 65534, 8, 0, 11, 0, + 4, 1, 5, 65535, 3, 1, 65533, 65535, + 2, 0, 65534, 1, 1, 65530, 0, 65533, + 1, 65527, 65532, 65535, 65531, 65527, 65530, 1, +65531, 0, 65531, 65534, 65530, 2, 65532, 0, +65528, 65535, 65534, 2, 65529, 65533, 5, 2, +65533, 65535, 1, 1, 0, 65535, 0, 1, + 0, 65535, 0, 6, 0, 5, 1, 5, +65534, 7, 2, 4, 65534, 5, 1, 6, + 0, 2, 0, 1, 0, 0, 0, 0, +65535, 65535, 2, 2, 65533, 65533, 4, 4, +65527, 65531, 0, 4, 65527, 65529, 65532, 65531, +65532, 65532, 65528, 65528, 65534, 65533, 65528, 65531, +65532, 65528, 65530, 65534, 65532, 65528, 65534, 0, + 2, 1, 65532, 65535, 5, 0, 65531, 1, + 9, 65535, 2, 1, 7, 65535, 4, 1, + 6, 65534, 6, 3, 5, 65534, 5, 0, + 6, 65530, 4, 65531, 7, 65525, 4, 65526, + 6, 65524, 6, 65527, 4, 65524, 7, 65528, + 3, 65533, 6, 65534, 8, 1, 2, 0, + 8, 65535, 4, 1, 4, 0, 9, 65535, + 2, 2, 7, 65534, 10, 1, 11, 1, + 11, 65534, 9, 3, 13, 65532, 8, 4, + 9, 65533, 3, 2, 3, 65534, 65535, 4, + 0, 6, 1, 4, 65533, 8, 65531, 2, +65531, 7, 65529, 5, 65527, 5, 65523, 6, +65528, 4, 65522, 6, 65529, 5, 65523, 6, +65527, 4, 65524, 6, 65526, 3, 65527, 9, +65531, 1, 65531, 9, 65530, 3, 65530, 6, + 2, 6, 65534, 4, 1, 6, 65535, 5, + 1, 6, 65535, 2, 2, 7, 65534, 4, + 1, 6, 0, 5, 65535, 5, 3, 6, +65532, 5, 4, 2, 65532, 65534, 4, 1, +65532, 0, 5, 65535, 65532, 1, 2, 65527, + 0, 65532, 65534, 65530, 7, 65531, 4, 65530, + 5, 65533, 6, 65527, 4, 65533, 7, 65530, + 4, 65533, 6, 1, 65534, 0, 2, 65534, +65533, 65532, 3, 65532, 65534, 65529, 2, 65533, +65534, 65532, 1, 2, 65535, 65535, 1, 0, + 0, 1, 0, 65535, 65535, 1, 2, 0, +65533, 65535, 4, 2, 65531, 65534, 5, 65534, +65532, 65529, 3, 65531, 65535, 65532, 0, 65529, +65535, 65532, 2, 65531, 65533, 1, 4, 65535, +65532, 0, 3, 1, 65533, 65535, 4, 0, +65532, 5, 3, 2, 65535, 10, 0, 2, + 0, 6, 1, 7, 65534, 65534, 3, 3, +65534, 65533, 1, 2, 65535, 65535, 0, 1, + 1, 0, 0, 65534, 65535, 3, 1, 65533, +65535, 2, 1, 0, 65535, 65535, 1, 0, +65535, 1, 1, 65534, 65535, 3, 1, 65534, + 0, 0, 65535, 1, 2, 65535, 65533, 9, + 2, 2, 65535, 8, 1, 3, 65535, 5, + 1, 65534, 65535, 1, 1, 65535, 1, 2, + 4, 65533, 7, 4, 3, 65532, 7, 2, + 5, 65533, 5, 65529, 6, 65532, 2, 65529, + 0, 65532, 0, 0, 0, 1, 1, 65534, +65534, 1, 2, 0, 65534, 65535, 2, 2, +65534, 65534, 2, 1, 65534, 65530, 6, 65531, + 5, 65531, 5, 65530, 6, 65531, 5, 65531, + 6, 65533, 3, 5, 2, 65530, 65534, 5, + 3, 65533, 65533, 2, 1, 65535, 65528, 0, +65533, 0, 65529, 0, 65532, 0, 65529, 1, +65533, 65534, 65529, 2, 65532, 65534, 65529, 2, +65532, 65535, 65530, 0, 65532, 1, 65535, 6, + 0, 7, 0, 1, 0, 2, 1, 65533, +65535, 3, 1, 65534, 65535, 3, 1, 65531, +65535, 5, 1, 65531, 65535, 4, 1, 65535, +65535, 65535, 1, 1, 65535, 65535, 1, 1, + 0, 65535, 0, 1, 1, 65534, 65534, 2, + 2, 65534, 65534, 2, 2, 65534, 65534, 1, + 2, 65535, 65534, 1, 2, 65535, 65535, 2, +65535, 65533, 1, 4, 65535, 65532, 2, 3, +65534, 65534, 1, 2, 65535, 65534, 0, 1, + 1, 65535, 65534, 1, 3, 0, 65532, 0, + 4, 65535, 65533, 1, 2, 65535, 65535, 1, +65535, 65535, 2, 2, 65535, 65533, 0, 3, + 0, 65534, 0, 1, 0, 1, 0, 65533, + 1, 3, 65533, 65534, 4, 0, 65532, 3, + 3, 65531, 0, 6, 65533, 65530, 5, 4, +65529, 65534, 7, 1, 65531, 0, 3, 0, +65535, 65535, 65535, 1, 2, 65535, 65535, 0, +65535, 2, 1, 65533, 65535, 3, 0, 65533, + 2, 2, 65533, 0, 2, 65535, 65534, 2, + 3, 65533, 65533, 4, 3, 65532, 65533, 3, + 2, 65535, 65535, 65535, 1, 2, 65535, 65533, + 0, 4, 1, 65532, 65534, 3, 2, 65534, +65534, 0, 2, 2, 65535, 65534, 0, 1, + 0, 65535, 0, 1, 0, 65535, 0, 1, + 0, 65535, 0, 0, 0, 2, 0, 65533, + 1, 3, 65534, 65533, 2, 3, 65534, 65535, + 2, 65535, 65534, 2, 2, 65534, 65534, 2, + 2, 65535, 65535, 65535, 65535, 2, 2, 65534, +65534, 2, 2, 65535, 65535, 0, 65535, 0, + 1, 0, 0, 0, 65535, 1, 2, 65535, +65533, 0, 3, 0, 65534, 0, 1, 0, + 0, 0, 65535, 0, 1, 65535, 0, 2, + 0, 65534, 1, 1, 65534, 0, 1, 0, + 0, 0, 1, 0, 65535, 65535, 1, 1, +65535, 65535, 1, 2, 65535, 65533, 0, 3, + 1, 65534, 0, 0, 65535, 1, 1, 65534, +65534, 2, 2, 65535, 65535, 1, 1, 65535, +65535, 1, 2, 65535, 65532, 0, 4, 1, +65533, 65535, 2, 1, 0, 0, 65533, 65535, + 4, 1, 65533, 0, 2, 65535, 65534, 2, + 2, 65534, 65534, 1, 3, 0, 65533, 0, + 2, 65535, 65534, 2, 3, 65533, 65533, 3, + 3, 65534, 65532, 1, 4, 0, 65532, 65535, + 4, 2, 65533, 65533, 1, 3, 1, 65533, +65534, 3, 2, 65533, 65534, 2, 1, 65535, + 1, 0, 65535, 1, 1, 65535, 65535, 0, + 1, 0, 65535, 65535, 1, 2, 65535, 65534, + 1, 2, 65534, 65535, 3, 65535, 65532, 3, + 4, 65533, 65533, 3, 1, 65533, 0, 3, + 0, 65533, 1, 4, 65535, 65531, 0, 5, + 0, 65531, 65535, 6, 3, 65530, 65532, 5, + 4, 65532, 65532, 3, 3, 65534, 65534, 2, + 1, 65534, 0, 2, 0, 65533, 65535, 3, + 1, 65534, 65535, 2, 1, 65534, 0, 1, +65534, 65535, 2, 2, 65535, 65534, 0, 1, + 2, 0, 65532, 65535, 4, 1, 65532, 65535, + 3, 1, 65534, 0, 1, 65535, 65535, 1, + 1, 65535, 65535, 1, 0, 0, 2, 65535, +65533, 2, 3, 65534, 65534, 2, 0, 65533, + 2, 4, 65533, 65532, 3, 3, 65533, 65534, + 3, 1, 65533, 65535, 3, 1, 65534, 65535, + 1, 1, 65535, 0, 1, 65535, 0, 1, + 0, 65535, 65535, 0, 2, 1, 65533, 65535, + 3, 2, 65534, 65534, 65535, 0, 4, 1, +65532, 65535, 3, 1, 65534, 65535, 1, 1, +65535, 65535, 1, 0, 65535, 0, 1, 1, +65535, 65535, 1, 0, 65535, 1, 1, 65534, +65535, 3, 1, 65533, 65535, 3, 2, 65534, +65534, 1, 2, 0, 65534, 65535, 2, 2, +65534, 65533, 3, 3, 65533, 65535, 3, 0, +65533, 0, 2, 0, 65535, 65535, 0, 3, + 1, 65532, 65534, 4, 2, 65532, 65534, 4, + 2, 65533, 65535, 2, 0, 0, 0, 65534, + 1, 3, 65534, 65533, 2, 2, 65534, 65535, + 1, 1, 1, 65534, 65533, 2, 3, 65535, +65534, 0, 2, 0, 65534, 0, 1, 1, +65535, 65535, 0, 0, 1, 0, 65534, 1, + 2, 65535, 65535, 1, 65535, 65534, 2, 2, +65534, 65535, 1, 1, 1, 65535, 65533, 1, + 4, 65534, 65533, 3, 2, 65533, 65535, 3, + 0, 65534, 1, 0, 65534, 2, 3, 65533, +65533, 3, 3, 65534, 65534, 1, 0, 0, + 1, 0, 65534, 0, 2, 0, 65535, 0, + 0, 0, 1, 1, 65535, 65535, 65535, 0, + 3, 0, 65532, 1, 4, 65534, 65533, 2, + 1, 65534, 0, 1, 0, 0, 0, 65535, + 1, 2, 65533, 65534, 5, 2, 65531, 65535, + 3, 0, 65535, 0, 65535, 0, 2, 0, +65535, 0, 65535, 0, 3, 0, 65531, 1, + 6, 65533, 65531, 4, 4, 65532, 65533, 3, + 2, 65535, 65535, 65535, 1, 1, 65535, 1, + 0, 65534, 1, 3, 0, 65533, 65535, 1, + 1, 0, 65534, 0, 4, 1, 65532, 65535, + 3, 0, 65533, 0, 2, 0, 65535, 0, + 1, 65535, 65535, 2, 1, 65533, 65535, 3, + 0, 65534, 1, 0, 65535, 1, 0, 65535, + 2, 1, 65533, 65535, 3, 1, 65534, 65535, + 1, 1, 65535, 0, 2, 65535, 65532, 1, + 5, 0, 65532, 0, 3, 0, 65534, 0, + 1, 0, 65535, 0, 1, 1, 65535, 65534, + 1, 2, 65535, 65534, 1, 2, 65535, 65535, + 0, 65535, 1, 1, 65534, 65535, 3, 1, +65533, 0, 2, 65535, 65534, 1, 2, 65534, +65535, 3, 0, 65533, 1, 3, 65535, 65532, + 0, 3, 1, 0, 65534, 65535, 3, 1, +65533, 65535, 2, 0, 65534, 2, 2, 65534, +65535, 2, 1, 65534, 65535, 2, 0, 65534, + 0, 2, 1, 65534, 65535, 2, 2, 65534, +65533, 2, 2, 65534, 65535, 1, 1, 65535, +65535, 1, 1, 0, 0, 0, 65535, 0, + 2, 65535, 65534, 0, 1, 1, 0, 0, +65535, 0, 2, 0, 65535, 65535, 0, 2, + 0, 65534, 65535, 3, 2, 65532, 65535, 3, +65535, 65534}; diff --git a/audio_msg.c b/audio_msg.c new file mode 100644 index 0000000..6dcf7fc --- /dev/null +++ b/audio_msg.c @@ -0,0 +1,2635 @@ +#include "stm32f7xx_hal.h" + +const uint16_t audio_msg[]={ +65532, 6, 8, 65525, 65527, 5, 11, 65535, +65523, 3, 4, 2, 7, 65530, 65522, 1, + 20, 2, 65516, 0, 10, 65535, 0, 1, +65527, 65531, 13, 9, 65528, 65528, 4, 6, +65535, 65531, 65534, 1, 1, 2, 6, 65535, +65529, 0, 0, 0, 7, 65532, 65528, 8, + 11, 65529, 65522, 5, 10, 65533, 65531, 65534, + 0, 6, 1, 65532, 65533, 1, 8, 0, +65524, 0, 12, 1, 65523, 3, 14, 65529, +65526, 10, 1, 65521, 9, 17, 65521, 65522, + 14, 11, 65525, 65528, 9, 9, 65527, 65523, + 14, 17, 65517, 65514, 21, 21, 65514, 65521, + 22, 6, 65517, 3, 17, 65533, 65523, 65528, + 3, 14, 8, 65521, 65526, 15, 7, 65527, +65533, 2, 65533, 1, 4, 65532, 0, 10, +65532, 65521, 9, 13, 65527, 65531, 9, 65534, +65521, 7, 20, 65525, 65516, 15, 22, 65522, +65517, 14, 10, 65521, 65535, 11, 65531, 65530, + 8, 5, 65526, 65532, 10, 3, 65527, 65529, + 8, 7, 65528, 65532, 9, 1, 65525, 3, + 12, 65529, 65525, 11, 9, 65525, 65534, 7, +65532, 65534, 9, 2, 65527, 3, 4, 65528, + 1, 8, 65531, 65523, 5, 18, 65535, 65523, + 2, 4, 65532, 5, 0, 65521, 6, 15, +65523, 65525, 19, 7, 65516, 65533, 16, 3, +65531, 65529, 65529, 12, 13, 65518, 65517, 24, + 20, 65515, 65522, 13, 8, 65533, 3, 65534, +65521, 2, 15, 65533, 65528, 5, 1, 65534, + 5, 3, 65526, 65527, 9, 4, 65528, 3, + 8, 0, 65531, 1, 3, 65528, 65527, 10, + 14, 65526, 65523, 10, 17, 65526, 65521, 9, + 8, 65528, 65530, 12, 4, 65520, 65533, 16, + 4, 65519, 65535, 14, 65534, 65531, 1, 65535, +65535, 7, 65532, 65523, 9, 14, 65526, 65523, + 11, 12, 65531, 65529, 65533, 1, 6, 0, +65529, 0, 11, 0, 65526, 1, 9, 2, +65529, 65526, 6, 12, 65534, 65526, 65533, 6, + 9, 2, 65522, 65525, 14, 14, 65531, 65514, +65531, 65524, 11, 309, 65524, 1030, 8, 1755, +65534, 2278, 1, 2223, 65535, 1482, 65531, 323, + 11, 64567, 65521, 63269, 15, 62528, 65524, 62549, + 8, 63294, 65533, 64588, 65533, 650, 5, 1986, +65530, 2634, 10, 2506, 65526, 1697, 4, 276, + 2, 64397, 65535, 63234, 48, 62577, 148, 62521, + 215, 63188, 293, 64153, 242, 65418, 166, 1184, + 1, 2220, 65402, 2795, 65238, 2943, 65169, 2414, +65182, 1333, 65281, 65505, 65452, 64117, 97, 62934, + 259, 62438, 315, 62770, 304, 63806, 177, 65293, + 24, 1398, 65379, 2572, 65242, 2970, 65181, 2633, +65162, 1476, 65259, 65489, 65390, 64047, 65515, 62934, + 169, 62427, 263, 62614, 346, 63443, 360, 64603, + 291, 417, 153, 1755, 65527, 2677, 65360, 3111, +65219, 3009, 65153, 2239, 65197, 948, 65324, 65045, +65508, 63627, 154, 62633, 329, 62366, 356, 62973, + 332, 64239, 184, 345, 4, 1986, 65359, 2944, +65227, 3174, 65144, 2497, 65176, 1144, 65265, 65030, +65414, 63587, 36, 62564, 205, 62248, 316, 62663, + 396, 63700, 360, 65008, 309, 934, 120, 2230, +65505, 3034, 65324, 3300, 65187, 2926, 65143, 1913, +65206, 446, 65339, 64459, 15, 63081, 215, 62284, + 351, 62333, 403, 63210, 326, 64728, 175, 960, +65514, 2488, 65324, 3283, 65193, 3193, 65124, 2265, +65142, 662, 65294, 64494, 65414, 63078, 98, 62216, + 220, 62122, 372, 62762, 408, 63988, 387, 65433, + 282, 1433, 102, 2640, 65458, 3338, 65274, 3382, +65143, 2765, 65129, 1493, 65192, 65437, 65386, 63859, + 45, 62583, 263, 62073, 398, 62422, 404, 63618, + 353, 65293, 141, 1576, 65485, 2909, 65277, 3444, +65142, 3041, 65104, 1860, 65135, 156, 65295, 64004, +65432, 62727, 123, 62053, 276, 62205, 392, 63060, + 457, 64381, 379, 400, 273, 1880, 72, 2970, +65396, 3484, 65237, 3302, 65091, 2428, 65116, 980, +65209, 64866, 65412, 63330, 101, 62261, 296, 62040, + 426, 62718, 427, 64127, 319, 394, 126, 2110, +65444, 3228, 65250, 3476, 65125, 2799, 65085, 1404, +65143, 65176, 65308, 63560, 65472, 62419, 155, 61989, + 305, 62351, 432, 63394, 448, 64839, 380, 882, + 238, 2330, 24, 3218, 65366, 3554, 65184, 3096, +65088, 1996, 65103, 420, 65247, 64284, 65432, 62876, + 153, 62071, 321, 62148, 453, 63113, 420, 64676, + 299, 987, 112, 2546, 65393, 3433, 65248, 3372, +65093, 2465, 65087, 898, 65164, 64681, 65307, 63142, +65518, 62200, 170, 61985, 343, 62582, 447, 63801, + 447, 65317, 381, 1392, 193, 2676, 5, 3432, +65314, 3478, 65157, 2812, 65076, 1495, 65119, 65386, +65267, 63753, 65482, 62499, 175, 61997, 361, 62349, + 413, 63578, 565, 65272, 1128, 1534, 1811, 2937, + 2388, 3514, 2444, 3216, 1869, 2048, 590, 384, +64756, 64195, 63316, 62775, 62226, 62046, 62002, 62062, +62679, 62888, 63981, 64235, 259, 297, 2015, 1857, + 3047, 3001, 3186, 3561, 2403, 3349, 900, 2443, +64571, 966, 63052, 64810, 62076, 63255, 61802, 62212, +62393, 61996, 63553, 62659, 64954, 64086, 954, 339, + 2267, 2064, 3085, 3234, 3344, 3564, 3031, 2943, + 2009, 1617, 523, 65377, 64506, 63723, 63058, 62463, +62092, 61958, 62060, 62216, 62971, 63240, 64489, 64693, + 869, 808, 2605, 2270, 3522, 3277, 3484, 3597, + 2535, 3143, 756, 2019, 64449, 399, 62838, 64252, +61929, 62809, 61760, 62026, 62501, 62102, 63788, 63052, +65326, 64652, 1383, 917, 2704, 2534, 3452, 3438, + 3561, 3465, 3085, 2633, 1889, 1075, 279, 64898, +64188, 63257, 62755, 62254, 61937, 61933, 62069, 62459, +63140, 63636, 64837, 65197, 1291, 1290, 2983, 2652, + 3794, 3452, 3624, 3522, 2443, 2835, 586, 1510, +64121, 65358, 62571, 63722, 61661, 62448, 61640, 61957, +62523, 62317, 63960, 63535, 68, 65220, 1745, 1488, + 3038, 2893, 3715, 3553, 3718, 3288, 3026, 2211, + 1665, 569, 65474, 64366, 63766, 62896, 62356, 62062, +61686, 62019, 62010, 62748, 63285, 64104, 65146, 173, + 1706, 1778, 3333, 2994, 4053, 3559, 3644, 3386, + 2338, 2444, 263, 969, 63777, 64780, 62198, 63246, +61379, 62186, 61500, 61999, 62520, 62631, 64096, 64054, + 335, 287, 2052, 1992, 3345, 3211, 3948, 3575, + 3834, 3044, 2939, 1761, 1410, 40, 65103, 63888, +63324, 62565, 61984, 61978, 61493, 62159, 62062, 63112, +63532, 64591, 65533, 691, 2114, 2218, 3627, 3268, + 4151, 3580, 3574, 3166, 2038, 1988, 65509, 409, +63472, 64232, 61992, 62810, 61309, 62035, 61579, 62098, +62697, 63043, 64368, 64596, 621, 874, 2347, 2447, + 3531, 3418, 4061, 3497, 3764, 2725, 2746, 1262, + 1053, 65050, 64736, 63433, 62959, 62297, 61774, 61941, +61460, 62376, 62255, 63519, 63854, 65083, 432, 1214, + 2458, 2597, 3871, 3442, 4179, 3522, 3442, 2850, + 1764, 1649, 65204, 130, 63200, 64134, 61803, 62970, +61255, 62340, 61657, 62510, 62894, 63415, 64615, 64824, + 949, 842, 2620, 2183, 3743, 3001, 4109, 3001, + 3685, 2330, 2477, 1040, 711, 65051, 64306, 63585, +62653, 62553, 61558, 62176, 61522, 62536, 62433, 63576, +64243, 65041, 786, 1080, 2795, 2417, 4012, 3255, + 4158, 3297, 3249, 2672, 1471, 1373, 64892, 65331, +62941, 63802, 61661, 62684, 61215, 62277, 61793, 62645, +63123, 63778, 64905, 65295, 1268, 1346, 2860, 2598, + 3891, 3194, 4107, 3008, 3519, 2081, 2159, 667, + 339, 64581, 63936, 63188, 62373, 62304, 61468, 62143, +61594, 62743, 62731, 63971, 64578, 77, 1208, 1657, + 3036, 2925, 4129, 3376, 4089, 3042, 3033, 1955, + 1161, 425, 64575, 64367, 62701, 63107, 61509, 62412, +61248, 62477, 61922, 63186, 63378, 64507, 65223, 475, + 1569, 1961, 3130, 2963, 4012, 3274, 4099, 2801, + 3340, 1659, 1852, 131, 65499, 64098, 63573, 62849, +62103, 62216, 61370, 62314, 61731, 63175, 63001, 64596, +64975, 691, 1535, 2238, 3338, 3203, 4338, 3388, + 4284, 2739, 3174, 1463, 1286, 65385, 64585, 63880, +62598, 62791, 61286, 62368, 60908, 62674, 61545, 63627, +63075, 65046, 65057, 1060, 1642, 2394, 3393, 3193, + 4457, 3183, 4536, 2470, 3612, 1143, 1914, 65071, +65212, 63609, 63098, 62520, 61463, 62185, 60844, 62537, +61328, 63648, 62915, 65168, 65097, 1307, 1872, 2661, + 3693, 3370, 4613, 3232, 4284, 2323, 3009, 878, + 929, 64817, 64225, 63407, 62317, 62563, 61130, 62383, +60967, 62950, 61792, 64087, 63444, 75, 65523, 1571, + 2033, 2786, 3712, 3274, 4544, 3015, 4437, 2029, + 3319, 560, 1461, 64494, 64756, 63122, 62703, 62292, +61265, 62218, 60834, 62871, 61591, 64186, 63279, 268, + 38, 1875, 2254, 3016, 3983, 3433, 4664, 2956, + 4191, 1840, 2747, 270, 592, 64237, 63920, 63012, +62049, 62397, 61053, 62486, 61004, 63326, 62021, 64606, +63754, 648, 363, 2091, 2385, 3061, 3957, 3298, + 4635, 2726, 4326, 1543, 3047, 65469, 1067, 63939, +64342, 62728, 62377, 62164, 61083, 62397, 60904, 63303, +61812, 64789, 63679, 921, 435, 2382, 2623, 3287, + 4193, 3341, 4686, 2605, 4044, 1275, 2430, 65189, + 268, 63721, 63582, 62683, 61847, 62333, 60958, 62709, +61102, 63744, 62237, 65188, 64101, 1229, 707, 2543, + 2728, 3254, 4156, 3188, 4679, 2355, 4163, 956, + 2738, 64882, 636, 63405, 63947, 62435, 62032, 62162, +60957, 62649, 60953, 63838, 62083, 65395, 64060, 1546, + 830, 2788, 2964, 3439, 4341, 3139, 4675, 2182, + 3856, 658, 2122, 64599, 65452, 63252, 63247, 62456, +61617, 62379, 60869, 63015, 61194, 64247, 62484, 241, +64439, 1795, 1078, 2896, 3029, 3339, 4336, 3012, + 4647, 2120, 3979, 784, 2359, 64873, 239, 63601, +63531, 62698, 61777, 62435, 60858, 62854, 61111, 63864, +62378, 65265, 64488, 1241, 1219, 2465, 3285, 3033, + 4472, 2951, 4599, 2075, 3621, 762, 1763, 64736, +65082, 63421, 62940, 62505, 61429, 62327, 60866, 62857, +61333, 64036, 62790, 32, 64805, 1565, 1451, 2716, + 3318, 3156, 4458, 2863, 4605, 1878, 3733, 466, + 2002, 64535, 65342, 63335, 63180, 62624, 61527, 62562, +60842, 63239, 61255, 64370, 62730, 325, 64874, 1749, + 1622, 2752, 3551, 3109, 4585, 2708, 4502, 1689, + 3373, 240, 1410, 64301, 64695, 63105, 62645, 62434, +61247, 62493, 60874, 63255, 61531, 64578, 63097, 600, +65225, 2041, 1914, 2958, 3744, 3119, 4654, 2538, + 4465, 1359, 3121, 65397, 1078, 64033, 64291, 63006, +62281, 62564, 61046, 62833, 60859, 63697, 61710, 65013, +63440, 965, 87, 2221, 2262, 2968, 3980, 2997, + 4711, 2334, 4401, 1106, 2991, 65188, 952, 63791, +64202, 62816, 62289, 62412, 61105, 62767, 60989, 63756, +61875, 65203, 63619, 1205, 273, 2479, 2501, 3098, + 4287, 2953, 5148, 2162, 4767, 792, 3313, 64905, + 979, 63593, 63974, 62813, 61799, 62610, 60466, 63111, +60286, 64162, 61323, 8, 63307, 1448, 267, 2506, + 2771, 3022, 4635, 2758, 5381, 1919, 4796, 576, + 3107, 64666, 601, 63426, 63585, 62627, 61443, 62491, +60301, 63080, 60345, 64222, 61549, 220, 63652, 1661, + 646, 2731, 3055, 3095, 4802, 2701, 5395, 1661, + 4693, 288, 2961, 64388, 471, 63286, 63476, 62709, +61441, 62750, 60330, 63488, 60444, 64654, 61675, 564, +63871, 1860, 846, 2749, 3317, 2950, 4950, 2480, + 5441, 1417, 4591, 52, 2656, 64171, 92, 63101, +63063, 62543, 61105, 62663, 60187, 63491, 60500, 64782, +61927, 774, 64211, 2101, 1196, 2920, 3566, 2976, + 5060, 2337, 5377, 1149, 4422, 65247, 2465, 63959, +65465, 62996, 62990, 62710, 61121, 62975, 60283, 63937, +60643, 65186, 62104, 1110, 64394, 2218, 1405, 2894, + 3744, 2792, 5165, 2100, 5373, 886, 4266, 65043, + 2159, 63731, 65061, 62872, 62590, 62551, 60793, 62963, +60151, 63952, 60688, 65367, 62377, 1290, 64752, 2443, + 1783, 2978, 3975, 2767, 5266, 1915, 5262, 607, + 4079, 64765, 1914, 63570, 64915, 62864, 62519, 62771, +60839, 63294, 60266, 64374, 60847, 192, 62547, 1516, +64907, 2505, 1960, 2860, 4123, 2571, 5340, 1661, + 5248, 397, 3916, 64574, 1616, 63426, 64530, 62754, +62071, 62717, 60560, 63301, 60109, 64477, 60950, 352, +62804, 1735, 65287, 2639, 2307, 2918, 4359, 2451, + 5378, 1437, 5122, 85, 3695, 64311, 1393, 63297, +64387, 62820, 62061, 62968, 60656, 63696, 60262, 64896, +61166, 693, 62987, 1902, 65475, 2640, 2455, 2758, + 4464, 2235, 5417, 1191, 5040, 65418, 3480, 64098, + 1062, 63111, 63980, 62644, 61704, 62843, 60384, 63691, +60224, 64978, 61294, 907, 63303, 2109, 314, 2825, + 2783, 2770, 4648, 2108, 5404, 935, 4881, 65124, + 3224, 63928, 839, 63080, 63835, 62889, 61710, 63200, +60478, 64173, 60424, 65392, 61476, 1183, 63552, 2210, + 477, 2712, 2973, 2578, 4748, 1866, 5421, 670, + 4789, 64933, 2985, 63697, 517, 62937, 63430, 62720, +61373, 63152, 60240, 64193, 60384, 7, 61657, 1385, +63819, 2407, 866, 2822, 3250, 2541, 4914, 1665, + 5362, 409, 4605, 64651, 2716, 63582, 287, 62988, +63315, 62989, 61364, 63558, 60392, 64636, 60594, 387, +61881, 1600, 64063, 2439, 1040, 2678, 3402, 2319, + 4957, 1394, 5349, 176, 4431, 64428, 2433, 63402, +65414, 62823, 62879, 62897, 61002, 63541, 60182, 64712, +60610, 567, 62122, 1788, 64463, 2610, 1469, 2731, + 3777, 2203, 5116, 1187, 5313, 65407, 4189, 64224, + 2171, 63301, 65161, 62965, 62779, 63192, 61033, 63970, +60338, 65149, 60839, 889, 62380, 1950, 64676, 2573, + 1686, 2537, 3888, 1983, 5185, 894, 5259, 65216, + 4018, 64004, 1848, 63157, 64737, 62837, 62329, 63118, +60672, 64006, 60169, 65248, 60874, 1077, 62631, 2139, +65044, 2686, 2066, 2559, 4152, 1823, 5271, 655, + 5143, 64928, 3804, 63806, 1596, 63114, 64596, 63001, +62302, 63447, 60798, 64428, 60374, 121, 61124, 1370, +62874, 2245, 65256, 2648, 2230, 2356, 4262, 1584, + 5292, 406, 5049, 64682, 3577, 63625, 1247, 62954, +64184, 62920, 61896, 63419, 60503, 64511, 60254, 261, +61226, 1567, 63160, 2420, 97, 2723, 2599, 2305, + 4469, 1394, 5330, 129, 4884, 64436, 3338, 63457, + 1007, 62994, 64047, 63106, 61899, 63808, 60653, 64915, +60474, 644, 61503, 1803, 63392, 2470, 299, 2604, + 2750, 2096, 4540, 1102, 5321, 65419, 4750, 64208, + 3084, 63288, 643, 62889, 63645, 63065, 61517, 63843, +60392, 65048, 60424, 835, 61634, 1976, 63706, 2604, + 691, 2621, 3069, 1971, 4743, 881, 5284, 65129, + 4577, 63966, 2795, 63196, 411, 62960, 63483, 63336, +61549, 64223, 60528, 65451, 60687, 1162, 61889, 2159, +63985, 2594, 871, 2475, 3210, 1709, 4785, 612, + 5236, 64874, 4414, 63773, 2540, 63058, 59, 62898, +63141, 63340, 61235, 64308, 60374, 66, 60676, 1340, +62077, 2329, 64267, 2666, 1217, 2449, 3457, 1546, + 4888, 367, 5142, 64600, 4193, 63586, 2250, 63009, +65386, 63044, 63035, 63644, 61321, 64681, 60562, 361, +60966, 1735, 62372, 4374, 64545, 5978, 1413, 5495, + 3573, 4555, 4885, 3516, 5027, 1886, 3986, 64389, + 1955, 61963, 65049, 61374, 62707, 61023, 61052, 60407, +60460, 60820, 61009, 62373, 62595, 64751, 64829, 565, + 1743, 886, 3774, 1874, 4952, 3056, 4903, 2778, + 3732, 1598, 1677, 675, 64820, 391, 62629, 276, +61135, 64750, 60651, 63865, 61348, 64358, 63274, 64574, + 176, 63753, 2521, 62740, 4465, 62328, 5549, 62713, + 5316, 62906, 3667, 62677, 1187, 63789, 64201, 656, +61816, 2623, 60119, 4020, 59615, 5255, 60491, 6381, +62497, 6632, 65029, 4831, 1995, 1788, 4189, 64969, + 5538, 62635, 5363, 59954, 3971, 58051, 1684, 57876, +64826, 59639, 62615, 62219, 61013, 64588, 60376, 2005, +61135, 5418, 62770, 7214, 64881, 7068, 1517, 5641, + 3339, 3767, 4403, 1643, 4234, 64203, 2888, 61120, + 910, 59884, 64494, 59934, 62728, 60317, 61655, 61168, +61572, 62737, 62595, 65054, 64427, 1394, 890, 1905, + 2728, 2039, 4049, 2769, 4481, 2923, 3612, 2433, + 1811, 1846, 65098, 1801, 63060, 2338, 61526, 2219, +60773, 1304, 61100, 825, 62614, 435, 64774, 64693, + 1531, 62900, 3583, 61399, 4936, 61029, 5290, 61480, + 4308, 61924, 2210, 63080, 65232, 65526, 62874, 2619, +60992, 4408, 60006, 5442, 60230, 5810, 61633, 5605, +63921, 3987, 853, 943, 3083, 63604, 4795, 61479, + 5395, 59608, 4764, 58231, 3011, 58060, 747, 59448, +64080, 62066, 62268, 64593, 61172, 1484, 61100, 4356, +62218, 6566, 63943, 7257, 435, 6652, 2264, 5252, + 3580, 3751, 4050, 1642, 3388, 64390, 1820, 62186, +65466, 61261, 63737, 60828, 62371, 60803, 61790, 61408, +62118, 62838, 63381, 64887, 65212, 674, 1530, 1388, + 3032, 2332, 3947, 3139, 3816, 3131, 2665, 2535, + 694, 1740, 64105, 1362, 62283, 1015, 61129, 12, +60859, 64627, 61709, 64286, 63562, 63719, 351, 62810, + 2688, 61767, 4515, 61294, 5470, 61712, 5285, 62347, + 3820, 63088, 1433, 64857, 64406, 1748, 62089, 4020, +60516, 5727, 59932, 6681, 60609, 7097, 62384, 6421, +64840, 4066, 1811, 920, 3895, 63497, 5194, 60926, + 5272, 58685, 4107, 57533, 2027, 57851, 65132, 59967, +62992, 62858, 61407, 238, 60754, 3328, 61213, 6052, +62708, 7442, 64737, 7188, 1306, 5597, 2979, 3407, + 3926, 1019, 3861, 63757, 2753, 61236, 924, 60005, +64559, 59809, 63005, 60360, 62031, 61383, 62037, 62812, +62882, 64704, 64579, 727, 996, 1435, 2775, 1936, + 3936, 2496, 4240, 2864, 3455, 2871, 1719, 2719, +65032, 2723, 62905, 2944, 61354, 2599, 60718, 1618, +61055, 640, 62520, 64950, 64710, 63388, 1601, 61659, + 3731, 60367, 5063, 60198, 5336, 60956, 4439, 62173, + 2428, 64075, 65426, 1167, 62955, 3736, 61039, 5680, +60081, 6542, 60179, 6424, 61494, 5471, 63561, 3268, + 597, 168, 2709, 62721, 5486, 60324, 8571, 58688, + 8826, 57900, 7115, 58243, 5006, 59940, 2956, 62627, +65418, 65409, 61574, 2503, 59775, 4977, 59903, 6607, +59833, 7072, 59871, 6370, 61087, 4837, 63405, 3099, + 286, 960, 927, 64125, 839, 62314, 1962, 61252, + 2742, 60910, 2020, 61062, 1047, 61734, 700, 62973, + 1284, 64566, 1452, 267, 263, 1226, 65151, 2116, +65410, 2859, 64557, 3159, 62499, 2976, 60461, 2525, +59557, 2098, 59790, 1558, 60045, 572, 60605, 65040, +63486, 64042, 1992, 62976, 5291, 61902, 7671, 60966, + 9478, 60643, 10481, 61193, 9749, 62235, 6042, 63710, + 1300, 315, 62964, 2683, 59280, 4987, 55800, 6501, +53981, 7167, 54754, 6877, 58051, 5523, 62224, 2925, + 412, 65325, 4762, 62388, 8876, 59920, 10520, 58291, + 9602, 57742, 7013, 58588, 3950, 60835, 743, 63790, +62303, 1229, 58792, 4040, 57756, 6144, 58386, 7058, +59391, 6636, 60844, 5004, 62973, 2841, 24, 484, + 1973, 63602, 2023, 61594, 1820, 60494, 2361, 60301, + 2563, 60859, 2266, 61822, 2179, 63052, 2843, 64527, + 4173, 184, 4564, 988, 3556, 1613, 2648, 2176, + 1501, 2707, 64566, 3044, 61395, 3207, 58681, 3313, +57594, 3301, 58097, 2769, 59101, 1738, 61263, 335, +65319, 64225, 4076, 62447, 7338, 60810, 9132, 59810, + 9635, 59850, 8937, 60861, 6273, 62618, 1601, 64955, +62446, 2095, 58934, 4630, 56167, 6426, 54428, 7114, +54451, 6589, 56656, 5060, 60642, 2498, 64678, 64939, + 2713, 61963, 6434, 59614, 9265, 58243, 10082, 57914, + 9006, 58690, 6836, 60669, 4483, 63364, 1860, 701, +64063, 3292, 61342, 5343, 60268, 6521, 60033, 6643, +60165, 5713, 60776, 4158, 62119, 2294, 64201, 265, + 172, 63842, 774, 62318, 1540, 61494, 2661, 61274, + 3180, 61558, 3113, 62227, 2779, 63245, 2755, 64449, + 2925, 65508, 2112, 872, 697, 1776, 65102, 2493, +63821, 3043, 61913, 3184, 59833, 3055, 58310, 2747, +58284, 2140, 59275, 1134, 60698, 65369, 63248, 63908, + 1602, 62703, 5465, 61755, 8557, 60854, 10340, 60655, +10883, 61433, 10114, 62846, 7170, 64589, 2503, 1018, +63387, 3439, 59380, 5425, 56110, 6459, 54199, 6421, +54200, 5544, 56596, 3815, 60725, 1238, 64977, 63782, + 3648, 61259, 7461, 59646, 9892, 58825, 10107, 58897, + 8377, 60167, 5365, 62537, 2187, 65363, 64316, 2322, +60926, 4230, 58810, 5559, 58288, 5969, 58885, 5109, +60053, 3329, 61556, 1290, 63411, 64997, 65342, 63265, + 851, 61820, 1217, 61172, 1740, 61526, 2501, 62285, + 3084, 63124, 3611, 64005, 4054, 65056, 4887, 392, + 5297, 837, 4583, 1081, 2988, 1547, 1066, 2205, +64030, 2585, 61086, 2768, 58305, 2999, 56704, 3105, +56949, 2727, 58506, 1592, 61002, 39, 64734, 64039, + 3496, 62313, 7329, 60745, 9793, 59824, 10473, 60036, + 9577, 61336, 7182, 63198, 3086, 65451, 63790, 2493, +59582, 4978, 56447, 6465, 54688, 6728, 54411, 5822, +55922, 4029, 59170, 1482, 63328, 63983, 1673, 61241, + 5194, 59473, 7973, 58745, 9382, 58928, 9198, 60141, + 7593, 62321, 5286, 65108, 2862, 2151, 127, 4061, +63008, 5327, 61224, 5868, 60370, 5331, 60213, 4017, +60490, 2285, 61442, 694, 63087, 64785, 64671, 63477, + 235, 62579, 1311, 62384, 2469, 62658, 3380, 63016, + 3737, 63417, 3917, 63980, 3770, 64635, 3409, 65232, + 2492, 88, 1045, 711, 64952, 1545, 63242, 2282, +61221, 2702, 59431, 2898, 58291, 2916, 58128, 2608, +59095, 1598, 60869, 132, 63536, 64044, 1429, 62496, + 4959, 61069, 7823, 60191, 9729, 60181, 10278, 61236, + 9331, 62959, 6713, 65092, 2692, 1956, 63872, 4387, +60011, 6215, 56838, 6938, 54987, 6563, 55006, 5182, +56867, 3019, 60290, 202, 64371, 62899, 2906, 60633, + 6552, 59301, 8960, 58897, 9514, 59516, 8431, 61112, + 6103, 63581, 3027, 638, 65304, 2869, 62215, 4437, +59960, 5242, 58997, 5142, 59013, 4086, 59793, 2495, +61180, 750, 62773, 64789, 64310, 63462, 65444, 62538, + 619, 62247, 1310, 62544, 2119, 63091, 2796, 63647, + 3539, 64173, 4326, 64732, 4973, 65204, 5216, 3, + 4631, 418, 3223, 1114, 1224, 1964, 64149, 2716, +61175, 3292, 58648, 3666, 57119, 3705, 57043, 3058, +58410, 1667, 61004, 65381, 64643, 63349, 3240, 61454, + 6927, 59973, 9492, 59383, 10540, 59933, 9771, 61519, + 7299, 63727, 3471, 828, 64471, 3461, 60307, 5690, +57048, 6842, 55095, 6736, 54820, 5454, 56204, 3271, +59030, 502, 62728, 63124, 1010, 60780, 4410, 59311, + 7056, 58942, 8389, 59553, 8332, 61109, 7145, 63383, + 5226, 375, 2887, 2572, 512, 4237, 63696, 5200, +62074, 5268, 61087, 4377, 60727, 2900, 60840, 1186, +61425, 65224, 62329, 63957, 63430, 63044, 64545, 62675, + 102, 62774, 1419, 63172, 2679, 63600, 3696, 63874, + 4474, 64168, 4831, 64435, 4714, 64684, 4045, 65253, + 2626, 609, 745, 2152, 64048, 3525, 61635, 4268, +59395, 4581, 57869, 4617, 57336, 3900, 58061, 2071, +59868, 65271, 62641, 63058, 574, 61007, 4269, 59181, + 7478, 58273, 9666, 58739, 10407, 60514, 9528, 63012, + 7071, 168, 3359, 3440, 64638, 6396, 60669, 8074, +57529, 8066, 55608, 6771, 55409, 4520, 56822, 1614, +59741, 63751, 63530, 60651, 1862, 58779, 5307, 58082, + 7733, 58307, 8722, 59434, 8239, 61603, 6499, 64342, + 3930, 1437, 1063, 3327, 63869, 4801, 61627, 5670, +60298, 5516, 59843, 4396, 60149, 2898, 60986, 1421, +62065, 162, 63147, 64360, 64184, 63202, 64977, 62716, + 296, 62680, 1280, 62654, 2405, 62563, 3572, 62799, + 4660, 63118, 5426, 63910, 5773, 64746, 5290, 276, + 3889, 2243, 1710, 3485, 64465, 4580, 61451, 4883, +58786, 4695, 57022, 4251, 56665, 2445, 57806, 305, +60303, 63356, 63845, 61194, 2293, 59625, 6173, 58305, + 9073, 58556, 10539, 59788, 10174, 62067, 8018, 64946, + 4546, 2159, 240, 5380, 61576, 7419, 58116, 8164, +55849, 7583, 55226, 5555, 56164, 3281, 58502, 80, +61818, 62549, 65465, 60223, 3234, 58807, 5921, 58855, + 7364, 59305, 7777, 61039, 6956, 63419, 5570, 354, + 4064, 2734, 2039, 4079, 24, 5261, 63860, 5400, +62784, 4525, 61962, 3335, 61216, 1515, 61131, 344, +61393, 64542, 61815, 63381, 62304, 62847, 63195, 62444, +64708, 62740, 1034, 62559, 2778, 62555, 4315, 62931, + 5679, 63221, 6505, 64218, 6203, 65079, 4912, 1113, + 2799, 2886, 148, 4022, 62680, 5081, 59450, 5144, +57076, 4936, 56049, 3883, 56335, 1675, 57921, 64928, +60566, 62249, 64312, 60337, 2923, 58897, 6627, 58300, + 9274, 59376, 10555, 61137, 10438, 64044, 8466, 1486, + 5095, 4388, 1054, 7019, 62661, 7883, 59399, 7717, +56967, 5920, 55871, 3331, 56647, 548, 58742, 62795, +61752, 60493, 65065, 58850, 2739, 58571, 5529, 59324, + 7068, 60547, 7371, 62900, 6535, 65115, 5137, 1823, + 3168, 3513, 813, 4313, 64270, 4962, 62590, 4357, +61667, 3531, 61090, 2318, 60771, 988, 61004, 248, +61438, 64603, 62015, 63990, 62639, 63469, 63545, 63146, +65043, 63112, 1292, 62574, 3127, 62683, 4809, 62851, + 6300, 63475, 7274, 64715, 7121, 408, 5910, 2354, + 3633, 3748, 688, 4750, 62868, 5286, 59406, 4732, +56949, 3978, 55904, 1985, 56416, 65129, 58411, 62701, +61537, 60359, 119, 59102, 4393, 58313, 7954, 58910, +10131, 60621, 10612, 62965, 9480, 633, 6580, 3387, + 2593, 6052, 63850, 7608, 60070, 7628, 57361, 6724, +55815, 4280, 55815, 1761, 57406, 64387, 60100, 61699, +63352, 60059, 878, 59046, 3664, 59529, 5861, 60496, + 6933, 62254, 6793, 64588, 5658, 980, 4181, 3040, + 2354, 4049, 445, 4576, 64343, 4524, 63127, 3506, +62482, 2612, 62043, 1145, 61687, 93, 61687, 64780, +61762, 63777, 62098, 63482, 62592, 62976, 63647, 62892, +65484, 62705, 2146, 62364, 4188, 62677, 5798, 62902, + 6907, 64015, 7206, 65375, 6267, 1403, 4280, 3339, + 1376, 4444, 63647, 5455, 60438, 5504, 57557, 4711, +55996, 3440, 55882, 887, 57287, 64018, 59972, 61394, +63443, 59505, 2090, 58610, 6233, 58490, 9177, 59980, +10552, 62112, 10063, 65075, 8191, 2806, 4858, 5317, + 914, 7436, 62531, 7739, 59369, 6980, 57420, 4979, +56647, 2040, 57267, 64847, 59205, 61939, 61927, 59996, +64958, 59024, 2108, 58944, 4407, 60227, 6102, 61681, + 6681, 64006, 6245, 516, 4979, 2283, 3472, 3766, + 1713, 4104, 65491, 4272, 63940, 3587, 62779, 2650, +62083, 1824, 61628, 603, 61245, 82, 61221, 64807, +61394, 64257, 61661, 63947, 62615, 63305, 63980, 63139, + 471, 62519, 2970, 62372, 4731, 62654, 6384, 63248, + 7092, 64852, 6976, 789, 5908, 2683, 3411, 4289, + 624, 5144, 62815, 5737, 59790, 4898, 57579, 3679, +56229, 1469, 56870, 64255, 58536, 61858, 61427, 59498, +65263, 58483, 3531, 58272, 7469, 59257, 9588, 61499, +10275, 64064, 9298, 1903, 6601, 4683, 3321, 6747, +64696, 7799, 61138, 7087, 58471, 5720, 56840, 3025, +56923, 281, 57817, 63241, 60172, 60893, 63070, 59886, + 231, 59431, 2917, 60200, 4590, 61703, 5929, 63383, + 6076, 84, 5177, 1616, 4107, 3140, 2437, 3906, + 1114, 3873, 65273, 3689, 64012, 2662, 63438, 1928, +62691, 929, 62457, 65516, 61956, 65068, 61656, 64229, +61860, 63965, 62039, 63421, 63099, 62894, 64618, 62636, + 1190, 62060, 3643, 62354, 5236, 62741, 6682, 63994, + 6998, 260, 6418, 1851, 4849, 3881, 1961, 4994, +64484, 5772, 61141, 5681, 58449, 4383, 56820, 2754, +56187, 11, 57598, 63005, 59765, 60648, 63160, 58834, + 1492, 58513, 5083, 58811, 8290, 60660, 9534, 63152, + 9377, 573, 7667, 3866, 4611, 6007, 1340, 7471, +63129, 7339, 60316, 5942, 58443, 3833, 57660, 759, +58386, 63783, 59705, 61417, 62136, 59933, 64752, 59648, + 1405, 59825, 3545, 61373, 4682, 62942, 5502, 64890, + 5255, 1158, 4287, 2302, 3252, 3442, 1745, 3488, + 632, 3338, 64912, 2841, 63833, 1968, 63246, 1541, +62442, 618, 62164, 224, 61581, 65284, 61387, 64667, +61712, 64366, 62152, 63413, 63607, 62896, 65368, 62243, + 2077, 61846, 4347, 62357, 5652, 63075, 6784, 64945, + 6549, 1227, 5622, 3082, 3646, 4835, 664, 5540, +63334, 5890, 60313, 4845, 58233, 3073, 57237, 790, +57301, 63405, 59171, 61191, 61623, 59170, 65055, 58414, + 3181, 58864, 6276, 60079, 8716, 62665, 9123, 65316, + 8293, 2887, 6076, 5397, 2792, 6712, 65158, 7230, +61711, 6061, 59443, 4307, 58109, 1786, 57890, 64675, +59097, 62672, 60659, 60909, 63282, 60374, 80, 60409, + 2152, 61238, 3950, 62784, 4675, 64231, 5103, 403, + 4513, 1609, 3480, 2577, 2498, 3191, 1068, 2989, + 228, 2826, 64687, 2191, 63910, 1627, 63462, 1132, +62776, 331, 62528, 47, 61964, 64881, 61770, 64349, +62126, 63713, 62610, 62754, 64275, 62364, 548, 61805, + 2815, 62057, 4839, 62842, 5997, 64211, 6797, 707, + 6180, 2427, 4817, 4201, 2435, 5344, 64757, 5685, +61887, 5385, 59016, 3746, 57505, 1789, 57020, 64726, +57855, 62152, 60189, 60236, 63043, 58831, 1140, 58884, + 4644, 59799, 7290, 61713, 8950, 64461, 8551, 1692, + 7141, 4513, 4397, 6217, 1127, 6855, 63639, 6403, +60741, 4609, 59165, 2518, 58501, 65313, 58977, 63116, +60560, 61427, 62381, 60365, 64814, 60472, 1219, 60953, + 2831, 62345, 4100, 63941, 4376, 65365, 4449, 1301, + 3649, 2121, 2718, 2832, 1843, 2902, 647, 2555, +65534, 2323, 64560, 1677, 63857, 1411, 63304, 885, +62495, 470, 62148, 173, 61544, 64954, 61539, 64373, +62085, 63343, 63020, 62463, 65111, 61944, 1552, 61593, + 3822, 62281, 5578, 63459, 6388, 65339, 6707, 1949, + 5560, 3632, 3755, 5260, 1074, 5787, 63385, 5615, +60809, 4372, 58422, 2177, 57577, 65341, 57759, 62552, +59111, 60418, 61881, 58998, 64728, 58542, 2834, 59542, + 5851, 61123, 7855, 63756, 8740, 1076, 7626, 3747, + 5769, 5924, 2770, 6603, 65049, 6484, 62357, 5079, +59837, 2968, 58867, 699, 58654, 63782, 59562, 62227, +61449, 61042, 63306, 60752, 190, 61273, 1850, 62068, + 3261, 63654, 4307, 64856, 4213, 623, 4122, 1661, + 3116, 2201, 2207, 2686, 1367, 2456, 209, 2294, +65289, 2020, 64345, 1499, 63857, 1323, 63342, 643, +62565, 310, 62310, 65204, 61716, 64313, 61905, 63555, +62571, 62407, 63723, 61867, 474, 61529, 2355, 61802, + 4551, 63082, 5961, 64663, 6428, 1343, 6381, 3253, + 4678, 4810, 2580, 5993, 65174, 5738, 61982, 5018, +59697, 2956, 57712, 529, 57522, 63493, 58258, 60907, +60179, 59444, 63267, 58608, 704, 59170, 4312, 60739, + 6816, 62857, 8174, 334, 8268, 2954, 6499, 5255, + 4279, 6509, 1076, 6400, 63660, 5632, 61344, 3521, +59486, 1322, 59251, 64520, 59549, 62508, 60926, 61437, +62890, 60699, 64631, 61106, 1182, 61884, 2332, 63122, + 3416, 64662, 3974, 119, 3636, 1336, 3424, 1938, + 2406, 2274, 1766, 2444, 1002, 2108, 74, 2193, +65180, 1773, 64246, 1539, 63693, 1243, 63045, 626, +62202, 237, 61953, 64730, 61499, 63799, 62010, 62767, +62989, 61716, 64580, 61513, 1493, 61403, 3315, 62499, + 5282, 64176, 6204, 619, 6226, 2927, 5609, 4465, + 3438, 5880, 1168, 6095, 63708, 5276, 60954, 3767, +59188, 1118, 57930, 64198, 58424, 61567, 59679, 59621, +61949, 58886, 65035, 58829, 2326, 60360, 5425, 62320, + 7103, 64960, 7724, 2365, 7084, 4424, 4947, 6172, + 2613, 6234, 65101, 5640, 62602, 4077, 60758, 1727, +59503, 65315, 59717, 63122, 60313, 61932, 61848, 61250, +63738, 61134, 65319, 62036, 1585, 62841, 2455, 64292, + 3404, 65373, 3665, 643, 3242, 1649, 2946, 1763, + 1970, 2191, 1458, 2050, 756, 1976, 65523, 2082, +65127, 1612, 64174, 1615, 63665, 1051, 62873, 477, +62101, 65355, 61911, 64037, 61655, 63191, 62449, 61975, +63671, 61406, 65515, 61485, 2398, 61901, 4012, 63747, + 5651, 65423, 6105, 2135, 5752, 4069, 4704, 5269, + 2275, 6149, 65486, 5433, 62514, 4190, 60159, 2003, +58778, 64817, 58057, 62550, 59079, 60199, 60679, 59251, +63262, 59056, 813, 59901, 3550, 62007, 6250, 64064, + 7272, 1527, 7307, 3802, 6056, 5396, 3612, 6216, + 1193, 5444, 63842, 4477, 61787, 2316, 60398, 250, +59707, 63998, 60418, 62273, 61275, 61758, 63056, 61359, +64805, 61909, 645, 62878, 2126, 63785, 2676, 65148, + 3363, 220, 3271, 1116, 2721, 1631, 2382, 1694, + 1442, 2056, 1085, 1772, 433, 2019, 65375, 1895, +65002, 1588, 64094, 1560, 63605, 706, 62751, 195, +62037, 64570, 61922, 63329, 61774, 62445, 62882, 61370, +64254, 61416, 841, 61727, 3123, 63003, 4634, 65082, + 5946, 1326, 6015, 3603, 5308, 4918, 3743, 5821, + 1139, 5800, 64168, 4390, 61347, 2752, 59392, 65533, +58455, 63133, 58382, 61020, 59926, 59364, 61936, 59306, +64786, 59658, 2311, 61456, 4896, 63664, 7023, 540, + 7340, 3295, 6769, 4798, 4872, 5846, 2235, 5600, +65235, 4412, 62588, 2992, 60953, 631, 60006, 64585, +59961, 62887, 61002, 61921, 62227, 61780, 64120, 61747, + 151, 62788, 1425, 63570, 2547, 64658, 2924, 122, + 3251, 591, 2850, 1477, 2320, 1583, 1844, 1804, + 1091, 2006, 760, 1824, 175, 2173, 65225, 1756, +64786, 1638, 63887, 1156, 63404, 185, 62453, 65008, +61983, 63448, 61893, 62509, 62140, 61575, 63496, 61101, +65140, 61693, 1897, 62494, 3940, 64630, 5259, 1046, + 6190, 3045, 5757, 4911, 4651, 5599, 2597, 5965, +65352, 4847, 62814, 3002, 60185, 824, 58777, 63490, +58295, 61551, 58902, 59705, 60931, 59145, 63240, 59710, + 783, 60846, 3682, 63270, 5978, 65507, 7427, 2621, + 7086, 4654, 5938, 5489, 3624, 5845, 837, 4674, +63957, 3331, 61549, 1343, 60443, 64806, 59908, 63462, +60361, 62051, 61743, 61830, 63087, 61817, 65080, 62338, + 857, 63487, 1986, 64190, 2845, 65349, 2954, 384, + 3115, 1003, 2496, 1666, 1973, 1592, 1513, 2054, + 783, 1967, 570, 2120, 65480, 2192, 65050, 1694, +64520, 1543, 63613, 535, 63079, 65138, 62153, 63969, +61869, 62423, 61991, 61754, 62557, 60928, 64249, 61300, + 580, 62243, 2903, 63859, 4700, 749, 5699, 2606, + 6209, 4614, 5259, 5746, 3792, 5896, 1355, 5431, +64060, 3420, 61642, 1359, 59387, 64197, 58553, 61747, +58585, 60201, 59799, 59020, 62176, 59532, 64667, 60553, + 2230, 62537, 4825, 65113, 6631, 1830, 7362, 4278, + 6355, 5283, 4763, 5650, 2138, 5066, 65031, 3430, +62780, 1913, 60898, 65282, 60297, 63777, 60256, 62650, +61131, 61848, 62622, 62134, 64060, 62281, 339, 63253, + 1372, 64138, 2268, 64824, 2863, 242, 2841, 587, + 2814, 1289, 2131, 1568, 1706, 1706, 1242, 2199, + 653, 2089, 441, 2450, 65292, 2149, 64882, 1704, +64208, 1134, 63318, 65310, 62749, 64280, 61980, 62699, +61955, 61572, 62368, 61033, 63315, 60806, 65311, 61881, + 1667, 63323, 3789, 16, 5175, 2361, 5748, 4046, + 5691, 5730, 4264, 5950, 2447, 5634, 65396, 4155, +62755, 1768, 60699, 65021, 59032, 62279, 58826, 60538, +59424, 59424, 61127, 59228, 63665, 60452, 594, 61947, + 3479, 64455, 5572, 1300, 6733, 3453, 6745, 5114, + 5260, 5330, 3407, 5159, 758, 3831, 63924, 2191, +62067, 543, 60728, 64192, 60605, 63196, 60937, 62280, +62064, 62133, 63563, 62508, 64904, 62881, 882, 63913, + 1612, 64473, 2287, 65211, 2711, 349, 2497, 712, + 2442, 1420, 1746, 1533, 1446, 2018, 1053, 2319, + 489, 2375, 315, 2584, 65105, 1980, 64675, 1478, +63919, 346, 63017, 64481, 62512, 63246, 61893, 61695, +62120, 61101, 62783, 60805, 64038, 61402, 689, 62979, + 2498, 64843, 4442, 1779, 5434, 3688, 5651, 5205, + 5150, 6060, 3375, 5605, 1333, 4627, 64223, 2406, +61767, 21, 60070, 63135, 58880, 60910, 59215, 59863, +60284, 59344, 62332, 60145, 64996, 61728, 1891, 63671, + 4555, 741, 6129, 2724, 6655, 4508, 6047, 5166, + 4144, 4880, 2062, 4128, 64969, 2448, 62849, 959, +61405, 64861, 60536, 63497, 60889, 62869, 61559, 62302, +62901, 62653, 64445, 62972, 135, 63616, 1420, 64401, + 1897, 64805, 2406, 32, 2580, 450, 2226, 950, + 2054, 1485, 1396, 1688, 1170, 2309, 826, 2428, + 351, 2591, 196, 2443, 65008, 1654, 64528, 892, +63715, 64906, 62782, 63554, 62350, 62172, 61868, 61026, +62356, 60871, 63239, 61054, 64842, 62464, 1569, 64372, + 3323, 988, 4987, 3300, 5633, 4756, 5425, 5865, + 4495, 5817, 2335, 4775, 102, 3099, 62997, 515, +60777, 63762, 59476, 61504, 58823, 60019, 59664, 59609, +61196, 59875, 63544, 61424, 741, 63263, 3171, 34, + 5525, 2390, 6507, 3977, 6479, 5088, 5324, 4906, + 3080, 4204, 865, 2920, 63814, 1169, 61997, 65328, +60895, 63807, 60489, 63018, 61222, 62608, 62169, 62525, +63651, 63079, 65206, 63452, 778, 64225, 1856, 64718, + 2121, 65153, 2511, 281, 2465, 629, 1999, 1238, + 1783, 1633, 1140, 2040, 961, 2591, 626, 2589, + 153, 2658, 65493, 2018, 64693, 1077, 64173, 65413, +63308, 63744, 62439, 62442, 62146, 61193, 61942, 60692, +62747, 61003, 63972, 61952, 331, 63956, 2621, 546, + 4238, 2824, 5579, 4660, 5793, 5670, 5117, 6061, + 3698, 5125, 1198, 3538, 64372, 1210, 61755, 64129, +59895, 62027, 59023, 60196, 58925, 59575, 60292, 59781, +62237, 60910, 64794, 62918, 2082, 64987, 4327, 1850, + 6313, 3698, 6683, 4759, 6108, 5049, 4427, 4250, + 1935, 3220, 65152, 1592, 62746, 54, 61257, 64299, +60561, 63174, 60605, 62828, 61670, 62635, 62848, 62938, +64416, 63463, 353, 63899, 1260, 64579, 2162, 64903, + 2318, 65475, 2535, 523, 2338, 930, 1841, 1618, + 1610, 1974, 1043, 2545, 850, 2868, 481, 2742, +65529, 2461, 65218, 1396, 64372, 212, 63751, 64207, +62868, 62541, 62134, 61413, 62014, 60537, 62127, 60732, +63235, 61580, 64813, 63285, 1338, 103, 3569, 2280, + 4927, 4387, 5866, 5607, 5640, 6051, 4473, 5562, + 2640, 3886, 65490, 1815, 63079, 64686, 60755, 62357, +59285, 60597, 58965, 59525, 59400, 59715, 61242, 60587, +63463, 62402, 561, 64590, 3255, 1251, 5193, 3362, + 6595, 4506, 6437, 4962, 5300, 4500, 3396, 3349, + 793, 2075, 64193, 414, 62102, 64691, 61020, 63611, +60756, 62946, 61102, 62908, 62347, 62880, 63537, 63377, +65031, 63791, 734, 64203, 1467, 64720, 2153, 64992, + 2278, 180, 2384, 681, 2182, 1291, 1714, 1980, + 1517, 2436, 1005, 3055, 766, 3051, 340, 2755, +65302, 1955, 64869, 576, 63914, 64658, 63249, 62869, +62438, 61458, 61919, 60596, 62088, 60349, 62551, 61216, +63975, 62675, 316, 64968, 2363, 1855, 4376, 3903, + 5360, 5545, 5851, 6072, 5137, 5860, 3545, 4521, + 1444, 2357, 64252, 65510, 62031, 62891, 60066, 61070, +59103, 59796, 59300, 59549, 60236, 60402, 62399, 61790, +64743, 63959, 1765, 578, 4236, 2613, 5735, 4180, + 6517, 4652, 5804, 4574, 4270, 3611, 2152, 2377, +65167, 1000, 63224, 65074, 61591, 64089, 60942, 63297, +61113, 63036, 61731, 63105, 63111, 63277, 64274, 63766, + 83, 64042, 1063, 64435, 1564, 64809, 2127, 65225, + 2122, 430, 2180, 921, 1943, 1706, 1555, 2349, + 1437, 2916, 956, 3300, 699, 2999, 250, 2391, +65118, 1142, 64601, 65106, 63580, 63452, 62905, 61738, +62199, 60747, 61891, 60280, 62326, 60764, 63104, 62170, +64871, 64131, 1328, 1142, 3289, 3290, 4979, 5043, + 5561, 5970, 5583, 5903, 4366, 4974, 2408, 2994, + 94, 629, 62986, 63726, 61009, 61552, 59513, 60314, +59106, 59689, 59832, 60279, 61246, 61596, 63648, 63414, + 528, 91, 2966, 1983, 5114, 3657, 6095, 4378, + 6282, 4314, 5064, 3695, 3180, 2492, 946, 1334, +64045, 48, 62417, 64497, 61170, 63876, 60971, 63366, +61474, 63433, 62348, 63436, 63827, 63682, 64967, 63983, + 607, 64097, 1403, 64481, 1722, 64810, 2208, 65401, + 2071, 604, 2059, 1254, 1786, 2147, 1403, 2794, + 1281, 3313, 775, 3341, 470, 2723, 65487, 1737, +64770, 125, 64160, 63998, 63191, 62291, 62536, 60935, +62084, 60440, 61976, 60552, 62768, 61731, 63824, 63590, + 301, 333, 2298, 2754, 4073, 4463, 5428, 5689, + 5589, 5885, 5176, 5113, 3549, 3594, 1357, 1191, +64496, 64471, 61986, 62210, 60297, 60721, 59264, 60066, +59297, 60202, 60480, 61390, 62259, 62990, 64815, 64979, + 1704, 1453, 4019, 2961, 5799, 4036, 6267, 4063, + 5900, 3613, 4232, 2676, 2114, 1446, 65324, 421, +63025, 64794, 61661, 64167, 60802, 63713, 60991, 63569, +61841, 63702, 62925, 63770, 64510, 64039, 53, 64136, + 1137, 64291, 1716, 64646, 1956, 65041, 2270, 228, + 2010, 958, 1904, 1742, 1590, 2672, 1244, 3156, + 1130, 3502, 599, 3046, 323, 2136, 65276, 747, +64532, 64469, 63860, 62806, 62862, 61240, 62327, 60428, +61964, 60419, 62166, 61188, 63193, 62990, 64576, 65152, + 1251, 2062, 3192, 4091, 4795, 5401, 5740, 5975, + 5494, 5403, 4570, 4040, 2533, 1881, 104, 64938, +63173, 62750, 60863, 60924, 59565, 60122, 59013, 60134, +59659, 61031, 61318, 62739, 63450, 64555, 624, 1142, + 2971, 2761, 5097, 3856, 6304, 4211, 6200, 3639, + 5319, 2859, 3226, 1624, 1013, 504, 64206, 65049, +62232, 64188, 61208, 63887, 60796, 63652, 61361, 63785, +62412, 63910, 63644, 64013, 65150, 64237, 578, 64201, + 1449, 64474, 1826, 64840, 1985, 65370, 2179, 690, + 1862, 1386, 1731, 2375, 1432, 3111, 1148, 3469, + 974, 3405, 425, 2482, 42, 1263, 64906, 65036, +64060, 63178, 63342, 61638, 62383, 60399, 62045, 60332, +61940, 60844, 62522, 62449, 63880, 64670, 54, 1446, + 2360, 3770, 4134, 5195, 5421, 5965, 5879, 5711, + 5166, 4411, 3759, 2487, 1412, 65461, 64413, 63183, +62063, 61256, 60097, 60114, 59255, 60034, 59209, 60653, +60367, 62268, 62352, 64141, 64672, 593, 1763, 2510, + 3972, 3617, 5677, 4224, 6340, 3817, 5717, 2995, + 4377, 1942, 2143, 687, 65408, 65288, 63299, 64416, +61664, 63953, 61095, 63844, 61037, 63754, 61907, 63995, +63017, 63995, 64323, 64130, 90, 64193, 886, 64180, + 1525, 64648, 1785, 65035, 1956, 353, 2031, 1193, + 1770, 2076, 1685, 3078, 1436, 3529, 1216, 3644, + 947, 2981, 349, 1696, 65467, 140, 64632, 63622, +63793, 61955, 62968, 60568, 62165, 60067, 61976, 60535, +62106, 61751, 62974, 63983, 64557, 821, 962, 3182, + 3132, 5021, 4673, 5848, 5571, 6021, 5578, 4898, + 4452, 3084, 2686, 730, 164, 63715, 63281, 61845, +61164, 60339, 59692, 60039, 59349, 60501, 59852, 61762, +61446, 63696, 63606, 65510, 397, 1979, 2829, 3324, + 4671, 3984, 5849, 3967, 5869, 3116, 4823, 2254, + 3161, 1021, 902, 65533, 64408, 64742, 62592, 64064, +61549, 63979, 61383, 63834, 61734, 63948, 62775, 64086, +63889, 64013, 65066, 64173, 578, 64072, 1059, 64399, + 1491, 64922, 1606, 10, 1691, 1029, 1680, 1819, + 1455, 2866, 1465, 3531, 1282, 3599, 1125, 3294, + 810, 2033, 236, 564, 65231, 64194, 64342, 62298, +63459, 60980, 62652, 60070, 61995, 60394, 62062, 61380, +62448, 63307, 63665, 285, 65434, 2509, 1927, 4651, + 3926, 5698, 5092, 5995, 5586, 5286, 5091, 3469, + 3611, 1344, 1577, 64292, 64562, 62186, 62355, 60701, +60567, 59940, 59619, 60404, 59762, 61357, 60673, 63173, +62603, 65118, 64794, 1448, 1506, 3129, 3665, 3818, + 5049, 4067, 5727, 3437, 5171, 2455, 3797, 1447, + 1939, 179, 65276, 64975, 63498, 64220, 62037, 63896, +61462, 63905, 61643, 63803, 62302, 64105, 63485, 64042, +64595, 64131, 142, 64217, 975, 64300, 1260, 64923, + 1582, 65426, 1548, 781, 1598, 1684, 1503, 2525, + 1318, 3375, 1333, 3520, 1154, 3317, 1017, 2379, + 638, 828, 61, 64741, 64994, 62692, 64055, 61327, +63218, 60287, 62451, 60211, 61991, 61150, 62262, 62721, +62887, 65184, 64362, 1985, 705, 4069, 2687, 5580, + 4442, 5926, 5229, 5609, 5378, 4045, 4449, 1919, + 2681, 65087, 489, 62640, 63454, 61093, 61466, 60030, +60025, 60148, 59525, 61101, 60103, 62559, 61408, 64679, +63598, 957, 331, 2778, 2540, 3829, 4481, 4060, + 5495, 3766, 5717, 2728, 4691, 1700, 3005, 487, + 1009, 64973, 64377, 64352, 62830, 63771, 61676, 63801, +61475, 63774, 61976, 63918, 62808, 64193, 64100, 64087, +65113, 64348, 573, 64370, 1168, 64768, 1316, 65391, + 1562, 425, 1456, 1452, 1522, 2176, 1392, 3037, + 1237, 3482, 1320, 3256, 1053, 2717, 923, 1260, + 383, 65258, 65269, 63392, 64550, 61689, 63525, 60704, +62746, 60210, 62075, 60903, 61909, 62290, 62490, 64408, +63447, 1416, 65300, 3440, 1747, 5219, 3671, 5876, + 5070, 5673, 5469, 4580, 5168, 2445, 3757, 212, + 1702, 63262, 64880, 61363, 62383, 60313, 60734, 59936, +59622, 60832, 59650, 62128, 60672, 64061, 62275, 581, +64717, 2247, 1324, 3726, 3480, 4029, 5083, 3880, + 5644, 3010, 5415, 1806, 3953, 767, 2116, 65091, + 58, 64400, 63559, 63911, 62290, 63701, 61417, 63943, +61580, 63923, 62236, 64263, 63228, 64328, 64517, 64347, +65445, 64571, 842, 64658, 1258, 65301, 1408, 305, + 1672, 1087, 1567, 2031, 1669, 2649, 1513, 3363, + 1401, 3275, 1415, 2740, 1054, 1693, 774, 65508, + 118, 63923, 64846, 62048, 64079, 60870, 62973, 60368, +62349, 60599, 61851, 62020, 62015, 63823, 62908, 820, +64130, 3078, 712, 4766, 2658, 5864, 4372, 5681, + 5453, 4907, 5380, 3000, 4718, 660, 2904, 63906, + 623, 61684, 63769, 60555, 61410, 59977, 60108, 60478, +59364, 61879, 59860, 63525, 61229, 176, 63157, 1922, + 160, 3414, 2250, 4189, 4303, 3938, 5569, 3374, + 5747, 2107, 5108, 999, 3326, 65422, 1399, 64431, +64873, 63997, 63001, 63654, 61989, 63784, 61367, 63986, +61799, 64061, 62566, 64388, 63592, 64306, 64861, 64500, + 96, 64668, 972, 65030, 1209, 220, 1420, 803, + 1681, 1738, 1613, 2518, 1778, 3063, 1602, 3447, + 1533, 2850, 1482, 2138, 970, 523, 593, 64396, +65217, 62695, 64333, 61090, 63446, 60512, 62370, 60416, +61940, 61463, 61669, 63281, 62300, 65470, 63499, 2436, +65108, 4259, 1864, 5544, 3696, 5899, 5211, 5096, + 5755, 3725, 5249, 1350, 4081, 64643, 1881, 62452, +65014, 60837, 62636, 60280, 60582, 60282, 59736, 61485, +59450, 63049, 60443, 64930, 62131, 1409, 64248, 2849, + 1220, 3874, 3105, 3976, 4887, 3386, 5602, 2537, + 5298, 1214, 4303, 276, 2258, 64789, 433, 64200, +64027, 63965, 62493, 63835, 61845, 64100, 61478, 64160, +62194, 64327, 63006, 64427, 63992, 64329, 65153, 64589, + 246, 64799, 1009, 65397, 1217, 560, 1501, 1273, + 1884, 2274, 1852, 2804, 2054, 3308, 1851, 3097, + 1705, 2330, 1513, 1174, 750, 64956, 193, 63339, +64615, 61760, 63685, 60711, 62818, 60622, 61872, 61107, +61730, 62752, 61821, 64769, 62824, 1504, 64338, 3637, + 628, 4929, 2928, 5669, 4533, 5240, 5587, 4006, + 5664, 2173, 4619, 65281, 3118, 63288, 611, 61448, +63773, 60558, 61536, 60506, 59943, 61112, 59555, 62700, +59758, 64308, 61186, 725, 63147, 2364, 65403, 3412, + 2267, 3903, 3970, 3472, 5415, 2726, 5676, 1621, + 4983, 460, 3619, 65149, 1469, 64309, 65195, 63988, +63385, 63830, 62120, 63881, 61706, 64166, 61646, 64172, +62524, 64441, 63397, 64406, 64403, 64550, 65500, 64919, + 481, 65246, 1194, 530, 1314, 1108, 1669, 1984, + 1921, 2653, 1880, 2999, 2052, 3094, 1759, 2440, + 1597, 1389, 1218, 65490, 392, 63774, 65257, 62374, +64077, 61116, 63158, 60796, 62356, 61161, 61586, 62330, +61732, 64356, 62125, 818, 63458, 3041, 65207, 4536, + 1640, 5333, 3879, 5331, 5143, 4226, 5840, 2609, + 5434, 388, 3979, 63726, 2162, 61974, 64988, 60738, +62718, 60518, 60693, 60971, 59536, 62194, 59604, 63965, +60264, 172, 62063, 2034, 64189, 3182, 912, 3801, + 3137, 3713, 4589, 2917, 5592, 1974, 5390, 750, + 4323, 65306, 2679, 64571, 505, 63916, 64346, 63901, +62725, 63811, 61847, 64113, 61692, 64282, 61941, 64375, +63000, 64566, 63895, 64543, 64931, 64874, 314, 65258, + 747, 232, 1293, 1056, 1416, 1623, 1720, 2450, + 1965, 2791, 1934, 2899, 2089, 2584, 1820, 1500, + 1560, 297, 1087, 64171, 132, 62665, 64898, 61530, +63612, 60795, 62732, 61147, 61960, 62031, 61434, 63801, +61852, 409, 62523, 2376, 64169, 4245, 511, 5139, + 2561, 5319, 4538, 4575, 5479, 2939, 5769, 1044, + 4925, 64249, 3188, 62413, 1084, 61092, 63931, 60518, +61780, 60942, 60056, 61838, 59343, 63508, 59813, 65300, +60859, 1506, 62973, 3039, 65180, 3649, 1928, 3864, + 3975, 3238, 5165, 2238, 5764, 1166, 5135, 65471, + 3732, 64729, 1898, 64021, 65260, 63728, 63634, 63769, +62255, 63859, 61609, 64202, 61724, 64324, 62168, 64474, +63342, 64654, 64266, 64753, 65293, 65300, 570, 131, + 941, 869, 1428, 1577, 1536, 2157, 1819, 2766, + 2016, 2825, 1931, 2647, 2046, 1875, 1693, 591, + 1386, 64752, 766, 63104, 65321, 61913, 64410, 61086, +63162, 60987, 62317, 61824, 61631, 63179, 61392, 65308, +62041, 1812, 63075, 3635, 64964, 5005, 1523, 5281, + 3528, 4927, 5259, 3511, 5811, 1587, 5697, 65015, + 4357, 62828, 2346, 61403, 65500, 60499, 62887, 60589, +60920, 61469, 59588, 62831, 59360, 64745, 60235, 950, +61642, 2646, 63935, 3661, 621, 3864, 2756, 3630, + 4510, 2610, 5327, 1552, 5493, 376, 4474, 64821, + 2868, 64241, 999, 63675, 64531, 63690, 63197, 63781, +62067, 63988, 61799, 64366, 62022, 64394, 62678, 64644, +63732, 64791, 64602, 65118, 65456, 174, 586, 611, + 892, 1461, 1354, 2038, 1567, 2576, 1941, 2911, + 2165, 2607, 2159, 2115, 2206, 907, 1761, 65026, + 1317, 63552, 454, 62049, 64882, 61307, 63839, 60935, +62628, 61541, 61902, 62835, 61473, 64655, 61574, 1356, +62576, 3110, 63872, 4633, 387, 5238, 2421, 4923, + 4214, 3955, 5502, 2033, 5598, 39, 5033, 63467, + 3371, 61792, 1195, 60893, 64365, 60626, 61946, 61310, +60396, 62547, 59514, 64147, 59802, 483, 60984, 2008, +62705, 3295, 65021, 3735, 1595, 3579, 3508, 2964, + 4915, 1831, 5358, 870, 5085, 65288, 3774, 64524, + 2042, 64013, 183, 63699, 63938, 63797, 62786, 63882, +62012, 64098, 61934, 64336, 62412, 64383, 63152, 64711, +64229, 64929, 64968, 65527, 222, 578, 673, 1222, + 935, 2008, 1319, 2424, 1492, 2828, 1867, 2742, + 2006, 2135, 2009, 1312, 1968, 65339, 1484, 64015, + 965, 62548, 55, 61539, 64454, 61249, 63443, 61442, +62336, 62584, 61781, 64182, 61556, 623, 61975, 2613, +63189, 3990, 64734, 4973, 1318, 4884, 3281, 4108, + 4835, 2677, 5693, 580, 5445, 64300, 4394, 62388, + 2440, 61305, 61, 60849, 63291, 61100, 61085, 62261, +59902, 63570, 59506, 65359, 60251, 1440, 61794, 2716, +63731, 3547, 578, 3470, 2563, 3097, 4300, 2168, + 5254, 1079, 5194, 206, 4527, 64717, 2814, 64268, + 1077, 63846, 64700, 63767, 63192, 63969, 62348, 64010, +61875, 64366, 62117, 64429, 62762, 64604, 63633, 64961, +64687, 65269, 65361, 438, 472, 942, 868, 1632, + 1127, 2269, 1563, 2514, 1740, 2750, 2112, 2238, + 2172, 1533, 2123, 342, 1867, 64396, 1255, 63124, + 573, 61880, 65053, 61409, 63896, 61497, 62829, 62204, +61924, 63822, 61597, 65490, 61643, 2019, 62457, 3551, +63890, 4572, 152, 4948, 2328, 4247, 4056, 3095, + 5307, 1193, 5643, 64741, 4975, 63033, 3505, 61535, + 1286, 61065, 64446, 61038, 62217, 61945, 60367, 63340, +59608, 64837, 59652, 1105, 60861, 2404, 62643, 3358, +64745, 3603, 1547, 3116, 3392, 2489, 4922, 1301, + 5449, 379, 5072, 64991, 3969, 64227, 2129, 63990, + 293, 63682, 64012, 63891, 62733, 64043, 62083, 64237, +61873, 64577, 62325, 64580, 63070, 64965, 64054, 65304, +65041, 240, 131, 938, 722, 1351, 1009, 2094, + 1352, 2367, 1701, 2530, 1855, 2370, 2127, 1543, + 2061, 685, 1946, 64746, 1537, 63460, 852, 62302, + 106, 61521, 64491, 61599, 63384, 62055, 62361, 63364, +61666, 65119, 61551, 1354, 61897, 3175, 63020, 4177, +64676, 4767, 1163, 4405, 3282, 3290, 4828, 1775, + 5759, 65236, 5664, 63553, 4598, 62051, 2783, 61182, + 335, 61164, 63509, 61638, 61318, 63006, 59826, 64443, +59406, 561, 59878, 2147, 61429, 3048, 63373, 3608, + 128, 3270, 2358, 2580, 4120, 1698, 5335, 486, + 5506, 65245, 4769, 64334, 3369, 63929, 1391, 63801, +65085, 63711, 63359, 64087, 62290, 64190, 61795, 64566, +61785, 64739, 62411, 64891, 63221, 65387, 64330, 159, +65244, 827, 372, 1294, 966, 1754, 1324, 2280, + 1759, 2286, 2070, 2291, 2200, 1676, 2366, 760, + 2185, 65221, 1897, 63745, 1310, 62727, 453, 61806, +65111, 61637, 63836, 62115, 62794, 63016, 61835, 64726, +61384, 868, 61551, 2590, 62241, 3930, 63682, 4435, +65522, 4491, 2120, 3501, 4113, 2144, 5354, 330, + 5865, 63937, 5325, 62589, 3883, 61429, 1790, 61251, +64775, 61595, 62477, 62588, 60544, 64149, 59481, 65, +59488, 1720, 60375, 2799, 62201, 3374, 64322, 3420, + 1104, 2675, 3162, 1921, 4703, 801, 5558, 65406, + 5340, 64690, 4276, 63959, 2634, 63874, 680, 63716, +64463, 63936, 62981, 64178, 62129, 64333, 61858, 64724, +62035, 64821, 62747, 65246, 63615, 165, 64595, 639, +65448, 1323, 467, 1645, 1004, 2112, 1362, 2293, + 1830, 2137, 2147, 1875, 2291, 853, 2384, 65463, + 2117, 64166, 1745, 62955, 982, 62221, 78, 61677, +64537, 62139, 63316, 62888, 62280, 64287, 61561, 535, +61350, 2041, 61876, 3592, 62855, 4244, 64598, 4333, + 1017, 3759, 3101, 2359, 4831, 876, 5622, 64470, + 5712, 62963, 4680, 61887, 2928, 61298, 635, 61599, +63680, 62266, 61648, 63620, 60048, 65170, 59507, 1071, +59898, 2479, 61193, 3083, 63175, 3397, 65293, 2940, + 1926, 2106, 3733, 1250, 4953, 145, 5372, 64966, + 4756, 64239, 3490, 63828, 1757, 63821, 65429, 63786, +63844, 64094, 62646, 64258, 62056, 64533, 61996, 64861, +62339, 65093, 63144, 126, 64021, 525, 64993, 1137, + 157, 1614, 693, 1901, 1203, 2232, 1606, 2120, + 2055, 1887, 2316, 1218, 2394, 156, 2392, 64687, + 2016, 63383, 1473, 62541, 619, 61987, 65137, 62024, +64012, 62775, 62770, 63825, 61924, 65511, 61346, 1555, +61488, 2984, 62220, 3980, 63512, 4142, 65409, 3821, + 1918, 2737, 3847, 1246, 5254, 65165, 5699, 63472, + 5368, 62385, 3981, 61658, 1963, 61617, 65113, 62255, +62719, 63228, 60877, 64740, 59677, 574, 59540, 1909, +60365, 2813, 61939, 3100, 64134, 2992, 724, 2255, + 2826, 1460, 4433, 530, 5301, 65211, 5345, 64618, + 4343, 64036, 2855, 63934, 1013, 63889, 64719, 63976, +63314, 64253, 62287, 64368, 61969, 64742, 62059, 65031, +62576, 65478, 63469, 541, 64351, 1005, 65264, 1575, + 367, 1856, 830, 2035, 1363, 2083, 1736, 1696, + 2176, 1238, 2355, 228, 2383, 64789, 2278, 63724, + 1764, 62722, 1137, 62297, 169, 62150, 64615, 62734, +63487, 63734, 62289, 65107, 61661, 1234, 61348, 2536, +61782, 3616, 62839, 3950, 64331, 3691, 865, 2895, + 2851, 1497, 4589, 31, 5622, 64016, 5649, 62769, + 4915, 62090, 3150, 61767, 959, 62265, 64096, 63097, +61850, 64368, 60343, 258, 59509, 1487, 59840, 2611, +60976, 3008, 62783, 2999, 65007, 2496, 1538, 1596, + 3482, 787, 4803, 65367, 5287, 64699, 4975, 64183, + 3716, 63840, 2109, 63885, 272, 63890, 64070, 64133, +62900, 64363, 62070, 64581, 61926, 64983, 62204, 65328, +62840, 400, 63809, 914, 64665, 1401, 29, 1823, + 636, 1951, 1124, 2053, 1700, 1795, 2068, 1305, + 2489, 572, 2545, 65029, 2456, 64100, 2172, 63060, + 1492, 62461, 733, 62298, 65205, 62579, 63999, 63532, +62929, 64772, 61840, 763, 61409, 2221, 61352, 3235, +62060, 3892, 63394, 3679, 65074, 3011, 1676, 1796, + 3605, 286, 5062, 64426, 5789, 63024, 5358, 62275, + 4319, 61915, 2258, 62150, 65522, 62972, 63148, 64002, +61099, 65420, 59931, 1122, 59509, 2217, 60171, 2858, +61640, 2856, 63599, 2547, 387, 1771, 2368, 918, + 4151, 87, 5227, 64871, 5355, 64391, 4733, 64014, + 3199, 63935, 1507, 64024, 65217, 64128, 63615, 64433, +62587, 64546, 61904, 64890, 61975, 65272, 62329, 202, +63057, 817, 63990, 1237, 64837, 1725, 139, 1946, + 707, 1981, 1232, 1890, 1880, 1393, 2293, 795, + 2656, 65354, 2667, 64305, 2444, 63384, 2071, 62595, + 1188, 62375, 318, 62504, 64597, 63254, 63387, 64464, +62340, 325, 61395, 1837, 61210, 2959, 61494, 3652, +62552, 3747, 64156, 3084, 479, 2083, 2692, 612, + 4438, 64743, 5617, 63424, 5858, 62431, 5063, 62064, + 3620, 62130, 1344, 62810, 64506, 63842, 62240, 65049, +60452, 892, 59668, 1942, 59615, 2765, 60679, 2918, +62361, 2660, 64486, 2072, 1202, 1156, 3047, 326, + 4583, 65070, 5287, 64456, 5105, 64118, 4155, 63859, + 2507, 63972, 802, 64055, 64607, 64261, 63222, 64498, +62340, 64689, 61891, 65134, 62072, 28, 62545, 605, +63291, 1185, 64279, 1556, 65069, 1977, 405, 2001, + 978, 1953, 1635, 1594, 2279, 903, 2657, 87, + 2921, 64522, 2776, 63582, 2429, 62796, 1834, 62353, + 823, 62541, 65323, 63032, 63999, 64191, 62820, 26, +61842, 1464, 61156, 2782, 61235, 3513, 61857, 3767, +63175, 3322, 64948, 2305, 1340, 1037, 3465, 65015, + 4950, 63732, 5699, 62640, 5553, 62087, 4380, 62139, + 2709, 62544, 305, 63620, 63567, 64740, 61515, 575, +60110, 1735, 59705, 2551, 60053, 2937, 61386, 2741, +63279, 2204, 65388, 1390, 1955, 476, 3631, 65227, + 4867, 64548, 5240, 64117, 4683, 63927, 3534, 63904, + 1807, 64139, 156, 64260, 64132, 64621, 62905, 64796, +62306, 65131, 61990, 57, 62324, 483, 62823, 1039, +63579, 1388, 64513, 1689, 65205, 1857, 461, 1782, + 1047, 1543, 1749, 1043, 2394, 243, 2737, 64936, + 2954, 63895, 2776, 63184, 2293, 62625, 1593, 62611, + 460, 63045, 64874, 63880, 63494, 65196, 62353, 1001, +61505, 2298, 61063, 3186, 61449, 3504, 62334, 3280, +63895, 2442, 285, 1279, 2249, 65410, 4196, 64081, + 5311, 63039, 5708, 62356, 5132, 62250, 3652, 62609, + 1731, 63443, 64901, 64603, 62740, 244, 60995, 1471, +59940, 2338, 59930, 2750, 60604, 2711, 62153, 2151, +64105, 1454, 604, 551, 2592, 65291, 3975, 64675, + 4938, 64187, 4932, 64050, 4156, 64017, 2877, 64183, + 1123, 64413, 65151, 64598, 63744, 64890, 62741, 65071, +62272, 65475, 62118, 385, 62551, 826, 63117, 1256, +63876, 1488, 64765, 1656, 65468, 1661, 715, 1384, + 1359, 1020, 2028, 299, 2658, 65087, 2871, 64206, + 2962, 63421, 2578, 62973, 1982, 62801, 1128, 63188, +65453, 63854, 64293, 64984, 62969, 767, 61963, 1938, +61343, 2907, 61158, 3265, 61827, 3155, 62983, 2492, +64668, 1357, 1144, 146, 3005, 64351, 4694, 63313, + 5447, 62647, 5456, 62386, 4533, 62725, 2817, 63389, + 793, 64452, 63987, 80, 62013, 1184, 60551, 2160, +59897, 2632, 60204, 2670, 61184, 2270, 62917, 1508, +64970, 720, 1405, 65363, 3237, 64743, 4429, 64216, + 5058, 63982, 4765, 64006, 3682, 64113, 2271, 64415, + 510, 64650, 64600, 64920, 63330, 65237, 62484, 65495, +62178, 448, 62180, 788, 62718, 1189, 63285, 1419, +64126, 1510, 64949, 1533, 142, 1302, 874, 972, + 1598, 406, 2256, 65196, 2848, 64460, 2922, 63659, + 2952, 63173, 2404, 62978, 1710, 63158, 719, 63833, +64960, 64745, 63742, 490, 62445, 1698, 61564, 2633, +61109, 3172, 61238, 3085, 62190, 2563, 63590, 1534, +65483, 280, 2036, 64566, 3846, 63418, 5238, 62741, + 5671, 62405, 5255, 62658, 4025, 63379, 2041, 64357, +65448, 50, 63114, 1137, 61368, 2122, 60188, 2692, +59872, 2642, 60531, 2296, 61734, 1470, 63681, 642, + 131, 65262, 2068, 64546, 3711, 64123, 4718, 63892, + 5019, 63992, 4457, 64208, 3221, 64537, 1765, 64921, + 30, 65143, 64221, 65417, 63039, 64, 62347, 368, +62144, 670, 62217, 904, 62817, 1141, 63438, 1246, +64307, 1262, 65186, 1218, 350, 873, 1239, 543, + 1972, 65368, 2657, 64707, 3077, 63969, 3098, 63387, + 2901, 63190, 2261, 63265, 1362, 63796, 256, 64687, +64418, 245, 63187, 1531, 61985, 2412, 61247, 3046, +61076, 3067, 61465, 2566, 62692, 1661, 64254, 391, + 713, 64749, 2794, 63600, 4425, 62824, 5535, 62521, + 5607, 62618, 4875, 63310, 3381, 64214, 1195, 65384, +64542, 973, 62327, 1954, 60757, 2608, 59872, 2702, +59892, 2359, 60812, 1682, 62340, 745, 64363, 65460, + 887, 64640, 2744, 64168, 4269, 63928, 4977, 63898, + 4946, 64203, 4108, 64447, 2720, 64862, 1145, 65178, +65004, 65379, 63699, 155, 62673, 342, 62131, 740, +62071, 963, 62320, 1138, 63003, 1274, 63747, 1210, +64665, 1147, 14, 862, 781, 444, 1669, 65499, + 2408, 64745, 2958, 64163, 3225, 63541, 3076, 63261, + 2680, 63336, 1857, 63687, 843, 64536, 65143, 10, +63761, 1186, 62590, 2231, 61553, 2829, 61113, 3091, +61221, 2663, 61986, 1874, 63486, 737, 65217, 64968, + 1755, 63884, 3634, 62909, 5004, 62531, 5667, 62489, + 5297, 63023, 4239, 63942, 2408, 65067, 204, 733, +63576, 1812, 61576, 2540, 60345, 2862, 59899, 2491, +60270, 1922, 61517, 915, 63183, 13, 65296, 64705, + 1706, 64079, 3362, 63874, 4626, 63827, 4936, 64119, + 4689, 64513, 3547, 64864, 2086, 65300, 549, 65479, +64505, 172, 63353, 387, 62448, 577, 62013, 844, +62118, 946, 62393, 1045, 63154, 1105, 63924, 981, +64898, 928, 274, 520, 1089, 156, 2089, 65029, + 2751, 64343, 3261, 63793, 3335, 63289, 2992, 63327, + 2467, 63541, 1422, 64273, 271, 65307, 64485, 925, +63075, 2082, 62046, 2814, 61159, 3112, 61005, 2875, +61409, 2037, 62517, 971, 64176, 65159, 456, 64009, + 2568, 63098, 4247, 62535, 5321, 62593, 5631, 62982, + 4908, 63912, 3610, 65010, 1589, 599, 64885, 1729, +62813, 2414, 61026, 2769, 60128, 2534, 59942, 1898, +60643, 1079, 62107, 71, 63939, 64826, 538, 64183, + 2374, 63866, 3961, 63923, 4899, 64057, 4966, 64511, + 4372, 64818, 3066, 65202, 1552, 65511, 65535, 48, +64033, 359, 63024, 493, 62175, 791, 62010, 949, +62131, 1019, 62570, 1140, 63395, 1018, 64173, 917, +65171, 598, 528, 111, 1425, 65166, 2389, 64434, + 2972, 63901, 3388, 63478, 3365, 63326, 2907, 63671, + 2246, 64172, 1038, 65168, 65388, 706, 63917, 1790, +62571, 2636, 61602, 2917, 60904, 2827, 61070, 2154, +61734, 1117, 63136, 65503, 64978, 64222, 1376, 63352, + 3479, 62716, 4870, 62576, 5662, 62936, 5537, 63586, + 4457, 64740, 2878, 249, 626, 1360, 63998, 2224, +62003, 2610, 60543, 2656, 59979, 2033, 60132, 1285, +61172, 328, 62795, 64930, 64703, 64314, 1216, 63794, + 2901, 63824, 4272, 63992, 4911, 64372, 4682, 64885, + 3930, 65182, 2475, 102, 1046, 213, 65008, 395, +63699, 604, 62754, 681, 62106, 916, 62030, 873, +62246, 923, 62800, 944, 63639, 750, 64489, 663, +65529, 191, 890, 65346, 1899, 64756, 2792, 64113, + 3253, 63734, 3580, 63422, 3310, 63621, 2758, 64091, + 1855, 64808, 522, 445, 64796, 1422, 63294, 2407, +62109, 2862, 61234, 2826, 60844, 2413, 61261, 1345, +62195, 230, 63787, 64481, 156, 63425, 2131, 62821, + 4055, 62450, 5159, 62841, 5640, 63455, 5151, 64546, + 3853, 250, 2060, 1257, 65277, 2314, 63204, 2698, +61333, 2732, 60189, 2233, 59929, 1293, 60349, 437, +61670, 64896, 63436, 64238, 65450, 63771, 1926, 63668, + 3527, 63978, 4759, 64326, 5086, 64895, 4636, 65334, + 3604, 93, 2040, 409, 558, 385, 64474, 635, +63256, 666, 62395, 771, 61915, 884, 62026, 787, +62342, 903, 63024, 748, 63940, 571, 64796, 344, + 357, 65312, 1247, 64957, 2300, 64210, 3081, 63792, + 3445, 63519, 3601, 63498, 3143, 64024, 2499, 64666, + 1430, 190, 36, 1345, 64223, 2217, 62733, 2903, +61665, 2890, 60933, 2519, 60767, 1628, 61484, 361, +62658, 64720, 64483, 63474, 943, 62812, 2978, 62438, + 4712, 62601, 5571, 63330, 5681, 64238, 4814, 16, + 3267, 1112, 1231, 2101, 64415, 2804, 62431, 2753, +60797, 2446, 60017, 1521, 60057, 566, 60767, 65138, +62335, 64214, 64183, 63839, 671, 63567, 2528, 63843, + 3924, 64263, 4872, 64705, 4842, 65339, 4167, 69, + 2973, 398, 1401, 524, 65527, 537, 64029, 770, +62977, 689, 62286, 832, 61960, 807, 62192, 748, +62519, 822, 63282, 536, 64173, 408, 65088, 65482, + 620, 64996, 1598, 64482, 2622, 63834, 3285, 63548, + 3521, 63442, 3462, 63742, 2855, 64483, 2057, 65341, + 790, 1083, 64962, 2054, 63570, 2826, 62238, 3082, +61355, 2724, 60900, 2019, 61089, 767, 62086, 64987, +63470, 63809, 65420, 62786, 1859, 62467, 3718, 62431, + 5092, 63079, 5511, 64054, 5247, 65231, 4045, 1049, + 2308, 2013, 230, 2828, 63575, 2972, 61877, 2588, +60619, 1860, 60229, 681, 60585, 65272, 61546, 64284, +63247, 63709, 65050, 63563, 1398, 63627, 3059, 64174, + 4172, 64684, 4765, 65240, 4415, 180, 3584, 348, + 2283, 579, 813, 541, 65002, 638, 63666, 678, +62818, 638, 62256, 759, 62115, 673, 62395, 729, +62795, 636, 63614, 382, 64497, 159, 65426, 65124, + 990, 64618, 1949, 64055, 2933, 63594, 3447, 63554, + 3565, 63675, 3346, 64353, 2584, 65248, 1639, 810, + 264, 1913, 64374, 2626, 63039, 3040, 61821, 2809, +61203, 2072, 60969, 1053, 61507, 65159, 62715, 64074, +64288, 62980, 738, 62490, 2617, 62484, 4260, 62908, + 5261, 63879, 5310, 64963, 4709, 702, 3241, 1816, + 1397, 2573, 64849, 2970, 62823, 2644, 61367, 2031, +60448, 1020, 60382, 65448, 61003, 64561, 62176, 63769, +64004, 63541, 197, 63562, 2052, 63898, 3473, 64540, + 4362, 65014, 4654, 93, 4078, 371, 3104, 586, + 1780, 740, 331, 716, 64587, 809, 63370, 743, +62603, 722, 62210, 742, 62141, 594, 62541, 608, +63038, 371, 63931, 123, 64891, 65295, 339, 64727, + 1512, 64301, 2428, 63781, 3287, 63594, 3600, 63718, + 3498, 64096, 3059, 65005, 2073, 422, 984, 1545, +65060, 2419, 63638, 2874, 62422, 2919, 61405, 2296, +61070, 1366, 61138, 80, 61993, 64311, 63422, 63288, +65137, 62509, 1600, 62398, 3364, 62706, 4721, 63503, + 5372, 64702, 5038, 351, 4143, 1615, 2422, 2487, + 514, 2945, 63992, 2900, 62155, 2163, 60978, 1318, +60400, 121, 60636, 64693, 61538, 63900, 62942, 63471, +64815, 63563, 1037, 63832, 2725, 64451, 3952, 65050, + 4524, 2, 4499, 449, 3637, 526, 2514, 662, + 1077, 615, 65180, 625, 64003, 649, 62880, 609, +62356, 688, 62118, 714, 62267, 674, 62755, 628, +63391, 286, 64339, 65512, 65345, 64945, 819, 64340, + 1981, 63870, 2762, 63453, 3493, 63556, 3562, 63884, + 3325, 64651, 2712, 201, 1624, 1276, 458, 2344, +64481, 2883, 63134, 3013, 62004, 2596, 61185, 1608, +61070, 463, 61417, 64534, 62546, 63449, 64166, 62637, + 437, 62313, 2464, 62618, 4020, 63252, 5122, 64412, + 5342, 110, 4684, 1296, 3435, 2371, 1576, 2840, +65079, 2978, 63171, 2405, 61482, 1526, 60691, 497, +60380, 64928, 60974, 64154, 62077, 63549, 63674, 63446, + 37, 63681, 1730, 64127, 3272, 64782, 4241, 65305, + 4533, 248, 4212, 572, 3168, 644, 1916, 774, + 504, 695, 64678, 749, 63567, 677, 62642, 620, +62245, 635, 62207, 571, 62442, 531, 63035, 337, +63755, 65511, 64773, 65178, 266, 64578, 1319, 64121, + 2432, 63701, 3126, 63579, 3665, 63884, 3515, 64398, + 3038, 65358, 2263, 883, 1017, 1887, 65294, 2674, +63753, 2858, 62509, 2725, 61581, 1934, 61037, 831, +61203, 65082, 61896, 63797, 63288, 62973, 65063, 62445, + 1348, 62502, 3288, 63065, 4577, 64030, 5316, 65327, + 5114, 993, 4113, 2110, 2626, 2849, 635, 3001, +64181, 2669, 62408, 1742, 61058, 711, 60604, 65142, +60624, 64193, 61526, 63595, 62830, 63332, 64553, 63609, + 862, 64094, 2422, 64709, 3762, 65387, 4423, 258, + 4394, 672, 3780, 696, 2571, 673, 1282, 681, +65408, 563, 64104, 583, 63134, 489, 62366, 500, +62203, 601, 62266, 537, 62705, 476, 63403, 159, +64208, 65335, 65281, 64841, 772, 64233, 1846, 63826, + 2814, 63589, 3338, 63765, 3629, 64295, 3309, 65073, + 2660, 683, 1702, 1696, 401, 2534, 64622, 2870, +63196, 2701, 62075, 2110, 61402, 1010, 61121, 65272, +61633, 64023, 62532, 63017, 64122, 62558, 386, 62442, + 2193, 62968, 3863, 63866, 4798, 65065, 5169, 789, + 4589, 1836, 3352, 2697, 1687, 2955, 65232, 2708, +63401, 1990, 61840, 888, 60832, 65428, 60675, 64415, +61032, 63723, 62147, 63437, 63590, 63506, 65313, 63993, + 1543, 64535, 2942, 65187, 4040, 196, 4410, 522, + 4158, 731, 3369, 676, 2078, 708, 793, 634, +64926, 535, 63763, 553, 62855, 470, 62246, 547, +62206, 516, 62372, 382, 62889, 215, 63653, 65395, +64525, 64993, 149, 64484, 1182, 64024, 2283, 63840, + 3102, 63834, 3521, 64276, 3583, 64914, 3050, 353, + 2247, 1377, 1159, 2139, 65289, 2639, 63989, 2611, +62612, 2122, 61740, 1271, 61264, 4, 61291, 64406, +62018, 63335, 63180, 62727, 64868, 62579, 1124, 62882, + 2861, 63709, 4285, 64763, 4962, 465, 4975, 1537, + 4143, 2394, 2691, 2863, 986, 2696, 64525, 2145, +62844, 1172, 61478, 100, 60777, 64711, 60858, 63880, +61431, 63550, 62691, 63498, 64232, 63891, 417, 64479, + 2082, 65081, 3347, 153, 4200, 536, 4335, 731, + 3829, 796, 2872, 656, 1518, 668, 196, 506, +64406, 485, 63286, 456, 62535, 451, 62125, 499, +62241, 406, 62548, 242, 63203, 65493, 64076, 65035, +65024, 64630, 669, 64101, 1684, 63864, 2715, 63849, + 3386, 64130, 3586, 64834, 3474, 89, 2754, 1154, + 1884, 1958, 613, 2516, 64760, 2634, 63427, 2186, +62187, 1433, 61498, 262, 61219, 64599, 61522, 63557, +62470, 62814, 63815, 62653, 61, 62866, 1847, 63571, + 3468, 64634, 4659, 213, 5037, 1369, 4736, 2206, + 3606, 2702, 2022, 2721, 168, 2183, 63744, 1384, +62145, 318, 61005, 64911, 60614, 64144, 60938, 63634, +61778, 63607, 63264, 63809, 64916, 64374, 1171, 64971, + 2724, 65510, 3833, 442, 4458, 617, 4306, 727, + 3610, 651, 2478, 575, 1058, 553, 65298, 431, +63931, 444, 62929, 441, 62266, 401, 62013, 446, +62239, 167, 62650, 11, 63434, 65108, 64393, 64705, +65474, 64304, 1108, 63963, 2191, 63960, 3109, 64167, + 3618, 64720, 3654, 1, 3291, 870, 2462, 1840, + 1364, 2381, 17, 2640, 64083, 2376, 62784, 1663, +61740, 707, 61202, 64968, 61208, 63912, 61762, 63059, +62979, 62680, 64497, 62821, 827, 63292, 2582, 64311, + 4100, 65382, 4985, 992, 5056, 1946, 4421, 2496, + 3079, 2711, 1305, 2305, 64950, 1534, 63025, 582, +61651, 65059, 60750, 64323, 60672, 63701, 61215, 63522, +62348, 63747, 63942, 64160, 106, 64868, 1804, 65369, + 3226, 369, 4116, 658, 4427, 743, 4021, 745, + 3164, 588, 1905, 549, 517, 471, 64731, 409, +63507, 467, 62612, 438, 62138, 495, 62007, 367, +62364, 91, 62865, 65326, 63765, 64828, 64741, 64442, + 359, 64052, 1545, 63861, 2612, 64098, 3394, 64473, + 3751, 65263, 3616, 568, 3088, 1488, 2107, 2223, + 893, 2455, 64992, 2403, 63554, 1751, 62295, 848, +61426, 65282, 61107, 64067, 61355, 63284, 62192, 62755, +63591, 62801, 65241, 63281, 1626, 64049, 3266, 65283, + 4535, 770, 5057, 1845, 4792, 2434, 3858, 2664, + 2277, 2471, 466, 1701, 64090, 799, 62434, 65325, +61258, 64490, 60744, 63915, 60957, 63577, 61754, 63747, +63065, 64131, 64687, 64721, 844, 65328, 2410, 193, + 3633, 616, 4251, 700, 4312, 676, 3659, 624, + 2648, 481, 1292, 534, 65464, 389, 64166, 424, +63073, 428, 62332, 401, 62053, 385, 62117, 72, +62623, 65332, 63281, 64883, 64281, 64438, 65327, 64082, + 927, 63820, 2078, 64004, 2920, 64392, 3508, 65049, + 3576, 428, 3254, 1295, 2522, 2156, 1470, 2544, + 197, 2506, 64343, 2078, 63049, 1174, 62023, 107, +61441, 64438, 61376, 63448, 61864, 62899, 62920, 62722, +64383, 63143, 538, 63821, 2301, 64925, 3738, 550, + 4685, 1512, 4846, 2313, 4305, 2559, 3133, 2461, + 1510, 1838, 65216, 910, 63465, 65492, 61972, 64593, +61118, 63976, 60827, 63651, 61297, 63648, 62248, 64094, +63697, 64597, 65322, 65265, 1402, 177, 2856, 534, + 3831, 735, 4249, 657, 4030, 584, 3237, 450, + 2118, 403, 782, 418, 64955, 382, 63781, 514, +62788, 511, 62258, 537, 62076, 343, 62317, 65504, +62878, 65133, 63685, 64581, 64716, 64216, 267, 63864, + 1444, 63877, 2487, 64271, 3228, 64820, 3591, 170, + 3489, 1050, 2958, 1855, 2095, 2419, 898, 2402, +65135, 2092, 63765, 1253, 62593, 264, 61795, 64649, +61424, 63629, 61650, 63006, 62348, 62796, 63588, 63093, +65120, 63785, 1276, 64722, 2890, 360, 4077, 1339, + 4659, 2127, 4540, 2510, 3706, 2433, 2388, 1983, + 688, 1136, 64458, 194, 62840, 64883, 61618, 64183, +61026, 63875, 61042, 63753, 61708, 64090, 62857, 64540, +64397, 65140, 478, 96, 2039, 408, 3319, 671, + 4094, 645, 4206, 572, 3743, 480, 2743, 386, + 1512, 414, 130, 375, 64349, 411, 63276, 440, +62488, 388, 62163, 282, 62216, 65508, 62624, 65118, +63347, 64715, 64229, 64265, 65294, 64046, 812, 63923, + 1858, 64249, 2751, 64814, 3208, 17, 3401, 956, + 3061, 1723, 2434, 2346, 1495, 2498, 304, 2188, +64596, 1524, 63337, 509, 62344, 64925, 61745, 63906, +61559, 63080, 61984, 62849, 62871, 62950, 64194, 63611, + 285, 64468, 1906, 47, 3441, 1146, 4366, 1931, + 4683, 2493, 4273, 2460, 3210, 2082, 1722, 1321, +65451, 322, 63742, 64988, 62258, 64184, 61279, 63791, +60991, 63653, 61257, 63864, 62222, 64373, 63545, 64915, +65149, 65515, 1216, 370, 2635, 616, 3718, 744, + 4178, 615, 4012, 590, 3316, 469, 2194, 430, + 887, 509, 65076, 462, 63866, 576, 62941, 515, +62345, 420, 62208, 177, 62403, 65263, 62930, 64837, +63734, 64349, 64633, 63986, 204, 63855, 1237, 63970, + 2291, 64553, 3050, 65230, 3392, 632, 3384, 1500, + 2882, 2172, 2092, 2541, 976, 2301, 65215, 1721, +63966, 772, 62765, 65151, 61975, 64118, 61597, 63172, +61705, 62808, 62433, 62845, 63504, 63359, 64996, 64210, + 1067, 65254, 2638, 870, 3889, 1762, 4494, 2341, + 4497, 2540, 3779, 2214, 2526, 1624, 919, 677, +64681, 65296, 63076, 64559, 61804, 64010, 61083, 63866, +61063, 63922, 61601, 64345, 62734, 64913, 64194, 65378, + 251, 311, 1846, 465, 3122, 613, 3989, 540, + 4163, 421, 3771, 384, 2904, 333, 1641, 432, + 351, 465, 64514, 510, 63422, 587, 62645, 471, +62203, 298, 62281, 65402, 62577, 64919, 63287, 64463, +64162, 63994, 65124, 63816, 644, 63852, 1661, 64300, + 2599, 65035, 3183, 347, 3329, 1320, 3169, 2083, + 2526, 2539, 1647, 2554, 474, 1970, 64707, 1171, +63526, 21, 62446, 64464, 61833, 63488, 61609, 62856, +61940, 62842, 62834, 63157, 64045, 63975, 62, 64932, + 1672, 532, 3147, 1538, 4217, 2190, 4532, 2496, + 4272, 2333, 3332, 1759, 1911, 946, 258, 65470, +63997, 64660, 62603, 64017, 61525, 63740, 61118, 63747, +61343, 64059, 62091, 64632, 63404, 65193, 64858, 153, + 871, 488, 2288, 594, 3364, 642, 3973, 519, + 3875, 445, 3331, 406, 2335, 393, 1116, 509, +65373, 533, 64142, 600, 63161, 551, 62543, 376, +62275, 80, 62402, 65102, 62854, 64623, 63582, 64173, +64525, 63859, 65487, 63876, 1034, 64139, 2047, 64797, + 2918, 112, 3317, 1024, 3332, 1910, 2974, 2402, + 2183, 2589, 1187, 2192, 65425, 1399, 64183, 310, +63043, 64681, 62192, 63643, 61763, 62925, 61799, 62682, +62378, 62966, 63418, 63655, 64734, 64709, 720, 247, + 2262, 1352, 3483, 2137, 4294, 2558, 4263, 2536, + 3798, 1986, 2639, 1226, 1176, 257, 65049, 64873, +63443, 64202, 62235, 63797, 61451, 63801, 61290, 64078, +61706, 64582, 62609, 65193, 63996, 146, 65412, 520, + 1358, 623, 2666, 583, 3550, 472, 3952, 312, + 3680, 293, 2976, 260, 1957, 330, 669, 445, +64986, 527, 63813, 541, 62964, 438, 62480, 129, +62292, 65300, 62608, 64738, 63084, 64330, 63947, 63937, +64876, 63890, 333, 64108, 1450, 64605, 2354, 65390, + 3080, 722, 3322, 1613, 3162, 2221, 2685, 2440, + 1746, 2266, 667, 1592, 64899, 656, 63682, 65073, +62675, 64026, 61946, 63265, 61735, 62864, 62010, 62986, +62778, 63515, 64009, 64412, 65379, 65501, 1472, 974, + 2902, 1859, 3948, 2326, 4423, 2493, 4127, 2081, + 3390, 1414, 1999, 504, 394, 65157, 64277, 64403, +62771, 63906, 61799, 63722, 61270, 63907, 61430, 64293, +62168, 64875, 63282, 65382, 64791, 309, 663, 595, + 2099, 653, 3214, 626, 3804, 526, 3853, 456, + 3293, 430, 2412, 377, 1225, 452, 65466, 467, +64307, 475, 63257, 388, 62657, 123, 62329, 65355, +62423, 64852, 62885, 64458, 63543, 64112, 64491, 63964, +65446, 64148, 927, 64507, 2008, 65250, 2736, 506, + 3250, 1381, 3242, 2064, 2896, 2381, 2241, 2340, + 1150, 1785, 7, 891, 64236, 65392, 63136, 64268, +62278, 63400, 61765, 62858, 61850, 62786, 62343, 63260, +63394, 64007, 64703, 65122, 653, 658, 2257, 1639, + 3472, 2330, 4251, 2561, 4323, 2413, 3744, 1779, + 2697, 949, 1117, 10, 65001, 64640, 63437, 64077, +62126, 63711, 61474, 63753, 61216, 64056, 61770, 64536, +62692, 65180, 64064, 111, 73, 513, 1456, 692, + 2830, 707, 3646, 727, 3939, 580, 3654, 573, + 2800, 504, 1798, 470, 450, 524, 64737, 380, +63651, 351, 62819, 109, 62465, 65281, 62352, 64909, +62697, 64377, 63295, 64140, 64131, 63929, 65109, 64038, + 528, 64429, 1572, 65021, 2495, 373, 3044, 1186, + 3288, 1939, 3023, 2374, 2502, 2398, 1604, 2049, + 427, 1195, 64750, 184, 63521, 64635, 62593, 63627, +61940, 63013, 61724, 62721, 62116, 63043, 62906, 63741, +64207, 64699, 81, 340, 1641, 1292, 3121, 2186, + 4059, 2553, 4455, 2491, 4085, 2086, 3161, 1214, + 1800, 343, 60, 64935, 63982, 64161, 62510, 63776, +61602, 63563, 61250, 63858, 61467, 64244, 62329, 64863, +63552, 65482, 65059, 350, 987, 733, 2270, 778, + 3338, 798, 3789, 756, 3717, 625, 3092, 570, + 2097, 448, 976, 436, 65240, 389, 64105, 254, +63204, 143, 62641, 65344, 62491, 65021, 62589, 64611, +63076, 64223, 63764, 64127, 64666, 64083, 94, 64451, + 1050, 64931, 2060, 118, 2833, 968, 3213, 1693, + 3232, 2204, 2776, 2338, 2094, 2057, 999, 1431, +65319, 443, 64067, 64957, 62938, 63926, 62197, 63197, +61773, 62860, 61891, 62922, 62546, 63550, 63607, 64416, +65037, 5, 964, 1076, 2502, 1896, 3658, 2503, + 4259, 2551, 4240, 2221, 3481, 1511, 2344, 576, + 757, 65234, 64632, 64392, 63136, 63875, 61987, 63650, +61456, 63722, 61455, 64143, 62041, 64594, 63119, 65223, +64464, 147, 426, 504, 1737, 757, 2886, 744, + 3609, 797, 3734, 734, 3365, 669, 2487, 617, + 1423, 471, 224, 463, 64594, 340, 63631, 167, +62897, 65449, 62614, 65042, 62600, 64699, 62919, 64279, +63505, 64062, 64284, 64044, 65170, 64274, 591, 64807, + 1496, 65440, 2404, 724, 2920, 1530, 3149, 2107, + 2910, 2369, 2355, 2159, 1483, 1640, 327, 779, +64660, 65273, 63495, 64278, 62528, 63423, 62024, 62992, +61836, 62930, 62277, 63299, 63157, 64103, 64378, 65086, + 362, 637, 1816, 1550, 3204, 2166, 4017, 2501, + 4267, 2293, 3826, 1790, 2807, 948, 1424, 58, +65299, 64808, 63759, 64128, 62474, 63810, 61681, 63710, +61494, 63984, 61841, 64426, 62696, 64924, 63948, 65482, +65319, 346, 1179, 674, 2348, 818, 3224, 835, + 3620, 862, 3403, 777, 2808, 692, 1796, 604, + 708, 454, 65086, 384, 64066, 146, 63274, 65465, +62785, 65108, 62673, 64714, 62834, 64397, 63243, 64079, +63954, 64085, 64724, 64230, 156, 64664, 1094, 65321, + 2045, 470, 2813, 1275, 3167, 1862, 3174, 2162, + 2707, 2160, 1922, 1651, 854, 989, 65131, 65516, +63924, 64596, 62810, 63744, 62125, 63160, 61803, 63054, +62030, 63252, 62737, 63917, 63876, 64838, 65278, 297, + 1254, 1273, 2650, 1950, 3737, 2352, 4188, 2318, + 4034, 1889, 3228, 1189, 1944, 329, 426, 65073, +64330, 64390, 62964, 63945, 61968, 63848, 61547, 63936, +61708, 64350, 62353, 64768, 63461, 65286, 64811, 203, + 620, 513, 1926, 731, 2897, 806, 3524, 840, + 3563, 827, 3123, 727, 2268, 646, 1199, 514, + 41, 399, 64483, 239, 63536, 65488, 62947, 65201, +62630, 64780, 62719, 64429, 63019, 64126, 63616, 63988, +64399, 64152, 65274, 64492, 685, 65129, 1626, 297, + 2465, 1100, 2998, 1830, 3131, 2211, 2882, 2300, + 2245, 1909, 1304, 1259, 167, 338, 64444, 64859, +63327, 63988, 62414, 63309, 61931, 63028, 61910, 63177, +62365, 63611, 63380, 64512, 64654, 65447, 631, 920, + 2113, 1708, 3362, 2200, 4152, 2359, 4215, 2074, + 3700, 1505, 2556, 706, 1078, 65392, 64992, 64711, +63440, 64126, 62261, 63897, 61588, 63872, 61506, 64124, +61998, 64529, 62949, 64931, 64260, 65365, 128, 209, + 1469, 471, 2610, 706, 3335, 765, 3601, 914, + 3286, 908, 2548, 879, 1540, 781, 375, 621, +64826, 462, 63847, 160, 63142, 65318, 62781, 64893, +62730, 64422, 62989, 64127, 63493, 63859, 64158, 63939, +64999, 64252, 317, 64809, 1275, 78, 2143, 829, + 2818, 1680, 3134, 2203, 3013, 2413, 2546, 2189, + 1706, 1573, 626, 733, 64946, 65269, 63724, 64284, +62724, 63514, 62031, 63032, 61833, 63027, 62117, 63365, +62890, 64031, 64129, 65021, 65497, 453, 1537, 1399, + 2881, 2052, 3888, 2326, 4248, 2305, 3941, 1770, + 3051, 1137, 1660, 218, 49, 65029, 64021, 64390, +62659, 63985, 61796, 63885, 61475, 63972, 61761, 64332, +62581, 64741, 63755, 65139, 65133, 42, 1016, 341, + 2218, 644, 3167, 822, 3558, 939, 3516, 1043, + 2912, 1009, 1994, 949, 859, 790, 65232, 529, +64208, 291, 63359, 65363, 62847, 64957, 62677, 64418, +62800, 64043, 63238, 63829, 63808, 63743, 64612, 64087, +65445, 64579, 815, 65367, 1760, 677, 2495, 1472, + 3023, 2156, 3069, 2449, 2806, 2356, 2094, 1847, + 1133, 995, 65502, 20, 64279, 64506, 63117, 63643, +62325, 63068, 61823, 62897, 61976, 63168, 62493, 63774, +63567, 64685, 64925, 190, 879, 1147, 2419, 1957, + 3574, 2329, 4280, 2399, 4239, 2051, 3577, 1364, + 2340, 593, 767, 65229, 64673, 64590, 63173, 64077, +62058, 63843, 61535, 63888, 61562, 64110, 62216, 64547, +63252, 64939, 64568, 65368, 467, 192, 1699, 497, + 2774, 777, 3332, 946, 3480, 1068, 3067, 1149, + 2297, 1067, 1262, 978, 162, 691, 64634, 380, +63782, 65516, 63125, 64982, 62850, 64493, 62828, 63978, +63145, 63720, 63615, 63652, 64299, 63849, 65107, 64405, + 430, 65114, 1381, 514, 2210, 1393, 2787, 2118, + 3110, 2559, 2902, 2576, 2414, 2171, 1531, 1387, + 413, 355, 64763, 64851, 63547, 63832, 62581, 63161, +62011, 62800, 61876, 62926, 62318, 63476, 63149, 64264, +64439, 65332, 327, 788, 1801, 1687, 3092, 2287, + 3896, 2437, 4149, 2291, 3692, 1721, 2668, 973, + 1286, 137, 65219, 64873, 63769, 64297, 62525, 63906, +61842, 63815, 61689, 63925, 62078, 64237, 62964, 64671, +64120, 65048, 65477, 65530, 1225, 312, 2300, 684, + 3100, 933, 3356, 1145, 3215, 1234, 2563, 1250, + 1653, 1119, 587, 906, 65050, 549, 64121, 131, +63395, 65146, 62934, 64605, 62863, 64117, 62989, 63753, +63462, 63644, 64025, 63756, 64823, 64177, 114, 64884, + 1017, 163, 1886, 1102, 2565, 1874, 2936, 2387, + 2940, 2566, 2518, 2264, 1827, 1631, 802, 686, +65232, 65166, 64058, 64187, 63023, 63383, 62330, 62939, +62008, 62880, 62219, 63274, 62879, 63970, 63934, 64916, +65314, 389, 1142, 1298, 2557, 2031, 3554, 2378, + 4038, 2332, 3907, 1956, 3080, 1272, 1885, 472, + 350, 65195, 64338, 64494, 63035, 64054, 62059, 63803, +61708, 63864, 61862, 64074, 62549, 64458, 63651, 64885, +64940, 65287, 717, 182, 1875, 540, 2766, 902, + 3265, 1165, 3226, 1308, 2781, 1389, 1970, 1270, + 979, 1090, 65487, 701, 64496, 253, 63759, 65266, +63205, 64691, 63004, 64164, 63044, 63782, 63316, 63605, +63827, 63728, 64463, 64062, 65227, 64741, 543, 65516, + 1414, 906, 2243, 1707, 2748, 2258, 2967, 2513, + 2760, 2311, 2187, 1795, 1345, 910, 177, 65459, +64583, 64480, 63418, 63652, 62551, 63131, 62055, 62992, +62008, 63217, 62533, 63835, 63435, 64647, 64698, 52, + 580, 953, 1979, 1707, 3192, 2156, 3842, 2267, + 3957, 2021, 3379, 1512, 2325, 818, 907, 77, +64924, 64924, 63552, 64377, 62508, 64037, 61900, 63907, +61903, 63999, 62363, 64221, 63304, 64599, 64505, 64990, + 226, 65438, 1445, 312, 2391, 727, 3057, 1103, + 3209, 1308, 2927, 1439, 2275, 1385, 1345, 1195, + 339, 862, 64881, 361, 64052, 65375, 63467, 64769, +63107, 64207, 63097, 63805, 63236, 63559, 63678, 63661, +64214, 63946, 64906, 64560, 139, 65324, 989, 649, + 1812, 1500, 2466, 2086, 2785, 2412, 2812, 2326, + 2404, 1882, 1703, 1157, 723, 197, 65101, 64814, +64009, 63959, 62980, 63393, 62319, 63144, 62076, 63249, +62316, 63744, 63088, 64445, 64188, 65304, 37, 645, + 1472, 1371, 2793, 1926, 3700, 2123, 4015, 1984, + 3697, 1619, 2789, 991, 1442, 344, 65443, 65191, +63938, 64628, 62751, 64248, 61969, 64037, 61791, 64050, +62110, 64173, 62950, 64448, 64102, 64787, 65375, 65155, + 1058, 28, 2082, 421, 2799, 856, 3088, 1178, + 2919, 1359, 2371, 1493, 1565, 1328, 596, 1159, +65229, 683, 64363, 194, 63759, 65130, 63387, 64493, +63198, 64018, 63333, 63651, 63581, 63596, 64065, 63810, +64645, 64276, 65331, 65029, 596, 327, 1425, 1197, + 2155, 1935, 2681, 2300, 2787, 2409, 2657, 2019, + 2022, 1402, 1181, 509, 56, 65104, 64414, 64268, +63344, 63567, 62480, 63271, 62079, 63262, 62154, 63609, +62752, 64252, 63765, 64981, 65055, 303, 946, 1055, + 2320, 1611, 3351, 1956, 3904, 1896, 3754, 1666, + 3095, 1142, 1884, 563, 453, 65486, 64495, 64944, +63238, 64525, 62336, 64267, 61962, 64140, 62086, 64214, +62733, 64345, 63715, 64626, 64937, 64900, 594, 65315, + 1625, 179, 2474, 644, 2910, 1063, 2957, 1352, + 2578, 1534, 1911, 1499, 1046, 1292, 132, 904, +64771, 361, 64057, 65286, 63546, 64640, 63274, 64082, +63253, 63698, 63419, 63549, 63839, 63699, 64385, 64094, +65083, 64758, 257, 26, 1117, 879, 1860, 1637, + 2447, 2129, 2680, 2288, 2594, 2083, 2177, 1542, + 1424, 784, 431, 65440, 64852, 64585, 63785, 63916, +62911, 63433, 62333, 63366, 62252, 63542, 62612, 64035, +63463, 64743, 64627, 65470, 384, 730, 1749, 1347, + 2875, 1781, 3600, 1912, 3719, 1759, 3237, 1395, + 2304, 846, 969, 264, 65095, 65206, 63746, 64716, +62709, 64360, 62155, 64162, 62076, 64114, 62489, 64234, +63349, 64422, 64456, 64783, 151, 65126, 1213, 71, + 2115, 539, 2692, 1018, 2904, 1371, 2684, 1539, + 2078, 1569, 1339, 1378, 456, 1024, 65165, 509, +64404, 65415, 63827, 64810, 63506, 64209, 63378, 63798, +63425, 63595, 63711, 63648, 64135, 64039, 64775, 64565, +65455, 65348, 683, 642, 1529, 1412, 2194, 2033, + 2650, 2223, 2687, 2152, 2425, 1725, 1787, 992, + 849, 205, 65268, 64834, 64117, 64155, 63127, 63615, +62433, 63417, 62137, 63523, 62381, 63898, 63050, 64532, +64164, 65243, 65463, 422, 1279, 1110, 2567, 1575, + 3436, 1832, 3792, 1764, 3527, 1484, 2665, 1083, + 1510, 511, 20, 65535, 64243, 65008, 63060, 64613, +62348, 64362, 62139, 64168, 62399, 64214, 63127, 64270, +64135, 64542, 65319, 64851, 857, 65243, 1807, 242, + 2457, 729, 2769, 1235, 2683, 1496, 2263, 1649, + 1542, 1560, 767, 1276, 65420, 774, 64667, 148, +64024, 64977, 63575, 64386, 63396, 63816, 63351, 63568, +63564, 63522, 63943, 63822, 64471, 64397, 65196, 65072, + 371, 397, 1233, 1221, 1956, 1841, 2510, 2214, + 2707, 2112, 2562, 1833, 2066, 1172, 1252, 418, + 193, 65121, 64624, 64397, 63516, 63879, 62729, 63608, +62256, 63593, 62288, 63911, 62824, 64379, 63745, 65063, +65019, 124, 790, 767, 2116, 1267, 3129, 1586, + 3659, 1664, 3590, 1470, 2968, 1143, 1828, 716, + 541, 192, 64609, 65273, 63472, 64828, 62557, 64529, +62197, 64313, 62314, 64197, 62857, 64235, 63815, 64368, +64897, 64683, 496, 65025, 1463, 65501, 2179, 543, + 2611, 1051, 2645, 1477, 2319, 1657, 1763, 1642, + 962, 1468, 233, 992, 64950, 421, 64383, 65259, +63861, 64597, 63602, 64072, 63532, 63649, 63571, 63585, +63887, 63719, 64271, 64189, 64876, 64849, 49, 65, + 783, 951, 1609, 1637, 2244, 2120, 2631, 2206, + 2656, 1950, 2294, 1448, 1640, 683, 651, 65402, +65069, 64655, 63929, 64021, 62945, 63702, 62371, 63577, +62162, 63794, 62526, 64201, 63335, 64799, 64494, 65429, + 335, 471, 1626, 1065, 2793, 1411, 3514, 1603, + 3651, 1519, 3219, 1248, 2227, 895, 993, 416, +65123, 65480, 63867, 65050, 62907, 64674, 62358, 64436, +62363, 64249, 62769, 64237, 63551, 64293, 64616, 64510, + 110, 64844, 1140, 65237, 1866, 265, 2369, 803, + 2556, 1304, 2350, 1604, 1906, 1700, 1219, 1592, + 489, 1236, 65315, 685, 64623, 8, 64123, 64819, +63731, 64224, 63571, 63747, 63557, 63534, 63681, 63603, +64070, 63962, 64522, 64573, 65244, 65312, 407, 612, + 1235, 1383, 2000, 1949, 2495, 2182, 2713, 2038, + 2503, 1629, 1973, 970, 1114, 203, 1, 64963, +64410, 64299, 63370, 63860, 62604, 63692, 62298, 63749, +62390, 64073, 63058, 64527, 64052, 65164, 65324, 179, + 1107, 755, 2278, 1208, 3198, 1505, 3532, 1578, + 3348, 1417, 2575, 1102, 1416, 712, 100, 226, +64333, 65305, 63253, 64853, 62583, 64529, 62363, 64323, +62642, 64209, 63287, 64208, 64220, 64368, 65272, 64688, + 751, 65086, 1575, 81, 2135, 600, 2446, 1168, + 2383, 1517, 2058, 1702, 1481, 1623, 767, 1362, + 86, 898, 64937, 260, 64373, 65113, 63963, 64438, +63687, 63971, 63660, 63651, 63698, 63597, 63960, 63836, +64386, 64303, 64957, 65045, 158, 224, 881, 1069, + 1653, 1682, 2256, 2085, 2553, 2092, 2534, 1772, + 2121, 1230, 1390, 502, 405, 65288, 64820, 64547, +63752, 64037, 62886, 63749, 62413, 63733, 62389, 63945, +62819, 64359, 63729, 64904, 64883, 65529, 655, 504, + 1871, 1042, 2833, 1373, 3400, 1544, 3377, 1486, + 2808, 1193, 1825, 848, 548, 403, 64853, 65513, +63700, 65069, 62929, 64693, 62537, 64456, 62640, 64294, +63157, 64241, 63938, 64302, 64928, 64528, 352, 64882, + 1210, 65338, 1849, 300, 2204, 875, 2296, 1320, + 2107, 1618, 1621, 1616, 1059, 1462, 321, 1108, +65242, 511, 64630, 65411, 64154, 64701, 63810, 64196, +63636, 63823, 63650, 63682, 63803, 63790, 64174, 64193, +64686, 64805, 65384, 65506, 623, 723, 1392, 1397, + 2068, 1849, 2504, 2009, 2577, 1776, 2305, 1346, + 1665, 745, 741, 25, 65231, 64913, 64137, 64315, +63254, 64001, 62626, 63903, 62501, 63991, 62765, 64285, +63483, 64704, 64522, 65234, 170, 201, 1391, 652, + 2375, 1058, 3063, 1309, 3233, 1366, 2904, 1248, + 2105, 944, 992, 622, 65298, 220, 64201, 65326, +63289, 64941, 62816, 64613, 62667, 64426, 63038, 64310, +63663, 64293, 64528, 64458, 65463, 64755, 797, 65199, + 1495, 105, 1982, 691, 2156, 1133, 2131, 1508, + 1799, 1595, 1289, 1456, 657, 1183, 10, 650, +64970, 73, 64450, 64923, 64067, 64368, 63816, 64000, +63744, 63808, 63839, 63870, 64069, 64139, 64499, 64669, +65069, 65322, 249, 457, 976, 1123, 1672, 1624, + 2185, 1841, 2471, 1793, 2325, 1379, 1887, 899, + 1087, 237, 135, 65141, 64633, 64575, 63639, 64138, +62925, 64014, 62548, 64015, 62680, 64257, 63169, 64611, +64070, 65082, 65202, 49, 857, 492, 1947, 900, + 2772, 1183, 3145, 1295, 3053, 1261, 2427, 1004, + 1451, 699, 281, 365, 64676, 65452, 63726, 65128, +63081, 64723, 62817, 64534, 62985, 64371, 63505, 64321, +64261, 64420, 65121, 64634, 430, 65030, 1182, 65472, + 1684, 443, 1992, 967, 2019, 1361, 1836, 1569, + 1431, 1527, 881, 1286, 297, 861, 65224, 257, +64734, 65188, 64246, 64516, 63923, 64133, 63745, 63833, +63712, 63871, 63889, 64054, 64183, 64535, 64752, 65126, +65409, 282, 657, 933, 1405, 1444, 2070, 1743, + 2466, 1747, 2534, 1478, 2184, 988, 1530, 425, + 599, 65340, 65100, 64793, 64049, 64327, 63188, 64084, +62693, 64083, 62614, 64222, 62988, 64539, 63710, 64896, +64761, 65381, 384, 271, 1525, 679, 2414, 1002, + 2952, 1196, 3035, 1254, 2632, 1149, 1785, 841, + 719, 561, 65128, 139, 64138, 65301, 63384, 64909, +62969, 64579, 62952, 64401, 63329, 64312, 63943, 64361, +64720, 64548, 9, 64883, 777, 65384, 1388, 324, + 1773, 864, 1959, 1260, 1903, 1541, 1666, 1591, + 1170, 1340, 614, 978, 52, 381, 65021, 65341, +64580, 64695, 64143, 64184, 63898, 63924, 63794, 63841, +63863, 64028, 64078, 64388, 64495, 64938, 65099, 69, + 263, 703, 1039, 1245, 1714, 1603, 2239, 1675, + 2467, 1554, 2299, 1109, 1794, 599, 973, 15, +65528, 64999, 64531, 64559, 63554, 64212, 62922, 64159, +62630, 64263, 62815, 64497, 63391, 64871, 64272, 65234, +65397, 167, 1011, 562, 1995, 863, 2700, 1105, + 2957, 1149, 2784, 1134, 2138, 895, 1195, 585, + 78, 276, 64610, 65414, 63760, 65083, 63242, 64697, +63058, 64470, 63261, 64338, 63763, 64303, 64446, 64434, +65204, 64685, 409, 65156, 1051, 123, 1510, 632, + 1783, 1141, 1834, 1432, 1694, 1614, 1381, 1449, + 896, 1106, 368, 603, 65340, 65530, 64836, 64912, +64375, 64384, 63989, 63988, 63780, 63928, 63732, 63985, +63873, 64350, 64227, 64808, 64764, 65441, 65469, 554, + 710, 1096, 1482, 1479, 2077, 1615, 2428, 1510, + 2411, 1189, 2001, 669, 1303, 132, 332, 65167, +64870, 64700, 63924, 64413, 63180, 64223, 62805, 64312, +62857, 64481, 63310, 64768, 64114, 65108, 65112, 65480, + 653, 335, 1639, 673, 2373, 902, 2750, 1064, + 2658, 1087, 2217, 966, 1381, 728, 402, 393, +64940, 97, 64100, 65231, 63539, 64921, 63254, 64568, +63310, 64427, 63675, 64366, 64242, 64423, 64934, 64686, + 85, 65024, 710, 13, 1219, 500, 1577, 950, + 1725, 1323, 1695, 1482, 1485, 1442, 1124, 1143, + 650, 676, 109, 143, 65113, 65095, 64654, 64566, +64208, 64174, 63917, 63998, 63769, 64060, 63823, 64297, +64099, 64712, 64551, 65254, 65191, 312, 403, 860, + 1157, 1237, 1859, 1471, 2245, 1420, 2361, 1223, + 2077, 782, 1483, 314, 624, 65360, 65179, 64923, +64257, 64593, 63463, 64393, 62991, 64362, 62903, 64521, +63210, 64711, 63904, 65053, 64822, 65348, 283, 204, + 1288, 527, 2038, 796, 2542, 979, 2585, 1058, + 2258, 972, 1577, 823, 667, 499, 65276, 218, +64389, 65385, 63821, 65035, 63447, 64721, 63449, 64467, +63705, 64373, 64211, 64373, 64862, 64542, 65511, 64867, + 564, 65302, 1060, 306, 1374, 749, 1549, 1193, + 1514, 1385, 1334, 1445, 1039, 1221, 615, 821, + 149, 324, 65248, 65278, 64812, 64791, 64463, 64347, +64138, 64155, 64016, 64130, 63982, 64335, 64187, 64668, +64496, 65146, 65019, 142, 125, 641, 813, 1046, + 1471, 1245, 1975, 1306, 2183, 1117, 2097, 826, + 1645, 390, 907, 65510, 36, 65130, 64647, 64795, +63836, 64602, 63274, 64512, 63034, 64578, 63228, 64746, +63753, 64949, 64566, 65243, 65532, 65518, 948, 300, + 1773, 569, 2305, 777, 2518, 928, 2270, 948, + 1726, 861, 849, 646, 65477, 392, 64599, 60, +63930, 65274, 63536, 64926, 63447, 64658, 63661, 64499, +64110, 64444, 64721, 64555, 65338, 64808, 403, 65168, + 868, 129, 1225, 574, 1394, 975, 1439, 1267, + 1346, 1317, 1085, 1248, 786, 883, 384, 445, +65494, 65466, 65110, 64927, 64679, 64536, 64378, 64244, +64106, 64196, 64011, 64320, 64076, 64602, 64324, 65045, +64795, 65505, 65363, 495, 561, 884, 1235, 1139, + 1856, 1227, 2169, 1094, 2185, 849, 1856, 439, + 1184, 59, 343, 65199, 64905, 64905, 64060, 64709, +63366, 64630, 63042, 64677, 63092, 64825, 63510, 65001, +64272, 65253, 65203, 65461, 614, 194, 1497, 419, + 2103, 605, 2443, 764, 2355, 816, 1884, 815, + 1174, 694, 273, 483, 64989, 225, 64252, 65436, +63780, 65099, 63615, 64792, 63692, 64519, 64048, 64426, +64521, 64422, 65125, 64623, 152, 64967, 633, 65425, + 1014, 402, 1230, 853, 1374, 1214, 1330, 1380, + 1168, 1338, 900, 1095, 540, 604, 155, 109, +65260, 65057, 64856, 64603, 64483, 64283, 64210, 64153, +64004, 64271, 64029, 64537, 64151, 64964, 64573, 65468, +65062, 413, 201, 885, 892, 1110, 1545, 1224, + 2004, 1114, 2156, 856, 1974, 496, 1486, 82, + 735, 65261, 65389, 64951, 64488, 64737, 63759, 64651, +63273, 64658, 63161, 64792, 63398, 64955, 63999, 65164, +64808, 65392, 220, 75, 1063, 339, 1800, 526, + 2259, 700, 2345, 825, 2082, 846, 1455, 789, + 652, 596, 65349, 353, 64563, 57, 63988, 65250, +63689, 64910, 63661, 64618, 63903, 64445, 64311, 64440, +64861, 64549, 65405, 64874, 382, 65296, 760, 265, + 1036, 749, 1228, 1099, 1274, 1361, 1222, 1348, + 996, 1159, 747, 755, 392, 208, 65535, 65237, +65122, 64696, 64726, 64356, 64378, 64169, 64137, 64213, +64021, 64438, 64129, 64809, 64386, 65303, 64886, 242, +65458, 724, 604, 1034, 1295, 1161, 1803, 1166, + 2113, 918, 2042, 645, 1671, 236, 1024, 65410, + 181, 65088, 64854, 64845, 64016, 64716, 63470, 64694, +63190, 64775, 63315, 64937, 63756, 65110, 64482, 65332, +65365, 7, 688, 238, 1470, 458, 2001, 607, + 2234, 762, 2136, 787, 1661, 765, 985, 602, + 202, 363, 64955, 92, 64352, 65289, 63930, 64973, +63786, 64698, 63907, 64494, 64215, 64482, 64666, 64560, +65216, 64812, 112, 65242, 596, 116, 845, 631, + 1117, 954, 1205, 1227, 1211, 1288, 1087, 1127, + 856, 815, 557, 317, 174, 65356, 65324, 64894, +64905, 64494, 64546, 64322, 64251, 64305, 64120, 64489, +64070, 64834, 64281, 65235, 64586, 185, 65149, 582, + 190, 926, 846, 1074, 1456, 1047, 1866, 918, + 2001, 615, 1803, 294, 1323, 65478, 640, 65143, +65332, 64957, 64534, 64776, 63828, 64757, 63448, 64805, +63355, 64916, 63631, 65132, 64176, 65270, 64963, 65501, + 257, 158, 1040, 373, 1650, 548, 2060, 655, + 2060, 746, 1847, 737, 1231, 625, 533, 454, +65331, 167, 64615, 65450, 64193, 65141, 63874, 64834, +63919, 64658, 64128, 64528, 64512, 64630, 65000, 64787, +65445, 65135, 355, 8, 649, 470, 888, 823, + 1016, 1112, 1076, 1165, 1007, 1122, 878, 807, + 641, 399, 377, 65429, 40, 64959, 65227, 64597, +64875, 64343, 64552, 64336, 64370, 64452, 64227, 64802, +64322, 65181, 64534, 90, 64941, 541, 65471, 837, + 517, 1049, 1127, 1011, 1624, 873, 1852, 635, + 1833, 279, 1454, 65516, 915, 65193, 130, 64992, +64870, 64879, 64153, 64829, 63610, 64903, 63456, 64992, +63538, 65170, 64007, 65318, 64677, 65477, 65465, 121, + 728, 277, 1352, 424, 1812, 516, 1994, 580, + 1816, 611, 1391, 555, 719, 413, 51, 263, +64921, 65527, 64390, 65291, 64073, 64999, 63990, 64763, +64142, 64630, 64469, 64610, 64863, 64738, 65360, 64986, + 207, 65394, 577, 296, 776, 696, 959, 1027, + 1045, 1155, 1009, 1175, 900, 944, 697, 561, + 426, 90, 146, 65143, 65301, 64739, 64961, 64449, +64636, 64347, 64388, 64461, 64275, 64681, 64248, 65096, +64454, 65472, 64785, 408, 65257, 786, 297, 945, + 834, 1033, 1420, 867, 1676, 676, 1805, 347, + 1524, 6, 1101, 65266, 429, 65037, 65211, 64923, +64486, 64886, 63914, 64914, 63587, 65060, 63599, 65157, +63862, 65322, 64440, 65438, 65149, 47, 368, 219, + 1030, 309, 1552, 451, 1858, 512, 1850, 594, + 1565, 581, 1042, 493, 397, 350, 65305, 113, +64720, 65429, 64288, 65129, 64106, 64883, 64079, 64718, +64320, 64659, 64619, 64730, 65053, 64928, 65459, 65280, + 287, 155, 588, 552, 787, 874, 946, 1051, + 1021, 1082, 942, 946, 831, 575, 587, 172, + 334, 65229, 0, 64823, 65181, 64537, 64834, 64385, +64532, 64472, 64345, 64680, 64263, 65033, 64342, 65441, +64625, 300, 65016, 705, 36, 923, 581, 977, + 1177, 904, 1587, 652, 1785, 410, 1703, 53, + 1331, 65312, 748, 65090, 49, 64941, 64828, 64928, +64190, 64927, 63737, 65052, 63613, 65198, 63754, 65318, +64196, 65467, 64803, 27, 21, 183, 693, 288, + 1283, 367, 1651, 450, 1803, 478, 1626, 517, + 1235, 439, 632, 335, 28, 147, 65005, 65456, +64536, 65208, 64257, 64965, 64180, 64744, 64286, 64695, +64576, 64678, 64891, 64914, 65277, 65179, 102, 84, + 397, 485, 660, 847, 833, 1085, 980, 1146, + 986, 1037, 936, 752, 725, 307, 472, 65362, + 148, 64901, 65321, 64583, 64963, 64387, 64620, 64406, +64390, 64580, 64288, 64931, 64338, 65333, 64514, 241, +64891, 606, 65382, 884, 389, 964, 952, 891, + 1382, 680, 1673, 387, 1651, 111, 1418, 65332, + 891, 65124, 275, 64963, 65133, 64912, 64458, 64992, +64003, 65033, 63708, 65196, 63827, 65315, 64106, 65443, +64643, 29, 65288, 116, 390, 266, 1026, 351, + 1416, 450, 1666, 491, 1608, 516, 1336, 506, + 854, 386, 266, 251, 65234, 65508, 64768, 65307, +64416, 65026, 64248, 64833, 64266, 64693, 64463, 64711, +64770, 64840, 65111, 65122, 65469, 65475, 257, 344, + 538, 709, 759, 937, 892, 1056, 975, 947, + 939, 752, 813, 356, 576, 65469, 295, 65041, +65499, 64685, 65152, 64523, 64795, 64475, 64536, 64618, +64348, 64900, 64380, 65223, 64441, 117, 64756, 437, +65162, 761, 118, 867, 700, 883, 1121, 718, + 1516, 486, 1587, 223, 1461, 65471, 1076, 65233, + 494, 65068, 65425, 64956, 64756, 65011, 64236, 65040, +63877, 65182, 63833, 65299, 64026, 65415, 64440, 2, +65015, 103, 91, 209, 706, 307, 1186, 343, + 1499, 414, 1568, 405, 1400, 399, 1014, 347, + 505, 179, 65482, 41, 65006, 65329, 64619, 65130, +64403, 64935, 64326, 64799, 64469, 64802, 64659, 64891, +65019, 65116, 65290, 65442, 105, 263, 362, 613, + 613, 859, 779, 994, 907, 956, 906, 784, + 842, 471, 666, 57, 406, 65190, 124, 64822, +65322, 64585, 64980, 64531, 64675, 64599, 64487, 64864, +64383, 65190, 64475, 47, 64624, 427, 65007, 711, +65434, 904, 412, 843, 915, 740, 1277, 444, + 1511, 171, 1439, 65428, 1199, 65176, 705, 65028, + 147, 64950, 65077, 64963, 64526, 65080, 64144, 65164, +63960, 65353, 64067, 65447, 64359, 31, 64832, 118, +65403, 206, 411, 289, 922, 333, 1286, 398, + 1466, 418, 1387, 421, 1131, 399, 677, 276, + 176, 124, 65197, 65454, 64819, 65219, 64485, 64996, +64413, 64827, 64401, 64766, 64622, 64824, 64872, 65003, +65198, 65302, 65496, 124, 250, 513, 506, 775, + 692, 948, 862, 956, 890, 800, 877, 536, + 711, 129, 514, 65249, 235, 64900, 65448, 64606, +65141, 64551, 64819, 64560, 64593, 64821, 64475, 65117, +64442, 65510, 64611, 319, 64822, 652, 65261, 840, + 141, 880, 667, 750, 1080, 521, 1375, 254, + 1464, 65496, 1291, 65281, 922, 65062, 407, 64995, +65332, 65001, 64797, 65061, 64287, 65197, 64053, 65319, +64006, 65485, 64235, 14, 64626, 129, 65126, 187, + 179, 276, 671, 299, 1116, 338, 1343, 332, + 1391, 324, 1203, 298, 869, 214, 375, 87, +65483, 65474, 65007, 65267, 64730, 65092, 64502, 64942, +64480, 64851, 64599, 64890, 64782, 65020, 65064, 65258, +65335, 60, 50, 378, 326, 688, 497, 882, + 732, 924, 806, 839, 866, 579, 806, 254, + 645, 65373, 445, 65015, 141, 64711, 65360, 64541, +65046, 64576, 64720, 64704, 64543, 65034, 64419, 65395, +64495, 223, 64685, 615, 65018, 815, 65475, 915, + 426, 805, 933, 599, 1272, 315, 1452, 65528, + 1371, 65276, 1095, 65050, 618, 64942, 58, 64950, +64994, 64998, 64518, 65164, 64164, 65301, 64070, 65477, +64160, 51, 64523, 135, 64942, 229, 65478, 283, + 427, 330, 865, 340, 1159, 339, 1301, 347, + 1164, 302, 967, 268, 526, 130, 154, 4, +65252, 65341, 64929, 65160, 64714, 64969, 64601, 64883, +64643, 64850, 64758, 64972, 64948, 65162, 65179, 65463, +65386, 281, 97, 579, 305, 820, 545, 902, + 730, 854, 816, 665, 872, 339, 771, 65493, + 611, 65086, 337, 64781, 65535, 64591, 65209, 64529, +64855, 64670, 64603, 64913, 64443, 65294, 64439, 113, +64583, 484, 64853, 757, 65263, 916, 179, 875, + 694, 721, 1081, 439, 1336, 165, 1356, 65391, + 1183, 65152, 796, 64990, 303, 64919, 65276, 64958, +64773, 65049, 64402, 65184, 64193, 65363, 64220, 65508, +64456, 84, 64816, 198, 65294, 291, 194, 356, + 652, 391, 958, 353, 1162, 346, 1146, 277, + 978, 206, 680, 93, 281, 65478, 65441, 65332, +65105, 65165, 64861, 65011, 64715, 64943, 64686, 64898, +64743, 65036, 64928, 65177, 65093, 65484, 65330, 211, +65513, 540, 194, 749, 396, 838, 583, 843, + 725, 645, 749, 399, 779, 64, 604, 65238, + 443, 64915, 142, 64739, 65379, 64621, 65072, 64740, +64770, 64892, 64592, 65229, 64537, 14, 64588, 344, +64811, 628, 65105, 793, 10, 791, 443, 684, + 889, 434, 1172, 157, 1284, 65439, 1207, 65193, + 912, 65027, 481, 64963, 65504, 64962, 65003, 65055, +64591, 65204, 64302, 65341, 64235, 65516, 64386, 107, +64665, 198, 65101, 301, 65511, 349, 428, 379, + 787, 377, 1028, 326, 1116, 287, 1003, 226, + 779, 105, 432, 26, 70, 65369, 65256, 65247, +65011, 65098, 64831, 64965, 64788, 64985, 64789, 64993, +64939, 65182, 65078, 65397, 65268, 136, 65431, 442, + 66, 645, 270, 799, 436, 777, 609, 668, + 678, 401, 739, 110, 663, 65285, 524, 64982, + 295, 64733, 10, 64646, 65250, 64651, 64955, 64854, +64681, 65114, 64586, 65465, 64552, 281, 64654, 572, +64919, 797, 65239, 825, 172, 768, 590, 563, + 969, 301, 1176, 23, 1197, 65297, 1048, 65115, + 680, 64989, 248, 64964, 65293, 65008, 64875, 65129, +64521, 65274, 64382, 65439, 64393, 37, 64621, 177, +64930, 262, 65329, 370, 195, 387, 553, 391, + 868, 347, 984, 282, 1016, 191, 817, 90, + 589, 65520, 219, 65367, 65464, 65237, 65170, 65099, +64971, 64990, 64873, 64974, 64825, 65011, 64907, 65159, +64996, 65349, 65143, 100, 65293, 356, 65438, 608, + 90, 750, 258, 779, 460, 692, 602, 475, + 700, 187, 698, 65406, 642, 65091, 443, 64866, + 222, 64716, 65444, 64722, 65159, 64839, 64880, 65087, +64683, 65382, 64604, 190, 64625, 482, 64820, 732, +65088, 816, 65507, 792, 364, 615, 827, 371, + 1065, 97, 1225, 65364, 1127, 65133, 883, 64997, + 485, 64907, 4, 64953, 65078, 65015, 64676, 65180, +64431, 65337, 64342, 65519, 64470, 128, 64724, 284, +65067, 376, 65509, 470, 299, 445, 687, 431, + 885, 340, 976, 216, 890, 113, 685, 65482, + 401, 65383, 82, 65202, 65331, 65113, 65104, 65013, +64943, 65000, 64900, 65066, 64892, 65180, 64998, 65398, +65108, 86, 65236, 354, 65392, 569, 1, 710, + 170, 736, 371, 650, 516, 467, 655, 184, + 702, 65437, 680, 65144, 569, 64892, 360, 64749, + 98, 64721, 65335, 64784, 65028, 65011, 64786, 65261, +64604, 69, 64597, 367, 64647, 629, 64926, 758, +65224, 788, 118, 657, 549, 468, 905, 193, + 1115, 65486, 1145, 65238, 951, 65071, 690, 64958, + 210, 64946, 65356, 64992, 64911, 65114, 64632, 65248, +64479, 65460, 64522, 72, 64689, 263, 64984, 379, +65343, 491, 144, 524, 470, 486, 735, 428, + 874, 260, 882, 153, 751, 65508, 523, 65358, + 285, 65211, 65523, 65047, 65329, 65001, 65117, 64922, +65021, 65017, 64955, 65106, 64977, 65340, 64999, 38, +65096, 306, 65196, 528, 65335, 720, 65508, 741, + 152, 699, 384, 512, 535, 260, 657, 65514, + 684, 65203, 622, 64988, 469, 64793, 231, 64776, +65495, 64794, 65223, 64978, 64945, 65224, 64781, 65527, +64665, 273, 64707, 555, 64842, 714, 65116, 774, +65463, 704, 312, 537, 697, 284, 951, 54, + 1049, 65323, 995, 65135, 762, 65001, 437, 64930, + 30, 64966, 65204, 65018, 64849, 65178, 64668, 65325, +64589, 65526, 64670, 156, 64879, 349, 65127, 461, +65457, 558, 187, 527, 496, 475, 680, 344, + 788, 158, 732, 10, 600, 65334, 369, 65197, + 148, 65052, 65435, 64966, 65279, 64958, 65117, 64998, +65057, 65157, 65046, 65339, 65060, 47, 65146, 309, +65193, 518, 65325, 704, 65430, 693, 67, 656, + 265, 484, 408, 234, 578, 65503, 629, 65220, + 624, 64999, 536, 64881, 348, 64809, 111, 64871, +65398, 65012, 65118, 65243, 64891, 65505, 64751, 221, +64682, 478, 64775, 636, 64931, 706, 65247, 646, + 49, 500, 453, 327, 759, 75, 963, 65414, + 982, 65193, 858, 65070, 584, 65040, 225, 65017, +65369, 65103, 65053, 65185, 64758, 65339, 64682, 65508, +64672, 111, 64845, 280, 65065, 401, 65345, 488, + 92, 502, 337, 465, 588, 369, 680, 224, + 712, 62, 602, 65407, 439, 65245, 237, 65090, + 32, 64988, 65377, 64915, 65267, 64969, 65115, 65046, +65118, 65293, 65077, 65498, 65087, 239, 65145, 487, +65189, 654, 65294, 751, 65441, 686, 59, 554, + 306, 300, 444, 43, 600, 65281, 645, 65049, + 609, 64904, 486, 64840, 285, 64898, 16, 65013, +65315, 65224, 65043, 65475, 64861, 199, 64762, 424, +64767, 596, 64895, 653, 65123, 638, 65447, 488, + 265, 301, 612, 81, 834, 65408, 936, 65228, + 879, 65088, 685, 65028, 378, 65037, 30, 65078, +65214, 65163, 64914, 65279, 64747, 65423, 64663, 40, +64758, 181, 64907, 337, 65164, 441, 65436, 512, + 165, 488, 424, 419, 600, 295, 672, 124, + 636, 65503, 498, 65296, 341, 65163, 107, 65035, +65501, 64973, 65321, 64977, 65226, 65049, 65154, 65228, +65105, 65461, 65157, 157, 65128, 444, 65221, 615, +65270, 731, 65393, 709, 19, 564, 198, 350, + 385, 62, 519, 65321, 636, 65053, 617, 64898, + 570, 64824, 403, 64875, 169, 64972, 65450, 65153, +65167, 65396, 64922, 102, 64755, 343, 64654, 515, +64730, 628, 64891, 611, 65190, 563, 26, 354, + 400, 195, 759, 65515, 939, 65353, 991, 65183, + 875, 65097, 628, 65074, 278, 65091, 65442, 65174, +65081, 65242, 64818, 65385, 64668, 65528, 64682, 137, +64781, 305, 65028, 431, 65291, 503, 60, 548, + 327, 468, 583, 347, 720, 182, 739, 65503, + 625, 65343, 485, 65113, 248, 65017, 72, 64919, +65403, 64933, 65257, 65005, 65136, 65153, 65078, 65397, +65060, 106, 65046, 373, 65116, 564, 65173, 711, +65266, 714, 65447, 631, 61, 414, 325, 159, + 477, 65402, 627, 65157, 689, 64934, 643, 64861, + 557, 64860, 302, 64968, 75, 65136, 65307, 65339, +65039, 78, 64830, 284, 64673, 516, 64691, 617, +64791, 633, 65072, 569, 65385, 417, 257, 224, + 615, 30, 882, 65371, 996, 65214, 974, 65102, + 768, 65069, 483, 65089, 104, 65116, 65274, 65235, +64946, 65281, 64729, 65451, 64644, 9, 64681, 162, +64839, 307, 65070, 393, 65347, 474, 112, 474, + 354, 416, 611, 301, 676, 131, 694, 65477, + 598, 65279, 418, 65095, 241, 64970, 51, 64908, +65400, 64941, 65260, 65055, 65123, 65271, 65062, 5, +65020, 275, 65029, 549, 65076, 718, 65163, 751, +65323, 732, 65511, 518, 203, 274, 427, 65503, + 605, 65210, 698, 64986, 726, 64828, 613, 64831, + 468, 64901, 190, 65065, 65459, 65308, 65165, 65510, +64910, 257, 64721, 431, 64653, 575, 64695, 598, +64880, 534, 65182, 420, 0, 254, 396, 54, + 709, 65443, 912, 65285, 966, 65213, 870, 65129, + 631, 65171, 336, 65158, 65488, 65276, 65191, 65300, +64891, 65416, 64758, 65500, 64717, 102, 64795, 251, +64960, 359, 65207, 433, 65468, 497, 211, 451, + 450, 381, 613, 204, 665, 36, 636, 65366, + 494, 65178, 357, 65010, 156, 64917, 65524, 64921, +65366, 64989, 65198, 65157, 65118, 65380, 65039, 127, +65015, 393, 65029, 590, 65088, 711, 65186, 707, +65377, 625, 49, 386, 260, 128, 503, 65360, + 617, 65143, 733, 64934, 683, 64865, 601, 64875, + 374, 65010, 124, 65208, 65375, 65402, 65068, 121, +64866, 333, 64680, 509, 64691, 590, 64751, 532, +65013, 489, 65326, 287, 178, 147, 525, 65467, + 795, 65331, 944, 65215, 918, 65164, 770, 65136, + 490, 65199, 156, 65232, 65341, 65323, 65034, 65395, +64830, 65451, 64705, 51, 64766, 147, 64829, 260, +65082, 341, 65289, 392, 56, 426, 290, 394, + 503, 257, 628, 140, 628, 65476, 575, 65301, + 455, 65111, 267, 64975, 131, 64924, 65495, 64970, +65336, 65088, 65236, 65304, 65109, 36, 65058, 327, +65042, 549, 65019, 715, 65130, 726, 65216, 660, +65444, 477, 121, 177, 341, 65447, 560, 65146, + 671, 64939, 744, 64838, 679, 64829, 522, 64957, + 291, 65143, 65533, 65379, 65240, 86, 64959, 310, +64724, 484, 64648, 575, 64644, 531, 64829, 454, +65095, 313, 65474, 117, 325, 65523, 655, 65364, + 869, 65281, 968, 65228, 874, 65212, 697, 65245, + 351, 65273, 30, 65342, 65227, 65383, 64963, 65451, +64787, 65534, 64732, 112, 64800, 221, 64958, 327, +65181, 375, 65439, 436, 162, 376, 419, 342, + 569, 153, 626, 17, 615, 65354, 486, 65151, + 379, 65041, 178, 64912, 45, 64957, 65431, 65025, +65315, 65227, 65193, 65468, 65112, 202, 65060, 456, +65056, 628, 65053, 702, 65135, 653, 65276, 514, +65494, 270, 197, 65529, 389, 65267, 612, 65054, + 701, 64920, 757, 64899, 642, 64970, 466, 65111, + 210, 65336, 65437, 65525, 65150, 226, 64841, 396, +64679, 508, 64627, 536, 64699, 455, 64936, 335, +65261, 182, 117, 14, 494, 65427, 777, 65295, + 939, 65245, 962, 65211, 791, 65223, 551, 65275, + 169, 65306, 65399, 65357, 65065, 65429, 64856, 65469, +64725, 63, 64740, 134, 64852, 262, 65048, 338, +65277, 379, 21, 406, 255, 341, 487, 242, + 573, 79, 602, 65448, 559, 65255, 426, 65094, + 321, 64964, 119, 64940, 6, 64982, 65400, 65147, +65281, 65347, 65179, 92, 65082, 364, 65054, 590, +65031, 703, 65069, 722, 65182, 598, 65356, 403, + 72, 110, 296, 65367, 506, 65113, 679, 64940, + 731, 64886, 720, 64914, 562, 65055, 343, 65258, + 54, 65480, 65285, 153, 64992, 344, 64735, 475, +64645, 508, 64636, 455, 64804, 334, 65075, 189, +65436, 63, 304, 65449, 608, 65364, 891, 65284, + 923, 65266, 927, 65278, 670, 65283, 402, 65319, + 28, 65361, 65278, 65401, 64975, 65431, 64834, 65526, +64733, 57, 64806, 202, 64930, 278, 65148, 343, +65391, 403, 118, 378, 341, 315, 525, 169, + 572, 65515, 584, 65354, 499, 65150, 376, 65009, + 257, 64942, 79, 64967, 65497, 65100, 65370, 65292, +65229, 65531, 65159, 298, 65052, 511, 65042, 665, +65024, 702, 65092, 589, 65244, 472, 65435, 171, + 167, 65464, 373, 65197, 605, 65015, 701, 64945, + 744, 64917, 679, 65033, 483, 65217, 259, 65410, +65454, 92, 65168, 268, 64870, 416, 64709, 483, +64630, 461, 64722, 335, 64932, 236, 65239, 83, + 90, 65515, 423, 65398, 730, 65321, 856, 65289, + 894, 65310, 758, 65289, 520, 65343, 217, 65331, +65434, 65405, 65186, 65400, 64955, 65489, 64867, 11, +64822, 135, 64938, 225, 65066, 302, 65281, 358, +65479, 376, 187, 345, 330, 215, 482, 101, + 482, 65420, 494, 65299, 411, 65093, 321, 65012, + 208, 64978, 86, 65046, 65506, 65194, 65387, 65412, +65261, 130, 65160, 381, 65061, 563, 65063, 649, +65005, 618, 65133, 479, 65279, 294, 65501, 0, + 217, 65310, 410, 65088, 605, 64985, 687, 64974, + 702, 65029, 575, 65198, 382, 65363, 117, 57, +65362, 189, 65062, 346, 64830, 425, 64689, 404, +64699, 350, 64813, 230, 65067, 104, 65383, 31, + 226, 65443, 519, 65403, 773, 65358, 845, 65355, + 834, 65381, 642, 65362, 399, 65375, 83, 65372, +65349, 65378, 65102, 65398, 64917, 65462, 64857, 28, +64863, 130, 65005, 247, 65158, 328, 65379, 389, + 56, 387, 270, 322, 410, 166, 493, 2, + 489, 65337, 454, 65155, 374, 65033, 264, 64953, + 127, 65028, 26, 65125, 65439, 65337, 65322, 27, +65224, 286, 65116, 494, 65084, 611, 65050, 628, +65095, 526, 65187, 369, 65396, 116, 74, 65427, + 283, 65191, 499, 65054, 622, 64998, 702, 65012, + 643, 65145, 521, 65295, 263, 65491, 38, 117, +65238, 269, 64984, 369, 64768, 409, 64710, 355, +64763, 265, 64917, 167, 65202, 39, 65529, 65524, + 343, 65406, 601, 65386, 772, 65353, 797, 65363, + 729, 65381, 512, 65356, 249, 65398, 65493, 65373, +65223, 65427, 65031, 65433, 64874, 0, 64873, 76, +64929, 190, 65109, 273, 65274, 342, 65506, 358, + 175, 345, 359, 215, 460, 63, 477, 65435, + 458, 65244, 385, 65109, 303, 64998, 181, 64996, + 51, 65101, 65513, 65243, 65366, 65469, 65294, 179, +65167, 395, 65132, 576, 65086, 607, 65099, 551, +65169, 402, 65324, 186, 65519, 65469, 204, 65263, + 375, 65068, 548, 65014, 629, 65010, 645, 65104, + 547, 65278, 363, 65450, 129, 101, 65383, 230, +65106, 339, 64874, 383, 64743, 358, 64744, 266, +64856, 170, 65066, 49, 65413, 65525, 171, 65446, + 545, 65413, 697, 65376, 843, 65399, 770, 65390, + 648, 65385, 356, 65391, 113, 65366, 65331, 65385, +65115, 65404, 64939, 65480, 64849, 33, 64907, 150, +65006, 245, 65199, 351, 65410, 375, 79, 381, + 293, 286, 410, 142, 485, 65496, 468, 65323, + 402, 65135, 326, 65039, 210, 64993, 91, 65065, + 1, 65198, 65400, 65409, 65321, 94, 65203, 332, +65145, 506, 65095, 576, 65082, 567, 65132, 428, +65247, 266, 65436, 31, 84, 65342, 307, 65165, + 473, 65041, 591, 65030, 661, 65085, 586, 65211, + 488, 65382, 250, 30, 65532, 167, 65262, 301, +64981, 356, 64841, 352, 64719, 307, 64826, 184, +64941, 106, 65259, 65520, 13, 65492, 371, 65397, + 614, 65407, 779, 65383, 806, 65415, 705, 65409, + 513, 65410, 232, 65421, 65487, 65393, 65225, 65431, +64994, 65449, 64885, 1, 64844, 62, 64931, 185, +65074, 252, 65289, 326, 65483, 331, 187, 311, + 343, 186, 451, 58, 498, 65409, 440, 65254, + 402, 65119, 273, 65043, 196, 65067, 38, 65176, +65486, 65332, 65358, 32, 65249, 236, 65184, 434, +65092, 557, 65096, 549, 65089, 480, 65183, 296, +65335, 76, 65508, 65414, 194, 65184, 372, 65088, + 522, 65023, 626, 65084, 617, 65196, 557, 65352, + 360, 0, 127, 148, 65384, 297, 65129, 334, +64885, 377, 64810, 278, 64748, 215, 64908, 68, +65092, 65533, 65401, 65444, 179, 65427, 461, 65378, + 672, 65406, 748, 65413, 730, 65442, 596, 65429, + 375, 65429, 126, 65408, 65392, 65415, 65178, 65441, +65009, 65502, 64914, 38, 64951, 141, 65026, 226, +65188, 305, 65382, 314, 26, 307, 221, 211, + 359, 99, 427, 65462, 438, 65313, 404, 65160, + 340, 65086, 260, 65074, 154, 65163, 37, 65305, +65459, 65508, 65352, 192, 65226, 362, 65143, 529, +65062, 520, 65077, 489, 65089, 325, 65242, 112, +65392, 65465, 74, 65255, 273, 65130, 439, 65072, + 569, 65087, 631, 65208, 603, 65324, 483, 65518, + 274, 99, 16, 259, 65297, 302, 65028, 335, +64857, 283, 64766, 200, 64801, 100, 64956, 15, +65201, 65474, 65522, 65446, 302, 65432, 559, 65417, + 723, 65459, 771, 65453, 707, 65472, 532, 65446, + 292, 65427, 65530, 65396, 65300, 65417, 65076, 65447, +64938, 65521, 64894, 69, 64943, 174, 65068, 244, +65262, 300, 65441, 299, 142, 245, 284, 163, + 429, 65503, 458, 65396, 442, 65185, 418, 65132, + 310, 65060, 221, 65117, 96, 65234, 65512, 65393, +65410, 99, 65296, 268, 65176, 459, 65131, 538, +65060, 501, 65091, 418, 65170, 204, 65288, 29, +65512, 65359, 143, 65187, 353, 65110, 511, 65071, + 598, 65163, 648, 65269, 544, 65437, 397, 50, + 159, 167, 65402, 299, 65166, 300, 64892, 312, +64802, 205, 64741, 148, 64873, 27, 65049, 65498, +65383, 65446, 129, 65423, 454, 65434, 634, 65457, + 756, 65471, 731, 65486, 598, 65480, 402, 65440, + 131, 65426, 65428, 65398, 65180, 65429, 65044, 65484, +64924, 19, 64959, 135, 65038, 200, 65176, 307, +65374, 296, 16, 296, 202, 218, 326, 78, + 404, 65467, 435, 65304, 393, 65170, 353, 65108, + 256, 65086, 159, 65184, 43, 65312, 65472, 65517, +65358, 182, 65244, 352, 65153, 483, 65087, 507, +65074, 436, 65118, 292, 65231, 99, 65409, 65438, + 71, 65285, 269, 65119, 453, 65119, 572, 65104, + 634, 65236, 592, 65339, 479, 65511, 250, 104, + 14, 214, 65273, 300, 65029, 282, 64854, 270, +64777, 171, 64833, 90, 64979, 12, 65252, 65476, + 10, 65451, 310, 65432, 571, 65443, 712, 65451, + 748, 65488, 664, 65463, 490, 65481, 242, 65434, +65514, 65442, 65250, 65436, 65081, 65494, 64914, 2, +64929, 81, 64926, 175, 65107, 214, 65243, 285, +65488, 259, 111, 216, 310, 131, 398, 65503, + 450, 65401, 425, 65236, 379, 65170, 296, 65118, + 205, 65175, 75, 65262, 65513, 65458, 65401, 72, +65307, 297, 65208, 402, 65134, 498, 65100, 455, +65105, 356, 65191, 188, 65313, 65528, 65499, 65368, + 162, 65206, 347, 65142, 508, 65128, 599, 65187, + 620, 65320, 548, 65450, 373, 81, 134, 165, +65407, 275, 65152, 279, 64923, 262, 64801, 211, +64772, 83, 64878, 27, 65090, 65471, 65382, 65413, + 146, 65409, 447, 65392, 647, 65430, 758, 65453, + 729, 65473, 612, 65474, 393, 65485, 127, 65447, +65407, 65474, 65156, 65494, 65030, 0, 64918, 73, +64962, 137, 65029, 210, 65191, 256, 65381, 262, + 41, 221, 200, 133, 336, 30, 416, 65406, + 420, 65302, 388, 65162, 342, 65163, 245, 65166, + 163, 65281, 30, 65402, 65461, 68, 65363, 214, +65254, 390, 65162, 437, 65112, 458, 65084, 366, +65154, 202, 65250, 50, 65409, 65369, 64, 65273, + 252, 65119, 443, 65143, 543, 65142, 615, 65277, + 568, 65418, 450, 8, 241, 165, 65515, 237, +65274, 307, 65037, 279, 64876, 231, 64799, 150, +64858, 46, 65006, 65522, 65281, 65451, 1, 65418, + 310, 65430, 529, 65431, 694, 65460, 705, 65482, + 649, 65484, 462, 65488, 247, 65473, 65507, 65460, +65298, 65483, 65070, 65507, 65021, 29, 64931, 64, +65044, 145, 65114, 186, 65312, 201, 65492, 215, + 106, 136, 282, 69, 325, 65488, 412, 65353, + 355, 65259, 343, 65201, 261, 65195, 192, 65252, + 97, 65375, 65529, 65500, 65438, 160, 65338, 269, +65249, 403, 65159, 387, 65138, 379, 65097, 234, +65194, 100, 65300, 65460, 65468, 65340, 117, 65220, + 295, 65200, 471, 65199, 559, 65299, 587, 65403, + 534, 9, 360, 114, 153, 213, 65404, 262, +65168, 248, 64943, 197, 64841, 119, 64800, 24, +64927, 65500, 65125, 65427, 65420, 65410, 166, 65400, + 416, 65430, 636, 65471, 706, 65496, 705, 65533, + 549, 65510, 375, 65533, 99, 65486, 65412, 65509, +65178, 65517, 65036, 65533, 64977, 53, 65005, 95, +65089, 143, 65232, 175, 65404, 183, 54, 142, + 188, 89, 289, 65532, 362, 65422, 352, 65353, + 344, 65248, 287, 65275, 224, 65274, 155, 65384, + 56, 65482, 65498, 80, 65393, 219, 65310, 292, +65198, 350, 65156, 303, 65103, 225, 65150, 97, +65253, 65502, 65368, 65353, 44, 65286, 181, 65187, + 407, 65247, 513, 65246, 598, 65385, 564, 65468, + 470, 71, 258, 150, 28, 233, 65299, 232, +65069, 221, 64902, 152, 64830, 82, 64882, 1, +65014, 65479, 65277, 65442, 15, 65432, 277, 65436, + 517, 65484, 639, 65504, 675, 65531, 593, 3, + 423, 65528, 193, 65529, 65503, 65510, 65256, 65523, +65116, 65514, 64981, 25, 65013, 37, 65050, 100, +65194, 127, 65346, 148, 65524, 175, 146, 99, + 258, 52, 329, 65495, 357, 65394, 326, 65319, + 305, 65259, 233, 65259, 172, 65316, 89, 65401, + 0, 7, 65456, 114, 65350, 247, 65292, 306, +65188, 319, 65156, 276, 65150, 178, 65211, 60, +65328, 65483, 65489, 65364, 106, 65301, 304, 65282, + 447, 65281, 555, 65366, 554, 65444, 500, 15, + 332, 106, 108, 169, 65404, 200, 65155, 183, +64966, 142, 64862, 52, 64859, 65530, 64978, 65475, +65171, 65448, 65465, 65428, 178, 65453, 424, 65495, + 591, 65509, 658, 18, 620, 65527, 490, 65535, + 291, 65516, 59, 65472, 65376, 65486, 65184, 65465, +65068, 65525, 65020, 4, 65071, 52, 65134, 101, +65310, 147, 65447, 160, 85, 148, 187, 93, + 287, 28, 315, 65469, 326, 65404, 303, 65308, + 246, 65318, 200, 65319, 110, 65404, 66, 65487, +65486, 67, 65422, 164, 65303, 255, 65245, 260, +65158, 236, 65144, 166, 65164, 60, 65270, 65504, +65412, 65391, 19, 65336, 223, 65292, 353, 65323, + 519, 65343, 540, 65438, 525, 65509, 425, 70, + 212, 116, 10, 171, 65280, 150, 65082, 139, +64933, 54, 64886, 24, 64921, 65493, 65098, 65478, +65308, 65462, 67, 65468, 276, 65506, 504, 5, + 601, 5, 634, 40, 535, 65518, 389, 23, + 140, 65485, 65502, 65511, 65259, 65475, 65138, 65486, +65045, 11, 65054, 65532, 65106, 80, 65228, 83, +65364, 131, 1, 136, 113, 91, 243, 47, + 264, 65509, 331, 65443, 299, 65380, 285, 65317, + 217, 65341, 176, 65361, 81, 65472, 29, 65530, +65460, 108, 65367, 192, 65293, 217, 65201, 253, +65152, 159, 65149, 123, 65210, 65534, 65335, 65469, +65483, 65384, 108, 65342, 293, 65349, 429, 65373, + 548, 65435, 527, 65508, 485, 43, 325, 115, + 96, 157, 65438, 150, 65165, 136, 65026, 77, +64903, 27, 64927, 65496, 65004, 65474, 65220, 65441, +65435, 65463, 179, 65474, 357, 65528, 539, 2, + 590, 37, 583, 5, 437, 10, 295, 65497, + 44, 65495, 65422, 65460, 65225, 65474, 65117, 65492, +65063, 1, 65096, 28, 65175, 101, 65275, 115, +65439, 171, 18, 122, 159, 110, 209, 26, + 279, 65495, 271, 65430, 303, 65354, 243, 65343, + 211, 65352, 149, 65423, 71, 65491, 0, 70, +65430, 120, 65336, 205, 65250, 214, 65174, 176, +65142, 137, 65173, 25, 65249, 65496, 65408, 65410, + 15, 65365, 192, 65337, 375, 65372, 484, 65399, + 565, 65486, 496, 8, 410, 81, 225, 125, +65530, 139, 65328, 120, 65069, 86, 64989, 19, +64891, 65522, 64974, 65483, 65108, 65460, 65331, 65473, + 43, 65488, 273, 65528, 439, 20, 572, 30, + 567, 60, 505, 6, 343, 19, 149, 65501, +65502, 65523, 65307, 65477, 65182, 65529, 65100, 65494, +65106, 34, 65160, 27, 65268, 83, 65368, 94, +65531, 88, 88, 59, 187, 20, 236, 65496, + 266, 65461, 269, 65392, 260, 65389, 217, 65399, + 161, 65428, 122, 65510, 35, 18, 65493, 105, +65416, 159, 65287, 167, 65235, 158, 65161, 119, +65151, 45, 65214, 65525, 65307, 65441, 65472, 65412, + 98, 65361, 279, 65396, 421, 65400, 521, 65478, + 508, 65525, 454, 66, 284, 111, 89, 143, +65397, 129, 65198, 122, 65021, 38, 64966, 21, +64957, 65476, 65081, 65466, 65269, 65441, 65500, 65447, + 195, 65472, 366, 65505, 518, 10, 555, 16, + 506, 27, 400, 10, 189, 14, 35, 65531, +65372, 65523, 65245, 65521, 65143, 65505, 65124, 13, +65164, 65528, 65234, 52, 65344, 39, 65464, 94, + 49, 55, 123, 50, 209, 65535, 220, 65508, + 258, 65458, 251, 65423, 213, 65434, 195, 65428, + 119, 65505, 73, 1, 65520, 70, 65439, 133, +65336, 135, 65274, 162, 65184, 91, 65197, 56, +65195, 65529, 65309, 65448, 65421, 65403, 49, 65359, + 182, 65372, 377, 65402, 437, 65457, 515, 65517, + 446, 45, 346, 122, 169, 136, 65506, 165, +65280, 113, 65120, 79, 64986, 7, 64989, 65496, +65011, 65445, 65201, 65437, 65373, 65420, 80, 65469, + 266, 65475, 419, 7, 514, 31, 509, 38, + 420, 61, 285, 31, 92, 31, 65473, 30, +65307, 65517, 65199, 18, 65157, 65528, 65147, 18, +65237, 28, 65298, 36, 65449, 49, 65529, 43, + 110, 18, 161, 65527, 222, 65489, 231, 65452, + 243, 65420, 225, 65422, 193, 65425, 164, 65484, + 96, 1, 28, 60, 65483, 126, 65393, 156, +65306, 156, 65235, 142, 65182, 64, 65199, 21, +65251, 65476, 65376, 65419, 65510, 65375, 122, 65364, + 290, 65381, 398, 65438, 497, 65486, 452, 19, + 403, 93, 217, 132, 50, 172, 65365, 155, +65182, 118, 65057, 68, 64990, 65531, 65041, 65493, +65143, 65434, 65341, 65429, 9, 65413, 200, 65452, + 385, 65474, 462, 65529, 495, 65529, 428, 40, + 305, 8, 144, 55, 65517, 12, 65363, 30, +65259, 17, 65181, 4, 65193, 18, 65210, 13, +65291, 20, 65389, 39, 65477, 8, 49, 19, + 97, 65525, 175, 65507, 183, 65471, 229, 65454, + 216, 65452, 220, 65435, 169, 65500, 130, 65525, + 58, 47, 65507, 112, 65449, 131, 65317, 167, +65276, 131, 65204, 102, 65202, 33, 65248, 65511, +65344, 65461, 65490, 65381, 69, 65385, 242, 65343, + 352, 65423, 437, 65437, 459, 65535, 372, 34, + 290, 109, 78, 142, 65472, 149, 65251, 130, +65140, 84, 65044, 36, 65056, 65513, 65116, 65484, +65276, 65436, 65455, 65449, 121, 65445, 271, 65473, + 404, 65490, 452, 65530, 437, 65533, 359, 26, + 202, 26, 74, 47, 65434, 31, 65332, 48, +65218, 15, 65200, 22, 65227, 17, 65259, 9, +65373, 18, 65435, 2, 11, 1, 92, 0, + 135, 65508, 195, 65496, 181, 65482, 232, 65454, + 190, 65481, 192, 65474, 139, 65527, 98, 24, + 33, 57, 65480, 97, 65414, 102, 65299, 106, +65270, 69, 65186, 48, 65224, 65521, 65275, 65507, +65380, 65443, 8, 65439, 118, 65418, 296, 65443, + 399, 65458, 457, 65520, 423, 65530, 344, 68, + 172, 80, 16, 123, 65342, 107, 65178, 78, +65076, 52, 65030, 65532, 65094, 65512, 65203, 65482, +65379, 65451, 57, 65468, 213, 65457, 365, 65499, + 434, 65506, 452, 65528, 385, 4, 256, 9, + 88, 24, 65511, 35, 65342, 21, 65284, 45, +65185, 10, 65226, 22, 65252, 8, 65339, 12, +65416, 7, 65513, 3, 50, 65533, 123, 65528, + 147, 65526, 180, 65499, 197, 65491, 202, 65480, + 187, 65483, 154, 65496, 136, 9, 47, 14, + 20, 76, 65406, 66, 65379, 94, 65249, 70, +65252, 69, 65193, 22, 65271, 65533, 65356, 65495, +65487, 65468, 101, 65427, 220, 65459, 358, 65420, + 423, 65498, 424, 65494, 337, 17, 233, 60, + 30, 76, 65430, 112, 65221, 91, 65118, 61, +65063, 40, 65096, 65527, 65167, 65508, 65335, 65479, +65504, 65468, 149, 65480, 298, 65487, 376, 65523, + 423, 65530, 379, 14, 298, 38, 155, 22, + 24, 58, 65439, 10, 65321, 37, 65264, 65531, +65227, 12, 65264, 65519, 65324, 65529, 65376, 65518, +65498, 65535, 2, 1, 101, 65530, 136, 3, + 141, 65527, 204, 65511, 159, 65505, 206, 65508, + 142, 65502, 131, 65533, 81, 2, 13, 23, +65482, 55, 65387, 34, 65317, 42, 65262, 30, +65222, 10, 65261, 5, 65308, 65501, 65454, 65498, + 20, 65474, 162, 65479, 288, 65487, 390, 65495, + 406, 2, 386, 8, 259, 53, 133, 62, +65484, 88, 65325, 73, 65169, 44, 65104, 21, +65081, 65505, 65163, 65516, 65287, 65454, 65459, 65484, + 102, 65456, 251, 65503, 371, 65503, 401, 10, + 416, 3, 288, 37, 211, 37, 27, 56, +65467, 45, 65338, 26, 65258, 22, 65241, 65527, +65241, 65521, 65309, 65496, 65363, 65489, 65450, 65505, +65507, 65502, 53, 65529, 89, 65531, 138, 0, + 152, 14, 190, 65533, 178, 14, 185, 65529, + 148, 26, 107, 17, 71, 37, 65508, 34, +65465, 23, 65338, 19, 65308, 5, 65237, 65532, +65270, 65512, 65277, 65512, 65420, 65493, 65508, 65496, + 120, 65495, 235, 65502, 348, 65512, 398, 1, + 402, 2, 291, 38, 184, 47, 12, 73, +65394, 62, 65244, 66, 65139, 17, 65099, 10, +65144, 65497, 65219, 65470, 65386, 65468, 65533, 65442, + 160, 65477, 286, 65482, 358, 65529, 381, 7, + 331, 47, 247, 58, 114, 84, 65531, 99, +65417, 67, 65329, 64, 65273, 13, 65264, 0, +65281, 65500, 65365, 65479, 65411, 65468, 65507, 65472, + 24, 65483, 97, 65505, 137, 65523, 159, 3, + 178, 21, 170, 21, 175, 29, 128, 38, + 100, 23, 43, 35, 65529, 13, 65466, 11, +65380, 65531, 65334, 3, 65282, 65509, 65278, 65526, +65278, 65507, 65368, 65512, 65450, 65502, 52, 65493, + 144, 65508, 259, 65511, 339, 65527, 355, 0, + 328, 19, 230, 43, 81, 67, 65506, 57, +65343, 58, 65219, 34, 65175, 2, 65137, 65516, +65235, 65480, 65316, 65470, 65479, 65465, 80, 65463, + 232, 65489, 314, 65513, 364, 13, 336, 18, + 281, 70, 150, 64, 38, 94, 65452, 71, +65358, 37, 65302, 20, 65277, 65516, 65293, 65503, +65348, 65450, 65398, 65479, 65483, 65450, 65532, 65505, + 50, 65505, 105, 12, 105, 2, 149, 62, + 134, 28, 146, 53, 146, 33, 99, 24, + 92, 34, 28, 65521, 65517, 16, 65440, 65514, +65387, 5, 65303, 65505, 65300, 65533, 65280, 65523, +65337, 65532, 65413, 1, 9, 65521, 86, 65526, + 242, 6, 283, 65529, 367, 7, 309, 65531, + 259, 32, 116, 21, 65530, 51, 65382, 34, +65270, 16, 65170, 20, 65185, 65517, 65183, 65507, +65319, 65478, 65399, 65485, 46, 65470, 150, 65499, + 271, 65501, 323, 65535, 318, 31, 286, 40, + 182, 85, 86, 65, 65502, 85, 65418, 61, +65347, 0, 65309, 4, 65313, 65480, 65352, 65467, +65399, 65448, 65472, 65437, 65509, 65472, 50, 65509, + 62, 65521, 128, 38, 111, 37, 153, 78, + 119, 63, 155, 46, 90, 40, 91, 11, + 29, 8, 65524, 65510, 65477, 65504, 65406, 65491, +65340, 65503, 65321, 65505, 65279, 65522, 65348, 65532, +65362, 65535, 65504, 4, 22, 65533, 170, 8, + 235, 65534, 307, 1, 316, 3, 271, 2, + 181, 26, 52, 33, 65474, 25, 65339, 31, +65256, 13, 65203, 65531, 65214, 65528, 65277, 65487, +65369, 65489, 65521, 65488, 83, 65488, 238, 65498, + 249, 65516, 341, 5, 246, 29, 239, 48, + 90, 69, 16, 68, 65439, 71, 65370, 33, +65329, 19, 65310, 65510, 65347, 65499, 65377, 65459, +65444, 65455, 65501, 65464, 14, 65482, 62, 65514, + 89, 12, 109, 23, 133, 68, 111, 61, + 135, 72, 97, 56, 104, 46, 49, 6, + 19, 8, 65491, 65501, 65461, 65494, 65376, 65481, +65357, 65491, 65314, 65503, 65342, 65524, 65380, 65533, +65475, 21, 10, 65530, 139, 29, 201, 65523, + 287, 12, 293, 6, 268, 65526, 199, 35, + 71, 3, 65497, 44, 65369, 19, 65279, 9, +65227, 11, 65218, 65511, 65271, 65498, 65355, 65469, +65478, 65488, 58, 65474, 175, 65498, 247, 65516, + 289, 1, 262, 37, 216, 64, 125, 84, + 26, 98, 65486, 89, 65392, 58, 65362, 20, +65333, 65520, 65347, 65466, 65388, 65454, 65436, 65419, +65493, 65439, 8, 65456, 55, 65500, 85, 14, + 120, 17, 115, 84, 128, 65, 120, 78, + 101, 70, 81, 15, 30, 39, 16, 65512, +65482, 65512, 65470, 65481, 65381, 65492, 65382, 65470, +65330, 65512, 65364, 65475, 65383, 11, 65459, 65521, + 9, 10, 88, 6, 170, 65533, 243, 34, + 249, 4, 247, 38, 200, 30, 86, 50, + 12, 52, 65403, 43, 65351, 30, 65253, 7, +65269, 65516, 65272, 65473, 65351, 65464, 65456, 65442, + 23, 65463, 140, 65461, 218, 65509, 257, 65520, + 268, 39, 212, 70, 151, 99, 35, 112, +65522, 118, 65399, 78, 65378, 53, 65334, 65530, +65341, 65480, 65383, 65443, 65415, 65409, 65482, 65409, +65534, 65416, 42, 65473, 78, 65498, 104, 24, + 107, 52, 112, 88, 99, 104, 87, 95, + 58, 97, 51, 57, 2, 34, 65521, 6, +65474, 65508, 65430, 65484, 65416, 65478, 65365, 65464, +65391, 65485, 65391, 65485, 65460, 65501, 65523, 65528, + 53, 2, 128, 0, 198, 10, 228, 32, + 218, 25, 198, 65, 103, 53, 35, 65, +65462, 80, 65377, 19, 65307, 43, 65286, 65495, +65284, 65514, 65356, 65434, 65424, 65442, 65534, 65419, + 97, 65452, 156, 65463, 237, 65513, 218, 4, + 208, 62, 143, 106, 65, 124, 65529, 115, +65462, 115, 65400, 62, 65375, 18, 65365, 65491, +65403, 65456, 65413, 65406, 65489, 65428, 65510, 65397, + 39, 65472, 63, 65484, 103, 23, 95, 50, + 106, 77, 109, 107, 68, 88, 85, 79, + 25, 50, 20, 26, 65514, 65535, 65481, 65508, +65448, 65487, 65414, 65465, 65400, 65478, 65384, 65475, +65415, 65495, 65451, 65496, 65521, 65528, 34, 65532, + 114, 3, 159, 9, 196, 31, 195, 39, + 167, 55, 99, 64, 49, 63, 65469, 72, +65420, 33, 65339, 30, 65324, 65511, 65312, 65503, +65363, 65448, 65422, 65443, 65507, 65422, 76, 65450, + 139, 65465, 215, 65510, 220, 13, 207, 51, + 147, 109, 82, 106, 0, 147, 65468, 88, +65405, 90, 65370, 9, 65361, 65513, 65385, 65453, +65414, 65423, 65478, 65397, 65517, 65410, 34, 65432, + 60, 65488, 111, 65527, 98, 47, 106, 73, + 96, 117, 58, 95, 64, 125, 15, 63, + 18, 64, 65508, 3, 65504, 65528, 65461, 65491, +65439, 65468, 65427, 65474, 65401, 65448, 65424, 65496, +65446, 65469, 65511, 65527, 15, 65519, 114, 11, + 121, 9, 205, 32, 182, 46, 178, 50, + 118, 70, 49, 51, 65497, 71, 65427, 40, +65349, 23, 65309, 65530, 65324, 65486, 65332, 65461, +65429, 65428, 65481, 65431, 48, 65422, 130, 65479, + 187, 65479, 224, 32, 191, 21, 164, 137, + 80, 102, 31, 167, 65476, 101, 65446, 103, +65378, 19, 65391, 5, 65386, 65440, 65408, 65444, +65471, 65383, 65503, 65408, 2, 65420, 52, 65470, + 53, 65511, 123, 29, 85, 59, 118, 96, + 94, 116, 73, 96, 66, 90, 12, 45, + 6, 20, 65496, 65521, 65475, 65499, 65426, 65468, +65400, 65465, 65405, 65453, 65395, 65480, 65442, 65474, +65496, 65510, 0, 65510, 101, 65533, 124, 7, + 187, 19, 177, 37, 177, 68, 115, 62, + 52, 105, 65503, 67, 65435, 81, 65360, 29, +65344, 10, 65311, 65493, 65368, 65467, 65398, 65429, +65497, 65431, 16, 65412, 122, 65464, 159, 65472, + 210, 13, 202, 35, 157, 83, 116, 124, + 27, 134, 65526, 129, 65457, 96, 65409, 43, +65400, 65527, 65375, 65482, 65424, 65413, 65429, 65415, +65484, 65370, 65517, 65435, 18, 65435, 54, 65511, + 86, 12, 105, 64, 106, 85, 118, 116, + 78, 100, 85, 95, 30, 78, 9, 21, +65502, 13, 65470, 65510, 65420, 65489, 65404, 65463, +65381, 65456, 65393, 65469, 65435, 65463, 65468, 65493, + 23, 65502, 67, 65528, 153, 5, 188, 28, + 198, 22, 186, 75, 148, 69, 68, 103, + 4, 81, 65442, 66, 65389, 58, 65320, 65526, +65331, 65521, 65324, 65447, 65399, 65425, 65447, 65411, + 4, 65402, 72, 65431, 163, 65468, 180, 65524, + 215, 25, 163, 91, 138, 113, 63, 175, +65534, 132, 65501, 150, 65413, 52, 65406, 37, +65378, 65491, 65387, 65437, 65412, 65410, 65444, 65380, +65489, 65410, 1, 65423, 35, 65486, 96, 65528, + 99, 37, 151, 92, 126, 82, 141, 126, + 95, 100, 67, 87, 12, 56, 65512, 17, +65460, 65532, 65410, 65491, 65396, 65477, 65360, 65453, +65400, 65451, 65409, 65462, 65466, 65470, 10, 65480, + 57, 65515, 133, 65514, 169, 13, 194, 19, + 175, 50, 157, 84, 61, 87, 31, 110, +65452, 87, 65414, 70, 65349, 22, 65337, 65527, +65354, 65460, 65374, 65450, 65443, 65389, 65506, 65433, + 57, 65397, 106, 65484, 178, 65494, 184, 39, + 176, 59, 144, 118, 89, 143, 19, 146, +65526, 126, 65451, 81, 65429, 23, 65397, 65513, +65394, 65454, 65425, 65407, 65426, 65403, 65484, 65391, +65506, 65427, 10, 65468, 63, 65518, 90, 31, + 111, 63, 133, 88, 121, 101, 105, 108, + 67, 87, 23, 73, 65518, 27, 65470, 7, +65434, 65515, 65375, 65484, 65385, 65473, 65366, 65466, +65416, 65457, 65454, 65477, 65522, 65488, 56, 65500, + 133, 65527, 168, 6, 205, 13, 178, 48, + 163, 54, 85, 98, 29, 85, 65479, 96, +65410, 72, 65364, 28, 65346, 65533, 65347, 65480, +65400, 65434, 65441, 65409, 65512, 65393, 43, 65409, + 116, 65431, 151, 65502, 198, 65524, 161, 68, + 140, 91, 91, 153, 19, 141, 65527, 163, +65449, 92, 65431, 78, 65402, 65521, 65392, 65494, +65413, 65410, 65434, 65399, 65466, 65372, 65511, 65407, + 5, 65431, 56, 65493, 88, 18, 123, 45, + 132, 109, 130, 92, 110, 128, 90, 101, + 31, 86, 65534, 48, 65488, 15, 65428, 65517, +65405, 65501, 65369, 65456, 65384, 65462, 65402, 65439, +65446, 65450, 65519, 65465, 29, 65478, 120, 65515, + 160, 0, 182, 7, 188, 45, 141, 64, + 94, 92, 26, 113, 65495, 109, 65415, 93, +65370, 79, 65352, 6, 65348, 65514, 65393, 65455, +65425, 65410, 65510, 65390, 25, 65390, 95, 65409, + 150, 65462, 156, 65515, 179, 29, 137, 93, + 93, 130, 45, 164, 65520, 159, 65501, 138, +65440, 88, 65427, 21, 65410, 65508, 65409, 65437, +65447, 65392, 65443, 65377, 65515, 65381, 65513, 65417, + 44, 65459, 75, 65512, 101, 37, 140, 52, + 118, 109, 135, 93, 87, 117, 55, 89, + 3, 79, 65487, 21, 65444, 22, 65390, 65506, +65376, 65504, 65369, 65457, 65404, 65457, 65427, 65447, +65507, 65463, 25, 65466, 107, 65491, 163, 65518, + 190, 5, 193, 32, 162, 53, 106, 87, + 38, 99, 65498, 119, 65448, 95, 65361, 71, +65372, 34, 65341, 0, 65396, 65461, 65427, 65447, +65502, 65381, 3, 65390, 89, 65406, 127, 65425, + 154, 65489, 169, 13, 126, 50, 118, 125, + 37, 132, 20, 169, 65482, 142, 65465, 120, +65420, 60, 65413, 65528, 65412, 65492, 65415, 65417, +65446, 65394, 65486, 65394, 65506, 65385, 29, 65457, + 67, 65467, 101, 21, 137, 37, 157, 87, + 119, 109, 139, 116, 53, 115, 19, 95, +65503, 49, 65430, 17, 65397, 65530, 65360, 65495, +65344, 65470, 65392, 65445, 65401, 65435, 65514, 65450, + 9, 65461, 115, 65475, 162, 65520, 211, 65530, + 190, 33, 200, 40, 101, 79, 50, 91, +65507, 112, 65426, 99, 65378, 73, 65340, 56, +65334, 65531, 65370, 65518, 65420, 65440, 65476, 65430, + 11, 65403, 74, 65399, 119, 65441, 178, 65463, + 156, 65526, 161, 31, 114, 87, 64, 125, + 18, 151, 65517, 157, 65460, 109, 65458, 94, +65404, 11, 65423, 65513, 65410, 65448, 65442, 65411, +65453, 65385, 65504, 65396, 65534, 65415, 41, 65457, + 98, 65509, 126, 14, 152, 58, 149, 99, + 131, 98, 78, 125, 36, 96, 65511, 86, +65445, 38, 65413, 15, 65343, 65507, 65365, 65498, +65357, 65454, 65415, 65455, 65470, 65445, 3, 65445, + 99, 65473, 149, 65491, 211, 65518, 210, 17, + 181, 32, 156, 62, 53, 97, 1, 99, +65452, 102, 65390, 94, 65357, 41, 65348, 26, +65364, 65504, 65415, 65471, 65463, 65426, 2, 65412, + 45, 65405, 121, 65419, 147, 65465, 156, 65508, + 162, 13, 107, 77, 90, 86, 14, 144, +65524, 116, 65479, 125, 65441, 72, 65431, 40, +65390, 65523, 65429, 65483, 65398, 65454, 65464, 65408, +65471, 65435, 65518, 65426, 31, 65469, 86, 65502, + 122, 6, 166, 23, 161, 77, 158, 70, + 125, 103, 51, 89, 65534, 84, 65471, 53, +65399, 33, 65362, 65532, 65322, 65517, 65345, 65477, +65378, 65461, 65453, 65445, 65519, 65448, 83, 65453, + 149, 65478, 204, 65504, 241, 5, 190, 22, + 182, 65, 74, 83, 5, 109, 65454, 116, +65403, 85, 65340, 74, 65334, 12, 65341, 65519, +65379, 65482, 65456, 65427, 65507, 65420, 33, 65413, + 96, 65429, 147, 65467, 162, 65499, 162, 22, + 126, 46, 99, 102, 39, 104, 0, 126, +65498, 112, 65454, 81, 65446, 48, 65411, 65526, +65416, 65509, 65426, 65452, 65441, 65432, 65459, 65418, +65523, 65418, 1, 65443, 82, 65472, 105, 65508, + 152, 10, 161, 33, 168, 81, 124, 82, + 78, 105, 8, 101, 65492, 66, 65415, 64, +65368, 3, 65333, 65533, 65317, 65482, 65380, 65474, +65410, 65436, 65504, 65458, 53, 65447, 116, 65477, + 212, 65505, 207, 65523, 225, 31, 177, 46, + 100, 87, 34, 92, 65483, 114, 65408, 91, +65366, 77, 65339, 27, 65350, 6, 65381, 65494, +65448, 65472, 65495, 65431, 31, 65422, 80, 65428, + 124, 65450, 165, 65477, 149, 65518, 144, 14, + 96, 51, 61, 87, 7, 101, 65513, 115, +65473, 93, 65446, 77, 65426, 20, 65425, 10, +65403, 65481, 65448, 65469, 65444, 65430, 65503, 65430, +65530, 65442, 44, 65453, 109, 65505, 133, 65514, + 157, 40, 169, 36, 118, 105, 107, 85, + 18, 103, 65508, 97, 65430, 60, 65388, 48, +65337, 65520, 65341, 65515, 65367, 65466, 65409, 65446, +65485, 65433, 34, 65427, 98, 65459, 189, 65474, + 209, 65520, 222, 65530, 186, 48, 123, 68, + 50, 89, 65500, 106, 65443, 96, 65367, 81, +65344, 44, 65356, 15, 65356, 65508, 65434, 65484, +65471, 65446, 6, 65432, 67, 65442, 105, 65441, + 154, 65489, 153, 65502, 131, 18, 120, 30, + 48, 81, 38, 92, 65498, 104, 65491, 101, +65434, 86, 65441, 39, 65402, 24, 65424, 65502, +65419, 65493, 65457, 65444, 65486, 65443, 65528, 65420, + 41, 65453, 88, 65471, 148, 65504, 153, 5, + 177, 24, 139, 71, 110, 76, 45, 107, +65513, 88, 65454, 80, 65398, 45, 65339, 12, +65356, 65521, 65321, 65482, 65421, 65460, 65446, 65436, + 13, 65444, 88, 65457, 150, 65476, 220, 65509, + 214, 65530, 203, 29, 147, 53, 59, 86, +65535, 86, 65435, 101, 65407, 81, 65336, 62, +65362, 30, 65346, 65520, 65415, 65504, 65460, 65467, + 1, 65443, 41, 65437, 113, 65444, 126, 65461, + 181, 65500, 134, 65534, 134, 6, 69, 61, + 35, 69, 65525, 90, 65494, 86, 65448, 81, +65444, 45, 65411, 20, 65433, 65531, 65413, 65484, +65454, 65482, 65470, 65443, 65522, 65456, 22, 65457, + 63, 65476, 135, 65511, 143, 65527, 152, 29, + 158, 51, 88, 60, 74, 93, 65535, 70, +65461, 78, 65427, 60, 65349, 13, 65374, 15, +65334, 65497, 65404, 65499, 65433, 65460, 65528, 65453, + 52, 65454, 135, 65460, 185, 65504, 212, 65503, + 195, 21, 159, 21, 86, 74, 15, 76, +65476, 91, 65410, 81, 65375, 58, 65351, 32, +65370, 65534, 65397, 65510, 65447, 65475, 65505, 65462, + 28, 65453, 72, 65456, 123, 65483, 144, 65493, + 149, 65535, 127, 11, 88, 43, 54, 56, +65528, 70, 65529, 68, 65444, 66, 65459, 40, +65414, 32, 65428, 65527, 65422, 65530, 65435, 65486, +65461, 65490, 65499, 65462, 14, 65490, 39, 65463, + 118, 65521, 143, 65501, 169, 19, 171, 8, + 117, 58, 94, 50, 8, 69, 65506, 71, +65414, 42, 65375, 51, 65338, 65533, 65343, 65529, +65349, 65500, 65432, 65462, 65478, 65481, 46, 65442, + 100, 65482, 190, 65491, 208, 65518, 228, 18, + 173, 24, 125, 67, 37, 68, 65495, 75, +65446, 79, 65353, 40, 65375, 50, 65339, 65516, +65388, 1, 65425, 65462, 65483, 65492, 7, 65445, + 60, 65469, 106, 65480, 152, 65481, 155, 65532, + 162, 6, 115, 23, 90, 48, 25, 58, +65534, 69, 65478, 62, 65455, 52, 65410, 25, +65405, 15, 65393, 65523, 65417, 65507, 65420, 65468, +65489, 65485, 65512, 65454, 47, 65484, 93, 65482, + 146, 65509, 179, 65534, 170, 11, 166, 46, + 77, 65, 76, 79, 65481, 74, 65470, 74, +65358, 31, 65360, 35, 65328, 65521, 65353, 65513, +65392, 65472, 65469, 65464, 6, 65451, 89, 65470, + 157, 65472, 214, 65514, 217, 65526, 219, 33, + 135, 35, 85, 82, 65528, 64, 65467, 84, +65390, 54, 65361, 39, 65331, 12, 65374, 65515, +65387, 65505, 65446, 65480, 65511, 65463, 18, 65486, + 94, 65462, 126, 65503, 166, 65512, 150, 0, + 161, 15, 92, 43, 76, 47, 65528, 63, +65528, 71, 65430, 48, 65440, 48, 65389, 23, +65382, 65533, 65412, 65525, 65391, 65487, 65481, 65482, +65476, 65473, 41, 65466, 73, 65492, 143, 65482, + 178, 65529, 195, 2, 174, 22, 140, 45, + 82, 66, 65525, 56, 65494, 71, 65378, 47, +65373, 20, 65311, 20, 65345, 65505, 65363, 65497, +65427, 65468, 65506, 65462, 44, 65455, 129, 65484, + 192, 65488, 210, 65530, 220, 12, 173, 34, + 105, 62, 39, 78, 65487, 79, 65431, 64, +65368, 61, 65351, 5, 65342, 9, 65387, 65504, +65420, 65481, 65479, 65476, 10, 65454, 51, 65472, + 123, 65480, 144, 65503, 159, 65524, 165, 5, + 128, 23, 96, 51, 43, 62}; diff --git a/chat_receiver.c b/chat_receiver.c new file mode 100644 index 0000000..8c5f323 --- /dev/null +++ b/chat_receiver.c @@ -0,0 +1,47 @@ +////////////////////////////////////////////////////////////////////////////////// +/// \file chat_receiver.c +/// \brief Chat receiver thread +/// \author Pascal Sartoretti (sap at hevs dot ch) +/// \version 1.0 - original +/// \date 2018-02 +////////////////////////////////////////////////////////////////////////////////// +#include "stm32f7xx_hal.h" + +#include +#include +#include "main.h" + +////////////////////////////////////////////////////////////////////////////////// +// THREAD CHAT RECEIVER +////////////////////////////////////////////////////////////////////////////////// +void ChatReceiver(void *argument) +{ + struct queueMsg_t queueMsg; // queue message + osStatus_t retCode; // return error code + + //------------------------------------------------------------------------------ + for (;;) // loop until doomsday + { + //---------------------------------------------------------------------------- + // QUEUE READ + //---------------------------------------------------------------------------- + retCode = osMessageQueueGet( + queue_chatR_id, + &queueMsg, + NULL, + osWaitForever); + queueMsg.type = CHAT_MSG; + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + //---------------------------------------------------------------------------- + // QUEUE SEND + //---------------------------------------------------------------------------- + retCode = osMessageQueuePut( + queue_lcd_id, + &queueMsg, + osPriorityNormal, + osWaitForever); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + } +} + + diff --git a/chat_sender.c b/chat_sender.c new file mode 100644 index 0000000..aaf0499 --- /dev/null +++ b/chat_sender.c @@ -0,0 +1,142 @@ +////////////////////////////////////////////////////////////////////////////////// +/// \file chat_sender.c +/// \brief Chat sender thread +/// \author Pascal Sartoretti (sap at hevs dot ch) +/// \version 1.0 - original +/// \date 2018-02 +////////////////////////////////////////////////////////////////////////////////// +#include "stm32f7xx_hal.h" + +#include +#include +#include +#include "main.h" +#include "ext_keyboard.h" + +////////////////////////////////////////////////////////////////////////////////// +/// \brief Called on interrupt keyboard received char +/// \param The GPIO pin caused interrupt (GPIO_PIN_8) +////////////////////////////////////////////////////////////////////////////////// +void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) +{ + struct queueMsg_t queueMsg; // queue message + osStatus_t retCode; + + if((GPIO_Pin == GPIO_PIN_8)) + { + if(ext_kbChar != 0) + { + queueMsg.addr = ext_kbChar; + //---------------------------------------------------------------------------- + // QUEUE SEND + //---------------------------------------------------------------------------- + retCode = osMessageQueuePut( + queue_keyboard_id, + &queueMsg, + osPriorityNormal, + 0); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + } + } +} +////////////////////////////////////////////////////////////////////////////////// +// THREAD CHAT SENDER +////////////////////////////////////////////////////////////////////////////////// +void ChatSender(void *argument) +{ + struct queueMsg_t queueMsg; // queue message + char * msg; // any string pointer + char msgToSend[255]; // keep message to send + uint8_t msgToSendPtr=0; // counter of received bytes + osStatus_t retCode; // return error code + //------------------------------------------------------------------------------ + // Initialize the keyboard + //------------------------------------------------------------------------------ + Ext_Keyboard_Init(); + + //------------------------------------------------------------------------------ + for (;;) // loop until doomsday + { + //---------------------------------------------------------------------------- + // QUEUE READ + //---------------------------------------------------------------------------- + retCode = osMessageQueueGet( + queue_keyboard_id, + &queueMsg, + NULL, + osWaitForever); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + if((gTokenInterface.connected != FALSE) + &&(gTokenInterface.currentView == MAINDISPLAY)) + { + // message to send --------------------------------------------------------- + if(queueMsg.addr == 0x0D) // a has been received + { + // echo LCD + //------------------------------------------------------------------------ + // MEMORY ALLOCATION + //------------------------------------------------------------------------ + msg = osMemoryPoolAlloc(memPool,osWaitForever); + queueMsg.type = CHAR_MSG; + queueMsg.anyPtr = msg; + msg[0] = 0x0D; // send a CR + msg[1] = 0x0A; // and a LF + msg[2] = 0; + //------------------------------------------------------------------------ + // QUEUE SEND + //------------------------------------------------------------------------ + retCode = osMessageQueuePut( + queue_lcd_id, + &queueMsg, + osPriorityNormal, + osWaitForever); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + + // prepare message to send + msgToSend[msgToSendPtr] = 0; // end of C string + msgToSendPtr = 0; + //------------------------------------------------------------------------ + // MEMORY ALLOCATION + //------------------------------------------------------------------------ + msg = osMemoryPoolAlloc(memPool,osWaitForever); + queueMsg.addr = gTokenInterface.destinationAddress; + queueMsg.sapi = CHAT_SAPI; + queueMsg.type = DATA_IND; + queueMsg.anyPtr = msg; + memcpy(msg,msgToSend,strlen(msgToSend)+1); + //------------------------------------------------------------------------ + // QUEUE SEND + //------------------------------------------------------------------------ + retCode = osMessageQueuePut( + queue_macS_id, + &queueMsg, + osPriorityNormal, + osWaitForever); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + } + // just display char --------------------------------------------------------- + else if (msgToSendPtr < 250) // message size limit + { + //------------------------------------------------------------------------ + // MEMORY ALLOCATION + //------------------------------------------------------------------------ + msg = osMemoryPoolAlloc(memPool,osWaitForever); + queueMsg.type = CHAR_MSG; + queueMsg.anyPtr = msg; + msgToSend[msgToSendPtr] = queueMsg.addr; + msgToSendPtr++; + msg[0] = queueMsg.addr; + msg[1] = 0; + //------------------------------------------------------------------------ + // QUEUE SEND + //------------------------------------------------------------------------ + retCode = osMessageQueuePut( + queue_lcd_id, + &queueMsg, + osPriorityNormal, + osWaitForever); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + } + } + } +} diff --git a/debug.c b/debug.c new file mode 100644 index 0000000..3b50970 --- /dev/null +++ b/debug.c @@ -0,0 +1,246 @@ +////////////////////////////////////////////////////////////////////////////////// +/// \file debug.c +/// \brief Debug thread (simulation of a connected station) +/// \author Pascal Sartoretti (sap at hevs dot ch) +/// \version 1.0 - original +/// \date 2018-02 +////////////////////////////////////////////////////////////////////////////////// +#include "stm32f7xx_hal.h" + +#include +#include +#include "main.h" +#include "ext_led.h" + +extern uint8_t gInBuffer[256]; // generic byte receive buffer + + +////////////////////////////////////////////////////////////////////////////////// +// THREAD DEBUG +////////////////////////////////////////////////////////////////////////////////// +void DebugStation(void *argument) +{ + struct queueMsg_t queueMsg; // queue message + uint8_t * tokenPtr=0; + uint8_t * qPtr; + uint8_t checksum; + uint8_t statusByte; + uint8_t i; + uint8_t * msg; + uint8_t lastDebugAddress=0; + uint8_t waitForDataback=0; + const uint8_t debugMsg[] = "Msg from debug !"; + osStatus_t retCode; + + enum + { + isTOKEN, // a TOKEN frame is received + isSOURCE, // a SOURCE frame is received + isDEST, // a DEST. frame is received + isERROR, // a BAD frame is received + isBROADCAST, + }frameType; + //------------------------------------------------------------------------------ + for (;;) // loop until doomsday + { + //---------------------------------------------------------------------------- + // QUEUE READ + //---------------------------------------------------------------------------- + retCode = osMessageQueueGet( + queue_dbg_id, + &queueMsg, + NULL, + osWaitForever); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + qPtr = queueMsg.anyPtr; + if (qPtr[0]==TOKEN_TAG) + { + frameType = isTOKEN; + } + //---------------------------------------------------------------------------- + else if ((qPtr[1]>>3) == gTokenInterface.debugAddress) // is a dest. frame + { + if(gTokenInterface.debugOnline != FALSE) + { + frameType = isDEST; + } + else + { + frameType = isERROR; // station not connected + } + } + //---------------------------------------------------------------------------- + else if (qPtr[0]>>3 == gTokenInterface.debugAddress) // is it a source frame + { + frameType = isSOURCE; + } + //---------------------------------------------------------------------------- + else if (qPtr[1]>>3 == BROADCAST_ADDRESS) // is it a broadcast + { + frameType = isBROADCAST; + } + //---------------------------------------------------------------------------- + else // is unknow + { + frameType = isERROR; + } + switch(frameType) + { + //**************************************************************************** + case isTOKEN: + qPtr[gTokenInterface.debugAddress+1] = (1 << TIME_SAPI); + if(gTokenInterface.debugOnline != FALSE) + { + qPtr[gTokenInterface.debugAddress+1] |= (1 << gTokenInterface.debugSAPI); + } + if(lastDebugAddress != gTokenInterface.debugAddress) // if address changed + { + qPtr[lastDebugAddress+1] = 0; // update last + lastDebugAddress = gTokenInterface.debugAddress; // set new<->last + } + //-------------------------------------------------------------------------- + if(gTokenInterface.debugMsgToSend != FALSE) + { + waitForDataback = 1; + gTokenInterface.debugMsgToSend = FALSE; + tokenPtr = qPtr; // keep copy of token + //------------------------------------------------------------------------ + // MEMORY ALLOCATION + //------------------------------------------------------------------------ + msg = osMemoryPoolAlloc(memPool,osWaitForever); + msg[0] = (gTokenInterface.debugAddress << 3) | gTokenInterface.debugSAPI; + msg[1] = (gTokenInterface.myAddress << 3) | gTokenInterface.debugSAPI; + msg[2] = sizeof(debugMsg)-1; + memcpy(&msg[3],debugMsg,sizeof(debugMsg)-1); + checksum = 0; + for(i=0;i<(msg[2]+3);i++) // calculate checksum + checksum += msg[i]; + if(gTokenInterface.needSendCRCError != FALSE) + { + checksum += 1; + printf(">> Debug send pseudo error <<\r\n"); + } + else + { + printf(">> Debug send message ok <<\r\n"); + } + checksum = checksum << 2; + msg[sizeof(debugMsg) -1 + 3] = checksum; + queueMsg.anyPtr = msg; + } + break; + //**************************************************************************** + case isDEST: + statusByte = qPtr[qPtr[2] + 3]; + //-------------------------------------------------------------------------- + if((gTokenInterface.needReceiveCRCError != FALSE) && // pseudo error + ((qPtr[1] && 0x03) == gTokenInterface.debugSAPI)) + { + printf(">> Debug answer pseudo error <<\r\n"); + qPtr[qPtr[2] + 3] |= 0x02; // set RD bit + qPtr[qPtr[2] + 3] &= 0xFE; // clear ACK bit + } + //-------------------------------------------------------------------------- + else if((qPtr[1] && 0x03) == gTokenInterface.debugSAPI) // control is OK + { + checksum = 0; + for(i=0;i<(qPtr[2]+3);i++) // calculate checksum + checksum += qPtr[i]; + checksum = checksum << 2; + if(checksum == (statusByte & 0xFC)) // checksum OK + { + printf(">> Debug answer ok <<\r\n"); + qPtr[qPtr[2] + 3] |= 0x03; // set RD & ACK bits + } + else // checksum real error + { + printf(">> Debug answer error detected <<\r\n"); + qPtr[qPtr[2] + 3] |= 0x02; // set RD bit + qPtr[qPtr[2] + 3] &= 0xFE; // clear ACK bit + } + } + //-------------------------------------------------------------------------- + else // bad SAPI + { + } + break; + //**************************************************************************** + case isSOURCE: + if(waitForDataback == 0) // I've send nothing ... + { + break; + } + waitForDataback = 0; + checksum = qPtr[qPtr[2] + 3]; + switch(checksum & 0x03) + { + case 0x03: // all was OK + case 0x01: // or not RD + case 0x00: // or not RD + //------------------------------------------------------------------------ + // MEMORY RELEASE + //------------------------------------------------------------------------ + retCode = osMemoryPoolFree(memPool,qPtr); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + queueMsg.anyPtr = tokenPtr; + break; + case 0x02: // RD but not ACK + waitForDataback = 1; + //------------------------------------------------------------------------ + // MEMORY RELEASE + //------------------------------------------------------------------------ + retCode = osMemoryPoolFree(memPool,qPtr); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + //------------------------------------------------------------------------ + // MEMORY ALLOCATION + //------------------------------------------------------------------------ + msg = osMemoryPoolAlloc(memPool,osWaitForever); + msg[0] = (gTokenInterface.debugAddress << 3) | gTokenInterface.debugSAPI; + msg[1] = (gTokenInterface.myAddress << 3) | gTokenInterface.debugSAPI; + msg[2] = sizeof(debugMsg)-1; + memcpy(&msg[3],debugMsg,sizeof(debugMsg)-1); + checksum = 0; + for(i=0;i<(msg[2]+3);i++) // calculate checksum + checksum += msg[i]; + if(gTokenInterface.needSendCRCError != FALSE) + { + printf(">> Debug RE-send pseudo error <<\r\n"); + checksum += 1; + } + else + { + printf(">> Debug RE-send without error <<\r\n"); + } + checksum = checksum << 2; + msg[sizeof(debugMsg) -1 + 3] = checksum; + queueMsg.anyPtr = msg; + break; + } + break; + default: // IS Error or unknow + break; + } + osDelay(300); // wait 500 ms for simulation delay + qPtr = queueMsg.anyPtr; + if(qPtr[0] == TOKEN_TAG) + { + Ext_LED_PWM(1,100); // token is in station + } + queueMsg.type = FROM_PHY; + //---------------------------------------------------------------------------- + // DEBUG DISPLAY FRAME + //---------------------------------------------------------------------------- + DebugMacFrame('R',qPtr); + //---------------------------------------------------------------------------- + // QUEUE SEND (send message to mac receiver) + //---------------------------------------------------------------------------- + retCode = osMessageQueuePut( + queue_macR_id, + &queueMsg, + osPriorityNormal, + 0); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + } +} + + diff --git a/debuglayer.c b/debuglayer.c new file mode 100644 index 0000000..fda04b9 --- /dev/null +++ b/debuglayer.c @@ -0,0 +1,330 @@ +#include "armebs3.h" /* peripherals definitions */ +#include "mezza_lcd\mezza_lcd.h" /* LCD Mezza library */ +#include /* threadX def. header file */ +#include /* std lib definitions file */ +#include /* standard IO functions */ +#include /* tokenring constants */ + + +/*--------------------------------------------------------------------------*/ +/* EXTERNAL DEFINED GLOBAL VARIABLES */ +/*--------------------------------------------------------------------------*/ +extern UINT8 gDebugSend; +extern UINT8 gDebugAddress; +extern UINT8 gDebugSapi; +extern UINT8 gDebugSendCrcError; +extern UINT8 gDebugReceiveCrcError; +extern UINT8 gInBuffer[300]; +extern UINT8 MYADDRESS; +extern TX_QUEUE gDebug_Q; +extern TX_EVENT_FLAGS_GROUP gEvents_E; + +/****************************************************************************/ +/* Name : CheckRetCodeDebug */ +/*--------------------------------------------------------------------------*/ +/* Inputs : retCode, lineNumber, mode */ +/*--------------------------------------------------------------------------*/ +/* Function : - displays the error when an error happends */ +/****************************************************************************/ +void CheckRetCodeDebug(UINT32 retCode,UINT32 lineNumber,UINT8 mode) +{ + if(retCode != 0) /* when error occurs */ + { + Debug("In Debugger line : ",lineNumber); /* display line number */ + Debug("Error : ",retCode); /* with error number */ + if (mode == HALT) /* when mode is HALT */ + { + while(1){} /* stays here forever */ + } + } +} + +/****************************************************************************/ +/* TaskName : DebugManager */ +/*--------------------------------------------------------------------------*/ +/* Function : - simulate a station with the tokenring interface */ +/****************************************************************************/ +void DebugManager(void) +{ + HEADER msg; + UINT8 *ptr; + UINT8 *tokenPtr; + INT32 retCode; + UINT8 msgStr[]="Test Message from Debug !"; + UINT8 srcControl; + UINT8 dstControl; + UINT8 size; + UINT8 checksum; + UINT8 i; + UINT8 lastDebugAddress; + UINT8 statusByte; + + gDebugSend = 0; + gDebugAddress = 6; + gDebugSapi = 1; + gDebugSendCrcError = 0; + gDebugReceiveCrcError = 0; + lastDebugAddress = gDebugAddress; + /*------------------------------------------------------------------------*/ + while(1) /* forever loop */ + { + /*----------------------------------------------------------------------*/ + /* TX_CALL >>>>>>>>>>>>>>>>> QUEUE READ */ + /*----------------------------------------------------------------------*/ + retCode = tx_queue_receive( + &gDebug_Q, + &msg, + TX_WAIT_FOREVER); + CheckRetCodeDebug(retCode,__LINE__,CONTINUE); + ptr = msg.data.ptr; + /*----------------------------------------------------------------------*/ + /* TOKEN RECEIVED */ + /*----------------------------------------------------------------------*/ + if(*(ptr+1) == TOKEN) + { + ptr[gDebugAddress+2] = (1 << gDebugSapi); /* update dbg SAPI */ + if(lastDebugAddress != gDebugAddress) /* if address changed */ + { + ptr[lastDebugAddress+2] &= ~(1 << gDebugSapi); /* update last */ + lastDebugAddress = gDebugAddress; /* set new<->last */ + } + /*--------------------------------------------------------------------*/ + /* WAIT TO SEND MSG */ + /*--------------------------------------------------------------------*/ + if(gDebugSend == 1) + { + gDebugSend = 0; /* stop send nxt time */ + tokenPtr = ptr; + srcControl = (gDebugAddress << 3) + gDebugSapi; + dstControl = (MYADDRESS << 3) + gDebugSapi; + size = strlen(msgStr); + *gInBuffer = 0x02; + /*------------------------------------------------------------------*/ + /* MSG CREATION */ + /*------------------------------------------------------------------*/ + *(gInBuffer+1) = srcControl; + *(gInBuffer+2) = dstControl; + *(gInBuffer+3) = size; + strcpy(gInBuffer+4,msgStr); + *(gInBuffer+3+size) = 0x0D; + checksum = 0; + for(i=0;i>>>>>>>>>>>>>> EVENT SET */ + /*------------------------------------------------------------------*/ + retCode = tx_event_flags_set( + &gEvents_E, + RS232_FR_EVENT, + TX_OR); + CheckRetCodeDebug(retCode,__LINE__,CONTINUE); + } + /*--------------------------------------------------------------------*/ + /* NO MSG TO SEND */ + /*--------------------------------------------------------------------*/ + else /* token back */ + { + for(i=0;i<19;i++) + { + gInBuffer[i] = *(ptr+i); + } + retCode = tx_byte_release((void*)ptr); + CheckRetCodeDebug(retCode,__LINE__,CONTINUE); + /*------------------------------------------------------------------*/ + /* TX_CALL >>>>>>>>>>>>>>> EVENT SET */ + /*------------------------------------------------------------------*/ + retCode = tx_event_flags_set( + &gEvents_E, + RS232_FR_EVENT, + TX_OR); + CheckRetCodeDebug(retCode,__LINE__,CONTINUE); + } + } + /*----------------------------------------------------------------------*/ + /* DATABACK RECEIVED */ + /*----------------------------------------------------------------------*/ + else if (*(ptr+1)>>3 == gDebugAddress) + { + statusByte = *(ptr+*(ptr+3)+4); + statusByte &= 0x03; + /*--------------------------------------------------------------------*/ + switch(statusByte) + { + /*------------------------------------------------------------------*/ + /* RD = 1, ACK = 1 */ + /*------------------------------------------------------------------*/ + case 0x03: /* RD = 1, ACK = 1 */ + /*----------------------------------------------------------------*/ + /* TX_CALL >>>>>>>>>>>>> MEMORY RELEASE */ + /*----------------------------------------------------------------*/ + retCode = tx_byte_release((void*)ptr); + for(i=0;i<19;i++) + { + gInBuffer[i] = *(tokenPtr+i); + } + /*----------------------------------------------------------------*/ + /* TX_CALL >>>>>>>>>>>>> MEMORY RELEASE */ + /*----------------------------------------------------------------*/ + retCode = tx_byte_release((void*)tokenPtr); + CheckRetCodeDebug(retCode,__LINE__,CONTINUE); + /*----------------------------------------------------------------*/ + /* TX_CALL >>>>>>>>>>>>> EVENT SET */ + /*----------------------------------------------------------------*/ + retCode = tx_event_flags_set( + &gEvents_E, + RS232_FR_EVENT, + TX_OR); + CheckRetCodeDebug(retCode,__LINE__,CONTINUE); + break; + /*------------------------------------------------------------------*/ + /* RD = 1, ACK = 0 */ + /*------------------------------------------------------------------*/ + case 0x02: /* RD = 1, ACK = 0 */ + /*----------------------------------------------------------------*/ + /* TX_CALL >>>>>>>>>>>>> MEMORY RELEASE */ + /*----------------------------------------------------------------*/ + retCode = tx_byte_release((void*)ptr); + srcControl = (gDebugAddress << 3) + gDebugSapi; + dstControl = (MYADDRESS << 3) + CHAT_SAPI; + size = strlen(msgStr); + *gInBuffer = 0x02; + *(gInBuffer+1) = srcControl; + *(gInBuffer+2) = dstControl; + *(gInBuffer+3) = size; + strcpy(gInBuffer+4,msgStr); + *(gInBuffer+3+size) = 0x0D; + checksum = 0; + for(i=0;i>>>>>>>>>>>> EVENT SET */ + /*----------------------------------------------------------------*/ + retCode = tx_event_flags_set( + &gEvents_E, + RS232_FR_EVENT, + TX_OR); + CheckRetCodeDebug(retCode,__LINE__,CONTINUE); + Debug("DBL>> MESSAGE ACK ERROR -> SEND MESSAGE AGAIN ",0); + break; + /*------------------------------------------------------------------*/ + /* RD = 0, ACK = x */ + /*------------------------------------------------------------------*/ + case 0x01: /* RD = 0, ACK = 1 */ + case 0x00: /* RD = 0, ACK = 0 */ + /*----------------------------------------------------------------*/ + /* TX_CALL >>>>>>>>>>>>> MEMORY RELEASE */ + /*----------------------------------------------------------------*/ + retCode = tx_byte_release((void*)ptr); + for(i=0;i<19;i++) + { + gInBuffer[i] = *(tokenPtr+i); + } + /*----------------------------------------------------------------*/ + /* TX_CALL >>>>>>>>>>>>> MEMORY RELEASE */ + /*----------------------------------------------------------------*/ + retCode = tx_byte_release((void*)tokenPtr); + CheckRetCodeDebug(retCode,__LINE__,CONTINUE); + /*----------------------------------------------------------------*/ + /* TX_CALL >>>>>>>>>>>>> EVENT SET */ + /*----------------------------------------------------------------*/ + retCode = tx_event_flags_set( + &gEvents_E, + RS232_FR_EVENT, + TX_OR); + CheckRetCodeDebug(retCode,__LINE__,CONTINUE); + Debug("DBL>> MESSAGE NOT READ -> SEND BACK TOKEN ",0); + break; + } + } + /*----------------------------------------------------------------------*/ + /* MESSAGE RECEIVED */ + /*----------------------------------------------------------------------*/ + else if (*(ptr+2)>>3 == gDebugAddress) + { + statusByte = *(ptr+*(ptr+3)+4); + /*--------------------------------------------------------------------*/ + if((gDebugReceiveCrcError == 1) && /* pseudo error */ + ((*(ptr+2) && 0x03) == gDebugSapi)) + { + *(ptr+*(ptr+3)+4) |= 0x02; /* set RD bit */ + *(ptr+*(ptr+3)+4) &= 0xFE; /* clear ACK bit */ + Debug("DBL>> PSEUDO ACK ERROR ",0); + } + /*--------------------------------------------------------------------*/ + else if((*(ptr+2) && 0x03) == gDebugSapi) /* control is OK */ + { + checksum = 0; + for(i=0;i<*(ptr+3)+3;i++) /* calculate checksum */ + checksum += *(ptr+i+1); + checksum = checksum << 2; + if(checksum == (statusByte & 0xFC)) + { + *(ptr+*(ptr+3)+4) = statusByte | 0x03; /* RD = 1, ACK = 1 */ + Debug("DBL>> ACK OK ",0); + } + else + { + *(ptr+*(ptr+3)+4) = statusByte | 0x02; /* RD = 1, ACK = 0 */ + Debug("DBL>> ACK ERROR ",0); + } + } + /*--------------------------------------------------------------------*/ + else /* bad SAPI */ + { + Debug("DBL>> BAD SAPI ",0); + } + for(i=0;i<*(ptr+3)+6;i++) + { + gInBuffer[i] = *(ptr+i); + } + /*--------------------------------------------------------------------*/ + /* TX_CALL >>>>>>>>>>>>>>> MEMORY RELEASE */ + /*--------------------------------------------------------------------*/ + retCode = tx_byte_release((void*)ptr); + /*--------------------------------------------------------------------*/ + /* TX_CALL >>>>>>>>>>>>>>> EVENT SET */ + /*--------------------------------------------------------------------*/ + retCode = tx_event_flags_set( + &gEvents_E, + RS232_FR_EVENT, + TX_OR); + CheckRetCodeDebug(retCode,__LINE__,CONTINUE); + } + /*----------------------------------------------------------------------*/ + /* ANOTHER FRAME */ + /*----------------------------------------------------------------------*/ + else + { + for(i=0;i<*(ptr+3)+6;i++) /* copy frame */ + { + gInBuffer[i] = *(ptr+i); + } + /*--------------------------------------------------------------------*/ + /* TX_CALL >>>>>>>>>>>>>>> MEMORY RELEASE */ + /*--------------------------------------------------------------------*/ + retCode = tx_byte_release((void*)ptr); + /*--------------------------------------------------------------------*/ + /* TX_CALL >>>>>>>>>>>>>>> EVENT SET */ + /*--------------------------------------------------------------------*/ + retCode = tx_event_flags_set( + &gEvents_E, + RS232_FR_EVENT, + TX_OR); + CheckRetCodeDebug(retCode,__LINE__,CONTINUE); + } + } +} diff --git a/gfxconf.h b/gfxconf.h new file mode 100644 index 0000000..b914123 --- /dev/null +++ b/gfxconf.h @@ -0,0 +1,89 @@ +#ifndef _GFXCONF_H +#define _GFXCONF_H + + +/////////////////////////////////////////////////////////////////////////// +// GOS // +/////////////////////////////////////////////////////////////////////////// +#define GFX_USE_OS_UNKNOWN TRUE +#define GFX_OS_HEAP_SIZE 0 + +#define GFX_COMPILER GFX_COMPILER_KEIL +#define GFX_CPU GFX_CPU_CORTEX_M7_FP +#define GFX_CPU_ENDIAN GFX_CPU_ENDIAN_UNKNOWN + + +/////////////////////////////////////////////////////////////////////////// +// GDISP // +/////////////////////////////////////////////////////////////////////////// +#define GFX_USE_GDISP TRUE + +#define GDISP_NEED_MULTITHREAD TRUE +#define GDISP_NEED_CONTROL TRUE +#define GDISP_NEED_STARTUP_LOGO FALSE +#define GDISP_STARTUP_COLOR HTML2COLOR(0x000000) +#define GDISP_DEFAULT_ORIENTATION GDISP_ROTATE_0 + +#define GDISP_NEED_TEXT TRUE +#define GDISP_NEED_TEXT_WORDWRAP TRUE + #define GDISP_INCLUDE_USER_FONTS TRUE + +#define GDISP_NEED_IMAGE TRUE + #define GDISP_NEED_IMAGE_BMP TRUE + + +/////////////////////////////////////////////////////////////////////////// +// GWIN // +/////////////////////////////////////////////////////////////////////////// +#define GFX_USE_GWIN TRUE + +#define GWIN_NEED_WINDOWMANAGER TRUE + +#define GWIN_NEED_WIDGET TRUE + #define GWIN_NEED_CHECKBOX TRUE + #define GWIN_NEED_IMAGE TRUE + #define GWIN_NEED_LABEL TRUE + #define GWIN_NEED_BUTTON TRUE + #define GWIN_WIDGET_TAGS TRUE + +#define GWIN_NEED_CONTAINERS TRUE + #define GWIN_NEED_CONTAINER TRUE + + +/////////////////////////////////////////////////////////////////////////// +// GEVENT // +/////////////////////////////////////////////////////////////////////////// +#define GFX_USE_GEVENT TRUE + + +/////////////////////////////////////////////////////////////////////////// +// GTIMER // +/////////////////////////////////////////////////////////////////////////// +#define GFX_USE_GTIMER TRUE + + +/////////////////////////////////////////////////////////////////////////// +// GQUEUE // +/////////////////////////////////////////////////////////////////////////// +#define GFX_USE_GQUEUE TRUE + +#define GQUEUE_NEED_ASYNC TRUE + + +/////////////////////////////////////////////////////////////////////////// +// GINPUT // +/////////////////////////////////////////////////////////////////////////// +#define GFX_USE_GINPUT TRUE + +#define GINPUT_NEED_MOUSE TRUE + + +/////////////////////////////////////////////////////////////////////////// +// GFILE // +/////////////////////////////////////////////////////////////////////////// +#define GFX_USE_GFILE TRUE + +#define GFILE_NEED_ROMFS TRUE +#define GFILE_MAX_GFILES 50 + +#endif // _GFXCONF_H diff --git a/gui.c b/gui.c new file mode 100644 index 0000000..17eda9e --- /dev/null +++ b/gui.c @@ -0,0 +1,1088 @@ +#include "gui.h" +#include "rendering_functions.h" +#include "widgetstyles.h" +#include "resources_manager.h" + +GHandle ghPageContainerStartup; +GHandle ghPageContainerMainDisplay; +GHandle ghPageContainerConfigDisplay; +GHandle ghPageContainerAddressSelectDisplay; +GHandle ghLabel_1; +GHandle ghLabel; +GHandle btnToken; +GHandle btnStart; +GHandle ghImagebox; +GHandle ghLabel_4; +GHandle ghLabel_2; +GHandle ghLabel_3; +GHandle btnDestination; +GHandle btnConfiguration; +GHandle lblTime; +GHandle cnslSend; +GHandle cnslReceive; +GHandle lblList; +GHandle btnSendToken; +GHandle cbBroadcastTime; +GHandle btnSendDebug; +GHandle ghLabel_5; +GHandle ghLabel_8; +GHandle ghLabel_7; +GHandle ghLabel_6; +GHandle cbConnectoed; +GHandle cbDebugConnected; +GHandle cbRecCRCError; +GHandle cbSendCRCError; +GHandle lblAddress; +GHandle lblDebug; +GHandle btnSAPIMinus; +GHandle btnADDRESSMinus; +GHandle lblSAPI; +GHandle lblADDR; +GHandle btnSAPIPlus; +GHandle btnADDRESSPlus; +GHandle btnBack; +GHandle ghLabel_11; +GHandle ghRadiobutton; +GHandle ghRadiobutton_1; +GHandle ghRadiobutton_2; +GHandle ghRadiobutton_3; +GHandle ghRadiobutton_4; +GHandle ghRadiobutton_5; +GHandle ghRadiobutton_6; +GHandle ghRadiobutton_7; +GHandle ghRadiobutton_8; +GHandle ghRadiobutton_9; +GHandle ghRadiobutton_10; +GHandle ghRadiobutton_11; +GHandle ghRadiobutton_12; +GHandle ghRadiobutton_13; +GHandle ghRadiobutton_14; +GHandle ghRadiobutton_15; +GHandle btnSelect; + +static bool_t _createPagestartup(void) +{ + GWidgetInit wi; + + gwinWidgetClearInit(&wi); + + // Page container + wi.g.show = FALSE; + wi.g.x = 0; + wi.g.y = 0; + wi.g.width = 480; + wi.g.height = 272; + wi.g.parent = 0; + wi.text = "Container"; + wi.customDraw = background_Display_Background; + wi.customParam = 0; + wi.customStyle = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHPAGECONTAINERSTARTUP_TAG; + #endif + ghPageContainerStartup = gwinContainerCreate(0, &wi, GWIN_CONTAINER_BORDER); + + // ghLabel_1 + wi.g.show = TRUE; + wi.g.x = 365; + wi.g.y = 236; + wi.g.width = 78; + wi.g.height = 17; + wi.g.parent = ghPageContainerStartup; + wi.text = "Rev 1.0a"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHLABEL_1_TAG; + #endif + wi.customStyle = 0; + ghLabel_1 = gwinLabelCreate(0, &wi); + gwinSetFont(ghLabel_1, gstudioGetFont(arial_12)); + + // ghLabel + wi.g.show = TRUE; + wi.g.x = 365; + wi.g.y = 250; + wi.g.width = 113; + wi.g.height = 21; + wi.g.parent = ghPageContainerStartup; + wi.text = "(sap) PTR - 2018"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHLABEL_TAG; + #endif + wi.customStyle = 0; + ghLabel = gwinLabelCreate(0, &wi); + gwinSetFont(ghLabel, gstudioGetFont(arial_12)); + + // btnToken + wi.g.show = TRUE; + wi.g.x = 347; + wi.g.y = 99; + wi.g.width = 120; + wi.g.height = 36; + wi.g.parent = ghPageContainerStartup; + wi.text = "Start system with one token send"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = BTNTOKEN_TAG; + #endif + wi.customStyle = &red_green; + btnToken = gwinButtonCreate(0, &wi); + gwinSetFont(btnToken, gstudioGetFont(arial_12)); + + // btnStart + wi.g.show = TRUE; + wi.g.x = 347; + wi.g.y = 35; + wi.g.width = 120; + wi.g.height = 36; + wi.g.parent = ghPageContainerStartup; + wi.text = "Start system without token"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = BTNSTART_TAG; + #endif + wi.customStyle = 0; + btnStart = gwinButtonCreate(0, &wi); + gwinSetFont(btnStart, gstudioGetFont(arial_12)); + + // ghImagebox + wi.g.show = TRUE; + wi.g.x = 10; + wi.g.y = 19; + wi.g.width = 300; + wi.g.height = 205; + wi.g.parent = ghPageContainerStartup; + wi.text = ""; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHIMAGEBOX_TAG; + #endif + wi.customStyle = 0; + ghImagebox = gwinImageCreate(0, &wi.g); + gwinImageOpenFile(ghImagebox, gstudioGetImageFilePath(token_w)); + + return TRUE; +} + +static bool_t _createPagemainDisplay(void) +{ + GWidgetInit wi; + + gwinWidgetClearInit(&wi); + + // Page container + wi.g.show = FALSE; + wi.g.x = 0; + wi.g.y = 0; + wi.g.width = 480; + wi.g.height = 272; + wi.g.parent = 0; + wi.text = "Container"; + wi.customDraw = background_gray; + wi.customParam = 0; + wi.customStyle = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHPAGECONTAINERMAINDISPLAY_TAG; + #endif + ghPageContainerMainDisplay = gwinContainerCreate(0, &wi, GWIN_CONTAINER_BORDER); + + // ghLabel_4 + wi.g.show = TRUE; + wi.g.x = 243; + wi.g.y = 3; + wi.g.width = 128; + wi.g.height = 20; + wi.g.parent = ghPageContainerMainDisplay; + wi.text = "Received message:"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHLABEL_4_TAG; + #endif + wi.customStyle = &white_on_gray; + ghLabel_4 = gwinLabelCreate(0, &wi); + gwinSetFont(ghLabel_4, gstudioGetFont(arial__14)); + + // ghLabel_2 + wi.g.show = TRUE; + wi.g.x = 3; + wi.g.y = 3; + wi.g.width = 120; + wi.g.height = 20; + wi.g.parent = ghPageContainerMainDisplay; + wi.text = "Message to send:"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHLABEL_2_TAG; + #endif + wi.customStyle = &white_on_gray; + ghLabel_2 = gwinLabelCreate(0, &wi); + gwinSetFont(ghLabel_2, gstudioGetFont(arial__14)); + + // ghLabel_3 + wi.g.show = TRUE; + wi.g.x = 3; + wi.g.y = 247; + wi.g.width = 104; + wi.g.height = 16; + wi.g.parent = ghPageContainerMainDisplay; + wi.text = "Select destination:"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHLABEL_3_TAG; + #endif + wi.customStyle = &white_on_gray; + ghLabel_3 = gwinLabelCreate(0, &wi); + gwinSetFont(ghLabel_3, gstudioGetFont(arial_12)); + + // btnDestination + wi.g.show = TRUE; + wi.g.x = 110; + wi.g.y = 243; + wi.g.width = 110; + wi.g.height = 25; + wi.g.parent = ghPageContainerMainDisplay; + wi.text = "4"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = BTNDESTINATION_TAG; + #endif + wi.customStyle = 0; + btnDestination = gwinButtonCreate(0, &wi); + gwinSetFont(btnDestination, gstudioGetFont(arial__14)); + + // btnConfiguration + wi.g.show = TRUE; + wi.g.x = 374; + wi.g.y = 243; + wi.g.width = 102; + wi.g.height = 25; + wi.g.parent = ghPageContainerMainDisplay; + wi.text = "Config"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = BTNCONFIGURATION_TAG; + #endif + wi.customStyle = 0; + btnConfiguration = gwinButtonCreate(0, &wi); + gwinSetFont(btnConfiguration, gstudioGetFont(arial__14)); + + // lblTime + wi.g.show = TRUE; + wi.g.x = 243; + wi.g.y = 248; + wi.g.width = 120; + wi.g.height = 15; + wi.g.parent = ghPageContainerMainDisplay; + wi.text = "Time is: --:--:--"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = LBLTIME_TAG; + #endif + wi.customStyle = &white_on_gray; + lblTime = gwinLabelCreate(0, &wi); + gwinSetFont(lblTime, gstudioGetFont(arial_12)); + + // cnslSend + wi.g.show = TRUE; + wi.g.x = 3; + wi.g.y = 22; + wi.g.width = 235; + wi.g.height = 182; + wi.g.parent = ghPageContainerMainDisplay; + cnslSend = gwinConsoleCreate(0, &wi.g); + gwinSetFont(cnslSend, gstudioGetFont(arial_12)); + + // cnslReceive + wi.g.show = TRUE; + wi.g.x = 243; + wi.g.y = 22; + wi.g.width = 235; + wi.g.height = 182; + wi.g.parent = ghPageContainerMainDisplay; + cnslReceive = gwinConsoleCreate(0, &wi.g); + gwinSetFont(cnslReceive, gstudioGetFont(arial_12)); + + // lblList + wi.g.show = TRUE; + wi.g.x = 3; + wi.g.y = 203; + wi.g.width = 470; + wi.g.height = 30; + wi.g.parent = ghPageContainerMainDisplay; + wi.text = "Online stations: 0,2,3,7"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = LBLLIST_TAG; + #endif + wi.customStyle = &white_on_gray; + lblList = gwinLabelCreate(0, &wi); + gwinSetFont(lblList, gstudioGetFont(arial__14)); + + return TRUE; +} + +static bool_t _createPageconfigDisplay(void) +{ + GWidgetInit wi; + + gwinWidgetClearInit(&wi); + + // Page container + wi.g.show = FALSE; + wi.g.x = 0; + wi.g.y = 0; + wi.g.width = 480; + wi.g.height = 272; + wi.g.parent = 0; + wi.text = "Container"; + wi.customDraw = background_gray; + wi.customParam = 0; + wi.customStyle = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHPAGECONTAINERCONFIGDISPLAY_TAG; + #endif + ghPageContainerConfigDisplay = gwinContainerCreate(0, &wi, GWIN_CONTAINER_BORDER); + + // btnSendToken + wi.g.show = TRUE; + wi.g.x = 7; + wi.g.y = 86; + wi.g.width = 160; + wi.g.height = 25; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = "Send a token (caution)"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = BTNSENDTOKEN_TAG; + #endif + wi.customStyle = 0; + btnSendToken = gwinButtonCreate(0, &wi); + gwinSetFont(btnSendToken, gstudioGetFont(arial_12)); + + // cbBroadcastTime + wi.g.show = TRUE; + wi.g.x = 7; + wi.g.y = 61; + wi.g.width = 120; + wi.g.height = 20; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = "Broadcast time"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = CBBROADCASTTIME_TAG; + #endif + wi.customStyle = &white_on_gray; + cbBroadcastTime = gwinCheckboxCreate(0, &wi); + gwinCheckboxCheck(cbBroadcastTime, FALSE); + gwinSetFont(cbBroadcastTime, gstudioGetFont(arial_12)); + + // btnSendDebug + wi.g.show = TRUE; + wi.g.x = 197; + wi.g.y = 111; + wi.g.width = 160; + wi.g.height = 25; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = "Send debug message"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = BTNSENDDEBUG_TAG; + #endif + wi.customStyle = 0; + btnSendDebug = gwinButtonCreate(0, &wi); + gwinSetFont(btnSendDebug, gstudioGetFont(arial__14)); + + // ghLabel_5 + wi.g.show = TRUE; + wi.g.x = 7; + wi.g.y = 4; + wi.g.width = 136; + wi.g.height = 30; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = "Station control:"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHLABEL_5_TAG; + #endif + wi.customStyle = &white_on_gray; + ghLabel_5 = gwinLabelCreate(0, &wi); + gwinSetFont(ghLabel_5, gstudioGetFont(arial__14)); + + // ghLabel_8 + wi.g.show = TRUE; + wi.g.x = 197; + wi.g.y = 183; + wi.g.width = 100; + wi.g.height = 30; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = "Debug address"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHLABEL_8_TAG; + #endif + wi.customStyle = &white_on_gray; + ghLabel_8 = gwinLabelCreate(0, &wi); + gwinSetFont(ghLabel_8, gstudioGetFont(arial_12)); + + // ghLabel_7 + wi.g.show = TRUE; + wi.g.x = 197; + wi.g.y = 151; + wi.g.width = 80; + wi.g.height = 20; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = "Debug SAPI"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHLABEL_7_TAG; + #endif + wi.customStyle = &white_on_gray; + ghLabel_7 = gwinLabelCreate(0, &wi); + gwinSetFont(ghLabel_7, gstudioGetFont(arial_12)); + + // ghLabel_6 + wi.g.show = TRUE; + wi.g.x = 197; + wi.g.y = 4; + wi.g.width = 120; + wi.g.height = 30; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = "Debug control:"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHLABEL_6_TAG; + #endif + wi.customStyle = &white_on_gray; + ghLabel_6 = gwinLabelCreate(0, &wi); + gwinSetFont(ghLabel_6, gstudioGetFont(arial__14)); + + // cbConnectoed + wi.g.show = TRUE; + wi.g.x = 7; + wi.g.y = 36; + wi.g.width = 156; + wi.g.height = 19; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = "Station connected"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = CBCONNECTOED_TAG; + #endif + wi.customStyle = &white_on_gray; + cbConnectoed = gwinCheckboxCreate(0, &wi); + gwinCheckboxCheck(cbConnectoed, TRUE); + gwinSetFont(cbConnectoed, gstudioGetFont(arial_12)); + + // cbDebugConnected + wi.g.show = TRUE; + wi.g.x = 197; + wi.g.y = 36; + wi.g.width = 212; + wi.g.height = 20; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = "Debug station connected"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = CBDEBUGCONNECTED_TAG; + #endif + wi.customStyle = &white_on_gray; + cbDebugConnected = gwinCheckboxCreate(0, &wi); + gwinCheckboxCheck(cbDebugConnected, TRUE); + gwinSetFont(cbDebugConnected, gstudioGetFont(arial_12)); + + // cbRecCRCError + wi.g.show = TRUE; + wi.g.x = 197; + wi.g.y = 61; + wi.g.width = 160; + wi.g.height = 20; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = "Receive CRC error"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = CBRECCRCERROR_TAG; + #endif + wi.customStyle = &white_on_gray; + cbRecCRCError = gwinCheckboxCreate(0, &wi); + gwinCheckboxCheck(cbRecCRCError, FALSE); + gwinSetFont(cbRecCRCError, gstudioGetFont(arial_12)); + + // cbSendCRCError + wi.g.show = TRUE; + wi.g.x = 197; + wi.g.y = 86; + wi.g.width = 160; + wi.g.height = 20; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = "Send a bad CRC"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = CBSENDCRCERROR_TAG; + #endif + wi.customStyle = &white_on_gray; + cbSendCRCError = gwinCheckboxCreate(0, &wi); + gwinCheckboxCheck(cbSendCRCError, FALSE); + gwinSetFont(cbSendCRCError, gstudioGetFont(arial_12)); + + // lblAddress + wi.g.show = TRUE; + wi.g.x = 7; + wi.g.y = 151; + wi.g.width = 120; + wi.g.height = 30; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = "Local address is: 2"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = LBLADDRESS_TAG; + #endif + wi.customStyle = &white_on_gray; + lblAddress = gwinLabelCreate(0, &wi); + gwinSetFont(lblAddress, gstudioGetFont(arial_12)); + + // lblDebug + wi.g.show = TRUE; + wi.g.x = 7; + wi.g.y = 183; + wi.g.width = 132; + wi.g.height = 30; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = "Debug mode is: ON"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = LBLDEBUG_TAG; + #endif + wi.customStyle = &white_on_gray; + lblDebug = gwinLabelCreate(0, &wi); + gwinSetFont(lblDebug, gstudioGetFont(arial_12)); + + // btnSAPIMinus + wi.g.show = TRUE; + wi.g.x = 314; + wi.g.y = 147; + wi.g.width = 25; + wi.g.height = 25; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = "-"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = BTNSAPIMINUS_TAG; + #endif + wi.customStyle = 0; + btnSAPIMinus = gwinButtonCreate(0, &wi); + gwinSetFont(btnSAPIMinus, gstudioGetFont(arial__14)); + + // btnADDRESSMinus + wi.g.show = TRUE; + wi.g.x = 314; + wi.g.y = 183; + wi.g.width = 25; + wi.g.height = 25; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = "-"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = BTNADDRESSMINUS_TAG; + #endif + wi.customStyle = 0; + btnADDRESSMinus = gwinButtonCreate(0, &wi); + gwinSetFont(btnADDRESSMinus, gstudioGetFont(arial__14)); + + // lblSAPI + wi.g.show = TRUE; + wi.g.x = 354; + wi.g.y = 147; + wi.g.width = 25; + wi.g.height = 25; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = " 1"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = LBLSAPI_TAG; + #endif + wi.customStyle = &red_green; + lblSAPI = gwinLabelCreate(0, &wi); + gwinSetFont(lblSAPI, gstudioGetFont(arial__14)); + + // lblADDR + wi.g.show = TRUE; + wi.g.x = 354; + wi.g.y = 183; + wi.g.width = 25; + wi.g.height = 25; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = " 7"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = LBLADDR_TAG; + #endif + wi.customStyle = 0; + lblADDR = gwinLabelCreate(0, &wi); + gwinSetFont(lblADDR, gstudioGetFont(arial__14)); + + // btnSAPIPlus + wi.g.show = TRUE; + wi.g.x = 395; + wi.g.y = 148; + wi.g.width = 25; + wi.g.height = 25; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = "+"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = BTNSAPIPLUS_TAG; + #endif + wi.customStyle = 0; + btnSAPIPlus = gwinButtonCreate(0, &wi); + gwinSetFont(btnSAPIPlus, gstudioGetFont(arial__14)); + + // btnADDRESSPlus + wi.g.show = TRUE; + wi.g.x = 395; + wi.g.y = 183; + wi.g.width = 25; + wi.g.height = 25; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = "+"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = BTNADDRESSPLUS_TAG; + #endif + wi.customStyle = 0; + btnADDRESSPlus = gwinButtonCreate(0, &wi); + gwinSetFont(btnADDRESSPlus, gstudioGetFont(arial__14)); + + // btnBack + wi.g.show = TRUE; + wi.g.x = 394; + wi.g.y = 243; + wi.g.width = 80; + wi.g.height = 25; + wi.g.parent = ghPageContainerConfigDisplay; + wi.text = "Back"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = BTNBACK_TAG; + #endif + wi.customStyle = 0; + btnBack = gwinButtonCreate(0, &wi); + gwinSetFont(btnBack, gstudioGetFont(arial__14)); + + return TRUE; +} + +static bool_t _createPageaddressSelectDisplay(void) +{ + GWidgetInit wi; + + gwinWidgetClearInit(&wi); + + // Page container + wi.g.show = FALSE; + wi.g.x = 0; + wi.g.y = 0; + wi.g.width = 480; + wi.g.height = 272; + wi.g.parent = 0; + wi.text = "Container"; + wi.customDraw = background_gray; + wi.customParam = 0; + wi.customStyle = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHPAGECONTAINERADDRESSSELECTDISPLAY_TAG; + #endif + ghPageContainerAddressSelectDisplay = gwinContainerCreate(0, &wi, GWIN_CONTAINER_BORDER); + + // ghLabel_11 + wi.g.show = TRUE; + wi.g.x = 15; + wi.g.y = 4; + wi.g.width = 221; + wi.g.height = 30; + wi.g.parent = ghPageContainerAddressSelectDisplay; + wi.text = "Select destination address:"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHLABEL_11_TAG; + #endif + wi.customStyle = &white_on_gray; + ghLabel_11 = gwinLabelCreate(0, &wi); + gwinSetFont(ghLabel_11, gstudioGetFont(arial__14)); + + // ghRadiobutton + wi.g.show = TRUE; + wi.g.x = 52; + wi.g.y = 73; + wi.g.width = 90; + wi.g.height = 25; + wi.g.parent = ghPageContainerAddressSelectDisplay; + wi.text = "Station 1"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHRADIOBUTTON_TAG; + #endif + wi.customStyle = &white_on_gray; + ghRadiobutton = gwinRadioCreate(0, &wi, 0); + gwinSetFont(ghRadiobutton, gstudioGetFont(arial_12)); + + // ghRadiobutton_1 + wi.g.show = TRUE; + wi.g.x = 52; + wi.g.y = 103; + wi.g.width = 90; + wi.g.height = 25; + wi.g.parent = ghPageContainerAddressSelectDisplay; + wi.text = "Station 2"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHRADIOBUTTON_1_TAG; + #endif + wi.customStyle = &white_on_gray; + ghRadiobutton_1 = gwinRadioCreate(0, &wi, 0); + gwinRadioPress(ghRadiobutton_1); + gwinSetFont(ghRadiobutton_1, gstudioGetFont(arial_12)); + + // ghRadiobutton_2 + wi.g.show = TRUE; + wi.g.x = 52; + wi.g.y = 133; + wi.g.width = 90; + wi.g.height = 25; + wi.g.parent = ghPageContainerAddressSelectDisplay; + wi.text = "Station 3"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHRADIOBUTTON_2_TAG; + #endif + wi.customStyle = &white_on_gray; + ghRadiobutton_2 = gwinRadioCreate(0, &wi, 0); + gwinSetFont(ghRadiobutton_2, gstudioGetFont(arial_12)); + + // ghRadiobutton_3 + wi.g.show = TRUE; + wi.g.x = 52; + wi.g.y = 163; + wi.g.width = 90; + wi.g.height = 25; + wi.g.parent = ghPageContainerAddressSelectDisplay; + wi.text = "Station 4"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHRADIOBUTTON_3_TAG; + #endif + wi.customStyle = &white_on_gray; + ghRadiobutton_3 = gwinRadioCreate(0, &wi, 0); + gwinSetFont(ghRadiobutton_3, gstudioGetFont(arial_12)); + + // ghRadiobutton_4 + wi.g.show = TRUE; + wi.g.x = 147; + wi.g.y = 73; + wi.g.width = 90; + wi.g.height = 25; + wi.g.parent = ghPageContainerAddressSelectDisplay; + wi.text = "Station 5"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHRADIOBUTTON_4_TAG; + #endif + wi.customStyle = &white_on_gray; + ghRadiobutton_4 = gwinRadioCreate(0, &wi, 0); + gwinSetFont(ghRadiobutton_4, gstudioGetFont(arial_12)); + + // ghRadiobutton_5 + wi.g.show = TRUE; + wi.g.x = 147; + wi.g.y = 103; + wi.g.width = 90; + wi.g.height = 25; + wi.g.parent = ghPageContainerAddressSelectDisplay; + wi.text = "Station 6"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHRADIOBUTTON_5_TAG; + #endif + wi.customStyle = &white_on_gray; + ghRadiobutton_5 = gwinRadioCreate(0, &wi, 0); + gwinSetFont(ghRadiobutton_5, gstudioGetFont(arial_12)); + + // ghRadiobutton_6 + wi.g.show = TRUE; + wi.g.x = 147; + wi.g.y = 133; + wi.g.width = 90; + wi.g.height = 25; + wi.g.parent = ghPageContainerAddressSelectDisplay; + wi.text = "Station 7"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHRADIOBUTTON_6_TAG; + #endif + wi.customStyle = &white_on_gray; + ghRadiobutton_6 = gwinRadioCreate(0, &wi, 0); + gwinSetFont(ghRadiobutton_6, gstudioGetFont(arial_12)); + + // ghRadiobutton_7 + wi.g.show = TRUE; + wi.g.x = 147; + wi.g.y = 163; + wi.g.width = 90; + wi.g.height = 25; + wi.g.parent = ghPageContainerAddressSelectDisplay; + wi.text = "Station 8"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHRADIOBUTTON_7_TAG; + #endif + wi.customStyle = &white_on_gray; + ghRadiobutton_7 = gwinRadioCreate(0, &wi, 0); + gwinSetFont(ghRadiobutton_7, gstudioGetFont(arial_12)); + + // ghRadiobutton_8 + wi.g.show = TRUE; + wi.g.x = 242; + wi.g.y = 73; + wi.g.width = 90; + wi.g.height = 25; + wi.g.parent = ghPageContainerAddressSelectDisplay; + wi.text = "Station 9"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHRADIOBUTTON_8_TAG; + #endif + wi.customStyle = &white_on_gray; + ghRadiobutton_8 = gwinRadioCreate(0, &wi, 0); + gwinSetFont(ghRadiobutton_8, gstudioGetFont(arial_12)); + + // ghRadiobutton_9 + wi.g.show = TRUE; + wi.g.x = 242; + wi.g.y = 103; + wi.g.width = 90; + wi.g.height = 25; + wi.g.parent = ghPageContainerAddressSelectDisplay; + wi.text = "Station 10"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHRADIOBUTTON_9_TAG; + #endif + wi.customStyle = &white_on_gray; + ghRadiobutton_9 = gwinRadioCreate(0, &wi, 0); + gwinSetFont(ghRadiobutton_9, gstudioGetFont(arial_12)); + + // ghRadiobutton_10 + wi.g.show = TRUE; + wi.g.x = 242; + wi.g.y = 133; + wi.g.width = 90; + wi.g.height = 25; + wi.g.parent = ghPageContainerAddressSelectDisplay; + wi.text = "Station 11"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHRADIOBUTTON_10_TAG; + #endif + wi.customStyle = &white_on_gray; + ghRadiobutton_10 = gwinRadioCreate(0, &wi, 0); + gwinSetFont(ghRadiobutton_10, gstudioGetFont(arial_12)); + + // ghRadiobutton_11 + wi.g.show = TRUE; + wi.g.x = 242; + wi.g.y = 163; + wi.g.width = 90; + wi.g.height = 25; + wi.g.parent = ghPageContainerAddressSelectDisplay; + wi.text = "Station 12"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHRADIOBUTTON_11_TAG; + #endif + wi.customStyle = &white_on_gray; + ghRadiobutton_11 = gwinRadioCreate(0, &wi, 0); + gwinSetFont(ghRadiobutton_11, gstudioGetFont(arial_12)); + + // ghRadiobutton_12 + wi.g.show = TRUE; + wi.g.x = 340; + wi.g.y = 73; + wi.g.width = 90; + wi.g.height = 25; + wi.g.parent = ghPageContainerAddressSelectDisplay; + wi.text = "Station 13"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHRADIOBUTTON_12_TAG; + #endif + wi.customStyle = &white_on_gray; + ghRadiobutton_12 = gwinRadioCreate(0, &wi, 0); + gwinSetFont(ghRadiobutton_12, gstudioGetFont(arial_12)); + + // ghRadiobutton_13 + wi.g.show = TRUE; + wi.g.x = 340; + wi.g.y = 103; + wi.g.width = 90; + wi.g.height = 25; + wi.g.parent = ghPageContainerAddressSelectDisplay; + wi.text = "Station 14"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHRADIOBUTTON_13_TAG; + #endif + wi.customStyle = &white_on_gray; + ghRadiobutton_13 = gwinRadioCreate(0, &wi, 0); + gwinSetFont(ghRadiobutton_13, gstudioGetFont(arial_12)); + + // ghRadiobutton_14 + wi.g.show = TRUE; + wi.g.x = 340; + wi.g.y = 133; + wi.g.width = 90; + wi.g.height = 25; + wi.g.parent = ghPageContainerAddressSelectDisplay; + wi.text = "Station 15"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHRADIOBUTTON_14_TAG; + #endif + wi.customStyle = &white_on_gray; + ghRadiobutton_14 = gwinRadioCreate(0, &wi, 0); + gwinSetFont(ghRadiobutton_14, gstudioGetFont(arial_12)); + + // ghRadiobutton_15 + wi.g.show = TRUE; + wi.g.x = 340; + wi.g.y = 163; + wi.g.width = 90; + wi.g.height = 25; + wi.g.parent = ghPageContainerAddressSelectDisplay; + wi.text = "Broadcast"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = GHRADIOBUTTON_15_TAG; + #endif + wi.customStyle = &white_on_gray; + ghRadiobutton_15 = gwinRadioCreate(0, &wi, 0); + gwinSetFont(ghRadiobutton_15, gstudioGetFont(arial_12)); + + // btnSelect + wi.g.show = TRUE; + wi.g.x = 178; + wi.g.y = 228; + wi.g.width = 120; + wi.g.height = 30; + wi.g.parent = ghPageContainerAddressSelectDisplay; + wi.text = "Select"; + wi.customDraw = 0; + wi.customParam = 0; + #if GWIN_WIDGET_TAGS + wi.tag = BTNSELECT_TAG; + #endif + wi.customStyle = 0; + btnSelect = gwinButtonCreate(0, &wi); + gwinSetFont(btnSelect, gstudioGetFont(arial__14)); + + return TRUE; +} + +void guiShowPage(guiPage page) +{ + // Hide all pages + gwinHide(ghPageContainerStartup); + gwinHide(ghPageContainerMainDisplay); + gwinHide(ghPageContainerConfigDisplay); + gwinHide(ghPageContainerAddressSelectDisplay); + + // Show the selected page + switch (page) { + case STARTUP: + gwinShow(ghPageContainerStartup); + break; + + case MAINDISPLAY: + gwinShow(ghPageContainerMainDisplay); + break; + + case CONFIGDISPLAY: + gwinShow(ghPageContainerConfigDisplay); + break; + + case ADDRESSSELECTDISPLAY: + gwinShow(ghPageContainerAddressSelectDisplay); + break; + + default: + break; + } +} + +bool_t guiInit(void) +{ + // Initialize resources + if (!guiResourcesManagerInit()) { + return FALSE; + } + + // Set GWIN default values + gwinSetDefaultStyle(&WhiteWidgetStyle, FALSE); + + // Create display pages + _createPagestartup(); + _createPagemainDisplay(); + _createPageconfigDisplay(); + _createPageaddressSelectDisplay(); + + return TRUE; +} + diff --git a/gui.h b/gui.h new file mode 100644 index 0000000..a6cd1dd --- /dev/null +++ b/gui.h @@ -0,0 +1,138 @@ +#ifndef _GUI_H +#define _GUI_H +#include +#include "gfx.h" + +typedef enum guiPage { + STARTUP, + MAINDISPLAY, + CONFIGDISPLAY, + ADDRESSSELECTDISPLAY, +} guiPage; + +// Widget tags +#define GHPAGECONTAINERSTARTUP_TAG 0 +#define GHPAGECONTAINERMAINDISPLAY_TAG 0 +#define GHPAGECONTAINERCONFIGDISPLAY_TAG 0 +#define GHPAGECONTAINERADDRESSSELECTDISPLAY_TAG 0 +#define GHLABEL_1_TAG 0 +#define GHLABEL_TAG 0 +#define BTNTOKEN_TAG 0 +#define BTNSTART_TAG 0 +#define GHIMAGEBOX_TAG 0 +#define GHLABEL_4_TAG 0 +#define GHLABEL_2_TAG 0 +#define GHLABEL_3_TAG 0 +#define BTNDESTINATION_TAG 0 +#define BTNCONFIGURATION_TAG 0 +#define LBLTIME_TAG 0 +#define LBLLIST_TAG 0 +#define BTNSENDTOKEN_TAG 0 +#define CBBROADCASTTIME_TAG 0 +#define BTNSENDDEBUG_TAG 0 +#define GHLABEL_5_TAG 0 +#define GHLABEL_8_TAG 0 +#define GHLABEL_7_TAG 0 +#define GHLABEL_6_TAG 0 +#define CBCONNECTOED_TAG 0 +#define CBDEBUGCONNECTED_TAG 0 +#define CBRECCRCERROR_TAG 0 +#define CBSENDCRCERROR_TAG 0 +#define LBLADDRESS_TAG 0 +#define LBLDEBUG_TAG 0 +#define BTNSAPIMINUS_TAG 0 +#define BTNADDRESSMINUS_TAG 0 +#define LBLSAPI_TAG 0 +#define LBLADDR_TAG 0 +#define BTNSAPIPLUS_TAG 0 +#define BTNADDRESSPLUS_TAG 0 +#define BTNBACK_TAG 0 +#define GHLABEL_11_TAG 0 +#define GHRADIOBUTTON_TAG 0 +#define GHRADIOBUTTON_1_TAG 1 +#define GHRADIOBUTTON_2_TAG 2 +#define GHRADIOBUTTON_3_TAG 3 +#define GHRADIOBUTTON_4_TAG 4 +#define GHRADIOBUTTON_5_TAG 5 +#define GHRADIOBUTTON_6_TAG 6 +#define GHRADIOBUTTON_7_TAG 7 +#define GHRADIOBUTTON_8_TAG 8 +#define GHRADIOBUTTON_9_TAG 9 +#define GHRADIOBUTTON_10_TAG 10 +#define GHRADIOBUTTON_11_TAG 11 +#define GHRADIOBUTTON_12_TAG 12 +#define GHRADIOBUTTON_13_TAG 13 +#define GHRADIOBUTTON_14_TAG 14 +#define GHRADIOBUTTON_15_TAG 15 +#define BTNSELECT_TAG 0 + +// Widget handles +extern GHandle ghPageContainerStartup; +extern GHandle ghPageContainerMainDisplay; +extern GHandle ghPageContainerConfigDisplay; +extern GHandle ghPageContainerAddressSelectDisplay; +extern GHandle ghLabel_1; +extern GHandle ghLabel; +extern GHandle btnToken; +extern GHandle btnStart; +extern GHandle ghImagebox; +extern GHandle ghLabel_4; +extern GHandle ghLabel_2; +extern GHandle ghLabel_3; +extern GHandle btnDestination; +extern GHandle btnConfiguration; +extern GHandle lblTime; +extern GHandle cnslSend; +extern GHandle cnslReceive; +extern GHandle lblList; +extern GHandle btnSendToken; +extern GHandle cbBroadcastTime; +extern GHandle btnSendDebug; +extern GHandle ghLabel_5; +extern GHandle ghLabel_8; +extern GHandle ghLabel_7; +extern GHandle ghLabel_6; +extern GHandle cbConnectoed; +extern GHandle cbDebugConnected; +extern GHandle cbRecCRCError; +extern GHandle cbSendCRCError; +extern GHandle lblAddress; +extern GHandle lblDebug; +extern GHandle btnSAPIMinus; +extern GHandle btnADDRESSMinus; +extern GHandle lblSAPI; +extern GHandle lblADDR; +extern GHandle btnSAPIPlus; +extern GHandle btnADDRESSPlus; +extern GHandle btnBack; +extern GHandle ghLabel_11; +extern GHandle ghRadiobutton; +extern GHandle ghRadiobutton_1; +extern GHandle ghRadiobutton_2; +extern GHandle ghRadiobutton_3; +extern GHandle ghRadiobutton_4; +extern GHandle ghRadiobutton_5; +extern GHandle ghRadiobutton_6; +extern GHandle ghRadiobutton_7; +extern GHandle ghRadiobutton_8; +extern GHandle ghRadiobutton_9; +extern GHandle ghRadiobutton_10; +extern GHandle ghRadiobutton_11; +extern GHandle ghRadiobutton_12; +extern GHandle ghRadiobutton_13; +extern GHandle ghRadiobutton_14; +extern GHandle ghRadiobutton_15; +extern GHandle btnSelect; + +#ifdef __cplusplus +extern "C" { +#endif + + bool_t guiInit(void); + void guiShowPage(guiPage page); + +#ifdef __cplusplus +} +#endif + +#endif // _GUI_H diff --git a/i2c.c b/i2c.c new file mode 100644 index 0000000..270060b --- /dev/null +++ b/i2c.c @@ -0,0 +1,157 @@ +/** + ****************************************************************************** + * File Name : I2C.c + * Description : This file provides code for the configuration + * of the I2C instances. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "i2c.h" + + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +I2C_HandleTypeDef hi2c3; + +/* I2C3 init function */ +void MX_I2C3_Init(void) +{ + + hi2c3.Instance = I2C3; + hi2c3.Init.Timing = 0x00501E63; + hi2c3.Init.OwnAddress1 = 0; + hi2c3.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c3.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c3.Init.OwnAddress2 = 0; + hi2c3.Init.OwnAddress2Masks = I2C_OA2_NOMASK; + hi2c3.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c3.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c3) != HAL_OK) + { + for(;;){} + } + + /**Configure Analogue filter + */ + if (HAL_I2CEx_ConfigAnalogFilter(&hi2c3, I2C_ANALOGFILTER_DISABLE) != HAL_OK) + { + for(;;){} + } + + /**Configure Digital filter + */ + if (HAL_I2CEx_ConfigDigitalFilter(&hi2c3, 0) != HAL_OK) + { + for(;;){} + } + +} + +void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct; + if(i2cHandle->Instance==I2C3) + { + /* USER CODE BEGIN I2C3_MspInit 0 */ + + /* USER CODE END I2C3_MspInit 0 */ + + /**I2C3 GPIO Configuration + PC9 ------> I2C3_SDA + PA8 ------> I2C3_SCL + */ + GPIO_InitStruct.Pin = GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C3; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C3; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* I2C3 clock enable */ + __HAL_RCC_I2C3_CLK_ENABLE(); + /* USER CODE BEGIN I2C3_MspInit 1 */ + + /* USER CODE END I2C3_MspInit 1 */ + } +} + +void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle) +{ + + if(i2cHandle->Instance==I2C3) + { + /* USER CODE BEGIN I2C3_MspDeInit 0 */ + + /* USER CODE END I2C3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_I2C3_CLK_DISABLE(); + + /**I2C3 GPIO Configuration + PC9 ------> I2C3_SDA + PA8 ------> I2C3_SCL + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_9); + + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_8); + + /* USER CODE BEGIN I2C3_MspDeInit 1 */ + + /* USER CODE END I2C3_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/i2c.h b/i2c.h new file mode 100644 index 0000000..226b25b --- /dev/null +++ b/i2c.h @@ -0,0 +1,81 @@ +/** + ****************************************************************************** + * File Name : I2C.h + * Description : This file provides code for the configuration + * of the I2C instances. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __i2c_H +#define __i2c_H +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f7xx_hal.h" +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern I2C_HandleTypeDef hi2c3; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +extern void _Error_Handler(char *, int); + +void MX_I2C3_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif +#endif /*__ i2c_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/lcd.c b/lcd.c new file mode 100644 index 0000000..ac4e143 --- /dev/null +++ b/lcd.c @@ -0,0 +1,382 @@ +////////////////////////////////////////////////////////////////////////////////// +/// \file touch.c +/// \brief LCD control thread +/// \author Pascal Sartoretti (pascal dot sartoretti at hevs dot ch) +/// \version 1.0 - original +/// \date 2018-02 +////////////////////////////////////////////////////////////////////////////////// +#include "stm32f7xx_hal.h" + +#include +#include +#include "main.h" + +GListener gl; + +////////////////////////////////////////////////////////////////////////////////// +// THREAD LCD +////////////////////////////////////////////////////////////////////////////////// +void LCD(void *argument) +{ + struct queueMsg_t queueMsg; // message queue + GEvent* pe; // uGFX event + char tmpMsg[] = {0,0,0,0,0}; // to send chars + char * msgPtr; // any pointer of string + char tempStr[30]; // temp string usage + char smallStr[5]; + osStatus_t retCode; + uint8_t i; + GHandle tmpHndl; + +// const char escapeBlack[] = {0x1B,'0',0}; + const char escapeRed[] = {0x1B,'1',0}; + const char escapeGreen[] = {0x1B,'2',0}; + const char escapeBold[] = {0x1B,'b',0}; + const char escapeNoBold[] = {0x1B,'B',0}; + const char escapeUnderline[] = {0x1B,'u',0}; + const char escapeNoUnderline[] = {0x1B,'U',0}; + const char escapeBlue[] = {0x1B,'4',0}; +// const char escapeWhite[] = {0x1B,'7',0}; + + //------------------------------------------------------------------------------ + // Init the LCD and create Touch thread after + //------------------------------------------------------------------------------ + gfxInit(); // init LCD screen + gdispClear(White); // clear it + gwinSetDefaultFont(gdispOpenFont("DejaVuSans12_aa")); + gwinSetDefaultStyle(&WhiteWidgetStyle, FALSE); + guiInit(); // create interface + geventListenerInit(&gl); // init listener + gwinAttachListener(&gl); // listen to LCD touch events + guiShowPage(STARTUP); // first window + //------------------------------------------------------------------------------ + // special setup inits (not made in ugfx-studio) + //------------------------------------------------------------------------------ + gwinSetColor(cnslSend,Black); + gwinSetBgColor(cnslSend,White); + gwinSetColor(cnslReceive,Black); + gwinSetBgColor(cnslReceive,White); + sprintf(tempStr,"%d",gTokenInterface.destinationAddress+1); + gwinSetText(btnDestination, tempStr, TRUE); + sprintf(tempStr,"%d",gTokenInterface.debugAddress+1); + gwinSetText(lblADDR, tempStr, TRUE); + sprintf(tempStr," %d",gTokenInterface.debugSAPI); + gwinSetText(lblSAPI, tempStr, TRUE); + sprintf(tempStr,"Local address is: %d",gTokenInterface.myAddress+1); + gwinSetText(lblAddress, tempStr, TRUE); +#if DEBUG_MODE == 0 + sprintf(tempStr,"Debug mode is: OFF"); + gwinSetText(lblDebug, tempStr, TRUE); + gwinDisable(cbDebugConnected); + gwinDisable(cbRecCRCError); + gwinDisable(cbSendCRCError); + gwinDisable(btnADDRESSMinus); + gwinDisable(btnADDRESSPlus); + gwinDisable(btnSAPIMinus); + gwinDisable(btnSAPIPlus); + gwinDisable(lblSAPI); + gwinDisable(lblADDR); + gwinDisable(btnSendDebug); +#else + sprintf(tempStr,"Debug mode is: ON"); + gwinSetText(lblDebug, tempStr, TRUE); +#endif + + //------------------------------------------------------------------------------ + for(;;) // loop until doomsday + { + //---------------------------------------------------------------------------- + // QUEUE READ + //---------------------------------------------------------------------------- + retCode = osMessageQueueGet( + queue_lcd_id, + &queueMsg, + NULL, + osWaitForever); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + switch(queueMsg.type) // check message + { + //************************************************************************** + case TOUCH_EVENT: // event from touchscreen + pe = queueMsg.anyPtr; + switch(pe->type) + { + //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + case GEVENT_GWIN_BUTTON: // button has been pressed + tmpHndl = ((GEventGWinButton*)pe)->gwin; + //---------------------------------------------------------------------- + if((tmpHndl == btnToken)|| // leave startup window + (tmpHndl == btnStart)) + { + gTokenInterface.currentView = MAINDISPLAY; + guiShowPage(MAINDISPLAY); + } + //---------------------------------------------------------------------- + if(tmpHndl == btnDestination) // enter address select window + { + gTokenInterface.currentView = ADDRESSSELECTDISPLAY; + guiShowPage(ADDRESSSELECTDISPLAY); + } + //---------------------------------------------------------------------- + if(tmpHndl == btnConfiguration) // enter config window + { + gTokenInterface.currentView = CONFIGDISPLAY; + guiShowPage(CONFIGDISPLAY); + } + //---------------------------------------------------------------------- + if((tmpHndl == btnBack)|| // leave config window + (tmpHndl == btnSendDebug)) + { + gTokenInterface.currentView = MAINDISPLAY; + guiShowPage(MAINDISPLAY); + } + //---------------------------------------------------------------------- + if(tmpHndl == btnSelect) // destination changed + { + if(gTokenInterface.destinationAddress != 15) + { + sprintf(tempStr,"%d",gTokenInterface.destinationAddress+1); + } + else + { + sprintf(tempStr,"All"); + } + gwinSetText(btnDestination, tempStr, TRUE); // display it on widget + gTokenInterface.currentView = MAINDISPLAY; + guiShowPage(MAINDISPLAY); + } + //---------------------------------------------------------------------- + if(tmpHndl == btnSAPIMinus) // SAPI changed + { + if(gTokenInterface.debugSAPI > 0) + { + gTokenInterface.debugSAPI--; + tmpMsg[0] = ' '; + tmpMsg[1] = gTokenInterface.debugSAPI + '0'; + tmpMsg[2] = 0; + gwinSetText(lblSAPI, tmpMsg, TRUE); + } + } + //---------------------------------------------------------------------- + if(tmpHndl == btnSAPIPlus) // SAPI changed + { + if(gTokenInterface.debugSAPI < 7) + { + gTokenInterface.debugSAPI++; + tmpMsg[0] = ' '; + tmpMsg[1] = gTokenInterface.debugSAPI + '0'; + tmpMsg[2] = 0; + gwinSetText(lblSAPI, tmpMsg, TRUE); + } + } + //---------------------------------------------------------------------- + if(tmpHndl == btnADDRESSMinus) // address changed + { + if(gTokenInterface.debugAddress > 0) + { + gTokenInterface.debugAddress--; + if(gTokenInterface.debugAddress == gTokenInterface.myAddress) + { + if(gTokenInterface.debugAddress > 0) + { + gTokenInterface.debugAddress--; + } + else + { + gTokenInterface.debugAddress++; + } + } + if(gTokenInterface.debugAddress > 8) + { + sprintf(tmpMsg,"%d",(int)gTokenInterface.debugAddress+1); + } + else + { + sprintf(tmpMsg," %d",(int)gTokenInterface.debugAddress+1); + } + gwinSetText(lblADDR, tmpMsg, TRUE); + } + } + //---------------------------------------------------------------------- + if(tmpHndl == btnADDRESSPlus) // address changed + { + if(gTokenInterface.debugAddress < 14) + { + gTokenInterface.debugAddress++; + if(gTokenInterface.debugAddress == gTokenInterface.myAddress) + { + if(gTokenInterface.debugAddress < 14) + { + gTokenInterface.debugAddress++; + } + else + { + gTokenInterface.debugAddress--; + } + } + if(gTokenInterface.debugAddress > 8) + { + sprintf(tmpMsg,"%d",(int)gTokenInterface.debugAddress+1); + } + else + { + sprintf(tmpMsg," %d",(int)gTokenInterface.debugAddress+1); + } + gwinSetText(lblADDR, tmpMsg, TRUE); + } + } + break; + //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + case GEVENT_GWIN_CHECKBOX: // checkbox has been pressed + tmpHndl = ((GEventGWinButton*)pe)->gwin; + //---------------------------------------------------------------------- + if(tmpHndl == cbConnectoed) // connection changed + { + gTokenInterface.connected = gwinCheckboxIsChecked(cbConnectoed); + } + //---------------------------------------------------------------------- + if(tmpHndl == cbBroadcastTime) // broadcast time changed + { + gTokenInterface.broadcastTime = gwinCheckboxIsChecked(cbBroadcastTime); + } + //---------------------------------------------------------------------- + if(tmpHndl == cbDebugConnected) // debug connected changed + { + gTokenInterface.debugOnline = gwinCheckboxIsChecked(cbDebugConnected); + } + //---------------------------------------------------------------------- + if(tmpHndl == cbRecCRCError) // receive CRC error changed + { + gTokenInterface.needReceiveCRCError = gwinCheckboxIsChecked(cbRecCRCError); + } + //---------------------------------------------------------------------- + if(tmpHndl == cbSendCRCError) // send CRC error changed + { + gTokenInterface.needSendCRCError = gwinCheckboxIsChecked(cbSendCRCError); + } + break; + //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + case GEVENT_GWIN_RADIO: // radio button has been pressed + tmpHndl = ((GEventGWinButton*)pe)->gwin; + //---------------------------------------------------------------------- + gTokenInterface.destinationAddress = gwinGetTag(tmpHndl); + break; + } + break; + //************************************************************************** + case TIME_MSG: // needs to display the time + + msgPtr = queueMsg.anyPtr; + sprintf(tempStr,"Time is: %s",msgPtr); // create string + gwinSetText(lblTime, tempStr, TRUE); // display it on widget + //------------------------------------------------------------------------ + // MEMORY RELEASE (time frame from timeReceiver) + //------------------------------------------------------------------------ + retCode = osMemoryPoolFree(memPool,msgPtr); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + //------------------------------------------------------------------------ + // set event flag to audio player + //------------------------------------------------------------------------ + retCode = osEventFlagsSet(eventFlag_id, AUDIO_CLOCK_EVT); // set flag + if(retCode < 0) + { + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + } + break; + //-------------------------------------------------------------------------- + case CHAR_MSG: // a char has been pressed + msgPtr = queueMsg.anyPtr; + gwinPutString(cnslSend,msgPtr); // display char + //------------------------------------------------------------------------ + // MEMORY RELEASE (character from chatSender) + //------------------------------------------------------------------------ + retCode = osMemoryPoolFree(memPool,msgPtr); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + break; + //-------------------------------------------------------------------------- + case CHAT_MSG: // a message is incoming + if(gTokenInterface.currentView != MAINDISPLAY) + { + guiShowPage(MAINDISPLAY); + } + msgPtr = queueMsg.anyPtr; + sprintf(tempStr,"Msg from : %d\r\n",queueMsg.addr+1); + gwinPutString(cnslReceive,escapeBlue); + gwinPutString(cnslReceive,escapeUnderline); + gwinPutString(cnslReceive,tempStr); + gwinPutString(cnslReceive,escapeNoUnderline); + gwinPutString(cnslReceive,escapeGreen); + gwinPutString(cnslReceive,msgPtr); + gwinPutString(cnslReceive,"\r\n"); + //------------------------------------------------------------------------ + // MEMORY RELEASE (message from chatReceiver) + //------------------------------------------------------------------------ + retCode = osMemoryPoolFree(memPool,msgPtr); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + //------------------------------------------------------------------------ + // set event flag to audio player + //------------------------------------------------------------------------ + retCode = osEventFlagsSet(eventFlag_id, AUDIO_MSG_EVT); // set flag + if(retCode < 0) + { + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + } + break; + //-------------------------------------------------------------------------- + case MAC_ERROR: // a communication error occurs + if(gTokenInterface.currentView != MAINDISPLAY) + { + guiShowPage(MAINDISPLAY); + } + msgPtr = queueMsg.anyPtr; + gwinPutString(cnslReceive,escapeRed); + gwinPutString(cnslReceive,escapeBold); + gwinPutString(cnslReceive,msgPtr); + gwinPutString(cnslReceive,escapeNoBold); + //------------------------------------------------------------------------ + // MEMORY RELEASE (message from macSenderReceiver) + //------------------------------------------------------------------------ + retCode = osMemoryPoolFree(memPool,msgPtr); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + //------------------------------------------------------------------------ + // set event flag to audio player + //------------------------------------------------------------------------ + retCode = osEventFlagsSet(eventFlag_id, AUDIO_ERROR_EVT); // set flag + if(retCode < 0) + { + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + } + break; + //-------------------------------------------------------------------------- + case TOKEN_LIST: // token list update + + sprintf(tempStr,"Online stations: "); // create string + for(i=0;i<15;i++) + { + //---------------------------------------------------------------------- + // Not connected station + //---------------------------------------------------------------------- + if((gTokenInterface.station_list[i] & (1 << CHAT_SAPI)) == 0) + { + // station not connected + } + //---------------------------------------------------------------------- + // Any station number connected (CHAT_SAPI) + //---------------------------------------------------------------------- + else + { + sprintf(smallStr,"%d, ",i+1); + strcat(tempStr,smallStr); + } + } + tempStr[strlen(tempStr)-2] = 0; // discare last ', ' + gwinSetText(lblList, tempStr, TRUE); // display it on widget + break; + //------------------------------------------------------------------------------ + default: + break; + } // end of SWITCH + } // end of forever +} + + diff --git a/mac_receiver.c b/mac_receiver.c new file mode 100644 index 0000000..a554070 --- /dev/null +++ b/mac_receiver.c @@ -0,0 +1,5 @@ + +void MacReceiver(void *argument) +{ + // TODO +} diff --git a/mac_sender.c b/mac_sender.c new file mode 100644 index 0000000..67da3c0 --- /dev/null +++ b/mac_sender.c @@ -0,0 +1,5 @@ + +void MacSender(void *argument) +{ + // TODO +} diff --git a/main.c b/main.c new file mode 100644 index 0000000..1c28e9b --- /dev/null +++ b/main.c @@ -0,0 +1,412 @@ +////////////////////////////////////////////////////////////////////////////////// +/// \file main.c +/// \brief Tokenring intialisation +/// \author Pascal Sartoretti (pascal dot sartoretti at hevs dot ch) +/// \version 1.0 - original for RTX5 +/// \date 2018-02 +////////////////////////////////////////////////////////////////////////////////// +#include "stm32f7xx_hal.h" +#include + +#include "main.h" // tokenring constants + +#include "ext_led.h" +#include "ext_uart.h" +#include "EventRecorder.h" + +//-------------------------------------------------------------------------------- +// Global variable for system control +//-------------------------------------------------------------------------------- +struct TOKENINTERFACE gTokenInterface; +//-------------------------------------------------------------------------------- +// Memory pool +//-------------------------------------------------------------------------------- +osMemoryPoolId_t memPool; +//-------------------------------------------------------------------------------- +// Event flag +//-------------------------------------------------------------------------------- +osEventFlagsId_t eventFlag_id; +//-------------------------------------------------------------------------------- +// Queues id and attributes +//-------------------------------------------------------------------------------- +osMessageQueueId_t queue_macR_id; +osMessageQueueId_t queue_phyS_id; +osMessageQueueId_t queue_dbg_id; +osMessageQueueId_t queue_macS_id; +osMessageQueueId_t queue_chatR_id; +osMessageQueueId_t queue_chatS_id; +osMessageQueueId_t queue_timeR_id; +osMessageQueueId_t queue_timeS_id; +osMessageQueueId_t queue_lcd_id; +osMessageQueueId_t queue_keyboard_id; +osMessageQueueId_t queue_usartR_id; + +const osMessageQueueAttr_t queue_macR_attr = { + .name = "MAC_RECEIVER" +}; +const osMessageQueueAttr_t queue_macS_attr = { + .name = "MAC_SENDER" +}; +const osMessageQueueAttr_t queue_phyS_attr = { + .name = "PH_SENDER " +}; +const osMessageQueueAttr_t queue_dbg_attr = { + .name = "DEBUGGER " +}; +const osMessageQueueAttr_t queue_chatR_attr = { + .name = "CHAT_REC " +}; +const osMessageQueueAttr_t queue_timeR_attr = { + .name = "TIME_RECEIVE" +}; +const osMessageQueueAttr_t queue_timeS_attr = { + .name = "TIME_SENDER " +}; +const osMessageQueueAttr_t queue_chatS_attr = { + .name = "CHAT_SENDER " +}; +const osMessageQueueAttr_t queue_lcd_attr = { + .name = "LCD MANAGER " +}; +const osMessageQueueAttr_t queue_keyboard_attr = { + .name = "KEYBOARD " +}; +const osMessageQueueAttr_t queue_usartR_attr = { + .name = "USART_RECEIV" +}; +//-------------------------------------------------------------------------------- +// External threads id, functions and attributes +//-------------------------------------------------------------------------------- +osThreadId_t phy_rec_id; +osThreadId_t phy_snd_id; +osThreadId_t mac_rec_id; +osThreadId_t mac_snd_id; +osThreadId_t time_rec_id; +osThreadId_t time_snd_id; +osThreadId_t chat_rec_id; +osThreadId_t chat_snd_id; +osThreadId_t debug_id; +osThreadId_t touch_id; +osThreadId_t lcd_id; +osThreadId_t audio_id; + +extern void PhReceiver(void *argument); +extern void PhSender(void *argument); +extern void MacReceiver(void *argument); +extern void MacSender(void *argument); +extern void TimeReceiver(void *argument); +extern void TimeSender(void *argument); +extern void ChatReceiver(void *argument); +extern void ChatSender(void *argument); +extern void DebugStation(void *argument); +extern void Touch(void *argument); +extern void LCD(void *argument); +extern void AudioPlayer(void *argument); + +const osThreadAttr_t audio_attr = { + .stack_size = 512, + .priority = osPriorityAboveNormal, + .name = "AUDIO" +}; + +const osThreadAttr_t debug_attr = { + .stack_size = 512, + .priority = osPriorityNormal, + .name = "DBG" +}; + +const osThreadAttr_t phy_rec_attr = { + .stack_size = 512, + .priority = osPriorityNormal, + .name = "PHY_R" +}; + +const osThreadAttr_t phy_snd_attr = { + .stack_size = 512, + .priority = osPriorityNormal, + .name = "PH_S" +}; + +const osThreadAttr_t mac_rec_attr = { + .stack_size = 512, + .priority = osPriorityNormal, + .name = "MAC_R" +}; + +const osThreadAttr_t mac_snd_attr = { + .stack_size = 512, + .priority = osPriorityNormal, + .name = "MAC_S" +}; + +const osThreadAttr_t time_rec_attr = { + .stack_size = 512, + .priority = osPriorityNormal, + .name = "TIME_RECEIVER" +}; + +const osThreadAttr_t time_snd_attr = { + .stack_size = 512, + .priority = osPriorityNormal, + .name = "TIME_SENDER" +}; + +const osThreadAttr_t chat_rec_attr = { + .stack_size = 512, + .priority = osPriorityNormal, + .name = "CHAT_RECEIVER" +}; + +const osThreadAttr_t chat_snd_attr = { + .stack_size = 512, + .priority = osPriorityNormal, + .name = "CHAT_SENDER" +}; + +const osThreadAttr_t touch_attr = { + .stack_size = 512, + .priority = osPriorityNormal, + .name = "TOUCH" +}; + +const osThreadAttr_t lcd_attr = { + .stack_size = 4096, + .priority = osPriorityNormal, + .name = "LCD" +}; + +const osThreadAttr_t tester_attr = { + .stack_size = 256, + .priority = osPriorityNormal, + .name = "TESTER" +}; + +////////////////////////////////////////////////////////////////////////////////// +/// \brief Display a frame of type PHY +/// \param stringP pointer to physical frame to display +/// It is used by PHY_SENDER and PHY_RECEIVER +////////////////////////////////////////////////////////////////////////////////// +void DebugFrame(char * stringP) +{ + uint8_t temp; // used for temp calculation + uint8_t byte; // used for temp byte memory + uint8_t table[16] = {'0','1','2','3', + '4','5','6','7', + '8','9','A','B', + 'C','D','E','F'}; + uint32_t size; // get size of frame + uint32_t i; // temporary counter + + + if ((uint8_t)stringP[1] == TOKEN_TAG) // is it a TOKEN frame + { + size = TOKENSIZE; // size is TOKENSIZE + } + else + { + size = stringP[3] + 6; // calculate size of frame + } + i = 0; + putchar('['); // display an open bracket + for(i=0;i> 4; + putchar(table[temp]); // display 2 hex digits + temp = (byte & 0x0F); + putchar(table[temp]); + putchar(' '); // insert a space + } + putchar(']'); // display a closed bracket + putchar(0x0D); // with a + putchar(0x0A); // with a +} + +////////////////////////////////////////////////////////////////////////////////// +/// \brief Display a frame of type MAC to the PC serial port for debug +/// \param preChar the char to write before the message +/// \param strinP pointer to the message of type MAC !!! +/// It is used by PHY_SENDER and DEBUG +////////////////////////////////////////////////////////////////////////////////// +void DebugMacFrame(uint8_t preChar,uint8_t * stringP) +{ + uint8_t temp; // used for temp calculation + uint8_t byte; // used for temp byte memory + uint8_t table[16] = {'0','1','2','3', + '4','5','6','7', + '8','9','A','B', + 'C','D','E','F'}; + uint32_t size; // get size of frame + uint32_t i; // temporary counter + + if (stringP[0] == TOKEN_TAG) // is it a TOKEN frame + { + size = TOKENSIZE - 2; //size is TOKENSIZE + } + else + { + size = stringP[2] + 4; // calculate size of frame + } + i = 0; + putchar(preChar); + putchar('-'); + putchar('['); // display an open bracket + for(i=0;i> 4; + putchar(table[temp]); // display 2 hex digits + temp = (byte & 0x0F); + putchar(table[temp]); + putchar(' '); // insert a space + } + putchar(']'); // display a closed bracket + putchar('\r'); // with a + putchar('\n'); // and a to flush buffer +} + +////////////////////////////////////////////////////////////////////////////////// +/// \brief Check OS call return codes and display error if any +/// \param retCode return code to control +/// \param lineNumber the line number where was the error +/// \param fileName the filename where is the error +/// \param mode If not 0 (CONTINUE), the program stays in this function +////////////////////////////////////////////////////////////////////////////////// +void CheckRetCode(uint32_t retCode,uint32_t lineNumber,char * fileName,uint8_t mode) +{ + if(retCode != osOK) // if an error occur + { + printf("At line : %d\r\n",lineNumber); // display line error + printf("On file : %s \r\n",fileName); + printf("Error : %d\r\n",retCode); // displays error number + if (mode != CONTINUE) // if mode is not CONTINUE (0) + { + while(1){} // stays here forever + } + } +} + +////////////////////////////////////////////////////////////////////////////////// +/// \brief Configure the clock @ 216MHz and peripheral clocks +////////////////////////////////////////////////////////////////////////////////// +static void SystemClock_Config (void) { + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_PeriphCLKInitTypeDef RCC_ExCLKInitStruct; + + /* Enable HSE Oscillator and activate PLL with HSE as source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.HSIState = RCC_HSI_OFF; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 25; + RCC_OscInitStruct.PLL.PLLN = 432; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 9; + HAL_RCC_OscConfig(&RCC_OscInitStruct); + + /* Activate the OverDrive to reach the 216 MHz Frequency */ + HAL_PWREx_EnableOverDrive(); + + /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */ + RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7); + + HAL_RCCEx_GetPeriphCLKConfig(&RCC_ExCLKInitStruct); + RCC_ExCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SAI2; + RCC_ExCLKInitStruct.Sai2ClockSelection = RCC_SAI2CLKSOURCE_PLLI2S; + RCC_ExCLKInitStruct.PLLI2S.PLLI2SP = 8; + RCC_ExCLKInitStruct.PLLI2S.PLLI2SN = 344; + RCC_ExCLKInitStruct.PLLI2S.PLLI2SQ = 7; + RCC_ExCLKInitStruct.PLLI2SDivQ = 1; + HAL_RCCEx_PeriphCLKConfig(&RCC_ExCLKInitStruct); +} + + +////////////////////////////////////////////////////////////////////////////////// +/// \brief Used by HAL for delays (have to return system ticks) +////////////////////////////////////////////////////////////////////////////////// +uint32_t HAL_GetTick(void) +{ + return osKernelGetTickCount(); +} + + +////////////////////////////////////////////////////////////////////////////////// +/// \brief Init all and start RTX5 +////////////////////////////////////////////////////////////////////////////////// +int main(void) +{ + SystemClock_Config(); + + EventRecorderInitialize(EventRecordAll,0); + EventRecorderDisable(EventRecordAPI, 0xF1, 0xF1); // remove Kernel messages + EventRecorderDisable(EventRecordAll, 0xF4, 0xF4); // remove EventFlag messages + EventRecorderStart(); + + osKernelInitialize(); + + Ext_LED_Init(); + Ext_UART_Init(9600); // Initialize UART @ 9600 bauds + + //------------------------------------------------------------------------------ + // Default configuration station + //------------------------------------------------------------------------------ + gTokenInterface.myAddress = MYADDRESS; // constant from main.h + gTokenInterface.connected = TRUE; // default is station connected + Ext_LED_PWM(8,100); // display connected + gTokenInterface.debugAddress = 9; // default values + gTokenInterface.debugSAPI = 1; + gTokenInterface.debugOnline = TRUE; + gTokenInterface.destinationAddress = 1; + + //------------------------------------------------------------------------------ + // Create memory pool + //------------------------------------------------------------------------------ + memPool = osMemoryPoolNew(8,MAX_BLOCK_SIZE,NULL); + //------------------------------------------------------------------------------ + // Create event flag + //------------------------------------------------------------------------------ + eventFlag_id = osEventFlagsNew(NULL); + //------------------------------------------------------------------------------ + // Create queues + //------------------------------------------------------------------------------ + queue_macR_id = osMessageQueueNew(2,sizeof(struct queueMsg_t),&queue_macR_attr); + queue_phyS_id = osMessageQueueNew(2,sizeof(struct queueMsg_t),&queue_phyS_attr); + queue_macS_id = osMessageQueueNew(2,sizeof(struct queueMsg_t),&queue_macS_attr); + queue_dbg_id = osMessageQueueNew(2,sizeof(struct queueMsg_t),&queue_dbg_attr); + queue_chatR_id = osMessageQueueNew(2,sizeof(struct queueMsg_t),&queue_chatR_attr); + queue_chatS_id = osMessageQueueNew(2,sizeof(struct queueMsg_t),&queue_chatS_attr); + queue_timeR_id = osMessageQueueNew(2,sizeof(struct queueMsg_t),&queue_timeR_attr); + queue_timeS_id = osMessageQueueNew(2,sizeof(struct queueMsg_t),&queue_timeS_attr); + queue_lcd_id = osMessageQueueNew(4,sizeof(struct queueMsg_t),&queue_lcd_attr); + queue_keyboard_id = osMessageQueueNew(4,sizeof(struct queueMsg_t),&queue_keyboard_attr); + queue_usartR_id = osMessageQueueNew(4,sizeof(struct queueMsg_t),&queue_usartR_attr); + + //------------------------------------------------------------------------------ + // Create Threads + //------------------------------------------------------------------------------ + // audio_id = osThreadNew(AudioPlayer, NULL, &audio_attr); + debug_id = osThreadNew(DebugStation, NULL, &debug_attr); + phy_rec_id = osThreadNew(PhReceiver, NULL, &phy_rec_attr); + phy_snd_id = osThreadNew(PhSender, NULL, &phy_snd_attr); + mac_rec_id = osThreadNew(MacReceiver, NULL, &mac_rec_attr); + mac_snd_id = osThreadNew(MacSender, NULL, &mac_snd_attr); + time_rec_id = osThreadNew(TimeReceiver, NULL, &time_rec_attr); + time_snd_id = osThreadNew(TimeSender, NULL, &time_snd_attr); + chat_rec_id = osThreadNew(ChatReceiver, NULL, &chat_rec_attr); + chat_snd_id = osThreadNew(ChatSender, NULL, &chat_snd_attr); + touch_id = osThreadNew(Touch, NULL, &touch_attr); + lcd_id = osThreadNew(LCD, NULL, &lcd_attr); + + //------------------------------------------------------------------------------ + // Start kernel and never returns + //------------------------------------------------------------------------------ + osKernelStart(); +} + diff --git a/main.h b/main.h new file mode 100644 index 0000000..0cb5f62 --- /dev/null +++ b/main.h @@ -0,0 +1,119 @@ +////////////////////////////////////////////////////////////////////////////////// +/// \file main.h +/// \brief Tokenring definitions +/// \author Pascal Sartoretti (pascal dot sartoretti at hevs dot ch) +/// \version 1.0 - original for RTX5 +/// \date 2018-02 +////////////////////////////////////////////////////////////////////////////////// +#include "stm32f7xx_hal.h" + +#include +#include +#include +#include "gfx.h" +#include "gui.h" + +//-------------------------------------------------------------------------------- +// Constants to change the system behavior +//-------------------------------------------------------------------------------- +#define DEBUG_MODE 1 // mode is physical line (0) or debug (1) +#define MYADDRESS 3 // your address choice (table number) +#define MAX_BLOCK_SIZE 100 // size max for a frame + +//-------------------------------------------------------------------------------- +// Constants to NOT change for the system working +//-------------------------------------------------------------------------------- +#define CHAT_SAPI 0x01 // sapi chat application number (0-7) +#define TIME_SAPI 0x03 // sapi time application number (0-7) +#define BROADCAST_ADDRESS 0x0F // broadcast address +#define TOKEN_TAG 0xFF // tag of tokenring frame +#define TOKENSIZE 19 // size of a token frame +#define STX 0x02 // any frame start char +#define ETX 0x03 // any frame end char +#define CONTINUE 0x0 // for check return code halt + +//-------------------------------------------------------------------------------- +// identifiers used in more the one file (thread) +//-------------------------------------------------------------------------------- +extern GListener gl; +extern osMemoryPoolId_t memPool; +extern osThreadId_t phy_rec_id; +extern osMessageQueueId_t queue_macR_id; +extern osMessageQueueId_t queue_phyS_id; +extern osMessageQueueId_t queue_dbg_id; +extern osMessageQueueId_t queue_macS_id; +extern osMessageQueueId_t queue_chatR_id; +extern osMessageQueueId_t queue_timeR_id; +extern osMessageQueueId_t queue_lcd_id; +extern osMessageQueueId_t queue_timeS_id; +extern osMessageQueueId_t queue_chatS_id; +extern osMessageQueueId_t queue_keyboard_id; +extern osMessageQueueId_t queue_usartR_id; +extern osEventFlagsId_t eventFlag_id; +//-------------------------------------------------------------------------------- +// functions used in more than one file +//-------------------------------------------------------------------------------- +void CheckRetCode(uint32_t retCode,uint32_t lineNumber,char * fileName,uint8_t mode); +void DebugFrame(char * stringP); +void DebugMacFrame(uint8_t preChar,uint8_t * stringP); + +//-------------------------------------------------------------------------------- +// structure for system usage +//-------------------------------------------------------------------------------- +struct TOKENINTERFACE +{ + uint8_t myAddress; ///< my current address + uint8_t currentView; ///< the current view on LCD + bool_t debugOnline; ///< is debug station ON + bool_t connected; ///< are we connected + bool_t broadcastTime; ///< is broadcast time active + bool_t needReceiveCRCError; ///< debug has to receive error + bool_t needSendCRCError; ///< debug has to send error + uint32_t debugSAPI; ///< current debug SAPI + uint32_t debugAddress; ///< current debug address + bool_t debugMsgToSend; ///< did debug have to send a message + uint32_t destinationAddress; ///< current destination address + uint8_t station_list[15]; ///< 0 to 15 +}; +extern struct TOKENINTERFACE gTokenInterface; + +//-------------------------------------------------------------------------------- +// Events usage +//-------------------------------------------------------------------------------- +#define RS232_TX_EVENT 0x0001 // ready for next byte to send +#define BROADCAST_TIME_EVT 0x0002 // time to send or not +#define AUDIO_MSG_EVT 0x0020 // audio message to play +#define AUDIO_ERROR_EVT 0x0040 // audio error to play +#define AUDIO_CLOCK_EVT 0x0080 // audio clock to play + +//-------------------------------------------------------------------------------- +// Types of messages transmitted in the queues +//-------------------------------------------------------------------------------- +enum msgType_e +{ + TOUCH_EVENT, ///< touch has been pressed + NEW_TOKEN, ///< a new token is requested + START, ///< a start is requested (connected) + STOP, ///< a stop is requested (disconnected) + TOKEN_LIST, ///< token list sent to LCD + MAC_ERROR, ///< error message to LCD + TOKEN, ///< a token message + DATA_IND, ///< a data sent between mac and app layers + DATABACK, ///< a message is coming back + TIME_MSG, ///< a time message is sent to LCD + CHAR_MSG, ///< a single char is sent to the LCD + CHAT_MSG, ///< a chat message is sent to the LCD + FROM_PHY, ///< a message arriving from physical layer + TO_PHY ///< a message sent to physical layer +}; + +//-------------------------------------------------------------------------------- +// The queue message structure +//-------------------------------------------------------------------------------- +struct queueMsg_t +{ + enum msgType_e type; ///< the type of message + void * anyPtr; ///< the pointer to message (if any) + uint8_t addr; ///< the source or destination address + uint8_t sapi; ///< the source or destination SAPI +}; diff --git a/phy_receiver.c b/phy_receiver.c new file mode 100644 index 0000000..d2d3bc0 --- /dev/null +++ b/phy_receiver.c @@ -0,0 +1,178 @@ +////////////////////////////////////////////////////////////////////////////////// +/// \file phy_receiver.c +/// \brief Physical receiver thread +/// \author Pascal Sartoretti (sap at hevs dot ch) +/// \version 1.0 - original +/// \date 2018-02 +////////////////////////////////////////////////////////////////////////////////// +#include "stm32f7xx_hal.h" + +#include +#include +#include "main.h" +#include "ext_uart.h" +#include "ext_led.h" + +uint8_t gInBuffer[256]; // generic byte receive buffer +uint8_t recByte; +uint8_t recPtr; + +////////////////////////////////////////////////////////////////////////////////// +/// \brief Called on interrupt on RS232 received char +/// \param The uart handler (ext_uart) +////////////////////////////////////////////////////////////////////////////////// +void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) +{ + struct queueMsg_t queueMsg; // queue message + static uint8_t secondSTX; // STX repeated control + uint32_t size; // size of builded frame + osStatus_t retCode; + + //------------------------------------------------------------------------------ + // RECEIVED CHAR + //------------------------------------------------------------------------------ + if (recByte == STX) // is it an STX char ? + { + //---------------------------------------------------------------------------- + if(recPtr == 0) // is it first char ? + { + secondSTX = 0; // this is the first STX + } + //---------------------------------------------------------------------------- + else // is not the first char + { + if (secondSTX == 1) // is it the second STX + { + secondSTX = 0; // clear secondSTX flag + HAL_UART_Receive_IT(&ext_uart,&recByte,1); // enable uart receiver 1 char + + return; // and quit + } + secondSTX = 1; // set secondSTX to + } + } + //------------------------------------------------------------------------------ + else // is not an STX char + { + if(secondSTX == 1) // if was a second STX + { + secondSTX = 0; // clearswap second STX flag + gInBuffer[0] = STX; // set first STX received + recPtr = 1; // set byte counter at 1 + HAL_UART_Receive_IT(&ext_uart,&recByte,1); // enable uart receiver 1 char + return; // and quit + } + } + gInBuffer[recPtr] = recByte; // copy data in input buffer + recPtr++; // increment byte counter + //------------------------------------------------------------------------------ + if(recPtr > 4) // received more than 4 bytes + { + if(gInBuffer[1]== TOKEN_TAG) // is it a token frame + { + size = TOKENSIZE; // size is token size + } + else // not a token frame + { + size = gInBuffer[3]+6; // get size in frame + } + if (recPtr == size) // check all bytes received + { + if(recByte == ETX) // last char received was ETX ? + { + queueMsg.type = FROM_PHY; + queueMsg.anyPtr = gInBuffer; + //------------------------------------------------------------------------ + // QUEUE SEND (send received frame to physical receiver) + //------------------------------------------------------------------------ + retCode = osMessageQueuePut( + queue_usartR_id, + &queueMsg, + osPriorityNormal, + 0); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + } + recPtr = 0; // reset bytes counter + } + } + HAL_UART_Receive_IT(&ext_uart,&recByte,1); // enable uart receiver 1 char +} + +////////////////////////////////////////////////////////////////////////////////// +// THREAD PHYSICAL RECEIVER +////////////////////////////////////////////////////////////////////////////////// +void PhReceiver(void *argument) +{ + struct queueMsg_t queueMsg; // queue message + uint8_t * msg; + uint8_t * qPtr; + size_t size; + osStatus_t retCode; + + HAL_UART_Receive_IT(&ext_uart,&recByte,1); // enable uart receiver 1 char + //------------------------------------------------------------------------------ + for (;;) // loop until doomsday + { + //---------------------------------------------------------------------------- + // QUEUE READ + //---------------------------------------------------------------------------- + retCode = osMessageQueueGet( + queue_usartR_id, + &queueMsg, + NULL, + osWaitForever); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + qPtr = queueMsg.anyPtr; + //---------------------------------------------------------------------------- + // DEBUG DISPLAY FRAME + //---------------------------------------------------------------------------- + putchar('R'); // insert a R for Receive + putchar(':'); // insert a : + DebugFrame((char*)qPtr); // display frame on TERMINAL + if (qPtr[1] == TOKEN_TAG) // is it a token frame ? + { + size = TOKENSIZE; // yes -> token frame size + Ext_LED_PWM(1,100); // token is in station + } + else + { + size = qPtr[3]+6; // size of string + 6 (ETX,...) + } + //---------------------------------------------------------------------------- + // MEMORY ALLOCATION + //---------------------------------------------------------------------------- + msg = osMemoryPoolAlloc(memPool,osWaitForever); + memcpy(msg,&qPtr[1],size-2); + queueMsg.anyPtr = msg; + queueMsg.type = FROM_PHY; + if((msg[0] == TOKEN_TAG) || // is a token frame + ((msg[1]>>3) == gTokenInterface.myAddress) || // is destination my address + ((msg[0]>>3) == gTokenInterface.myAddress) || // is source my address + ((msg[1]>>3) == BROADCAST_ADDRESS)) // is a broadcast frame + { + //-------------------------------------------------------------------------- + // QUEUE SEND (send received frame to mac layer receiver) + //-------------------------------------------------------------------------- + retCode = osMessageQueuePut( + queue_macR_id, + &queueMsg, + osPriorityNormal, + osWaitForever); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + } + else + { + //-------------------------------------------------------------------------- + // QUEUE SEND (send received frame to physical layer sender) + //-------------------------------------------------------------------------- + retCode = osMessageQueuePut( + queue_phyS_id, + &queueMsg, + osPriorityNormal, + osWaitForever); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + } + } +} + + diff --git a/phy_sender.c b/phy_sender.c new file mode 100644 index 0000000..27aaeee --- /dev/null +++ b/phy_sender.c @@ -0,0 +1,162 @@ +////////////////////////////////////////////////////////////////////////////////// +/// \file phy_sender.c +/// \brief Physical sender thread +/// \author Pascal Sartoretti (sap at hevs dot ch) +/// \version 1.0 - original +/// \date 2018-02 +////////////////////////////////////////////////////////////////////////////////// +#include "stm32f7xx_hal.h" + +#include +#include +#include "main.h" +#include "ext_uart.h" +#include "ext_led.h" + +////////////////////////////////////////////////////////////////////////////////// +/// \brief Called on interrupt on RS232 sended char +/// \param The uart handler (ext_uart) +////////////////////////////////////////////////////////////////////////////////// +void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) +{ + osEventFlagsSet(eventFlag_id, RS232_TX_EVENT); // set flag for next send +} + +////////////////////////////////////////////////////////////////////////////////// +/// \brief Send bytes to physical line +/// \param byte The byte to send +/// \param counter The number of the byte in the frame +/// +/// The STX is sent twice if not the first byte +////////////////////////////////////////////////////////////////////////////////// +void rs232_send(uint8_t byte, uint8_t counter) +{ + int32_t eventFlag; // current flag + + //------------------------------------------------------------------------------ + // EVENT GET wait 10 ticks max + //------------------------------------------------------------------------------ + eventFlag = osEventFlagsWait( + eventFlag_id, + RS232_TX_EVENT, + osFlagsWaitAny, + 10); + if((eventFlag < 0)&& // case of error + (eventFlag != -2)) // but not a timeout + CheckRetCode(eventFlag,__LINE__,__FILE__,CONTINUE); + + //------------------------------------------------------------------------------ + if((counter == 0)&&(byte == STX)) // first STX to send + { + HAL_UART_Transmit_IT(&ext_uart,&byte, 1); + } + //------------------------------------------------------------------------------ + if ((counter != 0)&&(byte != STX)) // any data to send not STX + { + HAL_UART_Transmit_IT(&ext_uart,&byte, 1); + } + //------------------------------------------------------------------------------ + if ((counter != 0)&&(byte == STX)) // STX in frame -> double it + { + HAL_UART_Transmit_IT(&ext_uart,&byte, 1); // send first STX + //---------------------------------------------------------------------------- + // EVENT GET wait 10 ticks max + //---------------------------------------------------------------------------- + eventFlag = osEventFlagsWait( + eventFlag_id, + RS232_TX_EVENT, + osFlagsWaitAny, + 10); + if((eventFlag < 0)&& // case of error + (eventFlag != -2)) // but not a timeout + CheckRetCode(eventFlag | 0x7FFFFFFF,__LINE__,__FILE__,CONTINUE); + HAL_UART_Transmit_IT(&ext_uart,&byte, 1); // send second STX + } +} + + +////////////////////////////////////////////////////////////////////////////////// +// THREAD PHYSICAL SENDER +////////////////////////////////////////////////////////////////////////////////// +void PhSender(void *argument) +{ + struct queueMsg_t queueMsg; // queue message + uint8_t * qPtr; + osStatus_t retCode; + + //------------------------------------------------------------------------------ + for (;;) // loop until doomsday + { + //---------------------------------------------------------------------------- + // QUEUE READ + //---------------------------------------------------------------------------- + retCode = osMessageQueueGet( + queue_phyS_id, + &queueMsg, + NULL, + osWaitForever); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + qPtr = queueMsg.anyPtr; + if(qPtr[0] == TOKEN_TAG) + { + Ext_LED_PWM(1,0); // token is out of station + } +#if DEBUG_MODE != 0 + //---------------------------------------------------------------------------- + // DEBUG DISPLAY FRAME + //---------------------------------------------------------------------------- + DebugMacFrame('S',qPtr); + //---------------------------------------------------------------------------- + // QUEUE SEND (send frame to debug station) + //---------------------------------------------------------------------------- + retCode = osMessageQueuePut( + queue_dbg_id, + &queueMsg, + osPriorityNormal, + 0); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); +#else + uint8_t * msg; + uint8_t i; + size_t size; + + if(qPtr[0] == TOKEN_TAG) + { + size = TOKENSIZE; // this is a token + } + else + { + size = qPtr[2] + 6; // = txtSize + STX + SRC + DST + LN + CS + ETX + } + //---------------------------------------------------------------------------- + // MEMORY ALLOCATION + //---------------------------------------------------------------------------- + msg = osMemoryPoolAlloc(memPool,osWaitForever); + msg[0] = STX; + memcpy(&msg[1],qPtr,size-2); + msg[size-1] = ETX; + //---------------------------------------------------------------------------- + // DEBUG DISPLAY FRAME + //---------------------------------------------------------------------------- + putchar('S'); // insert a S for Send + putchar(':'); // insert a : + DebugFrame((char *)msg); // for debug info only + for(i=0;ig.display, wo->g.x, wo->g.y, wo->g.width, wo->g.height, White); + gdispGFillArea(wo->g.display, 0, 0, 480, 272, HTML2COLOR(0xFFFFFF)); +} + +// background_gray +void background_gray(GWidgetObject* wo, void* param) +{ + (void)param; + + gdispGFillArea(wo->g.display, wo->g.x, wo->g.y, wo->g.width, wo->g.height, White); + gdispGFillArea(wo->g.display, 0, 0, 480, 272, HTML2COLOR(0x606060)); +} + +#endif // _RENDERING_FUNCTIONS_H diff --git a/resources/arial_12_arial12_aa.c b/resources/arial_12_arial12_aa.c new file mode 100644 index 0000000..f374146 --- /dev/null +++ b/resources/arial_12_arial12_aa.c @@ -0,0 +1,273 @@ + + +/* Start of automatically generated font definition for arial12. */ + +#ifndef MF_RLEFONT_INTERNALS +#define MF_RLEFONT_INTERNALS +#endif +#include "mf_rlefont.h" + +#ifndef MF_RLEFONT_VERSION_4_SUPPORTED +#error The font file is not compatible with this version of mcufont. +#endif + +static const uint8_t mf_rlefont_arial12_dictionary_data[331] = { + 0x1b, 0x03, 0xc7, 0x0b, 0x0c, 0x04, 0x0b, 0x07, 0x0b, 0xc3, 0xcd, 0x0a, 0x09, 0x06, 0x40, 0x02, + 0xc3, 0xcc, 0x80, 0xc1, 0x03, 0xc7, 0xcb, 0x01, 0xc2, 0xc6, 0xce, 0x02, 0x28, 0x0b, 0xcd, 0xc4, + 0x03, 0x84, 0xc4, 0xcc, 0x02, 0x81, 0x01, 0xc1, 0xc5, 0xc1, 0x80, 0xcd, 0xc8, 0xc1, 0xca, 0xc8, + 0x08, 0x01, 0xc3, 0xc2, 0x80, 0x80, 0xcc, 0xc5, 0xc8, 0x18, 0xce, 0xc3, 0xce, 0xc9, 0xc7, 0xca, + 0xca, 0xce, 0xcd, 0xc5, 0xcd, 0xc3, 0xc6, 0xcc, 0xc5, 0xcd, 0xcc, 0xc5, 0xcc, 0xc3, 0xcd, 0xc1, + 0xc2, 0xcd, 0xce, 0xc2, 0xd9, 0xc7, 0xcc, 0xce, 0xc1, 0xc4, 0xc1, 0xc1, 0x80, 0xca, 0xc1, 0xca, + 0xc7, 0xc9, 0xc6, 0xc9, 0xce, 0xc3, 0xcd, 0xc1, 0xc9, 0xcb, 0x06, 0xc1, 0x80, 0xc1, 0x01, 0xc2, + 0xce, 0xc4, 0xc9, 0xc9, 0xc5, 0xca, 0xc3, 0xc6, 0x01, 0xde, 0xca, 0xc4, 0xc8, 0xcb, 0xc5, 0xcb, + 0xcb, 0xc4, 0xc2, 0xcc, 0xc3, 0x80, 0x83, 0xd8, 0xc7, 0xcd, 0xc4, 0xce, 0xc1, 0xcc, 0xce, 0xc4, + 0xda, 0xc6, 0xcd, 0xc1, 0xcd, 0xc4, 0xcd, 0xcb, 0xc2, 0xc3, 0xce, 0xcc, 0xc4, 0xc8, 0xcc, 0x05, + 0x80, 0xc3, 0xc1, 0xcb, 0x01, 0xcb, 0xc3, 0xca, 0xc2, 0x01, 0xc5, 0xcc, 0xc7, 0xce, 0xc7, 0xc9, + 0xcd, 0xc4, 0xc8, 0xc9, 0x01, 0xcc, 0x5f, 0x29, 0x42, 0x19, 0x4f, 0x29, 0x0f, 0x02, 0x1d, 0x1c, + 0x2f, 0x25, 0x0b, 0x01, 0x0d, 0x07, 0x04, 0x0a, 0x45, 0x22, 0x4f, 0x29, 0x51, 0x6c, 0x5d, 0x06, + 0x0e, 0x05, 0x5d, 0x07, 0x01, 0x59, 0x4f, 0x1e, 0x4f, 0x29, 0x4f, 0x1e, 0x1d, 0x35, 0x1f, 0x1f, + 0x1f, 0x48, 0x1d, 0x29, 0x24, 0x1e, 0x3b, 0x29, 0x2d, 0x1c, 0x27, 0x63, 0x6e, 0x0c, 0x33, 0x1b, + 0x0d, 0x1b, 0x0d, 0x1b, 0x0d, 0x1b, 0x0d, 0x1b, 0x0f, 0x1e, 0xa4, 0x00, 0x63, 0x20, 0x23, 0x63, + 0x22, 0x25, 0x26, 0x00, 0xa4, 0x6c, 0x51, 0x22, 0x34, 0x39, 0x1d, 0x08, 0x03, 0x1d, 0x0a, 0x01, + 0x22, 0x21, 0x51, 0x21, 0x51, 0x6c, 0x29, 0x4a, 0x2d, 0x21, 0x2d, 0x21, 0x2d, 0x21, 0x2d, 0x21, + 0x0d, 0x71, 0x1d, 0x5f, 0x1d, 0x0e, 0x68, 0x00, 0x4f, 0x06, 0x0a, 0x29, 0x09, 0x1a, 0x09, 0x1a, + 0x04, 0x20, 0x2d, 0x6c, 0x2d, 0x2d, 0x6c, 0x07, 0x08, 0x01, 0x20, 0x04, 0x0c, 0x1e, 0x74, 0x29, + 0x52, 0x49, 0x75, 0x2b, 0x33, 0x75, 0x2b, 0x33, 0x75, 0x2b, 0x6c, +}; + +static const uint16_t mf_rlefont_arial12_dictionary_offsets[136] = { + 0x0000, 0x0001, 0x0002, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, + 0x000b, 0x000c, 0x000d, 0x000e, 0x0010, 0x0012, 0x0015, 0x0017, + 0x0019, 0x001b, 0x001c, 0x001d, 0x0021, 0x0022, 0x0025, 0x0026, + 0x0028, 0x002a, 0x002d, 0x0030, 0x0031, 0x0033, 0x0035, 0x0037, + 0x0039, 0x003a, 0x003c, 0x003e, 0x0040, 0x0042, 0x0044, 0x0046, + 0x0048, 0x004a, 0x004c, 0x004e, 0x0050, 0x0052, 0x0054, 0x0055, + 0x0057, 0x0059, 0x005b, 0x005d, 0x005f, 0x0061, 0x0063, 0x0065, + 0x0067, 0x006b, 0x006f, 0x0071, 0x0073, 0x0075, 0x0077, 0x0079, + 0x007a, 0x007c, 0x007e, 0x0080, 0x0082, 0x0084, 0x0086, 0x0087, + 0x0088, 0x008a, 0x008c, 0x008e, 0x0090, 0x0091, 0x0093, 0x0095, + 0x0097, 0x0099, 0x009b, 0x009d, 0x009f, 0x00a0, 0x00a2, 0x00a4, + 0x00a6, 0x00a8, 0x00aa, 0x00ac, 0x00ae, 0x00b0, 0x00b2, 0x00b4, + 0x00b6, 0x00bc, 0x00bf, 0x00c2, 0x00c4, 0x00c6, 0x00c8, 0x00d0, + 0x00d2, 0x00d6, 0x00dc, 0x00de, 0x00e1, 0x00e3, 0x00ef, 0x00f8, + 0x00fb, 0x0100, 0x0105, 0x0107, 0x010a, 0x010f, 0x0111, 0x0116, + 0x0118, 0x0120, 0x0122, 0x0125, 0x0127, 0x0129, 0x012c, 0x0130, + 0x0132, 0x0137, 0x0139, 0x013b, 0x013d, 0x0140, 0x0142, 0x014b, +}; + +static const uint8_t mf_rlefont_arial12_glyph_data_0[2493] = { + 0x03, 0x00, 0x10, 0x03, 0xf8, 0x05, 0x22, 0xa4, 0x05, 0x1d, 0x7f, 0x2b, 0x33, 0x42, 0x1d, 0x68, + 0x1d, 0x4b, 0x38, 0x63, 0x10, 0x04, 0x00, 0x26, 0x59, 0x21, 0x06, 0x0b, 0x3b, 0x21, 0x53, 0x37, + 0x10, 0x07, 0x29, 0x6f, 0x03, 0x00, 0x0d, 0x21, 0x0d, 0x27, 0x0b, 0x1e, 0x0d, 0x2c, 0x08, 0x1e, + 0x53, 0x00, 0x54, 0x33, 0x07, 0x56, 0x68, 0x1e, 0x0d, 0x2c, 0x08, 0x1e, 0x0d, 0x34, 0x0b, 0x33, + 0x62, 0x00, 0x06, 0x08, 0x33, 0x53, 0x00, 0x54, 0x10, 0x07, 0x29, 0x65, 0x0f, 0x68, 0x8b, 0x0a, + 0x59, 0x1e, 0x5a, 0x00, 0x09, 0x21, 0x44, 0x3b, 0x21, 0x27, 0x08, 0x0f, 0x0d, 0x97, 0x54, 0x0e, + 0x1e, 0x76, 0x00, 0x09, 0xfe, 0x8d, 0x03, 0x39, 0x09, 0x47, 0x33, 0x65, 0x36, 0x02, 0x20, 0x09, + 0x10, 0x0b, 0x29, 0x08, 0x3a, 0x29, 0x62, 0x6c, 0x5c, 0x01, 0x42, 0x00, 0x08, 0x05, 0x6c, 0x7d, + 0x00, 0x54, 0x02, 0x0b, 0x22, 0x5c, 0x01, 0x42, 0x09, 0x04, 0x1e, 0x08, 0x3a, 0x02, 0x0b, 0x44, + 0x75, 0x1e, 0x55, 0x4d, 0x9b, 0x22, 0x70, 0x6f, 0x03, 0x00, 0x0e, 0x22, 0x55, 0x00, 0x4d, 0x9b, + 0x6c, 0x70, 0x29, 0x44, 0x75, 0x10, 0x08, 0x19, 0x4e, 0x0c, 0x02, 0x33, 0x04, 0x43, 0x46, 0x33, + 0x72, 0x00, 0x74, 0x33, 0x77, 0x6b, 0x02, 0x33, 0x67, 0x0e, 0x56, 0x8b, 0x04, 0x63, 0x43, 0x6c, + 0x26, 0x29, 0x07, 0x0f, 0x0a, 0x22, 0x69, 0x49, 0x07, 0x36, 0x8d, 0x65, 0x0f, 0x68, 0x4d, 0x10, + 0x02, 0x00, 0x26, 0x1d, 0x26, 0x1d, 0x04, 0x08, 0x10, 0x04, 0x19, 0x08, 0x97, 0x02, 0x0b, 0x1d, + 0x54, 0x1d, 0x0e, 0x9a, 0x69, 0x1d, 0x67, 0x1f, 0x1b, 0x84, 0x0a, 0x05, 0x20, 0x34, 0x0b, 0x1b, + 0x08, 0x04, 0x10, 0x04, 0x00, 0x6e, 0x1b, 0x07, 0x1a, 0x66, 0x1b, 0x5b, 0x1d, 0x4c, 0x92, 0x09, + 0x1a, 0x0c, 0x97, 0x66, 0x1d, 0x07, 0x07, 0x20, 0x6e, 0x10, 0x05, 0x29, 0x6e, 0x20, 0x74, 0x0c, + 0x68, 0x1e, 0x2f, 0x4e, 0x97, 0x58, 0x08, 0x10, 0x07, 0x19, 0x18, 0x87, 0x21, 0x05, 0x2c, 0x05, + 0x21, 0x87, 0x10, 0x03, 0x2a, 0x23, 0x63, 0x8c, 0x10, 0x04, 0x23, 0x09, 0x2e, 0x09, 0x10, 0x03, + 0x2a, 0x23, 0x63, 0x10, 0x03, 0x19, 0x55, 0x20, 0x77, 0x1d, 0x70, 0x1d, 0x07, 0x05, 0x20, 0x6f, + 0x9a, 0x62, 0x1d, 0x37, 0x1d, 0x09, 0x97, 0x77, 0x10, 0x07, 0x29, 0x67, 0x0e, 0x0a, 0x1e, 0x2f, + 0x7f, 0x32, 0x1e, 0x2d, 0x4f, 0x9c, 0xfe, 0x8d, 0x74, 0xec, 0x8d, 0x74, 0xec, 0x8d, 0x5a, 0x00, + 0x94, 0x22, 0x2f, 0x7f, 0x32, 0x33, 0x9b, 0x0e, 0x4b, 0x10, 0x07, 0x1c, 0x08, 0x07, 0x20, 0x08, + 0x0f, 0x07, 0x21, 0x64, 0x4c, 0x33, 0x2f, 0x00, 0x96, 0x96, 0x96, 0x10, 0x07, 0x29, 0x60, 0x93, + 0x1e, 0x67, 0x02, 0x01, 0x6b, 0x21, 0x8f, 0x1d, 0x72, 0x21, 0x27, 0x75, 0x33, 0x27, 0x3d, 0x33, + 0x27, 0x75, 0x21, 0x66, 0x97, 0x08, 0x2c, 0x01, 0x10, 0x07, 0x29, 0x65, 0x3a, 0x1e, 0x34, 0x3e, + 0x6e, 0x1a, 0x95, 0x33, 0x5c, 0x06, 0x21, 0x05, 0x0e, 0x91, 0x20, 0x65, 0x21, 0x8f, 0x8d, 0x05, + 0x3e, 0x01, 0x6b, 0x33, 0x73, 0x93, 0x10, 0x07, 0x1c, 0x61, 0x20, 0x66, 0x0e, 0x20, 0x08, 0x4e, + 0x21, 0x24, 0x52, 0x21, 0x42, 0x52, 0x33, 0x5f, 0x00, 0x52, 0x33, 0x0d, 0x2c, 0x01, 0x21, 0x52, + 0x1d, 0x52, 0x10, 0x07, 0x29, 0x09, 0x2e, 0x36, 0x33, 0x5b, 0x1d, 0x48, 0x33, 0x8f, 0x0b, 0x93, + 0x8b, 0x01, 0x6b, 0x1e, 0xa4, 0x02, 0x33, 0x8f, 0x8d, 0x05, 0x3e, 0x50, 0x29, 0x60, 0x0f, 0x7b, + 0x10, 0x07, 0x29, 0x24, 0x0f, 0x42, 0x33, 0x0d, 0x06, 0x01, 0x47, 0x1e, 0x04, 0x0b, 0x1d, 0x3b, + 0x0b, 0x93, 0x1e, 0x08, 0x0f, 0x30, 0x6b, 0x1e, 0x59, 0x8f, 0x8d, 0x72, 0x8f, 0x8d, 0x01, 0x0e, + 0x06, 0x01, 0x59, 0x33, 0x24, 0x93, 0x10, 0x07, 0x00, 0x07, 0x2c, 0x02, 0x20, 0x46, 0x20, 0x61, + 0x9a, 0x0c, 0x06, 0x20, 0x69, 0x1d, 0x46, 0x2b, 0x6c, 0x8f, 0x9a, 0x69, 0x10, 0x07, 0x29, 0x67, + 0x0e, 0x4b, 0x33, 0x7f, 0x32, 0x1e, 0x52, 0x29, 0x5a, 0x33, 0x3d, 0x32, 0x33, 0x06, 0x2e, 0x91, + 0x22, 0x04, 0x39, 0x01, 0x47, 0x1e, 0x3b, 0xec, 0x8d, 0x61, 0x49, 0x60, 0x33, 0x65, 0x0e, 0x0b, + 0x03, 0x10, 0x07, 0x29, 0x40, 0x3a, 0x01, 0x1e, 0x52, 0x30, 0x0a, 0x09, 0x1e, 0x95, 0x52, 0x1e, + 0x95, 0x35, 0x8d, 0x69, 0x49, 0x09, 0x0f, 0x02, 0x1e, 0x65, 0x0e, 0x28, 0x9a, 0x44, 0x22, 0x94, + 0x02, 0x6e, 0x07, 0x33, 0x73, 0x3a, 0x10, 0x03, 0x18, 0x88, 0x10, 0x03, 0x18, 0x88, 0x8c, 0x10, + 0x07, 0x29, 0x18, 0x2f, 0x5a, 0x05, 0x1e, 0x7d, 0x0d, 0x09, 0x04, 0x1e, 0x05, 0x0f, 0x08, 0x9a, + 0x7d, 0x0d, 0x09, 0x97, 0x01, 0x5a, 0x05, 0x10, 0x07, 0x2a, 0x05, 0x2c, 0x05, 0x6c, 0x18, 0x05, + 0x2c, 0x05, 0x10, 0x07, 0x18, 0x5a, 0x05, 0x9a, 0x53, 0x0d, 0x58, 0x21, 0x2f, 0x08, 0x0f, 0x05, + 0x1e, 0x53, 0x0d, 0x58, 0x1e, 0x5a, 0x30, 0x10, 0x07, 0x29, 0x67, 0x93, 0x22, 0x2f, 0x0e, 0x30, + 0x09, 0x0c, 0x1e, 0x5a, 0x8f, 0x9a, 0x40, 0x20, 0x04, 0x63, 0x33, 0x2f, 0x0e, 0x97, 0x24, 0x38, + 0x61, 0x10, 0x0c, 0x1c, 0x70, 0x0d, 0x0f, 0x0d, 0x09, 0x02, 0x6c, 0x65, 0x06, 0x02, 0x27, 0x08, + 0x39, 0x29, 0x34, 0x43, 0x6c, 0x67, 0x19, 0x5b, 0x00, 0x73, 0x0d, 0x47, 0x00, 0x58, 0x00, 0x62, + 0x00, 0x47, 0x02, 0x02, 0x3a, 0x00, 0x07, 0x07, 0x00, 0x53, 0x00, 0x39, 0x29, 0x0a, 0x56, 0x08, + 0x56, 0x37, 0x01, 0xe5, 0x91, 0x43, 0x00, 0x70, 0x00, 0x0e, 0x30, 0x0a, 0x0f, 0x01, 0x4c, 0x19, + 0x48, 0x67, 0x0d, 0x65, 0x0e, 0x07, 0x1c, 0x08, 0x0a, 0x22, 0x6f, 0x07, 0x19, 0x0a, 0x41, 0x02, + 0x2f, 0x72, 0x09, 0x6c, 0x5a, 0x0e, 0x0f, 0x0e, 0x0b, 0x05, 0x10, 0x08, 0x1c, 0x0d, 0x0a, 0x20, + 0x9b, 0x48, 0x21, 0x0a, 0x08, 0x4c, 0x1e, 0x2f, 0x45, 0x40, 0x33, 0x95, 0x75, 0x22, 0x6f, 0x5e, + 0x0a, 0x22, 0x52, 0x29, 0x27, 0x48, 0x6c, 0x3b, 0x19, 0x77, 0x06, 0x6c, 0x3d, 0x1c, 0x47, 0x10, + 0x08, 0x27, 0x5e, 0x42, 0x6c, 0x27, 0xfd, 0x2f, 0x09, 0x0c, 0x6c, 0x27, 0xe5, 0x67, 0x6c, 0x27, + 0xfd, 0x2f, 0x4d, 0x6c, 0x27, 0x2c, 0x08, 0x6c, 0x27, 0xe5, 0x05, 0x6d, 0x1c, 0x27, 0xc5, 0x3d, + 0x1c, 0x27, 0xe5, 0x05, 0x48, 0x1c, 0x27, 0xfb, 0x0e, 0x6a, 0x10, 0x09, 0x19, 0x3f, 0x0e, 0x7c, + 0x1e, 0x60, 0x49, 0x24, 0x08, 0x1c, 0x2f, 0x6d, 0x19, 0x70, 0x6c, 0x40, 0x1d, 0x3f, 0x1d, 0x67, + 0x1c, 0x2f, 0x1c, 0x2f, 0x6d, 0x29, 0x34, 0x48, 0x6c, 0x08, 0x3e, 0x01, 0x4f, 0x08, 0x1e, 0x60, + 0x0f, 0x7c, 0x10, 0x09, 0x2f, 0x5e, 0x41, 0x00, 0x8a, 0x01, 0x05, 0x63, 0x7a, 0x59, 0x7a, 0x69, + 0x7a, 0x35, 0x7a, 0x67, 0x7a, 0x59, 0x8a, 0x01, 0x05, 0x63, 0x1c, 0x2f, 0xfb, 0x0e, 0x6a, 0x10, + 0x08, 0x2f, 0xc3, 0x02, 0x8a, 0x8e, 0x19, 0x2f, 0x2c, 0x0d, 0x00, 0x8a, 0x8e, 0x19, 0x2f, 0xc3, + 0x05, 0x10, 0x07, 0xc0, 0x36, 0x1e, 0x79, 0x79, 0x79, 0x2c, 0x02, 0x1e, 0x79, 0x79, 0x79, 0x79, + 0x10, 0x09, 0x19, 0x72, 0x57, 0x0b, 0x03, 0x22, 0x28, 0x30, 0x01, 0x07, 0x45, 0x6c, 0x63, 0x1c, + 0x07, 0x03, 0x1c, 0x61, 0x1d, 0x40, 0x8f, 0x2e, 0x09, 0x1c, 0x61, 0x6c, 0x76, 0x6c, 0x63, 0x1c, + 0x76, 0x6c, 0x28, 0x30, 0x01, 0x28, 0x06, 0x22, 0x04, 0x0b, 0x57, 0x5b, 0x10, 0x09, 0x29, 0x25, + 0x26, 0x89, 0x01, 0x19, 0x26, 0x89, 0x2c, 0x0b, 0x89, 0x01, 0x19, 0x26, 0x89, 0x01, 0x19, 0x26, + 0x10, 0x03, 0x29, 0x9e, 0x19, 0x75, 0x2b, 0x33, 0x75, 0x10, 0x06, 0x1c, 0x51, 0x8e, 0x1c, 0x51, + 0x8e, 0x00, 0x08, 0x56, 0x4a, 0x33, 0x07, 0x7b, 0x60, 0x1e, 0x2f, 0x3c, 0x75, 0x10, 0x08, 0x27, + 0xe5, 0x04, 0x7f, 0x1c, 0x27, 0xf5, 0x69, 0x06, 0x6c, 0x27, 0xfd, 0x69, 0x07, 0x1e, 0x35, 0x69, + 0x08, 0x33, 0x35, 0x0e, 0x0d, 0x0b, 0x33, 0x35, 0x08, 0x01, 0x7c, 0x22, 0x27, 0xf5, 0x04, 0x6d, + 0x6c, 0x27, 0xe5, 0x08, 0x43, 0x1c, 0x27, 0xc5, 0x0d, 0x09, 0x10, 0x07, 0x00, 0x35, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x5e, 0x04, 0x10, 0x0a, 0x27, 0x36, 0x1c, 0x09, 0x25, 0x35, + 0x91, 0x00, 0x77, 0x25, 0x35, 0x08, 0x07, 0x29, 0x37, 0x25, 0x35, 0x2d, 0x55, 0x25, 0x02, 0xfd, + 0x45, 0x66, 0x00, 0x25, 0x02, 0xfd, 0x09, 0x07, 0x05, 0x09, 0x00, 0x25, 0x02, 0xfd, 0x72, 0x58, + 0x00, 0x25, 0x35, 0x2f, 0x57, 0x29, 0x25, 0x02, 0xf5, 0x64, 0xf8, 0x01, 0x10, 0x09, 0x00, 0x4a, + 0x06, 0x19, 0x95, 0x29, 0x2f, 0x36, 0x01, 0x29, 0x95, 0x00, 0x8f, 0x06, 0x09, 0x29, 0x95, 0x00, + 0x8f, 0x6f, 0x03, 0x00, 0x95, 0x00, 0x8f, 0x34, 0x0b, 0x00, 0x95, 0x29, 0x2f, 0xf5, 0x54, 0x95, + 0x29, 0x2f, 0xf5, 0x62, 0x3b, 0x1c, 0x2f, 0xe5, 0x28, 0x0a, 0x1c, 0x2f, 0xe5, 0x77, 0x0a, 0x10, + 0x09, 0x19, 0x3f, 0x31, 0x8d, 0x60, 0x30, 0x02, 0x0a, 0x0c, 0x1c, 0x2f, 0x39, 0x1c, 0x0d, 0x06, + 0x1c, 0x40, 0x6c, 0x3b, 0x1c, 0x3f, 0x6c, 0x3f, 0x1c, 0x40, 0x6c, 0x08, 0x0a, 0x19, 0x2f, 0x39, + 0x1c, 0x0d, 0x06, 0x6c, 0x60, 0x49, 0x02, 0x0a, 0x0c, 0x1e, 0x72, 0x31, 0x01, 0x10, 0x08, 0x2f, + 0x5e, 0x7c, 0x00, 0x8a, 0x34, 0x63, 0x7a, 0x0b, 0x07, 0x8a, 0x00, 0x04, 0x39, 0x1c, 0x2f, 0x5e, + 0x7c, 0x00, 0x8a, 0x8e, 0x1c, 0x51, 0x10, 0x09, 0x19, 0x3f, 0x31, 0x8d, 0x08, 0x0d, 0x49, 0x02, + 0x0b, 0x0b, 0x1c, 0x2f, 0x6d, 0x1c, 0x3d, 0x1c, 0x3f, 0x6c, 0x76, 0x1c, 0x26, 0x6c, 0x26, 0x1c, + 0x3f, 0x6c, 0x46, 0x19, 0x2f, 0x6d, 0x27, 0x07, 0x01, 0x3d, 0x6c, 0x07, 0x75, 0x5c, 0x0e, 0x0c, + 0x1e, 0x3f, 0x0f, 0x0d, 0x3f, 0x08, 0x20, 0x2f, 0x04, 0x10, 0x09, 0x2f, 0x5e, 0x0e, 0x7b, 0x8a, + 0x27, 0x0b, 0x09, 0x7a, 0x3f, 0x8a, 0x00, 0x5c, 0x09, 0x1c, 0x2f, 0x5e, 0x3a, 0x01, 0x8a, 0x05, + 0x91, 0x8a, 0x00, 0x07, 0x43, 0x7a, 0x0c, 0x09, 0x7a, 0x04, 0x6d, 0x10, 0x08, 0x00, 0x34, 0x0b, + 0x57, 0x4b, 0x1e, 0x7c, 0x01, 0x01, 0x0a, 0x0b, 0x00, 0x8a, 0x00, 0x51, 0x1c, 0x77, 0x0c, 0x06, + 0x02, 0x33, 0x2f, 0x47, 0x0f, 0x3d, 0x21, 0x2f, 0x06, 0x6d, 0x6c, 0x3f, 0x1c, 0x41, 0x1c, 0x2f, + 0x0e, 0x07, 0x02, 0x01, 0x05, 0x45, 0x6c, 0x34, 0x0b, 0x0e, 0x0f, 0x42, 0x10, 0x07, 0x6f, 0xc3, + 0x01, 0x33, 0x9e, 0x19, 0x75, 0x2b, 0x10, 0x09, 0x2f, 0x25, 0x26, 0x7a, 0x26, 0x7a, 0x26, 0x7a, + 0x26, 0x7a, 0x26, 0x7a, 0x3b, 0x22, 0x39, 0x19, 0x46, 0x22, 0x09, 0x68, 0x01, 0x04, 0x63, 0x6c, + 0x2f, 0x4e, 0x0f, 0x41, 0x10, 0x08, 0x77, 0x07, 0x1c, 0x26, 0x6c, 0x3f, 0x1c, 0x41, 0x1c, 0x2f, + 0x6d, 0x29, 0x69, 0x1e, 0x0a, 0x08, 0x29, 0x46, 0x1e, 0x61, 0x29, 0x39, 0x33, 0x63, 0x40, 0x21, + 0x08, 0x0a, 0x4c, 0x21, 0x69, 0x45, 0x21, 0x77, 0x0b, 0x10, 0x0b, 0x6f, 0x06, 0x29, 0x35, 0x08, + 0x29, 0x51, 0x3b, 0x29, 0x65, 0x0b, 0x29, 0x2d, 0x4f, 0x29, 0x4c, 0x48, 0x00, 0x5f, 0x19, 0x48, + 0x00, 0x45, 0x6a, 0x00, 0x5b, 0x19, 0x5b, 0x4f, 0x00, 0x5f, 0x00, 0x48, 0x19, 0x99, 0x99, 0x34, + 0x42, 0x0b, 0x1c, 0x24, 0x6a, 0x29, 0x0e, 0x4c, 0x6c, 0x0e, 0x0f, 0x01, 0x29, 0x0a, 0x6d, 0x1c, + 0x6f, 0x0b, 0x19, 0x28, 0x10, 0x08, 0x34, 0x45, 0x19, 0x3d, 0x22, 0x59, 0x29, 0x08, 0x0a, 0x33, + 0x41, 0x03, 0x43, 0x33, 0x69, 0x63, 0x21, 0x77, 0x0d, 0x20, 0x47, 0x0d, 0x08, 0x00, 0x8b, 0x03, + 0x6d, 0x6c, 0x2f, 0x7c, 0x29, 0x08, 0x43, 0x6c, 0x09, 0x0b, 0x19, 0x77, 0x09, 0x10, 0x08, 0x00, + 0x0a, 0x0b, 0x19, 0x6f, 0x09, 0x1c, 0x2f, 0x63, 0x29, 0x67, 0x8d, 0x65, 0x29, 0x75, 0x1e, 0x6f, + 0x08, 0x46, 0x21, 0x52, 0x0d, 0x9a, 0x0a, 0x1a, 0x0a, 0x1a, 0x0a, 0x1a, 0x4c, 0x10, 0x07, 0x00, + 0x04, 0x2c, 0x0d, 0x20, 0x77, 0x08, 0x20, 0x26, 0x20, 0x04, 0x43, 0x21, 0x52, 0x97, 0x0c, 0x07, + 0x20, 0x09, 0x0b, 0x20, 0x65, 0x9a, 0x0c, 0xc3, 0x10, 0x03, 0x34, 0x2e, 0x02, 0x33, 0x94, 0x1f, + 0x1f, 0x83, 0x83, 0x1d, 0x5d, 0x79, 0x10, 0x03, 0x77, 0x1b, 0x09, 0x04, 0x1d, 0x37, 0x1d, 0x62, + 0x1b, 0x7b, 0x1d, 0x07, 0x05, 0x1d, 0x70, 0x1d, 0x77, 0x1b, 0x55, 0x10, 0x03, 0x77, 0x0f, 0x08, + 0x1d, 0x5f, 0x92, 0x5f, 0x92, 0x5f, 0x92, 0x5f, 0x92, 0x5f, 0x21, 0x77, 0x0f, 0x08, 0x10, 0x06, + 0x29, 0x77, 0x07, 0x20, 0x7d, 0x0c, 0x20, 0x58, 0x58, 0x33, 0x66, 0x00, 0x7d, 0x00, 0x9c, 0x45, + 0x10, 0x07, 0x38, 0x2a, 0x23, 0x03, 0x2c, 0x36, 0x10, 0x04, 0x34, 0x79, 0x99, 0x10, 0x07, 0x00, + 0x18, 0x60, 0x0f, 0x75, 0x22, 0x94, 0x02, 0x50, 0x6c, 0x9b, 0x33, 0x53, 0x0b, 0x0e, 0x0c, 0x1e, + 0x40, 0x06, 0x04, 0x72, 0x1e, 0x08, 0x7b, 0x5c, 0x0d, 0x1e, 0x5c, 0x0e, 0x41, 0x25, 0x10, 0x07, + 0x94, 0x1f, 0x1f, 0x09, 0x93, 0x1e, 0x80, 0x22, 0x94, 0x8f, 0x8d, 0x24, 0x19, 0x7e, 0x01, 0x09, + 0x0a, 0x1e, 0x24, 0x3c, 0x7b, 0x10, 0x06, 0x00, 0x18, 0x40, 0x0e, 0x7b, 0x1e, 0x9d, 0x46, 0x1e, + 0x95, 0x21, 0x76, 0x1d, 0x95, 0x21, 0x9d, 0x26, 0x33, 0x40, 0x93, 0x10, 0x07, 0x6c, 0x9b, 0x1d, + 0x9b, 0x33, 0x06, 0x57, 0x6b, 0x8b, 0x5c, 0x0c, 0x9c, 0x72, 0x1e, 0x09, 0x08, 0x85, 0x40, 0x0e, + 0x6b, 0x10, 0x07, 0x00, 0x18, 0x9b, 0x0e, 0x4b, 0x1e, 0x52, 0x30, 0x09, 0x0a, 0x1e, 0x95, 0x4a, + 0x1e, 0x08, 0x2c, 0x02, 0x22, 0x3b, 0x1d, 0x9d, 0x65, 0x33, 0x9b, 0x0e, 0x42, 0x10, 0x03, 0x29, + 0x08, 0x0f, 0x09, 0x20, 0x39, 0x20, 0x0d, 0x2e, 0x05, 0x20, 0x84, 0x84, 0x84, 0x84, 0x84, 0x48, + 0x10, 0x07, 0x00, 0x18, 0x65, 0x0d, 0x60, 0x22, 0x34, 0x63, 0x62, 0x0d, 0x9c, 0x67, 0x1e, 0x09, + 0x07, 0x29, 0x44, 0x9c, 0x67, 0x22, 0x27, 0x39, 0x6e, 0x0d, 0x33, 0x28, 0x0d, 0x6b, 0x21, 0x2f, + 0x46, 0x1e, 0x5c, 0x0f, 0x0e, 0x4b, 0x10, 0x07, 0x94, 0x1f, 0x1f, 0x4e, 0x3e, 0x1e, 0x80, 0x1e, + 0x69, 0x29, 0x81, 0x4f, 0x29, 0x81, 0x4f, 0x00, 0x94, 0x10, 0x03, 0x94, 0x38, 0x4f, 0x83, 0x83, + 0x10, 0x03, 0x94, 0x38, 0x4f, 0x83, 0x83, 0x1d, 0x72, 0x20, 0x28, 0x06, 0x10, 0x06, 0x94, 0x1f, + 0x1f, 0x34, 0x63, 0x22, 0x94, 0x02, 0x3d, 0x33, 0x69, 0x0d, 0x08, 0x21, 0x5d, 0x0b, 0x0d, 0x33, + 0x94, 0x77, 0x07, 0x1e, 0x94, 0x34, 0x45, 0x22, 0x94, 0x29, 0x64, 0x10, 0x03, 0x00, 0x90, 0x90, + 0x9b, 0x10, 0x0a, 0x18, 0x03, 0x0b, 0x4e, 0x0b, 0x24, 0x0e, 0x08, 0x1c, 0x5d, 0x06, 0x62, 0x3e, + 0x5d, 0x02, 0x19, 0x69, 0x29, 0x76, 0x29, 0x3e, 0x29, 0x94, 0x29, 0x78, 0x78, 0x78, 0x5f, 0x29, + 0x42, 0x10, 0x07, 0x18, 0x24, 0x3c, 0x42, 0x1e, 0x5d, 0x06, 0x50, 0x00, 0x69, 0x29, 0x81, 0x4f, + 0x29, 0x81, 0x4f, 0x00, 0x94, 0x10, 0x07, 0x00, 0x18, 0x40, 0x93, 0x1e, 0x9d, 0x09, 0x0b, 0x1e, + 0x3b, 0x8f, 0x02, 0x22, 0x5f, 0x19, 0x3e, 0x22, 0x3b, 0x8f, 0x02, 0x22, 0x9d, 0x09, 0x0c, 0x33, + 0x40, 0x93, 0x10, 0x07, 0x18, 0x24, 0x0a, 0x36, 0x02, 0x1e, 0x80, 0x1e, 0x69, 0x8f, 0x8d, 0x24, + 0x19, 0x7e, 0x50, 0x94, 0x3c, 0x0b, 0x8d, 0x94, 0x1f, 0x10, 0x07, 0x00, 0x18, 0x65, 0x0e, 0x47, + 0x8b, 0x5c, 0x0c, 0x9c, 0x72, 0x1e, 0x5f, 0x85, 0x67, 0x3a, 0x0c, 0x1d, 0x9b, 0x1d, 0x9b, 0x10, + 0x04, 0x18, 0x24, 0x0c, 0x43, 0x33, 0x5d, 0x49, 0x21, 0x69, 0x1f, 0x1d, 0x24, 0x1d, 0x24, 0x1d, + 0x24, 0x10, 0x06, 0x00, 0x18, 0x4e, 0x7c, 0x33, 0x05, 0x7b, 0x02, 0x39, 0x1e, 0x05, 0x0e, 0x06, + 0x02, 0x20, 0x60, 0x0f, 0x0b, 0x9a, 0x24, 0x07, 0x1e, 0x07, 0x4b, 0x62, 0x06, 0x33, 0x3c, 0x3a, + 0x10, 0x03, 0x29, 0x0d, 0x1e, 0xa4, 0x20, 0x77, 0x2e, 0x9a, 0x87, 0x1b, 0x87, 0x1b, 0x79, 0x0a, + 0x79, 0x10, 0x07, 0x18, 0x2d, 0x98, 0x2d, 0x98, 0x4f, 0x29, 0x72, 0x6c, 0x8f, 0x04, 0x62, 0x0c, + 0x33, 0x73, 0x0d, 0x3f, 0x10, 0x06, 0x18, 0x0a, 0x06, 0x29, 0x95, 0x6c, 0x5a, 0x00, 0x6f, 0x05, + 0x22, 0x2f, 0x48, 0x01, 0x48, 0x33, 0x0a, 0x06, 0x05, 0x0a, 0x21, 0x05, 0x64, 0x05, 0x33, 0x2f, + 0x57, 0x9a, 0x64, 0x10, 0x09, 0x18, 0x75, 0x00, 0x05, 0x0e, 0x29, 0x09, 0x07, 0x1c, 0x08, 0x07, + 0x00, 0x08, 0x6d, 0x77, 0x02, 0x1c, 0x7d, 0x6f, 0x0a, 0x06, 0x66, 0x6c, 0x66, 0x77, 0x06, 0x54, + 0x09, 0x6c, 0x6f, 0x06, 0x09, 0x44, 0x54, 0x22, 0x73, 0x56, 0x0d, 0x0e, 0x8d, 0x5d, 0x71, 0x09, + 0x0b, 0x10, 0x06, 0x18, 0x3f, 0x00, 0x77, 0x07, 0x33, 0x6a, 0x9b, 0x33, 0x94, 0x3e, 0x21, 0x77, + 0x0c, 0x20, 0x40, 0x7f, 0x1e, 0x2f, 0x7f, 0x05, 0x48, 0x1e, 0x09, 0x0a, 0x00, 0x6f, 0x09, 0x10, + 0x06, 0x18, 0x09, 0x07, 0x29, 0x5a, 0x1e, 0x2d, 0x4d, 0x33, 0x91, 0x43, 0x33, 0x08, 0x07, 0x03, + 0x0b, 0x21, 0x5c, 0x08, 0x06, 0x21, 0x77, 0x0e, 0x9a, 0x59, 0x21, 0x2f, 0x3d, 0x21, 0x04, 0x3a, + 0x10, 0x06, 0x18, 0x08, 0x5e, 0x08, 0x21, 0x34, 0x45, 0x33, 0x2f, 0x3d, 0x21, 0x6f, 0x08, 0x20, + 0x6b, 0x20, 0x40, 0x02, 0x21, 0x6f, 0x5e, 0x0b, 0x10, 0x04, 0x29, 0x62, 0x0b, 0x20, 0x95, 0x21, + 0x99, 0x1d, 0x99, 0x20, 0x62, 0x97, 0x0a, 0x0b, 0x20, 0x2f, 0x6a, 0x1d, 0x07, 0x1a, 0x99, 0x1d, + 0x95, 0x21, 0x62, 0x0b, 0x10, 0x03, 0x29, 0x0d, 0x86, 0x0d, 0x86, 0x0d, 0x10, 0x04, 0x6f, 0x0c, + 0x01, 0x1d, 0x0a, 0x06, 0x1d, 0x08, 0x1a, 0x07, 0x1a, 0x9b, 0x01, 0x1d, 0x64, 0x20, 0x9b, 0x9a, + 0x08, 0x1a, 0x08, 0x1a, 0x0a, 0x06, 0x21, 0x6f, 0x0c, 0x01, 0x10, 0x07, 0x22, 0x2a, 0x8d, 0x6e, + 0x3a, 0x02, 0x04, 0x06, 0x22, 0x06, 0x04, 0x02, 0x4e, 0x7b, 0x6c, 0x2f, 0x10, +}; + +static const uint16_t mf_rlefont_arial12_glyph_offsets_0[95] = { + 0x0000, 0x0003, 0x0015, 0x0021, 0x0049, 0x0071, 0x00a6, 0x00d0, + 0x00d9, 0x00f3, 0x010a, 0x0118, 0x0123, 0x0129, 0x012f, 0x0134, + 0x0149, 0x016a, 0x017c, 0x0199, 0x01b7, 0x01d3, 0x01f1, 0x0217, + 0x022d, 0x0252, 0x0277, 0x027b, 0x0280, 0x0298, 0x02a3, 0x02b8, + 0x02d2, 0x032b, 0x0350, 0x037b, 0x03a3, 0x03c0, 0x03d2, 0x03e1, + 0x040d, 0x0421, 0x042a, 0x043e, 0x046b, 0x0479, 0x04ad, 0x04e0, + 0x050e, 0x0527, 0x055a, 0x057c, 0x05ad, 0x05b7, 0x05d5, 0x05fa, + 0x0635, 0x065e, 0x067e, 0x0699, 0x06a7, 0x06bc, 0x06cf, 0x06e1, + 0x06e9, 0x06ee, 0x070f, 0x0726, 0x073c, 0x0752, 0x076e, 0x0781, + 0x07a7, 0x07ba, 0x07c1, 0x07cd, 0x07ec, 0x07f2, 0x0812, 0x0826, + 0x0843, 0x085a, 0x0870, 0x0882, 0x08a1, 0x08b2, 0x08c5, 0x08e4, + 0x0912, 0x0930, 0x0951, 0x0969, 0x0985, 0x098d, 0x09ab, +}; + +static const struct mf_rlefont_char_range_s mf_rlefont_arial12_char_ranges[] = { + {32, 95, mf_rlefont_arial12_glyph_offsets_0, mf_rlefont_arial12_glyph_data_0}, +}; + +const struct mf_rlefont_s mf_rlefont_arial12 = { + { + "Arial Regular 12", + "arial_12_arial12_aa", + 13, /* width */ + 12, /* height */ + 2, /* min x advance */ + 12, /* max x advance */ + 1, /* baseline x */ + 9, /* baseline y */ + 14, /* line height */ + 0, /* flags */ + 63, /* fallback character */ + &mf_rlefont_character_width, + &mf_rlefont_render_character, + }, + 4, /* version */ + mf_rlefont_arial12_dictionary_data, + mf_rlefont_arial12_dictionary_offsets, + 96, /* rle dict count */ + 135, /* total dict count */ + 1, /* char range count */ + mf_rlefont_arial12_char_ranges, +}; + +#ifdef MF_INCLUDED_FONTS +/* List entry for searching fonts by name. */ +static const struct mf_font_list_s mf_rlefont_arial12_listentry = { + MF_INCLUDED_FONTS, + (struct mf_font_s*)&mf_rlefont_arial12 +}; +#undef MF_INCLUDED_FONTS +#define MF_INCLUDED_FONTS (&mf_rlefont_arial12_listentry) +#endif + + +/* End of automatically generated font definition for arial12. */ + diff --git a/resources/arial__14_arial14_aa.c b/resources/arial__14_arial14_aa.c new file mode 100644 index 0000000..e639736 --- /dev/null +++ b/resources/arial__14_arial14_aa.c @@ -0,0 +1,308 @@ + + +/* Start of automatically generated font definition for arial14. */ + +#ifndef MF_RLEFONT_INTERNALS +#define MF_RLEFONT_INTERNALS +#endif +#include "mf_rlefont.h" + +#ifndef MF_RLEFONT_VERSION_4_SUPPORTED +#error The font file is not compatible with this version of mcufont. +#endif + +static const uint8_t mf_rlefont_arial14_dictionary_data[365] = { + 0x06, 0x02, 0x0e, 0x04, 0x0a, 0x0b, 0x08, 0xcd, 0xc6, 0xc2, 0x0c, 0x07, 0x80, 0xc5, 0x09, 0x12, + 0xc2, 0x02, 0xc4, 0x80, 0x0d, 0xc5, 0x80, 0xc4, 0xcb, 0xca, 0xc9, 0x01, 0x84, 0xcb, 0xca, 0x10, + 0x0c, 0xce, 0xc9, 0xc7, 0xcd, 0xce, 0xcb, 0x40, 0x21, 0x85, 0xc9, 0x05, 0xce, 0xcb, 0xc7, 0xcb, + 0x80, 0x01, 0xc9, 0x03, 0xc8, 0xcb, 0xc8, 0xcc, 0x83, 0xc3, 0xce, 0xc2, 0xc9, 0xcc, 0xc2, 0xcd, + 0xc3, 0xc9, 0xcc, 0xc2, 0xcd, 0xca, 0xcc, 0xc9, 0x0d, 0xc1, 0x80, 0xc3, 0x80, 0x01, 0xc1, 0xc2, + 0xcc, 0xc1, 0x80, 0xc2, 0xc4, 0xce, 0x01, 0xcb, 0xcc, 0xc2, 0xca, 0xcb, 0xc9, 0x05, 0xcc, 0xc9, + 0xcb, 0xc2, 0xc1, 0xc3, 0xc7, 0xcc, 0xc1, 0x06, 0xc4, 0xcd, 0xc1, 0xc2, 0xc5, 0xcd, 0xc5, 0xcb, + 0xce, 0xc5, 0x01, 0xc1, 0xca, 0x2e, 0xc8, 0xca, 0xc6, 0x80, 0xc2, 0x80, 0xda, 0xce, 0xc6, 0x01, + 0xcd, 0xc9, 0xce, 0xca, 0x01, 0xc8, 0xc8, 0xcd, 0xce, 0xc2, 0xcd, 0xc8, 0xc6, 0xcd, 0xcd, 0x80, + 0x11, 0x80, 0xc3, 0x82, 0xcb, 0xc5, 0xc6, 0xce, 0x01, 0xce, 0xcd, 0x01, 0xcc, 0xc3, 0x01, 0xcc, + 0xca, 0xc7, 0xcb, 0x01, 0xc3, 0xc5, 0xce, 0xce, 0xcc, 0xc3, 0xca, 0x2f, 0xc4, 0x01, 0xce, 0xc3, + 0x27, 0x6a, 0x27, 0x6a, 0x27, 0x6a, 0x27, 0x6a, 0x75, 0x2c, 0x18, 0x32, 0x2c, 0x65, 0x1e, 0x44, + 0x25, 0x20, 0x5c, 0x20, 0x5c, 0x22, 0x27, 0x21, 0x57, 0x07, 0x19, 0x51, 0x1b, 0x44, 0x25, 0x07, + 0x27, 0x0d, 0x07, 0x27, 0x0d, 0x0e, 0x01, 0x44, 0x20, 0x44, 0x20, 0x44, 0x0d, 0x01, 0x2e, 0x6d, + 0x07, 0x23, 0x5f, 0x01, 0x01, 0x21, 0x01, 0x19, 0x04, 0x2e, 0x25, 0x51, 0x1e, 0x5c, 0x25, 0x51, + 0x1e, 0x5c, 0x0c, 0x0b, 0x21, 0x5e, 0x38, 0x28, 0x26, 0x27, 0x68, 0x27, 0x68, 0x27, 0x5e, 0x38, + 0x02, 0x0e, 0x2f, 0x01, 0x01, 0x68, 0x1d, 0x46, 0x68, 0x1d, 0x46, 0x68, 0x1d, 0x46, 0x68, 0x1d, + 0x46, 0x68, 0x2e, 0x44, 0x28, 0x21, 0x0d, 0x07, 0x1b, 0x28, 0x21, 0x0d, 0x07, 0x38, 0x0e, 0x07, + 0x1e, 0x44, 0x02, 0x21, 0x27, 0x04, 0x43, 0x09, 0x6e, 0x01, 0x2e, 0x6b, 0x2e, 0x6b, 0x2e, 0x2d, + 0x48, 0x23, 0x24, 0x01, 0x0d, 0x01, 0x1e, 0x23, 0x02, 0x0b, 0x0e, 0x1d, 0x37, 0x67, 0x02, 0x0b, + 0x0e, 0x2f, 0x01, 0x23, 0x5f, 0x54, 0x6f, 0x1e, 0x08, 0x07, 0x27, 0x0e, 0x08, 0x01, 0x1c, 0x22, + 0x19, 0x01, 0x22, 0x4d, 0x0f, 0x0a, 0x27, 0x51, 0x05, 0x0c, 0x06, 0x0c, 0x00, 0x02, 0x00, 0x21, + 0x44, 0x26, 0x01, 0x0a, 0x43, 0x0a, 0x43, 0x0a, 0x43, 0x0a, 0x43, 0x2a, 0x18, +}; + +static const uint16_t mf_rlefont_arial14_dictionary_offsets[148] = { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0009, 0x000b, 0x000c, 0x000e, 0x000f, 0x0010, 0x0012, 0x0014, + 0x0015, 0x0017, 0x0019, 0x001c, 0x001d, 0x001f, 0x0020, 0x0021, + 0x0023, 0x0025, 0x0027, 0x0029, 0x002a, 0x002d, 0x002f, 0x0031, + 0x0033, 0x0034, 0x0036, 0x0038, 0x0039, 0x003b, 0x003d, 0x003f, + 0x0041, 0x0043, 0x0045, 0x0047, 0x0049, 0x004b, 0x004d, 0x004f, + 0x0051, 0x0054, 0x0057, 0x0059, 0x005b, 0x005d, 0x005e, 0x0060, + 0x0062, 0x0064, 0x0066, 0x0068, 0x006a, 0x006c, 0x006e, 0x0070, + 0x0073, 0x0075, 0x0076, 0x0078, 0x007a, 0x007c, 0x007d, 0x0080, + 0x0082, 0x0084, 0x0086, 0x0088, 0x008a, 0x008c, 0x008e, 0x0090, + 0x0091, 0x0093, 0x0094, 0x0096, 0x0099, 0x009b, 0x009d, 0x009f, + 0x00a1, 0x00a3, 0x00a5, 0x00a7, 0x00a9, 0x00ab, 0x00ac, 0x00ae, + 0x00b0, 0x00b8, 0x00bd, 0x00c1, 0x00c5, 0x00c7, 0x00c9, 0x00cf, + 0x00d5, 0x00d7, 0x00dc, 0x00de, 0x00e1, 0x00e4, 0x00e6, 0x00e8, + 0x00ea, 0x00f2, 0x00f4, 0x00f8, 0x00fa, 0x00fe, 0x0100, 0x0102, + 0x0104, 0x0114, 0x011e, 0x0120, 0x0122, 0x0124, 0x0129, 0x012b, + 0x012f, 0x0133, 0x0135, 0x0137, 0x013b, 0x013d, 0x0148, 0x014b, + 0x014d, 0x014f, 0x0151, 0x0154, 0x0156, 0x0158, 0x015a, 0x015d, + 0x015f, 0x0161, 0x0163, 0x016d, +}; + +static const uint8_t mf_rlefont_arial14_glyph_data_0[2988] = { + 0x04, 0x00, 0x10, 0x04, 0x67, 0x89, 0x27, 0x89, 0x27, 0x89, 0x27, 0x2c, 0x27, 0x2a, 0x9c, 0x08, + 0x27, 0x9e, 0x07, 0x06, 0x1c, 0x24, 0x2c, 0x10, 0x05, 0x2d, 0x28, 0x02, 0x22, 0x1c, 0x28, 0x02, + 0x22, 0x1c, 0x49, 0x68, 0x23, 0x46, 0x0c, 0x6d, 0x01, 0x10, 0x08, 0x24, 0x29, 0x00, 0x8e, 0x23, + 0x61, 0x08, 0x00, 0x56, 0x1c, 0x6a, 0x61, 0x07, 0x1e, 0x0d, 0x33, 0x09, 0x1e, 0x41, 0x19, 0x80, + 0x23, 0x05, 0x0a, 0x00, 0x41, 0x23, 0x0d, 0x33, 0x09, 0x21, 0x6d, 0x04, 0x37, 0x07, 0x1c, 0x80, + 0x6d, 0x03, 0x1e, 0x71, 0x0d, 0x19, 0x0e, 0x10, 0x08, 0x38, 0x61, 0x03, 0x1c, 0x71, 0x0c, 0x0f, + 0x60, 0x85, 0x46, 0x9f, 0x08, 0x05, 0x2c, 0x1e, 0x45, 0x61, 0x03, 0x1c, 0x02, 0x68, 0x08, 0x03, + 0x1d, 0x72, 0x5f, 0x04, 0x1c, 0x46, 0x09, 0x09, 0x64, 0x1c, 0x61, 0x03, 0x26, 0x1c, 0x61, 0x03, + 0x45, 0x85, 0x72, 0x04, 0x08, 0x56, 0x0b, 0x23, 0x06, 0x66, 0x60, 0xa0, 0x61, 0x03, 0x10, 0x0c, + 0x67, 0x06, 0x6c, 0x04, 0x19, 0x6d, 0x03, 0x1b, 0x46, 0x77, 0x49, 0x00, 0x06, 0x09, 0x18, 0x8e, + 0xf8, 0x01, 0x99, 0x02, 0x4d, 0x46, 0x77, 0x49, 0x07, 0x08, 0x1e, 0x06, 0x6c, 0x04, 0x01, 0x82, + 0x9c, 0x07, 0x01, 0x0b, 0x60, 0x1e, 0x41, 0x00, 0x5a, 0x01, 0x0b, 0x06, 0x21, 0x0a, 0x05, 0x00, + 0x0a, 0x06, 0x61, 0x08, 0x4d, 0x71, 0x0c, 0x19, 0x5a, 0x01, 0x0b, 0x06, 0x4d, 0x6d, 0x76, 0x46, + 0x0b, 0x60, 0x10, 0x09, 0x24, 0x53, 0x60, 0xa0, 0x0e, 0x06, 0x01, 0x0c, 0x08, 0x00, 0x93, 0x6e, + 0x2a, 0x23, 0x40, 0x55, 0x02, 0x23, 0x61, 0x0f, 0x63, 0x1c, 0x4a, 0x04, 0x9f, 0x00, 0x07, 0x02, + 0x18, 0x26, 0x02, 0x71, 0xa3, 0x0f, 0x52, 0x28, 0x86, 0x06, 0xa3, 0x18, 0x46, 0x8f, 0x47, 0x0d, + 0x0e, 0x04, 0x18, 0x71, 0x36, 0x9f, 0x01, 0x07, 0x09, 0x10, 0x03, 0x2d, 0x5b, 0x27, 0x5b, 0x27, + 0x49, 0x2e, 0x02, 0x0b, 0x10, 0x05, 0x24, 0x47, 0x27, 0x6a, 0x1d, 0x71, 0x0d, 0x27, 0x0a, 0x08, + 0x18, 0x7d, 0x1c, 0x46, 0x68, 0x2e, 0x5c, 0x20, 0x01, 0x68, 0x18, 0x7d, 0x9c, 0x08, 0x2e, 0x71, + 0x0d, 0x1a, 0x6a, 0x27, 0x47, 0x10, 0x05, 0x67, 0x3e, 0x27, 0x56, 0x1a, 0x3f, 0x2e, 0x61, 0x43, + 0x72, 0x27, 0x45, 0x96, 0x5c, 0x20, 0x45, 0x96, 0x72, 0x00, 0x9c, 0x43, 0x77, 0x2e, 0x56, 0x27, + 0x3e, 0x10, 0x05, 0x24, 0x3e, 0x1d, 0x06, 0x42, 0x5a, 0x1d, 0x06, 0x60, 0x01, 0x1d, 0x0a, 0x03, + 0x4f, 0x10, 0x08, 0x19, 0x75, 0x5a, 0x27, 0x5a, 0x27, 0x5a, 0x23, 0x71, 0x33, 0x06, 0x1c, 0x5a, + 0x27, 0x5a, 0x27, 0x5a, 0x10, 0x04, 0x1e, 0x75, 0x32, 0x2c, 0x95, 0x10, 0x05, 0x1e, 0x32, 0x61, + 0xff, 0x68, 0x10, 0x04, 0x1e, 0x75, 0x32, 0x2c, 0x10, 0x04, 0x24, 0x29, 0x27, 0x9e, 0x0c, 0x20, + 0x41, 0x27, 0x06, 0x43, 0x0a, 0x04, 0x27, 0x0e, 0x96, 0x29, 0x00, 0x9c, 0x06, 0x27, 0x0d, 0x02, + 0x10, 0x08, 0x67, 0x58, 0x0e, 0x92, 0x1c, 0x0a, 0x0b, 0x50, 0x1f, 0x1e, 0x5c, 0x25, 0xa6, 0x21, + 0x72, 0x38, 0x45, 0x1e, 0x65, 0x38, 0x5c, 0x85, 0x65, 0x38, 0x5c, 0x85, 0x72, 0x38, 0x45, 0x1e, + 0x5c, 0x25, 0xa6, 0x1e, 0x0b, 0x0b, 0x50, 0x1f, 0x23, 0x58, 0x0e, 0x92, 0x10, 0x08, 0x24, 0x46, + 0x3f, 0x1d, 0x47, 0x68, 0x1c, 0x04, 0x2f, 0x68, 0x1c, 0x04, 0x6e, 0x8c, 0x8c, 0x8c, 0x68, 0x10, + 0x08, 0x9d, 0x03, 0xe5, 0x72, 0x27, 0x65, 0x1d, 0x46, 0x64, 0x1c, 0x46, 0x2c, 0x1c, 0x46, 0x6f, + 0x1d, 0x02, 0x64, 0x1c, 0x46, 0x64, 0x2e, 0x07, 0x33, 0x01, 0x10, 0x08, 0x67, 0x58, 0x6c, 0x07, + 0x1c, 0x4c, 0x50, 0x5e, 0x21, 0x5c, 0x86, 0x2a, 0x1d, 0x04, 0x57, 0x1c, 0x66, 0x0b, 0x96, 0x01, + 0x4a, 0x27, 0x45, 0x94, 0x49, 0x19, 0x26, 0x9a, 0x5f, 0x50, 0x5f, 0x9b, 0x64, 0x10, 0x08, 0x1e, + 0x9c, 0x0b, 0x2e, 0x26, 0x0b, 0x2e, 0x0d, 0x89, 0x1d, 0x5a, 0x70, 0x23, 0x71, 0x80, 0x70, 0x23, + 0x6d, 0x06, 0x00, 0x70, 0x23, 0x39, 0x19, 0x70, 0x1e, 0x6d, 0x33, 0x02, 0x1d, 0x70, 0x27, 0x70, + 0x10, 0x08, 0x67, 0x05, 0x3b, 0x0b, 0x23, 0x5a, 0x27, 0x35, 0x27, 0x31, 0x0e, 0x2f, 0x9a, 0x5c, + 0x08, 0x50, 0x6f, 0x27, 0x26, 0x96, 0x02, 0x68, 0x21, 0x26, 0x86, 0x26, 0x52, 0x46, 0x5f, 0x50, + 0x64, 0x9b, 0x9f, 0x10, 0x08, 0x18, 0x9c, 0x0e, 0x0e, 0x4f, 0x1e, 0x37, 0x0d, 0x02, 0x01, 0x42, + 0x93, 0x87, 0x72, 0x27, 0x06, 0x0c, 0x65, 0x60, 0x9a, 0x07, 0x2f, 0x54, 0x0b, 0x0b, 0x1e, 0x06, + 0xe5, 0x45, 0x85, 0x45, 0x86, 0x45, 0x9a, 0x0b, 0x0b, 0x54, 0x2c, 0x23, 0x58, 0x0e, 0x8f, 0x10, + 0x08, 0x2d, 0x05, 0x33, 0x20, 0x4e, 0x2e, 0x30, 0x2e, 0x8e, 0x87, 0x3a, 0x27, 0x5e, 0x1d, 0x28, + 0x01, 0x9c, 0x0b, 0x2e, 0x6d, 0x43, 0x1f, 0x10, 0x08, 0x67, 0x4b, 0x0e, 0x64, 0x1c, 0x2c, 0x01, + 0x41, 0x07, 0x4d, 0xd4, 0x04, 0x19, 0x39, 0x23, 0x2c, 0x01, 0x41, 0x07, 0x23, 0x8e, 0xff, 0x0b, + 0x1e, 0x46, 0x9f, 0x54, 0x6f, 0x1e, 0x6b, 0x19, 0x45, 0x85, 0x72, 0x38, 0x45, 0x52, 0x46, 0x2f, + 0x54, 0x0b, 0x0b, 0x1e, 0x71, 0x0b, 0x0e, 0x8f, 0x10, 0x08, 0x2d, 0x71, 0x0b, 0x6c, 0x07, 0x1e, + 0x46, 0x8f, 0x47, 0x07, 0x1e, 0x72, 0x38, 0x53, 0x1e, 0x72, 0x38, 0x26, 0x52, 0x46, 0x9f, 0x54, + 0x36, 0x94, 0x71, 0x0c, 0x73, 0x28, 0x20, 0x26, 0x96, 0x3a, 0x93, 0x05, 0x01, 0x05, 0x22, 0x23, + 0xa5, 0x0f, 0x1f, 0x10, 0x04, 0x79, 0x10, 0x04, 0x79, 0x95, 0x10, 0x08, 0x1b, 0x75, 0x3d, 0x06, + 0x1c, 0x04, 0x0a, 0x1f, 0x9a, 0xa5, 0x1f, 0x1c, 0x04, 0xa3, 0x27, 0xa5, 0x1f, 0x27, 0x04, 0x0a, + 0x1f, 0x96, 0x3d, 0x06, 0x10, 0x08, 0x27, 0x75, 0x71, 0x33, 0x06, 0x24, 0x24, 0x71, 0x33, 0x06, + 0x10, 0x08, 0x59, 0x74, 0x03, 0x27, 0xa5, 0x6a, 0x27, 0xa5, 0x1f, 0x96, 0x08, 0x0f, 0x06, 0x1c, + 0xa5, 0x1f, 0x9a, 0xa5, 0x0c, 0x05, 0x1c, 0x74, 0x03, 0x10, 0x08, 0x9d, 0x26, 0x86, 0x8b, 0x6b, + 0x1d, 0x04, 0x5e, 0x1c, 0x02, 0x92, 0x9c, 0x0a, 0x27, 0x35, 0x1c, 0x24, 0x64, 0x10, 0x0e, 0x19, + 0x24, 0x56, 0x66, 0x0d, 0x0a, 0x05, 0x4d, 0x46, 0x4a, 0x06, 0xa7, 0x02, 0x65, 0x0a, 0x4d, 0x4c, + 0x4d, 0x46, 0x0b, 0x08, 0x38, 0x56, 0x00, 0x61, 0x6c, 0x72, 0x05, 0x8e, 0x86, 0x0c, 0x76, 0x0a, + 0x4f, 0x47, 0x0f, 0xa7, 0x0b, 0x04, 0x46, 0x0e, 0x00, 0x26, 0x25, 0x30, 0x19, 0x0a, 0x05, 0x71, + 0x0c, 0x00, 0x39, 0x38, 0x5a, 0x19, 0x3f, 0x71, 0x0d, 0x37, 0x0a, 0x38, 0x0d, 0x07, 0x00, 0xa5, + 0x00, 0x46, 0x80, 0x05, 0x77, 0x4b, 0x22, 0x55, 0x02, 0x38, 0x35, 0x61, 0x6c, 0x04, 0x0c, 0x0e, + 0x4f, 0x1b, 0x3c, 0x04, 0x21, 0x41, 0x05, 0x38, 0x04, 0x60, 0x04, 0x01, 0x00, 0x50, 0x08, 0x8d, + 0x46, 0x70, 0x0e, 0x0f, 0x73, 0x08, 0x25, 0x09, 0x00, 0x24, 0x5b, 0x07, 0x2e, 0x2c, 0x0d, 0x1d, + 0x5c, 0x8e, 0x04, 0x1c, 0x39, 0x37, 0x0a, 0x1c, 0x1f, 0x00, 0x26, 0x02, 0x1e, 0x26, 0x86, 0x9f, + 0x1e, 0x0a, 0x2b, 0x0e, 0xa8, 0x04, 0x38, 0x02, 0x22, 0x18, 0x07, 0x0e, 0x4d, 0x0b, 0x0b, 0x18, + 0x4e, 0x4d, 0x28, 0x02, 0x10, 0x09, 0x2d, 0xe2, 0x31, 0x03, 0x1e, 0xa1, 0x58, 0x0e, 0x1e, 0x22, + 0x38, 0x26, 0x85, 0xa1, 0x58, 0x07, 0x1e, 0x33, 0x08, 0x1e, 0xa1, 0x01, 0x07, 0x22, 0x21, 0x22, + 0x1b, 0x64, 0x21, 0x22, 0x1b, 0x0d, 0x07, 0x21, 0xa1, 0x01, 0x07, 0x0f, 0x94, 0x3b, 0x31, 0x04, + 0x10, 0x0a, 0x24, 0x3d, 0x66, 0x0d, 0x07, 0x1e, 0x02, 0x2f, 0x02, 0x01, 0x53, 0x0a, 0x21, 0x2c, + 0x38, 0x71, 0x77, 0x4d, 0x5c, 0x87, 0x26, 0x96, 0x26, 0x20, 0x44, 0x04, 0x4d, 0x06, 0x02, 0x18, + 0x2c, 0x1b, 0x45, 0x04, 0x4d, 0x71, 0x2f, 0x02, 0x01, 0x53, 0x0a, 0x1e, 0x74, 0x0e, 0x0f, 0x0d, + 0x07, 0x10, 0x0a, 0x67, 0x0e, 0x69, 0x73, 0x05, 0x1e, 0x5e, 0x46, 0x06, 0x22, 0x21, 0x8d, 0x62, + 0x21, 0x8d, 0x02, 0x68, 0x18, 0x8d, 0xa2, 0x00, 0x8d, 0xa2, 0x00, 0x8d, 0x03, 0x68, 0x18, 0x8d, + 0x62, 0x21, 0x5e, 0x46, 0x06, 0x57, 0x18, 0x0e, 0x69, 0x31, 0x04, 0x10, 0x09, 0x67, 0x0d, 0x2b, + 0x22, 0x21, 0x0d, 0x07, 0x27, 0x0d, 0x7f, 0x33, 0x1e, 0x0d, 0x7f, 0x7f, 0x33, 0x09, 0x10, 0x09, + 0x67, 0x0d, 0x2b, 0x0e, 0x1e, 0x0d, 0x07, 0x27, 0x0d, 0x7f, 0x3b, 0x68, 0x1e, 0x0d, 0x7f, 0x7f, + 0x07, 0x10, 0x0b, 0x67, 0x46, 0x08, 0x66, 0x31, 0x03, 0x21, 0x99, 0x0b, 0x03, 0x46, 0x07, 0x0f, + 0x04, 0x18, 0x42, 0x1b, 0x37, 0x0a, 0x4d, 0xa2, 0x52, 0x45, 0x20, 0x45, 0x25, 0x04, 0x3b, 0x4d, + 0xa2, 0x26, 0x18, 0x0a, 0x0b, 0x4d, 0x26, 0x18, 0x99, 0x0b, 0x03, 0x01, 0x01, 0x65, 0x0c, 0x18, + 0x46, 0x51, 0x0e, 0x31, 0x06, 0x10, 0x0a, 0x67, 0x0d, 0x07, 0x1b, 0x91, 0x00, 0x28, 0x21, 0x0d, + 0x07, 0x1b, 0x28, 0x21, 0x66, 0x33, 0x21, 0x0d, 0x07, 0x1b, 0x91, 0x00, 0x91, 0x00, 0x28, 0x10, + 0x04, 0x67, 0xaa, 0x18, 0xaa, 0x10, 0x07, 0x19, 0x24, 0x97, 0x97, 0x97, 0x6b, 0x1e, 0x07, 0x0a, + 0x19, 0x30, 0x23, 0x05, 0x63, 0x02, 0x4e, 0x23, 0x61, 0x0e, 0x60, 0x01, 0x10, 0x09, 0x67, 0xa1, + 0x71, 0x2f, 0x21, 0xa1, 0x03, 0x2f, 0x1e, 0x22, 0x71, 0x2f, 0x23, 0x22, 0x02, 0x2f, 0x18, 0xd4, + 0x30, 0x68, 0x18, 0xd4, 0xa3, 0x0b, 0x82, 0x4d, 0xd4, 0x0c, 0x54, 0x60, 0x23, 0xa1, 0x26, 0x06, + 0x1e, 0xa1, 0x61, 0x68, 0x21, 0x22, 0x38, 0x6d, 0x82, 0x10, 0x08, 0x67, 0x7c, 0x7c, 0x7c, 0x7c, + 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x33, 0x04, 0x10, 0x0c, 0x67, 0x0e, 0x68, 0x1b, 0x28, 0x34, 0x64, + 0x1b, 0x0b, 0x0d, 0x34, 0x62, 0x19, 0x46, 0x6f, 0x34, 0x05, 0x3f, 0x19, 0x06, 0x5a, 0x34, 0x05, + 0x08, 0x08, 0x19, 0x0b, 0x74, 0x34, 0x05, 0x53, 0x00, 0x99, 0x00, 0x2a, 0x1b, 0x57, 0x77, 0x06, + 0x08, 0x00, 0x0a, 0x34, 0x05, 0x37, 0x39, 0x6e, 0x2a, 0x1b, 0x57, 0x04, 0x6c, 0x19, 0x0a, 0x34, + 0x05, 0x19, 0x2f, 0x19, 0x2a, 0x10, 0x0a, 0x67, 0x31, 0x1b, 0x28, 0x21, 0x6c, 0x05, 0x38, 0x28, + 0x21, 0x0e, 0x06, 0x0c, 0x86, 0x28, 0x21, 0x0e, 0x05, 0x05, 0x08, 0x19, 0x28, 0x7d, 0x0b, 0x6e, + 0x28, 0x7d, 0x02, 0x0b, 0x00, 0x28, 0x7d, 0x61, 0x06, 0x28, 0x7d, 0x46, 0x0c, 0x5b, 0x7d, 0x19, + 0x05, 0x66, 0x7d, 0x38, 0x0a, 0x0f, 0x10, 0x0b, 0x24, 0x3d, 0x66, 0x64, 0x85, 0x02, 0x60, 0x03, + 0x50, 0x0b, 0x0d, 0x52, 0x2c, 0x4d, 0x6f, 0x4d, 0x5c, 0x04, 0x4d, 0x28, 0x01, 0x1b, 0xa9, 0x4d, + 0x02, 0x68, 0x1b, 0xa9, 0x1b, 0x71, 0x68, 0x1b, 0x5c, 0x04, 0x4d, 0x28, 0x01, 0x4d, 0x0b, 0x0b, + 0x4d, 0x6f, 0x18, 0x02, 0x60, 0xa7, 0x4b, 0x0d, 0x94, 0x01, 0x09, 0x66, 0x64, 0x01, 0x10, 0x09, + 0x67, 0x0e, 0x3b, 0x1f, 0x1e, 0x5e, 0x19, 0x04, 0x22, 0x21, 0x8d, 0x2c, 0x21, 0x8d, 0x2c, 0x21, + 0x5e, 0x46, 0x5b, 0x04, 0x21, 0x0e, 0x3b, 0x0c, 0x06, 0x1e, 0x5e, 0x2e, 0x5e, 0x2e, 0x5e, 0x2e, + 0x5e, 0x10, 0x0b, 0x24, 0x3d, 0x66, 0x64, 0x52, 0x71, 0x2f, 0x03, 0x50, 0x0b, 0x0d, 0x52, 0x6f, + 0x4d, 0x5f, 0x1b, 0x71, 0x68, 0x4d, 0x6b, 0x1b, 0x28, 0x01, 0x4d, 0x45, 0x02, 0x1b, 0x28, 0x01, + 0x4d, 0x45, 0x02, 0x38, 0x71, 0x68, 0x4d, 0x5b, 0x01, 0x4d, 0x6f, 0x19, 0x05, 0x08, 0x01, 0x6f, + 0x4d, 0x71, 0x2f, 0x02, 0x03, 0x0c, 0x0f, 0x0e, 0x94, 0x3d, 0x66, 0x31, 0x31, 0x20, 0x01, 0x06, + 0x01, 0x10, 0x0a, 0x67, 0x0e, 0x3b, 0x60, 0x94, 0x5e, 0x00, 0x71, 0x89, 0x8a, 0x52, 0x8d, 0x28, + 0x52, 0x5e, 0x00, 0x71, 0x6f, 0x21, 0x0e, 0x3b, 0x2f, 0x85, 0x5e, 0x01, 0x62, 0x02, 0x1e, 0x5e, + 0x00, 0x37, 0x0d, 0x94, 0x8d, 0x0c, 0x0c, 0x21, 0x8d, 0x02, 0x2f, 0x10, 0x09, 0x2d, 0x46, 0x08, + 0x66, 0x2f, 0x9a, 0x42, 0x6e, 0x02, 0x4a, 0x00, 0x7d, 0x19, 0x02, 0x68, 0x18, 0x6d, 0x0c, 0x03, + 0x2e, 0x47, 0x0f, 0x60, 0x06, 0xa0, 0x02, 0x07, 0x0a, 0x0f, 0x0d, 0x96, 0x02, 0x9f, 0x18, 0xa9, + 0x1b, 0x0b, 0x08, 0x21, 0x89, 0x03, 0x01, 0x01, 0x05, 0x77, 0x18, 0x46, 0x09, 0x66, 0x31, 0x03, + 0x10, 0x09, 0x2d, 0x0a, 0x0f, 0x33, 0x04, 0x23, 0x97, 0x97, 0x97, 0x97, 0x6b, 0x10, 0x0a, 0x1c, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x21, 0x0d, 0x07, 0x1b, 0x6b, 0x18, 0x4c, 0x1b, 0x3a, 0x21, + 0x28, 0x06, 0x01, 0x01, 0x72, 0x05, 0x1e, 0xa5, 0x0e, 0x73, 0x05, 0x10, 0x09, 0x2d, 0x2c, 0x4d, + 0x28, 0x01, 0x4d, 0x28, 0x01, 0x1b, 0x2c, 0x21, 0x92, 0x38, 0x5c, 0x04, 0x21, 0x40, 0x38, 0x30, + 0x21, 0x71, 0x68, 0x19, 0x0d, 0x07, 0x1e, 0x6d, 0x08, 0x00, 0xa9, 0x23, 0x6b, 0x5d, 0x19, 0x93, + 0x28, 0x04, 0x1d, 0x0a, 0x6c, 0x2e, 0x26, 0x08, 0x10, 0x0d, 0x2d, 0x2c, 0x38, 0x28, 0x09, 0x38, + 0x6b, 0x00, 0x30, 0x19, 0x37, 0x0d, 0x0d, 0x38, 0x5d, 0x19, 0x45, 0x25, 0x0d, 0x28, 0x25, 0x1f, + 0x38, 0x57, 0x8e, 0x6d, 0x06, 0x00, 0x5c, 0x02, 0x38, 0x2a, 0x06, 0x0b, 0x00, 0x70, 0x00, 0xa6, + 0x38, 0xa6, 0x35, 0x00, 0x3c, 0x37, 0x08, 0x1b, 0x5c, 0x01, 0x0e, 0x25, 0x0e, 0x53, 0x04, 0x4d, + 0x0d, 0x0c, 0x0d, 0x38, 0x42, 0x0f, 0x4d, 0x37, 0x0f, 0x09, 0x38, 0x5b, 0x0b, 0x18, 0x05, 0x22, + 0x38, 0x5c, 0x07, 0x10, 0x09, 0x2d, 0x02, 0x92, 0x1b, 0x4e, 0x21, 0x5b, 0x6e, 0x37, 0x0d, 0x9a, + 0x0b, 0x82, 0x05, 0x68, 0x1e, 0x46, 0x60, 0x5e, 0x1c, 0x28, 0x0b, 0x9c, 0x0f, 0x63, 0x1c, 0x28, + 0x04, 0x89, 0x23, 0x02, 0x92, 0x00, 0x45, 0x07, 0x1e, 0x89, 0x38, 0x07, 0x68, 0x4d, 0x61, 0x80, + 0x1b, 0x0b, 0x82, 0x10, 0x09, 0x1b, 0x9c, 0x80, 0x1b, 0x0a, 0x82, 0x4d, 0x99, 0x0a, 0x38, 0x05, + 0x68, 0x21, 0x04, 0x22, 0x46, 0x92, 0x1e, 0x37, 0x80, 0x42, 0x1c, 0x99, 0x0d, 0x63, 0x1d, 0x26, + 0x07, 0x1b, 0x93, 0x87, 0x44, 0x87, 0x44, 0x87, 0x44, 0x04, 0x10, 0x09, 0x2d, 0x5c, 0x33, 0x01, + 0x1d, 0x99, 0x0a, 0x2e, 0x4a, 0x01, 0x1d, 0x07, 0x63, 0x1d, 0x26, 0x04, 0x1d, 0x02, 0x92, 0x2e, + 0x89, 0x9c, 0x82, 0x1d, 0x05, 0x68, 0x2e, 0x0b, 0x33, 0x68, 0x10, 0x04, 0x1e, 0x93, 0xa3, 0x1d, + 0x90, 0x03, 0x2e, 0x90, 0xa3, 0x10, 0x04, 0x2d, 0x0d, 0xa7, 0x9c, 0x06, 0x27, 0x29, 0x1a, 0x80, + 0x27, 0x0a, 0x04, 0x27, 0x06, 0x43, 0x41, 0x1a, 0x3e, 0x27, 0x9e, 0x29, 0x10, 0x04, 0x2d, 0x0b, + 0xff, 0x27, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x26, 0x2e, 0x0b, 0xff, + 0x10, 0x07, 0x24, 0x07, 0x0e, 0x96, 0x5f, 0x08, 0x1d, 0x06, 0x0a, 0x8e, 0xa0, 0x0d, 0x76, 0x0a, + 0x07, 0x23, 0x65, 0x19, 0x04, 0x80, 0x10, 0x08, 0x00, 0x32, 0x32, 0x45, 0x33, 0x0e, 0x10, 0x05, + 0x2d, 0x01, 0x92, 0x2e, 0x71, 0x0d, 0x10, 0x08, 0x75, 0x04, 0x0c, 0x0e, 0x0f, 0x0c, 0x03, 0x1e, + 0x02, 0x22, 0x00, 0x02, 0x6f, 0xa4, 0x1e, 0x46, 0x06, 0x09, 0x0b, 0x73, 0x1e, 0x99, 0x0c, 0x07, + 0x04, 0x51, 0x1e, 0x6b, 0x19, 0x40, 0x1e, 0x05, 0x77, 0x01, 0x5b, 0x0d, 0x1e, 0x37, 0x0e, 0x60, + 0x5b, 0x01, 0x10, 0x08, 0x2d, 0x81, 0x30, 0x2f, 0x00, 0x93, 0x0d, 0x02, 0x02, 0x4e, 0x93, 0x04, + 0x19, 0x26, 0x93, 0x86, 0x48, 0xa8, 0x86, 0x5c, 0x02, 0xa8, 0x04, 0x19, 0x72, 0x93, 0x3e, 0x02, + 0x64, 0x93, 0x07, 0x0e, 0x2f, 0x10, 0x07, 0x75, 0x4b, 0x0e, 0x2f, 0x1c, 0x6f, 0x54, 0x0b, 0x08, + 0x1e, 0x26, 0x96, 0x65, 0x27, 0x65, 0x27, 0xa9, 0x27, 0x6f, 0x54, 0x5d, 0x23, 0x02, 0x36, 0x8f, + 0x10, 0x08, 0x1e, 0xa4, 0xa4, 0x1e, 0x71, 0x36, 0x0c, 0x40, 0x84, 0x05, 0x73, 0x1e, 0x72, 0x86, + 0x40, 0x1e, 0x51, 0x38, 0xa6, 0x21, 0x51, 0x38, 0xa6, 0x21, 0x72, 0x86, 0x3a, 0x84, 0x04, 0x73, + 0x23, 0x02, 0x36, 0x0c, 0x3a, 0x10, 0x08, 0x75, 0x58, 0x0e, 0x64, 0x01, 0x23, 0x4e, 0x54, 0x4c, + 0x1e, 0x49, 0x19, 0x45, 0x1e, 0x06, 0x33, 0x94, 0x65, 0x27, 0x26, 0x20, 0x6d, 0x4f, 0x02, 0x62, + 0x23, 0x4b, 0x0e, 0x0e, 0x4f, 0x10, 0x04, 0x67, 0x06, 0x0e, 0x0f, 0x04, 0x1c, 0x6d, 0x08, 0x2e, + 0x0d, 0xff, 0x0d, 0x1d, 0x6d, 0x07, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x10, 0x08, 0x75, 0x02, + 0x0b, 0x73, 0x30, 0x84, 0x04, 0x6c, 0x1e, 0x72, 0x38, 0x62, 0x1e, 0x3a, 0x38, 0x55, 0x1e, 0x51, + 0x38, 0x55, 0x1e, 0x72, 0x38, 0x62, 0x84, 0x04, 0x6c, 0x1e, 0x71, 0x0c, 0x31, 0x3a, 0x27, 0x39, + 0x1e, 0x45, 0x04, 0x71, 0x1f, 0x23, 0x07, 0x66, 0x0d, 0x07, 0x10, 0x08, 0x2d, 0x81, 0x30, 0x31, + 0x01, 0x93, 0x3e, 0x01, 0x4e, 0x93, 0x04, 0x19, 0x51, 0x93, 0x25, 0x7a, 0x7a, 0x7a, 0x7a, 0x65, + 0x10, 0x03, 0x98, 0x44, 0x20, 0x81, 0x20, 0x81, 0x20, 0x48, 0x10, 0x03, 0x98, 0x81, 0x20, 0x81, + 0x20, 0x81, 0x20, 0xa9, 0x1d, 0x07, 0x9f, 0x10, 0x07, 0x2d, 0x81, 0xa7, 0x06, 0x0e, 0x04, 0x1e, + 0x48, 0x28, 0x76, 0x93, 0x06, 0xa1, 0x93, 0x0f, 0x68, 0x19, 0x93, 0x07, 0x40, 0x1c, 0x48, 0x01, + 0x5e, 0x93, 0xa7, 0x07, 0x80, 0x93, 0x25, 0x0d, 0x0a, 0x10, 0x03, 0x2d, 0x5c, 0x20, 0x5c, 0x7b, + 0x7b, 0x7b, 0x7b, 0x02, 0x10, 0x0c, 0x59, 0x44, 0x55, 0x60, 0x47, 0x0e, 0x4f, 0x1b, 0x44, 0x4f, + 0x45, 0x77, 0x01, 0x4e, 0x1b, 0x44, 0x04, 0x19, 0x4e, 0x19, 0x70, 0x1b, 0x44, 0x6e, 0x6d, 0x7e, + 0x0c, 0x7e, 0x0c, 0x7e, 0x0c, 0x7e, 0x0c, 0x07, 0x19, 0x51, 0x10, 0x08, 0x59, 0x44, 0x06, 0x66, + 0x4f, 0x93, 0x3e, 0x02, 0x4e, 0x21, 0x46, 0xa1, 0x51, 0x93, 0x03, 0x19, 0xa6, 0xa8, 0x25, 0xa6, + 0xa8, 0x25, 0xa6, 0xa8, 0x25, 0xa6, 0xa8, 0x25, 0xa6, 0x10, 0x08, 0x75, 0x4b, 0x0e, 0x2f, 0x1c, + 0x0d, 0x0a, 0x54, 0x4e, 0x1e, 0x72, 0x86, 0x26, 0x85, 0x51, 0x19, 0x46, 0x68, 0x21, 0x51, 0x19, + 0x46, 0x68, 0x21, 0x72, 0x86, 0x26, 0x9a, 0x0d, 0x0a, 0x54, 0x6f, 0x9b, 0x9f, 0x10, 0x08, 0x59, + 0x44, 0x65, 0x8f, 0x93, 0x3f, 0x02, 0x4e, 0x21, 0x46, 0xa1, 0xa9, 0xa8, 0x86, 0x01, 0x68, 0xa8, + 0x86, 0x48, 0xa8, 0x04, 0x19, 0x49, 0xa8, 0x3e, 0x47, 0x08, 0x93, 0x62, 0x9f, 0x23, 0x81, 0x02, + 0x10, 0x08, 0x59, 0x71, 0x36, 0x0c, 0x51, 0x84, 0x05, 0x73, 0x1e, 0x72, 0x86, 0x40, 0x1e, 0x51, + 0x38, 0xa6, 0x21, 0xa6, 0x19, 0xa6, 0x21, 0x04, 0x0e, 0x86, 0x3a, 0x23, 0x4e, 0x01, 0x04, 0x73, + 0x23, 0x02, 0x36, 0x0c, 0x40, 0xa4, 0xa4, 0xa4, 0x10, 0x05, 0x59, 0x44, 0x08, 0x2f, 0x23, 0x46, + 0xa3, 0x01, 0x25, 0x93, 0x87, 0x01, 0x68, 0x2e, 0x81, 0x20, 0x48, 0x10, 0x07, 0x75, 0x65, 0x73, + 0x05, 0x23, 0x3c, 0x6e, 0x28, 0x9a, 0x05, 0x63, 0x27, 0x36, 0x0c, 0x07, 0x02, 0x1c, 0x71, 0x62, + 0x63, 0x27, 0x1f, 0x1e, 0x55, 0x6e, 0x04, 0x68, 0x1e, 0x61, 0x66, 0x1f, 0x10, 0x04, 0x00, 0x46, + 0x20, 0x6d, 0x06, 0x27, 0x1f, 0x2e, 0x0b, 0xff, 0x09, 0x2e, 0x1f, 0x27, 0x1f, 0x27, 0x1f, 0x27, + 0x1f, 0x27, 0x1f, 0x83, 0x96, 0x06, 0x60, 0x10, 0x08, 0x59, 0x5c, 0x88, 0x88, 0x25, 0x51, 0x93, + 0x03, 0x19, 0x40, 0x84, 0x04, 0x73, 0x23, 0x04, 0x66, 0x0b, 0x51, 0x10, 0x07, 0x59, 0x5d, 0x19, + 0x37, 0x0a, 0x1e, 0x72, 0x38, 0x57, 0x1e, 0x0e, 0x76, 0x49, 0x1e, 0x37, 0x09, 0x37, 0x0a, 0x1c, + 0x49, 0x0e, 0x04, 0x1d, 0x92, 0x0e, 0x9c, 0x2f, 0x2e, 0x26, 0x04, 0x10, 0x0a, 0x59, 0x0c, 0x06, + 0x19, 0x42, 0x19, 0x55, 0x4d, 0x5a, 0x19, 0x0e, 0x0f, 0x01, 0x37, 0x09, 0x4d, 0x53, 0x00, 0x41, + 0x0d, 0x04, 0x6d, 0x04, 0x18, 0x63, 0x06, 0x09, 0x35, 0x01, 0x0e, 0x52, 0x0b, 0x06, 0x09, 0x06, + 0x07, 0x0a, 0x56, 0x21, 0x06, 0x0a, 0x0d, 0x02, 0x03, 0x60, 0x07, 0x21, 0x5c, 0x0e, 0x19, 0x0e, + 0x0f, 0x02, 0x1e, 0x0d, 0x0a, 0x19, 0x0a, 0x0d, 0x10, 0x07, 0x59, 0x5b, 0x02, 0x46, 0x5e, 0x1e, + 0x4c, 0x00, 0x39, 0x1c, 0x02, 0x92, 0x63, 0x1d, 0x07, 0x0f, 0x07, 0x2e, 0x0a, 0xa3, 0x1d, 0x26, + 0x07, 0x22, 0x1e, 0x46, 0x64, 0x37, 0x0d, 0x85, 0x37, 0x82, 0x46, 0x5f, 0x10, 0x07, 0x59, 0x09, + 0x0b, 0x38, 0x39, 0x1e, 0x26, 0x86, 0x0d, 0x05, 0x23, 0x5e, 0x5c, 0x9a, 0x37, 0x0b, 0x00, 0x07, + 0x0a, 0x1c, 0xa9, 0x0c, 0x05, 0x1d, 0x64, 0x0e, 0xa0, 0x61, 0xa3, 0x1d, 0x71, 0x22, 0x2e, 0x8e, + 0x1d, 0x46, 0x09, 0x08, 0x1d, 0x02, 0x31, 0xa0, 0x07, 0x59, 0x07, 0x2b, 0x07, 0x2e, 0x07, 0x80, + 0x1d, 0x26, 0x04, 0x1c, 0x46, 0x92, 0x2e, 0x0b, 0x0b, 0x1d, 0x61, 0x80, 0x1d, 0x26, 0x87, 0x0b, + 0x2b, 0x0b, 0x10, 0x05, 0x67, 0x61, 0x22, 0x1c, 0x46, 0x68, 0x2e, 0x3c, 0x27, 0x3c, 0x27, 0x53, + 0x2e, 0x58, 0x09, 0x9c, 0x82, 0x27, 0x0a, 0x43, 0x53, 0x27, 0x3c, 0x27, 0x3c, 0x4d, 0x93, 0x20, + 0x61, 0x22, 0x10, 0x04, 0x67, 0x6a, 0x78, 0x78, 0x78, 0x10, 0x05, 0x2d, 0x0a, 0x3f, 0x27, 0x70, + 0x27, 0x55, 0x27, 0x53, 0x27, 0x3c, 0x1a, 0x1f, 0x27, 0x26, 0x87, 0x0d, 0x05, 0x2e, 0x3c, 0x27, + 0x53, 0x27, 0x55, 0x27, 0x70, 0x2e, 0x0a, 0x0e, 0x04, 0x10, 0x08, 0x24, 0x75, 0x9c, 0x73, 0x06, + 0x50, 0x07, 0x21, 0x05, 0x06, 0x01, 0x56, 0x73, 0x03, 0x18, 0x46, 0x10, +}; + +static const uint16_t mf_rlefont_arial14_glyph_offsets_0[95] = { + 0x0000, 0x0003, 0x0018, 0x002a, 0x0058, 0x008f, 0x00d3, 0x010a, + 0x0115, 0x0136, 0x0152, 0x0162, 0x0175, 0x017c, 0x0183, 0x0189, + 0x01a1, 0x01cd, 0x01e0, 0x01fb, 0x021e, 0x0241, 0x0264, 0x0290, + 0x02a8, 0x02d9, 0x0304, 0x0307, 0x030b, 0x0325, 0x0331, 0x034a, + 0x035e, 0x03c7, 0x03f5, 0x0421, 0x0452, 0x047c, 0x048f, 0x04a2, + 0x04d6, 0x04f0, 0x04f6, 0x050d, 0x053a, 0x0548, 0x0586, 0x05b7, + 0x05ef, 0x0612, 0x0652, 0x067c, 0x06b1, 0x06be, 0x06dc, 0x0709, + 0x0754, 0x0784, 0x07ab, 0x07cb, 0x07d6, 0x07ed, 0x0801, 0x0817, + 0x081f, 0x0827, 0x0853, 0x0876, 0x0891, 0x08b6, 0x08d6, 0x08ed, + 0x091b, 0x0931, 0x093b, 0x0948, 0x096a, 0x0975, 0x099b, 0x09ba, + 0x09de, 0x0a01, 0x0a29, 0x0a3c, 0x0a5d, 0x0a78, 0x0a8c, 0x0aac, + 0x0ae9, 0x0b0d, 0x0b38, 0x0b53, 0x0b73, 0x0b7a, 0x0b9a, +}; + +static const struct mf_rlefont_char_range_s mf_rlefont_arial14_char_ranges[] = { + {32, 95, mf_rlefont_arial14_glyph_offsets_0, mf_rlefont_arial14_glyph_data_0}, +}; + +const struct mf_rlefont_s mf_rlefont_arial14 = { + { + "Arial Regular 14", + "arial__14_arial14_aa", + 15, /* width */ + 14, /* height */ + 3, /* min x advance */ + 14, /* max x advance */ + 1, /* baseline x */ + 11, /* baseline y */ + 16, /* line height */ + 0, /* flags */ + 63, /* fallback character */ + &mf_rlefont_character_width, + &mf_rlefont_render_character, + }, + 4, /* version */ + mf_rlefont_arial14_dictionary_data, + mf_rlefont_arial14_dictionary_offsets, + 96, /* rle dict count */ + 147, /* total dict count */ + 1, /* char range count */ + mf_rlefont_arial14_char_ranges, +}; + +#ifdef MF_INCLUDED_FONTS +/* List entry for searching fonts by name. */ +static const struct mf_font_list_s mf_rlefont_arial14_listentry = { + MF_INCLUDED_FONTS, + (struct mf_font_s*)&mf_rlefont_arial14 +}; +#undef MF_INCLUDED_FONTS +#define MF_INCLUDED_FONTS (&mf_rlefont_arial14_listentry) +#endif + + +/* End of automatically generated font definition for arial14. */ + diff --git a/resources/token.h b/resources/token.h new file mode 100644 index 0000000..b54f420 --- /dev/null +++ b/resources/token.h @@ -0,0 +1,877 @@ +/** + * File generated by the uGFX-Sudio + * + * Original image file: C:/test_joel/studio/tokenring/resources/token.bmp + */ + +static const char token[] = { + 0x42, 0x4D, 0xE8, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x02, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x2C, 0x01, 0x00, 0x00, 0xCD, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x9A, 0x33, 0x00, 0x00, 0x12, 0x0B, 0x00, 0x00, 0x12, 0x0B, 0x00, 0x00, 0x86, 0x00, + 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x96, 0x96, 0x96, 0x00, 0x50, 0x59, 0x57, 0x00, 0xBA, 0xC7, + 0xC8, 0x00, 0xE5, 0xE5, 0xE5, 0x00, 0xC5, 0xD6, 0xD6, 0x00, 0xD9, 0xD9, 0xD9, 0x00, 0x87, 0x88, + 0x88, 0x00, 0x99, 0x26, 0x00, 0x00, 0x6B, 0x6B, 0xD9, 0x00, 0xD7, 0x62, 0x3A, 0x00, 0x60, 0x63, + 0x63, 0x00, 0xAA, 0xE9, 0xAA, 0x00, 0xA3, 0xA3, 0xA3, 0x00, 0x79, 0x7B, 0x7A, 0x00, 0x42, 0x46, + 0x44, 0x00, 0x6E, 0xDA, 0x6E, 0x00, 0xCB, 0xF2, 0xCB, 0x00, 0x3B, 0xB1, 0xFF, 0x00, 0x6E, 0x77, + 0x77, 0x00, 0xAB, 0xAB, 0xE9, 0x00, 0x7C, 0xCB, 0xFF, 0x00, 0x9D, 0xA2, 0xA3, 0x00, 0xE4, 0x95, + 0x7A, 0x00, 0x97, 0x97, 0xE4, 0x00, 0x37, 0x3A, 0x3A, 0x00, 0xF3, 0xF3, 0xF3, 0x00, 0x98, 0xE5, + 0x98, 0x00, 0x00, 0x72, 0xBF, 0x00, 0xD2, 0xE4, 0xE5, 0x00, 0x95, 0xD4, 0xFF, 0x00, 0xCB, 0xCB, + 0xCB, 0x00, 0xA3, 0xB2, 0xB3, 0x00, 0x6E, 0x6E, 0x6E, 0x00, 0x7E, 0x83, 0x82, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xAC, 0xB6, 0xB6, 0x00, 0xDD, 0x79, 0x58, 0x00, 0x54, 0x54, 0xD4, 0x00, 0xEA, 0xAF, + 0x9B, 0x00, 0xB3, 0xBE, 0xBF, 0x00, 0xB0, 0xB0, 0xB0, 0x00, 0xD0, 0x53, 0x53, 0x00, 0x8A, 0x97, + 0x96, 0x00, 0x54, 0xD4, 0x54, 0x00, 0x59, 0xBC, 0xFF, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0xAC, 0xBC, + 0xBC, 0x00, 0x9B, 0x4F, 0x3C, 0x00, 0xDA, 0xEE, 0xEF, 0x00, 0xA1, 0xB0, 0xAF, 0x00, 0xCA, 0xDB, + 0xDC, 0x00, 0x9F, 0x83, 0x78, 0x00, 0x92, 0x74, 0x68, 0x00, 0xFB, 0xFB, 0xFB, 0x00, 0xCF, 0xCF, + 0xCF, 0x00, 0xBD, 0xBD, 0xBD, 0x00, 0x2B, 0x2B, 0x2B, 0x00, 0x96, 0xA3, 0xA3, 0x00, 0xD6, 0xE9, + 0xEA, 0x00, 0x67, 0x6A, 0x69, 0x00, 0xF5, 0x62, 0x62, 0x00, 0x9F, 0xAA, 0xAA, 0x00, 0xCF, 0xB0, + 0xB0, 0x00, 0x5C, 0x65, 0x64, 0x00, 0xD2, 0x6E, 0x6E, 0x00, 0xE6, 0x5B, 0x5B, 0x00, 0xCE, 0xDF, + 0xE0, 0x00, 0x52, 0x53, 0x53, 0x00, 0xC1, 0xCF, 0xD0, 0x00, 0x14, 0x14, 0x14, 0x00, 0x2D, 0x31, + 0x2F, 0x00, 0x7C, 0x85, 0x85, 0x00, 0x40, 0x41, 0x40, 0x00, 0x89, 0x8F, 0x8F, 0x00, 0x5A, 0x5E, + 0x5D, 0x00, 0x23, 0x28, 0x25, 0x00, 0x7E, 0x8B, 0x8A, 0x00, 0xFF, 0x8C, 0x8C, 0x00, 0xFF, 0xD9, + 0xD9, 0x00, 0xFF, 0xB3, 0xB3, 0x00, 0xFF, 0x70, 0x70, 0x00, 0xFF, 0xF6, 0xF6, 0x00, 0xFF, 0xC6, + 0xC6, 0x00, 0xFF, 0xEC, 0xEC, 0x00, 0x79, 0x83, 0xAA, 0x00, 0x79, 0xAA, 0x84, 0x00, 0xFF, 0x79, + 0x79, 0x00, 0xFF, 0xE3, 0xE3, 0x00, 0xFF, 0xA0, 0xA0, 0x00, 0xFF, 0x83, 0x83, 0x00, 0xFF, 0xA9, + 0xA9, 0x00, 0x36, 0x88, 0xBB, 0x00, 0xFF, 0xD0, 0xD0, 0x00, 0xFF, 0x96, 0x96, 0x00, 0xFF, 0xBC, + 0xBC, 0x00, 0xCA, 0xCA, 0xF2, 0x00, 0xBF, 0xE5, 0xFF, 0x00, 0xF2, 0xCC, 0xBF, 0x00, 0xCF, 0xE2, + 0xE3, 0x00, 0xFB, 0xF2, 0xEF, 0x00, 0x0F, 0x9F, 0xFF, 0x00, 0xF2, 0xF2, 0xFB, 0x00, 0x3F, 0x3F, + 0xCF, 0x00, 0xEF, 0xF8, 0xFF, 0x00, 0x1F, 0xA5, 0xFF, 0x00, 0xD1, 0x47, 0x18, 0x00, 0xF8, 0xE5, + 0xDF, 0x00, 0xF2, 0xFB, 0xF2, 0x00, 0x39, 0x40, 0x3E, 0x00, 0xDF, 0xF2, 0xFF, 0x00, 0xF5, 0xD8, + 0xCF, 0x00, 0x3F, 0xCF, 0x3F, 0x00, 0xAF, 0xDF, 0xFF, 0x00, 0x32, 0x34, 0x33, 0x00, 0xD8, 0xD8, + 0xF5, 0x00, 0x9C, 0xA7, 0xA7, 0x00, 0xCF, 0xEB, 0xFF, 0x00, 0x48, 0x4E, 0x4B, 0x00, 0xE5, 0xE5, + 0xF8, 0x00, 0xEF, 0xBF, 0xAF, 0x00, 0x69, 0x72, 0x71, 0x00, 0xE5, 0xF8, 0xE5, 0x00, 0x73, 0x7E, + 0x7D, 0x00, 0xA6, 0xB5, 0xC0, 0x00, 0xCF, 0x91, 0x91, 0x00, 0xA6, 0xBF, 0xB6, 0x00, 0x5F, 0x8E, + 0xA8, 0x00, 0xF0, 0x7B, 0x7B, 0x00, 0xCC, 0x33, 0x00, 0x00, 0x33, 0x33, 0xCC, 0x00, 0x00, 0x99, + 0xFF, 0x00, 0x33, 0xCC, 0x33, 0x00, 0xFF, 0x66, 0x66, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x76, 0x22, + 0x01, 0x05, 0x3C, 0x4A, 0x01, 0x1E, 0x78, 0x22, 0x00, 0x00, 0x75, 0x22, 0x01, 0x1E, 0x3E, 0x4B, + 0x01, 0x1E, 0x77, 0x22, 0x00, 0x00, 0x75, 0x22, 0x00, 0x03, 0x00, 0x4B, 0x3B, 0x00, 0x3A, 0x21, + 0x00, 0x03, 0x0A, 0x4B, 0x3B, 0x00, 0x77, 0x22, 0x00, 0x00, 0x75, 0x22, 0x00, 0x04, 0x00, 0x4B, + 0x2E, 0x2E, 0x05, 0x4C, 0x01, 0x39, 0x01, 0x2E, 0x18, 0x4C, 0x01, 0x39, 0x01, 0x31, 0x04, 0x4C, + 0x01, 0x2A, 0x01, 0x31, 0x07, 0x4C, 0x01, 0x31, 0x01, 0x39, 0x09, 0x4C, 0x00, 0x03, 0x2E, 0x3F, + 0x4A, 0x00, 0x77, 0x22, 0x00, 0x00, 0x75, 0x22, 0x00, 0x05, 0x03, 0x4B, 0x31, 0x30, 0x01, 0x00, + 0x04, 0x21, 0x00, 0x03, 0x4C, 0x30, 0x43, 0x00, 0x17, 0x21, 0x00, 0x09, 0x4C, 0x2E, 0x3B, 0x21, + 0x21, 0x21, 0x78, 0x2E, 0x3B, 0x00, 0x05, 0x21, 0x00, 0x03, 0x3B, 0x2E, 0x78, 0x00, 0x08, 0x21, + 0x00, 0x04, 0x43, 0x30, 0x01, 0x0D, 0x77, 0x22, 0x00, 0x00, 0x76, 0x22, 0x00, 0x0F, 0x75, 0x78, + 0x30, 0x7A, 0x02, 0x02, 0x02, 0x27, 0x3B, 0x0A, 0x7A, 0x02, 0x02, 0x02, 0x23, 0x00, 0x0F, 0x02, + 0x00, 0x21, 0x27, 0x02, 0x02, 0x02, 0x0A, 0x0A, 0x2A, 0x02, 0x02, 0x02, 0x7A, 0x4C, 0x31, 0x02, + 0x3D, 0x02, 0x23, 0x02, 0x39, 0x2E, 0x12, 0x02, 0x02, 0x02, 0x27, 0x27, 0x02, 0x23, 0x02, 0x47, + 0x30, 0x71, 0x00, 0x00, 0x77, 0x22, 0x00, 0x00, 0x76, 0x22, 0x00, 0x3F, 0x15, 0x4B, 0x62, 0x02, + 0x02, 0x30, 0x30, 0x1C, 0x02, 0x15, 0x1F, 0x3A, 0x30, 0x42, 0x44, 0x42, 0x30, 0x30, 0x1C, 0x30, + 0x1C, 0x30, 0x30, 0x1C, 0x30, 0x1C, 0x30, 0x1C, 0x30, 0x30, 0x04, 0x30, 0x1C, 0x30, 0x1F, 0x27, + 0x44, 0x30, 0x30, 0x30, 0x4C, 0x62, 0x2A, 0x2E, 0x2A, 0x30, 0x3D, 0x2E, 0x39, 0x62, 0x12, 0x30, + 0x1C, 0x30, 0x32, 0x32, 0x30, 0x02, 0x30, 0x2A, 0x62, 0x4B, 0x1E, 0x00, 0x77, 0x22, 0x00, 0x00, + 0x76, 0x22, 0x00, 0x24, 0x03, 0x4B, 0x39, 0x30, 0x2A, 0x30, 0x30, 0x3A, 0x32, 0x23, 0x23, 0x04, + 0x30, 0x44, 0x3A, 0x44, 0x32, 0x30, 0x02, 0x1C, 0x44, 0x1C, 0x30, 0x44, 0x3A, 0x44, 0x1C, 0x04, + 0x04, 0x30, 0x44, 0x1C, 0x44, 0x1C, 0x1C, 0x04, 0x04, 0x30, 0x00, 0x17, 0x4C, 0x4C, 0x0A, 0x0A, + 0x47, 0x32, 0x21, 0x0A, 0x0E, 0x30, 0x12, 0x30, 0x02, 0x30, 0x32, 0x42, 0x30, 0x02, 0x30, 0x39, + 0x2E, 0x4B, 0x05, 0x00, 0x77, 0x22, 0x00, 0x00, 0x77, 0x22, 0x00, 0x23, 0x3B, 0x3F, 0x30, 0x39, + 0x30, 0x30, 0x3A, 0x1F, 0x2E, 0x30, 0x42, 0x42, 0x30, 0x04, 0x30, 0x04, 0x1C, 0x30, 0x44, 0x30, + 0x44, 0x30, 0x1C, 0x04, 0x30, 0x04, 0x30, 0x44, 0x30, 0x30, 0x44, 0x30, 0x44, 0x30, 0x04, 0x00, + 0x04, 0x30, 0x00, 0x16, 0x4C, 0x4C, 0x1F, 0x23, 0x3D, 0x23, 0x3D, 0x23, 0x78, 0x30, 0x3B, 0x30, + 0x02, 0x30, 0x32, 0x30, 0x42, 0x44, 0x30, 0x39, 0x2A, 0x4B, 0x78, 0x22, 0x00, 0x00, 0x77, 0x22, + 0x00, 0x3D, 0x28, 0x4B, 0x04, 0x31, 0x02, 0x30, 0x1C, 0x42, 0x32, 0x3A, 0x44, 0x42, 0x42, 0x42, + 0x30, 0x44, 0x1C, 0x44, 0x42, 0x30, 0x44, 0x3A, 0x44, 0x1C, 0x44, 0x32, 0x42, 0x44, 0x3A, 0x44, + 0x1C, 0x44, 0x42, 0x30, 0x02, 0x3A, 0x42, 0x30, 0x30, 0x4C, 0x4C, 0x32, 0x30, 0x02, 0x30, 0x02, + 0x30, 0x31, 0x30, 0x78, 0x30, 0x2E, 0x30, 0x02, 0x30, 0x32, 0x32, 0x30, 0x39, 0x7A, 0x4A, 0x00, + 0x78, 0x22, 0x00, 0x00, 0x78, 0x22, 0x00, 0x3C, 0x4B, 0x2A, 0x30, 0x7A, 0x62, 0x2A, 0x2E, 0x39, + 0x2A, 0x04, 0x3D, 0x62, 0x3D, 0x42, 0x62, 0x3D, 0x62, 0x3D, 0x02, 0x1F, 0x02, 0x62, 0x73, 0x62, + 0x49, 0x62, 0x02, 0x02, 0x02, 0x47, 0x62, 0x78, 0x62, 0x2E, 0x2E, 0x62, 0x62, 0x62, 0x47, 0x4C, + 0x2A, 0x2E, 0x7A, 0x2E, 0x7A, 0x2E, 0x2A, 0x30, 0x39, 0x2E, 0x7A, 0x2E, 0x12, 0x2E, 0x39, 0x39, + 0x31, 0x04, 0x01, 0x0D, 0x78, 0x22, 0x00, 0x00, 0x78, 0x22, 0x00, 0x2F, 0x0D, 0x75, 0x30, 0x21, + 0x04, 0x3D, 0x2E, 0x30, 0x04, 0x47, 0x04, 0x2A, 0x04, 0x31, 0x04, 0x04, 0x39, 0x04, 0x4A, 0x3F, + 0x04, 0x49, 0x04, 0x27, 0x27, 0x04, 0x39, 0x04, 0x3B, 0x12, 0x04, 0x39, 0x04, 0x27, 0x2E, 0x04, + 0x39, 0x04, 0x47, 0x4C, 0x27, 0x27, 0x39, 0x04, 0x2A, 0x04, 0x47, 0x00, 0x0B, 0x30, 0x01, 0x71, + 0x01, 0x00, 0x78, 0x22, 0x00, 0x00, 0x78, 0x22, 0x00, 0x2F, 0x1E, 0x71, 0x4B, 0x71, 0x4C, 0x78, + 0x4B, 0x4B, 0x4B, 0x01, 0x4C, 0x6C, 0x4C, 0x78, 0x78, 0x4C, 0x75, 0x4C, 0x01, 0x6C, 0x4C, 0x01, + 0x7A, 0x78, 0x01, 0x4C, 0x6C, 0x4C, 0x01, 0x6C, 0x4C, 0x01, 0x4C, 0x78, 0x78, 0x4C, 0x01, 0x4C, + 0x6C, 0x4B, 0x78, 0x4C, 0x01, 0x4C, 0x01, 0x4C, 0x6C, 0x00, 0x0B, 0x4B, 0x01, 0x46, 0x01, 0x03, + 0x78, 0x22, 0x00, 0x00, 0x79, 0x22, 0x00, 0x0B, 0x03, 0x00, 0x12, 0x43, 0x43, 0x0D, 0x0D, 0x0D, + 0x4A, 0x43, 0x4A, 0x00, 0x05, 0x43, 0x00, 0x03, 0x4B, 0x75, 0x4A, 0x00, 0x08, 0x75, 0x01, 0x01, + 0x01, 0x4A, 0x08, 0x75, 0x00, 0x03, 0x01, 0x4B, 0x0E, 0x00, 0x05, 0x43, 0x01, 0x0A, 0x0B, 0x0D, + 0x01, 0x36, 0x79, 0x22, 0x00, 0x00, 0x88, 0x22, 0x01, 0x05, 0x01, 0x46, 0x15, 0x27, 0x01, 0x75, + 0x01, 0x28, 0x8B, 0x22, 0x00, 0x00, 0x7D, 0x22, 0x01, 0x15, 0x01, 0x45, 0x2C, 0x22, 0x01, 0x20, + 0x80, 0x22, 0x00, 0x00, 0x7E, 0x22, 0x01, 0x01, 0x2B, 0x1F, 0x00, 0x03, 0x12, 0x22, 0x1E, 0x00, + 0x7F, 0x22, 0x00, 0x00, 0x7E, 0x22, 0x01, 0x1F, 0x01, 0x44, 0x29, 0x1F, 0x00, 0x05, 0x44, 0x30, + 0x22, 0x00, 0x05, 0x00, 0x7E, 0x22, 0x00, 0x00, 0x7E, 0x22, 0x01, 0x1F, 0x01, 0x55, 0x29, 0x83, + 0x00, 0x05, 0x55, 0x30, 0x22, 0x15, 0x36, 0x00, 0x7E, 0x22, 0x00, 0x00, 0x7E, 0x22, 0x01, 0x1F, + 0x01, 0x55, 0x29, 0x83, 0x00, 0x05, 0x55, 0x30, 0x22, 0x00, 0x36, 0x00, 0x7E, 0x22, 0x00, 0x00, + 0x7E, 0x22, 0x01, 0x1F, 0x01, 0x55, 0x29, 0x83, 0x00, 0x05, 0x55, 0x30, 0x22, 0x15, 0x44, 0x00, + 0x7E, 0x22, 0x00, 0x00, 0x77, 0x22, 0x00, 0x09, 0x4E, 0x5C, 0x4F, 0x58, 0x4D, 0x56, 0x22, 0x1F, + 0x55, 0x00, 0x0E, 0x83, 0x01, 0x10, 0x07, 0x85, 0x00, 0x03, 0x6B, 0x10, 0x0F, 0x00, 0x10, 0x83, + 0x00, 0x09, 0x55, 0x30, 0x22, 0x2F, 0x40, 0x58, 0x4F, 0x4E, 0x57, 0x00, 0x7A, 0x22, 0x00, 0x00, + 0x71, 0x22, 0x00, 0x05, 0x4E, 0x5E, 0x5A, 0x4D, 0x50, 0x00, 0x07, 0x84, 0x00, 0x03, 0x22, 0x1F, + 0x55, 0x00, 0x0E, 0x83, 0x01, 0x10, 0x0A, 0x85, 0x01, 0x0B, 0x0F, 0x83, 0x00, 0x06, 0x55, 0x30, + 0x22, 0x2F, 0x29, 0x41, 0x04, 0x84, 0x00, 0x05, 0x56, 0x4D, 0x4F, 0x52, 0x57, 0x00, 0x74, 0x22, + 0x00, 0x00, 0x6C, 0x22, 0x00, 0x04, 0x4E, 0x4F, 0x5D, 0x56, 0x0D, 0x84, 0x00, 0x03, 0x22, 0x1F, + 0x55, 0x00, 0x0E, 0x83, 0x00, 0x07, 0x10, 0x85, 0x85, 0x85, 0x79, 0x10, 0x10, 0x00, 0x05, 0x85, + 0x01, 0x0F, 0x0E, 0x83, 0x00, 0x06, 0x55, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x0A, 0x84, 0x00, 0x04, + 0x4D, 0x58, 0x5E, 0x57, 0x6F, 0x22, 0x00, 0x00, 0x68, 0x22, 0x00, 0x03, 0x52, 0x58, 0x59, 0x00, + 0x12, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, 0x00, 0x0D, 0x10, 0x85, 0x85, 0x85, + 0x1A, 0x83, 0x83, 0x2B, 0x10, 0x85, 0x85, 0x85, 0x79, 0x00, 0x0E, 0x83, 0x00, 0x06, 0x55, 0x30, + 0x22, 0x2F, 0x29, 0x29, 0x0F, 0x84, 0x00, 0x03, 0x4D, 0x4F, 0x5C, 0x00, 0x6B, 0x22, 0x00, 0x00, + 0x64, 0x22, 0x00, 0x03, 0x52, 0x58, 0x56, 0x00, 0x16, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, + 0x0E, 0x83, 0x00, 0x09, 0x10, 0x85, 0x85, 0x85, 0x1A, 0x83, 0x83, 0x83, 0x2B, 0x00, 0x04, 0x85, + 0x01, 0x0F, 0x0D, 0x83, 0x00, 0x07, 0x55, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x3C, 0x00, 0x12, 0x84, + 0x00, 0x03, 0x59, 0x5A, 0x5C, 0x00, 0x67, 0x22, 0x00, 0x00, 0x60, 0x22, 0x00, 0x03, 0x5C, 0x5A, + 0x56, 0x00, 0x1A, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, 0x00, 0x05, 0x10, 0x85, + 0x85, 0x85, 0x1A, 0x00, 0x04, 0x83, 0x00, 0x05, 0x10, 0x85, 0x85, 0x85, 0x1A, 0x00, 0x0D, 0x83, + 0x00, 0x07, 0x55, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x41, 0x00, 0x16, 0x84, 0x00, 0x03, 0x59, 0x4F, + 0x57, 0x00, 0x63, 0x22, 0x00, 0x00, 0x5D, 0x22, 0x01, 0x5E, 0x01, 0x5D, 0x1E, 0x84, 0x00, 0x03, + 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, 0x00, 0x05, 0x10, 0x85, 0x85, 0x85, 0x1A, 0x00, 0x04, 0x83, + 0x00, 0x05, 0x0B, 0x85, 0x85, 0x85, 0x10, 0x00, 0x0D, 0x83, 0x00, 0x07, 0x55, 0x30, 0x22, 0x2F, + 0x29, 0x29, 0x41, 0x00, 0x19, 0x84, 0x00, 0x03, 0x50, 0x58, 0x5C, 0x00, 0x60, 0x22, 0x00, 0x00, + 0x5A, 0x22, 0x01, 0x5E, 0x01, 0x59, 0x21, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, + 0x00, 0x05, 0x10, 0x85, 0x85, 0x85, 0x1A, 0x00, 0x04, 0x83, 0x00, 0x05, 0x1A, 0x85, 0x85, 0x85, + 0x10, 0x00, 0x0D, 0x83, 0x00, 0x07, 0x55, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x29, 0x00, 0x1D, 0x84, + 0x01, 0x5D, 0x01, 0x52, 0x5D, 0x22, 0x00, 0x00, 0x57, 0x22, 0x01, 0x5E, 0x01, 0x59, 0x24, 0x84, + 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, 0x00, 0x05, 0x10, 0x85, 0x85, 0x85, 0x1A, 0x00, + 0x04, 0x83, 0x00, 0x05, 0x1A, 0x85, 0x85, 0x85, 0x10, 0x00, 0x0D, 0x83, 0x00, 0x07, 0x55, 0x30, + 0x22, 0x2F, 0x29, 0x29, 0x29, 0x00, 0x20, 0x84, 0x01, 0x5D, 0x01, 0x52, 0x5A, 0x22, 0x00, 0x00, + 0x54, 0x22, 0x01, 0x52, 0x01, 0x4D, 0x27, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, + 0x00, 0x05, 0x10, 0x85, 0x85, 0x85, 0x1A, 0x00, 0x04, 0x83, 0x00, 0x05, 0x1A, 0x85, 0x85, 0x85, + 0x10, 0x00, 0x0D, 0x83, 0x00, 0x08, 0x55, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x29, 0x3C, 0x21, 0x84, + 0x00, 0x03, 0x50, 0x58, 0x5C, 0x00, 0x57, 0x22, 0x00, 0x00, 0x51, 0x22, 0x00, 0x03, 0x4E, 0x58, + 0x50, 0x00, 0x29, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, 0x00, 0x05, 0x10, 0x85, + 0x85, 0x85, 0x1A, 0x00, 0x04, 0x83, 0x00, 0x05, 0x1A, 0x85, 0x85, 0x85, 0x10, 0x00, 0x0D, 0x83, + 0x00, 0x08, 0x55, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x29, 0x3C, 0x24, 0x84, 0x01, 0x56, 0x01, 0x4F, + 0x55, 0x22, 0x00, 0x00, 0x4F, 0x22, 0x01, 0x5E, 0x01, 0x56, 0x2C, 0x84, 0x00, 0x03, 0x22, 0x1F, + 0x55, 0x00, 0x0E, 0x83, 0x00, 0x05, 0x10, 0x85, 0x85, 0x85, 0x1A, 0x00, 0x04, 0x83, 0x00, 0x05, + 0x10, 0x85, 0x85, 0x85, 0x0B, 0x00, 0x0D, 0x83, 0x00, 0x08, 0x55, 0x30, 0x22, 0x2F, 0x29, 0x29, + 0x29, 0x41, 0x27, 0x84, 0x01, 0x5D, 0x01, 0x5C, 0x52, 0x22, 0x00, 0x00, 0x4D, 0x22, 0x01, 0x58, + 0x01, 0x50, 0x2E, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, 0x00, 0x09, 0x10, 0x85, + 0x85, 0x85, 0x1A, 0x83, 0x83, 0x83, 0x6F, 0x00, 0x04, 0x85, 0x01, 0x1A, 0x0D, 0x83, 0x00, 0x08, + 0x55, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x29, 0x41, 0x29, 0x84, 0x01, 0x56, 0x01, 0x4F, 0x50, 0x22, + 0x00, 0x00, 0x4A, 0x22, 0x01, 0x4E, 0x01, 0x4D, 0x2C, 0x84, 0x00, 0x08, 0x59, 0x5D, 0x4F, 0x52, + 0x4E, 0x22, 0x1F, 0x55, 0x0E, 0x83, 0x00, 0x09, 0x10, 0x85, 0x85, 0x85, 0x1A, 0x83, 0x83, 0x83, + 0x0B, 0x00, 0x04, 0x85, 0x01, 0x2B, 0x0D, 0x83, 0x00, 0x08, 0x55, 0x30, 0x22, 0x33, 0x7C, 0x7C, + 0x40, 0x40, 0x2B, 0x84, 0x01, 0x50, 0x01, 0x58, 0x4E, 0x22, 0x00, 0x00, 0x48, 0x22, 0x01, 0x52, + 0x01, 0x59, 0x28, 0x84, 0x00, 0x04, 0x59, 0x5D, 0x4F, 0x4E, 0x08, 0x22, 0x01, 0x1F, 0x01, 0x55, + 0x0E, 0x83, 0x00, 0x08, 0x10, 0x85, 0x85, 0x85, 0x1A, 0x83, 0x2B, 0x0B, 0x04, 0x85, 0x01, 0x0B, + 0x0E, 0x83, 0x00, 0x04, 0x55, 0x30, 0x22, 0x15, 0x05, 0x22, 0x00, 0x05, 0x4E, 0x52, 0x4F, 0x4D, + 0x50, 0x00, 0x28, 0x84, 0x01, 0x58, 0x01, 0x57, 0x4B, 0x22, 0x00, 0x00, 0x46, 0x22, 0x01, 0x52, + 0x01, 0x56, 0x25, 0x84, 0x00, 0x04, 0x56, 0x5D, 0x5E, 0x4E, 0x0D, 0x22, 0x01, 0x1F, 0x01, 0x55, + 0x0E, 0x83, 0x01, 0x10, 0x0A, 0x85, 0x01, 0x6B, 0x01, 0x2B, 0x0E, 0x83, 0x00, 0x04, 0x55, 0x30, + 0x22, 0x00, 0x0B, 0x22, 0x00, 0x04, 0x5C, 0x4F, 0x4D, 0x50, 0x25, 0x84, 0x01, 0x4D, 0x01, 0x4E, + 0x49, 0x22, 0x00, 0x00, 0x44, 0x22, 0x01, 0x52, 0x01, 0x56, 0x23, 0x84, 0x00, 0x03, 0x59, 0x5A, + 0x5C, 0x00, 0x12, 0x22, 0x01, 0x1F, 0x01, 0x55, 0x0E, 0x83, 0x01, 0x10, 0x09, 0x85, 0x01, 0x79, + 0x01, 0x2B, 0x0F, 0x83, 0x00, 0x04, 0x55, 0x30, 0x22, 0x00, 0x0F, 0x22, 0x00, 0x04, 0x57, 0x5E, + 0x58, 0x56, 0x23, 0x84, 0x01, 0x4D, 0x01, 0x4E, 0x47, 0x22, 0x00, 0x00, 0x42, 0x22, 0x01, 0x5C, + 0x01, 0x56, 0x21, 0x84, 0x00, 0x03, 0x56, 0x5A, 0x5C, 0x00, 0x16, 0x22, 0x01, 0x1F, 0x01, 0x55, + 0x0E, 0x83, 0x01, 0x0B, 0x07, 0x10, 0x01, 0x0B, 0x01, 0x0F, 0x11, 0x83, 0x00, 0x04, 0x55, 0x30, + 0x22, 0x15, 0x14, 0x22, 0x00, 0x03, 0x52, 0x5D, 0x50, 0x00, 0x21, 0x84, 0x01, 0x5D, 0x46, 0x22, + 0x00, 0x00, 0x40, 0x22, 0x01, 0x4E, 0x01, 0x4D, 0x20, 0x84, 0x01, 0x5D, 0x01, 0x5E, 0x1A, 0x22, + 0x01, 0x1F, 0x01, 0x55, 0x29, 0x83, 0x00, 0x04, 0x55, 0x30, 0x22, 0x00, 0x17, 0x22, 0x00, 0x03, + 0x57, 0x4F, 0x59, 0x00, 0x20, 0x84, 0x01, 0x58, 0x44, 0x22, 0x00, 0x00, 0x3F, 0x22, 0x01, 0x58, + 0x1E, 0x84, 0x00, 0x03, 0x50, 0x58, 0x5C, 0x00, 0x1D, 0x22, 0x01, 0x1F, 0x01, 0x55, 0x29, 0x83, + 0x00, 0x04, 0x55, 0x30, 0x22, 0x00, 0x1B, 0x22, 0x01, 0x5E, 0x01, 0x5D, 0x1E, 0x84, 0x01, 0x50, + 0x01, 0x4F, 0x42, 0x22, 0x00, 0x00, 0x3D, 0x22, 0x01, 0x4F, 0x01, 0x50, 0x1C, 0x84, 0x00, 0x03, + 0x50, 0x58, 0x5C, 0x00, 0x20, 0x22, 0x01, 0x1F, 0x01, 0x55, 0x04, 0x83, 0x04, 0x10, 0x00, 0x1D, + 0x6F, 0x83, 0x10, 0x0B, 0x83, 0x10, 0x0F, 0x83, 0x6F, 0x10, 0x1A, 0x83, 0x10, 0x0F, 0x83, 0x0F, + 0x10, 0x2B, 0x6F, 0x0B, 0x6B, 0x10, 0x0F, 0x83, 0x10, 0x2B, 0x83, 0x2B, 0x10, 0x00, 0x04, 0x83, + 0x00, 0x04, 0x55, 0x30, 0x22, 0x15, 0x1E, 0x22, 0x01, 0x52, 0x01, 0x5D, 0x1D, 0x84, 0x01, 0x56, + 0x01, 0x4E, 0x40, 0x22, 0x00, 0x00, 0x3B, 0x22, 0x01, 0x4E, 0x01, 0x56, 0x1C, 0x84, 0x01, 0x5D, + 0x01, 0x52, 0x23, 0x22, 0x01, 0x1F, 0x01, 0x55, 0x04, 0x83, 0x00, 0x21, 0x1A, 0x2B, 0x1A, 0x85, + 0x0B, 0x83, 0x85, 0x10, 0x83, 0x10, 0x79, 0x1A, 0x0B, 0x85, 0x0F, 0x83, 0x85, 0x1A, 0x83, 0x1A, + 0x85, 0x2B, 0x10, 0x6B, 0x0F, 0x10, 0x85, 0x6F, 0x85, 0x0F, 0x2B, 0x6B, 0x85, 0x00, 0x04, 0x83, + 0x00, 0x04, 0x55, 0x30, 0x22, 0x00, 0x21, 0x22, 0x01, 0x5E, 0x01, 0x59, 0x1C, 0x84, 0x01, 0x5D, + 0x3F, 0x22, 0x00, 0x00, 0x3A, 0x22, 0x01, 0x58, 0x1B, 0x84, 0x01, 0x56, 0x01, 0x5E, 0x26, 0x22, + 0x01, 0x1F, 0x01, 0x55, 0x05, 0x83, 0x00, 0x20, 0x0F, 0x10, 0x85, 0x0B, 0x83, 0x85, 0x10, 0x83, + 0x0F, 0x85, 0x10, 0x85, 0x6B, 0x83, 0x83, 0x85, 0x1A, 0x83, 0x1A, 0x85, 0x0F, 0x6B, 0x10, 0x83, + 0x0F, 0x85, 0x1A, 0x85, 0x0F, 0x79, 0x85, 0x85, 0x04, 0x83, 0x00, 0x04, 0x55, 0x30, 0x22, 0x2D, + 0x23, 0x22, 0x00, 0x03, 0x57, 0x5A, 0x50, 0x00, 0x1A, 0x84, 0x01, 0x50, 0x01, 0x5E, 0x3D, 0x22, + 0x00, 0x00, 0x38, 0x22, 0x01, 0x5C, 0x01, 0x50, 0x1A, 0x84, 0x01, 0x58, 0x01, 0x4E, 0x28, 0x22, + 0x01, 0x1F, 0x01, 0x55, 0x04, 0x83, 0x00, 0x21, 0x1A, 0x85, 0x85, 0x10, 0x6F, 0x83, 0x85, 0x10, + 0x83, 0x83, 0x6B, 0x0B, 0x85, 0x0B, 0x83, 0x83, 0x85, 0x1A, 0x83, 0x1A, 0x85, 0x0F, 0x85, 0x10, + 0x83, 0x0F, 0x85, 0x1A, 0x85, 0x6B, 0x85, 0x1A, 0x85, 0x00, 0x04, 0x83, 0x00, 0x04, 0x55, 0x30, + 0x22, 0x2D, 0x26, 0x22, 0x01, 0x52, 0x01, 0x4D, 0x1A, 0x84, 0x01, 0x4D, 0x01, 0x57, 0x3B, 0x22, + 0x00, 0x00, 0x37, 0x22, 0x01, 0x5D, 0x19, 0x84, 0x01, 0x56, 0x01, 0x4F, 0x2B, 0x22, 0x01, 0x1F, + 0x01, 0x55, 0x04, 0x83, 0x00, 0x21, 0x10, 0x85, 0x6F, 0x83, 0x6F, 0x83, 0x85, 0x10, 0x83, 0x83, + 0x0B, 0x85, 0x85, 0x2B, 0x83, 0x83, 0x85, 0x1A, 0x83, 0x1A, 0x85, 0x0F, 0x10, 0x79, 0x83, 0x0F, + 0x85, 0x2B, 0x85, 0x85, 0x0F, 0x0F, 0x85, 0x00, 0x04, 0x83, 0x00, 0x04, 0x55, 0x30, 0x22, 0x2D, + 0x28, 0x22, 0x01, 0x57, 0x01, 0x58, 0x19, 0x84, 0x01, 0x50, 0x01, 0x5E, 0x3A, 0x22, 0x00, 0x00, + 0x35, 0x22, 0x01, 0x4E, 0x01, 0x50, 0x18, 0x84, 0x01, 0x56, 0x01, 0x52, 0x2D, 0x22, 0x01, 0x1F, + 0x01, 0x55, 0x04, 0x83, 0x00, 0x05, 0x0F, 0x85, 0x85, 0x85, 0x1A, 0x00, 0x04, 0x85, 0x00, 0x06, + 0x83, 0x2B, 0x85, 0x10, 0x83, 0x1A, 0x04, 0x85, 0x00, 0x0E, 0x1A, 0x85, 0x0F, 0x2B, 0x6B, 0x85, + 0x85, 0x0B, 0x83, 0x85, 0x1A, 0x83, 0x0F, 0x85, 0x04, 0x83, 0x00, 0x04, 0x55, 0x30, 0x22, 0x2D, + 0x2B, 0x22, 0x01, 0x4F, 0x01, 0x50, 0x18, 0x84, 0x01, 0x4D, 0x39, 0x22, 0x00, 0x00, 0x34, 0x22, + 0x01, 0x5A, 0x18, 0x84, 0x01, 0x4D, 0x01, 0x4E, 0x2F, 0x22, 0x01, 0x1F, 0x01, 0x55, 0x05, 0x83, + 0x00, 0x03, 0x6F, 0x0F, 0x2B, 0x00, 0x14, 0x83, 0x01, 0x0F, 0x01, 0x2B, 0x0B, 0x83, 0x00, 0x04, + 0x55, 0x30, 0x22, 0x2D, 0x2D, 0x22, 0x01, 0x52, 0x01, 0x56, 0x17, 0x84, 0x01, 0x50, 0x01, 0x5C, + 0x37, 0x22, 0x00, 0x00, 0x33, 0x22, 0x01, 0x59, 0x17, 0x84, 0x01, 0x4D, 0x01, 0x4E, 0x31, 0x22, + 0x01, 0x1F, 0x01, 0x55, 0x29, 0x83, 0x00, 0x04, 0x55, 0x30, 0x22, 0x2D, 0x2F, 0x22, 0x01, 0x52, + 0x01, 0x56, 0x17, 0x84, 0x01, 0x5A, 0x36, 0x22, 0x00, 0x00, 0x31, 0x22, 0x01, 0x4E, 0x01, 0x50, + 0x16, 0x84, 0x01, 0x4D, 0x01, 0x4E, 0x33, 0x22, 0x01, 0x1F, 0x01, 0x7D, 0x29, 0x55, 0x00, 0x04, + 0x7D, 0x30, 0x22, 0x2D, 0x31, 0x22, 0x01, 0x52, 0x01, 0x50, 0x16, 0x84, 0x01, 0x59, 0x35, 0x22, + 0x00, 0x00, 0x30, 0x22, 0x01, 0x5E, 0x16, 0x84, 0x01, 0x56, 0x01, 0x5C, 0x35, 0x22, 0x01, 0x39, + 0x2B, 0x30, 0x00, 0x03, 0x1F, 0x22, 0x2D, 0x00, 0x33, 0x22, 0x01, 0x4F, 0x01, 0x50, 0x15, 0x84, + 0x01, 0x50, 0x01, 0x57, 0x33, 0x22, 0x00, 0x00, 0x2F, 0x22, 0x01, 0x58, 0x15, 0x84, 0x01, 0x50, + 0x01, 0x5E, 0x36, 0x22, 0x01, 0x48, 0x2D, 0x22, 0x01, 0x46, 0x36, 0x22, 0x01, 0x58, 0x16, 0x84, + 0x01, 0x52, 0x32, 0x22, 0x00, 0x00, 0x2E, 0x22, 0x01, 0x59, 0x15, 0x84, 0x01, 0x5A, 0x39, 0x22, + 0x2D, 0x2D, 0x38, 0x22, 0x01, 0x57, 0x01, 0x4D, 0x15, 0x84, 0x01, 0x5A, 0x31, 0x22, 0x00, 0x00, + 0x2C, 0x22, 0x01, 0x57, 0x01, 0x59, 0x14, 0x84, 0x01, 0x59, 0x01, 0x57, 0xA1, 0x22, 0x01, 0x52, + 0x01, 0x50, 0x14, 0x84, 0x01, 0x58, 0x30, 0x22, 0x00, 0x00, 0x2B, 0x22, 0x01, 0x57, 0x01, 0x50, + 0x13, 0x84, 0x01, 0x50, 0x01, 0x5E, 0xA5, 0x22, 0x01, 0x5D, 0x14, 0x84, 0x01, 0x59, 0x2F, 0x22, + 0x00, 0x00, 0x2A, 0x22, 0x01, 0x57, 0x01, 0x50, 0x13, 0x84, 0x01, 0x4D, 0xA8, 0x22, 0x01, 0x4E, + 0x01, 0x56, 0x13, 0x84, 0x01, 0x59, 0x2E, 0x22, 0x00, 0x00, 0x29, 0x22, 0x01, 0x57, 0x01, 0x50, + 0x12, 0x84, 0x01, 0x50, 0x01, 0x5E, 0xAB, 0x22, 0x01, 0x5D, 0x13, 0x84, 0x01, 0x59, 0x2D, 0x22, + 0x00, 0x00, 0x28, 0x22, 0x01, 0x57, 0x01, 0x50, 0x12, 0x84, 0x01, 0x59, 0x01, 0x57, 0xAD, 0x22, + 0x01, 0x5C, 0x01, 0x50, 0x12, 0x84, 0x01, 0x59, 0x2C, 0x22, 0x00, 0x00, 0x27, 0x22, 0x01, 0x57, + 0x01, 0x50, 0x12, 0x84, 0x01, 0x5A, 0xB1, 0x22, 0x01, 0x59, 0x12, 0x84, 0x01, 0x59, 0x2B, 0x22, + 0x00, 0x00, 0x26, 0x22, 0x01, 0x57, 0x01, 0x50, 0x11, 0x84, 0x01, 0x50, 0x01, 0x52, 0xB3, 0x22, + 0x01, 0x5A, 0x12, 0x84, 0x01, 0x59, 0x2A, 0x22, 0x00, 0x00, 0x26, 0x22, 0x01, 0x50, 0x11, 0x84, + 0x01, 0x59, 0x01, 0x57, 0xB5, 0x22, 0x01, 0x52, 0x01, 0x50, 0x11, 0x84, 0x01, 0x5D, 0x29, 0x22, + 0x00, 0x00, 0x25, 0x22, 0x01, 0x59, 0x11, 0x84, 0x01, 0x4D, 0xB8, 0x22, 0x01, 0x57, 0x01, 0x50, + 0x11, 0x84, 0x01, 0x58, 0x28, 0x22, 0x00, 0x00, 0x24, 0x22, 0x01, 0x4D, 0x11, 0x84, 0x01, 0x58, + 0xBB, 0x22, 0x01, 0x59, 0x11, 0x84, 0x01, 0x5E, 0x27, 0x22, 0x00, 0x00, 0x23, 0x22, 0x01, 0x58, + 0x11, 0x84, 0x01, 0x4F, 0xBD, 0x22, 0x01, 0x59, 0x11, 0x84, 0x01, 0x5C, 0x26, 0x22, 0x00, 0x00, + 0x22, 0x22, 0x01, 0x52, 0x11, 0x84, 0x01, 0x52, 0xBF, 0x22, 0x01, 0x58, 0x10, 0x84, 0x01, 0x50, + 0x26, 0x22, 0x00, 0x00, 0x21, 0x22, 0x01, 0x57, 0x01, 0x50, 0x10, 0x84, 0x01, 0x52, 0xC1, 0x22, + 0x01, 0x58, 0x10, 0x84, 0x01, 0x59, 0x25, 0x22, 0x00, 0x00, 0x21, 0x22, 0x01, 0x59, 0x10, 0x84, + 0x01, 0x52, 0xC3, 0x22, 0x01, 0x58, 0x10, 0x84, 0x01, 0x5A, 0x24, 0x22, 0x00, 0x00, 0x20, 0x22, + 0x01, 0x58, 0x10, 0x84, 0x01, 0x52, 0xC5, 0x22, 0x01, 0x58, 0x10, 0x84, 0x01, 0x5C, 0x23, 0x22, + 0x00, 0x00, 0x1F, 0x22, 0x01, 0x5C, 0x10, 0x84, 0x01, 0x52, 0xC7, 0x22, 0x01, 0x58, 0x0F, 0x84, + 0x01, 0x50, 0x23, 0x22, 0x00, 0x00, 0x1F, 0x22, 0x01, 0x50, 0x0F, 0x84, 0x01, 0x4F, 0xC9, 0x22, + 0x01, 0x59, 0x0F, 0x84, 0x01, 0x5D, 0x22, 0x22, 0x00, 0x00, 0x1E, 0x22, 0x01, 0x58, 0x0F, 0x84, + 0x01, 0x58, 0xCB, 0x22, 0x01, 0x59, 0x0F, 0x84, 0x01, 0x5C, 0x21, 0x22, 0x00, 0x00, 0x1D, 0x22, + 0x01, 0x4E, 0x0F, 0x84, 0x01, 0x59, 0xCC, 0x22, 0x01, 0x57, 0x01, 0x50, 0x0E, 0x84, 0x01, 0x56, + 0x21, 0x22, 0x00, 0x00, 0x1D, 0x22, 0x01, 0x59, 0x0E, 0x84, 0x01, 0x50, 0xCE, 0x22, 0x01, 0x5C, + 0x0F, 0x84, 0x01, 0x4F, 0x20, 0x22, 0x00, 0x00, 0x1C, 0x22, 0x01, 0x52, 0x0F, 0x84, 0x01, 0x57, + 0xCF, 0x22, 0x01, 0x4F, 0x0F, 0x84, 0x20, 0x22, 0x00, 0x00, 0x01, 0x22, 0x01, 0x06, 0x3C, 0x4B, + 0x01, 0x4A, 0xAE, 0x22, 0x01, 0x75, 0x3B, 0x4B, 0x00, 0x03, 0x71, 0x15, 0x22, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x1E, 0x4B, 0x71, 0x00, 0x3A, 0x0E, 0x00, 0x03, 0x6C, 0x4B, 0x00, 0x00, 0xAC, 0x22, + 0x01, 0x4A, 0x01, 0x4B, 0x3B, 0x0E, 0x00, 0x03, 0x46, 0x4B, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x4B, 0x0E, 0x00, 0x3A, 0x0A, 0x00, 0x03, 0x4A, 0x4B, 0x48, 0x00, 0xAC, 0x22, 0x01, 0x4A, + 0x01, 0x4B, 0x3B, 0x0A, 0x01, 0x0E, 0x01, 0x4B, 0x00, 0x00, 0x00, 0x05, 0x1E, 0x4B, 0x02, 0x30, + 0x2A, 0x00, 0x04, 0x4C, 0x01, 0x2E, 0x01, 0x30, 0x18, 0x4C, 0x01, 0x2E, 0x01, 0x04, 0x04, 0x4C, + 0x01, 0x39, 0x01, 0x04, 0x07, 0x4C, 0x01, 0x2E, 0x01, 0x2E, 0x09, 0x4C, 0x00, 0x03, 0x04, 0x7A, + 0x75, 0x00, 0xAC, 0x22, 0x00, 0x04, 0x3B, 0x75, 0x30, 0x04, 0x05, 0x4C, 0x01, 0x62, 0x01, 0x04, + 0x18, 0x4C, 0x01, 0x04, 0x01, 0x2E, 0x04, 0x4C, 0x01, 0x2E, 0x01, 0x31, 0x07, 0x4C, 0x01, 0x30, + 0x09, 0x4C, 0x00, 0x04, 0x39, 0x30, 0x4B, 0x15, 0x00, 0x00, 0x00, 0x05, 0x22, 0x48, 0x7A, 0x30, + 0x12, 0x00, 0x04, 0x15, 0x00, 0x03, 0x01, 0x4C, 0x01, 0x00, 0x17, 0x15, 0x00, 0x09, 0x01, 0x4C, + 0x0A, 0x15, 0x15, 0x15, 0x12, 0x2E, 0x21, 0x00, 0x05, 0x15, 0x00, 0x03, 0x21, 0x2E, 0x4C, 0x00, + 0x08, 0x15, 0x00, 0x04, 0x0A, 0x62, 0x01, 0x3B, 0xAC, 0x22, 0x00, 0x0C, 0x37, 0x4B, 0x04, 0x62, + 0x4A, 0x15, 0x15, 0x15, 0x21, 0x78, 0x78, 0x3B, 0x16, 0x15, 0x00, 0x03, 0x0D, 0x78, 0x01, 0x00, + 0x04, 0x15, 0x01, 0x4C, 0x01, 0x12, 0x06, 0x15, 0x00, 0x03, 0x0A, 0x30, 0x0A, 0x00, 0x08, 0x15, + 0x00, 0x04, 0x78, 0x04, 0x4B, 0x1E, 0x00, 0x00, 0x00, 0x11, 0x22, 0x06, 0x6C, 0x30, 0x31, 0x04, + 0x30, 0x30, 0x42, 0x15, 0x15, 0x3D, 0x30, 0x30, 0x30, 0x02, 0x3A, 0x00, 0x0E, 0x30, 0x00, 0x21, + 0x02, 0x30, 0x30, 0x30, 0x15, 0x15, 0x23, 0x30, 0x30, 0x30, 0x4C, 0x02, 0x2A, 0x30, 0x23, 0x30, + 0x02, 0x30, 0x2E, 0x2E, 0x78, 0x30, 0x30, 0x30, 0x1C, 0x02, 0x30, 0x27, 0x30, 0x4C, 0x30, 0x71, + 0x2A, 0x00, 0xAD, 0x22, 0x00, 0x0F, 0x71, 0x4C, 0x30, 0x2A, 0x30, 0x30, 0x30, 0x02, 0x15, 0x15, + 0x02, 0x30, 0x30, 0x30, 0x02, 0x00, 0x0E, 0x30, 0x00, 0x22, 0x02, 0x30, 0x30, 0x30, 0x44, 0x15, + 0x15, 0x44, 0x30, 0x30, 0x32, 0x4C, 0x78, 0x30, 0x32, 0x44, 0x30, 0x23, 0x30, 0x12, 0x30, 0x12, + 0x30, 0x30, 0x30, 0x02, 0x30, 0x32, 0x32, 0x30, 0x39, 0x2E, 0x4B, 0x22, 0x00, 0x00, 0x00, 0x40, + 0x22, 0x05, 0x4B, 0x2E, 0x30, 0x39, 0x30, 0x30, 0x30, 0x32, 0x1F, 0x15, 0x1C, 0x30, 0x32, 0x1C, + 0x32, 0x1C, 0x30, 0x04, 0x30, 0x42, 0x1C, 0x30, 0x32, 0x30, 0x04, 0x30, 0x1C, 0x1C, 0x30, 0x02, + 0x30, 0x32, 0x30, 0x32, 0x44, 0x42, 0x30, 0x30, 0x30, 0x4C, 0x04, 0x3F, 0x4C, 0x01, 0x30, 0x4C, + 0x4C, 0x78, 0x30, 0x12, 0x30, 0x32, 0x30, 0x32, 0x44, 0x30, 0x02, 0x30, 0x31, 0x62, 0x4B, 0x37, + 0xAD, 0x22, 0x00, 0x3F, 0x0D, 0x6C, 0x30, 0x39, 0x62, 0x30, 0x30, 0x1C, 0x44, 0x15, 0x23, 0x30, + 0x1C, 0x42, 0x1C, 0x32, 0x30, 0x1C, 0x1C, 0x30, 0x32, 0x30, 0x42, 0x1C, 0x3A, 0x32, 0x30, 0x32, + 0x30, 0x32, 0x1C, 0x30, 0x04, 0x3A, 0x02, 0x32, 0x1C, 0x30, 0x30, 0x32, 0x4C, 0x2A, 0x4C, 0x78, + 0x2E, 0x30, 0x01, 0x4C, 0x7A, 0x62, 0x7A, 0x30, 0x32, 0x30, 0x02, 0x30, 0x32, 0x32, 0x30, 0x2A, + 0x4C, 0x46, 0x22, 0x00, 0x00, 0x00, 0x00, 0x40, 0x22, 0x22, 0x48, 0x78, 0x30, 0x2A, 0x30, 0x30, + 0x3A, 0x23, 0x23, 0x32, 0x32, 0x42, 0x42, 0x44, 0x3A, 0x32, 0x42, 0x1C, 0x44, 0x3A, 0x44, 0x30, + 0x1C, 0x44, 0x42, 0x44, 0x3A, 0x44, 0x3A, 0x1C, 0x44, 0x1C, 0x44, 0x30, 0x32, 0x42, 0x30, 0x30, + 0x30, 0x4C, 0x2E, 0x21, 0x15, 0x73, 0x23, 0x3D, 0x15, 0x0A, 0x30, 0x12, 0x30, 0x02, 0x30, 0x32, + 0x32, 0x30, 0x02, 0x30, 0x4C, 0x2E, 0x4B, 0x05, 0xAD, 0x22, 0x00, 0x3F, 0x1E, 0x4B, 0x02, 0x62, + 0x39, 0x30, 0x30, 0x44, 0x23, 0x27, 0x32, 0x44, 0x3A, 0x32, 0x42, 0x42, 0x44, 0x3A, 0x32, 0x42, + 0x1C, 0x02, 0x3A, 0x44, 0x30, 0x32, 0x42, 0x1C, 0x44, 0x3A, 0x44, 0x1C, 0x32, 0x04, 0x1C, 0x44, + 0x30, 0x30, 0x30, 0x32, 0x4C, 0x12, 0x15, 0x15, 0x1F, 0x23, 0x15, 0x15, 0x7A, 0x2E, 0x3D, 0x30, + 0x02, 0x30, 0x44, 0x30, 0x44, 0x42, 0x62, 0x2E, 0x78, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x3F, + 0x22, 0x22, 0x15, 0x71, 0x30, 0x39, 0x62, 0x30, 0x30, 0x44, 0x44, 0x30, 0x32, 0x1C, 0x1C, 0x42, + 0x30, 0x04, 0x3A, 0x32, 0x1C, 0x30, 0x44, 0x30, 0x32, 0x1C, 0x1C, 0x32, 0x30, 0x04, 0x3A, 0x32, + 0x1C, 0x1C, 0x32, 0x30, 0x04, 0x3A, 0x42, 0x30, 0x30, 0x4C, 0x2E, 0x39, 0x32, 0x23, 0x32, 0x1F, + 0x32, 0x7A, 0x30, 0x7A, 0x30, 0x27, 0x30, 0x32, 0x3A, 0x42, 0x44, 0x30, 0x31, 0x2A, 0x4B, 0x00, + 0xAF, 0x22, 0x00, 0x3E, 0x48, 0x7A, 0x30, 0x2A, 0x30, 0x30, 0x3A, 0x27, 0x1C, 0x30, 0x44, 0x30, + 0x32, 0x1C, 0x1C, 0x32, 0x30, 0x04, 0x3A, 0x32, 0x1C, 0x1C, 0x04, 0x30, 0x32, 0x3A, 0x32, 0x32, + 0x30, 0x04, 0x3A, 0x32, 0x1C, 0x32, 0x1C, 0x1C, 0x1C, 0x30, 0x1C, 0x4C, 0x12, 0x32, 0x44, 0x44, + 0x32, 0x27, 0x32, 0x4C, 0x2E, 0x3D, 0x30, 0x02, 0x30, 0x02, 0x30, 0x02, 0x30, 0x2E, 0x02, 0x01, + 0x21, 0x22, 0x00, 0x00, 0x00, 0x3F, 0x22, 0x22, 0x03, 0x4B, 0x31, 0x62, 0x39, 0x30, 0x2E, 0x30, + 0x04, 0x02, 0x42, 0x2E, 0x3A, 0x27, 0x04, 0x1C, 0x2E, 0x1C, 0x23, 0x30, 0x02, 0x44, 0x1C, 0x02, + 0x3A, 0x23, 0x30, 0x02, 0x04, 0x42, 0x02, 0x3A, 0x23, 0x30, 0x02, 0x04, 0x1C, 0x30, 0x30, 0x7A, + 0x2E, 0x2E, 0x30, 0x3D, 0x30, 0x3D, 0x30, 0x4C, 0x30, 0x78, 0x30, 0x49, 0x30, 0x1F, 0x30, 0x02, + 0x04, 0x30, 0x2A, 0x7A, 0x75, 0x00, 0xAF, 0x22, 0x00, 0x3E, 0x06, 0x71, 0x30, 0x15, 0x62, 0x30, + 0x2E, 0x1C, 0x2E, 0x30, 0x04, 0x02, 0x1C, 0x2E, 0x3A, 0x44, 0x32, 0x1C, 0x2E, 0x1C, 0x23, 0x30, + 0x02, 0x04, 0x1C, 0x3D, 0x1C, 0x27, 0x30, 0x02, 0x04, 0x1C, 0x2E, 0x1C, 0x3D, 0x30, 0x3A, 0x30, + 0x30, 0x4C, 0x78, 0x30, 0x02, 0x02, 0x30, 0x3D, 0x30, 0x39, 0x02, 0x2E, 0x04, 0x1F, 0x30, 0x39, + 0x30, 0x39, 0x30, 0x39, 0x30, 0x4B, 0x15, 0x22, 0x00, 0x00, 0x00, 0x3F, 0x22, 0x22, 0x22, 0x75, + 0x3F, 0x30, 0x49, 0x04, 0x31, 0x2E, 0x04, 0x2E, 0x31, 0x73, 0x04, 0x02, 0x02, 0x04, 0x73, 0x04, + 0x23, 0x31, 0x3D, 0x02, 0x04, 0x23, 0x04, 0x23, 0x02, 0x02, 0x23, 0x31, 0x3B, 0x04, 0x23, 0x04, + 0x02, 0x02, 0x04, 0x04, 0x04, 0x12, 0x2E, 0x3D, 0x04, 0x39, 0x04, 0x39, 0x04, 0x7A, 0x30, 0x04, + 0x30, 0x31, 0x30, 0x02, 0x30, 0x62, 0x04, 0x62, 0x62, 0x01, 0x3B, 0x00, 0xAF, 0x22, 0x00, 0x23, + 0x05, 0x4B, 0x31, 0x02, 0x2A, 0x04, 0x49, 0x30, 0x02, 0x31, 0x02, 0x23, 0x04, 0x23, 0x04, 0x02, + 0x02, 0x04, 0x73, 0x39, 0x39, 0x04, 0x02, 0x02, 0x04, 0x73, 0x04, 0x23, 0x04, 0x4C, 0x3D, 0x04, + 0x73, 0x04, 0x23, 0x00, 0x04, 0x04, 0x00, 0x17, 0x4C, 0x3B, 0x04, 0x31, 0x27, 0x27, 0x31, 0x04, + 0x4C, 0x30, 0x04, 0x04, 0x02, 0x30, 0x02, 0x30, 0x02, 0x30, 0x62, 0x04, 0x4B, 0x1E, 0x22, 0x00, + 0x00, 0x00, 0x00, 0x32, 0x22, 0x22, 0x22, 0x28, 0x4B, 0x2E, 0x7A, 0x30, 0x04, 0x2A, 0x2E, 0x2E, + 0x2A, 0x30, 0x47, 0x30, 0x23, 0x2E, 0x30, 0x78, 0x30, 0x4C, 0x7A, 0x30, 0x4C, 0x04, 0x30, 0x4C, + 0x30, 0x4C, 0x30, 0x2A, 0x4C, 0x30, 0x4C, 0x42, 0x04, 0x2E, 0x30, 0x39, 0x30, 0x2A, 0x7A, 0x23, + 0x30, 0x4C, 0x30, 0x4C, 0x30, 0x3F, 0x0B, 0x2E, 0x01, 0x71, 0x01, 0x00, 0xB0, 0x22, 0x00, 0x2F, + 0x75, 0x3F, 0x2E, 0x4C, 0x30, 0x2A, 0x2E, 0x2E, 0x4C, 0x62, 0x30, 0x7A, 0x30, 0x2A, 0x30, 0x23, + 0x2E, 0x30, 0x6C, 0x2A, 0x30, 0x7A, 0x30, 0x4C, 0x30, 0x2E, 0x2E, 0x30, 0x2A, 0x39, 0x30, 0x4C, + 0x30, 0x4C, 0x30, 0x2E, 0x2E, 0x30, 0x7A, 0x3F, 0x30, 0x4C, 0x62, 0x2E, 0x31, 0x3A, 0x7A, 0x00, + 0x0A, 0x2E, 0x00, 0x04, 0x2A, 0x4B, 0x22, 0x22, 0x00, 0x00, 0x04, 0x22, 0x01, 0x0D, 0x38, 0x4B, + 0x01, 0x0D, 0xB1, 0x22, 0x01, 0x05, 0x01, 0x48, 0x37, 0x4B, 0x00, 0x04, 0x46, 0x0C, 0x22, 0x22, + 0x00, 0x00, 0x06, 0x22, 0x00, 0x2C, 0x03, 0x00, 0x00, 0x19, 0x85, 0x19, 0x49, 0x0D, 0x49, 0x0D, + 0x06, 0x49, 0x0D, 0x00, 0x4B, 0x7A, 0x2A, 0x78, 0x47, 0x7A, 0x78, 0x47, 0x78, 0x47, 0x78, 0x7A, + 0x39, 0x78, 0x47, 0x78, 0x7A, 0x7A, 0x78, 0x47, 0x78, 0x49, 0x18, 0x0A, 0x0D, 0x49, 0x0D, 0x49, + 0x0D, 0x28, 0xC0, 0x22, 0x00, 0x2C, 0x23, 0x00, 0x15, 0x05, 0x03, 0x05, 0x15, 0x49, 0x0C, 0x06, + 0x15, 0x06, 0x00, 0x0A, 0x48, 0x3D, 0x47, 0x78, 0x47, 0x78, 0x47, 0x78, 0x7A, 0x7A, 0x78, 0x39, + 0x47, 0x78, 0x47, 0x78, 0x47, 0x78, 0x7A, 0x7A, 0x78, 0x7A, 0x46, 0x49, 0x00, 0x00, 0x49, 0x15, + 0x06, 0x36, 0x0B, 0x03, 0x03, 0x22, 0x00, 0x00, 0x09, 0x22, 0x00, 0x03, 0x15, 0x21, 0x21, 0x00, + 0x08, 0x3B, 0x01, 0x45, 0x15, 0x4A, 0x01, 0x4B, 0x01, 0x0E, 0x09, 0x3B, 0x01, 0x12, 0x01, 0x28, + 0xBE, 0x22, 0x01, 0x0D, 0x09, 0x21, 0x01, 0x75, 0x01, 0x18, 0x15, 0x4A, 0x01, 0x45, 0x01, 0x3B, + 0x09, 0x21, 0x01, 0x28, 0x0A, 0x22, 0x00, 0x00, 0x08, 0x22, 0x01, 0x0A, 0x01, 0x22, 0x2B, 0x18, + 0x01, 0x45, 0x01, 0x45, 0x21, 0x22, 0x00, 0x04, 0x57, 0x4E, 0x4E, 0x4E, 0x81, 0x22, 0x04, 0x4E, + 0x13, 0x22, 0x01, 0x45, 0x01, 0x45, 0x2A, 0x18, 0x00, 0x03, 0x38, 0x22, 0x20, 0x00, 0x09, 0x22, + 0x00, 0x00, 0x09, 0x22, 0x01, 0x2A, 0x2B, 0x30, 0x00, 0x03, 0x42, 0x22, 0x00, 0x00, 0x0F, 0x22, + 0x01, 0x57, 0x04, 0x4D, 0x01, 0x52, 0x09, 0x22, 0x01, 0x5C, 0x01, 0x56, 0x04, 0x84, 0x01, 0x50, + 0x01, 0x4F, 0x07, 0x22, 0x04, 0x4D, 0x01, 0x5D, 0x06, 0x22, 0x05, 0x4D, 0x01, 0x4F, 0x01, 0x22, + 0x0D, 0x4D, 0x00, 0x06, 0x22, 0x22, 0x5E, 0x4D, 0x4D, 0x4D, 0x09, 0x22, 0x00, 0x03, 0x5E, 0x4D, + 0x4D, 0x00, 0x13, 0x22, 0x01, 0x5A, 0x04, 0x4D, 0x04, 0x22, 0x01, 0x4E, 0x04, 0x4D, 0x00, 0x04, + 0x52, 0x22, 0x22, 0x57, 0x04, 0x4D, 0x00, 0x09, 0x4F, 0x22, 0x22, 0x22, 0x57, 0x4D, 0x4D, 0x4D, + 0x4E, 0x00, 0x09, 0x22, 0x00, 0x03, 0x4D, 0x4D, 0x52, 0x00, 0x07, 0x22, 0x01, 0x58, 0x05, 0x84, + 0x01, 0x50, 0x01, 0x4F, 0x10, 0x22, 0x01, 0x2D, 0x01, 0x22, 0x2C, 0x30, 0x01, 0x12, 0x01, 0x71, + 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x00, 0x29, 0x2F, 0x00, 0x04, 0x34, 0x30, + 0x22, 0x15, 0x10, 0x22, 0x04, 0x84, 0x01, 0x4D, 0x08, 0x22, 0x01, 0x52, 0x08, 0x84, 0x01, 0x59, + 0x06, 0x22, 0x01, 0x4D, 0x04, 0x84, 0x05, 0x22, 0x01, 0x52, 0x05, 0x84, 0x01, 0x5C, 0x01, 0x22, + 0x0D, 0x84, 0x00, 0x06, 0x4E, 0x22, 0x4F, 0x84, 0x84, 0x84, 0x09, 0x22, 0x00, 0x03, 0x50, 0x84, + 0x84, 0x00, 0x13, 0x22, 0x01, 0x4D, 0x04, 0x84, 0x04, 0x22, 0x01, 0x4F, 0x04, 0x84, 0x00, 0x04, + 0x4E, 0x22, 0x22, 0x4E, 0x04, 0x84, 0x00, 0x09, 0x4F, 0x22, 0x22, 0x22, 0x4E, 0x84, 0x84, 0x84, + 0x4E, 0x00, 0x08, 0x22, 0x00, 0x04, 0x5D, 0x84, 0x84, 0x4E, 0x05, 0x22, 0x01, 0x52, 0x09, 0x84, + 0x01, 0x58, 0x0F, 0x22, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x7E, 0x29, 0x5B, 0x00, 0x03, 0x27, 0x12, + 0x71, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, 0x29, 0x80, 0x00, 0x04, + 0x2F, 0x30, 0x22, 0x00, 0x10, 0x22, 0x00, 0x05, 0x56, 0x84, 0x84, 0x84, 0x50, 0x00, 0x08, 0x22, + 0x01, 0x50, 0x09, 0x84, 0x01, 0x50, 0x05, 0x22, 0x01, 0x4D, 0x04, 0x84, 0x05, 0x22, 0x01, 0x56, + 0x04, 0x84, 0x00, 0x04, 0x56, 0x22, 0x22, 0x59, 0x0C, 0x84, 0x00, 0x06, 0x4E, 0x22, 0x4F, 0x84, + 0x84, 0x84, 0x08, 0x22, 0x00, 0x04, 0x4F, 0x84, 0x84, 0x84, 0x13, 0x22, 0x01, 0x59, 0x04, 0x84, + 0x04, 0x22, 0x01, 0x5A, 0x04, 0x84, 0x00, 0x04, 0x4E, 0x22, 0x22, 0x5E, 0x04, 0x84, 0x00, 0x08, + 0x52, 0x22, 0x22, 0x22, 0x4F, 0x84, 0x84, 0x84, 0x08, 0x22, 0x00, 0x04, 0x52, 0x84, 0x84, 0x84, + 0x05, 0x22, 0x01, 0x5A, 0x0B, 0x84, 0x01, 0x52, 0x0E, 0x22, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, + 0x29, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, + 0x01, 0x33, 0x29, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x00, 0x10, 0x22, 0x01, 0x5D, 0x04, 0x84, + 0x07, 0x22, 0x01, 0x4F, 0x0B, 0x84, 0x01, 0x59, 0x04, 0x22, 0x01, 0x4F, 0x04, 0x84, 0x00, 0x05, + 0x4E, 0x22, 0x22, 0x22, 0x4E, 0x00, 0x05, 0x84, 0x00, 0x04, 0x52, 0x22, 0x22, 0x4D, 0x0C, 0x84, + 0x00, 0x06, 0x4E, 0x22, 0x4F, 0x84, 0x84, 0x84, 0x08, 0x22, 0x00, 0x04, 0x50, 0x84, 0x84, 0x84, + 0x13, 0x22, 0x04, 0x84, 0x01, 0x4D, 0x04, 0x22, 0x01, 0x4D, 0x04, 0x84, 0x00, 0x04, 0x22, 0x22, + 0x22, 0x4F, 0x04, 0x84, 0x00, 0x08, 0x4E, 0x22, 0x22, 0x22, 0x58, 0x84, 0x84, 0x56, 0x08, 0x22, + 0x00, 0x04, 0x50, 0x84, 0x84, 0x56, 0x04, 0x22, 0x01, 0x52, 0x0C, 0x84, 0x01, 0x59, 0x0E, 0x22, + 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x29, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x09, 0x22, + 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, 0x0C, 0x80, 0x00, 0x05, 0x69, 0x16, 0x16, 0x16, + 0x69, 0x00, 0x07, 0x80, 0x00, 0x05, 0x24, 0x16, 0x16, 0x16, 0x24, 0x00, 0x0C, 0x80, 0x00, 0x04, + 0x2F, 0x30, 0x22, 0x15, 0x10, 0x22, 0x01, 0x5E, 0x04, 0x84, 0x01, 0x52, 0x06, 0x22, 0x00, 0x09, + 0x56, 0x84, 0x84, 0x84, 0x50, 0x52, 0x57, 0x5C, 0x59, 0x00, 0x04, 0x84, 0x00, 0x05, 0x4F, 0x22, + 0x22, 0x22, 0x4F, 0x00, 0x04, 0x84, 0x00, 0x05, 0x4E, 0x22, 0x22, 0x22, 0x5D, 0x00, 0x04, 0x84, + 0x00, 0x05, 0x50, 0x22, 0x22, 0x22, 0x4D, 0x00, 0x04, 0x84, 0x08, 0x4D, 0x00, 0x06, 0x57, 0x22, + 0x4F, 0x84, 0x84, 0x84, 0x07, 0x22, 0x00, 0x05, 0x4F, 0x84, 0x84, 0x84, 0x4D, 0x00, 0x13, 0x22, + 0x04, 0x84, 0x01, 0x4D, 0x04, 0x22, 0x00, 0x09, 0x56, 0x84, 0x84, 0x84, 0x56, 0x22, 0x22, 0x22, + 0x4D, 0x00, 0x04, 0x84, 0x04, 0x22, 0x00, 0x04, 0x4D, 0x84, 0x84, 0x4D, 0x07, 0x22, 0x00, 0x09, + 0x4D, 0x84, 0x84, 0x84, 0x58, 0x22, 0x22, 0x22, 0x57, 0x00, 0x05, 0x84, 0x00, 0x04, 0x50, 0x5D, + 0x58, 0x50, 0x05, 0x84, 0x0E, 0x22, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x11, 0x82, 0x00, 0x09, + 0x64, 0x2C, 0x1D, 0x60, 0x60, 0x60, 0x1D, 0x2C, 0x64, 0x00, 0x0F, 0x82, 0x00, 0x03, 0x1F, 0x12, + 0x71, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, 0x0D, 0x80, 0x00, 0x04, + 0x63, 0x85, 0x85, 0x26, 0x07, 0x80, 0x00, 0x05, 0x6A, 0x85, 0x85, 0x85, 0x16, 0x00, 0x0C, 0x80, + 0x00, 0x04, 0x2F, 0x30, 0x22, 0x00, 0x10, 0x22, 0x01, 0x4E, 0x04, 0x84, 0x01, 0x5A, 0x06, 0x22, + 0x04, 0x84, 0x01, 0x52, 0x04, 0x22, 0x00, 0x09, 0x56, 0x84, 0x84, 0x84, 0x50, 0x22, 0x22, 0x22, + 0x4E, 0x00, 0x04, 0x84, 0x00, 0x04, 0x4F, 0x22, 0x22, 0x22, 0x05, 0x84, 0x00, 0x05, 0x4F, 0x22, + 0x22, 0x22, 0x5D, 0x00, 0x04, 0x84, 0x0A, 0x22, 0x00, 0x04, 0x4F, 0x84, 0x84, 0x84, 0x07, 0x22, + 0x00, 0x05, 0x50, 0x84, 0x84, 0x84, 0x4D, 0x00, 0x13, 0x22, 0x04, 0x84, 0x01, 0x5D, 0x04, 0x22, + 0x04, 0x84, 0x00, 0x05, 0x5D, 0x22, 0x22, 0x22, 0x4D, 0x00, 0x04, 0x84, 0x04, 0x22, 0x00, 0x04, + 0x84, 0x84, 0x84, 0x4F, 0x06, 0x22, 0x01, 0x4F, 0x04, 0x84, 0x00, 0x05, 0x5E, 0x22, 0x22, 0x22, + 0x4D, 0x00, 0x04, 0x84, 0x01, 0x59, 0x04, 0x22, 0x01, 0x59, 0x04, 0x84, 0x0E, 0x22, 0x00, 0x04, + 0x2D, 0x22, 0x30, 0x5B, 0x10, 0x82, 0x01, 0x14, 0x01, 0x67, 0x07, 0x85, 0x01, 0x14, 0x0F, 0x82, + 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, + 0x0D, 0x80, 0x00, 0x04, 0x26, 0x85, 0x85, 0x6A, 0x06, 0x80, 0x01, 0x69, 0x04, 0x85, 0x01, 0x69, + 0x0C, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x00, 0x11, 0x22, 0x04, 0x84, 0x01, 0x4D, 0x05, 0x22, + 0x01, 0x4E, 0x04, 0x84, 0x01, 0x4E, 0x04, 0x22, 0x01, 0x4E, 0x04, 0x84, 0x00, 0x04, 0x5E, 0x22, + 0x22, 0x4E, 0x04, 0x84, 0x00, 0x04, 0x4F, 0x22, 0x22, 0x5A, 0x05, 0x84, 0x04, 0x22, 0x01, 0x4F, + 0x04, 0x84, 0x01, 0x4E, 0x09, 0x22, 0x00, 0x04, 0x4F, 0x84, 0x84, 0x84, 0x06, 0x22, 0x01, 0x58, + 0x04, 0x84, 0x01, 0x4D, 0x12, 0x22, 0x01, 0x4E, 0x04, 0x84, 0x00, 0x05, 0x4F, 0x22, 0x22, 0x22, + 0x4E, 0x00, 0x04, 0x84, 0x00, 0x04, 0x4F, 0x22, 0x22, 0x22, 0x04, 0x84, 0x01, 0x4D, 0x04, 0x22, + 0x00, 0x04, 0x84, 0x84, 0x84, 0x52, 0x05, 0x22, 0x01, 0x57, 0x05, 0x84, 0x00, 0x04, 0x4E, 0x22, + 0x22, 0x4E, 0x04, 0x84, 0x01, 0x59, 0x05, 0x22, 0x00, 0x05, 0x5E, 0x84, 0x84, 0x84, 0x5D, 0x00, + 0x0E, 0x22, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x0F, 0x82, 0x01, 0x1D, 0x09, 0x85, 0x01, 0x14, + 0x0F, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, + 0x01, 0x33, 0x0D, 0x80, 0x00, 0x05, 0x24, 0x85, 0x85, 0x85, 0x09, 0x00, 0x05, 0x80, 0x00, 0x05, + 0x16, 0x85, 0x85, 0x85, 0x6E, 0x00, 0x0D, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x15, 0x11, 0x22, + 0x01, 0x4D, 0x04, 0x84, 0x05, 0x22, 0x01, 0x4E, 0x04, 0x84, 0x01, 0x57, 0x05, 0x22, 0x00, 0x08, + 0x56, 0x84, 0x84, 0x84, 0x56, 0x22, 0x22, 0x22, 0x04, 0x84, 0x00, 0x04, 0x5D, 0x22, 0x22, 0x50, + 0x04, 0x84, 0x01, 0x58, 0x04, 0x22, 0x01, 0x4F, 0x04, 0x84, 0x01, 0x4E, 0x09, 0x22, 0x00, 0x04, + 0x4F, 0x84, 0x84, 0x84, 0x06, 0x22, 0x05, 0x84, 0x01, 0x4D, 0x12, 0x22, 0x01, 0x4E, 0x04, 0x84, + 0x00, 0x05, 0x4F, 0x22, 0x22, 0x22, 0x4F, 0x00, 0x04, 0x84, 0x00, 0x04, 0x4E, 0x22, 0x22, 0x22, + 0x04, 0x84, 0x00, 0x09, 0x5D, 0x22, 0x22, 0x22, 0x4E, 0x84, 0x84, 0x84, 0x4E, 0x00, 0x05, 0x22, + 0x01, 0x59, 0x05, 0x84, 0x00, 0x04, 0x22, 0x22, 0x22, 0x4D, 0x04, 0x84, 0x01, 0x57, 0x05, 0x22, + 0x00, 0x05, 0x58, 0x84, 0x84, 0x84, 0x5E, 0x00, 0x0E, 0x22, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, + 0x0E, 0x82, 0x01, 0x14, 0x04, 0x85, 0x00, 0x07, 0x6D, 0x2C, 0x11, 0x11, 0x14, 0x70, 0x14, 0x00, + 0x0F, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, + 0x01, 0x33, 0x0E, 0x80, 0x00, 0x04, 0x63, 0x85, 0x85, 0x26, 0x05, 0x09, 0x00, 0x05, 0x6E, 0x85, + 0x85, 0x85, 0x16, 0x00, 0x0D, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x00, 0x11, 0x22, 0x01, 0x5A, + 0x04, 0x84, 0x01, 0x57, 0x04, 0x22, 0x01, 0x4E, 0x04, 0x84, 0x01, 0x4E, 0x05, 0x22, 0x01, 0x5A, + 0x04, 0x84, 0x00, 0x03, 0x57, 0x22, 0x22, 0x00, 0x04, 0x84, 0x00, 0x03, 0x4D, 0x22, 0x52, 0x00, + 0x05, 0x84, 0x05, 0x22, 0x01, 0x4F, 0x04, 0x84, 0x01, 0x4E, 0x09, 0x22, 0x00, 0x04, 0x4F, 0x84, + 0x84, 0x84, 0x05, 0x22, 0x01, 0x58, 0x05, 0x84, 0x01, 0x4D, 0x12, 0x22, 0x01, 0x4E, 0x04, 0x84, + 0x00, 0x05, 0x52, 0x22, 0x22, 0x22, 0x5D, 0x00, 0x04, 0x84, 0x00, 0x04, 0x22, 0x22, 0x22, 0x4E, + 0x04, 0x84, 0x00, 0x08, 0x4F, 0x22, 0x22, 0x22, 0x5E, 0x84, 0x84, 0x84, 0x05, 0x22, 0x01, 0x5A, + 0x05, 0x84, 0x00, 0x04, 0x59, 0x22, 0x22, 0x57, 0x04, 0x84, 0x01, 0x58, 0x06, 0x22, 0x00, 0x05, + 0x56, 0x84, 0x84, 0x84, 0x57, 0x00, 0x0E, 0x22, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x0D, 0x82, + 0x00, 0x07, 0x64, 0x67, 0x85, 0x85, 0x85, 0x74, 0x64, 0x00, 0x15, 0x82, 0x00, 0x03, 0x1F, 0x12, + 0x71, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, 0x0E, 0x80, 0x01, 0x26, + 0x0C, 0x85, 0x01, 0x69, 0x0D, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x00, 0x11, 0x22, 0x01, 0x52, + 0x04, 0x84, 0x01, 0x52, 0x04, 0x22, 0x01, 0x4E, 0x04, 0x84, 0x01, 0x4E, 0x05, 0x22, 0x01, 0x4E, + 0x04, 0x84, 0x00, 0x0A, 0x4F, 0x22, 0x22, 0x4D, 0x84, 0x84, 0x84, 0x56, 0x22, 0x56, 0x04, 0x84, + 0x01, 0x5D, 0x05, 0x22, 0x01, 0x52, 0x04, 0x84, 0x01, 0x4E, 0x09, 0x22, 0x00, 0x04, 0x4F, 0x84, + 0x84, 0x84, 0x05, 0x22, 0x06, 0x84, 0x01, 0x4D, 0x12, 0x22, 0x01, 0x4F, 0x04, 0x84, 0x00, 0x0D, + 0x4E, 0x22, 0x22, 0x22, 0x50, 0x84, 0x84, 0x84, 0x5D, 0x22, 0x22, 0x22, 0x5C, 0x00, 0x04, 0x84, + 0x00, 0x08, 0x52, 0x22, 0x22, 0x22, 0x5A, 0x84, 0x84, 0x56, 0x04, 0x22, 0x01, 0x4E, 0x06, 0x84, + 0x00, 0x04, 0x58, 0x22, 0x22, 0x58, 0x04, 0x84, 0x01, 0x4E, 0x06, 0x22, 0x00, 0x04, 0x84, 0x84, + 0x84, 0x50, 0x0F, 0x22, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x0D, 0x82, 0x01, 0x2C, 0x04, 0x85, + 0x01, 0x11, 0x16, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, + 0x01, 0x1F, 0x01, 0x33, 0x0E, 0x80, 0x01, 0x24, 0x0B, 0x85, 0x01, 0x6E, 0x0E, 0x80, 0x00, 0x04, + 0x2F, 0x30, 0x22, 0x15, 0x12, 0x22, 0x04, 0x84, 0x01, 0x5A, 0x04, 0x22, 0x01, 0x4E, 0x04, 0x84, + 0x01, 0x52, 0x06, 0x22, 0x04, 0x84, 0x00, 0x04, 0x4D, 0x22, 0x22, 0x4D, 0x04, 0x84, 0x01, 0x58, + 0x05, 0x84, 0x01, 0x4E, 0x05, 0x22, 0x01, 0x4E, 0x04, 0x84, 0x01, 0x52, 0x09, 0x22, 0x00, 0x04, + 0x4F, 0x84, 0x84, 0x84, 0x04, 0x22, 0x01, 0x58, 0x06, 0x84, 0x01, 0x4D, 0x12, 0x22, 0x01, 0x4F, + 0x04, 0x84, 0x00, 0x04, 0x4E, 0x22, 0x22, 0x5C, 0x04, 0x84, 0x00, 0x05, 0x52, 0x22, 0x22, 0x22, + 0x4F, 0x00, 0x04, 0x84, 0x00, 0x08, 0x4E, 0x22, 0x22, 0x22, 0x4D, 0x84, 0x84, 0x4D, 0x04, 0x22, + 0x01, 0x56, 0x06, 0x84, 0x00, 0x08, 0x5E, 0x22, 0x22, 0x50, 0x84, 0x84, 0x84, 0x56, 0x06, 0x22, + 0x00, 0x05, 0x52, 0x84, 0x84, 0x84, 0x5D, 0x00, 0x0F, 0x22, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, + 0x0D, 0x82, 0x00, 0x05, 0x1D, 0x85, 0x85, 0x85, 0x6D, 0x00, 0x17, 0x82, 0x00, 0x03, 0x1F, 0x12, + 0x71, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, 0x0F, 0x80, 0x00, 0x0C, + 0x63, 0x85, 0x85, 0x61, 0x16, 0x16, 0x16, 0x63, 0x85, 0x85, 0x85, 0x16, 0x0E, 0x80, 0x00, 0x04, + 0x2F, 0x30, 0x22, 0x00, 0x12, 0x22, 0x00, 0x05, 0x50, 0x84, 0x84, 0x84, 0x4D, 0x00, 0x04, 0x22, + 0x01, 0x4E, 0x04, 0x84, 0x01, 0x4F, 0x06, 0x22, 0x00, 0x08, 0x4D, 0x84, 0x84, 0x84, 0x50, 0x22, + 0x22, 0x4F, 0x09, 0x84, 0x01, 0x4D, 0x06, 0x22, 0x01, 0x4E, 0x04, 0x84, 0x01, 0x4F, 0x09, 0x22, + 0x00, 0x08, 0x4E, 0x84, 0x84, 0x84, 0x22, 0x22, 0x22, 0x57, 0x07, 0x84, 0x00, 0x04, 0x4D, 0x22, + 0x22, 0x52, 0x0C, 0x4D, 0x00, 0x04, 0x5C, 0x22, 0x22, 0x4F, 0x04, 0x84, 0x00, 0x04, 0x22, 0x22, + 0x22, 0x4D, 0x04, 0x84, 0x04, 0x22, 0x01, 0x58, 0x04, 0x84, 0x04, 0x22, 0x00, 0x08, 0x50, 0x84, + 0x84, 0x4F, 0x22, 0x22, 0x22, 0x5D, 0x07, 0x84, 0x00, 0x03, 0x4E, 0x22, 0x57, 0x00, 0x04, 0x84, + 0x01, 0x5A, 0x06, 0x22, 0x00, 0x05, 0x58, 0x84, 0x84, 0x84, 0x5E, 0x00, 0x0F, 0x22, 0x00, 0x04, + 0x2D, 0x22, 0x30, 0x5B, 0x0D, 0x82, 0x00, 0x05, 0x60, 0x85, 0x85, 0x85, 0x70, 0x00, 0x17, 0x82, + 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, + 0x0F, 0x80, 0x00, 0x07, 0x26, 0x85, 0x85, 0x77, 0x80, 0x80, 0x69, 0x00, 0x04, 0x85, 0x01, 0x69, + 0x0E, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x00, 0x12, 0x22, 0x01, 0x4D, 0x04, 0x84, 0x05, 0x22, + 0x04, 0x84, 0x01, 0x58, 0x06, 0x22, 0x01, 0x5A, 0x04, 0x84, 0x00, 0x03, 0x22, 0x22, 0x4F, 0x00, + 0x09, 0x84, 0x01, 0x52, 0x06, 0x22, 0x01, 0x4E, 0x04, 0x84, 0x01, 0x4F, 0x09, 0x22, 0x00, 0x08, + 0x4E, 0x84, 0x84, 0x84, 0x22, 0x22, 0x22, 0x4D, 0x07, 0x84, 0x00, 0x04, 0x4D, 0x22, 0x22, 0x5A, + 0x0C, 0x84, 0x00, 0x04, 0x4E, 0x22, 0x22, 0x4D, 0x04, 0x84, 0x00, 0x03, 0x22, 0x22, 0x5C, 0x00, + 0x04, 0x84, 0x01, 0x58, 0x04, 0x22, 0x00, 0x05, 0x4D, 0x84, 0x84, 0x84, 0x50, 0x00, 0x04, 0x22, + 0x00, 0x07, 0x84, 0x84, 0x84, 0x52, 0x22, 0x22, 0x5C, 0x00, 0x08, 0x84, 0x00, 0x03, 0x22, 0x22, + 0x4F, 0x00, 0x04, 0x84, 0x00, 0x0C, 0x4E, 0x22, 0x22, 0x22, 0x5E, 0x4F, 0x4F, 0x56, 0x84, 0x84, + 0x84, 0x57, 0x0F, 0x22, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x0D, 0x82, 0x00, 0x05, 0x60, 0x85, + 0x85, 0x85, 0x14, 0x00, 0x17, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x09, 0x22, 0x00, 0x00, + 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, 0x0F, 0x80, 0x00, 0x0B, 0x24, 0x85, 0x85, 0x85, 0x69, 0x80, + 0x16, 0x85, 0x85, 0x85, 0x77, 0x00, 0x0F, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x15, 0x12, 0x22, + 0x01, 0x4F, 0x04, 0x84, 0x01, 0x57, 0x04, 0x22, 0x00, 0x05, 0x50, 0x84, 0x84, 0x84, 0x4D, 0x00, + 0x06, 0x22, 0x01, 0x52, 0x04, 0x84, 0x00, 0x03, 0x4E, 0x22, 0x4E, 0x00, 0x08, 0x84, 0x01, 0x56, + 0x08, 0x22, 0x08, 0x84, 0x00, 0x0D, 0x59, 0x4D, 0x57, 0x22, 0x22, 0x22, 0x4E, 0x84, 0x84, 0x84, + 0x22, 0x22, 0x4E, 0x00, 0x05, 0x84, 0x00, 0x07, 0x56, 0x84, 0x84, 0x4D, 0x22, 0x22, 0x4D, 0x00, + 0x0C, 0x84, 0x00, 0x04, 0x4E, 0x22, 0x22, 0x4D, 0x04, 0x84, 0x00, 0x07, 0x4E, 0x5E, 0x50, 0x84, + 0x84, 0x84, 0x50, 0x00, 0x05, 0x22, 0x00, 0x10, 0x56, 0x84, 0x84, 0x84, 0x4D, 0x22, 0x22, 0x22, + 0x4E, 0x84, 0x84, 0x84, 0x4E, 0x22, 0x22, 0x50, 0x04, 0x84, 0x00, 0x0B, 0x50, 0x84, 0x84, 0x59, + 0x22, 0x22, 0x4D, 0x84, 0x84, 0x84, 0x50, 0x00, 0x04, 0x22, 0x06, 0x84, 0x01, 0x50, 0x10, 0x22, + 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x0D, 0x82, 0x00, 0x05, 0x60, 0x85, 0x85, 0x85, 0x14, 0x00, + 0x17, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, + 0x01, 0x33, 0x10, 0x80, 0x00, 0x0A, 0x63, 0x85, 0x85, 0x24, 0x80, 0x6E, 0x85, 0x85, 0x85, 0x24, + 0x0F, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x00, 0x12, 0x22, 0x01, 0x4E, 0x04, 0x84, 0x01, 0x52, + 0x04, 0x22, 0x01, 0x4D, 0x04, 0x84, 0x06, 0x22, 0x01, 0x4E, 0x04, 0x84, 0x00, 0x03, 0x4F, 0x22, + 0x4E, 0x00, 0x08, 0x84, 0x01, 0x5E, 0x08, 0x22, 0x0A, 0x84, 0x00, 0x0B, 0x52, 0x22, 0x22, 0x22, + 0x4E, 0x84, 0x84, 0x84, 0x22, 0x22, 0x4D, 0x00, 0x04, 0x84, 0x00, 0x08, 0x58, 0x4D, 0x84, 0x84, + 0x4D, 0x22, 0x22, 0x4D, 0x0C, 0x84, 0x00, 0x04, 0x4E, 0x22, 0x22, 0x4D, 0x0A, 0x84, 0x01, 0x52, + 0x05, 0x22, 0x04, 0x84, 0x00, 0x0B, 0x58, 0x22, 0x22, 0x22, 0x52, 0x84, 0x84, 0x84, 0x22, 0x22, + 0x4D, 0x00, 0x04, 0x84, 0x00, 0x07, 0x5D, 0x59, 0x84, 0x84, 0x58, 0x22, 0x22, 0x00, 0x04, 0x84, + 0x00, 0x05, 0x4D, 0x22, 0x22, 0x22, 0x5C, 0x00, 0x06, 0x84, 0x01, 0x58, 0x10, 0x22, 0x00, 0x04, + 0x2D, 0x22, 0x30, 0x5B, 0x0D, 0x82, 0x00, 0x05, 0x60, 0x85, 0x85, 0x85, 0x14, 0x00, 0x17, 0x82, + 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, + 0x10, 0x80, 0x00, 0x05, 0x26, 0x85, 0x85, 0x77, 0x69, 0x00, 0x04, 0x85, 0x01, 0x69, 0x0F, 0x80, + 0x00, 0x04, 0x2F, 0x30, 0x22, 0x0C, 0x13, 0x22, 0x04, 0x84, 0x01, 0x5A, 0x04, 0x22, 0x01, 0x4F, + 0x04, 0x84, 0x07, 0x22, 0x04, 0x84, 0x00, 0x03, 0x4F, 0x22, 0x22, 0x00, 0x07, 0x84, 0x01, 0x50, + 0x09, 0x22, 0x0A, 0x84, 0x00, 0x0A, 0x4F, 0x22, 0x22, 0x22, 0x4E, 0x84, 0x84, 0x84, 0x22, 0x4E, + 0x05, 0x84, 0x00, 0x08, 0x22, 0x4D, 0x84, 0x84, 0x5A, 0x22, 0x22, 0x4D, 0x0C, 0x84, 0x00, 0x04, + 0x22, 0x22, 0x22, 0x50, 0x09, 0x84, 0x01, 0x52, 0x06, 0x22, 0x04, 0x84, 0x00, 0x0A, 0x4F, 0x22, + 0x22, 0x22, 0x4F, 0x84, 0x84, 0x56, 0x22, 0x5E, 0x04, 0x84, 0x00, 0x08, 0x50, 0x51, 0x84, 0x84, + 0x84, 0x5E, 0x22, 0x57, 0x04, 0x84, 0x00, 0x05, 0x4F, 0x22, 0x22, 0x22, 0x4F, 0x00, 0x06, 0x84, + 0x01, 0x52, 0x10, 0x22, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x0D, 0x82, 0x00, 0x05, 0x60, 0x85, + 0x85, 0x85, 0x60, 0x00, 0x17, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x09, 0x22, 0x00, 0x00, + 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, 0x10, 0x80, 0x00, 0x09, 0x24, 0x85, 0x85, 0x63, 0x16, 0x85, + 0x85, 0x85, 0x77, 0x00, 0x10, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x13, 0x22, 0x00, 0x05, + 0x56, 0x84, 0x84, 0x84, 0x4D, 0x00, 0x04, 0x22, 0x01, 0x5C, 0x04, 0x84, 0x01, 0x4E, 0x06, 0x22, + 0x04, 0x84, 0x00, 0x03, 0x4D, 0x22, 0x22, 0x00, 0x07, 0x84, 0x01, 0x56, 0x09, 0x22, 0x01, 0x56, + 0x09, 0x84, 0x00, 0x0A, 0x4F, 0x22, 0x22, 0x22, 0x4E, 0x84, 0x84, 0x84, 0x22, 0x4D, 0x04, 0x84, + 0x00, 0x09, 0x58, 0x22, 0x4D, 0x84, 0x84, 0x4F, 0x22, 0x22, 0x57, 0x00, 0x07, 0x4E, 0x05, 0x4F, + 0x00, 0x03, 0x22, 0x22, 0x22, 0x00, 0x09, 0x84, 0x01, 0x4D, 0x06, 0x22, 0x01, 0x4E, 0x04, 0x84, + 0x00, 0x0A, 0x5C, 0x22, 0x22, 0x22, 0x4D, 0x84, 0x84, 0x4D, 0x57, 0x50, 0x04, 0x84, 0x00, 0x08, + 0x5C, 0x57, 0x84, 0x84, 0x84, 0x4E, 0x22, 0x5E, 0x04, 0x84, 0x00, 0x05, 0x4E, 0x22, 0x22, 0x22, + 0x5A, 0x00, 0x06, 0x4D, 0x11, 0x22, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x0D, 0x82, 0x00, 0x05, + 0x14, 0x85, 0x85, 0x85, 0x67, 0x00, 0x17, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x09, 0x22, + 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, 0x11, 0x80, 0x01, 0x63, 0x06, 0x85, 0x01, 0x24, + 0x10, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x13, 0x22, 0x01, 0x58, 0x04, 0x84, 0x05, 0x22, + 0x04, 0x84, 0x01, 0x4F, 0x06, 0x22, 0x00, 0x08, 0x4D, 0x84, 0x84, 0x84, 0x4D, 0x22, 0x22, 0x4D, + 0x07, 0x84, 0x01, 0x4F, 0x08, 0x22, 0x01, 0x4D, 0x09, 0x84, 0x00, 0x09, 0x4F, 0x22, 0x22, 0x22, + 0x4E, 0x84, 0x84, 0x84, 0x52, 0x00, 0x05, 0x84, 0x00, 0x06, 0x22, 0x22, 0x4D, 0x84, 0x84, 0x4F, + 0x12, 0x22, 0x0B, 0x84, 0x01, 0x5C, 0x04, 0x22, 0x01, 0x5E, 0x04, 0x84, 0x00, 0x09, 0x4E, 0x22, + 0x22, 0x22, 0x59, 0x84, 0x84, 0x4F, 0x59, 0x00, 0x04, 0x84, 0x00, 0x09, 0x5D, 0x22, 0x52, 0x84, + 0x84, 0x84, 0x22, 0x22, 0x5A, 0x00, 0x04, 0x84, 0x1C, 0x22, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, + 0x0D, 0x82, 0x01, 0x11, 0x04, 0x85, 0x01, 0x14, 0x16, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, + 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, 0x11, 0x80, 0x01, 0x26, 0x05, 0x85, + 0x01, 0x63, 0x11, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x13, 0x22, 0x01, 0x5E, 0x04, 0x84, + 0x01, 0x57, 0x04, 0x22, 0x00, 0x05, 0x56, 0x84, 0x84, 0x84, 0x5D, 0x00, 0x06, 0x22, 0x00, 0x10, + 0x4D, 0x84, 0x84, 0x84, 0x59, 0x22, 0x22, 0x4D, 0x84, 0x84, 0x84, 0x50, 0x50, 0x84, 0x84, 0x84, + 0x08, 0x22, 0x00, 0x05, 0x4D, 0x84, 0x84, 0x84, 0x4D, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x08, 0x84, + 0x00, 0x07, 0x58, 0x22, 0x22, 0x4D, 0x84, 0x84, 0x4F, 0x00, 0x11, 0x22, 0x01, 0x57, 0x04, 0x84, + 0x00, 0x03, 0x4D, 0x4F, 0x5A, 0x00, 0x04, 0x84, 0x01, 0x56, 0x04, 0x22, 0x01, 0x4F, 0x04, 0x84, + 0x04, 0x22, 0x00, 0x04, 0x84, 0x84, 0x84, 0x56, 0x04, 0x84, 0x00, 0x0E, 0x50, 0x22, 0x22, 0x5A, + 0x84, 0x84, 0x59, 0x22, 0x22, 0x4D, 0x84, 0x84, 0x84, 0x50, 0x1C, 0x22, 0x00, 0x04, 0x2D, 0x22, + 0x30, 0x5B, 0x0E, 0x82, 0x00, 0x06, 0x60, 0x85, 0x85, 0x85, 0x67, 0x11, 0x15, 0x82, 0x00, 0x03, + 0x1F, 0x12, 0x71, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, 0x11, 0x80, + 0x01, 0x24, 0x05, 0x85, 0x01, 0x26, 0x11, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x13, 0x22, + 0x01, 0x57, 0x04, 0x84, 0x01, 0x52, 0x04, 0x22, 0x00, 0x05, 0x58, 0x84, 0x84, 0x84, 0x50, 0x00, + 0x06, 0x22, 0x01, 0x5A, 0x04, 0x84, 0x00, 0x03, 0x22, 0x22, 0x4F, 0x00, 0x04, 0x84, 0x00, 0x05, + 0x4F, 0x84, 0x84, 0x84, 0x4D, 0x00, 0x07, 0x22, 0x00, 0x05, 0x4D, 0x84, 0x84, 0x84, 0x50, 0x00, + 0x09, 0x22, 0x01, 0x4E, 0x08, 0x84, 0x00, 0x07, 0x22, 0x22, 0x22, 0x4D, 0x84, 0x84, 0x4F, 0x00, + 0x11, 0x22, 0x01, 0x4E, 0x04, 0x84, 0x00, 0x04, 0x4E, 0x22, 0x22, 0x5E, 0x04, 0x84, 0x00, 0x0D, + 0x57, 0x22, 0x22, 0x22, 0x5D, 0x84, 0x84, 0x84, 0x50, 0x22, 0x22, 0x22, 0x57, 0x00, 0x08, 0x84, + 0x00, 0x0E, 0x5C, 0x22, 0x22, 0x4D, 0x84, 0x84, 0x5A, 0x22, 0x22, 0x56, 0x84, 0x84, 0x84, 0x4D, + 0x1C, 0x22, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x0E, 0x82, 0x01, 0x11, 0x01, 0x67, 0x04, 0x85, + 0x00, 0x06, 0x1D, 0x2C, 0x2C, 0x14, 0x70, 0x14, 0x0F, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, + 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, 0x12, 0x80, 0x01, 0x63, 0x04, 0x85, + 0x01, 0x24, 0x11, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x14, 0x22, 0x04, 0x84, 0x01, 0x5A, + 0x04, 0x22, 0x01, 0x5C, 0x04, 0x84, 0x06, 0x22, 0x01, 0x4F, 0x04, 0x84, 0x00, 0x03, 0x22, 0x22, + 0x4F, 0x00, 0x04, 0x84, 0x00, 0x06, 0x51, 0x56, 0x84, 0x84, 0x84, 0x5C, 0x06, 0x22, 0x01, 0x4F, + 0x04, 0x84, 0x09, 0x22, 0x01, 0x4E, 0x07, 0x84, 0x00, 0x08, 0x58, 0x22, 0x22, 0x22, 0x4D, 0x84, + 0x84, 0x4F, 0x11, 0x22, 0x01, 0x4E, 0x04, 0x84, 0x00, 0x04, 0x4E, 0x22, 0x22, 0x22, 0x04, 0x84, + 0x00, 0x0D, 0x4E, 0x22, 0x22, 0x22, 0x4D, 0x84, 0x84, 0x84, 0x4D, 0x22, 0x22, 0x22, 0x5C, 0x00, + 0x07, 0x84, 0x00, 0x0A, 0x5A, 0x22, 0x22, 0x22, 0x84, 0x84, 0x84, 0x52, 0x22, 0x22, 0x04, 0x84, + 0x01, 0x4D, 0x1C, 0x22, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x0F, 0x82, 0x01, 0x11, 0x01, 0x67, + 0x08, 0x85, 0x01, 0x14, 0x0F, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x09, 0x22, 0x00, 0x00, + 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, 0x12, 0x80, 0x00, 0x05, 0x26, 0x85, 0x85, 0x85, 0x63, 0x00, + 0x12, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x14, 0x22, 0x00, 0x05, 0x4D, 0x84, 0x84, 0x84, + 0x4D, 0x00, 0x05, 0x22, 0x00, 0x05, 0x50, 0x84, 0x84, 0x84, 0x5E, 0x00, 0x05, 0x22, 0x01, 0x4F, + 0x04, 0x84, 0x00, 0x03, 0x22, 0x22, 0x4E, 0x00, 0x04, 0x84, 0x00, 0x06, 0x4E, 0x5C, 0x84, 0x84, + 0x84, 0x56, 0x06, 0x22, 0x01, 0x4F, 0x04, 0x84, 0x0A, 0x22, 0x07, 0x84, 0x04, 0x22, 0x00, 0x04, + 0x4D, 0x84, 0x84, 0x4F, 0x11, 0x22, 0x01, 0x52, 0x04, 0x84, 0x00, 0x04, 0x57, 0x22, 0x22, 0x22, + 0x04, 0x84, 0x00, 0x04, 0x4E, 0x22, 0x22, 0x22, 0x04, 0x84, 0x00, 0x05, 0x58, 0x22, 0x22, 0x22, + 0x4F, 0x00, 0x06, 0x84, 0x00, 0x0B, 0x56, 0x22, 0x22, 0x22, 0x57, 0x84, 0x84, 0x84, 0x57, 0x22, + 0x22, 0x00, 0x04, 0x84, 0x01, 0x5A, 0x1C, 0x22, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x10, 0x82, + 0x01, 0x11, 0x01, 0x60, 0x07, 0x85, 0x01, 0x14, 0x0F, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, + 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, 0x12, 0x80, 0x00, 0x05, 0x09, 0x16, + 0x16, 0x16, 0x24, 0x00, 0x12, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x14, 0x22, 0x01, 0x5A, + 0x04, 0x84, 0x05, 0x22, 0x00, 0x05, 0x58, 0x84, 0x84, 0x84, 0x5D, 0x00, 0x05, 0x22, 0x00, 0x08, + 0x4F, 0x84, 0x84, 0x84, 0x4D, 0x22, 0x22, 0x4E, 0x04, 0x84, 0x00, 0x07, 0x4E, 0x22, 0x4D, 0x84, + 0x84, 0x84, 0x4F, 0x00, 0x05, 0x22, 0x01, 0x4F, 0x04, 0x84, 0x0A, 0x22, 0x06, 0x84, 0x01, 0x58, + 0x04, 0x22, 0x00, 0x04, 0x4D, 0x84, 0x84, 0x4F, 0x11, 0x22, 0x01, 0x4F, 0x04, 0x84, 0x00, 0x04, + 0x22, 0x22, 0x22, 0x4E, 0x04, 0x84, 0x00, 0x04, 0x4E, 0x22, 0x22, 0x22, 0x04, 0x84, 0x00, 0x05, + 0x4F, 0x22, 0x22, 0x22, 0x5D, 0x00, 0x06, 0x84, 0x00, 0x0B, 0x4E, 0x22, 0x22, 0x22, 0x52, 0x84, + 0x84, 0x84, 0x22, 0x22, 0x22, 0x00, 0x04, 0x84, 0x01, 0x4D, 0x1C, 0x22, 0x00, 0x04, 0x2D, 0x22, + 0x30, 0x5B, 0x12, 0x82, 0x00, 0x08, 0x11, 0x14, 0x1D, 0x60, 0x1D, 0x14, 0x2C, 0x64, 0x0F, 0x82, + 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, + 0x29, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x14, 0x22, 0x01, 0x5C, 0x04, 0x84, 0x01, 0x57, + 0x05, 0x22, 0x04, 0x84, 0x05, 0x22, 0x00, 0x08, 0x4F, 0x84, 0x84, 0x84, 0x4D, 0x22, 0x22, 0x22, + 0x04, 0x84, 0x00, 0x03, 0x4F, 0x22, 0x4E, 0x00, 0x04, 0x84, 0x05, 0x22, 0x01, 0x52, 0x04, 0x84, + 0x0A, 0x22, 0x06, 0x84, 0x05, 0x22, 0x00, 0x04, 0x4D, 0x84, 0x84, 0x4F, 0x11, 0x22, 0x01, 0x4F, + 0x04, 0x84, 0x00, 0x04, 0x22, 0x22, 0x22, 0x52, 0x04, 0x84, 0x00, 0x04, 0x22, 0x22, 0x22, 0x4E, + 0x04, 0x84, 0x00, 0x05, 0x5C, 0x22, 0x22, 0x22, 0x4D, 0x00, 0x05, 0x84, 0x01, 0x5A, 0x04, 0x22, + 0x00, 0x07, 0x5A, 0x84, 0x84, 0x4D, 0x22, 0x22, 0x22, 0x00, 0x04, 0x84, 0x01, 0x59, 0x1C, 0x22, + 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x29, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x09, 0x22, + 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, 0x04, 0x80, 0x00, 0x21, 0x69, 0x09, 0x09, 0x69, + 0x80, 0x80, 0x09, 0x09, 0x80, 0x09, 0x69, 0x80, 0x80, 0x09, 0x09, 0x80, 0x09, 0x09, 0x80, 0x69, + 0x09, 0x69, 0x80, 0x69, 0x09, 0x09, 0x80, 0x80, 0x09, 0x69, 0x80, 0x80, 0x09, 0x00, 0x04, 0x80, + 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x15, 0x22, 0x04, 0x84, 0x01, 0x52, 0x05, 0x22, 0x00, 0x05, + 0x58, 0x84, 0x84, 0x84, 0x5D, 0x00, 0x04, 0x22, 0x00, 0x08, 0x5D, 0x84, 0x84, 0x84, 0x5A, 0x22, + 0x22, 0x22, 0x04, 0x84, 0x00, 0x08, 0x4F, 0x22, 0x22, 0x58, 0x84, 0x84, 0x84, 0x4D, 0x04, 0x22, + 0x01, 0x4E, 0x04, 0x84, 0x01, 0x4E, 0x09, 0x22, 0x05, 0x84, 0x01, 0x58, 0x05, 0x22, 0x00, 0x04, + 0x4D, 0x84, 0x84, 0x4F, 0x11, 0x22, 0x00, 0x09, 0x58, 0x84, 0x84, 0x84, 0x56, 0x22, 0x22, 0x22, + 0x5D, 0x00, 0x04, 0x84, 0x00, 0x04, 0x22, 0x22, 0x22, 0x5C, 0x04, 0x84, 0x00, 0x04, 0x57, 0x22, + 0x22, 0x22, 0x05, 0x84, 0x01, 0x56, 0x05, 0x22, 0x00, 0x07, 0x4D, 0x84, 0x84, 0x5A, 0x22, 0x22, + 0x22, 0x00, 0x05, 0x84, 0x1C, 0x22, 0x00, 0x28, 0x2D, 0x22, 0x30, 0x5B, 0x82, 0x82, 0x82, 0x11, + 0x11, 0x11, 0x82, 0x82, 0x64, 0x11, 0x68, 0x68, 0x11, 0x82, 0x82, 0x64, 0x11, 0x68, 0x68, 0x11, + 0x64, 0x82, 0x11, 0x11, 0x82, 0x82, 0x11, 0x11, 0x68, 0x82, 0x64, 0x11, 0x82, 0x82, 0x64, 0x68, + 0x05, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, + 0x01, 0x33, 0x04, 0x80, 0x00, 0x21, 0x85, 0x6A, 0x63, 0x85, 0x24, 0x80, 0x61, 0x61, 0x80, 0x6E, + 0x26, 0x80, 0x69, 0x85, 0x26, 0x80, 0x85, 0x61, 0x80, 0x09, 0x85, 0x09, 0x09, 0x63, 0x6E, 0x63, + 0x6E, 0x69, 0x85, 0x09, 0x80, 0x16, 0x85, 0x00, 0x04, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, + 0x11, 0x22, 0x04, 0x4D, 0x04, 0x84, 0x00, 0x07, 0x56, 0x4D, 0x5A, 0x4F, 0x52, 0x22, 0x22, 0x00, + 0x04, 0x84, 0x00, 0x04, 0x58, 0x22, 0x22, 0x52, 0x04, 0x84, 0x00, 0x15, 0x52, 0x22, 0x22, 0x22, + 0x4D, 0x84, 0x84, 0x84, 0x5D, 0x22, 0x22, 0x22, 0x50, 0x84, 0x84, 0x84, 0x5C, 0x22, 0x22, 0x22, + 0x4E, 0x00, 0x04, 0x84, 0x01, 0x5E, 0x06, 0x4E, 0x00, 0x03, 0x22, 0x22, 0x22, 0x00, 0x05, 0x84, + 0x06, 0x22, 0x00, 0x04, 0x4D, 0x84, 0x84, 0x4F, 0x11, 0x22, 0x00, 0x08, 0x4D, 0x84, 0x84, 0x84, + 0x4D, 0x22, 0x22, 0x52, 0x04, 0x84, 0x00, 0x05, 0x59, 0x22, 0x22, 0x22, 0x4F, 0x00, 0x04, 0x84, + 0x04, 0x22, 0x05, 0x84, 0x01, 0x4E, 0x05, 0x22, 0x00, 0x08, 0x50, 0x84, 0x84, 0x52, 0x22, 0x22, + 0x22, 0x4D, 0x04, 0x84, 0x01, 0x4D, 0x04, 0x22, 0x01, 0x4E, 0x01, 0x4D, 0x15, 0x22, 0x00, 0x28, + 0x2D, 0x22, 0x30, 0x5B, 0x82, 0x82, 0x11, 0x85, 0x74, 0x85, 0x67, 0x68, 0x11, 0x85, 0x14, 0x11, + 0x85, 0x11, 0x82, 0x1D, 0x85, 0x11, 0x14, 0x85, 0x11, 0x82, 0x60, 0x85, 0x82, 0x1D, 0x85, 0x74, + 0x85, 0x14, 0x11, 0x85, 0x82, 0x64, 0x74, 0x14, 0x05, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, + 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, 0x04, 0x80, 0x00, 0x21, 0x69, 0x80, + 0x69, 0x85, 0x61, 0x80, 0x61, 0x61, 0x80, 0x16, 0x63, 0x61, 0x6E, 0x85, 0x09, 0x80, 0x85, 0x61, + 0x80, 0x09, 0x85, 0x09, 0x77, 0x63, 0x80, 0x24, 0x85, 0x24, 0x85, 0x09, 0x24, 0x85, 0x85, 0x00, + 0x04, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x11, 0x22, 0x01, 0x59, 0x0B, 0x84, 0x00, 0x04, + 0x59, 0x22, 0x22, 0x4F, 0x0B, 0x84, 0x04, 0x22, 0x00, 0x11, 0x4D, 0x84, 0x84, 0x84, 0x4D, 0x22, + 0x22, 0x22, 0x4F, 0x84, 0x84, 0x84, 0x56, 0x22, 0x22, 0x22, 0x4E, 0x00, 0x0B, 0x84, 0x00, 0x03, + 0x4F, 0x22, 0x22, 0x00, 0x04, 0x84, 0x01, 0x58, 0x06, 0x22, 0x00, 0x04, 0x50, 0x84, 0x84, 0x5E, + 0x11, 0x22, 0x00, 0x07, 0x4D, 0x84, 0x84, 0x84, 0x50, 0x4D, 0x56, 0x00, 0x05, 0x84, 0x00, 0x0D, + 0x5A, 0x22, 0x22, 0x22, 0x5A, 0x84, 0x84, 0x84, 0x56, 0x22, 0x22, 0x22, 0x4E, 0x00, 0x04, 0x84, + 0x01, 0x4F, 0x06, 0x22, 0x00, 0x08, 0x84, 0x84, 0x84, 0x57, 0x22, 0x22, 0x22, 0x5A, 0x05, 0x84, + 0x00, 0x06, 0x56, 0x5A, 0x5A, 0x59, 0x84, 0x56, 0x15, 0x22, 0x00, 0x28, 0x2D, 0x22, 0x30, 0x5B, + 0x82, 0x82, 0x64, 0x82, 0x82, 0x1D, 0x85, 0x11, 0x11, 0x85, 0x14, 0x82, 0x6D, 0x6D, 0x60, 0x67, + 0x6D, 0x82, 0x14, 0x85, 0x11, 0x82, 0x60, 0x85, 0x68, 0x85, 0x1D, 0x82, 0x60, 0x85, 0x11, 0x85, + 0x82, 0x60, 0x85, 0x14, 0x05, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x18, 0x00, 0x09, 0x22, 0x00, 0x00, + 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, 0x05, 0x80, 0x00, 0x20, 0x26, 0x63, 0x85, 0x16, 0x80, 0x61, + 0x61, 0x80, 0x69, 0x85, 0x16, 0x6A, 0x6A, 0x80, 0x80, 0x85, 0x61, 0x80, 0x09, 0x85, 0x09, 0x61, + 0x61, 0x80, 0x09, 0x85, 0x16, 0x85, 0x16, 0x85, 0x63, 0x85, 0x04, 0x80, 0x00, 0x04, 0x2F, 0x30, + 0x22, 0x2D, 0x11, 0x22, 0x01, 0x58, 0x0C, 0x84, 0x00, 0x04, 0x22, 0x22, 0x22, 0x4D, 0x09, 0x84, + 0x01, 0x58, 0x04, 0x22, 0x00, 0x05, 0x4F, 0x84, 0x84, 0x84, 0x56, 0x00, 0x04, 0x22, 0x00, 0x08, + 0x56, 0x84, 0x84, 0x84, 0x4F, 0x22, 0x22, 0x22, 0x0B, 0x84, 0x00, 0x03, 0x4F, 0x22, 0x22, 0x00, + 0x04, 0x84, 0x07, 0x22, 0x00, 0x04, 0x84, 0x84, 0x84, 0x4E, 0x11, 0x22, 0x01, 0x56, 0x0B, 0x84, + 0x04, 0x22, 0x00, 0x0D, 0x4D, 0x84, 0x84, 0x84, 0x4D, 0x22, 0x22, 0x22, 0x4F, 0x84, 0x84, 0x84, + 0x59, 0x00, 0x06, 0x22, 0x00, 0x04, 0x5C, 0x84, 0x84, 0x84, 0x04, 0x22, 0x01, 0x57, 0x0A, 0x84, + 0x01, 0x58, 0x15, 0x22, 0x00, 0x28, 0x2D, 0x22, 0x30, 0x5B, 0x82, 0x82, 0x82, 0x11, 0x74, 0x85, + 0x67, 0x68, 0x11, 0x85, 0x14, 0x82, 0x14, 0x85, 0x14, 0x85, 0x14, 0x82, 0x14, 0x85, 0x11, 0x82, + 0x60, 0x85, 0x11, 0x85, 0x14, 0x82, 0x14, 0x85, 0x11, 0x85, 0x1D, 0x85, 0x85, 0x14, 0x05, 0x82, + 0x00, 0x03, 0x1F, 0x12, 0x48, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, + 0x04, 0x80, 0x00, 0x21, 0x26, 0x85, 0x61, 0x24, 0x80, 0x80, 0x61, 0x61, 0x80, 0x80, 0x77, 0x6E, + 0x85, 0x16, 0x80, 0x80, 0x85, 0x61, 0x80, 0x09, 0x85, 0x09, 0x61, 0x6A, 0x80, 0x09, 0x85, 0x16, + 0x85, 0x85, 0x6A, 0x24, 0x85, 0x00, 0x04, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x11, 0x22, + 0x01, 0x52, 0x0C, 0x84, 0x00, 0x05, 0x4E, 0x22, 0x22, 0x22, 0x59, 0x00, 0x07, 0x84, 0x01, 0x50, + 0x05, 0x22, 0x01, 0x4F, 0x04, 0x84, 0x04, 0x22, 0x01, 0x52, 0x04, 0x84, 0x00, 0x03, 0x22, 0x22, + 0x22, 0x00, 0x0B, 0x84, 0x00, 0x07, 0x4F, 0x22, 0x22, 0x84, 0x84, 0x84, 0x5A, 0x00, 0x07, 0x22, + 0x00, 0x04, 0x84, 0x84, 0x84, 0x4E, 0x11, 0x22, 0x0B, 0x84, 0x01, 0x5A, 0x04, 0x22, 0x00, 0x0D, + 0x56, 0x84, 0x84, 0x84, 0x5A, 0x22, 0x22, 0x22, 0x5A, 0x84, 0x84, 0x84, 0x57, 0x00, 0x06, 0x22, + 0x00, 0x04, 0x4F, 0x84, 0x84, 0x4D, 0x05, 0x22, 0x01, 0x4D, 0x09, 0x84, 0x01, 0x52, 0x15, 0x22, + 0x00, 0x28, 0x2D, 0x22, 0x30, 0x5B, 0x82, 0x82, 0x82, 0x67, 0x67, 0x1D, 0x68, 0x82, 0x11, 0x85, + 0x14, 0x82, 0x68, 0x85, 0x6D, 0x85, 0x68, 0x82, 0x14, 0x85, 0x11, 0x82, 0x60, 0x85, 0x11, 0x85, + 0x14, 0x82, 0x1D, 0x85, 0x11, 0x85, 0x85, 0x1D, 0x60, 0x14, 0x05, 0x82, 0x00, 0x03, 0x1F, 0x12, + 0x48, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, 0x04, 0x80, 0x00, 0x21, + 0x26, 0x85, 0x24, 0x16, 0x24, 0x16, 0x6A, 0x6A, 0x16, 0x69, 0x24, 0x85, 0x85, 0x69, 0x09, 0x16, + 0x85, 0x6A, 0x16, 0x09, 0x85, 0x09, 0x16, 0x85, 0x16, 0x26, 0x85, 0x09, 0x85, 0x63, 0x09, 0x09, + 0x85, 0x00, 0x04, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x11, 0x22, 0x01, 0x57, 0x0C, 0x84, + 0x01, 0x52, 0x04, 0x22, 0x01, 0x4F, 0x05, 0x84, 0x01, 0x50, 0x01, 0x57, 0x05, 0x22, 0x01, 0x4E, + 0x04, 0x84, 0x05, 0x22, 0x00, 0x07, 0x4D, 0x84, 0x84, 0x84, 0x4D, 0x22, 0x22, 0x00, 0x0B, 0x84, + 0x00, 0x06, 0x4F, 0x22, 0x22, 0x84, 0x84, 0x50, 0x08, 0x22, 0x00, 0x04, 0x84, 0x84, 0x84, 0x4E, + 0x11, 0x22, 0x0A, 0x84, 0x01, 0x59, 0x05, 0x22, 0x04, 0x84, 0x00, 0x08, 0x4F, 0x22, 0x22, 0x22, + 0x4D, 0x84, 0x84, 0x4F, 0x07, 0x22, 0x00, 0x04, 0x4D, 0x84, 0x84, 0x5A, 0x05, 0x22, 0x01, 0x57, + 0x01, 0x50, 0x08, 0x84, 0x16, 0x22, 0x00, 0x28, 0x2D, 0x22, 0x30, 0x5B, 0x82, 0x82, 0x82, 0x67, + 0x6D, 0x2C, 0x14, 0x11, 0x1D, 0x85, 0x60, 0x2C, 0x82, 0x60, 0x85, 0x70, 0x82, 0x2C, 0x60, 0x85, + 0x1D, 0x11, 0x60, 0x85, 0x82, 0x6D, 0x74, 0x2C, 0x6D, 0x60, 0x11, 0x85, 0x1D, 0x82, 0x60, 0x14, + 0x05, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x48, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, + 0x01, 0x33, 0x04, 0x80, 0x00, 0x05, 0x69, 0x26, 0x61, 0x61, 0x16, 0x00, 0x04, 0x61, 0x00, 0x06, + 0x09, 0x80, 0x61, 0x26, 0x80, 0x24, 0x04, 0x61, 0x00, 0x0E, 0x09, 0x61, 0x09, 0x80, 0x16, 0x61, + 0x61, 0x24, 0x80, 0x61, 0x09, 0x80, 0x09, 0x61, 0x04, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, + 0x25, 0x22, 0x00, 0x04, 0x52, 0x4F, 0x4F, 0x52, 0x08, 0x22, 0x04, 0x4E, 0x06, 0x22, 0x04, 0x4E, + 0x01, 0x22, 0x01, 0x22, 0x04, 0x4E, 0x01, 0x52, 0x06, 0x4F, 0x00, 0x06, 0x4E, 0x22, 0x22, 0x4F, + 0x4F, 0x5C, 0x08, 0x22, 0x00, 0x03, 0x4F, 0x4F, 0x4F, 0x00, 0x12, 0x22, 0x08, 0x4D, 0x01, 0x5D, + 0x01, 0x52, 0x06, 0x22, 0x04, 0x4D, 0x00, 0x07, 0x57, 0x22, 0x22, 0x22, 0x50, 0x84, 0x59, 0x00, + 0x08, 0x22, 0x00, 0x04, 0x50, 0x84, 0x84, 0x52, 0x06, 0x22, 0x01, 0x57, 0x01, 0x56, 0x05, 0x84, + 0x01, 0x56, 0x01, 0x52, 0x16, 0x22, 0x00, 0x28, 0x2D, 0x22, 0x30, 0x5B, 0x82, 0x82, 0x82, 0x11, + 0x70, 0x60, 0x70, 0x2C, 0x60, 0x60, 0x60, 0x1D, 0x82, 0x2C, 0x60, 0x2C, 0x82, 0x1D, 0x60, 0x60, + 0x60, 0x2C, 0x1D, 0x60, 0x82, 0x11, 0x70, 0x60, 0x1D, 0x64, 0x11, 0x70, 0x64, 0x82, 0x1D, 0x2C, + 0x05, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x48, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, + 0x01, 0x33, 0x29, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x9E, 0x22, 0x00, 0x05, 0x4E, 0x4F, + 0x4F, 0x5E, 0x4E, 0x00, 0x18, 0x22, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x29, 0x82, 0x00, 0x03, + 0x1F, 0x12, 0x48, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x01, 0x33, 0x29, 0x07, + 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0xBB, 0x22, 0x00, 0x04, 0x2D, 0x22, 0x3A, 0x5B, 0x29, 0x1B, + 0x00, 0x03, 0x1F, 0x12, 0x48, 0x00, 0x09, 0x22, 0x00, 0x00, 0x09, 0x22, 0x01, 0x1F, 0x2C, 0x30, + 0x01, 0x22, 0x01, 0x2D, 0xBB, 0x22, 0x01, 0x2D, 0x01, 0x22, 0x2C, 0x30, 0x01, 0x12, 0x01, 0x48, + 0x09, 0x22, 0x00, 0x00, 0x08, 0x22, 0x01, 0x4B, 0x01, 0x18, 0x2B, 0x1F, 0x00, 0x03, 0x12, 0x22, + 0x36, 0x00, 0xBB, 0x22, 0x00, 0x03, 0x2D, 0x22, 0x47, 0x00, 0x2A, 0x1F, 0x00, 0x03, 0x39, 0x18, + 0x48, 0x00, 0x09, 0x22, 0x00, 0x00, 0x08, 0x22, 0x01, 0x2D, 0x01, 0x4B, 0x2B, 0x22, 0x01, 0x45, + 0x01, 0x20, 0xBD, 0x22, 0x01, 0x20, 0x01, 0x45, 0x2B, 0x22, 0x01, 0x4B, 0x01, 0x36, 0x09, 0x22, + 0x00, 0x00, 0x1A, 0x22, 0x01, 0x4E, 0x0E, 0x84, 0x01, 0x4D, 0xD5, 0x22, 0x01, 0x50, 0x0D, 0x84, + 0x01, 0x50, 0x1E, 0x22, 0x00, 0x00, 0x1B, 0x22, 0x01, 0x4D, 0x0E, 0x84, 0x01, 0x5E, 0xD3, 0x22, + 0x01, 0x4D, 0x0E, 0x84, 0x01, 0x4F, 0x1E, 0x22, 0x00, 0x00, 0x1B, 0x22, 0x01, 0x4E, 0x0E, 0x84, + 0x01, 0x50, 0xD2, 0x22, 0x01, 0x5E, 0x0E, 0x84, 0x01, 0x56, 0x1F, 0x22, 0x00, 0x00, 0x1C, 0x22, + 0x01, 0x4D, 0x0E, 0x84, 0x01, 0x59, 0xD0, 0x22, 0x01, 0x57, 0x01, 0x50, 0x0E, 0x84, 0x01, 0x52, + 0x1F, 0x22, 0x00, 0x00, 0x1D, 0x22, 0x0F, 0x84, 0x01, 0x5A, 0xCF, 0x22, 0x01, 0x59, 0x0E, 0x84, + 0x01, 0x59, 0x20, 0x22, 0x00, 0x00, 0x1D, 0x22, 0x01, 0x5A, 0x0F, 0x84, 0x01, 0x52, 0xCD, 0x22, + 0x01, 0x58, 0x0F, 0x84, 0x01, 0x4E, 0x20, 0x22, 0x00, 0x00, 0x1E, 0x22, 0x01, 0x50, 0x0E, 0x84, + 0x01, 0x50, 0x01, 0x57, 0xCB, 0x22, 0x01, 0x4F, 0x0F, 0x84, 0x01, 0x5D, 0x21, 0x22, 0x00, 0x00, + 0x1E, 0x22, 0x01, 0x5C, 0x0F, 0x84, 0x01, 0x50, 0xCA, 0x22, 0x01, 0x52, 0x0F, 0x84, 0x01, 0x50, + 0x22, 0x22, 0x00, 0x00, 0x1F, 0x22, 0x01, 0x5D, 0x0F, 0x84, 0x01, 0x59, 0xC8, 0x22, 0x01, 0x57, + 0x10, 0x84, 0x01, 0x5C, 0x22, 0x22, 0x00, 0x00, 0x20, 0x22, 0x01, 0x50, 0x0F, 0x84, 0x01, 0x59, + 0xC6, 0x22, 0x01, 0x57, 0x01, 0x50, 0x0F, 0x84, 0x01, 0x5D, 0x23, 0x22, 0x00, 0x00, 0x20, 0x22, + 0x01, 0x4E, 0x10, 0x84, 0x01, 0x59, 0xC4, 0x22, 0x01, 0x57, 0x01, 0x50, 0x0F, 0x84, 0x01, 0x50, + 0x24, 0x22, 0x00, 0x00, 0x21, 0x22, 0x01, 0x5A, 0x10, 0x84, 0x01, 0x59, 0xC2, 0x22, 0x01, 0x57, + 0x01, 0x50, 0x10, 0x84, 0x01, 0x4E, 0x24, 0x22, 0x00, 0x00, 0x22, 0x22, 0x01, 0x59, 0x10, 0x84, + 0x01, 0x59, 0xC0, 0x22, 0x01, 0x57, 0x01, 0x50, 0x10, 0x84, 0x01, 0x4F, 0x25, 0x22, 0x00, 0x00, + 0x23, 0x22, 0x01, 0x50, 0x10, 0x84, 0x01, 0x59, 0xBE, 0x22, 0x01, 0x4E, 0x01, 0x50, 0x10, 0x84, + 0x01, 0x5D, 0x26, 0x22, 0x00, 0x00, 0x23, 0x22, 0x01, 0x57, 0x11, 0x84, 0x01, 0x56, 0x01, 0x57, + 0xBB, 0x22, 0x01, 0x52, 0x11, 0x84, 0x01, 0x59, 0x27, 0x22, 0x00, 0x00, 0x24, 0x22, 0x01, 0x52, + 0x11, 0x84, 0x01, 0x50, 0x01, 0x4E, 0xB9, 0x22, 0x01, 0x4F, 0x11, 0x84, 0x01, 0x50, 0x28, 0x22, + 0x00, 0x00, 0x25, 0x22, 0x01, 0x4F, 0x12, 0x84, 0x01, 0x52, 0xB7, 0x22, 0x01, 0x58, 0x11, 0x84, + 0x01, 0x50, 0x01, 0x57, 0x28, 0x22, 0x00, 0x00, 0x26, 0x22, 0x01, 0x58, 0x12, 0x84, 0x01, 0x58, + 0xB5, 0x22, 0x01, 0x59, 0x12, 0x84, 0x01, 0x52, 0x29, 0x22, 0x00, 0x00, 0x27, 0x22, 0x01, 0x58, + 0x12, 0x84, 0x01, 0x59, 0xB2, 0x22, 0x01, 0x5C, 0x01, 0x50, 0x12, 0x84, 0x01, 0x52, 0x2A, 0x22, + 0x00, 0x00, 0x28, 0x22, 0x01, 0x58, 0x12, 0x84, 0x01, 0x50, 0x01, 0x5C, 0xAF, 0x22, 0x01, 0x5A, + 0x13, 0x84, 0x01, 0x52, 0x2B, 0x22, 0x00, 0x00, 0x29, 0x22, 0x01, 0x58, 0x13, 0x84, 0x01, 0x5A, + 0xAC, 0x22, 0x01, 0x57, 0x01, 0x59, 0x13, 0x84, 0x01, 0x52, 0x2C, 0x22, 0x00, 0x00, 0x2A, 0x22, + 0x01, 0x58, 0x13, 0x84, 0x01, 0x56, 0x01, 0x4E, 0xA9, 0x22, 0x01, 0x5E, 0x01, 0x50, 0x13, 0x84, + 0x01, 0x52, 0x2D, 0x22, 0x00, 0x00, 0x2B, 0x22, 0x01, 0x58, 0x14, 0x84, 0x01, 0x5A, 0xA7, 0x22, + 0x01, 0x4D, 0x14, 0x84, 0x01, 0x52, 0x2E, 0x22, 0x00, 0x00, 0x2C, 0x22, 0x01, 0x58, 0x14, 0x84, + 0x01, 0x56, 0x01, 0x4E, 0xA3, 0x22, 0x01, 0x4F, 0x01, 0x50, 0x13, 0x84, 0x01, 0x50, 0x01, 0x52, + 0x2F, 0x22, 0x00, 0x00, 0x2D, 0x22, 0x01, 0x52, 0x15, 0x84, 0x01, 0x5D, 0x32, 0x22, 0x01, 0x0D, + 0x3C, 0x4B, 0x01, 0x06, 0x30, 0x22, 0x01, 0x4E, 0x01, 0x59, 0x14, 0x84, 0x01, 0x50, 0x01, 0x57, + 0x30, 0x22, 0x00, 0x00, 0x2E, 0x22, 0x01, 0x52, 0x01, 0x50, 0x14, 0x84, 0x01, 0x50, 0x01, 0x4F, + 0x2F, 0x22, 0x00, 0x03, 0x28, 0x4B, 0x6C, 0x00, 0x3A, 0x0E, 0x00, 0x03, 0x71, 0x4B, 0x28, 0x00, + 0x2E, 0x22, 0x01, 0x58, 0x15, 0x84, 0x01, 0x59, 0x01, 0x57, 0x31, 0x22, 0x00, 0x00, 0x2F, 0x22, + 0x01, 0x57, 0x01, 0x50, 0x15, 0x84, 0x01, 0x56, 0x01, 0x52, 0x2D, 0x22, 0x00, 0x03, 0x00, 0x4B, + 0x43, 0x00, 0x3A, 0x0A, 0x00, 0x03, 0x43, 0x4B, 0x4A, 0x00, 0x2C, 0x22, 0x01, 0x4F, 0x01, 0x50, + 0x15, 0x84, 0x01, 0x4D, 0x33, 0x22, 0x00, 0x00, 0x31, 0x22, 0x01, 0x59, 0x16, 0x84, 0x01, 0x4D, + 0x01, 0x4E, 0x2B, 0x22, 0x00, 0x04, 0x28, 0x4B, 0x62, 0x30, 0x05, 0x4C, 0x01, 0x2E, 0x01, 0x30, + 0x18, 0x4C, 0x01, 0x2E, 0x01, 0x04, 0x04, 0x4C, 0x01, 0x39, 0x01, 0x04, 0x07, 0x4C, 0x01, 0x04, + 0x01, 0x2E, 0x09, 0x4C, 0x00, 0x03, 0x30, 0x3F, 0x4A, 0x00, 0x2A, 0x22, 0x01, 0x52, 0x01, 0x50, + 0x16, 0x84, 0x01, 0x5A, 0x34, 0x22, 0x00, 0x00, 0x32, 0x22, 0x01, 0x5A, 0x17, 0x84, 0x01, 0x4D, + 0x01, 0x4E, 0x2A, 0x22, 0x00, 0x04, 0x4B, 0x2A, 0x30, 0x78, 0x04, 0x15, 0x00, 0x03, 0x4A, 0x4C, + 0x75, 0x00, 0x17, 0x15, 0x00, 0x09, 0x01, 0x78, 0x0D, 0x15, 0x15, 0x15, 0x12, 0x39, 0x06, 0x00, + 0x05, 0x15, 0x00, 0x03, 0x21, 0x2E, 0x78, 0x00, 0x08, 0x15, 0x00, 0x04, 0x0A, 0x30, 0x75, 0x06, + 0x28, 0x22, 0x01, 0x52, 0x01, 0x56, 0x16, 0x84, 0x01, 0x50, 0x01, 0x5C, 0x35, 0x22, 0x00, 0x00, + 0x33, 0x22, 0x01, 0x5C, 0x01, 0x50, 0x17, 0x84, 0x01, 0x4D, 0x01, 0x4E, 0x28, 0x22, 0x00, 0x0F, + 0x3B, 0x75, 0x30, 0x2A, 0x62, 0x30, 0x30, 0x32, 0x15, 0x15, 0x23, 0x30, 0x30, 0x30, 0x02, 0x00, + 0x0E, 0x30, 0x00, 0x22, 0x1C, 0x04, 0x30, 0x30, 0x3A, 0x15, 0x15, 0x23, 0x30, 0x30, 0x30, 0x4C, + 0x2A, 0x02, 0x30, 0x23, 0x30, 0x02, 0x30, 0x2E, 0x2E, 0x12, 0x30, 0x30, 0x30, 0x32, 0x32, 0x30, + 0x02, 0x30, 0x31, 0x30, 0x4B, 0x15, 0x26, 0x22, 0x01, 0x52, 0x01, 0x56, 0x17, 0x84, 0x01, 0x59, + 0x37, 0x22, 0x00, 0x00, 0x35, 0x22, 0x01, 0x59, 0x18, 0x84, 0x01, 0x4D, 0x01, 0x4E, 0x26, 0x22, + 0x00, 0x3F, 0x37, 0x4B, 0x04, 0x04, 0x39, 0x30, 0x30, 0x30, 0x32, 0x3D, 0x3D, 0x1C, 0x30, 0x04, + 0x1C, 0x04, 0x30, 0x30, 0x04, 0x30, 0x32, 0x30, 0x30, 0x32, 0x30, 0x32, 0x30, 0x32, 0x3A, 0x30, + 0x44, 0x30, 0x32, 0x30, 0x44, 0x44, 0x42, 0x30, 0x30, 0x30, 0x4C, 0x2E, 0x3F, 0x4C, 0x3F, 0x30, + 0x7A, 0x4C, 0x7A, 0x30, 0x12, 0x30, 0x32, 0x30, 0x32, 0x32, 0x30, 0x02, 0x30, 0x4C, 0x02, 0x4B, + 0x1E, 0x00, 0x24, 0x22, 0x01, 0x5E, 0x01, 0x56, 0x18, 0x84, 0x01, 0x5A, 0x38, 0x22, 0x00, 0x00, + 0x36, 0x22, 0x01, 0x4F, 0x19, 0x84, 0x01, 0x56, 0x01, 0x52, 0x25, 0x22, 0x00, 0x23, 0x71, 0x4C, + 0x30, 0x2A, 0x30, 0x30, 0x1C, 0x02, 0x2E, 0x32, 0x42, 0x3A, 0x1C, 0x1C, 0x1C, 0x04, 0x3A, 0x1C, + 0x32, 0x1C, 0x32, 0x30, 0x32, 0x42, 0x1C, 0x42, 0x3A, 0x04, 0x30, 0x1C, 0x32, 0x1C, 0x32, 0x30, + 0x04, 0x00, 0x04, 0x30, 0x00, 0x16, 0x4C, 0x4C, 0x15, 0x15, 0x23, 0x02, 0x3D, 0x15, 0x0A, 0x30, + 0x3B, 0x30, 0x02, 0x30, 0x32, 0x3A, 0x30, 0x02, 0x30, 0x31, 0x31, 0x4B, 0x23, 0x22, 0x01, 0x4F, + 0x01, 0x50, 0x18, 0x84, 0x01, 0x50, 0x01, 0x4E, 0x39, 0x22, 0x00, 0x00, 0x37, 0x22, 0x01, 0x57, + 0x01, 0x59, 0x19, 0x84, 0x01, 0x50, 0x01, 0x5A, 0x23, 0x22, 0x00, 0x3D, 0x0D, 0x6C, 0x30, 0x39, + 0x30, 0x30, 0x30, 0x02, 0x44, 0x30, 0x04, 0x3A, 0x42, 0x1C, 0x30, 0x04, 0x3A, 0x32, 0x1C, 0x3A, + 0x44, 0x30, 0x04, 0x1C, 0x32, 0x1C, 0x1C, 0x44, 0x30, 0x32, 0x1C, 0x32, 0x1C, 0x3A, 0x44, 0x30, + 0x42, 0x30, 0x30, 0x4C, 0x4C, 0x44, 0x32, 0x27, 0x32, 0x27, 0x32, 0x49, 0x30, 0x12, 0x30, 0x27, + 0x30, 0x44, 0x30, 0x32, 0x04, 0x30, 0x4C, 0x4C, 0x71, 0x00, 0x20, 0x22, 0x01, 0x4E, 0x01, 0x58, + 0x1A, 0x84, 0x01, 0x5D, 0x3B, 0x22, 0x00, 0x00, 0x39, 0x22, 0x01, 0x4F, 0x1B, 0x84, 0x01, 0x5D, + 0x01, 0x5C, 0x20, 0x22, 0x00, 0x3D, 0x1E, 0x4B, 0x02, 0x04, 0x31, 0x30, 0x02, 0x1C, 0x02, 0x04, + 0x32, 0x23, 0x1C, 0x2E, 0x30, 0x44, 0x02, 0x32, 0x23, 0x30, 0x27, 0x04, 0x32, 0x02, 0x32, 0x31, + 0x1C, 0x27, 0x32, 0x32, 0x2E, 0x32, 0x3D, 0x30, 0x23, 0x32, 0x1C, 0x30, 0x30, 0x4C, 0x4C, 0x04, + 0x30, 0x3D, 0x30, 0x3D, 0x30, 0x39, 0x30, 0x4C, 0x30, 0x3D, 0x30, 0x1F, 0x30, 0x02, 0x04, 0x62, + 0x31, 0x3F, 0x4A, 0x00, 0x1E, 0x22, 0x01, 0x5E, 0x01, 0x56, 0x1A, 0x84, 0x01, 0x50, 0x01, 0x5C, + 0x3C, 0x22, 0x00, 0x00, 0x3A, 0x22, 0x01, 0x57, 0x01, 0x4D, 0x1B, 0x84, 0x00, 0x03, 0x56, 0x5A, + 0x57, 0x00, 0x1E, 0x22, 0x00, 0x3C, 0x48, 0x7A, 0x30, 0x12, 0x04, 0x4C, 0x04, 0x04, 0x31, 0x2E, + 0x23, 0x04, 0x23, 0x04, 0x04, 0x23, 0x04, 0x23, 0x73, 0x39, 0x02, 0x04, 0x23, 0x04, 0x73, 0x04, + 0x02, 0x02, 0x3D, 0x12, 0x04, 0x73, 0x04, 0x02, 0x02, 0x04, 0x04, 0x04, 0x47, 0x4C, 0x27, 0x04, + 0x39, 0x04, 0x39, 0x04, 0x39, 0x30, 0x62, 0x30, 0x2E, 0x30, 0x2E, 0x30, 0x04, 0x04, 0x04, 0x62, + 0x75, 0x06, 0x1B, 0x22, 0x01, 0x5C, 0x01, 0x58, 0x1C, 0x84, 0x01, 0x5A, 0x3E, 0x22, 0x00, 0x00, + 0x3C, 0x22, 0x01, 0x5E, 0x01, 0x50, 0x1C, 0x84, 0x01, 0x59, 0x01, 0x5E, 0x1C, 0x22, 0x00, 0x2F, + 0x06, 0x71, 0x2E, 0x0D, 0x62, 0x1F, 0x2A, 0x2E, 0x31, 0x47, 0x62, 0x3B, 0x62, 0x73, 0x02, 0x62, + 0x12, 0x62, 0x47, 0x3B, 0x62, 0x47, 0x62, 0x1F, 0x73, 0x62, 0x3B, 0x62, 0x49, 0x7A, 0x62, 0x47, + 0x62, 0x1F, 0x1F, 0x62, 0x47, 0x62, 0x7A, 0x7A, 0x2E, 0x44, 0x4C, 0x62, 0x12, 0x62, 0x7A, 0x00, + 0x0B, 0x2E, 0x01, 0x4B, 0x01, 0x15, 0x18, 0x22, 0x00, 0x03, 0x57, 0x5A, 0x56, 0x00, 0x1C, 0x84, + 0x01, 0x59, 0x01, 0x4E, 0x3F, 0x22, 0x00, 0x00, 0x3E, 0x22, 0x01, 0x58, 0x1E, 0x84, 0x01, 0x59, + 0x01, 0x5E, 0x1A, 0x22, 0x01, 0x4A, 0x38, 0x4B, 0x01, 0x3B, 0x16, 0x22, 0x00, 0x03, 0x57, 0x5A, + 0x56, 0x00, 0x1D, 0x84, 0x01, 0x50, 0x01, 0x5E, 0x41, 0x22, 0x00, 0x00, 0x3F, 0x22, 0x01, 0x57, + 0x01, 0x4D, 0x1F, 0x84, 0x00, 0x03, 0x59, 0x4F, 0x57, 0x00, 0x18, 0x22, 0x00, 0x2C, 0x02, 0x00, + 0x49, 0x36, 0x03, 0x03, 0x15, 0x00, 0x15, 0x06, 0x00, 0x49, 0x49, 0x49, 0x4B, 0x47, 0x49, 0x78, + 0x47, 0x78, 0x78, 0x7A, 0x78, 0x7A, 0x78, 0x47, 0x2A, 0x78, 0x47, 0x78, 0x7A, 0x7A, 0x78, 0x47, + 0x78, 0x47, 0x46, 0x12, 0x06, 0x00, 0x06, 0x49, 0x06, 0x37, 0x1F, 0x22, 0x00, 0x03, 0x5C, 0x5A, + 0x56, 0x00, 0x1F, 0x84, 0x01, 0x5A, 0x43, 0x22, 0x00, 0x00, 0x41, 0x22, 0x01, 0x4E, 0x01, 0x56, + 0x20, 0x84, 0x00, 0x03, 0x56, 0x58, 0x5C, 0x00, 0x18, 0x22, 0x0A, 0x2D, 0x01, 0x00, 0x01, 0x46, + 0x15, 0x49, 0x00, 0x03, 0x18, 0x0D, 0x23, 0x00, 0x09, 0x2D, 0x18, 0x22, 0x01, 0x5E, 0x01, 0x5D, + 0x21, 0x84, 0x01, 0x58, 0x45, 0x22, 0x00, 0x00, 0x43, 0x22, 0x01, 0x52, 0x01, 0x56, 0x22, 0x84, + 0x00, 0x03, 0x59, 0x5A, 0x5C, 0x00, 0x13, 0x22, 0x01, 0x48, 0x2D, 0x22, 0x01, 0x46, 0x13, 0x22, + 0x00, 0x03, 0x52, 0x58, 0x56, 0x00, 0x22, 0x84, 0x01, 0x4D, 0x01, 0x4E, 0x46, 0x22, 0x00, 0x00, + 0x45, 0x22, 0x01, 0x52, 0x01, 0x56, 0x24, 0x84, 0x00, 0x03, 0x59, 0x5A, 0x52, 0x00, 0x10, 0x22, + 0x01, 0x39, 0x2B, 0x30, 0x00, 0x03, 0x44, 0x22, 0x00, 0x00, 0x0D, 0x22, 0x00, 0x04, 0x57, 0x5E, + 0x58, 0x56, 0x24, 0x84, 0x01, 0x4D, 0x01, 0x4E, 0x48, 0x22, 0x00, 0x00, 0x47, 0x22, 0x01, 0x52, + 0x01, 0x56, 0x26, 0x84, 0x00, 0x04, 0x50, 0x4D, 0x4F, 0x5C, 0x0B, 0x22, 0x01, 0x1F, 0x01, 0x7B, + 0x29, 0x54, 0x00, 0x05, 0x7B, 0x30, 0x22, 0x00, 0x05, 0x00, 0x07, 0x22, 0x00, 0x04, 0x57, 0x52, + 0x5A, 0x4D, 0x27, 0x84, 0x01, 0x4D, 0x01, 0x4E, 0x4A, 0x22, 0x00, 0x00, 0x49, 0x22, 0x01, 0x52, + 0x01, 0x59, 0x2A, 0x84, 0x00, 0x04, 0x4D, 0x58, 0x4F, 0x4E, 0x05, 0x22, 0x01, 0x1F, 0x01, 0x54, + 0x29, 0x81, 0x00, 0x0B, 0x54, 0x30, 0x22, 0x15, 0x36, 0x22, 0x4E, 0x5C, 0x4F, 0x5D, 0x59, 0x00, + 0x2A, 0x84, 0x01, 0x58, 0x01, 0x57, 0x4C, 0x22, 0x00, 0x00, 0x4B, 0x22, 0x01, 0x4E, 0x01, 0x5D, + 0x2E, 0x84, 0x00, 0x05, 0x59, 0x4D, 0x22, 0x1F, 0x54, 0x00, 0x29, 0x81, 0x00, 0x06, 0x54, 0x30, + 0x22, 0x2F, 0x29, 0x3C, 0x2C, 0x84, 0x01, 0x50, 0x01, 0x5A, 0x4F, 0x22, 0x00, 0x00, 0x4E, 0x22, + 0x01, 0x5A, 0x01, 0x50, 0x2D, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x01, 0x25, + 0x07, 0x17, 0x01, 0x08, 0x01, 0x66, 0x11, 0x81, 0x00, 0x06, 0x54, 0x30, 0x22, 0x2F, 0x29, 0x3C, + 0x2A, 0x84, 0x01, 0x56, 0x01, 0x52, 0x51, 0x22, 0x00, 0x00, 0x50, 0x22, 0x01, 0x52, 0x01, 0x4D, + 0x2B, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x01, 0x08, 0x09, 0x85, 0x01, 0x5F, + 0x01, 0x66, 0x0F, 0x81, 0x00, 0x06, 0x54, 0x30, 0x22, 0x2F, 0x29, 0x41, 0x28, 0x84, 0x01, 0x58, + 0x01, 0x4E, 0x53, 0x22, 0x00, 0x00, 0x53, 0x22, 0x01, 0x5A, 0x01, 0x56, 0x28, 0x84, 0x00, 0x03, + 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x01, 0x08, 0x0A, 0x85, 0x01, 0x65, 0x01, 0x25, 0x0E, 0x81, + 0x00, 0x06, 0x54, 0x30, 0x22, 0x2F, 0x29, 0x41, 0x25, 0x84, 0x01, 0x59, 0x01, 0x5E, 0x56, 0x22, + 0x00, 0x00, 0x55, 0x22, 0x00, 0x03, 0x5C, 0x58, 0x50, 0x00, 0x25, 0x84, 0x00, 0x03, 0x22, 0x1F, + 0x54, 0x00, 0x0E, 0x81, 0x00, 0x08, 0x08, 0x85, 0x85, 0x85, 0x76, 0x17, 0x17, 0x13, 0x04, 0x85, + 0x01, 0x5F, 0x0E, 0x81, 0x00, 0x06, 0x54, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x22, 0x84, 0x01, 0x56, + 0x01, 0x5A, 0x59, 0x22, 0x00, 0x00, 0x58, 0x22, 0x01, 0x52, 0x01, 0x5D, 0x23, 0x84, 0x00, 0x03, + 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x00, 0x09, 0x08, 0x85, 0x85, 0x85, 0x5F, 0x81, 0x81, 0x81, + 0x17, 0x00, 0x04, 0x85, 0x01, 0x25, 0x0D, 0x81, 0x00, 0x06, 0x54, 0x30, 0x22, 0x2F, 0x29, 0x29, + 0x1F, 0x84, 0x00, 0x03, 0x56, 0x5A, 0x57, 0x00, 0x5B, 0x22, 0x00, 0x00, 0x5B, 0x22, 0x00, 0x03, + 0x5C, 0x58, 0x50, 0x00, 0x1F, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x00, 0x05, + 0x08, 0x85, 0x85, 0x85, 0x5F, 0x00, 0x04, 0x81, 0x04, 0x85, 0x01, 0x08, 0x0D, 0x81, 0x00, 0x07, + 0x54, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x3C, 0x00, 0x1B, 0x84, 0x00, 0x03, 0x56, 0x5A, 0x57, 0x00, + 0x5E, 0x22, 0x00, 0x00, 0x5E, 0x22, 0x00, 0x03, 0x4E, 0x5A, 0x59, 0x00, 0x1C, 0x84, 0x00, 0x03, + 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x00, 0x05, 0x08, 0x85, 0x85, 0x85, 0x5F, 0x00, 0x04, 0x81, + 0x00, 0x05, 0x5F, 0x85, 0x85, 0x85, 0x08, 0x00, 0x0D, 0x81, 0x00, 0x07, 0x54, 0x30, 0x22, 0x2F, + 0x29, 0x29, 0x41, 0x00, 0x18, 0x84, 0x01, 0x4D, 0x01, 0x5E, 0x62, 0x22, 0x00, 0x00, 0x62, 0x22, + 0x00, 0x03, 0x52, 0x58, 0x50, 0x00, 0x18, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, + 0x00, 0x05, 0x08, 0x85, 0x85, 0x85, 0x5F, 0x00, 0x04, 0x81, 0x04, 0x85, 0x01, 0x08, 0x0D, 0x81, + 0x00, 0x07, 0x54, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x41, 0x00, 0x14, 0x84, 0x00, 0x03, 0x59, 0x5A, + 0x5C, 0x00, 0x65, 0x22, 0x00, 0x00, 0x65, 0x22, 0x00, 0x04, 0x57, 0x5E, 0x5D, 0x56, 0x14, 0x84, + 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x00, 0x0E, 0x08, 0x85, 0x85, 0x85, 0x5F, 0x81, + 0x81, 0x81, 0x13, 0x85, 0x85, 0x85, 0x65, 0x66, 0x0D, 0x81, 0x00, 0x07, 0x54, 0x30, 0x22, 0x2F, + 0x29, 0x29, 0x29, 0x00, 0x10, 0x84, 0x00, 0x03, 0x59, 0x5A, 0x5C, 0x00, 0x69, 0x22, 0x00, 0x00, + 0x6A, 0x22, 0x00, 0x03, 0x52, 0x5A, 0x4D, 0x00, 0x10, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, + 0x0E, 0x81, 0x00, 0x08, 0x08, 0x85, 0x85, 0x85, 0x76, 0x17, 0x13, 0x72, 0x04, 0x85, 0x01, 0x17, + 0x0E, 0x81, 0x00, 0x07, 0x54, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x29, 0x00, 0x0B, 0x84, 0x00, 0x04, + 0x50, 0x4D, 0x4F, 0x4E, 0x6D, 0x22, 0x00, 0x00, 0x6E, 0x22, 0x00, 0x05, 0x57, 0x52, 0x5A, 0x4D, + 0x50, 0x00, 0x0A, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x01, 0x08, 0x0A, 0x85, + 0x01, 0x13, 0x0F, 0x81, 0x00, 0x08, 0x54, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x29, 0x3C, 0x05, 0x84, + 0x00, 0x04, 0x56, 0x4D, 0x4F, 0x5C, 0x72, 0x22, 0x00, 0x00, 0x74, 0x22, 0x00, 0x05, 0x4E, 0x5E, + 0x5A, 0x4D, 0x56, 0x00, 0x04, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x01, 0x08, + 0x09, 0x85, 0x01, 0x17, 0x10, 0x81, 0x00, 0x0C, 0x54, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x29, 0x7F, + 0x4D, 0x4F, 0x52, 0x4E, 0x77, 0x22, 0x00, 0x00, 0x7A, 0x22, 0x00, 0x06, 0x57, 0x4E, 0x5E, 0x22, + 0x1F, 0x54, 0x0E, 0x81, 0x00, 0x0C, 0x08, 0x85, 0x85, 0x85, 0x5F, 0x81, 0x66, 0x17, 0x85, 0x85, + 0x85, 0x17, 0x0F, 0x81, 0x00, 0x08, 0x54, 0x30, 0x22, 0x33, 0x3E, 0x22, 0x22, 0x03, 0x7B, 0x22, + 0x00, 0x00, 0x7E, 0x22, 0x01, 0x1F, 0x01, 0x54, 0x0E, 0x81, 0x00, 0x0C, 0x08, 0x85, 0x85, 0x85, + 0x5F, 0x81, 0x81, 0x81, 0x85, 0x85, 0x85, 0x65, 0x0F, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x00, + 0x7F, 0x22, 0x00, 0x00, 0x7E, 0x22, 0x01, 0x1F, 0x01, 0x54, 0x0E, 0x81, 0x00, 0x08, 0x08, 0x85, + 0x85, 0x85, 0x5F, 0x81, 0x81, 0x66, 0x04, 0x85, 0x0F, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x15, + 0x7F, 0x22, 0x00, 0x00, 0x7E, 0x22, 0x01, 0x1F, 0x01, 0x54, 0x0E, 0x81, 0x00, 0x08, 0x08, 0x85, + 0x85, 0x85, 0x72, 0x08, 0x08, 0x5F, 0x04, 0x85, 0x0F, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x00, + 0x7F, 0x22, 0x00, 0x00, 0x7E, 0x22, 0x01, 0x1F, 0x01, 0x54, 0x0E, 0x81, 0x01, 0x08, 0x0A, 0x85, + 0x01, 0x5F, 0x0F, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x00, 0x7E, 0x22, + 0x01, 0x1F, 0x01, 0x54, 0x0E, 0x81, 0x01, 0x08, 0x09, 0x85, 0x01, 0x72, 0x01, 0x66, 0x0F, 0x81, + 0x00, 0x04, 0x54, 0x30, 0x22, 0x15, 0x7F, 0x22, 0x00, 0x00, 0x7E, 0x22, 0x01, 0x1F, 0x01, 0x54, + 0x0E, 0x81, 0x01, 0x25, 0x07, 0x17, 0x01, 0x08, 0x01, 0x25, 0x11, 0x81, 0x00, 0x04, 0x54, 0x30, + 0x22, 0x00, 0x7F, 0x22, 0x00, 0x00, 0x7E, 0x22, 0x01, 0x1F, 0x01, 0x54, 0x29, 0x81, 0x00, 0x04, + 0x54, 0x30, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x00, 0x7E, 0x22, 0x01, 0x1F, 0x01, 0x54, 0x04, 0x81, + 0x00, 0x21, 0x25, 0x08, 0x08, 0x66, 0x81, 0x81, 0x08, 0x25, 0x81, 0x08, 0x66, 0x81, 0x81, 0x08, + 0x25, 0x81, 0x08, 0x25, 0x81, 0x25, 0x08, 0x66, 0x81, 0x66, 0x08, 0x25, 0x81, 0x81, 0x08, 0x66, + 0x81, 0x81, 0x08, 0x00, 0x04, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x15, 0x7F, 0x22, 0x00, 0x00, + 0x7E, 0x22, 0x01, 0x1F, 0x01, 0x54, 0x04, 0x81, 0x00, 0x21, 0x85, 0x85, 0x85, 0x65, 0x08, 0x81, + 0x85, 0x5F, 0x81, 0x65, 0x13, 0x81, 0x25, 0x85, 0x13, 0x81, 0x85, 0x17, 0x81, 0x17, 0x85, 0x08, + 0x08, 0x65, 0x76, 0x85, 0x13, 0x81, 0x85, 0x08, 0x81, 0x13, 0x85, 0x00, 0x04, 0x81, 0x00, 0x04, + 0x54, 0x30, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x00, 0x7E, 0x22, 0x01, 0x1F, 0x01, 0x54, 0x04, 0x81, + 0x00, 0x21, 0x25, 0x81, 0x25, 0x85, 0x5F, 0x81, 0x85, 0x5F, 0x81, 0x13, 0x65, 0x5F, 0x76, 0x85, + 0x25, 0x81, 0x85, 0x17, 0x81, 0x17, 0x85, 0x08, 0x72, 0x76, 0x81, 0x17, 0x85, 0x08, 0x85, 0x08, + 0x08, 0x85, 0x85, 0x00, 0x04, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x0C, 0x7F, 0x22, 0x00, 0x00, + 0x7E, 0x22, 0x01, 0x1F, 0x01, 0x54, 0x04, 0x81, 0x00, 0x21, 0x66, 0x13, 0x65, 0x85, 0x17, 0x81, + 0x85, 0x5F, 0x81, 0x25, 0x85, 0x17, 0x65, 0x72, 0x81, 0x81, 0x85, 0x17, 0x81, 0x17, 0x85, 0x08, + 0x85, 0x5F, 0x81, 0x08, 0x85, 0x17, 0x85, 0x13, 0x85, 0x65, 0x85, 0x00, 0x04, 0x81, 0x00, 0x04, + 0x54, 0x30, 0x22, 0x2D, 0x7F, 0x22, 0x00, 0x00, 0x7E, 0x22, 0x01, 0x1F, 0x01, 0x54, 0x04, 0x81, + 0x00, 0x21, 0x13, 0x85, 0x5F, 0x08, 0x81, 0x81, 0x85, 0x5F, 0x81, 0x81, 0x76, 0x72, 0x85, 0x08, + 0x81, 0x81, 0x85, 0x17, 0x81, 0x17, 0x85, 0x08, 0x65, 0x5F, 0x81, 0x08, 0x85, 0x17, 0x85, 0x85, + 0x72, 0x08, 0x85, 0x00, 0x04, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x2D, 0x7F, 0x22, 0x00, 0x00, + 0x7E, 0x22, 0x01, 0x1F, 0x01, 0x54, 0x04, 0x81, 0x00, 0x21, 0x5F, 0x85, 0x08, 0x17, 0x25, 0x08, + 0x85, 0x72, 0x08, 0x81, 0x17, 0x85, 0x85, 0x66, 0x25, 0x08, 0x85, 0x13, 0x08, 0x17, 0x85, 0x08, + 0x13, 0x65, 0x08, 0x5F, 0x85, 0x25, 0x85, 0x65, 0x25, 0x08, 0x85, 0x00, 0x04, 0x81, 0x00, 0x04, + 0x54, 0x30, 0x22, 0x2D, 0x7F, 0x22, 0x00, 0x00, 0x7E, 0x22, 0x01, 0x1F, 0x01, 0x54, 0x04, 0x81, + 0x00, 0x05, 0x25, 0x5F, 0x5F, 0x5F, 0x08, 0x00, 0x04, 0x5F, 0x00, 0x06, 0x81, 0x25, 0x5F, 0x17, + 0x81, 0x08, 0x04, 0x5F, 0x00, 0x0E, 0x08, 0x5F, 0x25, 0x66, 0x13, 0x5F, 0x5F, 0x08, 0x81, 0x5F, + 0x25, 0x81, 0x25, 0x5F, 0x04, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x2D, 0x7F, 0x22, 0x00, 0x00, + 0x7E, 0x22, 0x01, 0x1F, 0x01, 0x54, 0x29, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x2D, 0x7F, 0x22, + 0x00, 0x00, 0x7E, 0x22, 0x01, 0x1F, 0x01, 0x54, 0x29, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x2D, + 0x7F, 0x22, 0x00, 0x00, 0x7E, 0x22, 0x01, 0x1F, 0x01, 0x44, 0x29, 0x1F, 0x00, 0x04, 0x44, 0x30, + 0x22, 0x2D, 0x7F, 0x22, 0x00, 0x00, 0x7E, 0x22, 0x01, 0x01, 0x2B, 0x1F, 0x00, 0x03, 0x3F, 0x22, + 0x03, 0x00, 0x7F, 0x22, 0x00, 0x00, 0x7D, 0x22, 0x01, 0x15, 0x01, 0x45, 0x2C, 0x22, 0x01, 0x21, + 0x80, 0x22, 0x00, 0x00, 0xFF, 0x22, 0x2D, 0x22, 0x00, 0x00, 0xFF, 0x22, 0x2D, 0x22, 0x00, 0x00, + 0xFF, 0x22, 0x2D, 0x22, 0x00, 0x01, 0x00, 0x00, +}; + +#ifdef ROMFS_DIRENTRY_HEAD + static const ROMFS_DIRENTRY token_dir = { 0, 0, ROMFS_DIRENTRY_HEAD, "token.bmp", 13800, token }; + #undef ROMFS_DIRENTRY_HEAD + #define ROMFS_DIRENTRY_HEAD &token_dir +#endif diff --git a/resources/token_w.h b/resources/token_w.h new file mode 100644 index 0000000..a168577 --- /dev/null +++ b/resources/token_w.h @@ -0,0 +1,928 @@ +/** + * File generated by the uGFX-Sudio + * + * Original image file: C:/test_joel/studio/tokenring/resources/token_w.bmp + */ + +static const char token_w[] = { + 0x42, 0x4D, 0x1C, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x02, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x2C, 0x01, 0x00, 0x00, 0xCD, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, + 0x00, 0x00, 0xCE, 0x36, 0x00, 0x00, 0x12, 0x0B, 0x00, 0x00, 0x12, 0x0B, 0x00, 0x00, 0x86, 0x00, + 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x96, 0x96, 0x96, 0x00, 0x50, 0x59, 0x57, 0x00, 0xBA, 0xC7, + 0xC8, 0x00, 0xE5, 0xE5, 0xE5, 0x00, 0xC5, 0xD6, 0xD6, 0x00, 0xD9, 0xD9, 0xD9, 0x00, 0x87, 0x88, + 0x88, 0x00, 0x99, 0x26, 0x00, 0x00, 0x6B, 0x6B, 0xD9, 0x00, 0xD7, 0x62, 0x3A, 0x00, 0x60, 0x63, + 0x63, 0x00, 0xAA, 0xE9, 0xAA, 0x00, 0xA3, 0xA3, 0xA3, 0x00, 0x79, 0x7B, 0x7A, 0x00, 0x42, 0x46, + 0x44, 0x00, 0x6E, 0xDA, 0x6E, 0x00, 0xCB, 0xF2, 0xCB, 0x00, 0x3B, 0xB1, 0xFF, 0x00, 0x6E, 0x77, + 0x77, 0x00, 0xAB, 0xAB, 0xE9, 0x00, 0x7C, 0xCB, 0xFF, 0x00, 0x9D, 0xA2, 0xA3, 0x00, 0xE4, 0x95, + 0x7A, 0x00, 0x97, 0x97, 0xE4, 0x00, 0x37, 0x3A, 0x3A, 0x00, 0xF3, 0xF3, 0xF3, 0x00, 0x98, 0xE5, + 0x98, 0x00, 0x00, 0x72, 0xBF, 0x00, 0xD2, 0xE4, 0xE5, 0x00, 0x95, 0xD4, 0xFF, 0x00, 0xCB, 0xCB, + 0xCB, 0x00, 0xA3, 0xB2, 0xB3, 0x00, 0x6E, 0x6E, 0x6E, 0x00, 0x7E, 0x83, 0x82, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xAC, 0xB6, 0xB6, 0x00, 0xDD, 0x79, 0x58, 0x00, 0x54, 0x54, 0xD4, 0x00, 0xEA, 0xAF, + 0x9B, 0x00, 0xB3, 0xBE, 0xBF, 0x00, 0xB0, 0xB0, 0xB0, 0x00, 0xD0, 0x53, 0x53, 0x00, 0x8A, 0x97, + 0x96, 0x00, 0x54, 0xD4, 0x54, 0x00, 0x59, 0xBC, 0xFF, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0xAC, 0xBC, + 0xBC, 0x00, 0x9B, 0x4F, 0x3C, 0x00, 0xDA, 0xEE, 0xEF, 0x00, 0xA1, 0xB0, 0xAF, 0x00, 0xCA, 0xDB, + 0xDC, 0x00, 0x9F, 0x83, 0x78, 0x00, 0x92, 0x74, 0x68, 0x00, 0xFB, 0xFB, 0xFB, 0x00, 0xCF, 0xCF, + 0xCF, 0x00, 0xBD, 0xBD, 0xBD, 0x00, 0x2B, 0x2B, 0x2B, 0x00, 0x96, 0xA3, 0xA3, 0x00, 0xD6, 0xE9, + 0xEA, 0x00, 0x67, 0x6A, 0x69, 0x00, 0xF5, 0x62, 0x62, 0x00, 0x9F, 0xAA, 0xAA, 0x00, 0xCF, 0xB0, + 0xB0, 0x00, 0x5C, 0x65, 0x64, 0x00, 0xD2, 0x6E, 0x6E, 0x00, 0xE6, 0x5B, 0x5B, 0x00, 0xCE, 0xDF, + 0xE0, 0x00, 0x52, 0x53, 0x53, 0x00, 0xC1, 0xCF, 0xD0, 0x00, 0x14, 0x14, 0x14, 0x00, 0x2D, 0x31, + 0x2F, 0x00, 0x7C, 0x85, 0x85, 0x00, 0x40, 0x41, 0x40, 0x00, 0x89, 0x8F, 0x8F, 0x00, 0x5A, 0x5E, + 0x5D, 0x00, 0x23, 0x28, 0x25, 0x00, 0x7E, 0x8B, 0x8A, 0x00, 0xFF, 0x8C, 0x8C, 0x00, 0xFF, 0xD9, + 0xD9, 0x00, 0xFF, 0xB3, 0xB3, 0x00, 0xFF, 0x70, 0x70, 0x00, 0xFF, 0xF6, 0xF6, 0x00, 0xFF, 0xC6, + 0xC6, 0x00, 0xFF, 0xEC, 0xEC, 0x00, 0x79, 0x83, 0xAA, 0x00, 0x79, 0xAA, 0x84, 0x00, 0xFF, 0x79, + 0x79, 0x00, 0xFF, 0xE3, 0xE3, 0x00, 0xFF, 0xA0, 0xA0, 0x00, 0xFF, 0x83, 0x83, 0x00, 0xFF, 0xA9, + 0xA9, 0x00, 0x36, 0x88, 0xBB, 0x00, 0xFF, 0xD0, 0xD0, 0x00, 0xFF, 0x96, 0x96, 0x00, 0xFF, 0xBC, + 0xBC, 0x00, 0xCA, 0xCA, 0xF2, 0x00, 0xBF, 0xE5, 0xFF, 0x00, 0xF2, 0xCC, 0xBF, 0x00, 0xCF, 0xE2, + 0xE3, 0x00, 0xFB, 0xF2, 0xEF, 0x00, 0x0F, 0x9F, 0xFF, 0x00, 0xF2, 0xF2, 0xFB, 0x00, 0x3F, 0x3F, + 0xCF, 0x00, 0xEF, 0xF8, 0xFF, 0x00, 0x1F, 0xA5, 0xFF, 0x00, 0xD1, 0x47, 0x18, 0x00, 0xF8, 0xE5, + 0xDF, 0x00, 0xF2, 0xFB, 0xF2, 0x00, 0x39, 0x40, 0x3E, 0x00, 0xDF, 0xF2, 0xFF, 0x00, 0xF5, 0xD8, + 0xCF, 0x00, 0x3F, 0xCF, 0x3F, 0x00, 0xAF, 0xDF, 0xFF, 0x00, 0x32, 0x34, 0x33, 0x00, 0xD8, 0xD8, + 0xF5, 0x00, 0x9C, 0xA7, 0xA7, 0x00, 0xCF, 0xEB, 0xFF, 0x00, 0x48, 0x4E, 0x4B, 0x00, 0xE5, 0xE5, + 0xF8, 0x00, 0xEF, 0xBF, 0xAF, 0x00, 0x69, 0x72, 0x71, 0x00, 0xE5, 0xF8, 0xE5, 0x00, 0x73, 0x7E, + 0x7D, 0x00, 0xA6, 0xB5, 0xC0, 0x00, 0xCF, 0x91, 0x91, 0x00, 0xA6, 0xBF, 0xB6, 0x00, 0x5F, 0x8E, + 0xA8, 0x00, 0xF0, 0x7B, 0x7B, 0x00, 0xCC, 0x33, 0x00, 0x00, 0x33, 0x33, 0xCC, 0x00, 0x00, 0x99, + 0xFF, 0x00, 0x33, 0xCC, 0x33, 0x00, 0xFF, 0x66, 0x66, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x76, 0x85, + 0x01, 0x05, 0x3C, 0x4A, 0x01, 0x1E, 0x78, 0x85, 0x00, 0x00, 0x75, 0x85, 0x01, 0x1E, 0x3E, 0x4B, + 0x01, 0x1E, 0x77, 0x85, 0x00, 0x00, 0x75, 0x85, 0x00, 0x03, 0x00, 0x4B, 0x3B, 0x00, 0x3A, 0x21, + 0x00, 0x03, 0x0A, 0x4B, 0x3B, 0x00, 0x77, 0x85, 0x00, 0x00, 0x75, 0x85, 0x00, 0x04, 0x00, 0x4B, + 0x2E, 0x2E, 0x05, 0x4C, 0x01, 0x39, 0x01, 0x2E, 0x18, 0x4C, 0x01, 0x39, 0x01, 0x31, 0x04, 0x4C, + 0x01, 0x2A, 0x01, 0x31, 0x07, 0x4C, 0x01, 0x31, 0x01, 0x39, 0x09, 0x4C, 0x00, 0x03, 0x2E, 0x3F, + 0x4A, 0x00, 0x77, 0x85, 0x00, 0x00, 0x75, 0x85, 0x00, 0x05, 0x03, 0x4B, 0x31, 0x30, 0x01, 0x00, + 0x04, 0x21, 0x00, 0x03, 0x4C, 0x30, 0x43, 0x00, 0x17, 0x21, 0x00, 0x09, 0x4C, 0x2E, 0x3B, 0x21, + 0x21, 0x21, 0x78, 0x2E, 0x3B, 0x00, 0x05, 0x21, 0x00, 0x03, 0x3B, 0x2E, 0x78, 0x00, 0x08, 0x21, + 0x00, 0x04, 0x43, 0x30, 0x01, 0x0D, 0x77, 0x85, 0x00, 0x00, 0x76, 0x85, 0x00, 0x0F, 0x75, 0x78, + 0x30, 0x7A, 0x02, 0x02, 0x02, 0x27, 0x3B, 0x0A, 0x7A, 0x02, 0x02, 0x02, 0x23, 0x00, 0x0F, 0x02, + 0x00, 0x21, 0x27, 0x02, 0x02, 0x02, 0x0A, 0x0A, 0x2A, 0x02, 0x02, 0x02, 0x7A, 0x4C, 0x31, 0x02, + 0x3D, 0x02, 0x23, 0x02, 0x39, 0x2E, 0x12, 0x02, 0x02, 0x02, 0x27, 0x27, 0x02, 0x23, 0x02, 0x47, + 0x30, 0x71, 0x00, 0x00, 0x77, 0x85, 0x00, 0x00, 0x76, 0x85, 0x00, 0x3F, 0x15, 0x4B, 0x62, 0x02, + 0x02, 0x30, 0x30, 0x1C, 0x02, 0x15, 0x1F, 0x3A, 0x30, 0x42, 0x44, 0x42, 0x30, 0x30, 0x1C, 0x30, + 0x1C, 0x30, 0x30, 0x1C, 0x30, 0x1C, 0x30, 0x1C, 0x30, 0x30, 0x04, 0x30, 0x1C, 0x30, 0x1F, 0x27, + 0x44, 0x30, 0x30, 0x30, 0x4C, 0x62, 0x2A, 0x2E, 0x2A, 0x30, 0x3D, 0x2E, 0x39, 0x62, 0x12, 0x30, + 0x1C, 0x30, 0x32, 0x32, 0x30, 0x02, 0x30, 0x2A, 0x62, 0x4B, 0x1E, 0x00, 0x77, 0x85, 0x00, 0x00, + 0x76, 0x85, 0x00, 0x24, 0x03, 0x4B, 0x39, 0x30, 0x2A, 0x30, 0x30, 0x3A, 0x32, 0x23, 0x23, 0x04, + 0x30, 0x44, 0x3A, 0x44, 0x32, 0x30, 0x02, 0x1C, 0x44, 0x1C, 0x30, 0x44, 0x3A, 0x44, 0x1C, 0x04, + 0x04, 0x30, 0x44, 0x1C, 0x44, 0x1C, 0x1C, 0x04, 0x04, 0x30, 0x00, 0x17, 0x4C, 0x4C, 0x0A, 0x0A, + 0x47, 0x32, 0x21, 0x0A, 0x0E, 0x30, 0x12, 0x30, 0x02, 0x30, 0x32, 0x42, 0x30, 0x02, 0x30, 0x39, + 0x2E, 0x4B, 0x05, 0x00, 0x77, 0x85, 0x00, 0x00, 0x77, 0x85, 0x00, 0x23, 0x3B, 0x3F, 0x30, 0x39, + 0x30, 0x30, 0x3A, 0x1F, 0x2E, 0x30, 0x42, 0x42, 0x30, 0x04, 0x30, 0x04, 0x1C, 0x30, 0x44, 0x30, + 0x44, 0x30, 0x1C, 0x04, 0x30, 0x04, 0x30, 0x44, 0x30, 0x30, 0x44, 0x30, 0x44, 0x30, 0x04, 0x00, + 0x04, 0x30, 0x00, 0x17, 0x4C, 0x4C, 0x1F, 0x23, 0x3D, 0x23, 0x3D, 0x23, 0x78, 0x30, 0x3B, 0x30, + 0x02, 0x30, 0x32, 0x30, 0x42, 0x44, 0x30, 0x39, 0x2A, 0x4B, 0x35, 0x00, 0x77, 0x85, 0x00, 0x00, + 0x77, 0x85, 0x00, 0x3D, 0x28, 0x4B, 0x04, 0x31, 0x02, 0x30, 0x1C, 0x42, 0x32, 0x3A, 0x44, 0x42, + 0x42, 0x42, 0x30, 0x44, 0x1C, 0x44, 0x42, 0x30, 0x44, 0x3A, 0x44, 0x1C, 0x44, 0x32, 0x42, 0x44, + 0x3A, 0x44, 0x1C, 0x44, 0x42, 0x30, 0x02, 0x3A, 0x42, 0x30, 0x30, 0x4C, 0x4C, 0x32, 0x30, 0x02, + 0x30, 0x02, 0x30, 0x31, 0x30, 0x78, 0x30, 0x2E, 0x30, 0x02, 0x30, 0x32, 0x32, 0x30, 0x39, 0x7A, + 0x4A, 0x00, 0x78, 0x85, 0x00, 0x00, 0x77, 0x85, 0x00, 0x3D, 0x19, 0x4B, 0x2A, 0x30, 0x7A, 0x62, + 0x2A, 0x2E, 0x39, 0x2A, 0x04, 0x3D, 0x62, 0x3D, 0x42, 0x62, 0x3D, 0x62, 0x3D, 0x02, 0x1F, 0x02, + 0x62, 0x73, 0x62, 0x49, 0x62, 0x02, 0x02, 0x02, 0x47, 0x62, 0x78, 0x62, 0x2E, 0x2E, 0x62, 0x62, + 0x62, 0x47, 0x4C, 0x2A, 0x2E, 0x7A, 0x2E, 0x7A, 0x2E, 0x2A, 0x30, 0x39, 0x2E, 0x7A, 0x2E, 0x12, + 0x2E, 0x39, 0x39, 0x31, 0x04, 0x01, 0x0D, 0x00, 0x78, 0x85, 0x00, 0x00, 0x78, 0x85, 0x00, 0x2F, + 0x0D, 0x75, 0x30, 0x21, 0x04, 0x3D, 0x2E, 0x30, 0x04, 0x47, 0x04, 0x2A, 0x04, 0x31, 0x04, 0x04, + 0x39, 0x04, 0x4A, 0x3F, 0x04, 0x49, 0x04, 0x27, 0x27, 0x04, 0x39, 0x04, 0x3B, 0x12, 0x04, 0x39, + 0x04, 0x27, 0x2E, 0x04, 0x39, 0x04, 0x47, 0x4C, 0x27, 0x27, 0x39, 0x04, 0x2A, 0x04, 0x47, 0x00, + 0x0B, 0x30, 0x01, 0x71, 0x01, 0x00, 0x78, 0x85, 0x00, 0x00, 0x78, 0x85, 0x00, 0x2F, 0x1E, 0x71, + 0x4B, 0x71, 0x4C, 0x78, 0x4B, 0x4B, 0x4B, 0x01, 0x4C, 0x6C, 0x4C, 0x78, 0x78, 0x4C, 0x75, 0x4C, + 0x01, 0x6C, 0x4C, 0x01, 0x7A, 0x78, 0x01, 0x4C, 0x6C, 0x4C, 0x01, 0x6C, 0x4C, 0x01, 0x4C, 0x78, + 0x78, 0x4C, 0x01, 0x4C, 0x6C, 0x4B, 0x78, 0x4C, 0x01, 0x4C, 0x01, 0x4C, 0x6C, 0x00, 0x0B, 0x4B, + 0x01, 0x46, 0x01, 0x03, 0x78, 0x85, 0x00, 0x00, 0x79, 0x85, 0x00, 0x0B, 0x03, 0x00, 0x12, 0x43, + 0x43, 0x0D, 0x0D, 0x0D, 0x4A, 0x43, 0x4A, 0x00, 0x05, 0x43, 0x00, 0x03, 0x4B, 0x75, 0x4A, 0x00, + 0x08, 0x75, 0x01, 0x01, 0x01, 0x4A, 0x08, 0x75, 0x00, 0x03, 0x01, 0x4B, 0x0E, 0x00, 0x05, 0x43, + 0x01, 0x0A, 0x0B, 0x0D, 0x01, 0x36, 0x79, 0x85, 0x00, 0x00, 0x88, 0x85, 0x01, 0x05, 0x01, 0x46, + 0x15, 0x27, 0x00, 0x03, 0x75, 0x28, 0x35, 0x00, 0x8A, 0x85, 0x00, 0x00, 0x7D, 0x85, 0x01, 0x15, + 0x01, 0x45, 0x2C, 0x22, 0x01, 0x20, 0x80, 0x85, 0x00, 0x00, 0x7D, 0x85, 0x01, 0x22, 0x01, 0x01, + 0x2B, 0x1F, 0x00, 0x04, 0x12, 0x22, 0x1E, 0x19, 0x7E, 0x85, 0x00, 0x00, 0x7D, 0x85, 0x00, 0x03, + 0x22, 0x1F, 0x44, 0x00, 0x29, 0x1F, 0x00, 0x05, 0x44, 0x30, 0x22, 0x00, 0x05, 0x00, 0x7E, 0x85, + 0x00, 0x00, 0x7D, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x29, 0x83, 0x00, 0x05, 0x55, 0x30, + 0x22, 0x15, 0x36, 0x00, 0x7E, 0x85, 0x00, 0x00, 0x7D, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, + 0x29, 0x83, 0x00, 0x06, 0x55, 0x30, 0x22, 0x00, 0x36, 0x35, 0x7D, 0x85, 0x00, 0x00, 0x7D, 0x85, + 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x29, 0x83, 0x00, 0x06, 0x55, 0x30, 0x22, 0x15, 0x44, 0x19, + 0x7D, 0x85, 0x00, 0x00, 0x77, 0x85, 0x00, 0x09, 0x4E, 0x5C, 0x4F, 0x58, 0x4D, 0x56, 0x22, 0x1F, + 0x55, 0x00, 0x0E, 0x83, 0x01, 0x10, 0x07, 0x85, 0x00, 0x03, 0x6B, 0x10, 0x0F, 0x00, 0x10, 0x83, + 0x00, 0x09, 0x55, 0x30, 0x22, 0x2F, 0x40, 0x58, 0x4F, 0x4E, 0x57, 0x00, 0x7A, 0x85, 0x00, 0x00, + 0x71, 0x85, 0x00, 0x05, 0x4E, 0x5E, 0x5A, 0x4D, 0x50, 0x00, 0x07, 0x84, 0x00, 0x03, 0x22, 0x1F, + 0x55, 0x00, 0x0E, 0x83, 0x01, 0x10, 0x0A, 0x85, 0x01, 0x0B, 0x0F, 0x83, 0x00, 0x06, 0x55, 0x30, + 0x22, 0x2F, 0x29, 0x41, 0x04, 0x84, 0x00, 0x05, 0x56, 0x4D, 0x4F, 0x52, 0x57, 0x00, 0x74, 0x85, + 0x00, 0x00, 0x6B, 0x85, 0x00, 0x05, 0x51, 0x4E, 0x4F, 0x5D, 0x56, 0x00, 0x0D, 0x84, 0x00, 0x03, + 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, 0x00, 0x07, 0x10, 0x85, 0x85, 0x85, 0x79, 0x10, 0x10, 0x00, + 0x05, 0x85, 0x01, 0x0F, 0x0E, 0x83, 0x00, 0x06, 0x55, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x0A, 0x84, + 0x00, 0x04, 0x4D, 0x58, 0x5E, 0x57, 0x6F, 0x85, 0x00, 0x00, 0x67, 0x85, 0x00, 0x04, 0x53, 0x52, + 0x58, 0x59, 0x12, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, 0x00, 0x0D, 0x10, 0x85, + 0x85, 0x85, 0x1A, 0x83, 0x83, 0x2B, 0x10, 0x85, 0x85, 0x85, 0x79, 0x00, 0x0E, 0x83, 0x00, 0x06, + 0x55, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x0F, 0x84, 0x00, 0x04, 0x4D, 0x4F, 0x5C, 0x51, 0x6A, 0x85, + 0x00, 0x00, 0x63, 0x85, 0x00, 0x04, 0x53, 0x52, 0x58, 0x56, 0x16, 0x84, 0x00, 0x03, 0x22, 0x1F, + 0x55, 0x00, 0x0E, 0x83, 0x00, 0x09, 0x10, 0x85, 0x85, 0x85, 0x1A, 0x83, 0x83, 0x83, 0x2B, 0x00, + 0x04, 0x85, 0x01, 0x0F, 0x0D, 0x83, 0x00, 0x07, 0x55, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x3C, 0x00, + 0x12, 0x84, 0x00, 0x04, 0x59, 0x5A, 0x5C, 0x51, 0x66, 0x85, 0x00, 0x00, 0x5F, 0x85, 0x00, 0x04, + 0x51, 0x5C, 0x5A, 0x56, 0x1A, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, 0x00, 0x05, + 0x10, 0x85, 0x85, 0x85, 0x1A, 0x00, 0x04, 0x83, 0x00, 0x05, 0x10, 0x85, 0x85, 0x85, 0x1A, 0x00, + 0x0D, 0x83, 0x00, 0x07, 0x55, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x41, 0x00, 0x16, 0x84, 0x00, 0x03, + 0x59, 0x4F, 0x57, 0x00, 0x63, 0x85, 0x00, 0x00, 0x5C, 0x85, 0x00, 0x03, 0x53, 0x5E, 0x5D, 0x00, + 0x1E, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, 0x00, 0x05, 0x10, 0x85, 0x85, 0x85, + 0x1A, 0x00, 0x04, 0x83, 0x00, 0x05, 0x0B, 0x85, 0x85, 0x85, 0x10, 0x00, 0x0D, 0x83, 0x00, 0x07, + 0x55, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x41, 0x00, 0x19, 0x84, 0x00, 0x04, 0x50, 0x58, 0x5C, 0x51, + 0x5F, 0x85, 0x00, 0x00, 0x59, 0x85, 0x00, 0x03, 0x53, 0x5E, 0x59, 0x00, 0x21, 0x84, 0x00, 0x03, + 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, 0x00, 0x05, 0x10, 0x85, 0x85, 0x85, 0x1A, 0x00, 0x04, 0x83, + 0x00, 0x05, 0x1A, 0x85, 0x85, 0x85, 0x10, 0x00, 0x0D, 0x83, 0x00, 0x07, 0x55, 0x30, 0x22, 0x2F, + 0x29, 0x29, 0x29, 0x00, 0x1D, 0x84, 0x00, 0x03, 0x5D, 0x52, 0x51, 0x00, 0x5C, 0x85, 0x00, 0x00, + 0x56, 0x85, 0x00, 0x03, 0x53, 0x5E, 0x59, 0x00, 0x24, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, + 0x0E, 0x83, 0x00, 0x05, 0x10, 0x85, 0x85, 0x85, 0x1A, 0x00, 0x04, 0x83, 0x00, 0x05, 0x1A, 0x85, + 0x85, 0x85, 0x10, 0x00, 0x0D, 0x83, 0x00, 0x07, 0x55, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x29, 0x00, + 0x20, 0x84, 0x00, 0x03, 0x5D, 0x52, 0x51, 0x00, 0x59, 0x85, 0x00, 0x00, 0x53, 0x85, 0x00, 0x03, + 0x51, 0x52, 0x4D, 0x00, 0x27, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, 0x00, 0x05, + 0x10, 0x85, 0x85, 0x85, 0x1A, 0x00, 0x04, 0x83, 0x00, 0x05, 0x1A, 0x85, 0x85, 0x85, 0x10, 0x00, + 0x0D, 0x83, 0x00, 0x08, 0x55, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x29, 0x3C, 0x21, 0x84, 0x00, 0x03, + 0x50, 0x58, 0x5C, 0x00, 0x57, 0x85, 0x00, 0x00, 0x51, 0x85, 0x00, 0x03, 0x4E, 0x58, 0x50, 0x00, + 0x29, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, 0x00, 0x05, 0x10, 0x85, 0x85, 0x85, + 0x1A, 0x00, 0x04, 0x83, 0x00, 0x05, 0x1A, 0x85, 0x85, 0x85, 0x10, 0x00, 0x0D, 0x83, 0x00, 0x08, + 0x55, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x29, 0x3C, 0x24, 0x84, 0x00, 0x03, 0x56, 0x4F, 0x53, 0x00, + 0x54, 0x85, 0x00, 0x00, 0x4E, 0x85, 0x00, 0x03, 0x51, 0x5E, 0x56, 0x00, 0x2C, 0x84, 0x00, 0x03, + 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, 0x00, 0x05, 0x10, 0x85, 0x85, 0x85, 0x1A, 0x00, 0x04, 0x83, + 0x00, 0x05, 0x10, 0x85, 0x85, 0x85, 0x0B, 0x00, 0x0D, 0x83, 0x00, 0x08, 0x55, 0x30, 0x22, 0x2F, + 0x29, 0x29, 0x29, 0x41, 0x27, 0x84, 0x01, 0x5D, 0x01, 0x5C, 0x52, 0x85, 0x00, 0x00, 0x4C, 0x85, + 0x00, 0x03, 0x53, 0x58, 0x50, 0x00, 0x2E, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, + 0x00, 0x09, 0x10, 0x85, 0x85, 0x85, 0x1A, 0x83, 0x83, 0x83, 0x6F, 0x00, 0x04, 0x85, 0x01, 0x1A, + 0x0D, 0x83, 0x00, 0x08, 0x55, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x29, 0x41, 0x29, 0x84, 0x00, 0x03, + 0x56, 0x4F, 0x51, 0x00, 0x4F, 0x85, 0x00, 0x00, 0x4A, 0x85, 0x01, 0x4E, 0x01, 0x4D, 0x2C, 0x84, + 0x00, 0x08, 0x59, 0x5D, 0x4F, 0x52, 0x4E, 0x22, 0x1F, 0x55, 0x0E, 0x83, 0x00, 0x09, 0x10, 0x85, + 0x85, 0x85, 0x1A, 0x83, 0x83, 0x83, 0x0B, 0x00, 0x04, 0x85, 0x01, 0x2B, 0x0D, 0x83, 0x00, 0x08, + 0x55, 0x30, 0x22, 0x33, 0x7C, 0x7C, 0x40, 0x40, 0x2B, 0x84, 0x00, 0x03, 0x50, 0x58, 0x53, 0x00, + 0x4D, 0x85, 0x00, 0x00, 0x48, 0x85, 0x01, 0x52, 0x01, 0x59, 0x28, 0x84, 0x00, 0x05, 0x59, 0x5D, + 0x4F, 0x4E, 0x53, 0x00, 0x06, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, 0x00, 0x08, + 0x10, 0x85, 0x85, 0x85, 0x1A, 0x83, 0x2B, 0x0B, 0x04, 0x85, 0x01, 0x0B, 0x0E, 0x83, 0x00, 0x04, + 0x55, 0x30, 0x22, 0x15, 0x04, 0x36, 0x00, 0x06, 0x85, 0x4E, 0x52, 0x4F, 0x4D, 0x50, 0x28, 0x84, + 0x01, 0x58, 0x01, 0x57, 0x4B, 0x85, 0x00, 0x00, 0x46, 0x85, 0x01, 0x52, 0x01, 0x56, 0x25, 0x84, + 0x00, 0x04, 0x56, 0x5D, 0x5E, 0x4E, 0x0C, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, + 0x01, 0x10, 0x0A, 0x85, 0x01, 0x6B, 0x01, 0x2B, 0x0E, 0x83, 0x00, 0x04, 0x55, 0x30, 0x22, 0x00, + 0x04, 0x36, 0x01, 0x19, 0x05, 0x85, 0x00, 0x05, 0x53, 0x5C, 0x4F, 0x4D, 0x50, 0x00, 0x25, 0x84, + 0x01, 0x4D, 0x01, 0x4E, 0x49, 0x85, 0x00, 0x00, 0x44, 0x85, 0x01, 0x52, 0x01, 0x56, 0x23, 0x84, + 0x00, 0x04, 0x59, 0x5A, 0x5C, 0x53, 0x10, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, + 0x01, 0x10, 0x09, 0x85, 0x01, 0x79, 0x01, 0x2B, 0x0F, 0x83, 0x00, 0x04, 0x55, 0x30, 0x22, 0x00, + 0x04, 0x36, 0x01, 0x19, 0x0A, 0x85, 0x00, 0x04, 0x57, 0x5E, 0x58, 0x56, 0x23, 0x84, 0x01, 0x4D, + 0x01, 0x4E, 0x47, 0x85, 0x00, 0x00, 0x42, 0x85, 0x01, 0x5C, 0x01, 0x56, 0x21, 0x84, 0x00, 0x04, + 0x56, 0x5A, 0x5C, 0x51, 0x14, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x0E, 0x83, 0x01, 0x0B, + 0x07, 0x10, 0x01, 0x0B, 0x01, 0x0F, 0x11, 0x83, 0x00, 0x04, 0x55, 0x30, 0x22, 0x15, 0x04, 0x36, + 0x01, 0x03, 0x0E, 0x85, 0x00, 0x04, 0x53, 0x52, 0x5D, 0x50, 0x21, 0x84, 0x01, 0x5D, 0x01, 0x53, + 0x45, 0x85, 0x00, 0x00, 0x40, 0x85, 0x01, 0x4E, 0x01, 0x4D, 0x20, 0x84, 0x00, 0x03, 0x5D, 0x5E, + 0x53, 0x00, 0x18, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x29, 0x83, 0x00, 0x04, 0x55, 0x30, + 0x22, 0x00, 0x04, 0x36, 0x01, 0x05, 0x12, 0x85, 0x00, 0x03, 0x57, 0x4F, 0x59, 0x00, 0x20, 0x84, + 0x01, 0x58, 0x01, 0x51, 0x43, 0x85, 0x00, 0x00, 0x3E, 0x85, 0x01, 0x53, 0x01, 0x58, 0x1E, 0x84, + 0x00, 0x04, 0x50, 0x58, 0x5C, 0x51, 0x1B, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x29, 0x83, + 0x00, 0x04, 0x55, 0x30, 0x22, 0x00, 0x05, 0x36, 0x15, 0x85, 0x00, 0x03, 0x53, 0x5E, 0x5D, 0x00, + 0x1E, 0x84, 0x01, 0x50, 0x01, 0x4F, 0x42, 0x85, 0x00, 0x00, 0x3D, 0x85, 0x01, 0x4F, 0x01, 0x50, + 0x1C, 0x84, 0x00, 0x03, 0x50, 0x58, 0x5C, 0x00, 0x1F, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, + 0x04, 0x83, 0x04, 0x10, 0x00, 0x1D, 0x6F, 0x83, 0x10, 0x0B, 0x83, 0x10, 0x0F, 0x83, 0x6F, 0x10, + 0x1A, 0x83, 0x10, 0x0F, 0x83, 0x0F, 0x10, 0x2B, 0x6F, 0x0B, 0x6B, 0x10, 0x0F, 0x83, 0x10, 0x2B, + 0x83, 0x2B, 0x10, 0x00, 0x04, 0x83, 0x00, 0x04, 0x55, 0x30, 0x22, 0x15, 0x05, 0x36, 0x01, 0x35, + 0x17, 0x85, 0x00, 0x03, 0x51, 0x52, 0x5D, 0x00, 0x1D, 0x84, 0x01, 0x56, 0x01, 0x4E, 0x40, 0x85, + 0x00, 0x00, 0x3B, 0x85, 0x01, 0x4E, 0x01, 0x56, 0x1C, 0x84, 0x01, 0x5D, 0x01, 0x52, 0x22, 0x85, + 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x04, 0x83, 0x00, 0x21, 0x1A, 0x2B, 0x1A, 0x85, 0x0B, 0x83, + 0x85, 0x10, 0x83, 0x10, 0x79, 0x1A, 0x0B, 0x85, 0x0F, 0x83, 0x85, 0x1A, 0x83, 0x1A, 0x85, 0x2B, + 0x10, 0x6B, 0x0F, 0x10, 0x85, 0x6F, 0x85, 0x0F, 0x2B, 0x6B, 0x85, 0x00, 0x04, 0x83, 0x00, 0x04, + 0x55, 0x30, 0x22, 0x00, 0x05, 0x36, 0x01, 0x35, 0x1A, 0x85, 0x00, 0x03, 0x53, 0x5E, 0x59, 0x00, + 0x1C, 0x84, 0x01, 0x5D, 0x01, 0x53, 0x3E, 0x85, 0x00, 0x00, 0x39, 0x85, 0x01, 0x51, 0x01, 0x58, + 0x1B, 0x84, 0x00, 0x03, 0x56, 0x5E, 0x51, 0x00, 0x24, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, + 0x05, 0x83, 0x00, 0x20, 0x0F, 0x10, 0x85, 0x0B, 0x83, 0x85, 0x10, 0x83, 0x0F, 0x85, 0x10, 0x85, + 0x6B, 0x83, 0x83, 0x85, 0x1A, 0x83, 0x1A, 0x85, 0x0F, 0x6B, 0x10, 0x83, 0x0F, 0x85, 0x1A, 0x85, + 0x0F, 0x79, 0x85, 0x85, 0x04, 0x83, 0x00, 0x04, 0x55, 0x30, 0x22, 0x2D, 0x23, 0x85, 0x00, 0x03, + 0x57, 0x5A, 0x50, 0x00, 0x1A, 0x84, 0x01, 0x50, 0x01, 0x5E, 0x3D, 0x85, 0x00, 0x00, 0x38, 0x85, + 0x01, 0x5C, 0x01, 0x50, 0x1A, 0x84, 0x01, 0x58, 0x01, 0x4E, 0x27, 0x85, 0x00, 0x03, 0x22, 0x1F, + 0x55, 0x00, 0x04, 0x83, 0x00, 0x21, 0x1A, 0x85, 0x85, 0x10, 0x6F, 0x83, 0x85, 0x10, 0x83, 0x83, + 0x6B, 0x0B, 0x85, 0x0B, 0x83, 0x83, 0x85, 0x1A, 0x83, 0x1A, 0x85, 0x0F, 0x85, 0x10, 0x83, 0x0F, + 0x85, 0x1A, 0x85, 0x6B, 0x85, 0x1A, 0x85, 0x00, 0x04, 0x83, 0x00, 0x04, 0x55, 0x30, 0x22, 0x2D, + 0x26, 0x85, 0x01, 0x52, 0x01, 0x4D, 0x1A, 0x84, 0x01, 0x4D, 0x01, 0x57, 0x3B, 0x85, 0x00, 0x00, + 0x36, 0x85, 0x01, 0x51, 0x01, 0x5D, 0x19, 0x84, 0x00, 0x03, 0x56, 0x4F, 0x51, 0x00, 0x29, 0x85, + 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x04, 0x83, 0x00, 0x21, 0x10, 0x85, 0x6F, 0x83, 0x6F, 0x83, + 0x85, 0x10, 0x83, 0x83, 0x0B, 0x85, 0x85, 0x2B, 0x83, 0x83, 0x85, 0x1A, 0x83, 0x1A, 0x85, 0x0F, + 0x10, 0x79, 0x83, 0x0F, 0x85, 0x2B, 0x85, 0x85, 0x0F, 0x0F, 0x85, 0x00, 0x04, 0x83, 0x00, 0x04, + 0x55, 0x30, 0x22, 0x2D, 0x28, 0x85, 0x01, 0x57, 0x01, 0x58, 0x19, 0x84, 0x01, 0x50, 0x01, 0x5E, + 0x3A, 0x85, 0x00, 0x00, 0x35, 0x85, 0x01, 0x4E, 0x01, 0x50, 0x18, 0x84, 0x01, 0x56, 0x01, 0x52, + 0x2C, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x04, 0x83, 0x00, 0x05, 0x0F, 0x85, 0x85, 0x85, + 0x1A, 0x00, 0x04, 0x85, 0x00, 0x06, 0x83, 0x2B, 0x85, 0x10, 0x83, 0x1A, 0x04, 0x85, 0x00, 0x0E, + 0x1A, 0x85, 0x0F, 0x2B, 0x6B, 0x85, 0x85, 0x0B, 0x83, 0x85, 0x1A, 0x83, 0x0F, 0x85, 0x04, 0x83, + 0x00, 0x04, 0x55, 0x30, 0x22, 0x2D, 0x2A, 0x85, 0x00, 0x03, 0x51, 0x4F, 0x50, 0x00, 0x18, 0x84, + 0x01, 0x4D, 0x01, 0x53, 0x38, 0x85, 0x00, 0x00, 0x34, 0x85, 0x01, 0x5A, 0x18, 0x84, 0x01, 0x4D, + 0x01, 0x4E, 0x2E, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x05, 0x83, 0x00, 0x03, 0x6F, 0x0F, + 0x2B, 0x00, 0x14, 0x83, 0x01, 0x0F, 0x01, 0x2B, 0x0B, 0x83, 0x00, 0x04, 0x55, 0x30, 0x22, 0x2D, + 0x2C, 0x85, 0x00, 0x03, 0x51, 0x52, 0x56, 0x00, 0x17, 0x84, 0x01, 0x50, 0x01, 0x5C, 0x37, 0x85, + 0x00, 0x00, 0x32, 0x85, 0x01, 0x53, 0x01, 0x59, 0x17, 0x84, 0x01, 0x4D, 0x01, 0x4E, 0x30, 0x85, + 0x00, 0x03, 0x22, 0x1F, 0x55, 0x00, 0x29, 0x83, 0x00, 0x04, 0x55, 0x30, 0x22, 0x2D, 0x2F, 0x85, + 0x01, 0x52, 0x01, 0x56, 0x17, 0x84, 0x01, 0x5A, 0x36, 0x85, 0x00, 0x00, 0x31, 0x85, 0x01, 0x4E, + 0x01, 0x50, 0x16, 0x84, 0x01, 0x4D, 0x01, 0x4E, 0x32, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x7D, 0x00, + 0x29, 0x55, 0x00, 0x04, 0x7D, 0x30, 0x22, 0x2D, 0x31, 0x85, 0x01, 0x52, 0x01, 0x50, 0x16, 0x84, + 0x01, 0x59, 0x01, 0x51, 0x34, 0x85, 0x00, 0x00, 0x30, 0x85, 0x01, 0x5E, 0x16, 0x84, 0x01, 0x56, + 0x01, 0x5C, 0x34, 0x85, 0x01, 0x22, 0x01, 0x39, 0x2B, 0x30, 0x00, 0x03, 0x1F, 0x22, 0x2D, 0x00, + 0x32, 0x85, 0x00, 0x03, 0x51, 0x4F, 0x50, 0x00, 0x15, 0x84, 0x01, 0x50, 0x01, 0x57, 0x33, 0x85, + 0x00, 0x00, 0x2F, 0x85, 0x01, 0x58, 0x15, 0x84, 0x01, 0x50, 0x01, 0x5E, 0x36, 0x85, 0x01, 0x48, + 0x2D, 0x22, 0x01, 0x46, 0x35, 0x85, 0x01, 0x51, 0x01, 0x58, 0x16, 0x84, 0x01, 0x52, 0x32, 0x85, + 0x00, 0x00, 0x2D, 0x85, 0x01, 0x51, 0x01, 0x59, 0x15, 0x84, 0x01, 0x5A, 0x01, 0x51, 0x38, 0x85, + 0x2D, 0x2D, 0x01, 0x19, 0x37, 0x85, 0x01, 0x57, 0x01, 0x4D, 0x15, 0x84, 0x01, 0x5A, 0x31, 0x85, + 0x00, 0x00, 0x2C, 0x85, 0x01, 0x57, 0x01, 0x59, 0x14, 0x84, 0x01, 0x59, 0x01, 0x57, 0xA1, 0x85, + 0x01, 0x52, 0x01, 0x50, 0x14, 0x84, 0x01, 0x58, 0x30, 0x85, 0x00, 0x00, 0x2B, 0x85, 0x01, 0x57, + 0x01, 0x50, 0x13, 0x84, 0x01, 0x50, 0x01, 0x5E, 0xA4, 0x85, 0x01, 0x51, 0x01, 0x5D, 0x14, 0x84, + 0x01, 0x59, 0x01, 0x51, 0x2E, 0x85, 0x00, 0x00, 0x2A, 0x85, 0x01, 0x57, 0x01, 0x50, 0x13, 0x84, + 0x01, 0x4D, 0x01, 0x53, 0xA7, 0x85, 0x01, 0x4E, 0x01, 0x56, 0x13, 0x84, 0x01, 0x59, 0x01, 0x51, + 0x2D, 0x85, 0x00, 0x00, 0x29, 0x85, 0x01, 0x57, 0x01, 0x50, 0x12, 0x84, 0x01, 0x50, 0x01, 0x5E, + 0xAA, 0x85, 0x01, 0x51, 0x01, 0x5D, 0x13, 0x84, 0x01, 0x59, 0x01, 0x51, 0x2C, 0x85, 0x00, 0x00, + 0x28, 0x85, 0x01, 0x57, 0x01, 0x50, 0x12, 0x84, 0x01, 0x59, 0x01, 0x57, 0xAD, 0x85, 0x01, 0x5C, + 0x01, 0x50, 0x12, 0x84, 0x01, 0x59, 0x01, 0x51, 0x2B, 0x85, 0x00, 0x00, 0x27, 0x85, 0x01, 0x57, + 0x01, 0x50, 0x12, 0x84, 0x01, 0x5A, 0xB0, 0x85, 0x01, 0x53, 0x01, 0x59, 0x12, 0x84, 0x01, 0x59, + 0x01, 0x51, 0x2A, 0x85, 0x00, 0x00, 0x26, 0x85, 0x01, 0x57, 0x01, 0x50, 0x11, 0x84, 0x01, 0x50, + 0x01, 0x52, 0xB3, 0x85, 0x01, 0x5A, 0x12, 0x84, 0x01, 0x59, 0x01, 0x51, 0x29, 0x85, 0x00, 0x00, + 0x25, 0x85, 0x01, 0x53, 0x01, 0x50, 0x11, 0x84, 0x01, 0x59, 0x01, 0x57, 0xB5, 0x85, 0x01, 0x52, + 0x01, 0x50, 0x11, 0x84, 0x01, 0x5D, 0x29, 0x85, 0x00, 0x00, 0x24, 0x85, 0x01, 0x51, 0x01, 0x59, + 0x11, 0x84, 0x01, 0x4D, 0x01, 0x51, 0xB7, 0x85, 0x01, 0x57, 0x01, 0x50, 0x11, 0x84, 0x01, 0x58, + 0x28, 0x85, 0x00, 0x00, 0x24, 0x85, 0x01, 0x4D, 0x11, 0x84, 0x01, 0x58, 0xBA, 0x85, 0x01, 0x51, + 0x01, 0x59, 0x11, 0x84, 0x01, 0x5E, 0x27, 0x85, 0x00, 0x00, 0x23, 0x85, 0x01, 0x58, 0x11, 0x84, + 0x01, 0x4F, 0xBC, 0x85, 0x01, 0x51, 0x01, 0x59, 0x11, 0x84, 0x01, 0x5C, 0x26, 0x85, 0x00, 0x00, + 0x22, 0x85, 0x01, 0x52, 0x11, 0x84, 0x01, 0x52, 0xBF, 0x85, 0x01, 0x58, 0x10, 0x84, 0x01, 0x50, + 0x01, 0x53, 0x25, 0x85, 0x00, 0x00, 0x21, 0x85, 0x01, 0x57, 0x01, 0x50, 0x10, 0x84, 0x01, 0x52, + 0xC1, 0x85, 0x01, 0x58, 0x10, 0x84, 0x01, 0x59, 0x01, 0x51, 0x24, 0x85, 0x00, 0x00, 0x20, 0x85, + 0x01, 0x51, 0x01, 0x59, 0x10, 0x84, 0x01, 0x52, 0xC3, 0x85, 0x01, 0x58, 0x10, 0x84, 0x01, 0x5A, + 0x24, 0x85, 0x00, 0x00, 0x20, 0x85, 0x01, 0x58, 0x10, 0x84, 0x01, 0x52, 0xC5, 0x85, 0x01, 0x58, + 0x10, 0x84, 0x01, 0x5C, 0x23, 0x85, 0x00, 0x00, 0x1F, 0x85, 0x01, 0x5C, 0x10, 0x84, 0x01, 0x52, + 0xC7, 0x85, 0x01, 0x58, 0x0F, 0x84, 0x01, 0x50, 0x01, 0x51, 0x22, 0x85, 0x00, 0x00, 0x1E, 0x85, + 0x01, 0x51, 0x01, 0x50, 0x0F, 0x84, 0x01, 0x4F, 0xC8, 0x85, 0x01, 0x51, 0x01, 0x59, 0x0F, 0x84, + 0x01, 0x5D, 0x22, 0x85, 0x00, 0x00, 0x1E, 0x85, 0x01, 0x58, 0x0F, 0x84, 0x01, 0x58, 0xCA, 0x85, + 0x01, 0x51, 0x01, 0x59, 0x0F, 0x84, 0x01, 0x5C, 0x21, 0x85, 0x00, 0x00, 0x1D, 0x85, 0x01, 0x4E, + 0x0F, 0x84, 0x01, 0x59, 0xCC, 0x85, 0x01, 0x57, 0x01, 0x50, 0x0E, 0x84, 0x01, 0x56, 0x01, 0x51, + 0x20, 0x85, 0x00, 0x00, 0x1D, 0x85, 0x01, 0x59, 0x0E, 0x84, 0x01, 0x50, 0x01, 0x51, 0xCD, 0x85, + 0x01, 0x5C, 0x0F, 0x84, 0x01, 0x4F, 0x20, 0x85, 0x00, 0x00, 0x1C, 0x85, 0x01, 0x52, 0x0F, 0x84, + 0x01, 0x57, 0xCF, 0x85, 0x01, 0x4F, 0x0F, 0x84, 0x01, 0x53, 0x1F, 0x85, 0x00, 0x00, 0x01, 0x85, + 0x01, 0x06, 0x3C, 0x4B, 0x01, 0x4A, 0x01, 0x19, 0xAC, 0x85, 0x01, 0x03, 0x01, 0x75, 0x3B, 0x4B, + 0x00, 0x03, 0x71, 0x15, 0x85, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1E, 0x4B, 0x71, 0x00, 0x3A, 0x0E, + 0x00, 0x03, 0x6C, 0x4B, 0x00, 0x00, 0xAC, 0x85, 0x01, 0x4A, 0x01, 0x4B, 0x3B, 0x0E, 0x00, 0x03, + 0x46, 0x4B, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x4B, 0x0E, 0x00, 0x3A, 0x0A, 0x00, 0x03, + 0x4A, 0x4B, 0x48, 0x00, 0xAC, 0x85, 0x01, 0x4A, 0x01, 0x4B, 0x3B, 0x0A, 0x01, 0x0E, 0x01, 0x4B, + 0x00, 0x00, 0x00, 0x05, 0x1E, 0x4B, 0x02, 0x30, 0x2A, 0x00, 0x04, 0x4C, 0x01, 0x2E, 0x01, 0x30, + 0x18, 0x4C, 0x01, 0x2E, 0x01, 0x04, 0x04, 0x4C, 0x01, 0x39, 0x01, 0x04, 0x07, 0x4C, 0x01, 0x2E, + 0x01, 0x2E, 0x09, 0x4C, 0x00, 0x03, 0x04, 0x7A, 0x75, 0x00, 0xAC, 0x85, 0x00, 0x04, 0x3B, 0x75, + 0x30, 0x04, 0x05, 0x4C, 0x01, 0x62, 0x01, 0x04, 0x18, 0x4C, 0x01, 0x04, 0x01, 0x2E, 0x04, 0x4C, + 0x01, 0x2E, 0x01, 0x31, 0x07, 0x4C, 0x01, 0x30, 0x09, 0x4C, 0x00, 0x04, 0x39, 0x30, 0x4B, 0x15, + 0x00, 0x00, 0x00, 0x05, 0x85, 0x48, 0x7A, 0x30, 0x12, 0x00, 0x04, 0x15, 0x00, 0x03, 0x01, 0x4C, + 0x01, 0x00, 0x17, 0x15, 0x00, 0x09, 0x01, 0x4C, 0x0A, 0x15, 0x15, 0x15, 0x12, 0x2E, 0x21, 0x00, + 0x05, 0x15, 0x00, 0x03, 0x21, 0x2E, 0x4C, 0x00, 0x08, 0x15, 0x00, 0x04, 0x0A, 0x62, 0x01, 0x3B, + 0xAC, 0x85, 0x00, 0x0C, 0x37, 0x4B, 0x04, 0x62, 0x4A, 0x15, 0x15, 0x15, 0x21, 0x78, 0x78, 0x3B, + 0x16, 0x15, 0x00, 0x03, 0x0D, 0x78, 0x01, 0x00, 0x04, 0x15, 0x01, 0x4C, 0x01, 0x12, 0x06, 0x15, + 0x00, 0x03, 0x0A, 0x30, 0x0A, 0x00, 0x08, 0x15, 0x00, 0x04, 0x78, 0x04, 0x4B, 0x1E, 0x00, 0x00, + 0x00, 0x11, 0x85, 0x06, 0x6C, 0x30, 0x31, 0x04, 0x30, 0x30, 0x42, 0x15, 0x15, 0x3D, 0x30, 0x30, + 0x30, 0x02, 0x3A, 0x00, 0x0E, 0x30, 0x00, 0x21, 0x02, 0x30, 0x30, 0x30, 0x15, 0x15, 0x23, 0x30, + 0x30, 0x30, 0x4C, 0x02, 0x2A, 0x30, 0x23, 0x30, 0x02, 0x30, 0x2E, 0x2E, 0x78, 0x30, 0x30, 0x30, + 0x1C, 0x02, 0x30, 0x27, 0x30, 0x4C, 0x30, 0x71, 0x2A, 0x00, 0xAD, 0x85, 0x00, 0x0F, 0x71, 0x4C, + 0x30, 0x2A, 0x30, 0x30, 0x30, 0x02, 0x15, 0x15, 0x02, 0x30, 0x30, 0x30, 0x02, 0x00, 0x0E, 0x30, + 0x00, 0x22, 0x02, 0x30, 0x30, 0x30, 0x44, 0x15, 0x15, 0x44, 0x30, 0x30, 0x32, 0x4C, 0x78, 0x30, + 0x32, 0x44, 0x30, 0x23, 0x30, 0x12, 0x30, 0x12, 0x30, 0x30, 0x30, 0x02, 0x30, 0x32, 0x32, 0x30, + 0x39, 0x2E, 0x4B, 0x19, 0x00, 0x00, 0x00, 0x40, 0x85, 0x05, 0x4B, 0x2E, 0x30, 0x39, 0x30, 0x30, + 0x30, 0x32, 0x1F, 0x15, 0x1C, 0x30, 0x32, 0x1C, 0x32, 0x1C, 0x30, 0x04, 0x30, 0x42, 0x1C, 0x30, + 0x32, 0x30, 0x04, 0x30, 0x1C, 0x1C, 0x30, 0x02, 0x30, 0x32, 0x30, 0x32, 0x44, 0x42, 0x30, 0x30, + 0x30, 0x4C, 0x04, 0x3F, 0x4C, 0x01, 0x30, 0x4C, 0x4C, 0x78, 0x30, 0x12, 0x30, 0x32, 0x30, 0x32, + 0x44, 0x30, 0x02, 0x30, 0x31, 0x62, 0x4B, 0x37, 0xAD, 0x85, 0x00, 0x3F, 0x0D, 0x6C, 0x30, 0x39, + 0x62, 0x30, 0x30, 0x1C, 0x44, 0x15, 0x23, 0x30, 0x1C, 0x42, 0x1C, 0x32, 0x30, 0x1C, 0x1C, 0x30, + 0x32, 0x30, 0x42, 0x1C, 0x3A, 0x32, 0x30, 0x32, 0x30, 0x32, 0x1C, 0x30, 0x04, 0x3A, 0x02, 0x32, + 0x1C, 0x30, 0x30, 0x32, 0x4C, 0x2A, 0x4C, 0x78, 0x2E, 0x30, 0x01, 0x4C, 0x7A, 0x62, 0x7A, 0x30, + 0x32, 0x30, 0x02, 0x30, 0x32, 0x32, 0x30, 0x2A, 0x4C, 0x46, 0x85, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x85, 0x85, 0x48, 0x78, 0x30, 0x2A, 0x30, 0x30, 0x3A, 0x23, 0x23, 0x32, 0x32, 0x42, 0x42, 0x44, + 0x3A, 0x32, 0x42, 0x1C, 0x44, 0x3A, 0x44, 0x30, 0x1C, 0x44, 0x42, 0x44, 0x3A, 0x44, 0x3A, 0x1C, + 0x44, 0x1C, 0x44, 0x30, 0x32, 0x42, 0x30, 0x30, 0x30, 0x4C, 0x2E, 0x21, 0x15, 0x73, 0x23, 0x3D, + 0x15, 0x0A, 0x30, 0x12, 0x30, 0x02, 0x30, 0x32, 0x32, 0x30, 0x02, 0x30, 0x4C, 0x2E, 0x4B, 0x05, + 0xAD, 0x85, 0x00, 0x3F, 0x1E, 0x4B, 0x02, 0x62, 0x39, 0x30, 0x30, 0x44, 0x23, 0x27, 0x32, 0x44, + 0x3A, 0x32, 0x42, 0x42, 0x44, 0x3A, 0x32, 0x42, 0x1C, 0x02, 0x3A, 0x44, 0x30, 0x32, 0x42, 0x1C, + 0x44, 0x3A, 0x44, 0x1C, 0x32, 0x04, 0x1C, 0x44, 0x30, 0x30, 0x30, 0x32, 0x4C, 0x12, 0x15, 0x15, + 0x1F, 0x23, 0x15, 0x15, 0x7A, 0x2E, 0x3D, 0x30, 0x02, 0x30, 0x44, 0x30, 0x44, 0x42, 0x62, 0x2E, + 0x78, 0x01, 0x85, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x85, 0x85, 0x15, 0x71, 0x30, 0x39, 0x62, 0x30, + 0x30, 0x44, 0x44, 0x30, 0x32, 0x1C, 0x1C, 0x42, 0x30, 0x04, 0x3A, 0x32, 0x1C, 0x30, 0x44, 0x30, + 0x32, 0x1C, 0x1C, 0x32, 0x30, 0x04, 0x3A, 0x32, 0x1C, 0x1C, 0x32, 0x30, 0x04, 0x3A, 0x42, 0x30, + 0x30, 0x4C, 0x2E, 0x39, 0x32, 0x23, 0x32, 0x1F, 0x32, 0x7A, 0x30, 0x7A, 0x30, 0x27, 0x30, 0x32, + 0x3A, 0x42, 0x44, 0x30, 0x31, 0x2A, 0x4B, 0x00, 0xAF, 0x85, 0x00, 0x3E, 0x48, 0x7A, 0x30, 0x2A, + 0x30, 0x30, 0x3A, 0x27, 0x1C, 0x30, 0x44, 0x30, 0x32, 0x1C, 0x1C, 0x32, 0x30, 0x04, 0x3A, 0x32, + 0x1C, 0x1C, 0x04, 0x30, 0x32, 0x3A, 0x32, 0x32, 0x30, 0x04, 0x3A, 0x32, 0x1C, 0x32, 0x1C, 0x1C, + 0x1C, 0x30, 0x1C, 0x4C, 0x12, 0x32, 0x44, 0x44, 0x32, 0x27, 0x32, 0x4C, 0x2E, 0x3D, 0x30, 0x02, + 0x30, 0x02, 0x30, 0x02, 0x30, 0x2E, 0x02, 0x01, 0x21, 0x85, 0x00, 0x00, 0x00, 0x3F, 0x85, 0x85, + 0x03, 0x4B, 0x31, 0x62, 0x39, 0x30, 0x2E, 0x30, 0x04, 0x02, 0x42, 0x2E, 0x3A, 0x27, 0x04, 0x1C, + 0x2E, 0x1C, 0x23, 0x30, 0x02, 0x44, 0x1C, 0x02, 0x3A, 0x23, 0x30, 0x02, 0x04, 0x42, 0x02, 0x3A, + 0x23, 0x30, 0x02, 0x04, 0x1C, 0x30, 0x30, 0x7A, 0x2E, 0x2E, 0x30, 0x3D, 0x30, 0x3D, 0x30, 0x4C, + 0x30, 0x78, 0x30, 0x49, 0x30, 0x1F, 0x30, 0x02, 0x04, 0x30, 0x2A, 0x7A, 0x75, 0x00, 0xAF, 0x85, + 0x00, 0x3E, 0x06, 0x71, 0x30, 0x15, 0x62, 0x30, 0x2E, 0x1C, 0x2E, 0x30, 0x04, 0x02, 0x1C, 0x2E, + 0x3A, 0x44, 0x32, 0x1C, 0x2E, 0x1C, 0x23, 0x30, 0x02, 0x04, 0x1C, 0x3D, 0x1C, 0x27, 0x30, 0x02, + 0x04, 0x1C, 0x2E, 0x1C, 0x3D, 0x30, 0x3A, 0x30, 0x30, 0x4C, 0x78, 0x30, 0x02, 0x02, 0x30, 0x3D, + 0x30, 0x39, 0x02, 0x2E, 0x04, 0x1F, 0x30, 0x39, 0x30, 0x39, 0x30, 0x39, 0x30, 0x4B, 0x15, 0x85, + 0x00, 0x00, 0x00, 0x3F, 0x85, 0x85, 0x85, 0x75, 0x3F, 0x30, 0x49, 0x04, 0x31, 0x2E, 0x04, 0x2E, + 0x31, 0x73, 0x04, 0x02, 0x02, 0x04, 0x73, 0x04, 0x23, 0x31, 0x3D, 0x02, 0x04, 0x23, 0x04, 0x23, + 0x02, 0x02, 0x23, 0x31, 0x3B, 0x04, 0x23, 0x04, 0x02, 0x02, 0x04, 0x04, 0x04, 0x12, 0x2E, 0x3D, + 0x04, 0x39, 0x04, 0x39, 0x04, 0x7A, 0x30, 0x04, 0x30, 0x31, 0x30, 0x02, 0x30, 0x62, 0x04, 0x62, + 0x62, 0x01, 0x3B, 0x00, 0xAF, 0x85, 0x00, 0x23, 0x05, 0x4B, 0x31, 0x02, 0x2A, 0x04, 0x49, 0x30, + 0x02, 0x31, 0x02, 0x23, 0x04, 0x23, 0x04, 0x02, 0x02, 0x04, 0x73, 0x39, 0x39, 0x04, 0x02, 0x02, + 0x04, 0x73, 0x04, 0x23, 0x04, 0x4C, 0x3D, 0x04, 0x73, 0x04, 0x23, 0x00, 0x04, 0x04, 0x00, 0x17, + 0x4C, 0x3B, 0x04, 0x31, 0x27, 0x27, 0x31, 0x04, 0x4C, 0x30, 0x04, 0x04, 0x02, 0x30, 0x02, 0x30, + 0x02, 0x30, 0x62, 0x04, 0x4B, 0x1E, 0x85, 0x00, 0x00, 0x00, 0x00, 0x32, 0x85, 0x85, 0x85, 0x28, + 0x4B, 0x2E, 0x7A, 0x30, 0x04, 0x2A, 0x2E, 0x2E, 0x2A, 0x30, 0x47, 0x30, 0x23, 0x2E, 0x30, 0x78, + 0x30, 0x4C, 0x7A, 0x30, 0x4C, 0x04, 0x30, 0x4C, 0x30, 0x4C, 0x30, 0x2A, 0x4C, 0x30, 0x4C, 0x42, + 0x04, 0x2E, 0x30, 0x39, 0x30, 0x2A, 0x7A, 0x23, 0x30, 0x4C, 0x30, 0x4C, 0x30, 0x3F, 0x0B, 0x2E, + 0x01, 0x71, 0x01, 0x00, 0xB0, 0x85, 0x00, 0x2F, 0x75, 0x3F, 0x2E, 0x4C, 0x30, 0x2A, 0x2E, 0x2E, + 0x4C, 0x62, 0x30, 0x7A, 0x30, 0x2A, 0x30, 0x23, 0x2E, 0x30, 0x6C, 0x2A, 0x30, 0x7A, 0x30, 0x4C, + 0x30, 0x2E, 0x2E, 0x30, 0x2A, 0x39, 0x30, 0x4C, 0x30, 0x4C, 0x30, 0x2E, 0x2E, 0x30, 0x7A, 0x3F, + 0x30, 0x4C, 0x62, 0x2E, 0x31, 0x3A, 0x7A, 0x00, 0x0A, 0x2E, 0x00, 0x04, 0x2A, 0x4B, 0x19, 0x85, + 0x00, 0x00, 0x00, 0x05, 0x85, 0x85, 0x85, 0x19, 0x0D, 0x00, 0x38, 0x4B, 0x01, 0x0D, 0x01, 0x19, + 0xB0, 0x85, 0x01, 0x05, 0x01, 0x48, 0x37, 0x4B, 0x00, 0x04, 0x46, 0x0C, 0x85, 0x85, 0x00, 0x00, + 0x06, 0x85, 0x00, 0x2C, 0x03, 0x00, 0x00, 0x19, 0x85, 0x19, 0x49, 0x0D, 0x49, 0x0D, 0x06, 0x49, + 0x0D, 0x00, 0x4B, 0x7A, 0x2A, 0x78, 0x47, 0x7A, 0x78, 0x47, 0x78, 0x47, 0x78, 0x7A, 0x39, 0x78, + 0x47, 0x78, 0x7A, 0x7A, 0x78, 0x47, 0x78, 0x49, 0x18, 0x0A, 0x0D, 0x49, 0x0D, 0x49, 0x0D, 0x28, + 0x06, 0x36, 0x01, 0x05, 0xB9, 0x85, 0x00, 0x2C, 0x23, 0x00, 0x15, 0x05, 0x03, 0x05, 0x15, 0x49, + 0x0C, 0x06, 0x15, 0x06, 0x00, 0x0A, 0x48, 0x3D, 0x47, 0x78, 0x47, 0x78, 0x47, 0x78, 0x7A, 0x7A, + 0x78, 0x39, 0x47, 0x78, 0x47, 0x78, 0x47, 0x78, 0x7A, 0x7A, 0x78, 0x7A, 0x46, 0x49, 0x00, 0x00, + 0x49, 0x15, 0x06, 0x36, 0x0B, 0x03, 0x00, 0x03, 0x19, 0x85, 0x85, 0x00, 0x00, 0x00, 0x09, 0x85, + 0x00, 0x03, 0x15, 0x21, 0x21, 0x00, 0x08, 0x3B, 0x01, 0x45, 0x15, 0x4A, 0x01, 0x4B, 0x01, 0x0E, + 0x09, 0x3B, 0x00, 0x05, 0x12, 0x28, 0x36, 0x36, 0x35, 0x00, 0xBA, 0x85, 0x01, 0x03, 0x01, 0x0D, + 0x09, 0x21, 0x01, 0x75, 0x01, 0x18, 0x15, 0x4A, 0x01, 0x45, 0x01, 0x3B, 0x09, 0x21, 0x01, 0x28, + 0x0A, 0x85, 0x00, 0x00, 0x08, 0x85, 0x01, 0x0A, 0x01, 0x22, 0x2B, 0x18, 0x00, 0x05, 0x45, 0x45, + 0x2D, 0x36, 0x19, 0x00, 0x1E, 0x85, 0x00, 0x04, 0x57, 0x4E, 0x4E, 0x4E, 0x80, 0x85, 0x01, 0x51, + 0x04, 0x4E, 0x12, 0x85, 0x00, 0x03, 0x03, 0x45, 0x45, 0x00, 0x2A, 0x18, 0x00, 0x03, 0x38, 0x22, + 0x20, 0x00, 0x09, 0x85, 0x00, 0x00, 0x08, 0x85, 0x01, 0x22, 0x01, 0x2A, 0x2B, 0x30, 0x00, 0x05, + 0x42, 0x22, 0x00, 0x36, 0x03, 0x00, 0x0D, 0x85, 0x01, 0x57, 0x04, 0x4D, 0x01, 0x52, 0x09, 0x85, + 0x01, 0x5C, 0x01, 0x56, 0x04, 0x84, 0x00, 0x03, 0x50, 0x4F, 0x51, 0x00, 0x06, 0x85, 0x04, 0x4D, + 0x01, 0x5D, 0x05, 0x85, 0x01, 0x51, 0x05, 0x4D, 0x01, 0x4F, 0x01, 0x85, 0x0D, 0x4D, 0x00, 0x06, + 0x85, 0x85, 0x5E, 0x4D, 0x4D, 0x4D, 0x09, 0x85, 0x00, 0x03, 0x5E, 0x4D, 0x4D, 0x00, 0x13, 0x85, + 0x01, 0x5A, 0x04, 0x4D, 0x00, 0x05, 0x51, 0x85, 0x85, 0x85, 0x4E, 0x00, 0x04, 0x4D, 0x00, 0x04, + 0x52, 0x85, 0x85, 0x57, 0x04, 0x4D, 0x00, 0x09, 0x4F, 0x85, 0x85, 0x85, 0x57, 0x4D, 0x4D, 0x4D, + 0x4E, 0x00, 0x08, 0x85, 0x00, 0x04, 0x51, 0x4D, 0x4D, 0x52, 0x06, 0x85, 0x01, 0x53, 0x01, 0x58, + 0x05, 0x84, 0x01, 0x50, 0x01, 0x4F, 0x10, 0x85, 0x01, 0x2D, 0x01, 0x22, 0x2C, 0x30, 0x00, 0x04, + 0x12, 0x71, 0x36, 0x19, 0x07, 0x85, 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x00, 0x00, + 0x29, 0x2F, 0x00, 0x06, 0x34, 0x30, 0x22, 0x15, 0x36, 0x05, 0x0D, 0x85, 0x01, 0x51, 0x04, 0x84, + 0x01, 0x4D, 0x08, 0x85, 0x01, 0x52, 0x08, 0x84, 0x01, 0x59, 0x01, 0x53, 0x05, 0x85, 0x01, 0x4D, + 0x04, 0x84, 0x05, 0x85, 0x01, 0x52, 0x05, 0x84, 0x01, 0x5C, 0x01, 0x85, 0x0D, 0x84, 0x00, 0x06, + 0x4E, 0x85, 0x4F, 0x84, 0x84, 0x84, 0x08, 0x85, 0x00, 0x04, 0x51, 0x50, 0x84, 0x84, 0x13, 0x85, + 0x01, 0x4D, 0x04, 0x84, 0x04, 0x85, 0x01, 0x4F, 0x04, 0x84, 0x00, 0x04, 0x4E, 0x85, 0x85, 0x4E, + 0x04, 0x84, 0x00, 0x09, 0x4F, 0x85, 0x85, 0x85, 0x4E, 0x84, 0x84, 0x84, 0x4E, 0x00, 0x08, 0x85, + 0x00, 0x04, 0x5D, 0x84, 0x84, 0x4E, 0x05, 0x85, 0x01, 0x52, 0x09, 0x84, 0x01, 0x58, 0x0F, 0x85, + 0x00, 0x04, 0x2D, 0x22, 0x30, 0x7E, 0x29, 0x5B, 0x00, 0x05, 0x27, 0x12, 0x71, 0x36, 0x03, 0x00, + 0x07, 0x85, 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x29, 0x80, 0x00, 0x07, + 0x2F, 0x30, 0x22, 0x00, 0x36, 0x36, 0x35, 0x00, 0x0D, 0x85, 0x00, 0x05, 0x56, 0x84, 0x84, 0x84, + 0x50, 0x00, 0x07, 0x85, 0x01, 0x51, 0x01, 0x50, 0x09, 0x84, 0x01, 0x50, 0x01, 0x51, 0x04, 0x85, + 0x01, 0x4D, 0x04, 0x84, 0x01, 0x51, 0x04, 0x85, 0x01, 0x56, 0x04, 0x84, 0x00, 0x04, 0x56, 0x85, + 0x85, 0x59, 0x0C, 0x84, 0x00, 0x06, 0x4E, 0x85, 0x4F, 0x84, 0x84, 0x84, 0x08, 0x85, 0x00, 0x04, + 0x4F, 0x84, 0x84, 0x84, 0x13, 0x85, 0x01, 0x59, 0x04, 0x84, 0x04, 0x85, 0x01, 0x5A, 0x04, 0x84, + 0x00, 0x04, 0x4E, 0x85, 0x85, 0x5E, 0x04, 0x84, 0x00, 0x08, 0x52, 0x85, 0x85, 0x85, 0x4F, 0x84, + 0x84, 0x84, 0x08, 0x85, 0x00, 0x05, 0x52, 0x84, 0x84, 0x84, 0x51, 0x00, 0x04, 0x85, 0x01, 0x5A, + 0x0B, 0x84, 0x01, 0x52, 0x0E, 0x85, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x29, 0x82, 0x00, 0x05, + 0x1F, 0x12, 0x71, 0x36, 0x05, 0x00, 0x07, 0x85, 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, + 0x33, 0x00, 0x29, 0x80, 0x00, 0x07, 0x2F, 0x30, 0x22, 0x00, 0x36, 0x36, 0x19, 0x00, 0x0D, 0x85, + 0x01, 0x5D, 0x04, 0x84, 0x01, 0x53, 0x06, 0x85, 0x01, 0x4F, 0x0B, 0x84, 0x01, 0x59, 0x04, 0x85, + 0x01, 0x4F, 0x04, 0x84, 0x00, 0x05, 0x4E, 0x85, 0x85, 0x85, 0x4E, 0x00, 0x05, 0x84, 0x00, 0x04, + 0x52, 0x85, 0x85, 0x4D, 0x0C, 0x84, 0x00, 0x06, 0x4E, 0x85, 0x4F, 0x84, 0x84, 0x84, 0x07, 0x85, + 0x00, 0x05, 0x51, 0x50, 0x84, 0x84, 0x84, 0x00, 0x13, 0x85, 0x04, 0x84, 0x01, 0x4D, 0x04, 0x85, + 0x01, 0x4D, 0x04, 0x84, 0x00, 0x04, 0x85, 0x85, 0x85, 0x4F, 0x04, 0x84, 0x00, 0x08, 0x4E, 0x85, + 0x85, 0x85, 0x58, 0x84, 0x84, 0x56, 0x07, 0x85, 0x00, 0x05, 0x53, 0x50, 0x84, 0x84, 0x56, 0x00, + 0x04, 0x85, 0x01, 0x52, 0x0C, 0x84, 0x01, 0x59, 0x0E, 0x85, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, + 0x29, 0x82, 0x00, 0x05, 0x1F, 0x12, 0x71, 0x36, 0x05, 0x00, 0x07, 0x85, 0x00, 0x00, 0x08, 0x85, + 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x0C, 0x80, 0x00, 0x05, 0x69, 0x16, 0x16, 0x16, 0x69, 0x00, + 0x07, 0x80, 0x00, 0x05, 0x24, 0x16, 0x16, 0x16, 0x24, 0x00, 0x0C, 0x80, 0x00, 0x07, 0x2F, 0x30, + 0x22, 0x15, 0x36, 0x36, 0x03, 0x00, 0x0D, 0x85, 0x01, 0x5E, 0x04, 0x84, 0x01, 0x52, 0x06, 0x85, + 0x00, 0x09, 0x56, 0x84, 0x84, 0x84, 0x50, 0x52, 0x57, 0x5C, 0x59, 0x00, 0x04, 0x84, 0x00, 0x05, + 0x4F, 0x85, 0x85, 0x85, 0x4F, 0x00, 0x04, 0x84, 0x00, 0x05, 0x4E, 0x85, 0x85, 0x85, 0x5D, 0x00, + 0x04, 0x84, 0x00, 0x05, 0x50, 0x85, 0x85, 0x85, 0x4D, 0x00, 0x04, 0x84, 0x08, 0x4D, 0x00, 0x06, + 0x57, 0x85, 0x4F, 0x84, 0x84, 0x84, 0x07, 0x85, 0x00, 0x05, 0x4F, 0x84, 0x84, 0x84, 0x4D, 0x00, + 0x13, 0x85, 0x04, 0x84, 0x01, 0x4D, 0x04, 0x85, 0x00, 0x09, 0x56, 0x84, 0x84, 0x84, 0x56, 0x85, + 0x85, 0x85, 0x4D, 0x00, 0x04, 0x84, 0x00, 0x08, 0x51, 0x85, 0x85, 0x85, 0x4D, 0x84, 0x84, 0x4D, + 0x07, 0x85, 0x00, 0x09, 0x4D, 0x84, 0x84, 0x84, 0x58, 0x85, 0x85, 0x85, 0x57, 0x00, 0x05, 0x84, + 0x00, 0x04, 0x50, 0x5D, 0x58, 0x50, 0x05, 0x84, 0x0E, 0x85, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, + 0x11, 0x82, 0x00, 0x09, 0x64, 0x2C, 0x1D, 0x60, 0x60, 0x60, 0x1D, 0x2C, 0x64, 0x00, 0x0F, 0x82, + 0x00, 0x05, 0x1F, 0x12, 0x71, 0x36, 0x36, 0x00, 0x07, 0x85, 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, + 0x22, 0x1F, 0x33, 0x00, 0x0D, 0x80, 0x00, 0x04, 0x63, 0x85, 0x85, 0x26, 0x07, 0x80, 0x00, 0x05, + 0x6A, 0x85, 0x85, 0x85, 0x16, 0x00, 0x0C, 0x80, 0x00, 0x07, 0x2F, 0x30, 0x22, 0x00, 0x36, 0x36, + 0x05, 0x00, 0x0D, 0x85, 0x01, 0x4E, 0x04, 0x84, 0x01, 0x5A, 0x05, 0x85, 0x01, 0x53, 0x04, 0x84, + 0x00, 0x0E, 0x52, 0x85, 0x85, 0x85, 0x51, 0x56, 0x84, 0x84, 0x84, 0x50, 0x51, 0x85, 0x85, 0x4E, + 0x04, 0x84, 0x00, 0x04, 0x4F, 0x85, 0x85, 0x53, 0x05, 0x84, 0x00, 0x05, 0x4F, 0x85, 0x85, 0x85, + 0x5D, 0x00, 0x04, 0x84, 0x0A, 0x85, 0x00, 0x04, 0x4F, 0x84, 0x84, 0x84, 0x06, 0x85, 0x00, 0x06, + 0x51, 0x50, 0x84, 0x84, 0x84, 0x4D, 0x12, 0x85, 0x01, 0x51, 0x04, 0x84, 0x00, 0x05, 0x5D, 0x85, + 0x85, 0x85, 0x51, 0x00, 0x04, 0x84, 0x00, 0x05, 0x5D, 0x85, 0x85, 0x85, 0x4D, 0x00, 0x04, 0x84, + 0x04, 0x85, 0x00, 0x04, 0x84, 0x84, 0x84, 0x4F, 0x06, 0x85, 0x01, 0x4F, 0x04, 0x84, 0x00, 0x05, + 0x5E, 0x85, 0x85, 0x85, 0x4D, 0x00, 0x04, 0x84, 0x00, 0x06, 0x59, 0x51, 0x85, 0x85, 0x51, 0x59, + 0x04, 0x84, 0x0E, 0x85, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x10, 0x82, 0x01, 0x14, 0x01, 0x67, + 0x07, 0x85, 0x01, 0x14, 0x0F, 0x82, 0x00, 0x06, 0x1F, 0x12, 0x71, 0x36, 0x36, 0x19, 0x06, 0x85, + 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x0D, 0x80, 0x00, 0x04, 0x26, 0x85, + 0x85, 0x6A, 0x06, 0x80, 0x01, 0x69, 0x04, 0x85, 0x01, 0x69, 0x0C, 0x80, 0x00, 0x08, 0x2F, 0x30, + 0x22, 0x00, 0x36, 0x36, 0x36, 0x35, 0x0D, 0x85, 0x04, 0x84, 0x01, 0x4D, 0x05, 0x85, 0x01, 0x4E, + 0x04, 0x84, 0x01, 0x4E, 0x04, 0x85, 0x01, 0x4E, 0x04, 0x84, 0x00, 0x04, 0x5E, 0x85, 0x85, 0x4E, + 0x04, 0x84, 0x00, 0x04, 0x4F, 0x85, 0x85, 0x5A, 0x05, 0x84, 0x00, 0x05, 0x51, 0x85, 0x85, 0x85, + 0x4F, 0x00, 0x04, 0x84, 0x01, 0x4E, 0x09, 0x85, 0x00, 0x04, 0x4F, 0x84, 0x84, 0x84, 0x06, 0x85, + 0x01, 0x58, 0x04, 0x84, 0x01, 0x4D, 0x12, 0x85, 0x01, 0x4E, 0x04, 0x84, 0x00, 0x05, 0x4F, 0x85, + 0x85, 0x85, 0x4E, 0x00, 0x04, 0x84, 0x00, 0x04, 0x4F, 0x85, 0x85, 0x85, 0x04, 0x84, 0x00, 0x09, + 0x4D, 0x85, 0x85, 0x85, 0x53, 0x84, 0x84, 0x84, 0x52, 0x00, 0x05, 0x85, 0x01, 0x57, 0x05, 0x84, + 0x00, 0x04, 0x4E, 0x85, 0x85, 0x4E, 0x04, 0x84, 0x01, 0x59, 0x01, 0x51, 0x04, 0x85, 0x00, 0x05, + 0x5E, 0x84, 0x84, 0x84, 0x5D, 0x00, 0x0E, 0x85, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x0F, 0x82, + 0x01, 0x1D, 0x09, 0x85, 0x01, 0x14, 0x0F, 0x82, 0x00, 0x06, 0x1F, 0x12, 0x71, 0x36, 0x36, 0x03, + 0x06, 0x85, 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x0D, 0x80, 0x00, 0x05, + 0x24, 0x85, 0x85, 0x85, 0x09, 0x00, 0x05, 0x80, 0x00, 0x05, 0x16, 0x85, 0x85, 0x85, 0x6E, 0x00, + 0x0D, 0x80, 0x00, 0x08, 0x2F, 0x30, 0x22, 0x15, 0x36, 0x36, 0x36, 0x19, 0x0D, 0x85, 0x01, 0x4D, + 0x04, 0x84, 0x05, 0x85, 0x01, 0x4E, 0x04, 0x84, 0x01, 0x57, 0x05, 0x85, 0x00, 0x08, 0x56, 0x84, + 0x84, 0x84, 0x56, 0x85, 0x85, 0x85, 0x04, 0x84, 0x00, 0x04, 0x5D, 0x85, 0x51, 0x50, 0x04, 0x84, + 0x01, 0x58, 0x04, 0x85, 0x01, 0x4F, 0x04, 0x84, 0x01, 0x4E, 0x09, 0x85, 0x00, 0x04, 0x4F, 0x84, + 0x84, 0x84, 0x05, 0x85, 0x01, 0x53, 0x05, 0x84, 0x01, 0x4D, 0x12, 0x85, 0x01, 0x4E, 0x04, 0x84, + 0x00, 0x05, 0x4F, 0x85, 0x85, 0x85, 0x4F, 0x00, 0x04, 0x84, 0x00, 0x04, 0x4E, 0x85, 0x85, 0x51, + 0x04, 0x84, 0x00, 0x09, 0x5D, 0x85, 0x85, 0x85, 0x4E, 0x84, 0x84, 0x84, 0x4E, 0x00, 0x05, 0x85, + 0x01, 0x59, 0x05, 0x84, 0x00, 0x04, 0x85, 0x85, 0x85, 0x4D, 0x04, 0x84, 0x01, 0x57, 0x05, 0x85, + 0x00, 0x05, 0x58, 0x84, 0x84, 0x84, 0x5E, 0x00, 0x0E, 0x85, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, + 0x0E, 0x82, 0x01, 0x14, 0x04, 0x85, 0x00, 0x07, 0x6D, 0x2C, 0x11, 0x11, 0x14, 0x70, 0x14, 0x00, + 0x0F, 0x82, 0x00, 0x06, 0x1F, 0x12, 0x71, 0x36, 0x36, 0x03, 0x06, 0x85, 0x00, 0x00, 0x08, 0x85, + 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x0E, 0x80, 0x00, 0x04, 0x63, 0x85, 0x85, 0x26, 0x05, 0x09, + 0x00, 0x05, 0x6E, 0x85, 0x85, 0x85, 0x16, 0x00, 0x0D, 0x80, 0x00, 0x08, 0x2F, 0x30, 0x22, 0x00, + 0x36, 0x36, 0x36, 0x03, 0x0D, 0x85, 0x01, 0x5A, 0x04, 0x84, 0x01, 0x57, 0x04, 0x85, 0x01, 0x4E, + 0x04, 0x84, 0x01, 0x4E, 0x05, 0x85, 0x01, 0x5A, 0x04, 0x84, 0x00, 0x03, 0x57, 0x85, 0x85, 0x00, + 0x04, 0x84, 0x00, 0x03, 0x4D, 0x85, 0x52, 0x00, 0x05, 0x84, 0x01, 0x53, 0x04, 0x85, 0x01, 0x4F, + 0x04, 0x84, 0x01, 0x4E, 0x09, 0x85, 0x00, 0x04, 0x4F, 0x84, 0x84, 0x84, 0x05, 0x85, 0x01, 0x58, + 0x05, 0x84, 0x01, 0x4D, 0x12, 0x85, 0x01, 0x4E, 0x04, 0x84, 0x00, 0x05, 0x52, 0x85, 0x85, 0x85, + 0x5D, 0x00, 0x04, 0x84, 0x00, 0x04, 0x85, 0x85, 0x85, 0x4E, 0x04, 0x84, 0x00, 0x08, 0x4F, 0x85, + 0x85, 0x85, 0x5E, 0x84, 0x84, 0x84, 0x05, 0x85, 0x01, 0x5A, 0x05, 0x84, 0x00, 0x04, 0x59, 0x85, + 0x85, 0x57, 0x04, 0x84, 0x01, 0x58, 0x06, 0x85, 0x00, 0x05, 0x56, 0x84, 0x84, 0x84, 0x57, 0x00, + 0x0E, 0x85, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x0D, 0x82, 0x00, 0x07, 0x64, 0x67, 0x85, 0x85, + 0x85, 0x74, 0x64, 0x00, 0x15, 0x82, 0x00, 0x06, 0x1F, 0x12, 0x71, 0x36, 0x36, 0x05, 0x06, 0x85, + 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x0E, 0x80, 0x01, 0x26, 0x0C, 0x85, + 0x01, 0x69, 0x0D, 0x80, 0x00, 0x08, 0x2F, 0x30, 0x22, 0x00, 0x36, 0x36, 0x36, 0x05, 0x0D, 0x85, + 0x01, 0x52, 0x04, 0x84, 0x01, 0x52, 0x04, 0x85, 0x01, 0x4E, 0x04, 0x84, 0x01, 0x4E, 0x05, 0x85, + 0x01, 0x4E, 0x04, 0x84, 0x00, 0x0A, 0x4F, 0x85, 0x85, 0x4D, 0x84, 0x84, 0x84, 0x56, 0x85, 0x56, + 0x04, 0x84, 0x01, 0x5D, 0x05, 0x85, 0x01, 0x52, 0x04, 0x84, 0x01, 0x4E, 0x09, 0x85, 0x00, 0x04, + 0x4F, 0x84, 0x84, 0x84, 0x04, 0x85, 0x01, 0x53, 0x06, 0x84, 0x01, 0x4D, 0x12, 0x85, 0x01, 0x4F, + 0x04, 0x84, 0x00, 0x0D, 0x4E, 0x85, 0x85, 0x85, 0x50, 0x84, 0x84, 0x84, 0x5D, 0x85, 0x85, 0x85, + 0x5C, 0x00, 0x04, 0x84, 0x00, 0x08, 0x52, 0x85, 0x85, 0x85, 0x5A, 0x84, 0x84, 0x56, 0x04, 0x85, + 0x01, 0x4E, 0x06, 0x84, 0x00, 0x04, 0x58, 0x85, 0x85, 0x58, 0x04, 0x84, 0x01, 0x4E, 0x05, 0x85, + 0x00, 0x05, 0x53, 0x84, 0x84, 0x84, 0x50, 0x00, 0x0F, 0x85, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, + 0x0D, 0x82, 0x01, 0x2C, 0x04, 0x85, 0x01, 0x11, 0x16, 0x82, 0x00, 0x06, 0x1F, 0x12, 0x71, 0x36, + 0x36, 0x36, 0x06, 0x85, 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x0E, 0x80, + 0x01, 0x24, 0x0B, 0x85, 0x01, 0x6E, 0x0E, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x15, 0x04, 0x36, + 0x01, 0x35, 0x0C, 0x85, 0x01, 0x53, 0x04, 0x84, 0x01, 0x5A, 0x04, 0x85, 0x01, 0x4E, 0x04, 0x84, + 0x01, 0x52, 0x06, 0x85, 0x04, 0x84, 0x00, 0x04, 0x4D, 0x85, 0x85, 0x4D, 0x04, 0x84, 0x01, 0x58, + 0x05, 0x84, 0x01, 0x4E, 0x05, 0x85, 0x01, 0x4E, 0x04, 0x84, 0x01, 0x52, 0x09, 0x85, 0x00, 0x04, + 0x4F, 0x84, 0x84, 0x84, 0x04, 0x85, 0x01, 0x58, 0x06, 0x84, 0x01, 0x4D, 0x12, 0x85, 0x01, 0x4F, + 0x04, 0x84, 0x00, 0x04, 0x4E, 0x85, 0x85, 0x5C, 0x04, 0x84, 0x00, 0x05, 0x52, 0x85, 0x85, 0x85, + 0x4F, 0x00, 0x04, 0x84, 0x00, 0x0D, 0x4E, 0x85, 0x85, 0x85, 0x4D, 0x84, 0x84, 0x4D, 0x85, 0x85, + 0x85, 0x51, 0x56, 0x00, 0x06, 0x84, 0x00, 0x08, 0x5E, 0x85, 0x85, 0x50, 0x84, 0x84, 0x84, 0x56, + 0x06, 0x85, 0x00, 0x05, 0x52, 0x84, 0x84, 0x84, 0x5D, 0x00, 0x0F, 0x85, 0x00, 0x04, 0x2D, 0x22, + 0x30, 0x5B, 0x0D, 0x82, 0x00, 0x05, 0x1D, 0x85, 0x85, 0x85, 0x6D, 0x00, 0x17, 0x82, 0x00, 0x07, + 0x1F, 0x12, 0x71, 0x36, 0x36, 0x36, 0x35, 0x00, 0x05, 0x85, 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, + 0x22, 0x1F, 0x33, 0x00, 0x0F, 0x80, 0x00, 0x0C, 0x63, 0x85, 0x85, 0x61, 0x16, 0x16, 0x16, 0x63, + 0x85, 0x85, 0x85, 0x16, 0x0E, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x00, 0x04, 0x36, 0x01, 0x19, + 0x0D, 0x85, 0x00, 0x05, 0x50, 0x84, 0x84, 0x84, 0x4D, 0x00, 0x04, 0x85, 0x01, 0x4E, 0x04, 0x84, + 0x01, 0x4F, 0x06, 0x85, 0x00, 0x08, 0x4D, 0x84, 0x84, 0x84, 0x50, 0x85, 0x85, 0x4F, 0x09, 0x84, + 0x01, 0x4D, 0x06, 0x85, 0x01, 0x4E, 0x04, 0x84, 0x01, 0x4F, 0x09, 0x85, 0x00, 0x08, 0x4E, 0x84, + 0x84, 0x84, 0x85, 0x85, 0x85, 0x57, 0x07, 0x84, 0x00, 0x04, 0x4D, 0x85, 0x85, 0x52, 0x0C, 0x4D, + 0x00, 0x04, 0x5C, 0x85, 0x85, 0x4F, 0x04, 0x84, 0x00, 0x04, 0x85, 0x85, 0x85, 0x4D, 0x04, 0x84, + 0x00, 0x05, 0x51, 0x85, 0x85, 0x85, 0x58, 0x00, 0x04, 0x84, 0x00, 0x0C, 0x51, 0x85, 0x85, 0x85, + 0x50, 0x84, 0x84, 0x4F, 0x85, 0x85, 0x85, 0x5D, 0x07, 0x84, 0x00, 0x03, 0x4E, 0x85, 0x57, 0x00, + 0x04, 0x84, 0x01, 0x5A, 0x06, 0x85, 0x00, 0x05, 0x58, 0x84, 0x84, 0x84, 0x5E, 0x00, 0x0F, 0x85, + 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x0D, 0x82, 0x00, 0x05, 0x60, 0x85, 0x85, 0x85, 0x70, 0x00, + 0x17, 0x82, 0x00, 0x07, 0x1F, 0x12, 0x71, 0x36, 0x36, 0x36, 0x19, 0x00, 0x05, 0x85, 0x00, 0x00, + 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x0F, 0x80, 0x00, 0x07, 0x26, 0x85, 0x85, 0x77, + 0x80, 0x80, 0x69, 0x00, 0x04, 0x85, 0x01, 0x69, 0x0E, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x00, + 0x04, 0x36, 0x01, 0x05, 0x0D, 0x85, 0x01, 0x4D, 0x04, 0x84, 0x05, 0x85, 0x04, 0x84, 0x01, 0x58, + 0x06, 0x85, 0x01, 0x5A, 0x04, 0x84, 0x00, 0x03, 0x53, 0x85, 0x4F, 0x00, 0x09, 0x84, 0x01, 0x52, + 0x06, 0x85, 0x01, 0x4E, 0x04, 0x84, 0x01, 0x4F, 0x09, 0x85, 0x00, 0x08, 0x4E, 0x84, 0x84, 0x84, + 0x85, 0x85, 0x85, 0x4D, 0x07, 0x84, 0x00, 0x04, 0x4D, 0x85, 0x85, 0x5A, 0x0C, 0x84, 0x00, 0x04, + 0x4E, 0x85, 0x85, 0x4D, 0x04, 0x84, 0x00, 0x03, 0x85, 0x85, 0x5C, 0x00, 0x04, 0x84, 0x01, 0x58, + 0x04, 0x85, 0x00, 0x05, 0x4D, 0x84, 0x84, 0x84, 0x50, 0x00, 0x04, 0x85, 0x00, 0x07, 0x84, 0x84, + 0x84, 0x52, 0x85, 0x85, 0x5C, 0x00, 0x08, 0x84, 0x00, 0x03, 0x85, 0x85, 0x4F, 0x00, 0x04, 0x84, + 0x00, 0x0C, 0x4E, 0x85, 0x85, 0x85, 0x5E, 0x4F, 0x4F, 0x56, 0x84, 0x84, 0x84, 0x57, 0x0F, 0x85, + 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x0D, 0x82, 0x00, 0x05, 0x60, 0x85, 0x85, 0x85, 0x14, 0x00, + 0x17, 0x82, 0x00, 0x07, 0x1F, 0x12, 0x71, 0x36, 0x36, 0x36, 0x03, 0x00, 0x05, 0x85, 0x00, 0x00, + 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x0F, 0x80, 0x00, 0x0B, 0x24, 0x85, 0x85, 0x85, + 0x69, 0x80, 0x16, 0x85, 0x85, 0x85, 0x77, 0x00, 0x0F, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x15, + 0x05, 0x36, 0x0D, 0x85, 0x01, 0x4F, 0x04, 0x84, 0x01, 0x57, 0x04, 0x85, 0x00, 0x05, 0x50, 0x84, + 0x84, 0x84, 0x4D, 0x00, 0x06, 0x85, 0x01, 0x52, 0x04, 0x84, 0x00, 0x03, 0x4E, 0x85, 0x4E, 0x00, + 0x08, 0x84, 0x01, 0x56, 0x08, 0x85, 0x08, 0x84, 0x00, 0x0D, 0x59, 0x4D, 0x57, 0x85, 0x85, 0x85, + 0x4E, 0x84, 0x84, 0x84, 0x85, 0x85, 0x4E, 0x00, 0x05, 0x84, 0x00, 0x07, 0x56, 0x84, 0x84, 0x4D, + 0x85, 0x85, 0x4D, 0x00, 0x0C, 0x84, 0x00, 0x04, 0x4E, 0x85, 0x85, 0x4D, 0x04, 0x84, 0x00, 0x08, + 0x4E, 0x5E, 0x50, 0x84, 0x84, 0x84, 0x50, 0x53, 0x04, 0x85, 0x00, 0x10, 0x56, 0x84, 0x84, 0x84, + 0x4D, 0x85, 0x85, 0x85, 0x4E, 0x84, 0x84, 0x84, 0x4E, 0x85, 0x51, 0x50, 0x04, 0x84, 0x00, 0x0F, + 0x50, 0x84, 0x84, 0x59, 0x85, 0x85, 0x4D, 0x84, 0x84, 0x84, 0x50, 0x85, 0x85, 0x85, 0x51, 0x00, + 0x06, 0x84, 0x01, 0x50, 0x10, 0x85, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x0D, 0x82, 0x00, 0x05, + 0x60, 0x85, 0x85, 0x85, 0x14, 0x00, 0x17, 0x82, 0x00, 0x07, 0x1F, 0x12, 0x71, 0x36, 0x36, 0x36, + 0x05, 0x00, 0x05, 0x85, 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x10, 0x80, + 0x00, 0x0A, 0x63, 0x85, 0x85, 0x24, 0x80, 0x6E, 0x85, 0x85, 0x85, 0x24, 0x0F, 0x80, 0x00, 0x04, + 0x2F, 0x30, 0x22, 0x00, 0x05, 0x36, 0x01, 0x19, 0x0C, 0x85, 0x01, 0x4E, 0x04, 0x84, 0x01, 0x52, + 0x04, 0x85, 0x01, 0x4D, 0x04, 0x84, 0x06, 0x85, 0x01, 0x4E, 0x04, 0x84, 0x00, 0x03, 0x4F, 0x85, + 0x4E, 0x00, 0x08, 0x84, 0x01, 0x5E, 0x08, 0x85, 0x0A, 0x84, 0x00, 0x0B, 0x52, 0x85, 0x85, 0x85, + 0x4E, 0x84, 0x84, 0x84, 0x85, 0x85, 0x4D, 0x00, 0x04, 0x84, 0x00, 0x08, 0x58, 0x4D, 0x84, 0x84, + 0x4D, 0x85, 0x85, 0x4D, 0x0C, 0x84, 0x00, 0x04, 0x4E, 0x85, 0x85, 0x4D, 0x0A, 0x84, 0x01, 0x52, + 0x05, 0x85, 0x04, 0x84, 0x00, 0x0B, 0x58, 0x85, 0x85, 0x85, 0x52, 0x84, 0x84, 0x84, 0x85, 0x85, + 0x4D, 0x00, 0x04, 0x84, 0x00, 0x07, 0x5D, 0x59, 0x84, 0x84, 0x58, 0x85, 0x85, 0x00, 0x04, 0x84, + 0x00, 0x05, 0x4D, 0x85, 0x85, 0x85, 0x5C, 0x00, 0x06, 0x84, 0x01, 0x58, 0x10, 0x85, 0x00, 0x04, + 0x2D, 0x22, 0x30, 0x5B, 0x0D, 0x82, 0x00, 0x05, 0x60, 0x85, 0x85, 0x85, 0x14, 0x00, 0x17, 0x82, + 0x00, 0x07, 0x1F, 0x12, 0x71, 0x36, 0x36, 0x36, 0x05, 0x00, 0x05, 0x85, 0x00, 0x00, 0x08, 0x85, + 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x10, 0x80, 0x00, 0x05, 0x26, 0x85, 0x85, 0x77, 0x69, 0x00, + 0x04, 0x85, 0x01, 0x69, 0x0F, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x0C, 0x05, 0x05, 0x01, 0x35, + 0x0C, 0x85, 0x01, 0x51, 0x04, 0x84, 0x01, 0x5A, 0x04, 0x85, 0x01, 0x4F, 0x04, 0x84, 0x01, 0x53, + 0x05, 0x85, 0x01, 0x51, 0x04, 0x84, 0x00, 0x03, 0x4F, 0x85, 0x85, 0x00, 0x07, 0x84, 0x01, 0x50, + 0x01, 0x51, 0x08, 0x85, 0x0A, 0x84, 0x00, 0x0A, 0x4F, 0x85, 0x85, 0x85, 0x4E, 0x84, 0x84, 0x84, + 0x85, 0x4E, 0x05, 0x84, 0x00, 0x08, 0x53, 0x4D, 0x84, 0x84, 0x5A, 0x85, 0x85, 0x4D, 0x0C, 0x84, + 0x00, 0x04, 0x51, 0x85, 0x85, 0x50, 0x09, 0x84, 0x01, 0x52, 0x05, 0x85, 0x01, 0x53, 0x04, 0x84, + 0x00, 0x0A, 0x4F, 0x85, 0x85, 0x85, 0x4F, 0x84, 0x84, 0x56, 0x85, 0x5E, 0x04, 0x84, 0x00, 0x08, + 0x50, 0x51, 0x84, 0x84, 0x84, 0x5E, 0x85, 0x57, 0x04, 0x84, 0x00, 0x05, 0x4F, 0x85, 0x85, 0x85, + 0x4F, 0x00, 0x06, 0x84, 0x01, 0x52, 0x10, 0x85, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x0D, 0x82, + 0x00, 0x05, 0x60, 0x85, 0x85, 0x85, 0x60, 0x00, 0x17, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, + 0x04, 0x36, 0x00, 0x05, 0x35, 0x85, 0x85, 0x85, 0x85, 0x00, 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, + 0x22, 0x1F, 0x33, 0x00, 0x10, 0x80, 0x00, 0x09, 0x24, 0x85, 0x85, 0x63, 0x16, 0x85, 0x85, 0x85, + 0x77, 0x00, 0x10, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x13, 0x85, 0x00, 0x05, 0x56, 0x84, + 0x84, 0x84, 0x4D, 0x00, 0x04, 0x85, 0x01, 0x5C, 0x04, 0x84, 0x01, 0x4E, 0x06, 0x85, 0x04, 0x84, + 0x00, 0x03, 0x4D, 0x85, 0x85, 0x00, 0x07, 0x84, 0x01, 0x56, 0x01, 0x51, 0x08, 0x85, 0x01, 0x56, + 0x09, 0x84, 0x00, 0x0A, 0x4F, 0x85, 0x85, 0x85, 0x4E, 0x84, 0x84, 0x84, 0x85, 0x4D, 0x04, 0x84, + 0x00, 0x09, 0x58, 0x85, 0x4D, 0x84, 0x84, 0x4F, 0x85, 0x85, 0x57, 0x00, 0x07, 0x4E, 0x05, 0x4F, + 0x00, 0x03, 0x85, 0x85, 0x85, 0x00, 0x09, 0x84, 0x01, 0x4D, 0x01, 0x53, 0x05, 0x85, 0x01, 0x4E, + 0x04, 0x84, 0x00, 0x0A, 0x5C, 0x85, 0x85, 0x85, 0x4D, 0x84, 0x84, 0x4D, 0x57, 0x50, 0x04, 0x84, + 0x00, 0x08, 0x5C, 0x57, 0x84, 0x84, 0x84, 0x4E, 0x85, 0x5E, 0x04, 0x84, 0x00, 0x05, 0x4E, 0x85, + 0x85, 0x85, 0x5A, 0x00, 0x06, 0x4D, 0x01, 0x53, 0x10, 0x85, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, + 0x0D, 0x82, 0x00, 0x05, 0x14, 0x85, 0x85, 0x85, 0x67, 0x00, 0x17, 0x82, 0x00, 0x03, 0x1F, 0x12, + 0x71, 0x00, 0x04, 0x36, 0x00, 0x05, 0x19, 0x85, 0x85, 0x85, 0x85, 0x00, 0x00, 0x00, 0x08, 0x85, + 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x11, 0x80, 0x01, 0x63, 0x06, 0x85, 0x01, 0x24, 0x10, 0x80, + 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x13, 0x85, 0x01, 0x58, 0x04, 0x84, 0x04, 0x85, 0x01, 0x53, + 0x04, 0x84, 0x01, 0x4F, 0x06, 0x85, 0x00, 0x08, 0x4D, 0x84, 0x84, 0x84, 0x4D, 0x85, 0x85, 0x4D, + 0x07, 0x84, 0x01, 0x4F, 0x08, 0x85, 0x01, 0x4D, 0x09, 0x84, 0x00, 0x09, 0x4F, 0x85, 0x85, 0x85, + 0x4E, 0x84, 0x84, 0x84, 0x52, 0x00, 0x05, 0x84, 0x00, 0x06, 0x53, 0x85, 0x4D, 0x84, 0x84, 0x4F, + 0x12, 0x85, 0x0B, 0x84, 0x01, 0x5C, 0x04, 0x85, 0x01, 0x5E, 0x04, 0x84, 0x00, 0x09, 0x4E, 0x85, + 0x85, 0x85, 0x59, 0x84, 0x84, 0x4F, 0x59, 0x00, 0x04, 0x84, 0x00, 0x09, 0x5D, 0x85, 0x52, 0x84, + 0x84, 0x84, 0x85, 0x85, 0x5A, 0x00, 0x04, 0x84, 0x01, 0x51, 0x1B, 0x85, 0x00, 0x04, 0x2D, 0x22, + 0x30, 0x5B, 0x0D, 0x82, 0x01, 0x11, 0x04, 0x85, 0x01, 0x14, 0x16, 0x82, 0x00, 0x03, 0x1F, 0x12, + 0x71, 0x00, 0x04, 0x36, 0x00, 0x05, 0x03, 0x85, 0x85, 0x85, 0x85, 0x00, 0x00, 0x00, 0x08, 0x85, + 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x11, 0x80, 0x01, 0x26, 0x05, 0x85, 0x01, 0x63, 0x11, 0x80, + 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x13, 0x85, 0x01, 0x5E, 0x04, 0x84, 0x01, 0x57, 0x04, 0x85, + 0x00, 0x05, 0x56, 0x84, 0x84, 0x84, 0x5D, 0x00, 0x06, 0x85, 0x00, 0x11, 0x4D, 0x84, 0x84, 0x84, + 0x59, 0x85, 0x85, 0x4D, 0x84, 0x84, 0x84, 0x50, 0x50, 0x84, 0x84, 0x84, 0x53, 0x00, 0x07, 0x85, + 0x00, 0x05, 0x4D, 0x84, 0x84, 0x84, 0x4D, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x08, 0x84, 0x00, 0x07, + 0x58, 0x85, 0x85, 0x4D, 0x84, 0x84, 0x4F, 0x00, 0x11, 0x85, 0x01, 0x57, 0x04, 0x84, 0x00, 0x03, + 0x4D, 0x4F, 0x5A, 0x00, 0x04, 0x84, 0x01, 0x56, 0x04, 0x85, 0x01, 0x4F, 0x04, 0x84, 0x04, 0x85, + 0x00, 0x04, 0x84, 0x84, 0x84, 0x56, 0x04, 0x84, 0x00, 0x0E, 0x50, 0x51, 0x85, 0x5A, 0x84, 0x84, + 0x59, 0x85, 0x85, 0x4D, 0x84, 0x84, 0x84, 0x50, 0x1C, 0x85, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, + 0x0E, 0x82, 0x00, 0x06, 0x60, 0x85, 0x85, 0x85, 0x67, 0x11, 0x15, 0x82, 0x00, 0x03, 0x1F, 0x12, + 0x71, 0x00, 0x04, 0x36, 0x00, 0x05, 0x03, 0x85, 0x85, 0x85, 0x85, 0x00, 0x00, 0x00, 0x08, 0x85, + 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x11, 0x80, 0x01, 0x24, 0x05, 0x85, 0x01, 0x26, 0x11, 0x80, + 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x13, 0x85, 0x01, 0x57, 0x04, 0x84, 0x01, 0x52, 0x04, 0x85, + 0x00, 0x05, 0x58, 0x84, 0x84, 0x84, 0x50, 0x00, 0x06, 0x85, 0x01, 0x5A, 0x04, 0x84, 0x00, 0x03, + 0x85, 0x85, 0x4F, 0x00, 0x04, 0x84, 0x00, 0x05, 0x4F, 0x84, 0x84, 0x84, 0x4D, 0x00, 0x07, 0x85, + 0x00, 0x05, 0x4D, 0x84, 0x84, 0x84, 0x50, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x08, 0x84, 0x00, 0x07, + 0x53, 0x85, 0x85, 0x4D, 0x84, 0x84, 0x4F, 0x00, 0x11, 0x85, 0x01, 0x4E, 0x04, 0x84, 0x00, 0x04, + 0x4E, 0x85, 0x85, 0x5E, 0x04, 0x84, 0x00, 0x0D, 0x57, 0x85, 0x85, 0x85, 0x5D, 0x84, 0x84, 0x84, + 0x50, 0x85, 0x85, 0x85, 0x57, 0x00, 0x08, 0x84, 0x00, 0x0E, 0x5C, 0x85, 0x85, 0x4D, 0x84, 0x84, + 0x5A, 0x85, 0x85, 0x56, 0x84, 0x84, 0x84, 0x4D, 0x1C, 0x85, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, + 0x0E, 0x82, 0x01, 0x11, 0x01, 0x67, 0x04, 0x85, 0x00, 0x06, 0x1D, 0x2C, 0x2C, 0x14, 0x70, 0x14, + 0x0F, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x04, 0x36, 0x00, 0x05, 0x05, 0x85, 0x85, 0x85, + 0x85, 0x00, 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x12, 0x80, 0x01, 0x63, + 0x04, 0x85, 0x01, 0x24, 0x11, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x14, 0x85, 0x04, 0x84, + 0x01, 0x5A, 0x04, 0x85, 0x01, 0x5C, 0x04, 0x84, 0x01, 0x53, 0x05, 0x85, 0x01, 0x4F, 0x04, 0x84, + 0x00, 0x03, 0x85, 0x85, 0x4F, 0x00, 0x04, 0x84, 0x00, 0x06, 0x51, 0x56, 0x84, 0x84, 0x84, 0x5C, + 0x06, 0x85, 0x01, 0x4F, 0x04, 0x84, 0x09, 0x85, 0x01, 0x4E, 0x07, 0x84, 0x00, 0x08, 0x58, 0x85, + 0x85, 0x85, 0x4D, 0x84, 0x84, 0x4F, 0x11, 0x85, 0x01, 0x4E, 0x04, 0x84, 0x00, 0x04, 0x4E, 0x85, + 0x85, 0x53, 0x04, 0x84, 0x00, 0x0D, 0x4E, 0x85, 0x85, 0x85, 0x4D, 0x84, 0x84, 0x84, 0x4D, 0x85, + 0x85, 0x85, 0x5C, 0x00, 0x07, 0x84, 0x00, 0x0A, 0x5A, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x52, + 0x85, 0x85, 0x04, 0x84, 0x01, 0x4D, 0x1C, 0x85, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x0F, 0x82, + 0x01, 0x11, 0x01, 0x67, 0x08, 0x85, 0x01, 0x14, 0x0F, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, + 0x05, 0x36, 0x04, 0x85, 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x12, 0x80, + 0x00, 0x05, 0x26, 0x85, 0x85, 0x85, 0x63, 0x00, 0x12, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, + 0x14, 0x85, 0x00, 0x05, 0x4D, 0x84, 0x84, 0x84, 0x4D, 0x00, 0x05, 0x85, 0x00, 0x05, 0x50, 0x84, + 0x84, 0x84, 0x5E, 0x00, 0x05, 0x85, 0x01, 0x4F, 0x04, 0x84, 0x00, 0x03, 0x85, 0x85, 0x4E, 0x00, + 0x04, 0x84, 0x00, 0x07, 0x4E, 0x5C, 0x84, 0x84, 0x84, 0x56, 0x51, 0x00, 0x05, 0x85, 0x01, 0x4F, + 0x04, 0x84, 0x09, 0x85, 0x01, 0x53, 0x07, 0x84, 0x00, 0x08, 0x53, 0x85, 0x85, 0x85, 0x4D, 0x84, + 0x84, 0x4F, 0x11, 0x85, 0x01, 0x52, 0x04, 0x84, 0x00, 0x04, 0x57, 0x85, 0x85, 0x53, 0x04, 0x84, + 0x00, 0x04, 0x4E, 0x85, 0x85, 0x85, 0x04, 0x84, 0x00, 0x05, 0x58, 0x85, 0x85, 0x85, 0x4F, 0x00, + 0x06, 0x84, 0x00, 0x0B, 0x56, 0x51, 0x85, 0x85, 0x57, 0x84, 0x84, 0x84, 0x57, 0x85, 0x85, 0x00, + 0x04, 0x84, 0x01, 0x5A, 0x1C, 0x85, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x10, 0x82, 0x01, 0x11, + 0x01, 0x60, 0x07, 0x85, 0x01, 0x14, 0x0F, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x05, 0x36, + 0x00, 0x04, 0x19, 0x85, 0x85, 0x85, 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, + 0x12, 0x80, 0x00, 0x05, 0x09, 0x16, 0x16, 0x16, 0x24, 0x00, 0x12, 0x80, 0x00, 0x04, 0x2F, 0x30, + 0x22, 0x2D, 0x14, 0x85, 0x01, 0x5A, 0x04, 0x84, 0x05, 0x85, 0x00, 0x05, 0x58, 0x84, 0x84, 0x84, + 0x5D, 0x00, 0x05, 0x85, 0x00, 0x08, 0x4F, 0x84, 0x84, 0x84, 0x4D, 0x85, 0x85, 0x4E, 0x04, 0x84, + 0x00, 0x07, 0x4E, 0x85, 0x4D, 0x84, 0x84, 0x84, 0x4F, 0x00, 0x05, 0x85, 0x01, 0x4F, 0x04, 0x84, + 0x0A, 0x85, 0x06, 0x84, 0x01, 0x58, 0x04, 0x85, 0x00, 0x04, 0x4D, 0x84, 0x84, 0x4F, 0x11, 0x85, + 0x01, 0x4F, 0x04, 0x84, 0x00, 0x04, 0x85, 0x85, 0x85, 0x4E, 0x04, 0x84, 0x00, 0x04, 0x4E, 0x85, + 0x85, 0x85, 0x04, 0x84, 0x00, 0x05, 0x4F, 0x85, 0x85, 0x85, 0x5D, 0x00, 0x06, 0x84, 0x00, 0x0B, + 0x4E, 0x85, 0x85, 0x85, 0x52, 0x84, 0x84, 0x84, 0x85, 0x85, 0x85, 0x00, 0x04, 0x84, 0x01, 0x4D, + 0x1C, 0x85, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x12, 0x82, 0x00, 0x08, 0x11, 0x14, 0x1D, 0x60, + 0x1D, 0x14, 0x2C, 0x64, 0x0F, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x05, 0x36, 0x00, 0x04, + 0x19, 0x85, 0x85, 0x85, 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x29, 0x80, + 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x14, 0x85, 0x01, 0x5C, 0x04, 0x84, 0x01, 0x57, 0x04, 0x85, + 0x01, 0x53, 0x04, 0x84, 0x01, 0x53, 0x04, 0x85, 0x00, 0x08, 0x4F, 0x84, 0x84, 0x84, 0x4D, 0x85, + 0x85, 0x85, 0x04, 0x84, 0x00, 0x03, 0x4F, 0x85, 0x4E, 0x00, 0x04, 0x84, 0x01, 0x53, 0x04, 0x85, + 0x01, 0x52, 0x04, 0x84, 0x01, 0x51, 0x09, 0x85, 0x06, 0x84, 0x01, 0x53, 0x04, 0x85, 0x00, 0x04, + 0x4D, 0x84, 0x84, 0x4F, 0x11, 0x85, 0x01, 0x4F, 0x04, 0x84, 0x00, 0x04, 0x85, 0x85, 0x85, 0x52, + 0x04, 0x84, 0x00, 0x04, 0x53, 0x85, 0x85, 0x4E, 0x04, 0x84, 0x00, 0x05, 0x5C, 0x85, 0x85, 0x85, + 0x4D, 0x00, 0x05, 0x84, 0x01, 0x5A, 0x04, 0x85, 0x00, 0x07, 0x5A, 0x84, 0x84, 0x4D, 0x85, 0x85, + 0x85, 0x00, 0x04, 0x84, 0x01, 0x59, 0x1C, 0x85, 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x29, 0x82, + 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x05, 0x36, 0x00, 0x04, 0x03, 0x85, 0x85, 0x85, 0x00, 0x00, + 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x04, 0x80, 0x00, 0x21, 0x69, 0x09, 0x09, 0x69, + 0x80, 0x80, 0x09, 0x09, 0x80, 0x09, 0x69, 0x80, 0x80, 0x09, 0x09, 0x80, 0x09, 0x09, 0x80, 0x69, + 0x09, 0x69, 0x80, 0x69, 0x09, 0x09, 0x80, 0x80, 0x09, 0x69, 0x80, 0x80, 0x09, 0x00, 0x04, 0x80, + 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x14, 0x85, 0x01, 0x53, 0x04, 0x84, 0x01, 0x52, 0x05, 0x85, + 0x00, 0x05, 0x58, 0x84, 0x84, 0x84, 0x5D, 0x00, 0x04, 0x85, 0x00, 0x08, 0x5D, 0x84, 0x84, 0x84, + 0x5A, 0x85, 0x85, 0x85, 0x04, 0x84, 0x00, 0x08, 0x4F, 0x85, 0x85, 0x58, 0x84, 0x84, 0x84, 0x4D, + 0x04, 0x85, 0x01, 0x4E, 0x04, 0x84, 0x01, 0x4E, 0x09, 0x85, 0x05, 0x84, 0x01, 0x58, 0x05, 0x85, + 0x00, 0x04, 0x4D, 0x84, 0x84, 0x4F, 0x11, 0x85, 0x00, 0x09, 0x58, 0x84, 0x84, 0x84, 0x56, 0x85, + 0x85, 0x85, 0x5D, 0x00, 0x04, 0x84, 0x00, 0x04, 0x85, 0x85, 0x85, 0x5C, 0x04, 0x84, 0x00, 0x04, + 0x57, 0x85, 0x85, 0x85, 0x05, 0x84, 0x01, 0x56, 0x01, 0x51, 0x04, 0x85, 0x00, 0x07, 0x4D, 0x84, + 0x84, 0x5A, 0x85, 0x85, 0x85, 0x00, 0x05, 0x84, 0x01, 0x53, 0x1B, 0x85, 0x00, 0x28, 0x2D, 0x22, + 0x30, 0x5B, 0x82, 0x82, 0x82, 0x11, 0x11, 0x11, 0x82, 0x82, 0x64, 0x11, 0x68, 0x68, 0x11, 0x82, + 0x82, 0x64, 0x11, 0x68, 0x68, 0x11, 0x64, 0x82, 0x11, 0x11, 0x82, 0x82, 0x11, 0x11, 0x68, 0x82, + 0x64, 0x11, 0x82, 0x82, 0x64, 0x68, 0x05, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x05, 0x36, + 0x00, 0x04, 0x05, 0x85, 0x85, 0x85, 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, + 0x04, 0x80, 0x00, 0x21, 0x85, 0x6A, 0x63, 0x85, 0x24, 0x80, 0x61, 0x61, 0x80, 0x6E, 0x26, 0x80, + 0x69, 0x85, 0x26, 0x80, 0x85, 0x61, 0x80, 0x09, 0x85, 0x09, 0x09, 0x63, 0x6E, 0x63, 0x6E, 0x69, + 0x85, 0x09, 0x80, 0x16, 0x85, 0x00, 0x04, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x11, 0x85, + 0x04, 0x4D, 0x04, 0x84, 0x00, 0x07, 0x56, 0x4D, 0x5A, 0x4F, 0x52, 0x85, 0x53, 0x00, 0x04, 0x84, + 0x00, 0x04, 0x58, 0x51, 0x85, 0x52, 0x04, 0x84, 0x00, 0x15, 0x52, 0x85, 0x85, 0x85, 0x4D, 0x84, + 0x84, 0x84, 0x5D, 0x85, 0x85, 0x53, 0x50, 0x84, 0x84, 0x84, 0x5C, 0x85, 0x85, 0x85, 0x4E, 0x00, + 0x04, 0x84, 0x01, 0x5E, 0x06, 0x4E, 0x00, 0x03, 0x53, 0x85, 0x85, 0x00, 0x05, 0x84, 0x01, 0x53, + 0x05, 0x85, 0x00, 0x04, 0x4D, 0x84, 0x84, 0x4F, 0x11, 0x85, 0x00, 0x08, 0x4D, 0x84, 0x84, 0x84, + 0x4D, 0x85, 0x85, 0x52, 0x04, 0x84, 0x00, 0x05, 0x59, 0x85, 0x85, 0x85, 0x4F, 0x00, 0x04, 0x84, + 0x00, 0x04, 0x85, 0x85, 0x85, 0x53, 0x05, 0x84, 0x01, 0x4E, 0x05, 0x85, 0x00, 0x08, 0x50, 0x84, + 0x84, 0x52, 0x85, 0x85, 0x85, 0x4D, 0x04, 0x84, 0x00, 0x08, 0x4D, 0x51, 0x85, 0x85, 0x85, 0x4E, + 0x4D, 0x53, 0x14, 0x85, 0x00, 0x28, 0x2D, 0x22, 0x30, 0x5B, 0x82, 0x82, 0x11, 0x85, 0x74, 0x85, + 0x67, 0x68, 0x11, 0x85, 0x14, 0x11, 0x85, 0x11, 0x82, 0x1D, 0x85, 0x11, 0x14, 0x85, 0x11, 0x82, + 0x60, 0x85, 0x82, 0x1D, 0x85, 0x74, 0x85, 0x14, 0x11, 0x85, 0x82, 0x64, 0x74, 0x14, 0x05, 0x82, + 0x00, 0x03, 0x1F, 0x12, 0x71, 0x00, 0x05, 0x36, 0x00, 0x04, 0x05, 0x85, 0x85, 0x85, 0x00, 0x00, + 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x04, 0x80, 0x00, 0x21, 0x69, 0x80, 0x69, 0x85, + 0x61, 0x80, 0x61, 0x61, 0x80, 0x16, 0x63, 0x61, 0x6E, 0x85, 0x09, 0x80, 0x85, 0x61, 0x80, 0x09, + 0x85, 0x09, 0x77, 0x63, 0x80, 0x24, 0x85, 0x24, 0x85, 0x09, 0x24, 0x85, 0x85, 0x00, 0x04, 0x80, + 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x11, 0x85, 0x01, 0x59, 0x0B, 0x84, 0x00, 0x04, 0x59, 0x85, + 0x85, 0x4F, 0x0B, 0x84, 0x00, 0x15, 0x51, 0x85, 0x85, 0x85, 0x4D, 0x84, 0x84, 0x84, 0x4D, 0x85, + 0x85, 0x85, 0x4F, 0x84, 0x84, 0x84, 0x56, 0x51, 0x85, 0x85, 0x4E, 0x00, 0x0B, 0x84, 0x00, 0x03, + 0x4F, 0x85, 0x85, 0x00, 0x04, 0x84, 0x01, 0x58, 0x06, 0x85, 0x00, 0x04, 0x50, 0x84, 0x84, 0x5E, + 0x11, 0x85, 0x00, 0x07, 0x4D, 0x84, 0x84, 0x84, 0x50, 0x4D, 0x56, 0x00, 0x05, 0x84, 0x00, 0x0D, + 0x5A, 0x85, 0x85, 0x85, 0x5A, 0x84, 0x84, 0x84, 0x56, 0x85, 0x85, 0x85, 0x4E, 0x00, 0x04, 0x84, + 0x01, 0x4F, 0x05, 0x85, 0x00, 0x09, 0x53, 0x84, 0x84, 0x84, 0x57, 0x85, 0x85, 0x85, 0x5A, 0x00, + 0x05, 0x84, 0x00, 0x06, 0x56, 0x5A, 0x5A, 0x59, 0x84, 0x56, 0x15, 0x85, 0x00, 0x28, 0x2D, 0x22, + 0x30, 0x5B, 0x82, 0x82, 0x64, 0x82, 0x82, 0x1D, 0x85, 0x11, 0x11, 0x85, 0x14, 0x82, 0x6D, 0x6D, + 0x60, 0x67, 0x6D, 0x82, 0x14, 0x85, 0x11, 0x82, 0x60, 0x85, 0x68, 0x85, 0x1D, 0x82, 0x60, 0x85, + 0x11, 0x85, 0x82, 0x60, 0x85, 0x14, 0x05, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x18, 0x00, 0x05, 0x05, + 0x00, 0x04, 0x03, 0x85, 0x85, 0x85, 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, + 0x05, 0x80, 0x00, 0x20, 0x26, 0x63, 0x85, 0x16, 0x80, 0x61, 0x61, 0x80, 0x69, 0x85, 0x16, 0x6A, + 0x6A, 0x80, 0x80, 0x85, 0x61, 0x80, 0x09, 0x85, 0x09, 0x61, 0x61, 0x80, 0x09, 0x85, 0x16, 0x85, + 0x16, 0x85, 0x63, 0x85, 0x04, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x11, 0x85, 0x01, 0x58, + 0x0C, 0x84, 0x00, 0x04, 0x85, 0x85, 0x85, 0x4D, 0x09, 0x84, 0x01, 0x58, 0x04, 0x85, 0x00, 0x11, + 0x4F, 0x84, 0x84, 0x84, 0x56, 0x85, 0x85, 0x85, 0x51, 0x56, 0x84, 0x84, 0x84, 0x4F, 0x85, 0x85, + 0x51, 0x00, 0x0B, 0x84, 0x00, 0x03, 0x4F, 0x85, 0x85, 0x00, 0x04, 0x84, 0x01, 0x53, 0x06, 0x85, + 0x00, 0x04, 0x84, 0x84, 0x84, 0x4E, 0x11, 0x85, 0x01, 0x56, 0x0B, 0x84, 0x00, 0x11, 0x53, 0x85, + 0x85, 0x85, 0x4D, 0x84, 0x84, 0x84, 0x4D, 0x85, 0x85, 0x85, 0x4F, 0x84, 0x84, 0x84, 0x59, 0x00, + 0x06, 0x85, 0x00, 0x04, 0x5C, 0x84, 0x84, 0x84, 0x04, 0x85, 0x01, 0x57, 0x0A, 0x84, 0x01, 0x58, + 0x15, 0x85, 0x00, 0x28, 0x2D, 0x22, 0x30, 0x5B, 0x82, 0x82, 0x82, 0x11, 0x74, 0x85, 0x67, 0x68, + 0x11, 0x85, 0x14, 0x82, 0x14, 0x85, 0x14, 0x85, 0x14, 0x82, 0x14, 0x85, 0x11, 0x82, 0x60, 0x85, + 0x11, 0x85, 0x14, 0x82, 0x14, 0x85, 0x11, 0x85, 0x1D, 0x85, 0x85, 0x14, 0x05, 0x82, 0x00, 0x03, + 0x1F, 0x12, 0x48, 0x00, 0x09, 0x85, 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, + 0x04, 0x80, 0x00, 0x21, 0x26, 0x85, 0x61, 0x24, 0x80, 0x80, 0x61, 0x61, 0x80, 0x80, 0x77, 0x6E, + 0x85, 0x16, 0x80, 0x80, 0x85, 0x61, 0x80, 0x09, 0x85, 0x09, 0x61, 0x6A, 0x80, 0x09, 0x85, 0x16, + 0x85, 0x85, 0x6A, 0x24, 0x85, 0x00, 0x04, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x11, 0x85, + 0x01, 0x52, 0x0C, 0x84, 0x00, 0x05, 0x4E, 0x85, 0x85, 0x51, 0x59, 0x00, 0x07, 0x84, 0x01, 0x50, + 0x01, 0x53, 0x04, 0x85, 0x01, 0x4F, 0x04, 0x84, 0x04, 0x85, 0x01, 0x52, 0x04, 0x84, 0x00, 0x03, + 0x53, 0x85, 0x85, 0x00, 0x0B, 0x84, 0x00, 0x07, 0x4F, 0x85, 0x85, 0x84, 0x84, 0x84, 0x5A, 0x00, + 0x07, 0x85, 0x00, 0x04, 0x84, 0x84, 0x84, 0x4E, 0x11, 0x85, 0x0B, 0x84, 0x01, 0x5A, 0x04, 0x85, + 0x00, 0x0D, 0x56, 0x84, 0x84, 0x84, 0x5A, 0x85, 0x85, 0x85, 0x5A, 0x84, 0x84, 0x84, 0x57, 0x00, + 0x06, 0x85, 0x00, 0x04, 0x4F, 0x84, 0x84, 0x4D, 0x05, 0x85, 0x01, 0x4D, 0x09, 0x84, 0x01, 0x52, + 0x15, 0x85, 0x00, 0x28, 0x2D, 0x22, 0x30, 0x5B, 0x82, 0x82, 0x82, 0x67, 0x67, 0x1D, 0x68, 0x82, + 0x11, 0x85, 0x14, 0x82, 0x68, 0x85, 0x6D, 0x85, 0x68, 0x82, 0x14, 0x85, 0x11, 0x82, 0x60, 0x85, + 0x11, 0x85, 0x14, 0x82, 0x1D, 0x85, 0x11, 0x85, 0x85, 0x1D, 0x60, 0x14, 0x05, 0x82, 0x00, 0x03, + 0x1F, 0x12, 0x48, 0x00, 0x09, 0x85, 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, + 0x04, 0x80, 0x00, 0x21, 0x26, 0x85, 0x24, 0x16, 0x24, 0x16, 0x6A, 0x6A, 0x16, 0x69, 0x24, 0x85, + 0x85, 0x69, 0x09, 0x16, 0x85, 0x6A, 0x16, 0x09, 0x85, 0x09, 0x16, 0x85, 0x16, 0x26, 0x85, 0x09, + 0x85, 0x63, 0x09, 0x09, 0x85, 0x00, 0x04, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x11, 0x85, + 0x01, 0x57, 0x0C, 0x84, 0x01, 0x52, 0x04, 0x85, 0x01, 0x4F, 0x05, 0x84, 0x01, 0x50, 0x01, 0x57, + 0x05, 0x85, 0x01, 0x4E, 0x04, 0x84, 0x01, 0x51, 0x04, 0x85, 0x00, 0x07, 0x4D, 0x84, 0x84, 0x84, + 0x4D, 0x85, 0x85, 0x00, 0x0B, 0x84, 0x00, 0x07, 0x4F, 0x85, 0x85, 0x84, 0x84, 0x50, 0x51, 0x00, + 0x07, 0x85, 0x00, 0x04, 0x84, 0x84, 0x84, 0x4E, 0x11, 0x85, 0x0A, 0x84, 0x01, 0x59, 0x01, 0x51, + 0x04, 0x85, 0x04, 0x84, 0x00, 0x08, 0x4F, 0x85, 0x85, 0x85, 0x4D, 0x84, 0x84, 0x4F, 0x07, 0x85, + 0x00, 0x04, 0x4D, 0x84, 0x84, 0x5A, 0x05, 0x85, 0x01, 0x57, 0x01, 0x50, 0x08, 0x84, 0x01, 0x53, + 0x15, 0x85, 0x00, 0x28, 0x2D, 0x22, 0x30, 0x5B, 0x82, 0x82, 0x82, 0x67, 0x6D, 0x2C, 0x14, 0x11, + 0x1D, 0x85, 0x60, 0x2C, 0x82, 0x60, 0x85, 0x70, 0x82, 0x2C, 0x60, 0x85, 0x1D, 0x11, 0x60, 0x85, + 0x82, 0x6D, 0x74, 0x2C, 0x6D, 0x60, 0x11, 0x85, 0x1D, 0x82, 0x60, 0x14, 0x05, 0x82, 0x00, 0x03, + 0x1F, 0x12, 0x48, 0x00, 0x09, 0x85, 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, + 0x04, 0x80, 0x00, 0x05, 0x69, 0x26, 0x61, 0x61, 0x16, 0x00, 0x04, 0x61, 0x00, 0x06, 0x09, 0x80, + 0x61, 0x26, 0x80, 0x24, 0x04, 0x61, 0x00, 0x0E, 0x09, 0x61, 0x09, 0x80, 0x16, 0x61, 0x61, 0x24, + 0x80, 0x61, 0x09, 0x80, 0x09, 0x61, 0x04, 0x80, 0x00, 0x04, 0x2F, 0x30, 0x22, 0x2D, 0x24, 0x85, + 0x00, 0x06, 0x51, 0x52, 0x4F, 0x4F, 0x52, 0x51, 0x06, 0x85, 0x01, 0x51, 0x04, 0x4E, 0x01, 0x51, + 0x04, 0x85, 0x01, 0x53, 0x04, 0x4E, 0x01, 0x85, 0x01, 0x85, 0x04, 0x4E, 0x01, 0x52, 0x06, 0x4F, + 0x00, 0x06, 0x4E, 0x85, 0x85, 0x4F, 0x4F, 0x5C, 0x08, 0x85, 0x00, 0x04, 0x4F, 0x4F, 0x4F, 0x53, + 0x11, 0x85, 0x08, 0x4D, 0x01, 0x5D, 0x01, 0x52, 0x05, 0x85, 0x01, 0x51, 0x04, 0x4D, 0x00, 0x07, + 0x57, 0x85, 0x85, 0x85, 0x50, 0x84, 0x59, 0x00, 0x08, 0x85, 0x00, 0x04, 0x50, 0x84, 0x84, 0x52, + 0x06, 0x85, 0x01, 0x57, 0x01, 0x56, 0x05, 0x84, 0x01, 0x56, 0x01, 0x52, 0x16, 0x85, 0x00, 0x28, + 0x2D, 0x22, 0x30, 0x5B, 0x82, 0x82, 0x82, 0x11, 0x70, 0x60, 0x70, 0x2C, 0x60, 0x60, 0x60, 0x1D, + 0x82, 0x2C, 0x60, 0x2C, 0x82, 0x1D, 0x60, 0x60, 0x60, 0x2C, 0x1D, 0x60, 0x82, 0x11, 0x70, 0x60, + 0x1D, 0x64, 0x11, 0x70, 0x64, 0x82, 0x1D, 0x2C, 0x05, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x48, 0x00, + 0x09, 0x85, 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x29, 0x80, 0x00, 0x04, + 0x2F, 0x30, 0x22, 0x2D, 0x9E, 0x85, 0x00, 0x05, 0x4E, 0x4F, 0x4F, 0x5E, 0x4E, 0x00, 0x18, 0x85, + 0x00, 0x04, 0x2D, 0x22, 0x30, 0x5B, 0x29, 0x82, 0x00, 0x03, 0x1F, 0x12, 0x48, 0x00, 0x09, 0x85, + 0x00, 0x00, 0x08, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x33, 0x00, 0x29, 0x07, 0x00, 0x04, 0x2F, 0x30, + 0x22, 0x2D, 0xBB, 0x85, 0x00, 0x04, 0x2D, 0x22, 0x3A, 0x5B, 0x29, 0x1B, 0x00, 0x03, 0x1F, 0x12, + 0x48, 0x00, 0x09, 0x85, 0x00, 0x00, 0x08, 0x85, 0x01, 0x22, 0x01, 0x1F, 0x2C, 0x30, 0x01, 0x22, + 0x01, 0x2D, 0xBB, 0x85, 0x01, 0x2D, 0x01, 0x22, 0x2C, 0x30, 0x01, 0x12, 0x01, 0x48, 0x09, 0x85, + 0x00, 0x00, 0x08, 0x85, 0x01, 0x4B, 0x01, 0x18, 0x2B, 0x1F, 0x00, 0x03, 0x12, 0x22, 0x36, 0x00, + 0xBB, 0x85, 0x00, 0x03, 0x2D, 0x22, 0x47, 0x00, 0x2A, 0x1F, 0x00, 0x03, 0x39, 0x18, 0x48, 0x00, + 0x09, 0x85, 0x00, 0x00, 0x08, 0x85, 0x01, 0x2D, 0x01, 0x4B, 0x2B, 0x22, 0x01, 0x45, 0x01, 0x20, + 0xBD, 0x85, 0x01, 0x20, 0x01, 0x45, 0x2B, 0x22, 0x01, 0x4B, 0x01, 0x36, 0x09, 0x85, 0x00, 0x00, + 0x1A, 0x85, 0x01, 0x4E, 0x0E, 0x84, 0x01, 0x4D, 0xD4, 0x85, 0x01, 0x53, 0x01, 0x50, 0x0D, 0x84, + 0x01, 0x50, 0x1E, 0x85, 0x00, 0x00, 0x1B, 0x85, 0x01, 0x4D, 0x0E, 0x84, 0x01, 0x5E, 0xD3, 0x85, + 0x01, 0x4D, 0x0E, 0x84, 0x01, 0x4F, 0x1E, 0x85, 0x00, 0x00, 0x1B, 0x85, 0x01, 0x4E, 0x0E, 0x84, + 0x01, 0x50, 0x01, 0x53, 0xD1, 0x85, 0x01, 0x5E, 0x0E, 0x84, 0x01, 0x56, 0x01, 0x51, 0x1E, 0x85, + 0x00, 0x00, 0x1C, 0x85, 0x01, 0x4D, 0x0E, 0x84, 0x01, 0x59, 0xD0, 0x85, 0x01, 0x57, 0x01, 0x50, + 0x0E, 0x84, 0x01, 0x52, 0x1F, 0x85, 0x00, 0x00, 0x1C, 0x85, 0x01, 0x53, 0x0F, 0x84, 0x01, 0x5A, + 0xCE, 0x85, 0x01, 0x51, 0x01, 0x59, 0x0E, 0x84, 0x01, 0x59, 0x20, 0x85, 0x00, 0x00, 0x1D, 0x85, + 0x01, 0x5A, 0x0F, 0x84, 0x01, 0x52, 0xCD, 0x85, 0x01, 0x58, 0x0F, 0x84, 0x01, 0x4E, 0x20, 0x85, + 0x00, 0x00, 0x1D, 0x85, 0x01, 0x51, 0x01, 0x50, 0x0E, 0x84, 0x01, 0x50, 0x01, 0x57, 0xCB, 0x85, + 0x01, 0x4F, 0x0F, 0x84, 0x01, 0x5D, 0x21, 0x85, 0x00, 0x00, 0x1E, 0x85, 0x01, 0x5C, 0x0F, 0x84, + 0x01, 0x50, 0x01, 0x53, 0xC9, 0x85, 0x01, 0x52, 0x0F, 0x84, 0x01, 0x50, 0x01, 0x51, 0x21, 0x85, + 0x00, 0x00, 0x1F, 0x85, 0x01, 0x5D, 0x0F, 0x84, 0x01, 0x59, 0x01, 0x51, 0xC7, 0x85, 0x01, 0x57, + 0x10, 0x84, 0x01, 0x5C, 0x22, 0x85, 0x00, 0x00, 0x1F, 0x85, 0x01, 0x51, 0x01, 0x50, 0x0F, 0x84, + 0x01, 0x59, 0x01, 0x51, 0xC5, 0x85, 0x01, 0x57, 0x01, 0x50, 0x0F, 0x84, 0x01, 0x5D, 0x23, 0x85, + 0x00, 0x00, 0x20, 0x85, 0x01, 0x4E, 0x10, 0x84, 0x01, 0x59, 0x01, 0x51, 0xC3, 0x85, 0x01, 0x57, + 0x01, 0x50, 0x0F, 0x84, 0x01, 0x50, 0x01, 0x51, 0x23, 0x85, 0x00, 0x00, 0x21, 0x85, 0x01, 0x5A, + 0x10, 0x84, 0x01, 0x59, 0x01, 0x51, 0xC1, 0x85, 0x01, 0x57, 0x01, 0x50, 0x10, 0x84, 0x01, 0x4E, + 0x24, 0x85, 0x00, 0x00, 0x22, 0x85, 0x01, 0x59, 0x10, 0x84, 0x01, 0x59, 0x01, 0x51, 0xBF, 0x85, + 0x01, 0x57, 0x01, 0x50, 0x10, 0x84, 0x01, 0x4F, 0x25, 0x85, 0x00, 0x00, 0x22, 0x85, 0x01, 0x51, + 0x01, 0x50, 0x10, 0x84, 0x01, 0x59, 0x01, 0x51, 0xBD, 0x85, 0x01, 0x4E, 0x01, 0x50, 0x10, 0x84, + 0x01, 0x5D, 0x26, 0x85, 0x00, 0x00, 0x23, 0x85, 0x01, 0x57, 0x11, 0x84, 0x01, 0x56, 0x01, 0x57, + 0xBB, 0x85, 0x01, 0x52, 0x11, 0x84, 0x01, 0x59, 0x01, 0x51, 0x26, 0x85, 0x00, 0x00, 0x24, 0x85, + 0x01, 0x52, 0x11, 0x84, 0x01, 0x50, 0x01, 0x4E, 0xB9, 0x85, 0x01, 0x4F, 0x11, 0x84, 0x01, 0x50, + 0x01, 0x53, 0x27, 0x85, 0x00, 0x00, 0x25, 0x85, 0x01, 0x4F, 0x12, 0x84, 0x01, 0x52, 0xB6, 0x85, + 0x01, 0x51, 0x01, 0x58, 0x11, 0x84, 0x01, 0x50, 0x01, 0x57, 0x28, 0x85, 0x00, 0x00, 0x26, 0x85, + 0x01, 0x58, 0x12, 0x84, 0x01, 0x58, 0xB4, 0x85, 0x01, 0x53, 0x01, 0x59, 0x12, 0x84, 0x01, 0x52, + 0x29, 0x85, 0x00, 0x00, 0x27, 0x85, 0x01, 0x58, 0x12, 0x84, 0x01, 0x59, 0x01, 0x53, 0xB1, 0x85, + 0x01, 0x5C, 0x01, 0x50, 0x12, 0x84, 0x01, 0x52, 0x2A, 0x85, 0x00, 0x00, 0x28, 0x85, 0x01, 0x58, + 0x12, 0x84, 0x01, 0x50, 0x01, 0x5C, 0xAF, 0x85, 0x01, 0x5A, 0x13, 0x84, 0x01, 0x52, 0x2B, 0x85, + 0x00, 0x00, 0x29, 0x85, 0x01, 0x58, 0x13, 0x84, 0x01, 0x5A, 0x01, 0x51, 0xAB, 0x85, 0x01, 0x57, + 0x01, 0x59, 0x13, 0x84, 0x01, 0x52, 0x2C, 0x85, 0x00, 0x00, 0x2A, 0x85, 0x01, 0x58, 0x13, 0x84, + 0x01, 0x56, 0x01, 0x4E, 0xA9, 0x85, 0x01, 0x5E, 0x01, 0x50, 0x13, 0x84, 0x01, 0x52, 0x2D, 0x85, + 0x00, 0x00, 0x2B, 0x85, 0x01, 0x58, 0x14, 0x84, 0x01, 0x5A, 0x01, 0x51, 0xA5, 0x85, 0x01, 0x53, + 0x01, 0x4D, 0x14, 0x84, 0x01, 0x52, 0x2E, 0x85, 0x00, 0x00, 0x2C, 0x85, 0x01, 0x58, 0x14, 0x84, + 0x01, 0x56, 0x01, 0x4E, 0xA3, 0x85, 0x01, 0x4F, 0x01, 0x50, 0x13, 0x84, 0x01, 0x50, 0x01, 0x52, + 0x2F, 0x85, 0x00, 0x00, 0x2D, 0x85, 0x01, 0x52, 0x15, 0x84, 0x01, 0x5D, 0x01, 0x53, 0x31, 0x85, + 0x01, 0x0D, 0x3C, 0x4B, 0x01, 0x06, 0x30, 0x85, 0x01, 0x4E, 0x01, 0x59, 0x14, 0x84, 0x01, 0x50, + 0x01, 0x57, 0x30, 0x85, 0x00, 0x00, 0x2E, 0x85, 0x01, 0x52, 0x01, 0x50, 0x14, 0x84, 0x01, 0x50, + 0x01, 0x4F, 0x2F, 0x85, 0x00, 0x03, 0x28, 0x4B, 0x6C, 0x00, 0x3A, 0x0E, 0x00, 0x03, 0x71, 0x4B, + 0x28, 0x00, 0x2D, 0x85, 0x01, 0x53, 0x01, 0x58, 0x15, 0x84, 0x01, 0x59, 0x01, 0x57, 0x31, 0x85, + 0x00, 0x00, 0x2F, 0x85, 0x01, 0x57, 0x01, 0x50, 0x15, 0x84, 0x01, 0x56, 0x01, 0x52, 0x2D, 0x85, + 0x00, 0x03, 0x00, 0x4B, 0x43, 0x00, 0x3A, 0x0A, 0x00, 0x03, 0x43, 0x4B, 0x4A, 0x00, 0x2B, 0x85, + 0x00, 0x03, 0x51, 0x4F, 0x50, 0x00, 0x15, 0x84, 0x01, 0x4D, 0x01, 0x51, 0x32, 0x85, 0x00, 0x00, + 0x30, 0x85, 0x01, 0x51, 0x01, 0x59, 0x16, 0x84, 0x01, 0x4D, 0x01, 0x4E, 0x2B, 0x85, 0x00, 0x04, + 0x28, 0x4B, 0x62, 0x30, 0x05, 0x4C, 0x01, 0x2E, 0x01, 0x30, 0x18, 0x4C, 0x01, 0x2E, 0x01, 0x04, + 0x04, 0x4C, 0x01, 0x39, 0x01, 0x04, 0x07, 0x4C, 0x01, 0x04, 0x01, 0x2E, 0x09, 0x4C, 0x00, 0x03, + 0x30, 0x3F, 0x4A, 0x00, 0x2A, 0x85, 0x01, 0x52, 0x01, 0x50, 0x16, 0x84, 0x01, 0x5A, 0x34, 0x85, + 0x00, 0x00, 0x32, 0x85, 0x01, 0x5A, 0x17, 0x84, 0x01, 0x4D, 0x01, 0x4E, 0x29, 0x85, 0x00, 0x05, + 0x19, 0x4B, 0x2A, 0x30, 0x78, 0x00, 0x04, 0x15, 0x00, 0x03, 0x4A, 0x4C, 0x75, 0x00, 0x17, 0x15, + 0x00, 0x09, 0x01, 0x78, 0x0D, 0x15, 0x15, 0x15, 0x12, 0x39, 0x06, 0x00, 0x05, 0x15, 0x00, 0x03, + 0x21, 0x2E, 0x78, 0x00, 0x08, 0x15, 0x00, 0x04, 0x0A, 0x30, 0x75, 0x06, 0x28, 0x85, 0x01, 0x52, + 0x01, 0x56, 0x16, 0x84, 0x01, 0x50, 0x01, 0x5C, 0x35, 0x85, 0x00, 0x00, 0x33, 0x85, 0x01, 0x5C, + 0x01, 0x50, 0x17, 0x84, 0x01, 0x4D, 0x01, 0x4E, 0x28, 0x85, 0x00, 0x0F, 0x3B, 0x75, 0x30, 0x2A, + 0x62, 0x30, 0x30, 0x32, 0x15, 0x15, 0x23, 0x30, 0x30, 0x30, 0x02, 0x00, 0x0E, 0x30, 0x00, 0x22, + 0x1C, 0x04, 0x30, 0x30, 0x3A, 0x15, 0x15, 0x23, 0x30, 0x30, 0x30, 0x4C, 0x2A, 0x02, 0x30, 0x23, + 0x30, 0x02, 0x30, 0x2E, 0x2E, 0x12, 0x30, 0x30, 0x30, 0x32, 0x32, 0x30, 0x02, 0x30, 0x31, 0x30, + 0x4B, 0x15, 0x26, 0x85, 0x01, 0x52, 0x01, 0x56, 0x17, 0x84, 0x01, 0x59, 0x01, 0x53, 0x36, 0x85, + 0x00, 0x00, 0x34, 0x85, 0x01, 0x53, 0x01, 0x59, 0x18, 0x84, 0x01, 0x4D, 0x01, 0x4E, 0x26, 0x85, + 0x00, 0x3F, 0x37, 0x4B, 0x04, 0x04, 0x39, 0x30, 0x30, 0x30, 0x32, 0x3D, 0x3D, 0x1C, 0x30, 0x04, + 0x1C, 0x04, 0x30, 0x30, 0x04, 0x30, 0x32, 0x30, 0x30, 0x32, 0x30, 0x32, 0x30, 0x32, 0x3A, 0x30, + 0x44, 0x30, 0x32, 0x30, 0x44, 0x44, 0x42, 0x30, 0x30, 0x30, 0x4C, 0x2E, 0x3F, 0x4C, 0x3F, 0x30, + 0x7A, 0x4C, 0x7A, 0x30, 0x12, 0x30, 0x32, 0x30, 0x32, 0x32, 0x30, 0x02, 0x30, 0x4C, 0x02, 0x4B, + 0x1E, 0x00, 0x23, 0x85, 0x00, 0x03, 0x51, 0x5E, 0x56, 0x00, 0x18, 0x84, 0x01, 0x5A, 0x38, 0x85, + 0x00, 0x00, 0x36, 0x85, 0x01, 0x4F, 0x19, 0x84, 0x01, 0x56, 0x01, 0x52, 0x25, 0x85, 0x00, 0x23, + 0x71, 0x4C, 0x30, 0x2A, 0x30, 0x30, 0x1C, 0x02, 0x2E, 0x32, 0x42, 0x3A, 0x1C, 0x1C, 0x1C, 0x04, + 0x3A, 0x1C, 0x32, 0x1C, 0x32, 0x30, 0x32, 0x42, 0x1C, 0x42, 0x3A, 0x04, 0x30, 0x1C, 0x32, 0x1C, + 0x32, 0x30, 0x04, 0x00, 0x04, 0x30, 0x00, 0x17, 0x4C, 0x4C, 0x15, 0x15, 0x23, 0x02, 0x3D, 0x15, + 0x0A, 0x30, 0x3B, 0x30, 0x02, 0x30, 0x32, 0x3A, 0x30, 0x02, 0x30, 0x31, 0x31, 0x4B, 0x03, 0x00, + 0x21, 0x85, 0x00, 0x03, 0x53, 0x4F, 0x50, 0x00, 0x18, 0x84, 0x01, 0x50, 0x01, 0x4E, 0x39, 0x85, + 0x00, 0x00, 0x37, 0x85, 0x01, 0x57, 0x01, 0x59, 0x19, 0x84, 0x00, 0x03, 0x50, 0x5A, 0x53, 0x00, + 0x22, 0x85, 0x00, 0x3D, 0x0D, 0x6C, 0x30, 0x39, 0x30, 0x30, 0x30, 0x02, 0x44, 0x30, 0x04, 0x3A, + 0x42, 0x1C, 0x30, 0x04, 0x3A, 0x32, 0x1C, 0x3A, 0x44, 0x30, 0x04, 0x1C, 0x32, 0x1C, 0x1C, 0x44, + 0x30, 0x32, 0x1C, 0x32, 0x1C, 0x3A, 0x44, 0x30, 0x42, 0x30, 0x30, 0x4C, 0x4C, 0x44, 0x32, 0x27, + 0x32, 0x27, 0x32, 0x49, 0x30, 0x12, 0x30, 0x27, 0x30, 0x44, 0x30, 0x32, 0x04, 0x30, 0x4C, 0x4C, + 0x71, 0x00, 0x20, 0x85, 0x01, 0x4E, 0x01, 0x58, 0x1A, 0x84, 0x01, 0x5D, 0x01, 0x51, 0x3A, 0x85, + 0x00, 0x00, 0x39, 0x85, 0x01, 0x4F, 0x1B, 0x84, 0x01, 0x5D, 0x01, 0x5C, 0x20, 0x85, 0x00, 0x3D, + 0x1E, 0x4B, 0x02, 0x04, 0x31, 0x30, 0x02, 0x1C, 0x02, 0x04, 0x32, 0x23, 0x1C, 0x2E, 0x30, 0x44, + 0x02, 0x32, 0x23, 0x30, 0x27, 0x04, 0x32, 0x02, 0x32, 0x31, 0x1C, 0x27, 0x32, 0x32, 0x2E, 0x32, + 0x3D, 0x30, 0x23, 0x32, 0x1C, 0x30, 0x30, 0x4C, 0x4C, 0x04, 0x30, 0x3D, 0x30, 0x3D, 0x30, 0x39, + 0x30, 0x4C, 0x30, 0x3D, 0x30, 0x1F, 0x30, 0x02, 0x04, 0x62, 0x31, 0x3F, 0x4A, 0x00, 0x1D, 0x85, + 0x00, 0x03, 0x51, 0x5E, 0x56, 0x00, 0x1A, 0x84, 0x01, 0x50, 0x01, 0x5C, 0x3C, 0x85, 0x00, 0x00, + 0x3A, 0x85, 0x01, 0x57, 0x01, 0x4D, 0x1B, 0x84, 0x00, 0x03, 0x56, 0x5A, 0x57, 0x00, 0x1E, 0x85, + 0x00, 0x3C, 0x48, 0x7A, 0x30, 0x12, 0x04, 0x4C, 0x04, 0x04, 0x31, 0x2E, 0x23, 0x04, 0x23, 0x04, + 0x04, 0x23, 0x04, 0x23, 0x73, 0x39, 0x02, 0x04, 0x23, 0x04, 0x73, 0x04, 0x02, 0x02, 0x3D, 0x12, + 0x04, 0x73, 0x04, 0x02, 0x02, 0x04, 0x04, 0x04, 0x47, 0x4C, 0x27, 0x04, 0x39, 0x04, 0x39, 0x04, + 0x39, 0x30, 0x62, 0x30, 0x2E, 0x30, 0x2E, 0x30, 0x04, 0x04, 0x04, 0x62, 0x75, 0x06, 0x1B, 0x85, + 0x01, 0x5C, 0x01, 0x58, 0x1C, 0x84, 0x01, 0x5A, 0x01, 0x51, 0x3D, 0x85, 0x00, 0x00, 0x3C, 0x85, + 0x01, 0x5E, 0x01, 0x50, 0x1C, 0x84, 0x00, 0x03, 0x59, 0x5E, 0x53, 0x00, 0x1B, 0x85, 0x00, 0x2F, + 0x06, 0x71, 0x2E, 0x0D, 0x62, 0x1F, 0x2A, 0x2E, 0x31, 0x47, 0x62, 0x3B, 0x62, 0x73, 0x02, 0x62, + 0x12, 0x62, 0x47, 0x3B, 0x62, 0x47, 0x62, 0x1F, 0x73, 0x62, 0x3B, 0x62, 0x49, 0x7A, 0x62, 0x47, + 0x62, 0x1F, 0x1F, 0x62, 0x47, 0x62, 0x7A, 0x7A, 0x2E, 0x44, 0x4C, 0x62, 0x12, 0x62, 0x7A, 0x00, + 0x0B, 0x2E, 0x01, 0x4B, 0x01, 0x15, 0x18, 0x85, 0x00, 0x03, 0x57, 0x5A, 0x56, 0x00, 0x1C, 0x84, + 0x01, 0x59, 0x01, 0x4E, 0x3F, 0x85, 0x00, 0x00, 0x3D, 0x85, 0x01, 0x51, 0x01, 0x58, 0x1E, 0x84, + 0x00, 0x03, 0x59, 0x5E, 0x53, 0x00, 0x18, 0x85, 0x01, 0x19, 0x01, 0x4A, 0x38, 0x4B, 0x01, 0x3B, + 0x01, 0x19, 0x15, 0x85, 0x00, 0x03, 0x57, 0x5A, 0x56, 0x00, 0x1D, 0x84, 0x01, 0x50, 0x01, 0x5E, + 0x41, 0x85, 0x00, 0x00, 0x3F, 0x85, 0x01, 0x57, 0x01, 0x4D, 0x1F, 0x84, 0x00, 0x03, 0x59, 0x4F, + 0x57, 0x00, 0x18, 0x85, 0x00, 0x2C, 0x02, 0x00, 0x49, 0x36, 0x03, 0x03, 0x15, 0x00, 0x15, 0x06, + 0x00, 0x49, 0x49, 0x49, 0x4B, 0x47, 0x49, 0x78, 0x47, 0x78, 0x78, 0x7A, 0x78, 0x7A, 0x78, 0x47, + 0x2A, 0x78, 0x47, 0x78, 0x7A, 0x7A, 0x78, 0x47, 0x78, 0x47, 0x46, 0x12, 0x06, 0x00, 0x06, 0x49, + 0x06, 0x37, 0x0B, 0x03, 0x01, 0x19, 0x13, 0x85, 0x00, 0x03, 0x5C, 0x5A, 0x56, 0x00, 0x1F, 0x84, + 0x01, 0x5A, 0x01, 0x51, 0x42, 0x85, 0x00, 0x00, 0x41, 0x85, 0x01, 0x4E, 0x01, 0x56, 0x20, 0x84, + 0x00, 0x04, 0x56, 0x58, 0x5C, 0x51, 0x17, 0x85, 0x0A, 0x2D, 0x01, 0x00, 0x01, 0x46, 0x15, 0x49, + 0x00, 0x03, 0x18, 0x0D, 0x23, 0x00, 0x09, 0x2D, 0x01, 0x19, 0x16, 0x85, 0x00, 0x03, 0x53, 0x5E, + 0x5D, 0x00, 0x21, 0x84, 0x01, 0x58, 0x01, 0x53, 0x44, 0x85, 0x00, 0x00, 0x43, 0x85, 0x01, 0x52, + 0x01, 0x56, 0x22, 0x84, 0x00, 0x04, 0x59, 0x5A, 0x5C, 0x51, 0x12, 0x85, 0x01, 0x48, 0x2D, 0x22, + 0x01, 0x46, 0x12, 0x85, 0x00, 0x04, 0x53, 0x52, 0x58, 0x56, 0x22, 0x84, 0x01, 0x4D, 0x01, 0x4E, + 0x46, 0x85, 0x00, 0x00, 0x45, 0x85, 0x01, 0x52, 0x01, 0x56, 0x24, 0x84, 0x00, 0x04, 0x59, 0x5A, + 0x52, 0x53, 0x0E, 0x85, 0x01, 0x22, 0x01, 0x39, 0x2B, 0x30, 0x00, 0x04, 0x44, 0x22, 0x00, 0x19, + 0x0C, 0x85, 0x00, 0x04, 0x57, 0x5E, 0x58, 0x56, 0x24, 0x84, 0x01, 0x4D, 0x01, 0x4E, 0x48, 0x85, + 0x00, 0x00, 0x47, 0x85, 0x01, 0x52, 0x01, 0x56, 0x26, 0x84, 0x00, 0x05, 0x50, 0x4D, 0x4F, 0x5C, + 0x53, 0x00, 0x09, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x7B, 0x00, 0x29, 0x54, 0x00, 0x05, 0x7B, 0x30, + 0x22, 0x00, 0x05, 0x00, 0x07, 0x85, 0x00, 0x04, 0x57, 0x52, 0x5A, 0x4D, 0x27, 0x84, 0x01, 0x4D, + 0x01, 0x4E, 0x4A, 0x85, 0x00, 0x00, 0x49, 0x85, 0x01, 0x52, 0x01, 0x59, 0x2A, 0x84, 0x00, 0x0B, + 0x4D, 0x58, 0x4F, 0x4E, 0x53, 0x85, 0x85, 0x85, 0x22, 0x1F, 0x54, 0x00, 0x29, 0x81, 0x00, 0x0B, + 0x54, 0x30, 0x22, 0x15, 0x36, 0x85, 0x4E, 0x5C, 0x4F, 0x5D, 0x59, 0x00, 0x2A, 0x84, 0x01, 0x58, + 0x01, 0x57, 0x4C, 0x85, 0x00, 0x00, 0x4B, 0x85, 0x01, 0x4E, 0x01, 0x5D, 0x2E, 0x84, 0x00, 0x05, + 0x59, 0x4D, 0x22, 0x1F, 0x54, 0x00, 0x29, 0x81, 0x00, 0x06, 0x54, 0x30, 0x22, 0x2F, 0x29, 0x3C, + 0x2C, 0x84, 0x00, 0x03, 0x50, 0x5A, 0x53, 0x00, 0x4E, 0x85, 0x00, 0x00, 0x4D, 0x85, 0x00, 0x03, + 0x53, 0x5A, 0x50, 0x00, 0x2D, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x01, 0x25, + 0x07, 0x17, 0x01, 0x08, 0x01, 0x66, 0x11, 0x81, 0x00, 0x06, 0x54, 0x30, 0x22, 0x2F, 0x29, 0x3C, + 0x2A, 0x84, 0x00, 0x03, 0x56, 0x52, 0x51, 0x00, 0x50, 0x85, 0x00, 0x00, 0x50, 0x85, 0x01, 0x52, + 0x01, 0x4D, 0x2B, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x01, 0x08, 0x09, 0x85, + 0x01, 0x5F, 0x01, 0x66, 0x0F, 0x81, 0x00, 0x06, 0x54, 0x30, 0x22, 0x2F, 0x29, 0x41, 0x28, 0x84, + 0x01, 0x58, 0x01, 0x4E, 0x53, 0x85, 0x00, 0x00, 0x52, 0x85, 0x00, 0x03, 0x53, 0x5A, 0x56, 0x00, + 0x28, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x01, 0x08, 0x0A, 0x85, 0x01, 0x65, + 0x01, 0x25, 0x0E, 0x81, 0x00, 0x06, 0x54, 0x30, 0x22, 0x2F, 0x29, 0x41, 0x25, 0x84, 0x00, 0x03, + 0x59, 0x5E, 0x51, 0x00, 0x55, 0x85, 0x00, 0x00, 0x55, 0x85, 0x00, 0x03, 0x5C, 0x58, 0x50, 0x00, + 0x25, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x00, 0x08, 0x08, 0x85, 0x85, 0x85, + 0x76, 0x17, 0x17, 0x13, 0x04, 0x85, 0x01, 0x5F, 0x0E, 0x81, 0x00, 0x06, 0x54, 0x30, 0x22, 0x2F, + 0x29, 0x29, 0x22, 0x84, 0x00, 0x03, 0x56, 0x5A, 0x53, 0x00, 0x58, 0x85, 0x00, 0x00, 0x58, 0x85, + 0x01, 0x52, 0x01, 0x5D, 0x23, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x00, 0x09, + 0x08, 0x85, 0x85, 0x85, 0x5F, 0x81, 0x81, 0x81, 0x17, 0x00, 0x04, 0x85, 0x01, 0x25, 0x0D, 0x81, + 0x00, 0x06, 0x54, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x1F, 0x84, 0x00, 0x03, 0x56, 0x5A, 0x57, 0x00, + 0x5B, 0x85, 0x00, 0x00, 0x5A, 0x85, 0x00, 0x04, 0x51, 0x5C, 0x58, 0x50, 0x1F, 0x84, 0x00, 0x03, + 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x00, 0x05, 0x08, 0x85, 0x85, 0x85, 0x5F, 0x00, 0x04, 0x81, + 0x04, 0x85, 0x01, 0x08, 0x0D, 0x81, 0x00, 0x07, 0x54, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x3C, 0x00, + 0x1B, 0x84, 0x00, 0x03, 0x56, 0x5A, 0x57, 0x00, 0x5E, 0x85, 0x00, 0x00, 0x5E, 0x85, 0x00, 0x03, + 0x4E, 0x5A, 0x59, 0x00, 0x1C, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x00, 0x05, + 0x08, 0x85, 0x85, 0x85, 0x5F, 0x00, 0x04, 0x81, 0x00, 0x05, 0x5F, 0x85, 0x85, 0x85, 0x08, 0x00, + 0x0D, 0x81, 0x00, 0x07, 0x54, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x41, 0x00, 0x18, 0x84, 0x00, 0x03, + 0x4D, 0x5E, 0x53, 0x00, 0x61, 0x85, 0x00, 0x00, 0x61, 0x85, 0x00, 0x04, 0x53, 0x52, 0x58, 0x50, + 0x18, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x00, 0x05, 0x08, 0x85, 0x85, 0x85, + 0x5F, 0x00, 0x04, 0x81, 0x04, 0x85, 0x01, 0x08, 0x0D, 0x81, 0x00, 0x07, 0x54, 0x30, 0x22, 0x2F, + 0x29, 0x29, 0x41, 0x00, 0x14, 0x84, 0x00, 0x04, 0x59, 0x5A, 0x5C, 0x51, 0x64, 0x85, 0x00, 0x00, + 0x65, 0x85, 0x00, 0x04, 0x57, 0x5E, 0x5D, 0x56, 0x14, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, + 0x0E, 0x81, 0x00, 0x0E, 0x08, 0x85, 0x85, 0x85, 0x5F, 0x81, 0x81, 0x81, 0x13, 0x85, 0x85, 0x85, + 0x65, 0x66, 0x0D, 0x81, 0x00, 0x07, 0x54, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x29, 0x00, 0x10, 0x84, + 0x00, 0x04, 0x59, 0x5A, 0x5C, 0x53, 0x68, 0x85, 0x00, 0x00, 0x69, 0x85, 0x00, 0x04, 0x53, 0x52, + 0x5A, 0x4D, 0x10, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x00, 0x08, 0x08, 0x85, + 0x85, 0x85, 0x76, 0x17, 0x13, 0x72, 0x04, 0x85, 0x01, 0x17, 0x0E, 0x81, 0x00, 0x07, 0x54, 0x30, + 0x22, 0x2F, 0x29, 0x29, 0x29, 0x00, 0x0B, 0x84, 0x00, 0x05, 0x50, 0x4D, 0x4F, 0x4E, 0x51, 0x00, + 0x6C, 0x85, 0x00, 0x00, 0x6E, 0x85, 0x00, 0x05, 0x57, 0x52, 0x5A, 0x4D, 0x50, 0x00, 0x0A, 0x84, + 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x01, 0x08, 0x0A, 0x85, 0x01, 0x13, 0x0F, 0x81, + 0x00, 0x08, 0x54, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x29, 0x3C, 0x05, 0x84, 0x00, 0x05, 0x56, 0x4D, + 0x4F, 0x5C, 0x53, 0x00, 0x71, 0x85, 0x00, 0x00, 0x73, 0x85, 0x00, 0x06, 0x53, 0x4E, 0x5E, 0x5A, + 0x4D, 0x56, 0x04, 0x84, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x01, 0x08, 0x09, 0x85, + 0x01, 0x17, 0x10, 0x81, 0x00, 0x0C, 0x54, 0x30, 0x22, 0x2F, 0x29, 0x29, 0x29, 0x7F, 0x4D, 0x4F, + 0x52, 0x4E, 0x77, 0x85, 0x00, 0x00, 0x7A, 0x85, 0x00, 0x06, 0x57, 0x4E, 0x5E, 0x22, 0x1F, 0x54, + 0x0E, 0x81, 0x00, 0x0C, 0x08, 0x85, 0x85, 0x85, 0x5F, 0x81, 0x66, 0x17, 0x85, 0x85, 0x85, 0x17, + 0x0F, 0x81, 0x00, 0x08, 0x54, 0x30, 0x22, 0x33, 0x3E, 0x2D, 0x36, 0x03, 0x7B, 0x85, 0x00, 0x00, + 0x7D, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x00, 0x0C, 0x08, 0x85, 0x85, 0x85, + 0x5F, 0x81, 0x81, 0x81, 0x85, 0x85, 0x85, 0x65, 0x0F, 0x81, 0x00, 0x08, 0x54, 0x30, 0x22, 0x00, + 0x36, 0x36, 0x36, 0x05, 0x7B, 0x85, 0x00, 0x00, 0x7D, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, + 0x0E, 0x81, 0x00, 0x08, 0x08, 0x85, 0x85, 0x85, 0x5F, 0x81, 0x81, 0x66, 0x04, 0x85, 0x0F, 0x81, + 0x00, 0x04, 0x54, 0x30, 0x22, 0x15, 0x04, 0x36, 0x7B, 0x85, 0x00, 0x00, 0x7D, 0x85, 0x00, 0x03, + 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x00, 0x08, 0x08, 0x85, 0x85, 0x85, 0x72, 0x08, 0x08, 0x5F, + 0x04, 0x85, 0x0F, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x00, 0x04, 0x36, 0x01, 0x35, 0x7A, 0x85, + 0x00, 0x00, 0x7D, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x01, 0x08, 0x0A, 0x85, + 0x01, 0x5F, 0x0F, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x00, 0x04, 0x36, 0x01, 0x19, 0x7A, 0x85, + 0x00, 0x00, 0x7D, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x01, 0x08, 0x09, 0x85, + 0x01, 0x72, 0x01, 0x66, 0x0F, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x15, 0x04, 0x36, 0x01, 0x03, + 0x7A, 0x85, 0x00, 0x00, 0x7D, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x0E, 0x81, 0x01, 0x25, + 0x07, 0x17, 0x01, 0x08, 0x01, 0x25, 0x11, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x00, 0x04, 0x36, + 0x01, 0x03, 0x7A, 0x85, 0x00, 0x00, 0x7D, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x29, 0x81, + 0x00, 0x04, 0x54, 0x30, 0x22, 0x00, 0x04, 0x36, 0x01, 0x05, 0x7A, 0x85, 0x00, 0x00, 0x7D, 0x85, + 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x04, 0x81, 0x00, 0x21, 0x25, 0x08, 0x08, 0x66, 0x81, 0x81, + 0x08, 0x25, 0x81, 0x08, 0x66, 0x81, 0x81, 0x08, 0x25, 0x81, 0x08, 0x25, 0x81, 0x25, 0x08, 0x66, + 0x81, 0x66, 0x08, 0x25, 0x81, 0x81, 0x08, 0x66, 0x81, 0x81, 0x08, 0x00, 0x04, 0x81, 0x00, 0x04, + 0x54, 0x30, 0x22, 0x15, 0x05, 0x36, 0x7A, 0x85, 0x00, 0x00, 0x7D, 0x85, 0x00, 0x03, 0x22, 0x1F, + 0x54, 0x00, 0x04, 0x81, 0x00, 0x21, 0x85, 0x85, 0x85, 0x65, 0x08, 0x81, 0x85, 0x5F, 0x81, 0x65, + 0x13, 0x81, 0x25, 0x85, 0x13, 0x81, 0x85, 0x17, 0x81, 0x17, 0x85, 0x08, 0x08, 0x65, 0x76, 0x85, + 0x13, 0x81, 0x85, 0x08, 0x81, 0x13, 0x85, 0x00, 0x04, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x00, + 0x05, 0x36, 0x01, 0x19, 0x79, 0x85, 0x00, 0x00, 0x7D, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, + 0x04, 0x81, 0x00, 0x21, 0x25, 0x81, 0x25, 0x85, 0x5F, 0x81, 0x85, 0x5F, 0x81, 0x13, 0x65, 0x5F, + 0x76, 0x85, 0x25, 0x81, 0x85, 0x17, 0x81, 0x17, 0x85, 0x08, 0x72, 0x76, 0x81, 0x17, 0x85, 0x08, + 0x85, 0x08, 0x08, 0x85, 0x85, 0x00, 0x04, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x0C, 0x05, 0x05, + 0x01, 0x35, 0x79, 0x85, 0x00, 0x00, 0x7D, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x04, 0x81, + 0x00, 0x21, 0x66, 0x13, 0x65, 0x85, 0x17, 0x81, 0x85, 0x5F, 0x81, 0x25, 0x85, 0x17, 0x65, 0x72, + 0x81, 0x81, 0x85, 0x17, 0x81, 0x17, 0x85, 0x08, 0x85, 0x5F, 0x81, 0x08, 0x85, 0x17, 0x85, 0x13, + 0x85, 0x65, 0x85, 0x00, 0x04, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x2D, 0x7F, 0x85, 0x00, 0x00, + 0x7D, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x04, 0x81, 0x00, 0x21, 0x13, 0x85, 0x5F, 0x08, + 0x81, 0x81, 0x85, 0x5F, 0x81, 0x81, 0x76, 0x72, 0x85, 0x08, 0x81, 0x81, 0x85, 0x17, 0x81, 0x17, + 0x85, 0x08, 0x65, 0x5F, 0x81, 0x08, 0x85, 0x17, 0x85, 0x85, 0x72, 0x08, 0x85, 0x00, 0x04, 0x81, + 0x00, 0x04, 0x54, 0x30, 0x22, 0x2D, 0x7F, 0x85, 0x00, 0x00, 0x7D, 0x85, 0x00, 0x03, 0x22, 0x1F, + 0x54, 0x00, 0x04, 0x81, 0x00, 0x21, 0x5F, 0x85, 0x08, 0x17, 0x25, 0x08, 0x85, 0x72, 0x08, 0x81, + 0x17, 0x85, 0x85, 0x66, 0x25, 0x08, 0x85, 0x13, 0x08, 0x17, 0x85, 0x08, 0x13, 0x65, 0x08, 0x5F, + 0x85, 0x25, 0x85, 0x65, 0x25, 0x08, 0x85, 0x00, 0x04, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x2D, + 0x7F, 0x85, 0x00, 0x00, 0x7D, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x04, 0x81, 0x00, 0x05, + 0x25, 0x5F, 0x5F, 0x5F, 0x08, 0x00, 0x04, 0x5F, 0x00, 0x06, 0x81, 0x25, 0x5F, 0x17, 0x81, 0x08, + 0x04, 0x5F, 0x00, 0x0E, 0x08, 0x5F, 0x25, 0x66, 0x13, 0x5F, 0x5F, 0x08, 0x81, 0x5F, 0x25, 0x81, + 0x25, 0x5F, 0x04, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x2D, 0x7F, 0x85, 0x00, 0x00, 0x7D, 0x85, + 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x29, 0x81, 0x00, 0x04, 0x54, 0x30, 0x22, 0x2D, 0x7F, 0x85, + 0x00, 0x00, 0x7D, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x54, 0x00, 0x29, 0x81, 0x00, 0x04, 0x54, 0x30, + 0x22, 0x2D, 0x7F, 0x85, 0x00, 0x00, 0x7D, 0x85, 0x00, 0x03, 0x22, 0x1F, 0x44, 0x00, 0x29, 0x1F, + 0x00, 0x04, 0x44, 0x30, 0x22, 0x2D, 0x7F, 0x85, 0x00, 0x00, 0x7D, 0x85, 0x01, 0x22, 0x01, 0x01, + 0x2B, 0x1F, 0x00, 0x03, 0x3F, 0x22, 0x03, 0x00, 0x7F, 0x85, 0x00, 0x00, 0x7D, 0x85, 0x01, 0x15, + 0x01, 0x45, 0x2C, 0x22, 0x01, 0x21, 0x80, 0x85, 0x00, 0x00, 0xFF, 0x85, 0x2D, 0x85, 0x00, 0x00, + 0xFF, 0x85, 0x2D, 0x85, 0x00, 0x00, 0xFF, 0x85, 0x2D, 0x85, 0x00, 0x01, +}; + +#ifdef ROMFS_DIRENTRY_HEAD + static const ROMFS_DIRENTRY token_w_dir = { 0, 0, ROMFS_DIRENTRY_HEAD, "token_w.bmp", 14620, token_w }; + #undef ROMFS_DIRENTRY_HEAD + #define ROMFS_DIRENTRY_HEAD &token_w_dir +#endif diff --git a/resources_manager.c b/resources_manager.c new file mode 100644 index 0000000..ff3bf2a --- /dev/null +++ b/resources_manager.c @@ -0,0 +1,52 @@ +#include "resources_manager.h" + +typedef struct ImageInfo { + gdispImage* pointer; + const char* filePath; +} ImageInfo; + +gdispImage imgtoken; +gdispImage imgtoken_w; + +static ImageInfo _imagesArray[2]; +static font_t _fontsArray[2]; + +bool_t guiResourcesManagerInit(void) +{ + size_t i; + + // Fill images array + _imagesArray[0].pointer = &imgtoken; + _imagesArray[0].filePath = "token.bmp"; + _imagesArray[1].pointer = &imgtoken_w; + _imagesArray[1].filePath = "token_w.bmp"; + + // Open images + for (i = 0; i < 2; i++) { + gdispImageOpenFile(gstudioGetImage(i), gstudioGetImageFilePath(i)); + } + + // Cache images + + // Open fonts + _fontsArray[0] = gdispOpenFont("arial_12_arial12_aa"); + _fontsArray[1] = gdispOpenFont("arial__14_arial14_aa"); + + return TRUE; +} + +GFXINLINE gdispImage* gstudioGetImage(int imageIndex) +{ + return _imagesArray[imageIndex].pointer; +} + +GFXINLINE const char* gstudioGetImageFilePath(int imageIndex) +{ + return _imagesArray[imageIndex].filePath; +} + +GFXINLINE font_t gstudioGetFont(int fontIndex) +{ + return _fontsArray[fontIndex]; +} + diff --git a/resources_manager.h b/resources_manager.h new file mode 100644 index 0000000..25f3cea --- /dev/null +++ b/resources_manager.h @@ -0,0 +1,27 @@ +#ifndef _RESOURCES_MANAGER_H +#define _RESOURCES_MANAGER_H + +#include "gfx.h" + +// Image indexes +#define token 0 +#define token_w 1 + +// Font indexes +#define arial_12 0 +#define arial__14 1 + +#ifdef __cplusplus +extern "C" { +#endif + + bool_t guiResourcesManagerInit(void); + gdispImage* gstudioGetImage(int imageIndex); + const char* gstudioGetImageFilePath(int imageIndex); + font_t gstudioGetFont(int fontIndex); + +#ifdef __cplusplus +} +#endif + +#endif // _RESOURCES_MANAGER_H diff --git a/romfs_files.h b/romfs_files.h new file mode 100644 index 0000000..ff3d0e6 --- /dev/null +++ b/romfs_files.h @@ -0,0 +1,7 @@ +#ifndef _ROMFS_FILES_H +#define _ROMFS_FILES_H + +#include "resources/token.h" +#include "resources/token_w.h" + +#endif // _ROMFS_FILES_H diff --git a/sai.c b/sai.c new file mode 100644 index 0000000..68ce85c --- /dev/null +++ b/sai.c @@ -0,0 +1,143 @@ +/** + ****************************************************************************** + * File Name : SAI.c + * Description : This file provides code for the configuration + * of the SAI instances. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "sai.h" + + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +SAI_HandleTypeDef hsai_BlockA2; + +/* SAI2 init function */ +void MX_SAI2_Init(void) +{ + + hsai_BlockA2.Instance = SAI2_Block_A; + hsai_BlockA2.Init.AudioMode = SAI_MODEMASTER_TX; + hsai_BlockA2.Init.Synchro = SAI_ASYNCHRONOUS; + hsai_BlockA2.Init.OutputDrive = SAI_OUTPUTDRIVE_DISABLE; + hsai_BlockA2.Init.NoDivider = SAI_MASTERDIVIDER_ENABLE; + hsai_BlockA2.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_EMPTY; + hsai_BlockA2.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_8K; + hsai_BlockA2.Init.SynchroExt = SAI_SYNCEXT_DISABLE; + hsai_BlockA2.Init.MonoStereoMode = SAI_STEREOMODE; + hsai_BlockA2.Init.CompandingMode = SAI_NOCOMPANDING; + hsai_BlockA2.Init.TriState = SAI_OUTPUT_NOTRELEASED; + if (HAL_SAI_InitProtocol(&hsai_BlockA2, SAI_I2S_STANDARD, SAI_PROTOCOL_DATASIZE_16BIT, 2) != HAL_OK) + { + for(;;){} + } + +} +static uint32_t SAI2_client =0; + +void HAL_SAI_MspInit(SAI_HandleTypeDef* hsai) +{ + + GPIO_InitTypeDef GPIO_InitStruct; +/* SAI2 */ + if(hsai->Instance==SAI2_Block_A) + { + /* SAI2 clock enable */ + if (SAI2_client == 0) + { + __HAL_RCC_SAI2_CLK_ENABLE(); + } + SAI2_client ++; + + /**SAI2_A_Block_A GPIO Configuration + PE0 ------> SAI2_MCLK_A + PI5 ------> SAI2_SCK_A + PI7 ------> SAI2_FS_A + PI6 ------> SAI2_SD_A + */ + GPIO_InitStruct.Pin = GPIO_PIN_0; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF10_SAI2; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7|GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF10_SAI2; + HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); + + } +} + +void HAL_SAI_MspDeInit(SAI_HandleTypeDef* hsai) +{ + +/* SAI2 */ + if(hsai->Instance==SAI2_Block_A) + { + SAI2_client --; + if (SAI2_client == 0) + { + /* Peripheral clock disable */ + __HAL_RCC_SAI2_CLK_DISABLE(); + } + + /**SAI2_A_Block_A GPIO Configuration + PE0 ------> SAI2_MCLK_A + PI5 ------> SAI2_SCK_A + PI7 ------> SAI2_FS_A + PI6 ------> SAI2_SD_A + */ + HAL_GPIO_DeInit(GPIOE, GPIO_PIN_0); + + HAL_GPIO_DeInit(GPIOI, GPIO_PIN_5|GPIO_PIN_7|GPIO_PIN_6); + + } +} + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/sai.h b/sai.h new file mode 100644 index 0000000..99a13a4 --- /dev/null +++ b/sai.h @@ -0,0 +1,81 @@ +/** + ****************************************************************************** + * File Name : SAI.h + * Description : This file provides code for the configuration + * of the SAI instances. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __sai_H +#define __sai_H +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f7xx_hal.h" +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern SAI_HandleTypeDef hsai_BlockA2; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +extern void _Error_Handler(char *, int); + +void MX_SAI2_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif +#endif /*__ sai_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/time_receiver.c b/time_receiver.c new file mode 100644 index 0000000..0ab4e3c --- /dev/null +++ b/time_receiver.c @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////////////// +/// \file time_receiver.c +/// \brief Time receiver thread +/// \author Pascal Sartoretti (sap at hevs dot ch) +/// \version 1.0 - original +/// \date 2018-02 +////////////////////////////////////////////////////////////////////////////////// +#include "stm32f7xx_hal.h" + +#include +#include +#include "main.h" + + +////////////////////////////////////////////////////////////////////////////////// +// THREAD TIME RECEIVER +////////////////////////////////////////////////////////////////////////////////// +void TimeReceiver(void *argument) +{ + struct queueMsg_t queueMsg; // queue message + osStatus_t retCode; // return error code + + //------------------------------------------------------------------------------ + for (;;) // loop until doomsday + { + //---------------------------------------------------------------------------- + // QUEUE READ + //---------------------------------------------------------------------------- + retCode = osMessageQueueGet( + queue_timeR_id, + &queueMsg, + NULL, + osWaitForever); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + queueMsg.type = TIME_MSG; + //---------------------------------------------------------------------------- + // QUEUE SEND (send the time message on LCD) + //---------------------------------------------------------------------------- + retCode = osMessageQueuePut( + queue_lcd_id, + &queueMsg, + osPriorityNormal, + osWaitForever); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + } +} + + diff --git a/time_sender.c b/time_sender.c new file mode 100644 index 0000000..94993b6 --- /dev/null +++ b/time_sender.c @@ -0,0 +1,77 @@ +////////////////////////////////////////////////////////////////////////////////// +/// \file time_sender.c +/// \brief Time sender thread +/// \author Pascal Sartoretti (sap at hevs dot ch) +/// \version 1.0 - original +/// \date 2018-02 +////////////////////////////////////////////////////////////////////////////////// +#include "stm32f7xx_hal.h" + +#include +#include +#include +#include "main.h" +#include "rtx_os.h" +extern void *osRtxMemoryAlloc(void *mem, uint32_t size, uint32_t type); +extern uint32_t osRtxMemoryFree (void *mem, void *block); + +////////////////////////////////////////////////////////////////////////////////// +// THREAD TIME SENDER +////////////////////////////////////////////////////////////////////////////////// +void TimeSender(void *argument) +{ + struct queueMsg_t queueMsg; // queue message + char * stringPtr; // string to send pointer + time_t seconds; // current time in seconds + struct tm timeStr; // current time in structure + struct tm * ptrTm; // pointer to it + int32_t eventFlag; // event flag for check + osStatus_t retCode; // return code error + //------------------------------------------------------------------------------ + // initial time and date set + //------------------------------------------------------------------------------ + timeStr.tm_hour = 12; + timeStr.tm_min = 00; + timeStr.tm_sec = 00; + timeStr.tm_year = 2024 - 1900; // years since 1900 + timeStr.tm_mon = 5; // month (0-11) 6-> june + timeStr.tm_mday = 1; + seconds = mktime(&timeStr); + + //------------------------------------------------------------------------------ + for (;;) // loop until doomsday + { + osDelay(1000); // wake-up each second + seconds++; // increment seconds + //---------------------------------------------------------------------------- + // EVENT FLAG WAIT for checked box without to clear it and no wait + //---------------------------------------------------------------------------- + eventFlag = osEventFlagsWait( + eventFlag_id, + BROADCAST_TIME_EVT, + osFlagsWaitAny | osFlagsNoClear, + 0); + + if((eventFlag & BROADCAST_TIME_EVT) == BROADCAST_TIME_EVT) // want to send time ? + { + ptrTm = localtime(&seconds); + + stringPtr = osMemoryPoolAlloc(memPool,osWaitForever); + queueMsg.type = DATA_IND; // prepare message + queueMsg.anyPtr = stringPtr; + queueMsg.sapi = TIME_SAPI; + queueMsg.addr = BROADCAST_ADDRESS; // of type broadcast + sprintf((char*)stringPtr," %02d:%02d:%02d ", + ptrTm->tm_hour,ptrTm->tm_min,ptrTm->tm_sec); + //------------------------------------------------------------------------ + // QUEUE SEND + //------------------------------------------------------------------------ + retCode = osMessageQueuePut( + queue_macS_id, + &queueMsg, + osPriorityNormal, + osWaitForever); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + } + } +} diff --git a/tokenring_project.uvoptx b/tokenring_project.uvoptx new file mode 100644 index 0000000..16afe57 --- /dev/null +++ b/tokenring_project.uvoptx @@ -0,0 +1,510 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + Target 1 + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\Listings\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + EVENTREC_CNF + -l0 -a1 -s0 -f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(6017=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(6016=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + (105=-1,-1,-1,-1,0) + + + 0 + ST-LINKIII-KEIL_SWO + -U0671FF485057775187193017 -O8398 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP (ARM Core") -D00(5BA02477) -L00(0) -TO131075 -TC216000000 -TT216000000 -TP21 -TDS806B -TDT0 -TDC1F -TIE1 -TIP1 -FO7 -FD20010000 -FC1000 -FN1 -FF0STM32F7x_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F746NGHx$CMSIS\Flash\STM32F7x_1024.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20010000 -FC1000 -FN1 -FF0STM32F7x_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F746NGHx$CMSIS\Flash\STM32F7x_1024.FLM)) + + + + + + 0 + 1 + sai + + + + + 1 + 0 + 0x20010108 + 0 + + + + + 3 + 10 + 0x200022d0 + 0 + + + + C:\Keil_v5\ARM\CMSIS\5.9.0\CMSIS\RTOS2\RTX\RTX5.scvd + ARM.CMSIS.5.9.0 + 1 + + + C:\Keil_v5\Keil\ARM_Compiler\1.7.2\EventRecorder.scvd + Keil.ARM_Compiler.1.7.2 + 1 + + + 0 + + + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 0 + 0 + 2 + 10000000 + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + .\main.c + main.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + .\lcd.c + lcd.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + .\touch.c + touch.c + 0 + 0 + + + 1 + 4 + 1 + 0 + 0 + 0 + .\chat_sender.c + chat_sender.c + 0 + 0 + + + 1 + 5 + 1 + 0 + 0 + 0 + .\chat_receiver.c + chat_receiver.c + 0 + 0 + + + 1 + 6 + 1 + 0 + 0 + 0 + .\time_sender.c + time_sender.c + 0 + 0 + + + 1 + 7 + 1 + 0 + 0 + 0 + .\time_receiver.c + time_receiver.c + 0 + 0 + + + 1 + 8 + 1 + 0 + 0 + 0 + .\mac_sender.c + mac_sender.c + 0 + 0 + + + 1 + 9 + 1 + 0 + 0 + 0 + .\mac_receiver.c + mac_receiver.c + 0 + 0 + + + 1 + 10 + 1 + 0 + 0 + 0 + .\phy_receiver.c + phy_receiver.c + 0 + 0 + + + 1 + 11 + 1 + 0 + 0 + 0 + .\phy_sender.c + phy_sender.c + 0 + 0 + + + 1 + 12 + 1 + 0 + 0 + 0 + .\debug.c + debug.c + 0 + 0 + + + 1 + 13 + 5 + 0 + 0 + 0 + .\main.h + main.h + 0 + 0 + + + 1 + 14 + 1 + 0 + 0 + 0 + .\audio.c + audio.c + 0 + 0 + + + 1 + 15 + 1 + 0 + 0 + 0 + .\Audio_746G_Discovery.c + Audio_746G_Discovery.c + 0 + 0 + + + + + studio + 0 + 0 + 0 + 0 + + 2 + 16 + 1 + 0 + 0 + 0 + .\gui.c + gui.c + 0 + 0 + + + 2 + 17 + 1 + 0 + 0 + 0 + .\resources_manager.c + resources_manager.c + 0 + 0 + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + + + ::CMSIS Driver + 0 + 0 + 0 + 1 + + + + ::Compiler + 0 + 0 + 0 + 1 + + + + ::Device + 0 + 0 + 0 + 1 + + + + ::Hesso pack + 0 + 0 + 0 + 1 + + + + ::uGFX library + 0 + 0 + 0 + 1 + + +
diff --git a/tokenring_project.uvprojx b/tokenring_project.uvprojx new file mode 100644 index 0000000..d06db64 --- /dev/null +++ b/tokenring_project.uvprojx @@ -0,0 +1,867 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + Target 1 + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + STM32F746NGHx + STMicroelectronics + Keil.STM32F7xx_DFP.2.12.0 + http://www.keil.com/pack/ + IRAM(0x20010000,0x40000) IRAM2(0x20000000,0x10000) IROM(0x08000000,0x100000) IROM2(0x00200000,0x100000) CPUTYPE("Cortex-M7") FPU3(SFPU) CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20010000 -FC1000 -FN1 -FF0STM32F7x_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F746NGHx$CMSIS\Flash\STM32F7x_1024.FLM)) + 0 + $$Device:STM32F746NGHx$Drivers\CMSIS\Device\ST\STM32F7xx\Include\stm32f7xx.h + + + + + + + + + + $$Device:STM32F746NGHx$CMSIS\SVD\STM32F7x6_v1r1.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Objects\ + tokenring_project + 1 + 0 + 0 + 1 + 1 + .\Listings\ + 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 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 1 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 1 + 1 + 8 + 0 + 0 + 0 + 0 + 3 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20010000 + 0x40000 + + + 1 + 0x8000000 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x100000 + + + 1 + 0x200000 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20010000 + 0x40000 + + + 0 + 0x20000000 + 0x10000 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + .\RTE\uGFX_library;.\ + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20010000 + + + + + --keep=os_cb_sections + + + + + + + + Source Group 1 + + + main.c + 1 + .\main.c + + + lcd.c + 1 + .\lcd.c + + + touch.c + 1 + .\touch.c + + + chat_sender.c + 1 + .\chat_sender.c + + + chat_receiver.c + 1 + .\chat_receiver.c + + + time_sender.c + 1 + .\time_sender.c + + + time_receiver.c + 1 + .\time_receiver.c + + + mac_sender.c + 1 + .\mac_sender.c + + + mac_receiver.c + 1 + .\mac_receiver.c + + + phy_receiver.c + 1 + .\phy_receiver.c + + + phy_sender.c + 1 + .\phy_sender.c + + + debug.c + 1 + .\debug.c + + + main.h + 5 + .\main.h + + + audio.c + 1 + .\audio.c + + + Audio_746G_Discovery.c + 1 + .\Audio_746G_Discovery.c + + + + + studio + + + gui.c + 1 + .\gui.c + + + resources_manager.c + 1 + .\resources_manager.c + + + + + ::CMSIS + + + ::CMSIS Driver + + + ::Compiler + + + ::Device + + + ::Hesso pack + + + ::uGFX library + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAI2_RX_BLOCK=SAI_BLOCK_B, SAI2_TX_BLOCK=SAI_BLOCK_A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAI2_RX_BLOCK=SAI_BLOCK_B, SAI2_TX_BLOCK=SAI_BLOCK_A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RTE\CMSIS\RTX_Config.c + + + + + + + + RTE\CMSIS\RTX_Config.h + + + + + + + + RTE\Compiler\EventRecorderConf.h + + + + + + + + RTE\Device\STM32F746NGHx\RTE_Device.h + + + + + + + + RTE\Device\STM32F746NGHx\startup_stm32f746xx.s + + + + + + + + RTE\Device\STM32F746NGHx\stm32f7xx_hal_conf.h + + + + + + + + RTE\Device\STM32F746NGHx\system_stm32f7xx.c + + + + + + + + RTE\Hesso_pack\clock_216.c + + + + + + RTE\Hesso_pack\clock_216.h + + + + + + RTE\Hesso_pack\ext_buttons.c + + + + + + + + RTE\Hesso_pack\ext_buttons.h + + + + + + + + RTE\Hesso_pack\ext_keyboard.c + + + + + + + + RTE\Hesso_pack\ext_keyboard.h + + + + + + + + RTE\Hesso_pack\ext_led.c + + + + + + + + RTE\Hesso_pack\ext_led.h + + + + + + + + RTE\Hesso_pack\ext_uart.c + + + + + + + + RTE\Hesso_pack\ext_uart.h + + + + + + + + RTE\uGFX_library\gdisp_lld_STM32LTDC.c + + + + + + RTE\uGFX_library\gfx_mk_rtx5_os.c + + + + + + RTE\uGFX_library\gfxconf.h + + + + + + + + RTE\uGFX_library\gmouse_lld_FT5336.c + + + + + + RTE\uGFX_library\stm32f7_i2c.c + + + + + + + +
diff --git a/touch.c b/touch.c new file mode 100644 index 0000000..604bb6b --- /dev/null +++ b/touch.c @@ -0,0 +1,146 @@ +////////////////////////////////////////////////////////////////////////////////// +/// \file touch.c +/// \brief Touch control thread +/// \author Pascal Sartoretti (pascal dot sartoretti at hevs dot ch) +/// \version 1.0 - original +/// \date 2018-02 +////////////////////////////////////////////////////////////////////////////////// +#include "stm32f7xx_hal.h" + +#include +#include +#include "main.h" + +////////////////////////////////////////////////////////////////////////////////// +// THREAD TOUCH +////////////////////////////////////////////////////////////////////////////////// +void Touch(void *argument) +{ + struct queueMsg_t queueMsg; // queue message + GEvent* pe; // uGFX event type + osStatus_t retCode; + GHandle tmpHndl; + + //------------------------------------------------------------------------------ + for (;;) // loop until doomsday + { + //---------------------------------------------------------------------------- + // get an UGFX_Event from uGFX task touchscreen control + //---------------------------------------------------------------------------- + pe = geventEventWait(&gl, TIME_INFINITE); + //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- + // BUTTON PRESSED case ------------------------------------------------------- + //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- + if(pe->type == GEVENT_GWIN_BUTTON) + { + tmpHndl = ((GEventGWinButton*)pe)->gwin; // Get handle + // NEW_TOKEN case ---------------------------------------------------------- + if((tmpHndl == btnToken)|| + (tmpHndl == btnSendToken)) + { + queueMsg.type = NEW_TOKEN; // message type + queueMsg.anyPtr = NULL; // pointer + //------------------------------------------------------------------------ + // QUEUE SEND (send NEW_TOKEN to mac sender) + //------------------------------------------------------------------------ + retCode = osMessageQueuePut( + queue_macS_id, + &queueMsg, + osPriorityNormal, + osWaitForever); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + } +#if DEBUG_MODE != 0 + if(tmpHndl == btnSendDebug) + { + gTokenInterface.debugMsgToSend = TRUE; // message type + } +#endif + } + //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- + // CHECKBOX PRESSED case ----------------------------------------------------- + //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- + if(pe->type == GEVENT_GWIN_CHECKBOX) + { + tmpHndl = ((GEventGWinCheckbox*)pe)->gwin; + // Connection change ------------------------------------------------------- + if(tmpHndl == cbConnectoed) + { + if((((GEventGWinCheckbox*)pe)->isChecked) != FALSE) + { + queueMsg.type = START; // message type + } + else + { + queueMsg.type = STOP; // message type + } + queueMsg.anyPtr = NULL; // pointer + //------------------------------------------------------------------------ + // QUEUE SEND (send START of STOP to mac sender) + //------------------------------------------------------------------------ + retCode = osMessageQueuePut( + queue_macS_id, + &queueMsg, + osPriorityNormal, + osWaitForever); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + } + //-------------------------------------------------------------------------- + if(tmpHndl == cbDebugConnected) // debug connected changed + { + gTokenInterface.debugOnline = gwinCheckboxIsChecked(cbDebugConnected); + } + // Time to send on broadcast------------------------------------------------ + if(tmpHndl == cbBroadcastTime) + { + gTokenInterface.broadcastTime = ((GEventGWinCheckbox*)pe)->isChecked; + if(gTokenInterface.broadcastTime != FALSE) + { + //---------------------------------------------------------------------- + // set event flag to broadcast time + //---------------------------------------------------------------------- + retCode = osEventFlagsSet(eventFlag_id, BROADCAST_TIME_EVT); // set flag + if(retCode < 0) + { + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + } + } + else + { + //---------------------------------------------------------------------- + // clear event flag to broadcast time + //---------------------------------------------------------------------- + retCode = osEventFlagsClear(eventFlag_id, BROADCAST_TIME_EVT); // clr flag + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + } + } + // checkbox receive CRC error ---------------------------------------------- + if(tmpHndl == cbRecCRCError) + { + gTokenInterface.needReceiveCRCError = ((GEventGWinCheckbox*)pe)->isChecked; + } + // checkbox send CRC error ------------------------------------------------- + if(tmpHndl == cbSendCRCError) + { + gTokenInterface.needSendCRCError = ((GEventGWinCheckbox*)pe)->isChecked; + } + } + // All action ---------------------------------------------------------------- + else + { + queueMsg.type = TOUCH_EVENT; // message type + queueMsg.anyPtr = pe; // pointer + //-------------------------------------------------------------------------- + // QUEUE SEND (send all messages to LCD manager) + //-------------------------------------------------------------------------- + retCode = osMessageQueuePut( + queue_lcd_id, + &queueMsg, + osPriorityNormal, + osWaitForever); + CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE); + } + } +} + + diff --git a/ugfx_system.h b/ugfx_system.h new file mode 100644 index 0000000..5adb2ea --- /dev/null +++ b/ugfx_system.h @@ -0,0 +1,7 @@ +#ifndef _UGFX_SYSTEM_H +#define _UGFX_SYSTEM_H + +#include "gfx.h" +#include "resources_manager.h" + +#endif // _UGFX_SYSTEM_H diff --git a/userfonts.h b/userfonts.h new file mode 100644 index 0000000..b5673d8 --- /dev/null +++ b/userfonts.h @@ -0,0 +1,7 @@ +#ifndef _USERFONTS_H +#define _USERFONTS_H + +#include "resources/arial_12_arial12_aa.c" +#include "resources/arial__14_arial14_aa.c" + +#endif // _USERFONTS_H diff --git a/widgetstyles.h b/widgetstyles.h new file mode 100644 index 0000000..4bc06b6 --- /dev/null +++ b/widgetstyles.h @@ -0,0 +1,66 @@ +#ifndef _WIDGETSTYLES_H +#define _WIDGETSTYLES_H + +#include "gfx.h" + +// WidgetStyle: red_green +const GWidgetStyle red_green = { + HTML2COLOR(0xFFFFFF), // background + HTML2COLOR(0x2A8FCD), // focus + + // Enabled color set + { + HTML2COLOR(0x000000), // text + HTML2COLOR(0x404040), // edge + HTML2COLOR(0xFF0000), // fill + HTML2COLOR(0x00E000) // progress (active area) + }, + + // Disabled color set + { + HTML2COLOR(0xC0C0C0), // text + HTML2COLOR(0x808080), // edge + HTML2COLOR(0xE0E0E0), // fill + HTML2COLOR(0xC0E0C0) // progress (active area) + }, + + // Pressed color set + { + HTML2COLOR(0x404040), // text + HTML2COLOR(0x404040), // edge + HTML2COLOR(0x00FF00), // fill + HTML2COLOR(0x00E000) // progress (active area) + } +}; + +// WidgetStyle: white_on_gray +const GWidgetStyle white_on_gray = { + HTML2COLOR(0x606060), // background + HTML2COLOR(0x2A8FCD), // focus + + // Enabled color set + { + HTML2COLOR(0xFFFFFF), // text + HTML2COLOR(0x404040), // edge + HTML2COLOR(0xE0E0E0), // fill + HTML2COLOR(0x00E000) // progress (active area) + }, + + // Disabled color set + { + HTML2COLOR(0xC0C0C0), // text + HTML2COLOR(0x808080), // edge + HTML2COLOR(0xE0E0E0), // fill + HTML2COLOR(0xC0E0C0) // progress (active area) + }, + + // Pressed color set + { + HTML2COLOR(0x00FF00), // text + HTML2COLOR(0x404040), // edge + HTML2COLOR(0x00FF00), // fill + HTML2COLOR(0x00E000) // progress (active area) + } +}; + +#endif // _WIDGETSTYLES_H