From f821a46ea057c11701c28a4e5d5459daa3a4c3bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christopher=20M=C3=A9trailler?= Date: Wed, 10 Apr 2024 19:17:57 +0200 Subject: [PATCH] Hello TOR 2k24 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Have fun 🚀 --- Audio_746G_Discovery.c | 1162 ++++++ Board_Audio.h | 203 + EventRecorderStub.scvd | 9 + README.md | 9 + RTE/CMSIS/RTX_Config.c | 63 + RTE/CMSIS/RTX_Config.h | 395 ++ RTE/Compiler/EventRecorderConf.h | 44 + RTE/Device/STM32F746NGHx/RTE_Device.h | 3277 +++++++++++++++++ .../STM32F746NGHx/startup_stm32f746xx.s | 485 +++ RTE/Device/STM32F746NGHx/stm32f7xx_hal_conf.h | 560 +++ RTE/Device/STM32F746NGHx/system_stm32f7xx.c | 280 ++ RTE/Hesso_pack/clock_216.c | 38 + RTE/Hesso_pack/clock_216.h | 17 + RTE/Hesso_pack/ext_buttons.c | 58 + RTE/Hesso_pack/ext_buttons.h | 23 + RTE/Hesso_pack/ext_keyboard.c | 579 +++ RTE/Hesso_pack/ext_keyboard.h | 53 + RTE/Hesso_pack/ext_led.c | 224 ++ RTE/Hesso_pack/ext_led.h | 51 + RTE/Hesso_pack/ext_uart.c | 57 + RTE/Hesso_pack/ext_uart.h | 44 + RTE/_Target_1/RTE_Components.h | 61 + RTE/uGFX_library/gfxconf.h | 473 +++ RTE/uGFX_library/stm32f7_i2c.c | 82 + audio.c | 74 + audio_clock.c | 392 ++ audio_error.c | 2140 +++++++++++ audio_msg.c | 2635 +++++++++++++ chat_receiver.c | 47 + chat_sender.c | 142 + debug.c | 246 ++ debuglayer.c | 330 ++ gfxconf.h | 89 + gui.c | 1088 ++++++ gui.h | 138 + i2c.c | 157 + i2c.h | 81 + lcd.c | 382 ++ mac_receiver.c | 5 + mac_sender.c | 5 + main.c | 412 +++ main.h | 119 + phy_receiver.c | 178 + phy_sender.c | 162 + rendering_functions.h | 25 + resources/arial_12_arial12_aa.c | 273 ++ resources/arial__14_arial14_aa.c | 308 ++ resources/token.h | 877 +++++ resources/token_w.h | 928 +++++ resources_manager.c | 52 + resources_manager.h | 27 + romfs_files.h | 7 + sai.c | 143 + sai.h | 81 + time_receiver.c | 48 + time_sender.c | 77 + tokenring_project.uvoptx | 510 +++ tokenring_project.uvprojx | 867 +++++ touch.c | 146 + ugfx_system.h | 7 + userfonts.h | 7 + widgetstyles.h | 66 + 62 files changed, 21518 insertions(+) create mode 100644 Audio_746G_Discovery.c create mode 100644 Board_Audio.h create mode 100644 EventRecorderStub.scvd create mode 100644 README.md create mode 100644 RTE/CMSIS/RTX_Config.c create mode 100644 RTE/CMSIS/RTX_Config.h create mode 100644 RTE/Compiler/EventRecorderConf.h create mode 100644 RTE/Device/STM32F746NGHx/RTE_Device.h create mode 100644 RTE/Device/STM32F746NGHx/startup_stm32f746xx.s create mode 100644 RTE/Device/STM32F746NGHx/stm32f7xx_hal_conf.h create mode 100644 RTE/Device/STM32F746NGHx/system_stm32f7xx.c create mode 100644 RTE/Hesso_pack/clock_216.c create mode 100644 RTE/Hesso_pack/clock_216.h create mode 100644 RTE/Hesso_pack/ext_buttons.c create mode 100644 RTE/Hesso_pack/ext_buttons.h create mode 100644 RTE/Hesso_pack/ext_keyboard.c create mode 100644 RTE/Hesso_pack/ext_keyboard.h create mode 100644 RTE/Hesso_pack/ext_led.c create mode 100644 RTE/Hesso_pack/ext_led.h create mode 100644 RTE/Hesso_pack/ext_uart.c create mode 100644 RTE/Hesso_pack/ext_uart.h create mode 100644 RTE/_Target_1/RTE_Components.h create mode 100644 RTE/uGFX_library/gfxconf.h create mode 100644 RTE/uGFX_library/stm32f7_i2c.c create mode 100644 audio.c create mode 100644 audio_clock.c create mode 100644 audio_error.c create mode 100644 audio_msg.c create mode 100644 chat_receiver.c create mode 100644 chat_sender.c create mode 100644 debug.c create mode 100644 debuglayer.c create mode 100644 gfxconf.h create mode 100644 gui.c create mode 100644 gui.h create mode 100644 i2c.c create mode 100644 i2c.h create mode 100644 lcd.c create mode 100644 mac_receiver.c create mode 100644 mac_sender.c create mode 100644 main.c create mode 100644 main.h create mode 100644 phy_receiver.c create mode 100644 phy_sender.c create mode 100644 rendering_functions.h create mode 100644 resources/arial_12_arial12_aa.c create mode 100644 resources/arial__14_arial14_aa.c create mode 100644 resources/token.h create mode 100644 resources/token_w.h create mode 100644 resources_manager.c create mode 100644 resources_manager.h create mode 100644 romfs_files.h create mode 100644 sai.c create mode 100644 sai.h create mode 100644 time_receiver.c create mode 100644 time_sender.c create mode 100644 tokenring_project.uvoptx create mode 100644 tokenring_project.uvprojx create mode 100644 touch.c create mode 100644 ugfx_system.h create mode 100644 userfonts.h create mode 100644 widgetstyles.h 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